@orpc/server 0.0.0-next.75f1e0e → 0.0.0-next.7605f6c

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.
Files changed (64) hide show
  1. package/README.md +127 -15
  2. package/dist/adapters/aws-lambda/index.d.mts +9 -8
  3. package/dist/adapters/aws-lambda/index.d.ts +9 -8
  4. package/dist/adapters/aws-lambda/index.mjs +7 -8
  5. package/dist/adapters/bun-ws/index.d.mts +14 -13
  6. package/dist/adapters/bun-ws/index.d.ts +14 -13
  7. package/dist/adapters/bun-ws/index.mjs +17 -21
  8. package/dist/adapters/crossws/index.d.mts +10 -7
  9. package/dist/adapters/crossws/index.d.ts +10 -7
  10. package/dist/adapters/crossws/index.mjs +12 -18
  11. package/dist/adapters/fastify/index.d.mts +53 -0
  12. package/dist/adapters/fastify/index.d.ts +53 -0
  13. package/dist/adapters/fastify/index.mjs +52 -0
  14. package/dist/adapters/fetch/index.d.mts +57 -11
  15. package/dist/adapters/fetch/index.d.ts +57 -11
  16. package/dist/adapters/fetch/index.mjs +75 -6
  17. package/dist/adapters/message-port/index.d.mts +42 -13
  18. package/dist/adapters/message-port/index.d.ts +42 -13
  19. package/dist/adapters/message-port/index.mjs +34 -20
  20. package/dist/adapters/node/index.d.mts +34 -12
  21. package/dist/adapters/node/index.d.ts +34 -12
  22. package/dist/adapters/node/index.mjs +70 -15
  23. package/dist/adapters/standard/index.d.mts +8 -13
  24. package/dist/adapters/standard/index.d.ts +8 -13
  25. package/dist/adapters/standard/index.mjs +3 -2
  26. package/dist/adapters/standard-peer/index.d.mts +18 -0
  27. package/dist/adapters/standard-peer/index.d.ts +18 -0
  28. package/dist/adapters/standard-peer/index.mjs +21 -0
  29. package/dist/adapters/websocket/index.d.mts +41 -12
  30. package/dist/adapters/websocket/index.d.ts +41 -12
  31. package/dist/adapters/websocket/index.mjs +50 -21
  32. package/dist/adapters/ws/index.d.mts +13 -10
  33. package/dist/adapters/ws/index.d.ts +13 -10
  34. package/dist/adapters/ws/index.mjs +14 -15
  35. package/dist/helpers/index.d.mts +149 -0
  36. package/dist/helpers/index.d.ts +149 -0
  37. package/dist/helpers/index.mjs +198 -0
  38. package/dist/hibernation/index.d.mts +44 -0
  39. package/dist/hibernation/index.d.ts +44 -0
  40. package/dist/hibernation/index.mjs +65 -0
  41. package/dist/index.d.mts +112 -143
  42. package/dist/index.d.ts +112 -143
  43. package/dist/index.mjs +38 -34
  44. package/dist/plugins/index.d.mts +58 -10
  45. package/dist/plugins/index.d.ts +58 -10
  46. package/dist/plugins/index.mjs +134 -59
  47. package/dist/shared/{server.-ACo36I0.d.ts → server.7cEtMB30.d.ts} +3 -3
  48. package/dist/shared/server.B8gYOD5g.d.mts +12 -0
  49. package/dist/shared/{server.Dq8xr7PQ.d.mts → server.BqadksTP.d.mts} +3 -3
  50. package/dist/shared/server.C8_sRzQB.d.mts +42 -0
  51. package/dist/shared/server.ChUyt5-i.d.mts +32 -0
  52. package/dist/shared/server.ChyoA9XY.d.ts +42 -0
  53. package/dist/shared/{server.DG7Tamti.mjs → server.DEBcqOjg.mjs} +127 -76
  54. package/dist/shared/server.EfTOZ2Q7.d.ts +12 -0
  55. package/dist/shared/{server.BW-nUGgA.mjs → server.TEVCLCFC.mjs} +3 -0
  56. package/dist/shared/{server.CHvOkcM3.mjs → server.ZxHCEN1h.mjs} +81 -41
  57. package/dist/shared/{server.DD2C4ujN.d.mts → server.qKsRrdxW.d.mts} +14 -13
  58. package/dist/shared/{server.DD2C4ujN.d.ts → server.qKsRrdxW.d.ts} +14 -13
  59. package/dist/shared/server.yoEB3Fx4.d.ts +32 -0
  60. package/package.json +42 -16
  61. package/dist/shared/server.BPAWobQg.d.ts +0 -12
  62. package/dist/shared/server.Bd52nNaH.d.mts +0 -12
  63. package/dist/shared/server.BliFSTnG.d.mts +0 -10
  64. package/dist/shared/server.IG2MjhrD.d.ts +0 -10
@@ -1,6 +1,7 @@
1
- import { isContractProcedure, ValidationError, mergePrefix, mergeErrorMap, enhanceRoute } from '@orpc/contract';
2
- import { fallbackORPCErrorStatus, ORPCError } from '@orpc/client';
3
- import { value, intercept } from '@orpc/shared';
1
+ import { isContractProcedure, validateORPCError, ValidationError, mergePrefix, mergeErrorMap, enhanceRoute } from '@orpc/contract';
2
+ import { resolveMaybeOptionalOptions, toArray, value, runWithSpan, intercept, isAsyncIteratorObject, overlayProxy, asyncIteratorWithSpan, isTypescriptObject } from '@orpc/shared';
3
+ import { ORPCError, mapEventIterator } from '@orpc/client';
4
+ import { HibernationEventIterator } from '@orpc/standard-server';
4
5
 
5
6
  const LAZY_SYMBOL = Symbol("ORPC_LAZY_SYMBOL");
6
7
  function lazy(loader, meta = {}) {
@@ -71,14 +72,15 @@ function createORPCErrorConstructorMap(errors) {
71
72
  if (typeof code !== "string") {
72
73
  return Reflect.get(target, code);
73
74
  }
74
- const item = (...[options]) => {
75
+ const item = (...rest) => {
76
+ const options = resolveMaybeOptionalOptions(rest);
75
77
  const config = errors[code];
76
78
  return new ORPCError(code, {
77
79
  defined: Boolean(config),
78
80
  status: config?.status,
79
- message: options?.message ?? config?.message,
80
- data: options?.data,
81
- cause: options?.cause
81
+ message: options.message ?? config?.message,
82
+ data: options.data,
83
+ cause: options.cause
82
84
  });
83
85
  };
84
86
  return item;
@@ -86,54 +88,64 @@ function createORPCErrorConstructorMap(errors) {
86
88
  });
87
89
  return proxy;
88
90
  }
89
- async function validateORPCError(map, error) {
90
- const { code, status, message, data, cause, defined } = error;
91
- const config = map?.[error.code];
92
- if (!config || fallbackORPCErrorStatus(error.code, config.status) !== error.status) {
93
- return defined ? new ORPCError(code, { defined: false, status, message, data, cause }) : error;
94
- }
95
- if (!config.data) {
96
- return defined ? error : new ORPCError(code, { defined: true, status, message, data, cause });
97
- }
98
- const validated = await config.data["~standard"].validate(error.data);
99
- if (validated.issues) {
100
- return defined ? new ORPCError(code, { defined: false, status, message, data, cause }) : error;
101
- }
102
- return new ORPCError(code, { defined: true, status, message, data: validated.value, cause });
103
- }
104
91
 
105
92
  function middlewareOutputFn(output) {
106
93
  return { output, context: {} };
107
94
  }
108
95
 
109
- function createProcedureClient(lazyableProcedure, ...[options]) {
96
+ function createProcedureClient(lazyableProcedure, ...rest) {
97
+ const options = resolveMaybeOptionalOptions(rest);
110
98
  return async (...[input, callerOptions]) => {
111
- const path = options?.path ?? [];
99
+ const path = toArray(options.path);
112
100
  const { default: procedure } = await unlazy(lazyableProcedure);
113
101
  const clientContext = callerOptions?.context ?? {};
114
- const context = await value(options?.context ?? {}, clientContext);
102
+ const context = await value(options.context ?? {}, clientContext);
115
103
  const errors = createORPCErrorConstructorMap(procedure["~orpc"].errorMap);
104
+ const validateError = async (e) => {
105
+ if (e instanceof ORPCError) {
106
+ return await validateORPCError(procedure["~orpc"].errorMap, e);
107
+ }
108
+ return e;
109
+ };
116
110
  try {
117
- return await intercept(
118
- options?.interceptors ?? [],
119
- {
120
- context,
121
- input,
122
- // input only optional when it undefinable so we can safely cast it
123
- errors,
124
- path,
125
- procedure,
126
- signal: callerOptions?.signal,
127
- lastEventId: callerOptions?.lastEventId
128
- },
129
- (interceptorOptions) => executeProcedureInternal(interceptorOptions.procedure, interceptorOptions)
111
+ const output = await runWithSpan(
112
+ { name: "call_procedure", signal: callerOptions?.signal },
113
+ (span) => {
114
+ span?.setAttribute("procedure.path", [...path]);
115
+ return intercept(
116
+ toArray(options.interceptors),
117
+ {
118
+ context,
119
+ input,
120
+ // input only optional when it undefinable so we can safely cast it
121
+ errors,
122
+ path,
123
+ procedure,
124
+ signal: callerOptions?.signal,
125
+ lastEventId: callerOptions?.lastEventId
126
+ },
127
+ (interceptorOptions) => executeProcedureInternal(interceptorOptions.procedure, interceptorOptions)
128
+ );
129
+ }
130
130
  );
131
- } catch (e) {
132
- if (!(e instanceof ORPCError)) {
133
- throw e;
131
+ if (isAsyncIteratorObject(output)) {
132
+ if (output instanceof HibernationEventIterator) {
133
+ return output;
134
+ }
135
+ return overlayProxy(output, mapEventIterator(
136
+ asyncIteratorWithSpan(
137
+ { name: "consume_event_iterator_output", signal: callerOptions?.signal },
138
+ output
139
+ ),
140
+ {
141
+ value: (v) => v,
142
+ error: (e) => validateError(e)
143
+ }
144
+ ));
134
145
  }
135
- const validated = await validateORPCError(procedure["~orpc"].errorMap, e);
136
- throw validated;
146
+ return output;
147
+ } catch (e) {
148
+ throw await validateError(e);
137
149
  }
138
150
  };
139
151
  }
@@ -142,31 +154,49 @@ async function validateInput(procedure, input) {
142
154
  if (!schema) {
143
155
  return input;
144
156
  }
145
- const result = await schema["~standard"].validate(input);
146
- if (result.issues) {
147
- throw new ORPCError("BAD_REQUEST", {
148
- message: "Input validation failed",
149
- data: {
150
- issues: result.issues
151
- },
152
- cause: new ValidationError({ message: "Input validation failed", issues: result.issues })
153
- });
154
- }
155
- return result.value;
157
+ return runWithSpan(
158
+ { name: "validate_input" },
159
+ async () => {
160
+ const result = await schema["~standard"].validate(input);
161
+ if (result.issues) {
162
+ throw new ORPCError("BAD_REQUEST", {
163
+ message: "Input validation failed",
164
+ data: {
165
+ issues: result.issues
166
+ },
167
+ cause: new ValidationError({
168
+ message: "Input validation failed",
169
+ issues: result.issues,
170
+ data: input
171
+ })
172
+ });
173
+ }
174
+ return result.value;
175
+ }
176
+ );
156
177
  }
157
178
  async function validateOutput(procedure, output) {
158
179
  const schema = procedure["~orpc"].outputSchema;
159
180
  if (!schema) {
160
181
  return output;
161
182
  }
162
- const result = await schema["~standard"].validate(output);
163
- if (result.issues) {
164
- throw new ORPCError("INTERNAL_SERVER_ERROR", {
165
- message: "Output validation failed",
166
- cause: new ValidationError({ message: "Output validation failed", issues: result.issues })
167
- });
168
- }
169
- return result.value;
183
+ return runWithSpan(
184
+ { name: "validate_output" },
185
+ async () => {
186
+ const result = await schema["~standard"].validate(output);
187
+ if (result.issues) {
188
+ throw new ORPCError("INTERNAL_SERVER_ERROR", {
189
+ message: "Output validation failed",
190
+ cause: new ValidationError({
191
+ message: "Output validation failed",
192
+ issues: result.issues,
193
+ data: output
194
+ })
195
+ });
196
+ }
197
+ return result.value;
198
+ }
199
+ );
170
200
  }
171
201
  async function executeProcedureInternal(procedure, options) {
172
202
  const middlewares = procedure["~orpc"].middlewares;
@@ -178,17 +208,28 @@ async function executeProcedureInternal(procedure, options) {
178
208
  currentInput = await validateInput(procedure, currentInput);
179
209
  }
180
210
  const mid = middlewares[index];
181
- const output = mid ? (await mid({
182
- ...options,
183
- context,
184
- next: async (...[nextOptions]) => {
185
- const nextContext = nextOptions?.context ?? {};
186
- return {
187
- output: await next(index + 1, mergeCurrentContext(context, nextContext), currentInput),
188
- context: nextContext
189
- };
211
+ const output = mid ? await runWithSpan(
212
+ { name: `middleware.${mid.name}`, signal: options.signal },
213
+ async (span) => {
214
+ span?.setAttribute("middleware.index", index);
215
+ span?.setAttribute("middleware.name", mid.name);
216
+ const result = await mid({
217
+ ...options,
218
+ context,
219
+ next: async (...[nextOptions]) => {
220
+ const nextContext = nextOptions?.context ?? {};
221
+ return {
222
+ output: await next(index + 1, mergeCurrentContext(context, nextContext), currentInput),
223
+ context: nextContext
224
+ };
225
+ }
226
+ }, currentInput, middlewareOutputFn);
227
+ return result.output;
190
228
  }
191
- }, currentInput, middlewareOutputFn)).output : await procedure["~orpc"].handler({ ...options, context, input: currentInput });
229
+ ) : await runWithSpan(
230
+ { name: "handler", signal: options.signal },
231
+ () => procedure["~orpc"].handler({ ...options, context, input: currentInput })
232
+ );
192
233
  if (index === outputValidationIndex) {
193
234
  return await validateOutput(procedure, output);
194
235
  }
@@ -222,6 +263,9 @@ function getRouter(router, path) {
222
263
  if (isProcedure(current)) {
223
264
  return void 0;
224
265
  }
266
+ if (!isTypescriptObject(current)) {
267
+ return void 0;
268
+ }
225
269
  if (!isLazy(current)) {
226
270
  current = current[segment];
227
271
  continue;
@@ -276,6 +320,9 @@ function enhanceRouter(router, options) {
276
320
  });
277
321
  return enhanced2;
278
322
  }
323
+ if (typeof router !== "object" || router === null) {
324
+ return router;
325
+ }
279
326
  const enhanced = {};
280
327
  for (const key in router) {
281
328
  enhanced[key] = enhanceRouter(router[key], options);
@@ -284,7 +331,7 @@ function enhanceRouter(router, options) {
284
331
  }
285
332
  function traverseContractProcedures(options, callback, lazyOptions = []) {
286
333
  let currentRouter = options.router;
287
- const hiddenContract = getHiddenRouterContract(options.router);
334
+ const hiddenContract = isTypescriptObject(options.router) ? getHiddenRouterContract(options.router) : void 0;
288
335
  if (hiddenContract !== void 0) {
289
336
  currentRouter = hiddenContract;
290
337
  }
@@ -298,7 +345,7 @@ function traverseContractProcedures(options, callback, lazyOptions = []) {
298
345
  contract: currentRouter,
299
346
  path: options.path
300
347
  });
301
- } else {
348
+ } else if (typeof currentRouter === "object" && currentRouter !== null) {
302
349
  for (const key in currentRouter) {
303
350
  traverseContractProcedures(
304
351
  {
@@ -329,6 +376,9 @@ async function unlazyRouter(router) {
329
376
  if (isProcedure(router)) {
330
377
  return router;
331
378
  }
379
+ if (typeof router !== "object" || router === null) {
380
+ return router;
381
+ }
332
382
  const unlazied = {};
333
383
  for (const key in router) {
334
384
  const item = router[key];
@@ -361,7 +411,8 @@ function createContractedProcedure(procedure, contract) {
361
411
  });
362
412
  }
363
413
  function call(procedure, input, ...rest) {
364
- return createProcedureClient(procedure, ...rest)(input);
414
+ const options = resolveMaybeOptionalOptions(rest);
415
+ return createProcedureClient(procedure, options)(input, options);
365
416
  }
366
417
 
367
- export { LAZY_SYMBOL as L, Procedure as P, createContractedProcedure as a, addMiddleware as b, createProcedureClient as c, isLazy as d, enhanceRouter as e, createAssertedLazyProcedure as f, getRouter as g, createORPCErrorConstructorMap as h, isProcedure as i, getLazyMeta as j, middlewareOutputFn as k, lazy as l, mergeCurrentContext as m, isStartWithMiddlewares as n, mergeMiddlewares as o, call as p, getHiddenRouterContract as q, createAccessibleLazyRouter as r, setHiddenRouterContract as s, traverseContractProcedures as t, unlazy as u, validateORPCError as v, resolveContractProcedures as w, unlazyRouter as x };
418
+ export { LAZY_SYMBOL as L, Procedure as P, createContractedProcedure as a, addMiddleware as b, createProcedureClient as c, isLazy as d, enhanceRouter as e, createAssertedLazyProcedure as f, getRouter as g, createORPCErrorConstructorMap as h, isProcedure as i, getLazyMeta as j, middlewareOutputFn as k, lazy as l, mergeCurrentContext as m, isStartWithMiddlewares as n, mergeMiddlewares as o, call as p, getHiddenRouterContract as q, createAccessibleLazyRouter as r, setHiddenRouterContract as s, traverseContractProcedures as t, unlazy as u, resolveContractProcedures as v, unlazyRouter as w };
@@ -0,0 +1,12 @@
1
+ import { C as Context } from './server.qKsRrdxW.js';
2
+ import { b as StandardHandleOptions } from './server.7cEtMB30.js';
3
+
4
+ type FriendlyStandardHandleOptions<T extends Context> = Omit<StandardHandleOptions<T>, 'context'> & (Record<never, never> extends T ? {
5
+ context?: T;
6
+ } : {
7
+ context: T;
8
+ });
9
+ declare function resolveFriendlyStandardHandleOptions<T extends Context>(options: FriendlyStandardHandleOptions<T>): StandardHandleOptions<T>;
10
+
11
+ export { resolveFriendlyStandardHandleOptions as r };
12
+ export type { FriendlyStandardHandleOptions as F };
@@ -3,6 +3,9 @@ import { ORPCError, fallbackContractConfig } from '@orpc/contract';
3
3
  const STRICT_GET_METHOD_PLUGIN_IS_GET_METHOD_CONTEXT_SYMBOL = Symbol("STRICT_GET_METHOD_PLUGIN_IS_GET_METHOD_CONTEXT");
4
4
  class StrictGetMethodPlugin {
5
5
  error;
6
+ /**
7
+ * make sure execute before batch plugin to get real method
8
+ */
6
9
  order = 7e6;
7
10
  constructor(options = {}) {
8
11
  this.error = options.error ?? new ORPCError("METHOD_NOT_SUPPORTED");
@@ -1,8 +1,8 @@
1
1
  import { toHttpPath, StandardRPCJsonSerializer, StandardRPCSerializer } from '@orpc/client/standard';
2
2
  import { ORPCError, toORPCError } from '@orpc/client';
3
- import { toArray, intercept, parseEmptyableJSON, NullProtoObj } from '@orpc/shared';
3
+ import { toArray, intercept, runWithSpan, ORPC_NAME, isAsyncIteratorObject, asyncIteratorWithSpan, setSpanError, parseEmptyableJSON, NullProtoObj, value } from '@orpc/shared';
4
4
  import { flattenHeader } from '@orpc/standard-server';
5
- import { c as createProcedureClient, t as traverseContractProcedures, i as isProcedure, u as unlazy, g as getRouter, a as createContractedProcedure } from './server.DG7Tamti.mjs';
5
+ import { c as createProcedureClient, t as traverseContractProcedures, i as isProcedure, u as unlazy, g as getRouter, a as createContractedProcedure } from './server.DEBcqOjg.mjs';
6
6
 
7
7
  class CompositeStandardHandlerPlugin {
8
8
  plugins;
@@ -39,49 +39,74 @@ class StandardHandler {
39
39
  this.rootInterceptors,
40
40
  { ...options, request, prefix },
41
41
  async (interceptorOptions) => {
42
- let isDecoding = false;
43
- try {
44
- return await intercept(
45
- this.interceptors,
46
- interceptorOptions,
47
- async ({ request: request2, context, prefix: prefix2 }) => {
48
- const method = request2.method;
49
- const url = request2.url;
50
- const pathname = prefix2 ? url.pathname.replace(prefix2, "") : url.pathname;
51
- const match = await this.matcher.match(method, `/${pathname.replace(/^\/|\/$/g, "")}`);
52
- if (!match) {
53
- return { matched: false, response: void 0 };
42
+ return runWithSpan(
43
+ { name: `${request.method} ${request.url.pathname}` },
44
+ async (span) => {
45
+ let step;
46
+ try {
47
+ return await intercept(
48
+ this.interceptors,
49
+ interceptorOptions,
50
+ async ({ request: request2, context, prefix: prefix2 }) => {
51
+ const method = request2.method;
52
+ const url = request2.url;
53
+ const pathname = prefix2 ? url.pathname.replace(prefix2, "") : url.pathname;
54
+ const match = await runWithSpan(
55
+ { name: "find_procedure" },
56
+ () => this.matcher.match(method, `/${pathname.replace(/^\/|\/$/g, "")}`)
57
+ );
58
+ if (!match) {
59
+ return { matched: false, response: void 0 };
60
+ }
61
+ span?.updateName(`${ORPC_NAME}.${match.path.join("/")}`);
62
+ span?.setAttribute("rpc.system", ORPC_NAME);
63
+ span?.setAttribute("rpc.method", match.path.join("."));
64
+ step = "decode_input";
65
+ let input = await runWithSpan(
66
+ { name: "decode_input" },
67
+ () => this.codec.decode(request2, match.params, match.procedure)
68
+ );
69
+ step = void 0;
70
+ if (isAsyncIteratorObject(input)) {
71
+ input = asyncIteratorWithSpan(
72
+ { name: "consume_event_iterator_input", signal: request2.signal },
73
+ input
74
+ );
75
+ }
76
+ const client = createProcedureClient(match.procedure, {
77
+ context,
78
+ path: match.path,
79
+ interceptors: this.clientInterceptors
80
+ });
81
+ step = "call_procedure";
82
+ const output = await client(input, {
83
+ signal: request2.signal,
84
+ lastEventId: flattenHeader(request2.headers["last-event-id"])
85
+ });
86
+ step = void 0;
87
+ const response = this.codec.encode(output, match.procedure);
88
+ return {
89
+ matched: true,
90
+ response
91
+ };
92
+ }
93
+ );
94
+ } catch (e) {
95
+ if (step !== "call_procedure") {
96
+ setSpanError(span, e);
54
97
  }
55
- const client = createProcedureClient(match.procedure, {
56
- context,
57
- path: match.path,
58
- interceptors: this.clientInterceptors
59
- });
60
- isDecoding = true;
61
- const input = await this.codec.decode(request2, match.params, match.procedure);
62
- isDecoding = false;
63
- const output = await client(input, {
64
- signal: request2.signal,
65
- lastEventId: flattenHeader(request2.headers["last-event-id"])
66
- });
67
- const response = this.codec.encode(output, match.procedure);
98
+ const error = step === "decode_input" && !(e instanceof ORPCError) ? new ORPCError("BAD_REQUEST", {
99
+ message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
100
+ cause: e
101
+ }) : toORPCError(e);
102
+ const response = this.codec.encodeError(error);
68
103
  return {
69
104
  matched: true,
70
105
  response
71
106
  };
72
107
  }
73
- );
74
- } catch (e) {
75
- const error = isDecoding && !(e instanceof ORPCError) ? new ORPCError("BAD_REQUEST", {
76
- message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
77
- cause: e
78
- }) : toORPCError(e);
79
- const response = this.codec.encodeError(error);
80
- return {
81
- matched: true,
82
- response
83
- };
84
- }
108
+ }
109
+ );
85
110
  }
86
111
  );
87
112
  }
@@ -96,6 +121,13 @@ class StandardRPCCodec {
96
121
  return this.serializer.deserialize(serialized);
97
122
  }
98
123
  encode(output, _procedure) {
124
+ if (output instanceof ReadableStream) {
125
+ return {
126
+ status: 200,
127
+ headers: {},
128
+ body: output
129
+ };
130
+ }
99
131
  return {
100
132
  status: 200,
101
133
  headers: {},
@@ -112,10 +144,18 @@ class StandardRPCCodec {
112
144
  }
113
145
 
114
146
  class StandardRPCMatcher {
147
+ filter;
115
148
  tree = new NullProtoObj();
116
149
  pendingRouters = [];
150
+ constructor(options = {}) {
151
+ this.filter = options.filter ?? true;
152
+ }
117
153
  init(router, path = []) {
118
- const laziedOptions = traverseContractProcedures({ router, path }, ({ path: path2, contract }) => {
154
+ const laziedOptions = traverseContractProcedures({ router, path }, (traverseOptions) => {
155
+ if (!value(this.filter, traverseOptions)) {
156
+ return;
157
+ }
158
+ const { path: path2, contract } = traverseOptions;
119
159
  const httpPath = toHttpPath(path2);
120
160
  if (isProcedure(contract)) {
121
161
  this.tree[httpPath] = {
@@ -177,7 +217,7 @@ class StandardRPCHandler extends StandardHandler {
177
217
  constructor(router, options = {}) {
178
218
  const jsonSerializer = new StandardRPCJsonSerializer(options);
179
219
  const serializer = new StandardRPCSerializer(jsonSerializer);
180
- const matcher = new StandardRPCMatcher();
220
+ const matcher = new StandardRPCMatcher(options);
181
221
  const codec = new StandardRPCCodec(serializer);
182
222
  super(router, matcher, codec, options);
183
223
  }
@@ -13,7 +13,6 @@ type ORPCErrorConstructorMap<T extends ErrorMap> = {
13
13
  [K in keyof T]: K extends ORPCErrorCode ? T[K] extends ErrorMapItem<infer UInputSchema> ? ORPCErrorConstructorMapItem<K, InferSchemaInput<UInputSchema>> : never : never;
14
14
  };
15
15
  declare function createORPCErrorConstructorMap<T extends ErrorMap>(errors: T): ORPCErrorConstructorMap<T>;
16
- declare function validateORPCError(map: ErrorMap, error: ORPCError<any, any>): Promise<ORPCError<string, unknown>>;
17
16
 
18
17
  declare const LAZY_SYMBOL: unique symbol;
19
18
  interface LazyMeta {
@@ -29,7 +28,9 @@ interface Lazy<T> {
29
28
  }
30
29
  type Lazyable<T> = T | Lazy<T>;
31
30
  /**
32
- * Create a lazy thing.
31
+ * Creates a lazy-loaded item.
32
+ *
33
+ * @warning The `prefix` in `meta` only holds metadata and does not apply the prefix to the lazy router, use `os.prefix(...).lazy(...)` instead.
33
34
  */
34
35
  declare function lazy<T>(loader: () => Promise<{
35
36
  default: T;
@@ -62,7 +63,7 @@ interface ProcedureDef<TInitialContext extends Context, TCurrentContext extends
62
63
  /**
63
64
  * This class represents a procedure.
64
65
  *
65
- * @see {@link https://orpc.unnoq.com/docs/procedure Procedure Docs}
66
+ * @see {@link https://orpc.dev/docs/procedure Procedure Docs}
66
67
  */
67
68
  declare class Procedure<TInitialContext extends Context, TCurrentContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta> {
68
69
  /**
@@ -101,7 +102,7 @@ interface MiddlewareOptions<TInContext extends Context, TOutput, TErrorConstruct
101
102
  /**
102
103
  * A function that represents a middleware.
103
104
  *
104
- * @see {@link https://orpc.unnoq.com/docs/middleware Middleware Docs}
105
+ * @see {@link https://orpc.dev/docs/middleware Middleware Docs}
105
106
  */
106
107
  interface Middleware<TInContext extends Context, TOutContext extends Context, TInput, TOutput, TErrorConstructorMap extends ORPCErrorConstructorMap<any>, TMeta extends Meta> {
107
108
  (options: MiddlewareOptions<TInContext, TOutput, TErrorConstructorMap, TMeta>, input: TInput, output: MiddlewareOutputFn<TOutput>): Promisable<MiddlewareResult<TOutContext, TOutput>>;
@@ -136,15 +137,15 @@ type CreateProcedureClientOptions<TInitialContext extends Context, TOutputSchema
136
137
  /**
137
138
  * Create Server-side client from a procedure.
138
139
  *
139
- * @see {@link https://orpc.unnoq.com/docs/client/server-side Server-side Client Docs}
140
+ * @see {@link https://orpc.dev/docs/client/server-side Server-side Client Docs}
140
141
  */
141
- declare function createProcedureClient<TInitialContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta, TClientContext extends ClientContext>(lazyableProcedure: Lazyable<Procedure<TInitialContext, any, TInputSchema, TOutputSchema, TErrorMap, TMeta>>, ...[options]: MaybeOptionalOptions<CreateProcedureClientOptions<TInitialContext, TOutputSchema, TErrorMap, TMeta, TClientContext>>): ProcedureClient<TClientContext, TInputSchema, TOutputSchema, TErrorMap>;
142
+ declare function createProcedureClient<TInitialContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta, TClientContext extends ClientContext>(lazyableProcedure: Lazyable<Procedure<TInitialContext, any, TInputSchema, TOutputSchema, TErrorMap, TMeta>>, ...rest: MaybeOptionalOptions<CreateProcedureClientOptions<TInitialContext, TOutputSchema, TErrorMap, TMeta, TClientContext>>): ProcedureClient<TClientContext, TInputSchema, TOutputSchema, TErrorMap>;
142
143
 
143
144
  /**
144
145
  * Represents a router, which defines a hierarchical structure of procedures.
145
146
  *
146
147
  * @info A procedure is a router too.
147
- * @see {@link https://orpc.unnoq.com/docs/contract-first/define-contract#contract-router Contract Router Docs}
148
+ * @see {@link https://orpc.dev/docs/contract-first/define-contract#contract-router Contract Router Docs}
148
149
  */
149
150
  type Router<T extends AnyContractRouter, TInitialContext extends Context> = T extends ContractProcedure<infer UInputSchema, infer UOutputSchema, infer UErrorMap, infer UMeta> ? Procedure<TInitialContext, any, UInputSchema, UOutputSchema, UErrorMap, UMeta> : {
150
151
  [K in keyof T]: T[K] extends AnyContractRouter ? Lazyable<Router<T[K], TInitialContext>> : never;
@@ -155,7 +156,7 @@ type InferRouterInitialContext<T extends AnyRouter> = T extends Router<any, infe
155
156
  * Infer all initial context of the router.
156
157
  *
157
158
  * @info A procedure is a router too.
158
- * @see {@link https://orpc.unnoq.com/docs/router#utilities Router Utilities Docs}
159
+ * @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
159
160
  */
160
161
  type InferRouterInitialContexts<T extends AnyRouter> = T extends Procedure<infer UInitialContext, any, any, any, any, any> ? UInitialContext : {
161
162
  [K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterInitialContexts<U> : never;
@@ -164,7 +165,7 @@ type InferRouterInitialContexts<T extends AnyRouter> = T extends Procedure<infer
164
165
  * Infer all current context of the router.
165
166
  *
166
167
  * @info A procedure is a router too.
167
- * @see {@link https://orpc.unnoq.com/docs/router#utilities Router Utilities Docs}
168
+ * @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
168
169
  */
169
170
  type InferRouterCurrentContexts<T extends AnyRouter> = T extends Procedure<any, infer UCurrentContext, any, any, any, any> ? UCurrentContext : {
170
171
  [K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterCurrentContexts<U> : never;
@@ -173,7 +174,7 @@ type InferRouterCurrentContexts<T extends AnyRouter> = T extends Procedure<any,
173
174
  * Infer all router inputs
174
175
  *
175
176
  * @info A procedure is a router too.
176
- * @see {@link https://orpc.unnoq.com/docs/router#utilities Router Utilities Docs}
177
+ * @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
177
178
  */
178
179
  type InferRouterInputs<T extends AnyRouter> = T extends Procedure<any, any, infer UInputSchema, any, any, any> ? InferSchemaInput<UInputSchema> : {
179
180
  [K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterInputs<U> : never;
@@ -182,11 +183,11 @@ type InferRouterInputs<T extends AnyRouter> = T extends Procedure<any, any, infe
182
183
  * Infer all router outputs
183
184
  *
184
185
  * @info A procedure is a router too.
185
- * @see {@link https://orpc.unnoq.com/docs/router#utilities Router Utilities Docs}
186
+ * @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
186
187
  */
187
188
  type InferRouterOutputs<T extends AnyRouter> = T extends Procedure<any, any, any, infer UOutputSchema, any, any> ? InferSchemaOutput<UOutputSchema> : {
188
189
  [K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterOutputs<U> : never;
189
190
  };
190
191
 
191
- export { isProcedure as E, createProcedureClient as G, Procedure as P, createORPCErrorConstructorMap as l, mergeCurrentContext as m, LAZY_SYMBOL as n, lazy as p, isLazy as q, getLazyMeta as r, unlazy as u, validateORPCError as v, middlewareOutputFn as z };
192
- export type { AnyMiddleware as A, ProcedureHandlerOptions as B, Context as C, ProcedureDef as D, ProcedureClientInterceptorOptions as F, InferRouterInitialContexts as H, InferRouterInitialContext as I, InferRouterCurrentContexts as J, InferRouterInputs as K, Lazyable as L, Middleware as M, InferRouterOutputs as N, ORPCErrorConstructorMap as O, Router as R, MergedInitialContext as a, MergedCurrentContext as b, MapInputMiddleware as c, CreateProcedureClientOptions as d, ProcedureClient as e, AnyRouter as f, Lazy as g, AnyProcedure as h, ProcedureHandler as i, ORPCErrorConstructorMapItemOptions as j, ORPCErrorConstructorMapItem as k, LazyMeta as o, MiddlewareResult as s, MiddlewareNextFnOptions as t, MiddlewareNextFn as w, MiddlewareOutputFn as x, MiddlewareOptions as y };
192
+ export { isProcedure as E, createProcedureClient as F, Procedure as P, mergeCurrentContext as m, createORPCErrorConstructorMap as n, LAZY_SYMBOL as o, lazy as q, isLazy as r, getLazyMeta as s, unlazy as u, middlewareOutputFn as z };
193
+ export type { AnyProcedure as A, ProcedureHandlerOptions as B, Context as C, ProcedureDef as D, InferRouterInitialContexts as G, InferRouterCurrentContexts as H, InferRouterInitialContext as I, InferRouterInputs as J, InferRouterOutputs as K, Lazyable as L, MergedInitialContext as M, ORPCErrorConstructorMap as O, Router as R, AnyMiddleware as a, AnyRouter as b, Lazy as c, ProcedureClientInterceptorOptions as d, Middleware as e, MergedCurrentContext as f, MapInputMiddleware as g, CreateProcedureClientOptions as h, ProcedureClient as i, ProcedureHandler as j, ORPCErrorConstructorMapItemOptions as k, ORPCErrorConstructorMapItem as l, LazyMeta as p, MiddlewareResult as t, MiddlewareNextFnOptions as v, MiddlewareNextFn as w, MiddlewareOutputFn as x, MiddlewareOptions as y };