Skip to content

Commit 44f8109

Browse files
authored
Merge pull request #2177 from hirosystems/develop
Merge develop into beta
2 parents aa151db + b17895b commit 44f8109

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed

.vscode/launch.json

+7
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,13 @@
460460
"TS_NODE_SKIP_IGNORE": "true"
461461
}
462462
},
463+
{
464+
"type": "node",
465+
"request": "launch",
466+
"name": "docs: openapi-generator",
467+
"runtimeArgs": ["-r", "ts-node/register/transpile-only"],
468+
"args": ["${workspaceFolder}/src/openapi-generator.ts"]
469+
},
463470
{
464471
"type": "node",
465472
"request": "launch",

src/api/schemas/responses/responses.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ import { NakamotoBlockSchema, SignerSignatureSchema } from '../entities/block';
1717
export const ErrorResponseSchema = Type.Object(
1818
{
1919
error: Type.String(),
20+
message: Type.Optional(Type.String()),
2021
},
21-
{ title: 'Error Response' }
22+
{ title: 'Error Response', additionalProperties: true }
2223
);
2324

2425
export const ServerStatusResponseSchema = Type.Object(

src/event-stream/event-server.ts

+34
Original file line numberDiff line numberDiff line change
@@ -757,17 +757,51 @@ export async function startEventServer(opts: {
757757
}
758758

759759
const bodyLimit = 1_000_000 * 500; // 500MB body limit
760+
761+
const reqLogSerializer = (req: FastifyRequest) => ({
762+
method: req.method,
763+
url: req.url,
764+
version: req.headers?.['accept-version'] as string,
765+
hostname: req.hostname,
766+
remoteAddress: req.ip,
767+
remotePort: req.socket?.remotePort,
768+
bodySize: parseInt(req.headers?.['content-length'] as string) || 'unknown',
769+
});
770+
760771
const loggerOpts: FastifyServerOptions['logger'] = {
761772
...PINO_LOGGER_CONFIG,
762773
name: 'stacks-node-event',
774+
serializers: {
775+
req: reqLogSerializer,
776+
res: reply => ({
777+
statusCode: reply.statusCode,
778+
method: reply.request?.method,
779+
url: reply.request?.url,
780+
requestBodySize: parseInt(reply.request?.headers['content-length'] as string) || 'unknown',
781+
responseBodySize: parseInt(reply.getHeader?.('content-length') as string) || 'unknown',
782+
}),
783+
},
763784
};
785+
764786
const app = Fastify({
765787
bodyLimit,
766788
trustProxy: true,
767789
logger: loggerOpts,
768790
ignoreTrailingSlash: true,
769791
});
770792

793+
app.addHook('onRequest', (req, reply, done) => {
794+
req.raw.on('close', () => {
795+
if (req.raw.aborted) {
796+
req.log.warn(
797+
reqLogSerializer(req),
798+
`Request was aborted by the client: ${req.method} ${req.url}`
799+
);
800+
}
801+
});
802+
done();
803+
});
804+
771805
const handleRawEventRequest = async (req: FastifyRequest) => {
772806
await messageHandler.handleRawEventRequest(req.url, req.body, db);
773807

src/openapi-generator.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import Fastify from 'fastify';
2-
import { TypeBoxTypeProvider } from '@fastify/type-provider-typebox';
2+
import { TSchema, TypeBoxTypeProvider } from '@fastify/type-provider-typebox';
33
import FastifySwagger from '@fastify/swagger';
44
import { writeFileSync } from 'fs';
55
import { OpenApiSchemaOptions } from './api/schemas/openapi';
66
import { StacksApiRoutes } from './api/init';
7+
import { ErrorResponseSchema } from './api/schemas/responses/responses';
78

89
/**
910
* Generates `openapi.yaml` based on current Swagger definitions.
@@ -14,6 +15,16 @@ async function generateOpenApiFiles() {
1415
logger: true,
1516
}).withTypeProvider<TypeBoxTypeProvider>();
1617

18+
// If a response schema is defined but lacks a '4xx' response, add it
19+
fastify.addHook(
20+
'onRoute',
21+
(route: { schema?: { response: Record<string | number, TSchema> } }) => {
22+
if (route.schema?.response && !route.schema?.response['4xx']) {
23+
route.schema.response['4xx'] = ErrorResponseSchema;
24+
}
25+
}
26+
);
27+
1728
await fastify.register(FastifySwagger, OpenApiSchemaOptions);
1829
await fastify.register(StacksApiRoutes);
1930
await fastify.ready();

0 commit comments

Comments
 (0)