@orpc/server 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-E7GUWVR4.js → chunk-DNG2IB3R.js} +56 -15
- package/dist/{chunk-6BY63WA5.js → chunk-V3I7RIRY.js} +15 -16
- package/dist/chunk-WUOGVGWG.js +1 -0
- package/dist/fetch.js +3 -20
- package/dist/hono.js +30 -0
- package/dist/index.js +31 -7
- package/dist/next.js +36 -0
- package/dist/node.js +66 -24
- package/dist/src/adapters/fetch/index.d.ts +0 -1
- package/dist/src/adapters/fetch/orpc-handler.d.ts +8 -8
- package/dist/src/adapters/fetch/orpc-payload-codec.d.ts +1 -1
- package/dist/src/adapters/fetch/types.d.ts +11 -6
- package/dist/src/adapters/hono/index.d.ts +3 -0
- package/dist/src/adapters/hono/middleware.d.ts +12 -0
- package/dist/src/adapters/next/index.d.ts +3 -0
- package/dist/src/adapters/next/serve.d.ts +19 -0
- package/dist/src/adapters/node/index.d.ts +1 -1
- package/dist/src/adapters/node/orpc-handler.d.ts +5 -5
- package/dist/src/adapters/node/request-listener.d.ts +28 -0
- package/dist/src/adapters/node/types.d.ts +10 -9
- package/dist/src/builder.d.ts +9 -8
- package/dist/src/error.d.ts +10 -0
- package/dist/src/implementer-chainable.d.ts +2 -2
- package/dist/src/index.d.ts +2 -2
- package/dist/src/lazy-decorated.d.ts +2 -2
- package/dist/src/middleware-decorated.d.ts +6 -5
- package/dist/src/middleware.d.ts +7 -5
- package/dist/src/procedure-builder.d.ts +15 -13
- package/dist/src/procedure-client.d.ts +9 -9
- package/dist/src/procedure-decorated.d.ts +10 -9
- package/dist/src/procedure-implementer.d.ts +11 -10
- package/dist/src/procedure.d.ts +27 -14
- package/dist/src/router-builder.d.ts +3 -3
- package/dist/src/router-client.d.ts +2 -2
- package/dist/src/router-implementer.d.ts +2 -2
- package/dist/src/router.d.ts +3 -3
- package/package.json +18 -8
- package/dist/src/adapters/fetch/composite-handler.d.ts +0 -8
- package/dist/src/adapters/node/composite-handler.d.ts +0 -9
@@ -32,6 +32,33 @@ function isProcedure(item) {
|
|
32
32
|
return (typeof item === "object" || typeof item === "function") && item !== null && "~type" in item && item["~type"] === "Procedure" && "~orpc" in item && typeof item["~orpc"] === "object" && item["~orpc"] !== null && "contract" in item["~orpc"] && isContractProcedure(item["~orpc"].contract) && "handler" in item["~orpc"] && typeof item["~orpc"].handler === "function";
|
33
33
|
}
|
34
34
|
|
35
|
+
// src/error.ts
|
36
|
+
import { ORPCError } from "@orpc/contract";
|
37
|
+
function createORPCErrorConstructorMap(errors) {
|
38
|
+
const constructors = {};
|
39
|
+
if (!errors) {
|
40
|
+
return constructors;
|
41
|
+
}
|
42
|
+
for (const code in errors) {
|
43
|
+
const config = errors[code];
|
44
|
+
if (!config) {
|
45
|
+
continue;
|
46
|
+
}
|
47
|
+
const constructor = (...[options]) => {
|
48
|
+
return new ORPCError({
|
49
|
+
code,
|
50
|
+
defined: true,
|
51
|
+
status: config.status,
|
52
|
+
message: options?.message ?? config.message,
|
53
|
+
data: options?.data,
|
54
|
+
cause: options?.cause
|
55
|
+
});
|
56
|
+
};
|
57
|
+
constructors[code] = constructor;
|
58
|
+
}
|
59
|
+
return constructors;
|
60
|
+
}
|
61
|
+
|
35
62
|
// src/lazy.ts
|
36
63
|
var LAZY_LOADER_SYMBOL = Symbol("ORPC_LAZY_LOADER");
|
37
64
|
function lazy(loader) {
|
@@ -60,8 +87,8 @@ function flatLazy(lazied) {
|
|
60
87
|
}
|
61
88
|
|
62
89
|
// src/procedure-client.ts
|
63
|
-
import {
|
64
|
-
import {
|
90
|
+
import { ORPCError as ORPCError2, validateORPCError, ValidationError } from "@orpc/contract";
|
91
|
+
import { executeWithHooks, toError, value } from "@orpc/shared";
|
65
92
|
function createProcedureClient(options) {
|
66
93
|
return async (...[input, callerOptions]) => {
|
67
94
|
const path = options.path ?? [];
|
@@ -79,17 +106,27 @@ function createProcedureClient(options) {
|
|
79
106
|
input: validInput,
|
80
107
|
path,
|
81
108
|
procedure,
|
82
|
-
signal: callerOptions?.signal
|
109
|
+
signal: callerOptions?.signal,
|
110
|
+
errors: createORPCErrorConstructorMap(procedure["~orpc"].contract["~orpc"].errorMap)
|
83
111
|
});
|
84
112
|
return validateOutput(procedure, output);
|
85
113
|
};
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
114
|
+
try {
|
115
|
+
const output = await executeWithHooks({
|
116
|
+
hooks: options,
|
117
|
+
input,
|
118
|
+
context,
|
119
|
+
meta,
|
120
|
+
execute: executeWithValidation
|
121
|
+
});
|
122
|
+
return output;
|
123
|
+
} catch (e) {
|
124
|
+
if (!(e instanceof ORPCError2)) {
|
125
|
+
throw toError(e);
|
126
|
+
}
|
127
|
+
const validated = await validateORPCError(procedure["~orpc"].contract["~orpc"].errorMap, e);
|
128
|
+
throw validated;
|
129
|
+
}
|
93
130
|
};
|
94
131
|
}
|
95
132
|
async function validateInput(procedure, input) {
|
@@ -98,10 +135,13 @@ async function validateInput(procedure, input) {
|
|
98
135
|
return input;
|
99
136
|
const result = await schema["~standard"].validate(input);
|
100
137
|
if (result.issues) {
|
101
|
-
throw new
|
138
|
+
throw new ORPCError2({
|
102
139
|
message: "Input validation failed",
|
103
140
|
code: "BAD_REQUEST",
|
104
|
-
|
141
|
+
data: {
|
142
|
+
issues: result.issues
|
143
|
+
},
|
144
|
+
cause: new ValidationError({ message: "Input validation failed", issues: result.issues })
|
105
145
|
});
|
106
146
|
}
|
107
147
|
return result.value;
|
@@ -112,10 +152,10 @@ async function validateOutput(procedure, output) {
|
|
112
152
|
return output;
|
113
153
|
const result = await schema["~standard"].validate(output);
|
114
154
|
if (result.issues) {
|
115
|
-
throw new
|
155
|
+
throw new ORPCError2({
|
116
156
|
message: "Output validation failed",
|
117
157
|
code: "INTERNAL_SERVER_ERROR",
|
118
|
-
issues: result.issues
|
158
|
+
cause: new ValidationError({ message: "Output validation failed", issues: result.issues })
|
119
159
|
});
|
120
160
|
}
|
121
161
|
return result.value;
|
@@ -175,6 +215,7 @@ export {
|
|
175
215
|
mergeContext,
|
176
216
|
Procedure,
|
177
217
|
isProcedure,
|
218
|
+
createORPCErrorConstructorMap,
|
178
219
|
LAZY_LOADER_SYMBOL,
|
179
220
|
lazy,
|
180
221
|
isLazy,
|
@@ -183,4 +224,4 @@ export {
|
|
183
224
|
createProcedureClient,
|
184
225
|
getRouterChild
|
185
226
|
};
|
186
|
-
//# sourceMappingURL=chunk-
|
227
|
+
//# sourceMappingURL=chunk-DNG2IB3R.js.map
|
@@ -4,7 +4,7 @@ import {
|
|
4
4
|
getRouterChild,
|
5
5
|
isProcedure,
|
6
6
|
unlazy
|
7
|
-
} from "./chunk-
|
7
|
+
} from "./chunk-DNG2IB3R.js";
|
8
8
|
|
9
9
|
// src/adapters/fetch/super-json.ts
|
10
10
|
var super_json_exports = {};
|
@@ -130,8 +130,8 @@ function deserialize({
|
|
130
130
|
}
|
131
131
|
|
132
132
|
// src/adapters/fetch/orpc-payload-codec.ts
|
133
|
+
import { ORPCError } from "@orpc/contract";
|
133
134
|
import { findDeepMatches, set } from "@orpc/shared";
|
134
|
-
import { ORPCError } from "@orpc/shared/error";
|
135
135
|
var ORPCPayloadCodec = class {
|
136
136
|
/**
|
137
137
|
* If method is GET, the payload will be encoded as query string.
|
@@ -236,28 +236,24 @@ var ORPCProcedureMatcher = class {
|
|
236
236
|
};
|
237
237
|
|
238
238
|
// src/adapters/fetch/orpc-handler.ts
|
239
|
-
import {
|
240
|
-
import {
|
239
|
+
import { ORPCError as ORPCError2 } from "@orpc/contract";
|
240
|
+
import { executeWithHooks, trim as trim2 } from "@orpc/shared";
|
241
241
|
var ORPCHandler = class {
|
242
242
|
constructor(router, options) {
|
243
|
-
this.router = router;
|
244
243
|
this.options = options;
|
245
244
|
this.procedureMatcher = options?.procedureMatcher ?? new ORPCProcedureMatcher(router);
|
246
245
|
this.payloadCodec = options?.payloadCodec ?? new ORPCPayloadCodec();
|
247
246
|
}
|
248
247
|
procedureMatcher;
|
249
248
|
payloadCodec;
|
250
|
-
|
251
|
-
return Boolean(request.headers.get(ORPC_HANDLER_HEADER)?.includes(ORPC_HANDLER_VALUE));
|
252
|
-
}
|
253
|
-
async fetch(request, ...[options]) {
|
249
|
+
async handle(request, ...[options]) {
|
254
250
|
const context = options?.context;
|
255
251
|
const execute = async () => {
|
256
252
|
const url = new URL(request.url);
|
257
253
|
const pathname = `/${trim2(url.pathname.replace(options?.prefix ?? "", ""), "/")}`;
|
258
254
|
const match = await this.procedureMatcher.match(pathname);
|
259
255
|
if (!match) {
|
260
|
-
|
256
|
+
return { matched: false, response: void 0 };
|
261
257
|
}
|
262
258
|
const input = await this.payloadCodec.decode(request);
|
263
259
|
const client = createProcedureClient({
|
@@ -265,20 +261,22 @@ var ORPCHandler = class {
|
|
265
261
|
procedure: match.procedure,
|
266
262
|
path: match.path
|
267
263
|
});
|
268
|
-
const output = await client(input, { signal:
|
264
|
+
const output = await client(input, { signal: request.signal });
|
269
265
|
const { body, headers } = this.payloadCodec.encode(output);
|
270
|
-
|
266
|
+
const response = new Response(body, { headers });
|
267
|
+
return { matched: true, response };
|
271
268
|
};
|
272
269
|
try {
|
273
|
-
|
270
|
+
const result = await executeWithHooks({
|
274
271
|
context,
|
275
272
|
execute,
|
276
273
|
input: request,
|
277
274
|
hooks: this.options,
|
278
275
|
meta: {
|
279
|
-
signal:
|
276
|
+
signal: request.signal
|
280
277
|
}
|
281
278
|
});
|
279
|
+
return result;
|
282
280
|
} catch (e) {
|
283
281
|
const error = e instanceof ORPCError2 ? e : new ORPCError2({
|
284
282
|
code: "INTERNAL_SERVER_ERROR",
|
@@ -286,10 +284,11 @@ var ORPCHandler = class {
|
|
286
284
|
cause: e
|
287
285
|
});
|
288
286
|
const { body, headers } = this.payloadCodec.encode(error.toJSON());
|
289
|
-
|
287
|
+
const response = new Response(body, {
|
290
288
|
headers,
|
291
289
|
status: error.status
|
292
290
|
});
|
291
|
+
return { matched: true, response };
|
293
292
|
}
|
294
293
|
}
|
295
294
|
};
|
@@ -300,4 +299,4 @@ export {
|
|
300
299
|
ORPCProcedureMatcher,
|
301
300
|
ORPCHandler
|
302
301
|
};
|
303
|
-
//# sourceMappingURL=chunk-
|
302
|
+
//# sourceMappingURL=chunk-V3I7RIRY.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
//# sourceMappingURL=chunk-WUOGVGWG.js.map
|
package/dist/fetch.js
CHANGED
@@ -1,29 +1,12 @@
|
|
1
|
+
import "./chunk-WUOGVGWG.js";
|
1
2
|
import {
|
2
3
|
ORPCHandler,
|
3
4
|
ORPCPayloadCodec,
|
4
5
|
ORPCProcedureMatcher,
|
5
6
|
super_json_exports
|
6
|
-
} from "./chunk-
|
7
|
-
import "./chunk-
|
8
|
-
|
9
|
-
// src/adapters/fetch/composite-handler.ts
|
10
|
-
var CompositeHandler = class {
|
11
|
-
constructor(handlers) {
|
12
|
-
this.handlers = handlers;
|
13
|
-
}
|
14
|
-
async fetch(request, ...opt) {
|
15
|
-
for (const handler of this.handlers) {
|
16
|
-
if (handler.condition(request)) {
|
17
|
-
return handler.fetch(request, ...opt);
|
18
|
-
}
|
19
|
-
}
|
20
|
-
return new Response("None of the handlers can handle the request.", {
|
21
|
-
status: 404
|
22
|
-
});
|
23
|
-
}
|
24
|
-
};
|
7
|
+
} from "./chunk-V3I7RIRY.js";
|
8
|
+
import "./chunk-DNG2IB3R.js";
|
25
9
|
export {
|
26
|
-
CompositeHandler,
|
27
10
|
ORPCHandler,
|
28
11
|
ORPCPayloadCodec,
|
29
12
|
ORPCProcedureMatcher,
|
package/dist/hono.js
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
import "./chunk-WUOGVGWG.js";
|
2
|
+
import {
|
3
|
+
ORPCHandler,
|
4
|
+
ORPCPayloadCodec,
|
5
|
+
ORPCProcedureMatcher,
|
6
|
+
super_json_exports
|
7
|
+
} from "./chunk-V3I7RIRY.js";
|
8
|
+
import "./chunk-DNG2IB3R.js";
|
9
|
+
|
10
|
+
// src/adapters/hono/middleware.ts
|
11
|
+
import { value } from "@orpc/shared";
|
12
|
+
function createMiddleware(handler, ...[options]) {
|
13
|
+
return async (c, next) => {
|
14
|
+
const context = await value(options?.context, c);
|
15
|
+
const { matched, response } = await handler.handle(c.req.raw, { ...options, context });
|
16
|
+
if (matched) {
|
17
|
+
c.res = response;
|
18
|
+
return;
|
19
|
+
}
|
20
|
+
await next();
|
21
|
+
};
|
22
|
+
}
|
23
|
+
export {
|
24
|
+
ORPCHandler,
|
25
|
+
ORPCPayloadCodec,
|
26
|
+
ORPCProcedureMatcher,
|
27
|
+
super_json_exports as SuperJSON,
|
28
|
+
createMiddleware
|
29
|
+
};
|
30
|
+
//# sourceMappingURL=hono.js.map
|
package/dist/index.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import {
|
2
2
|
LAZY_LOADER_SYMBOL,
|
3
3
|
Procedure,
|
4
|
+
createORPCErrorConstructorMap,
|
4
5
|
createProcedureClient,
|
5
6
|
flatLazy,
|
6
7
|
getRouterChild,
|
@@ -9,7 +10,7 @@ import {
|
|
9
10
|
lazy,
|
10
11
|
mergeContext,
|
11
12
|
unlazy
|
12
|
-
} from "./chunk-
|
13
|
+
} from "./chunk-DNG2IB3R.js";
|
13
14
|
|
14
15
|
// src/builder.ts
|
15
16
|
import { ContractProcedure } from "@orpc/contract";
|
@@ -346,6 +347,12 @@ var ProcedureBuilder = class _ProcedureBuilder {
|
|
346
347
|
contract: DecoratedContractProcedure2.decorate(this["~orpc"].contract).output(schema, example)
|
347
348
|
});
|
348
349
|
}
|
350
|
+
errors(errors) {
|
351
|
+
return new _ProcedureBuilder({
|
352
|
+
...this["~orpc"],
|
353
|
+
contract: DecoratedContractProcedure2.decorate(this["~orpc"].contract).errors(errors)
|
354
|
+
});
|
355
|
+
}
|
349
356
|
use(middleware, mapInput) {
|
350
357
|
if (!mapInput) {
|
351
358
|
return new ProcedureImplementer({
|
@@ -392,7 +399,8 @@ var Builder = class _Builder {
|
|
392
399
|
contract: new ContractProcedure({
|
393
400
|
route,
|
394
401
|
InputSchema: void 0,
|
395
|
-
OutputSchema: void 0
|
402
|
+
OutputSchema: void 0,
|
403
|
+
errorMap: void 0
|
396
404
|
})
|
397
405
|
});
|
398
406
|
}
|
@@ -402,7 +410,8 @@ var Builder = class _Builder {
|
|
402
410
|
contract: new ContractProcedure({
|
403
411
|
OutputSchema: void 0,
|
404
412
|
InputSchema: schema,
|
405
|
-
inputExample: example
|
413
|
+
inputExample: example,
|
414
|
+
errorMap: void 0
|
406
415
|
})
|
407
416
|
});
|
408
417
|
}
|
@@ -412,7 +421,18 @@ var Builder = class _Builder {
|
|
412
421
|
contract: new ContractProcedure({
|
413
422
|
InputSchema: void 0,
|
414
423
|
OutputSchema: schema,
|
415
|
-
outputExample: example
|
424
|
+
outputExample: example,
|
425
|
+
errorMap: void 0
|
426
|
+
})
|
427
|
+
});
|
428
|
+
}
|
429
|
+
errors(errors) {
|
430
|
+
return new ProcedureBuilder({
|
431
|
+
middlewares: this["~orpc"].middlewares,
|
432
|
+
contract: new ContractProcedure({
|
433
|
+
InputSchema: void 0,
|
434
|
+
OutputSchema: void 0,
|
435
|
+
errorMap: errors
|
416
436
|
})
|
417
437
|
});
|
418
438
|
}
|
@@ -421,7 +441,8 @@ var Builder = class _Builder {
|
|
421
441
|
middlewares: this["~orpc"].middlewares,
|
422
442
|
contract: new ContractProcedure({
|
423
443
|
InputSchema: void 0,
|
424
|
-
OutputSchema: void 0
|
444
|
+
OutputSchema: void 0,
|
445
|
+
errorMap: void 0
|
425
446
|
}),
|
426
447
|
handler
|
427
448
|
}));
|
@@ -486,12 +507,12 @@ function createRouterClient(options) {
|
|
486
507
|
}
|
487
508
|
|
488
509
|
// src/index.ts
|
489
|
-
import { configGlobal, fallbackToGlobalConfig } from "@orpc/contract";
|
490
|
-
export * from "@orpc/shared/error";
|
510
|
+
import { configGlobal, fallbackToGlobalConfig, isDefinedError, ORPCError, safe } from "@orpc/contract";
|
491
511
|
var os = new Builder({});
|
492
512
|
export {
|
493
513
|
Builder,
|
494
514
|
LAZY_LOADER_SYMBOL,
|
515
|
+
ORPCError,
|
495
516
|
Procedure,
|
496
517
|
ProcedureBuilder,
|
497
518
|
ProcedureImplementer,
|
@@ -499,6 +520,7 @@ export {
|
|
499
520
|
RouterImplementer,
|
500
521
|
configGlobal,
|
501
522
|
createChainableImplementer,
|
523
|
+
createORPCErrorConstructorMap,
|
502
524
|
createProcedureClient,
|
503
525
|
createRouterClient,
|
504
526
|
decorateLazy,
|
@@ -510,11 +532,13 @@ export {
|
|
510
532
|
getLazyRouterPrefix,
|
511
533
|
getRouterChild,
|
512
534
|
getRouterContract,
|
535
|
+
isDefinedError,
|
513
536
|
isLazy,
|
514
537
|
isProcedure,
|
515
538
|
lazy,
|
516
539
|
mergeContext,
|
517
540
|
os,
|
541
|
+
safe,
|
518
542
|
setRouterContract,
|
519
543
|
unlazy
|
520
544
|
};
|
package/dist/next.js
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
import "./chunk-WUOGVGWG.js";
|
2
|
+
import {
|
3
|
+
ORPCHandler,
|
4
|
+
ORPCPayloadCodec,
|
5
|
+
ORPCProcedureMatcher,
|
6
|
+
super_json_exports
|
7
|
+
} from "./chunk-V3I7RIRY.js";
|
8
|
+
import "./chunk-DNG2IB3R.js";
|
9
|
+
|
10
|
+
// src/adapters/next/serve.ts
|
11
|
+
import { value } from "@orpc/shared";
|
12
|
+
function serve(handler, ...[options]) {
|
13
|
+
const main = async (req) => {
|
14
|
+
const context = await value(options?.context, req);
|
15
|
+
const { matched, response } = await handler.handle(req, { ...options, context });
|
16
|
+
if (matched) {
|
17
|
+
return response;
|
18
|
+
}
|
19
|
+
return new Response(`Cannot find a matching procedure for ${req.url}`, { status: 404 });
|
20
|
+
};
|
21
|
+
return {
|
22
|
+
GET: main,
|
23
|
+
POST: main,
|
24
|
+
PUT: main,
|
25
|
+
PATCH: main,
|
26
|
+
DELETE: main
|
27
|
+
};
|
28
|
+
}
|
29
|
+
export {
|
30
|
+
ORPCHandler,
|
31
|
+
ORPCPayloadCodec,
|
32
|
+
ORPCProcedureMatcher,
|
33
|
+
super_json_exports as SuperJSON,
|
34
|
+
serve
|
35
|
+
};
|
36
|
+
//# sourceMappingURL=next.js.map
|
package/dist/node.js
CHANGED
@@ -1,45 +1,87 @@
|
|
1
1
|
import {
|
2
2
|
ORPCHandler
|
3
|
-
} from "./chunk-
|
4
|
-
import "./chunk-
|
3
|
+
} from "./chunk-V3I7RIRY.js";
|
4
|
+
import "./chunk-DNG2IB3R.js";
|
5
5
|
|
6
|
-
// src/adapters/node/
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
// src/adapters/node/request-listener.ts
|
7
|
+
function createRequest(req, res) {
|
8
|
+
const controller = new AbortController();
|
9
|
+
res.on("close", () => {
|
10
|
+
controller.abort();
|
11
|
+
});
|
12
|
+
const method = req.method ?? "GET";
|
13
|
+
const headers = createHeaders(req);
|
14
|
+
const protocol = "encrypted" in req.socket && req.socket.encrypted ? "https:" : "http:";
|
15
|
+
const host = headers.get("Host") ?? "localhost";
|
16
|
+
const url = new URL(req.originalUrl ?? req.url ?? "/", `${protocol}//${host}`);
|
17
|
+
const init = { method, headers, signal: controller.signal };
|
18
|
+
if (method !== "GET" && method !== "HEAD") {
|
19
|
+
init.body = new ReadableStream({
|
20
|
+
start(controller2) {
|
21
|
+
req.on("data", (chunk) => {
|
22
|
+
controller2.enqueue(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));
|
23
|
+
});
|
24
|
+
req.on("end", () => {
|
25
|
+
controller2.close();
|
26
|
+
});
|
27
|
+
}
|
28
|
+
});
|
29
|
+
init.duplex = "half";
|
30
|
+
}
|
31
|
+
return new Request(url, init);
|
32
|
+
}
|
33
|
+
function createHeaders(req) {
|
34
|
+
const headers = new Headers();
|
35
|
+
const rawHeaders = req.rawHeaders;
|
36
|
+
for (let i = 0; i < rawHeaders.length; i += 2) {
|
37
|
+
headers.append(rawHeaders[i], rawHeaders[i + 1]);
|
10
38
|
}
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
39
|
+
return headers;
|
40
|
+
}
|
41
|
+
async function sendResponse(res, response) {
|
42
|
+
const headers = {};
|
43
|
+
for (const [key, value] of response.headers) {
|
44
|
+
if (key in headers) {
|
45
|
+
if (Array.isArray(headers[key])) {
|
46
|
+
headers[key].push(value);
|
47
|
+
} else {
|
48
|
+
headers[key] = [headers[key], value];
|
15
49
|
}
|
50
|
+
} else {
|
51
|
+
headers[key] = value;
|
16
52
|
}
|
17
|
-
res.statusCode = 404;
|
18
|
-
res.end("None of the handlers can handle the request.");
|
19
53
|
}
|
20
|
-
|
54
|
+
res.writeHead(response.status, headers);
|
55
|
+
if (response.body != null && res.req.method !== "HEAD") {
|
56
|
+
for await (const chunk of response.body) {
|
57
|
+
res.write(chunk);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
res.end();
|
61
|
+
}
|
21
62
|
|
22
63
|
// src/adapters/node/orpc-handler.ts
|
23
|
-
import { createRequest, sendResponse } from "@mjackson/node-fetch-server";
|
24
|
-
import { ORPC_HANDLER_HEADER, ORPC_HANDLER_VALUE } from "@orpc/shared";
|
25
64
|
var ORPCHandler2 = class {
|
26
65
|
orpcFetchHandler;
|
27
66
|
constructor(router, options) {
|
28
67
|
this.orpcFetchHandler = new ORPCHandler(router, options);
|
29
68
|
}
|
30
|
-
condition(request) {
|
31
|
-
return Boolean(request.headers[ORPC_HANDLER_HEADER]?.includes(ORPC_HANDLER_VALUE));
|
32
|
-
}
|
33
69
|
async handle(req, res, ...[options]) {
|
34
|
-
const request = createRequest(req, res
|
70
|
+
const request = createRequest(req, res);
|
35
71
|
const castedOptions = options ?? {};
|
36
|
-
const
|
37
|
-
|
38
|
-
|
72
|
+
const result = await this.orpcFetchHandler.handle(request, castedOptions);
|
73
|
+
if (result.matched === false) {
|
74
|
+
return { matched: false };
|
75
|
+
}
|
76
|
+
await options?.beforeSend?.(result.response, castedOptions.context);
|
77
|
+
await sendResponse(res, result.response);
|
78
|
+
return { matched: true };
|
39
79
|
}
|
40
80
|
};
|
41
81
|
export {
|
42
|
-
|
43
|
-
|
82
|
+
ORPCHandler2 as ORPCHandler,
|
83
|
+
createHeaders,
|
84
|
+
createRequest,
|
85
|
+
sendResponse
|
44
86
|
};
|
45
87
|
//# sourceMappingURL=node.js.map
|
@@ -1,20 +1,20 @@
|
|
1
1
|
import type { Hooks } from '@orpc/shared';
|
2
2
|
import type { Router } from '../../router';
|
3
|
-
import type { Context
|
4
|
-
import type {
|
3
|
+
import type { Context } from '../../types';
|
4
|
+
import type { FetchHandler, FetchHandleRest, FetchHandleResult } from './types';
|
5
5
|
import { type PublicORPCPayloadCodec } from './orpc-payload-codec';
|
6
6
|
import { type PublicORPCProcedureMatcher } from './orpc-procedure-matcher';
|
7
|
-
export type ORPCHandlerOptions<T extends Context> = Hooks<Request,
|
7
|
+
export type ORPCHandlerOptions<T extends Context> = Hooks<Request, FetchHandleResult, T, {
|
8
|
+
signal?: AbortSignal;
|
9
|
+
}> & {
|
8
10
|
procedureMatcher?: PublicORPCProcedureMatcher;
|
9
11
|
payloadCodec?: PublicORPCPayloadCodec;
|
10
12
|
};
|
11
|
-
export declare class ORPCHandler<T extends Context> implements
|
12
|
-
readonly
|
13
|
-
readonly options?: NoInfer<ORPCHandlerOptions<T>> | undefined;
|
13
|
+
export declare class ORPCHandler<T extends Context> implements FetchHandler<T> {
|
14
|
+
private readonly options?;
|
14
15
|
private readonly procedureMatcher;
|
15
16
|
private readonly payloadCodec;
|
16
17
|
constructor(router: Router<T, any>, options?: NoInfer<ORPCHandlerOptions<T>> | undefined);
|
17
|
-
|
18
|
-
fetch(request: Request, ...[options]: [options: FetchOptions<T>] | (undefined extends T ? [] : never)): Promise<Response>;
|
18
|
+
handle(request: Request, ...[options]: FetchHandleRest<T>): Promise<FetchHandleResult>;
|
19
19
|
}
|
20
20
|
//# sourceMappingURL=orpc-handler.d.ts.map
|
@@ -1,16 +1,21 @@
|
|
1
1
|
import type { HTTPPath } from '@orpc/contract';
|
2
|
-
import type { Context
|
3
|
-
export type
|
2
|
+
import type { Context } from '../../types';
|
3
|
+
export type FetchHandleOptions<T extends Context> = {
|
4
4
|
prefix?: HTTPPath;
|
5
5
|
} & (undefined extends T ? {
|
6
6
|
context?: T;
|
7
7
|
} : {
|
8
8
|
context: T;
|
9
9
|
});
|
10
|
+
export type FetchHandleRest<T extends Context> = [options: FetchHandleOptions<T>] | (undefined extends T ? [] : never);
|
11
|
+
export type FetchHandleResult = {
|
12
|
+
matched: true;
|
13
|
+
response: Response;
|
14
|
+
} | {
|
15
|
+
matched: false;
|
16
|
+
response: undefined;
|
17
|
+
};
|
10
18
|
export interface FetchHandler<T extends Context> {
|
11
|
-
|
12
|
-
}
|
13
|
-
export interface ConditionalFetchHandler<T extends Context> extends FetchHandler<T> {
|
14
|
-
condition: (request: Request) => boolean;
|
19
|
+
handle: (request: Request, ...rest: FetchHandleRest<T>) => Promise<FetchHandleResult>;
|
15
20
|
}
|
16
21
|
//# sourceMappingURL=types.d.ts.map
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import type { Context as HonoContext, MiddlewareHandler } from 'hono';
|
2
|
+
import type { Context } from '../../types';
|
3
|
+
import type { FetchHandleOptions, FetchHandler } from '../fetch';
|
4
|
+
import { type Value } from '@orpc/shared';
|
5
|
+
export type CreateMiddlewareOptions<T extends Context> = Omit<FetchHandleOptions<T>, 'context'> & (undefined extends T ? {
|
6
|
+
context?: Value<T, [HonoContext]>;
|
7
|
+
} : {
|
8
|
+
context: Value<T, [HonoContext]>;
|
9
|
+
});
|
10
|
+
export type CreateMiddlewareRest<T extends Context> = [options: CreateMiddlewareOptions<T>] | (undefined extends T ? [] : never);
|
11
|
+
export declare function createMiddleware<T extends Context>(handler: FetchHandler<T>, ...[options]: CreateMiddlewareRest<T>): MiddlewareHandler;
|
12
|
+
//# sourceMappingURL=middleware.d.ts.map
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import type { NextRequest } from 'next/server';
|
2
|
+
import type { Context } from '../../types';
|
3
|
+
import type { FetchHandleOptions, FetchHandler } from '../fetch';
|
4
|
+
import { type Value } from '@orpc/shared';
|
5
|
+
export type ServeOptions<T extends Context> = Omit<FetchHandleOptions<T>, 'context'> & (undefined extends T ? {
|
6
|
+
context?: Value<T, [NextRequest]>;
|
7
|
+
} : {
|
8
|
+
context: Value<T, [NextRequest]>;
|
9
|
+
});
|
10
|
+
export type ServeRest<T extends Context> = [options: ServeOptions<T>] | (undefined extends T ? [] : never);
|
11
|
+
export interface ServeResult {
|
12
|
+
GET: (req: NextRequest) => Promise<Response>;
|
13
|
+
POST: (req: NextRequest) => Promise<Response>;
|
14
|
+
PUT: (req: NextRequest) => Promise<Response>;
|
15
|
+
PATCH: (req: NextRequest) => Promise<Response>;
|
16
|
+
DELETE: (req: NextRequest) => Promise<Response>;
|
17
|
+
}
|
18
|
+
export declare function serve<T extends Context>(handler: FetchHandler<T>, ...[options]: ServeRest<T>): ServeResult;
|
19
|
+
//# sourceMappingURL=serve.d.ts.map
|