Skip to content

Commit a95114e

Browse files
committed
feat(nest): add Hono framework support to interceptor
- Add @orpc/standard-server-fetch dependency - Add HonoContext interface for Hono framework detection - Extend ImplementInterceptor to handle Hono requests and responses - Support Hono adapter in interceptor response handling
1 parent a2a8fa9 commit a95114e

2 files changed

Lines changed: 25 additions & 8 deletions

File tree

packages/nest/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"@orpc/shared": "workspace:*",
5959
"@orpc/standard-server": "workspace:*",
6060
"@orpc/standard-server-fastify": "workspace:*",
61+
"@orpc/standard-server-fetch": "workspace:*",
6162
"@orpc/standard-server-node": "workspace:*"
6263
},
6364
"devDependencies": {

packages/nest/src/implement.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,19 @@ import { getRouter, isProcedure, unlazy } from '@orpc/server'
1515
import { StandardHandler } from '@orpc/server/standard'
1616
import { get, intercept, toArray } from '@orpc/shared'
1717
import * as StandardServerFastify from '@orpc/standard-server-fastify'
18+
import * as StandardServerFetch from '@orpc/standard-server-fetch'
1819
import * as StandardServerNode from '@orpc/standard-server-node'
1920
import { mergeMap } from 'rxjs'
2021
import { ORPC_MODULE_CONFIG_SYMBOL } from './module'
2122
import { toNestPattern } from './utils'
2223

24+
interface HonoContext {
25+
req: { raw: globalThis.Request }
26+
res: globalThis.Response
27+
finalized: boolean
28+
newResponse: (body: BodyInit | null, init?: ResponseInit) => globalThis.Response
29+
}
30+
2331
const MethodDecoratorMap = {
2432
HEAD: Head,
2533
GET: Get,
@@ -122,12 +130,17 @@ export class ImplementInterceptor implements NestInterceptor {
122130
`)
123131
}
124132

125-
const req: Request | FastifyRequest = ctx.switchToHttp().getRequest()
126-
const res: Response | FastifyReply = ctx.switchToHttp().getResponse()
133+
const req: Request | FastifyRequest | HonoContext['req'] = ctx.switchToHttp().getRequest()
134+
const res: Response | FastifyReply | HonoContext = ctx.switchToHttp().getResponse()
127135

128-
const standardRequest = 'raw' in req
129-
? StandardServerFastify.toStandardLazyRequest(req, res as FastifyReply)
130-
: StandardServerNode.toStandardLazyRequest(req, res as Response)
136+
const isHono = 'finalized' in res && typeof (res as HonoContext).newResponse === 'function'
137+
const isFastify = 'raw' in req && !isHono
138+
139+
const standardRequest = isHono
140+
? StandardServerFetch.toStandardLazyRequest((req as HonoContext['req']).raw)
141+
: isFastify
142+
? StandardServerFastify.toStandardLazyRequest(req as FastifyRequest, res as FastifyReply)
143+
: StandardServerNode.toStandardLazyRequest(req as Request, res as Response)
131144

132145
const handler = new StandardHandler(procedure, {
133146
init: () => {},
@@ -148,11 +161,14 @@ export class ImplementInterceptor implements NestInterceptor {
148161
toArray(this.config.sendResponseInterceptors),
149162
{ request: req, response: res, standardResponse: result.response },
150163
async ({ response, standardResponse }) => {
151-
if ('raw' in response) {
152-
await StandardServerFastify.sendStandardResponse(response, standardResponse, this.config)
164+
if (isHono) {
165+
(response as HonoContext).res = StandardServerFetch.toFetchResponse(standardResponse, this.config)
166+
}
167+
else if (isFastify) {
168+
await StandardServerFastify.sendStandardResponse(response as FastifyReply, standardResponse, this.config)
153169
}
154170
else {
155-
await StandardServerNode.sendStandardResponse(response, standardResponse, this.config)
171+
await StandardServerNode.sendStandardResponse(response as Response, standardResponse, this.config)
156172
}
157173
},
158174
)

0 commit comments

Comments
 (0)