@orpc/server 0.0.0-next.9ada823 → 0.0.0-next.9b3a030
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-37HIYNDO.js → chunk-DNG2IB3R.js} +73 -28
- package/dist/chunk-V3I7RIRY.js +302 -0
- package/dist/chunk-WUOGVGWG.js +1 -0
- package/dist/fetch.js +9 -297
- package/dist/hono.js +30 -0
- package/dist/index.js +38 -11
- package/dist/next.js +36 -0
- package/dist/node.js +87 -0
- package/dist/src/{fetch → adapters/fetch}/index.d.ts +1 -1
- package/dist/src/adapters/fetch/orpc-handler.d.ts +20 -0
- package/dist/src/adapters/fetch/orpc-payload-codec.d.ts +16 -0
- package/dist/src/{fetch → adapters/fetch}/orpc-procedure-matcher.d.ts +2 -2
- package/dist/src/adapters/fetch/types.d.ts +21 -0
- 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 +5 -0
- package/dist/src/adapters/node/orpc-handler.d.ts +12 -0
- package/dist/src/adapters/node/request-listener.d.ts +28 -0
- package/dist/src/adapters/node/types.d.ts +22 -0
- package/dist/src/builder.d.ts +10 -9
- package/dist/src/error.d.ts +10 -0
- package/dist/src/implementer-chainable.d.ts +2 -2
- package/dist/src/index.d.ts +2 -1
- package/dist/src/lazy-decorated.d.ts +2 -2
- package/dist/src/middleware-decorated.d.ts +6 -5
- package/dist/src/middleware.d.ts +20 -8
- package/dist/src/procedure-builder.d.ts +16 -14
- 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 +12 -11
- package/dist/src/procedure.d.ts +33 -13
- 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/dist/src/types.d.ts +2 -0
- package/package.json +24 -8
- package/dist/src/fetch/composite-handler.d.ts +0 -8
- package/dist/src/fetch/orpc-handler.d.ts +0 -20
- package/dist/src/fetch/orpc-payload-codec.d.ts +0 -11
- package/dist/src/fetch/types.d.ts +0 -16
- /package/dist/src/{fetch → adapters/fetch}/super-json.d.ts +0 -0
package/dist/fetch.js
CHANGED
@@ -1,303 +1,15 @@
|
|
1
|
+
import "./chunk-WUOGVGWG.js";
|
1
2
|
import {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
} from "./chunk-
|
7
|
-
|
8
|
-
// src/fetch/composite-handler.ts
|
9
|
-
var CompositeHandler = class {
|
10
|
-
constructor(handlers) {
|
11
|
-
this.handlers = handlers;
|
12
|
-
}
|
13
|
-
async fetch(request, ...opt) {
|
14
|
-
for (const handler of this.handlers) {
|
15
|
-
if (handler.condition(request)) {
|
16
|
-
return handler.fetch(request, ...opt);
|
17
|
-
}
|
18
|
-
}
|
19
|
-
return new Response("None of the handlers can handle the request.", {
|
20
|
-
status: 404
|
21
|
-
});
|
22
|
-
}
|
23
|
-
};
|
24
|
-
|
25
|
-
// src/fetch/orpc-handler.ts
|
26
|
-
import { executeWithHooks, ORPC_HANDLER_HEADER, ORPC_HANDLER_VALUE, trim as trim2 } from "@orpc/shared";
|
27
|
-
import { ORPCError as ORPCError2 } from "@orpc/shared/error";
|
28
|
-
|
29
|
-
// src/fetch/orpc-payload-codec.ts
|
30
|
-
import { findDeepMatches, set } from "@orpc/shared";
|
31
|
-
import { ORPCError } from "@orpc/shared/error";
|
32
|
-
|
33
|
-
// ../../node_modules/.pnpm/is-what@5.0.2/node_modules/is-what/dist/getType.js
|
34
|
-
function getType(payload) {
|
35
|
-
return Object.prototype.toString.call(payload).slice(8, -1);
|
36
|
-
}
|
37
|
-
|
38
|
-
// ../../node_modules/.pnpm/is-what@5.0.2/node_modules/is-what/dist/isPlainObject.js
|
39
|
-
function isPlainObject(payload) {
|
40
|
-
if (getType(payload) !== "Object")
|
41
|
-
return false;
|
42
|
-
const prototype = Object.getPrototypeOf(payload);
|
43
|
-
return !!prototype && prototype.constructor === Object && prototype === Object.prototype;
|
44
|
-
}
|
45
|
-
|
46
|
-
// src/fetch/super-json.ts
|
47
|
-
function serialize(value, segments = [], meta = []) {
|
48
|
-
if (typeof value === "bigint") {
|
49
|
-
meta.push(["bigint", segments]);
|
50
|
-
return { data: value.toString(), meta };
|
51
|
-
}
|
52
|
-
if (value instanceof Date) {
|
53
|
-
meta.push(["date", segments]);
|
54
|
-
const data = Number.isNaN(value.getTime()) ? "Invalid Date" : value.toISOString();
|
55
|
-
return { data, meta };
|
56
|
-
}
|
57
|
-
if (Number.isNaN(value)) {
|
58
|
-
meta.push(["nan", segments]);
|
59
|
-
return { data: "NaN", meta };
|
60
|
-
}
|
61
|
-
if (value instanceof RegExp) {
|
62
|
-
meta.push(["regexp", segments]);
|
63
|
-
return { data: value.toString(), meta };
|
64
|
-
}
|
65
|
-
if (value instanceof URL) {
|
66
|
-
meta.push(["url", segments]);
|
67
|
-
return { data: value.toString(), meta };
|
68
|
-
}
|
69
|
-
if (isPlainObject(value)) {
|
70
|
-
const data = {};
|
71
|
-
for (const k in value) {
|
72
|
-
data[k] = serialize(value[k], [...segments, k], meta).data;
|
73
|
-
}
|
74
|
-
return { data, meta };
|
75
|
-
}
|
76
|
-
if (Array.isArray(value)) {
|
77
|
-
const data = value.map((v, i) => {
|
78
|
-
if (v === void 0) {
|
79
|
-
meta.push(["undefined", [...segments, i]]);
|
80
|
-
return null;
|
81
|
-
}
|
82
|
-
return serialize(v, [...segments, i], meta).data;
|
83
|
-
});
|
84
|
-
return { data, meta };
|
85
|
-
}
|
86
|
-
if (value instanceof Set) {
|
87
|
-
const result = serialize(Array.from(value), segments, meta);
|
88
|
-
meta.push(["set", segments]);
|
89
|
-
return result;
|
90
|
-
}
|
91
|
-
if (value instanceof Map) {
|
92
|
-
const result = serialize(Array.from(value.entries()), segments, meta);
|
93
|
-
meta.push(["map", segments]);
|
94
|
-
return result;
|
95
|
-
}
|
96
|
-
return { data: value, meta };
|
97
|
-
}
|
98
|
-
function deserialize({
|
99
|
-
data,
|
100
|
-
meta
|
101
|
-
}) {
|
102
|
-
if (meta.length === 0) {
|
103
|
-
return data;
|
104
|
-
}
|
105
|
-
const ref = { data };
|
106
|
-
for (const [type, segments] of meta) {
|
107
|
-
let currentRef = ref;
|
108
|
-
let preSegment = "data";
|
109
|
-
for (let i = 0; i < segments.length; i++) {
|
110
|
-
currentRef = currentRef[preSegment];
|
111
|
-
preSegment = segments[i];
|
112
|
-
}
|
113
|
-
switch (type) {
|
114
|
-
case "nan":
|
115
|
-
currentRef[preSegment] = Number.NaN;
|
116
|
-
break;
|
117
|
-
case "bigint":
|
118
|
-
currentRef[preSegment] = BigInt(currentRef[preSegment]);
|
119
|
-
break;
|
120
|
-
case "date":
|
121
|
-
currentRef[preSegment] = new Date(currentRef[preSegment]);
|
122
|
-
break;
|
123
|
-
case "regexp": {
|
124
|
-
const [, pattern, flags] = currentRef[preSegment].match(/^\/(.*)\/([a-z]*)$/);
|
125
|
-
currentRef[preSegment] = new RegExp(pattern, flags);
|
126
|
-
break;
|
127
|
-
}
|
128
|
-
case "url":
|
129
|
-
currentRef[preSegment] = new URL(currentRef[preSegment]);
|
130
|
-
break;
|
131
|
-
case "undefined":
|
132
|
-
currentRef[preSegment] = void 0;
|
133
|
-
break;
|
134
|
-
case "map":
|
135
|
-
currentRef[preSegment] = new Map(currentRef[preSegment]);
|
136
|
-
break;
|
137
|
-
case "set":
|
138
|
-
currentRef[preSegment] = new Set(currentRef[preSegment]);
|
139
|
-
break;
|
140
|
-
/* v8 ignore next 3 */
|
141
|
-
default: {
|
142
|
-
const _expected = type;
|
143
|
-
}
|
144
|
-
}
|
145
|
-
}
|
146
|
-
return ref.data;
|
147
|
-
}
|
148
|
-
|
149
|
-
// src/fetch/orpc-payload-codec.ts
|
150
|
-
var ORPCPayloadCodec = class {
|
151
|
-
encode(payload, method = "POST") {
|
152
|
-
const { data, meta } = serialize(payload);
|
153
|
-
if (method === "GET") {
|
154
|
-
const query = new URLSearchParams({
|
155
|
-
data: JSON.stringify(data),
|
156
|
-
meta: JSON.stringify(meta)
|
157
|
-
});
|
158
|
-
return { query };
|
159
|
-
}
|
160
|
-
const { maps, values } = findDeepMatches((v) => v instanceof Blob, data);
|
161
|
-
if (values.length > 0) {
|
162
|
-
const form = new FormData();
|
163
|
-
if (data !== void 0) {
|
164
|
-
form.append("data", JSON.stringify(data));
|
165
|
-
}
|
166
|
-
form.append("meta", JSON.stringify(meta));
|
167
|
-
form.append("maps", JSON.stringify(maps));
|
168
|
-
for (const i in values) {
|
169
|
-
const value = values[i];
|
170
|
-
form.append(i, value);
|
171
|
-
}
|
172
|
-
return { body: form };
|
173
|
-
}
|
174
|
-
return {
|
175
|
-
body: JSON.stringify({ data, meta }),
|
176
|
-
headers: new Headers({
|
177
|
-
"content-type": "application/json"
|
178
|
-
})
|
179
|
-
};
|
180
|
-
}
|
181
|
-
async decode(re) {
|
182
|
-
try {
|
183
|
-
if ("method" in re && re.method === "GET") {
|
184
|
-
const url = new URL(re.url);
|
185
|
-
const query = url.searchParams;
|
186
|
-
const data = JSON.parse(query.getAll("data").at(-1));
|
187
|
-
const meta = JSON.parse(query.getAll("meta").at(-1));
|
188
|
-
return deserialize({
|
189
|
-
data,
|
190
|
-
meta
|
191
|
-
});
|
192
|
-
}
|
193
|
-
if (re.headers.get("content-type")?.startsWith("multipart/form-data")) {
|
194
|
-
const form = await re.formData();
|
195
|
-
const rawData = form.get("data");
|
196
|
-
const rawMeta = form.get("meta");
|
197
|
-
const rawMaps = form.get("maps");
|
198
|
-
let data = JSON.parse(rawData);
|
199
|
-
const meta = JSON.parse(rawMeta);
|
200
|
-
const maps = JSON.parse(rawMaps);
|
201
|
-
for (const i in maps) {
|
202
|
-
data = set(data, maps[i], form.get(i));
|
203
|
-
}
|
204
|
-
return deserialize({
|
205
|
-
data,
|
206
|
-
meta
|
207
|
-
});
|
208
|
-
}
|
209
|
-
const json = await re.json();
|
210
|
-
return deserialize(json);
|
211
|
-
} catch (e) {
|
212
|
-
throw new ORPCError({
|
213
|
-
code: "BAD_REQUEST",
|
214
|
-
message: "Cannot parse request/response. Please check the request/response body and Content-Type header.",
|
215
|
-
cause: e
|
216
|
-
});
|
217
|
-
}
|
218
|
-
}
|
219
|
-
};
|
220
|
-
|
221
|
-
// src/fetch/orpc-procedure-matcher.ts
|
222
|
-
import { trim } from "@orpc/shared";
|
223
|
-
var ORPCProcedureMatcher = class {
|
224
|
-
constructor(router) {
|
225
|
-
this.router = router;
|
226
|
-
}
|
227
|
-
async match(pathname) {
|
228
|
-
const path = trim(pathname, "/").split("/").map(decodeURIComponent);
|
229
|
-
const match = getRouterChild(this.router, ...path);
|
230
|
-
const { default: maybeProcedure } = await unlazy(match);
|
231
|
-
if (!isProcedure(maybeProcedure)) {
|
232
|
-
return void 0;
|
233
|
-
}
|
234
|
-
return {
|
235
|
-
procedure: maybeProcedure,
|
236
|
-
path
|
237
|
-
};
|
238
|
-
}
|
239
|
-
};
|
240
|
-
|
241
|
-
// src/fetch/orpc-handler.ts
|
242
|
-
var ORPCHandler = class {
|
243
|
-
constructor(router, options) {
|
244
|
-
this.router = router;
|
245
|
-
this.options = options;
|
246
|
-
this.procedureMatcher = options?.procedureMatcher ?? new ORPCProcedureMatcher(router);
|
247
|
-
this.payloadCodec = options?.payloadCodec ?? new ORPCPayloadCodec();
|
248
|
-
}
|
249
|
-
procedureMatcher;
|
250
|
-
payloadCodec;
|
251
|
-
condition(request) {
|
252
|
-
return Boolean(request.headers.get(ORPC_HANDLER_HEADER)?.includes(ORPC_HANDLER_VALUE));
|
253
|
-
}
|
254
|
-
async fetch(request, ...[options]) {
|
255
|
-
const context = options?.context;
|
256
|
-
const execute = async () => {
|
257
|
-
const url = new URL(request.url);
|
258
|
-
const pathname = `/${trim2(url.pathname.replace(options?.prefix ?? "", ""), "/")}`;
|
259
|
-
const match = await this.procedureMatcher.match(pathname);
|
260
|
-
if (!match) {
|
261
|
-
throw new ORPCError2({ code: "NOT_FOUND", message: "Not found" });
|
262
|
-
}
|
263
|
-
const input = await this.payloadCodec.decode(request);
|
264
|
-
const client = createProcedureClient({
|
265
|
-
context,
|
266
|
-
procedure: match.procedure,
|
267
|
-
path: match.path
|
268
|
-
});
|
269
|
-
const output = await client(input, { signal: options?.signal });
|
270
|
-
const { body, headers } = this.payloadCodec.encode(output);
|
271
|
-
return new Response(body, { headers });
|
272
|
-
};
|
273
|
-
try {
|
274
|
-
return await executeWithHooks({
|
275
|
-
context,
|
276
|
-
execute,
|
277
|
-
input: request,
|
278
|
-
hooks: this.options,
|
279
|
-
meta: {
|
280
|
-
signal: options?.signal
|
281
|
-
}
|
282
|
-
});
|
283
|
-
} catch (e) {
|
284
|
-
const error = e instanceof ORPCError2 ? e : new ORPCError2({
|
285
|
-
code: "INTERNAL_SERVER_ERROR",
|
286
|
-
message: "Internal server error",
|
287
|
-
cause: e
|
288
|
-
});
|
289
|
-
const { body, headers } = this.payloadCodec.encode(error.toJSON());
|
290
|
-
return new Response(body, {
|
291
|
-
headers,
|
292
|
-
status: error.status
|
293
|
-
});
|
294
|
-
}
|
295
|
-
}
|
296
|
-
};
|
3
|
+
ORPCHandler,
|
4
|
+
ORPCPayloadCodec,
|
5
|
+
ORPCProcedureMatcher,
|
6
|
+
super_json_exports
|
7
|
+
} from "./chunk-V3I7RIRY.js";
|
8
|
+
import "./chunk-DNG2IB3R.js";
|
297
9
|
export {
|
298
|
-
CompositeHandler,
|
299
10
|
ORPCHandler,
|
300
11
|
ORPCPayloadCodec,
|
301
|
-
ORPCProcedureMatcher
|
12
|
+
ORPCProcedureMatcher,
|
13
|
+
super_json_exports as SuperJSON
|
302
14
|
};
|
303
15
|
//# sourceMappingURL=fetch.js.map
|
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";
|
@@ -23,17 +24,17 @@ function decorateMiddleware(middleware) {
|
|
23
24
|
const decorated = middleware;
|
24
25
|
decorated.mapInput = (mapInput) => {
|
25
26
|
const mapped = decorateMiddleware(
|
26
|
-
(input, ...rest) => middleware(mapInput(input), ...rest)
|
27
|
+
(options, input, ...rest) => middleware(options, mapInput(input), ...rest)
|
27
28
|
);
|
28
29
|
return mapped;
|
29
30
|
};
|
30
31
|
decorated.concat = (concatMiddleware, mapInput) => {
|
31
32
|
const mapped = mapInput ? decorateMiddleware(concatMiddleware).mapInput(mapInput) : concatMiddleware;
|
32
|
-
const concatted = decorateMiddleware((
|
33
|
-
const next = async (
|
34
|
-
return mapped(
|
33
|
+
const concatted = decorateMiddleware((options, input, output, ...rest) => {
|
34
|
+
const next = async (nextOptions) => {
|
35
|
+
return mapped({ ...options, context: mergeContext(nextOptions.context, options.context) }, input, output, ...rest);
|
35
36
|
};
|
36
|
-
const merged = middleware(
|
37
|
+
const merged = middleware({ ...options, next }, input, output, ...rest);
|
37
38
|
return merged;
|
38
39
|
});
|
39
40
|
return concatted;
|
@@ -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,32 +507,38 @@ function createRouterClient(options) {
|
|
486
507
|
}
|
487
508
|
|
488
509
|
// src/index.ts
|
489
|
-
|
510
|
+
import { configGlobal, fallbackToGlobalConfig, isDefinedError, ORPCError, safe } from "@orpc/contract";
|
490
511
|
var os = new Builder({});
|
491
512
|
export {
|
492
513
|
Builder,
|
493
514
|
LAZY_LOADER_SYMBOL,
|
515
|
+
ORPCError,
|
494
516
|
Procedure,
|
495
517
|
ProcedureBuilder,
|
496
518
|
ProcedureImplementer,
|
497
519
|
RouterBuilder,
|
498
520
|
RouterImplementer,
|
521
|
+
configGlobal,
|
499
522
|
createChainableImplementer,
|
523
|
+
createORPCErrorConstructorMap,
|
500
524
|
createProcedureClient,
|
501
525
|
createRouterClient,
|
502
526
|
decorateLazy,
|
503
527
|
decorateMiddleware,
|
504
528
|
decorateProcedure,
|
505
529
|
deepSetLazyRouterPrefix,
|
530
|
+
fallbackToGlobalConfig,
|
506
531
|
flatLazy,
|
507
532
|
getLazyRouterPrefix,
|
508
533
|
getRouterChild,
|
509
534
|
getRouterContract,
|
535
|
+
isDefinedError,
|
510
536
|
isLazy,
|
511
537
|
isProcedure,
|
512
538
|
lazy,
|
513
539
|
mergeContext,
|
514
540
|
os,
|
541
|
+
safe,
|
515
542
|
setRouterContract,
|
516
543
|
unlazy
|
517
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
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
import {
|
2
|
+
ORPCHandler
|
3
|
+
} from "./chunk-V3I7RIRY.js";
|
4
|
+
import "./chunk-DNG2IB3R.js";
|
5
|
+
|
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]);
|
38
|
+
}
|
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];
|
49
|
+
}
|
50
|
+
} else {
|
51
|
+
headers[key] = value;
|
52
|
+
}
|
53
|
+
}
|
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
|
+
}
|
62
|
+
|
63
|
+
// src/adapters/node/orpc-handler.ts
|
64
|
+
var ORPCHandler2 = class {
|
65
|
+
orpcFetchHandler;
|
66
|
+
constructor(router, options) {
|
67
|
+
this.orpcFetchHandler = new ORPCHandler(router, options);
|
68
|
+
}
|
69
|
+
async handle(req, res, ...[options]) {
|
70
|
+
const request = createRequest(req, res);
|
71
|
+
const castedOptions = options ?? {};
|
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 };
|
79
|
+
}
|
80
|
+
};
|
81
|
+
export {
|
82
|
+
ORPCHandler2 as ORPCHandler,
|
83
|
+
createHeaders,
|
84
|
+
createRequest,
|
85
|
+
sendResponse
|
86
|
+
};
|
87
|
+
//# sourceMappingURL=node.js.map
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import type { Hooks } from '@orpc/shared';
|
2
|
+
import type { Router } from '../../router';
|
3
|
+
import type { Context } from '../../types';
|
4
|
+
import type { FetchHandler, FetchHandleRest, FetchHandleResult } from './types';
|
5
|
+
import { type PublicORPCPayloadCodec } from './orpc-payload-codec';
|
6
|
+
import { type PublicORPCProcedureMatcher } from './orpc-procedure-matcher';
|
7
|
+
export type ORPCHandlerOptions<T extends Context> = Hooks<Request, FetchHandleResult, T, {
|
8
|
+
signal?: AbortSignal;
|
9
|
+
}> & {
|
10
|
+
procedureMatcher?: PublicORPCProcedureMatcher;
|
11
|
+
payloadCodec?: PublicORPCPayloadCodec;
|
12
|
+
};
|
13
|
+
export declare class ORPCHandler<T extends Context> implements FetchHandler<T> {
|
14
|
+
private readonly options?;
|
15
|
+
private readonly procedureMatcher;
|
16
|
+
private readonly payloadCodec;
|
17
|
+
constructor(router: Router<T, any>, options?: NoInfer<ORPCHandlerOptions<T>> | undefined);
|
18
|
+
handle(request: Request, ...[options]: FetchHandleRest<T>): Promise<FetchHandleResult>;
|
19
|
+
}
|
20
|
+
//# sourceMappingURL=orpc-handler.d.ts.map
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { type HTTPMethod } from '@orpc/contract';
|
2
|
+
export declare class ORPCPayloadCodec {
|
3
|
+
/**
|
4
|
+
* If method is GET, the payload will be encoded as query string.
|
5
|
+
* If method is GET and payload contain file, the method will be fallback to fallbackMethod. (fallbackMethod = GET will force to use GET method)
|
6
|
+
*/
|
7
|
+
encode(payload: unknown, method?: HTTPMethod, fallbackMethod?: HTTPMethod): {
|
8
|
+
query?: URLSearchParams;
|
9
|
+
body?: FormData | string;
|
10
|
+
headers?: Headers;
|
11
|
+
method: HTTPMethod;
|
12
|
+
};
|
13
|
+
decode(re: Request | Response): Promise<unknown>;
|
14
|
+
}
|
15
|
+
export type PublicORPCPayloadCodec = Pick<ORPCPayloadCodec, keyof ORPCPayloadCodec>;
|
16
|
+
//# sourceMappingURL=orpc-payload-codec.d.ts.map
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import type { ANY_PROCEDURE } from '
|
2
|
-
import { type ANY_ROUTER } from '
|
1
|
+
import type { ANY_PROCEDURE } from '../../procedure';
|
2
|
+
import { type ANY_ROUTER } from '../../router';
|
3
3
|
export declare class ORPCProcedureMatcher {
|
4
4
|
private readonly router;
|
5
5
|
constructor(router: ANY_ROUTER);
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import type { HTTPPath } from '@orpc/contract';
|
2
|
+
import type { Context } from '../../types';
|
3
|
+
export type FetchHandleOptions<T extends Context> = {
|
4
|
+
prefix?: HTTPPath;
|
5
|
+
} & (undefined extends T ? {
|
6
|
+
context?: T;
|
7
|
+
} : {
|
8
|
+
context: T;
|
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
|
+
};
|
18
|
+
export interface FetchHandler<T extends Context> {
|
19
|
+
handle: (request: Request, ...rest: FetchHandleRest<T>) => Promise<FetchHandleResult>;
|
20
|
+
}
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|