Skip to content

Commit 48cac09

Browse files
committed
feat: improve escape hatches
1 parent f08826a commit 48cac09

File tree

4 files changed

+27
-7
lines changed

4 files changed

+27
-7
lines changed

packages/openapi-code-generator/src/typescript/server/typescript-express/typescript-express-router-builder.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,16 @@ export class ExpressRouterBuilder extends AbstractRouterBuilder {
4545
this.imports
4646
.from("@nahkies/typescript-express-runtime/server")
4747
.add(
48+
"ExpressRuntimeResponder",
49+
"ExpressRuntimeResponse",
50+
"Params",
51+
"SkipResponse",
4852
"StatusCode",
4953
"StatusCode1xx",
5054
"StatusCode2xx",
5155
"StatusCode3xx",
5256
"StatusCode4xx",
5357
"StatusCode5xx",
54-
"Params",
55-
"ExpressRuntimeResponse",
56-
"ExpressRuntimeResponder",
5758
)
5859

5960
this.imports
@@ -114,7 +115,8 @@ export class ExpressRouterBuilder extends AbstractRouterBuilder {
114115
respond: ${symbols.responderName},
115116
req: Request,
116117
res: Response,
117-
) => Promise<ExpressRuntimeResponse<unknown>>`,
118+
next: NextFunction
119+
) => Promise<ExpressRuntimeResponse<unknown> | typeof SkipResponse>`,
118120
kind: "type",
119121
}),
120122
],
@@ -135,9 +137,14 @@ router.${builder.method.toLowerCase()}(\`${route(builder.route)}\`, async (req:
135137
136138
const responder = ${responder.implementation}
137139
138-
const response = await implementation.${symbols.implPropName}(input, responder, req, res)
140+
const response = await implementation.${symbols.implPropName}(input, responder, req, res, next)
139141
.catch(err => { throw ExpressRuntimeError.HandlerError(err) })
140142
143+
// escape hatch to allow responses to be sent by the implementation handler
144+
if(response === SkipResponse) {
145+
return
146+
}
147+
141148
const { status, body } = response instanceof ExpressRuntimeResponse ? response.unpack() : response
142149
143150
res.status(status)

packages/openapi-code-generator/src/typescript/server/typescript-koa/typescript-koa-router-builder.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export class KoaRouterBuilder extends AbstractRouterBuilder {
4242
"Params",
4343
"Response",
4444
"ServerConfig",
45+
"SkipResponse",
4546
"StatusCode",
4647
"StatusCode2xx",
4748
"StatusCode3xx",
@@ -54,6 +55,7 @@ export class KoaRouterBuilder extends AbstractRouterBuilder {
5455
.from("@nahkies/typescript-koa-runtime/errors")
5556
.add("KoaRuntimeError", "RequestInputType")
5657

58+
this.imports.from("koa").add("Next")
5759
this.imports.addModule("KoaRouter", "@koa/router")
5860
this.imports.from("@koa/router").add("RouterContext")
5961

@@ -110,13 +112,15 @@ export class KoaRouterBuilder extends AbstractRouterBuilder {
110112
value: `(
111113
params: ${params.type},
112114
respond: ${symbols.responderName},
113-
ctx: RouterContext
115+
ctx: RouterContext,
116+
next: Next
114117
) => Promise<KoaRuntimeResponse<unknown> | ${[
115118
...responseSchemas.specific.map(
116119
(it) => `Response<${it.statusType}, ${it.type}>`,
117120
),
118121
responseSchemas.defaultResponse &&
119122
`Response<StatusCode, ${responseSchemas.defaultResponse.type}>`,
123+
"typeof SkipResponse",
120124
]
121125
.filter(isDefined)
122126
.join(" | ")}>`,
@@ -138,9 +142,14 @@ router.${builder.method.toLowerCase()}('${symbols.implPropName}','${route(builde
138142
139143
const responder = ${responder.implementation}
140144
141-
const response = await implementation.${symbols.implPropName}(input, responder, ctx)
145+
const response = await implementation.${symbols.implPropName}(input, responder, ctx, next)
142146
.catch(err => { throw KoaRuntimeError.HandlerError(err) })
143147
148+
// escape hatch to allow responses to be sent by the implementation handler
149+
if(response === SkipResponse) {
150+
return
151+
}
152+
144153
const { status, body } = response instanceof KoaRuntimeResponse ? response.unpack() : response
145154
146155
ctx.body = ${symbols.responseBodyValidator}(status, body)

packages/typescript-express-runtime/src/server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ export type Response<Status extends StatusCode, Type> = {
4242
body: Type
4343
}
4444

45+
export const SkipResponse = Symbol("skip response processing")
46+
4547
export class ExpressRuntimeResponse<Type> {
4648
private _body?: Type
4749

packages/typescript-koa-runtime/src/server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ export type Response<Status extends StatusCode, Type> = {
3838
body: Type
3939
}
4040

41+
export const SkipResponse = Symbol("skip response processing")
42+
4143
export class KoaRuntimeResponse<Type> {
4244
private _body?: Type
4345

0 commit comments

Comments
 (0)