@orpc/server 0.0.0-next.ba53a01 → 0.0.0-next.ba7984f

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 (75) hide show
  1. package/README.md +42 -31
  2. package/dist/adapters/aws-lambda/index.d.mts +46 -0
  3. package/dist/adapters/aws-lambda/index.d.ts +46 -0
  4. package/dist/adapters/aws-lambda/index.mjs +42 -0
  5. package/dist/adapters/bun-ws/index.d.mts +36 -0
  6. package/dist/adapters/bun-ws/index.d.ts +36 -0
  7. package/dist/adapters/bun-ws/index.mjs +47 -0
  8. package/dist/adapters/crossws/index.d.mts +33 -0
  9. package/dist/adapters/crossws/index.d.ts +33 -0
  10. package/dist/adapters/crossws/index.mjs +45 -0
  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 +54 -0
  14. package/dist/adapters/fetch/index.d.mts +107 -11
  15. package/dist/adapters/fetch/index.d.ts +107 -11
  16. package/dist/adapters/fetch/index.mjs +179 -8
  17. package/dist/adapters/message-port/index.d.mts +57 -0
  18. package/dist/adapters/message-port/index.d.ts +57 -0
  19. package/dist/adapters/message-port/index.mjs +55 -0
  20. package/dist/adapters/node/index.d.mts +85 -22
  21. package/dist/adapters/node/index.d.ts +85 -22
  22. package/dist/adapters/node/index.mjs +144 -24
  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 +5 -3
  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 +7 -0
  29. package/dist/adapters/websocket/index.d.mts +56 -0
  30. package/dist/adapters/websocket/index.d.ts +56 -0
  31. package/dist/adapters/websocket/index.mjs +67 -0
  32. package/dist/adapters/ws/index.d.mts +31 -0
  33. package/dist/adapters/ws/index.d.ts +31 -0
  34. package/dist/adapters/ws/index.mjs +37 -0
  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 +611 -86
  42. package/dist/index.d.ts +611 -86
  43. package/dist/index.mjs +167 -21
  44. package/dist/plugins/index.d.mts +190 -17
  45. package/dist/plugins/index.d.ts +190 -17
  46. package/dist/plugins/index.mjs +240 -15
  47. package/dist/shared/server.7cEtMB30.d.ts +74 -0
  48. package/dist/shared/server.B8gYOD5g.d.mts +12 -0
  49. package/dist/shared/server.BqadksTP.d.mts +74 -0
  50. package/dist/shared/server.Bxx6tqNe.mjs +219 -0
  51. package/dist/shared/server.C8_sRzQB.d.mts +42 -0
  52. package/dist/shared/server.ChUyt5-i.d.mts +32 -0
  53. package/dist/shared/server.ChyoA9XY.d.ts +42 -0
  54. package/dist/shared/server.DZ5BIITo.mjs +9 -0
  55. package/dist/shared/{server.B_5ZADvP.mjs → server.Ds4HPpvH.mjs} +129 -83
  56. package/dist/shared/server.EfTOZ2Q7.d.ts +12 -0
  57. package/dist/shared/server.TEVCLCFC.mjs +39 -0
  58. package/dist/shared/server.UVMTOWrk.mjs +26 -0
  59. package/dist/shared/{server.BYTulgUc.d.mts → server.qKsRrdxW.d.mts} +66 -17
  60. package/dist/shared/{server.BYTulgUc.d.ts → server.qKsRrdxW.d.ts} +66 -17
  61. package/dist/shared/server.yoEB3Fx4.d.ts +32 -0
  62. package/package.json +82 -23
  63. package/dist/adapters/hono/index.d.mts +0 -21
  64. package/dist/adapters/hono/index.d.ts +0 -21
  65. package/dist/adapters/hono/index.mjs +0 -32
  66. package/dist/adapters/next/index.d.mts +0 -28
  67. package/dist/adapters/next/index.d.ts +0 -28
  68. package/dist/adapters/next/index.mjs +0 -29
  69. package/dist/shared/server.B3Tm0IXY.d.ts +0 -75
  70. package/dist/shared/server.BeJithK4.d.mts +0 -75
  71. package/dist/shared/server.Bz_xNBjz.d.mts +0 -8
  72. package/dist/shared/server.D1vPuPwc.mjs +0 -29
  73. package/dist/shared/server.DisswUB5.mjs +0 -158
  74. package/dist/shared/server.EhgR_5_I.d.ts +0 -8
  75. package/dist/shared/server.Q6ZmnTgO.mjs +0 -12
@@ -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, toError } from '@orpc/shared';
1
+ import { isContractProcedure, validateORPCError, ValidationError, mergePrefix, mergeErrorMap, enhanceRoute } from '@orpc/contract';
2
+ import { resolveMaybeOptionalOptions, toArray, value, runWithSpan, intercept, isAsyncIteratorObject, overlayProxy, asyncIteratorWithSpan } 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 = {}) {
@@ -46,6 +47,9 @@ function addMiddleware(middlewares, addition) {
46
47
  }
47
48
 
48
49
  class Procedure {
50
+ /**
51
+ * This property holds the defined options.
52
+ */
49
53
  "~orpc";
50
54
  constructor(def) {
51
55
  this["~orpc"] = def;
@@ -58,20 +62,25 @@ function isProcedure(item) {
58
62
  return isContractProcedure(item) && "middlewares" in item["~orpc"] && "inputValidationIndex" in item["~orpc"] && "outputValidationIndex" in item["~orpc"] && "handler" in item["~orpc"];
59
63
  }
60
64
 
65
+ function mergeCurrentContext(context, other) {
66
+ return { ...context, ...other };
67
+ }
68
+
61
69
  function createORPCErrorConstructorMap(errors) {
62
70
  const proxy = new Proxy(errors, {
63
71
  get(target, code) {
64
72
  if (typeof code !== "string") {
65
73
  return Reflect.get(target, code);
66
74
  }
67
- const item = (...[options]) => {
75
+ const item = (...rest) => {
76
+ const options = resolveMaybeOptionalOptions(rest);
68
77
  const config = errors[code];
69
78
  return new ORPCError(code, {
70
79
  defined: Boolean(config),
71
80
  status: config?.status,
72
- message: options?.message ?? config?.message,
73
- data: options?.data,
74
- cause: options?.cause
81
+ message: options.message ?? config?.message,
82
+ data: options.data,
83
+ cause: options.cause
75
84
  });
76
85
  };
77
86
  return item;
@@ -79,54 +88,64 @@ function createORPCErrorConstructorMap(errors) {
79
88
  });
80
89
  return proxy;
81
90
  }
82
- async function validateORPCError(map, error) {
83
- const { code, status, message, data, cause, defined } = error;
84
- const config = map?.[error.code];
85
- if (!config || fallbackORPCErrorStatus(error.code, config.status) !== error.status) {
86
- return defined ? new ORPCError(code, { defined: false, status, message, data, cause }) : error;
87
- }
88
- if (!config.data) {
89
- return defined ? error : new ORPCError(code, { defined: true, status, message, data, cause });
90
- }
91
- const validated = await config.data["~standard"].validate(error.data);
92
- if (validated.issues) {
93
- return defined ? new ORPCError(code, { defined: false, status, message, data, cause }) : error;
94
- }
95
- return new ORPCError(code, { defined: true, status, message, data: validated.value, cause });
96
- }
97
91
 
98
92
  function middlewareOutputFn(output) {
99
93
  return { output, context: {} };
100
94
  }
101
95
 
102
- function createProcedureClient(lazyableProcedure, ...[options]) {
96
+ function createProcedureClient(lazyableProcedure, ...rest) {
97
+ const options = resolveMaybeOptionalOptions(rest);
103
98
  return async (...[input, callerOptions]) => {
104
- const path = options?.path ?? [];
99
+ const path = toArray(options.path);
105
100
  const { default: procedure } = await unlazy(lazyableProcedure);
106
101
  const clientContext = callerOptions?.context ?? {};
107
- const context = await value(options?.context ?? {}, clientContext);
102
+ const context = await value(options.context ?? {}, clientContext);
108
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
+ };
109
110
  try {
110
- return await intercept(
111
- options?.interceptors ?? [],
112
- {
113
- context,
114
- input,
115
- // input only optional when it undefinable so we can safely cast it
116
- errors,
117
- path,
118
- procedure,
119
- signal: callerOptions?.signal,
120
- lastEventId: callerOptions?.lastEventId
121
- },
122
- (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
+ }
123
130
  );
124
- } catch (e) {
125
- if (!(e instanceof ORPCError)) {
126
- throw toError(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
+ ));
127
145
  }
128
- const validated = await validateORPCError(procedure["~orpc"].errorMap, e);
129
- throw validated;
146
+ return output;
147
+ } catch (e) {
148
+ throw await validateError(e);
130
149
  }
131
150
  };
132
151
  }
@@ -135,58 +154,88 @@ async function validateInput(procedure, input) {
135
154
  if (!schema) {
136
155
  return input;
137
156
  }
138
- const result = await schema["~standard"].validate(input);
139
- if (result.issues) {
140
- throw new ORPCError("BAD_REQUEST", {
141
- message: "Input validation failed",
142
- data: {
143
- issues: result.issues
144
- },
145
- cause: new ValidationError({ message: "Input validation failed", issues: result.issues })
146
- });
147
- }
148
- 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
+ );
149
177
  }
150
178
  async function validateOutput(procedure, output) {
151
179
  const schema = procedure["~orpc"].outputSchema;
152
180
  if (!schema) {
153
181
  return output;
154
182
  }
155
- const result = await schema["~standard"].validate(output);
156
- if (result.issues) {
157
- throw new ORPCError("INTERNAL_SERVER_ERROR", {
158
- message: "Output validation failed",
159
- cause: new ValidationError({ message: "Output validation failed", issues: result.issues })
160
- });
161
- }
162
- 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
+ );
163
200
  }
164
201
  async function executeProcedureInternal(procedure, options) {
165
202
  const middlewares = procedure["~orpc"].middlewares;
166
203
  const inputValidationIndex = Math.min(Math.max(0, procedure["~orpc"].inputValidationIndex), middlewares.length);
167
204
  const outputValidationIndex = Math.min(Math.max(0, procedure["~orpc"].outputValidationIndex), middlewares.length);
168
- let currentIndex = 0;
169
- let currentContext = options.context;
170
- let currentInput = options.input;
171
- const next = async (...[nextOptions]) => {
172
- const index = currentIndex;
173
- currentIndex += 1;
174
- currentContext = { ...currentContext, ...nextOptions?.context };
205
+ const next = async (index, context, input) => {
206
+ let currentInput = input;
175
207
  if (index === inputValidationIndex) {
176
208
  currentInput = await validateInput(procedure, currentInput);
177
209
  }
178
210
  const mid = middlewares[index];
179
- const result = mid ? await mid({ ...options, context: currentContext, next }, currentInput, middlewareOutputFn) : { output: await procedure["~orpc"].handler({ ...options, context: currentContext, input: currentInput }), context: currentContext };
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;
228
+ }
229
+ ) : await runWithSpan(
230
+ { name: "handler", signal: options.signal },
231
+ () => procedure["~orpc"].handler({ ...options, context, input: currentInput })
232
+ );
180
233
  if (index === outputValidationIndex) {
181
- const validatedOutput = await validateOutput(procedure, result.output);
182
- return {
183
- ...result,
184
- output: validatedOutput
185
- };
234
+ return await validateOutput(procedure, output);
186
235
  }
187
- return result;
236
+ return output;
188
237
  };
189
- return (await next({})).output;
238
+ return next(0, options.context, options.input);
190
239
  }
191
240
 
192
241
  const HIDDEN_ROUTER_CONTRACT_SYMBOL = Symbol("ORPC_HIDDEN_ROUTER_CONTRACT");
@@ -353,11 +402,8 @@ function createContractedProcedure(procedure, contract) {
353
402
  });
354
403
  }
355
404
  function call(procedure, input, ...rest) {
356
- return createProcedureClient(procedure, ...rest)(input);
357
- }
358
-
359
- function toHttpPath(path) {
360
- return `/${path.map(encodeURIComponent).join("/")}`;
405
+ const options = resolveMaybeOptionalOptions(rest);
406
+ return createProcedureClient(procedure, options)(input, options);
361
407
  }
362
408
 
363
- export { LAZY_SYMBOL as L, Procedure as P, toHttpPath as a, createContractedProcedure as b, createProcedureClient as c, addMiddleware as d, enhanceRouter as e, isLazy as f, getRouter as g, createAssertedLazyProcedure as h, isProcedure as i, createORPCErrorConstructorMap as j, getLazyMeta as k, lazy as l, middlewareOutputFn 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 };
409
+ 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 };
@@ -0,0 +1,39 @@
1
+ import { ORPCError, fallbackContractConfig } from '@orpc/contract';
2
+
3
+ const STRICT_GET_METHOD_PLUGIN_IS_GET_METHOD_CONTEXT_SYMBOL = Symbol("STRICT_GET_METHOD_PLUGIN_IS_GET_METHOD_CONTEXT");
4
+ class StrictGetMethodPlugin {
5
+ error;
6
+ /**
7
+ * make sure execute before batch plugin to get real method
8
+ */
9
+ order = 7e6;
10
+ constructor(options = {}) {
11
+ this.error = options.error ?? new ORPCError("METHOD_NOT_SUPPORTED");
12
+ }
13
+ init(options) {
14
+ options.rootInterceptors ??= [];
15
+ options.clientInterceptors ??= [];
16
+ options.rootInterceptors.unshift((options2) => {
17
+ const isGetMethod = options2.request.method === "GET";
18
+ return options2.next({
19
+ ...options2,
20
+ context: {
21
+ ...options2.context,
22
+ [STRICT_GET_METHOD_PLUGIN_IS_GET_METHOD_CONTEXT_SYMBOL]: isGetMethod
23
+ }
24
+ });
25
+ });
26
+ options.clientInterceptors.unshift((options2) => {
27
+ if (typeof options2.context[STRICT_GET_METHOD_PLUGIN_IS_GET_METHOD_CONTEXT_SYMBOL] !== "boolean") {
28
+ throw new TypeError("[StrictGetMethodPlugin] strict GET method context has been corrupted or modified by another plugin or interceptor");
29
+ }
30
+ const procedureMethod = fallbackContractConfig("defaultMethod", options2.procedure["~orpc"].route.method);
31
+ if (options2.context[STRICT_GET_METHOD_PLUGIN_IS_GET_METHOD_CONTEXT_SYMBOL] && procedureMethod !== "GET") {
32
+ throw this.error;
33
+ }
34
+ return options2.next();
35
+ });
36
+ }
37
+ }
38
+
39
+ export { StrictGetMethodPlugin as S };
@@ -0,0 +1,26 @@
1
+ import '@orpc/client';
2
+ import '@orpc/shared';
3
+ import '@orpc/standard-server';
4
+ import '@orpc/contract';
5
+ import '@orpc/client/standard';
6
+ import { r as resolveFriendlyStandardHandleOptions } from './server.DZ5BIITo.mjs';
7
+
8
+ async function handleStandardServerPeerMessage(handler, peer, message, options) {
9
+ const [id, request] = await peer.message(message);
10
+ if (!request) {
11
+ return;
12
+ }
13
+ const handle = createServerPeerHandleRequestFn(handler, options);
14
+ await peer.response(id, await handle(request));
15
+ }
16
+ function createServerPeerHandleRequestFn(handler, options) {
17
+ return async (request) => {
18
+ const { response } = await handler.handle(
19
+ { ...request, body: () => Promise.resolve(request.body) },
20
+ resolveFriendlyStandardHandleOptions(options)
21
+ );
22
+ return response ?? { status: 404, headers: {}, body: "No procedure matched" };
23
+ };
24
+ }
25
+
26
+ export { createServerPeerHandleRequestFn as c, handleStandardServerPeerMessage as h };
@@ -1,12 +1,11 @@
1
- import { ORPCErrorCode, ORPCErrorOptions, ORPCError, ClientContext, Client } from '@orpc/client';
2
- import { MaybeOptionalOptions, Promisable, Interceptor, Value } from '@orpc/shared';
3
- import { ErrorMap, ErrorMapItem, InferSchemaInput, HTTPPath, AnySchema, Meta, ContractProcedureDef, InferSchemaOutput, ErrorFromErrorMap, AnyContractRouter, ContractProcedure } from '@orpc/contract';
1
+ import { ORPCErrorCode, ORPCErrorOptions, ORPCError, HTTPPath, ClientContext, Client } from '@orpc/client';
2
+ import { ErrorMap, ErrorMapItem, InferSchemaInput, AnySchema, Meta, ContractProcedureDef, InferSchemaOutput, ErrorFromErrorMap, AnyContractRouter, ContractProcedure } from '@orpc/contract';
3
+ import { MaybeOptionalOptions, Promisable, Interceptor, PromiseWithError, Value } from '@orpc/shared';
4
4
 
5
- type Context = Record<string, any>;
5
+ type Context = Record<PropertyKey, any>;
6
6
  type MergedInitialContext<TInitial extends Context, TAdditional extends Context, TCurrent extends Context> = TInitial & Omit<TAdditional, keyof TCurrent>;
7
7
  type MergedCurrentContext<T extends Context, U extends Context> = Omit<T, keyof U> & U;
8
8
  declare function mergeCurrentContext<T extends Context, U extends Context>(context: T, other: U): MergedCurrentContext<T, U>;
9
- type ContextExtendsGuard<T extends Context, U extends Context> = T extends U ? unknown : never;
10
9
 
11
10
  type ORPCErrorConstructorMapItemOptions<TData> = Omit<ORPCErrorOptions<TData>, 'defined' | 'status'>;
12
11
  type ORPCErrorConstructorMapItem<TCode extends ORPCErrorCode, TInData> = (...rest: MaybeOptionalOptions<ORPCErrorConstructorMapItemOptions<TInData>>) => ORPCError<TCode, TInData>;
@@ -14,7 +13,6 @@ type ORPCErrorConstructorMap<T extends ErrorMap> = {
14
13
  [K in keyof T]: K extends ORPCErrorCode ? T[K] extends ErrorMapItem<infer UInputSchema> ? ORPCErrorConstructorMapItem<K, InferSchemaInput<UInputSchema>> : never : never;
15
14
  };
16
15
  declare function createORPCErrorConstructorMap<T extends ErrorMap>(errors: T): ORPCErrorConstructorMap<T>;
17
- declare function validateORPCError(map: ErrorMap, error: ORPCError<any, any>): Promise<ORPCError<string, unknown>>;
18
16
 
19
17
  declare const LAZY_SYMBOL: unique symbol;
20
18
  interface LazyMeta {
@@ -29,6 +27,11 @@ interface Lazy<T> {
29
27
  };
30
28
  }
31
29
  type Lazyable<T> = T | Lazy<T>;
30
+ /**
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.
34
+ */
32
35
  declare function lazy<T>(loader: () => Promise<{
33
36
  default: T;
34
37
  }>, meta?: LazyMeta): Lazy<T>;
@@ -57,7 +60,15 @@ interface ProcedureDef<TInitialContext extends Context, TCurrentContext extends
57
60
  outputValidationIndex: number;
58
61
  handler: ProcedureHandler<TCurrentContext, any, any, any, any>;
59
62
  }
63
+ /**
64
+ * This class represents a procedure.
65
+ *
66
+ * @see {@link https://orpc.dev/docs/procedure Procedure Docs}
67
+ */
60
68
  declare class Procedure<TInitialContext extends Context, TCurrentContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta> {
69
+ /**
70
+ * This property holds the defined options.
71
+ */
61
72
  '~orpc': ProcedureDef<TInitialContext, TCurrentContext, TInputSchema, TOutputSchema, TErrorMap, TMeta>;
62
73
  constructor(def: ProcedureDef<TInitialContext, TCurrentContext, TInputSchema, TOutputSchema, TErrorMap, TMeta>);
63
74
  }
@@ -88,6 +99,11 @@ interface MiddlewareOptions<TInContext extends Context, TOutput, TErrorConstruct
88
99
  next: MiddlewareNextFn<TOutput>;
89
100
  errors: TErrorConstructorMap;
90
101
  }
102
+ /**
103
+ * A function that represents a middleware.
104
+ *
105
+ * @see {@link https://orpc.dev/docs/middleware Middleware Docs}
106
+ */
91
107
  interface Middleware<TInContext extends Context, TOutContext extends Context, TInput, TOutput, TErrorConstructorMap extends ORPCErrorConstructorMap<any>, TMeta extends Meta> {
92
108
  (options: MiddlewareOptions<TInContext, TOutput, TErrorConstructorMap, TMeta>, input: TInput, output: MiddlewareOutputFn<TOutput>): Promisable<MiddlewareResult<TOutContext, TOutput>>;
93
109
  }
@@ -98,47 +114,80 @@ interface MapInputMiddleware<TInput, TMappedInput> {
98
114
  declare function middlewareOutputFn<TOutput>(output: TOutput): MiddlewareResult<Record<never, never>, TOutput>;
99
115
 
100
116
  type ProcedureClient<TClientContext extends ClientContext, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap> = Client<TClientContext, InferSchemaInput<TInputSchema>, InferSchemaOutput<TOutputSchema>, ErrorFromErrorMap<TErrorMap>>;
101
- interface ProcedureClientInterceptorOptions<TInitialContext extends Context, TInputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta> {
117
+ interface ProcedureClientInterceptorOptions<TInitialContext extends Context, TErrorMap extends ErrorMap, TMeta extends Meta> {
102
118
  context: TInitialContext;
103
- input: InferSchemaInput<TInputSchema>;
119
+ input: unknown;
104
120
  errors: ORPCErrorConstructorMap<TErrorMap>;
105
121
  path: readonly string[];
106
122
  procedure: Procedure<Context, Context, AnySchema, AnySchema, ErrorMap, TMeta>;
107
123
  signal?: AbortSignal;
108
124
  lastEventId: string | undefined;
109
125
  }
110
- /**
111
- * Options for creating a procedure caller with comprehensive type safety
112
- */
113
- type CreateProcedureClientOptions<TInitialContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta, TClientContext extends ClientContext> = {
126
+ type CreateProcedureClientOptions<TInitialContext extends Context, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta, TClientContext extends ClientContext> = {
114
127
  /**
115
128
  * This is helpful for logging and analytics.
116
129
  */
117
130
  path?: readonly string[];
118
- interceptors?: Interceptor<ProcedureClientInterceptorOptions<TInitialContext, TInputSchema, TErrorMap, TMeta>, InferSchemaOutput<TOutputSchema>, ErrorFromErrorMap<TErrorMap>>[];
131
+ interceptors?: Interceptor<ProcedureClientInterceptorOptions<TInitialContext, TErrorMap, TMeta>, PromiseWithError<InferSchemaOutput<TOutputSchema>, ErrorFromErrorMap<TErrorMap>>>[];
119
132
  } & (Record<never, never> extends TInitialContext ? {
120
- context?: Value<TInitialContext, [clientContext: TClientContext]>;
133
+ context?: Value<Promisable<TInitialContext>, [clientContext: TClientContext]>;
121
134
  } : {
122
- context: Value<TInitialContext, [clientContext: TClientContext]>;
135
+ context: Value<Promisable<TInitialContext>, [clientContext: TClientContext]>;
123
136
  });
124
- 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, TInputSchema, TOutputSchema, TErrorMap, TMeta, TClientContext>>): ProcedureClient<TClientContext, TInputSchema, TOutputSchema, TErrorMap>;
137
+ /**
138
+ * Create Server-side client from a procedure.
139
+ *
140
+ * @see {@link https://orpc.dev/docs/client/server-side Server-side Client Docs}
141
+ */
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>;
125
143
 
144
+ /**
145
+ * Represents a router, which defines a hierarchical structure of procedures.
146
+ *
147
+ * @info A procedure is a router too.
148
+ * @see {@link https://orpc.dev/docs/contract-first/define-contract#contract-router Contract Router Docs}
149
+ */
126
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> : {
127
151
  [K in keyof T]: T[K] extends AnyContractRouter ? Lazyable<Router<T[K], TInitialContext>> : never;
128
152
  };
129
153
  type AnyRouter = Router<any, any>;
130
154
  type InferRouterInitialContext<T extends AnyRouter> = T extends Router<any, infer UInitialContext> ? UInitialContext : never;
155
+ /**
156
+ * Infer all initial context of the router.
157
+ *
158
+ * @info A procedure is a router too.
159
+ * @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
160
+ */
131
161
  type InferRouterInitialContexts<T extends AnyRouter> = T extends Procedure<infer UInitialContext, any, any, any, any, any> ? UInitialContext : {
132
162
  [K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterInitialContexts<U> : never;
133
163
  };
164
+ /**
165
+ * Infer all current context of the router.
166
+ *
167
+ * @info A procedure is a router too.
168
+ * @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
169
+ */
134
170
  type InferRouterCurrentContexts<T extends AnyRouter> = T extends Procedure<any, infer UCurrentContext, any, any, any, any> ? UCurrentContext : {
135
171
  [K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterCurrentContexts<U> : never;
136
172
  };
173
+ /**
174
+ * Infer all router inputs
175
+ *
176
+ * @info A procedure is a router too.
177
+ * @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
178
+ */
137
179
  type InferRouterInputs<T extends AnyRouter> = T extends Procedure<any, any, infer UInputSchema, any, any, any> ? InferSchemaInput<UInputSchema> : {
138
180
  [K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterInputs<U> : never;
139
181
  };
182
+ /**
183
+ * Infer all router outputs
184
+ *
185
+ * @info A procedure is a router too.
186
+ * @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
187
+ */
140
188
  type InferRouterOutputs<T extends AnyRouter> = T extends Procedure<any, any, any, infer UOutputSchema, any, any> ? InferSchemaOutput<UOutputSchema> : {
141
189
  [K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterOutputs<U> : never;
142
190
  };
143
191
 
144
- export { type AnyProcedure as A, type MiddlewareOptions as B, type Context as C, middlewareOutputFn as D, type ProcedureHandlerOptions as E, type ProcedureDef as F, isProcedure as G, createProcedureClient as H, type InferRouterInitialContext as I, type InferRouterInitialContexts as J, type InferRouterCurrentContexts as K, type Lazyable as L, type Middleware as M, type InferRouterInputs as N, type ORPCErrorConstructorMap as O, type ProcedureClientInterceptorOptions as P, type InferRouterOutputs as Q, type Router as R, type AnyRouter as a, Procedure as b, type ContextExtendsGuard as c, type MergedCurrentContext as d, type MergedInitialContext as e, type MapInputMiddleware as f, type CreateProcedureClientOptions as g, type ProcedureClient as h, type AnyMiddleware as i, type Lazy as j, type ProcedureHandler as k, type ORPCErrorConstructorMapItemOptions as l, mergeCurrentContext as m, type ORPCErrorConstructorMapItem as n, createORPCErrorConstructorMap as o, LAZY_SYMBOL as p, type LazyMeta as q, lazy as r, isLazy as s, getLazyMeta as t, unlazy as u, validateORPCError as v, type MiddlewareResult as w, type MiddlewareNextFnOptions as x, type MiddlewareNextFn as y, type MiddlewareOutputFn as z };
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 };