@orpc/server 0.0.0-next.fd1ee2a → 0.0.0-next.fdd2389

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 (59) hide show
  1. package/README.md +7 -2
  2. package/dist/adapters/aws-lambda/index.d.mts +5 -5
  3. package/dist/adapters/aws-lambda/index.d.ts +5 -5
  4. package/dist/adapters/aws-lambda/index.mjs +4 -3
  5. package/dist/adapters/bun-ws/index.d.mts +5 -5
  6. package/dist/adapters/bun-ws/index.d.ts +5 -5
  7. package/dist/adapters/bun-ws/index.mjs +10 -10
  8. package/dist/adapters/crossws/index.d.mts +5 -5
  9. package/dist/adapters/crossws/index.d.ts +5 -5
  10. package/dist/adapters/crossws/index.mjs +5 -7
  11. package/dist/adapters/fetch/index.d.mts +54 -9
  12. package/dist/adapters/fetch/index.d.ts +54 -9
  13. package/dist/adapters/fetch/index.mjs +74 -4
  14. package/dist/adapters/message-port/index.d.mts +5 -5
  15. package/dist/adapters/message-port/index.d.ts +5 -5
  16. package/dist/adapters/message-port/index.mjs +5 -7
  17. package/dist/adapters/node/index.d.mts +30 -9
  18. package/dist/adapters/node/index.d.ts +30 -9
  19. package/dist/adapters/node/index.mjs +70 -13
  20. package/dist/adapters/standard/index.d.mts +6 -6
  21. package/dist/adapters/standard/index.d.ts +6 -6
  22. package/dist/adapters/standard/index.mjs +2 -2
  23. package/dist/adapters/standard-peer/index.d.mts +9 -5
  24. package/dist/adapters/standard-peer/index.d.ts +9 -5
  25. package/dist/adapters/standard-peer/index.mjs +1 -1
  26. package/dist/adapters/websocket/index.d.mts +9 -7
  27. package/dist/adapters/websocket/index.d.ts +9 -7
  28. package/dist/adapters/websocket/index.mjs +5 -7
  29. package/dist/adapters/ws/index.d.mts +5 -5
  30. package/dist/adapters/ws/index.d.ts +5 -5
  31. package/dist/adapters/ws/index.mjs +5 -7
  32. package/dist/helpers/index.d.mts +149 -0
  33. package/dist/helpers/index.d.ts +149 -0
  34. package/dist/helpers/index.mjs +198 -0
  35. package/dist/hibernation/index.d.mts +11 -11
  36. package/dist/hibernation/index.d.ts +11 -11
  37. package/dist/hibernation/index.mjs +8 -8
  38. package/dist/index.d.mts +6 -6
  39. package/dist/index.d.ts +6 -6
  40. package/dist/index.mjs +9 -6
  41. package/dist/plugins/index.d.mts +20 -4
  42. package/dist/plugins/index.d.ts +20 -4
  43. package/dist/plugins/index.mjs +86 -58
  44. package/dist/shared/{server.wMv480px.d.mts → server.B4BGqy3Y.d.mts} +5 -4
  45. package/dist/shared/{server.wMv480px.d.ts → server.B4BGqy3Y.d.ts} +5 -4
  46. package/dist/shared/{server.CIL9uKTN.mjs → server.Bxx6tqNe.mjs} +64 -39
  47. package/dist/shared/{server.DOwaI1le.d.ts → server.COL12UTb.d.ts} +3 -3
  48. package/dist/shared/{server.Cu-7se50.d.mts → server.CVKCo60T.d.mts} +2 -2
  49. package/dist/shared/{server.a_VzWVCm.d.ts → server.Cb6yD7DZ.d.ts} +1 -1
  50. package/dist/shared/{server.CC8z0B3U.d.mts → server.Ck-gOLzq.d.mts} +3 -3
  51. package/dist/shared/{server.DHgXKx3q.d.mts → server.DBCUJijK.d.mts} +1 -1
  52. package/dist/shared/{server.CNZgPgce.d.ts → server.DNtJ-p60.d.ts} +2 -2
  53. package/dist/shared/{server.DVBSOxWU.d.ts → server.DPIFWpxG.d.ts} +1 -1
  54. package/dist/shared/{server.NeumLVdS.mjs → server.Ds4HPpvH.mjs} +105 -66
  55. package/dist/shared/{server.Cwq7K86l.d.mts → server.DzV1hr3z.d.mts} +1 -1
  56. package/dist/shared/{server.BW-nUGgA.mjs → server.TEVCLCFC.mjs} +3 -0
  57. package/dist/shared/server.UVMTOWrk.mjs +26 -0
  58. package/package.json +19 -11
  59. package/dist/shared/server.C6Q5sqYw.mjs +0 -20
@@ -1,6 +1,7 @@
1
- import { isContractProcedure, ValidationError, mergePrefix, mergeErrorMap, enhanceRoute } from '@orpc/contract';
2
- import { resolveMaybeOptionalOptions, toArray, value, intercept } from '@orpc/shared';
3
- import { fallbackORPCErrorStatus, ORPCError } from '@orpc/client';
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 = {}) {
@@ -87,21 +88,6 @@ function createORPCErrorConstructorMap(errors) {
87
88
  });
88
89
  return proxy;
89
90
  }
90
- async function validateORPCError(map, error) {
91
- const { code, status, message, data, cause, defined } = error;
92
- const config = map?.[error.code];
93
- if (!config || fallbackORPCErrorStatus(error.code, config.status) !== error.status) {
94
- return defined ? new ORPCError(code, { defined: false, status, message, data, cause }) : error;
95
- }
96
- if (!config.data) {
97
- return defined ? error : new ORPCError(code, { defined: true, status, message, data, cause });
98
- }
99
- const validated = await config.data["~standard"].validate(error.data);
100
- if (validated.issues) {
101
- return defined ? new ORPCError(code, { defined: false, status, message, data, cause }) : error;
102
- }
103
- return new ORPCError(code, { defined: true, status, message, data: validated.value, cause });
104
- }
105
91
 
106
92
  function middlewareOutputFn(output) {
107
93
  return { output, context: {} };
@@ -115,27 +101,51 @@ function createProcedureClient(lazyableProcedure, ...rest) {
115
101
  const clientContext = callerOptions?.context ?? {};
116
102
  const context = await value(options.context ?? {}, clientContext);
117
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
+ };
118
110
  try {
119
- return await intercept(
120
- toArray(options.interceptors),
121
- {
122
- context,
123
- input,
124
- // input only optional when it undefinable so we can safely cast it
125
- errors,
126
- path,
127
- procedure,
128
- signal: callerOptions?.signal,
129
- lastEventId: callerOptions?.lastEventId
130
- },
131
- (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
+ }
132
130
  );
133
- } catch (e) {
134
- if (!(e instanceof ORPCError)) {
135
- 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
+ ));
136
145
  }
137
- const validated = await validateORPCError(procedure["~orpc"].errorMap, e);
138
- throw validated;
146
+ return output;
147
+ } catch (e) {
148
+ throw await validateError(e);
139
149
  }
140
150
  };
141
151
  }
@@ -144,31 +154,49 @@ async function validateInput(procedure, input) {
144
154
  if (!schema) {
145
155
  return input;
146
156
  }
147
- const result = await schema["~standard"].validate(input);
148
- if (result.issues) {
149
- throw new ORPCError("BAD_REQUEST", {
150
- message: "Input validation failed",
151
- data: {
152
- issues: result.issues
153
- },
154
- cause: new ValidationError({ message: "Input validation failed", issues: result.issues })
155
- });
156
- }
157
- 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
+ );
158
177
  }
159
178
  async function validateOutput(procedure, output) {
160
179
  const schema = procedure["~orpc"].outputSchema;
161
180
  if (!schema) {
162
181
  return output;
163
182
  }
164
- const result = await schema["~standard"].validate(output);
165
- if (result.issues) {
166
- throw new ORPCError("INTERNAL_SERVER_ERROR", {
167
- message: "Output validation failed",
168
- cause: new ValidationError({ message: "Output validation failed", issues: result.issues })
169
- });
170
- }
171
- 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
+ );
172
200
  }
173
201
  async function executeProcedureInternal(procedure, options) {
174
202
  const middlewares = procedure["~orpc"].middlewares;
@@ -180,17 +208,28 @@ async function executeProcedureInternal(procedure, options) {
180
208
  currentInput = await validateInput(procedure, currentInput);
181
209
  }
182
210
  const mid = middlewares[index];
183
- const output = mid ? (await mid({
184
- ...options,
185
- context,
186
- next: async (...[nextOptions]) => {
187
- const nextContext = nextOptions?.context ?? {};
188
- return {
189
- output: await next(index + 1, mergeCurrentContext(context, nextContext), currentInput),
190
- context: nextContext
191
- };
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;
192
228
  }
193
- }, 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
+ );
194
233
  if (index === outputValidationIndex) {
195
234
  return await validateOutput(procedure, output);
196
235
  }
@@ -367,4 +406,4 @@ function call(procedure, input, ...rest) {
367
406
  return createProcedureClient(procedure, options)(input, options);
368
407
  }
369
408
 
370
- 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 };
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 };
@@ -1,5 +1,5 @@
1
1
  import { ErrorMap, EnhanceRouteOptions, MergedErrorMap, AnyContractRouter, AnyContractProcedure } from '@orpc/contract';
2
- import { a as AnyMiddleware, L as Lazyable, b as AnyRouter, C as Context, c as Lazy, A as AnyProcedure, P as Procedure, M as MergedInitialContext } from './server.wMv480px.mjs';
2
+ import { a as AnyMiddleware, L as Lazyable, b as AnyRouter, C as Context, c as Lazy, A as AnyProcedure, P as Procedure, M as MergedInitialContext } from './server.B4BGqy3Y.mjs';
3
3
 
4
4
  declare function getRouter<T extends Lazyable<AnyRouter | undefined>>(router: T, path: readonly string[]): T extends Lazy<any> ? Lazy<AnyRouter | undefined> : Lazyable<AnyRouter | undefined>;
5
5
  type AccessibleLazyRouter<T extends Lazyable<AnyRouter | undefined>> = T extends Lazy<infer U extends AnyRouter | undefined | Lazy<AnyRouter | undefined>> ? AccessibleLazyRouter<U> : T extends AnyProcedure | undefined ? Lazy<T> : Lazy<T> & {
@@ -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");
@@ -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 };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/server",
3
3
  "type": "module",
4
- "version": "0.0.0-next.fd1ee2a",
4
+ "version": "0.0.0-next.fdd2389",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.unnoq.com",
7
7
  "repository": {
@@ -19,6 +19,11 @@
19
19
  "import": "./dist/index.mjs",
20
20
  "default": "./dist/index.mjs"
21
21
  },
22
+ "./helpers": {
23
+ "types": "./dist/helpers/index.d.mts",
24
+ "import": "./dist/helpers/index.mjs",
25
+ "default": "./dist/helpers/index.mjs"
26
+ },
22
27
  "./plugins": {
23
28
  "types": "./dist/plugins/index.d.mts",
24
29
  "import": "./dist/plugins/index.mjs",
@@ -96,20 +101,23 @@
96
101
  }
97
102
  },
98
103
  "dependencies": {
99
- "@orpc/contract": "0.0.0-next.fd1ee2a",
100
- "@orpc/client": "0.0.0-next.fd1ee2a",
101
- "@orpc/shared": "0.0.0-next.fd1ee2a",
102
- "@orpc/standard-server": "0.0.0-next.fd1ee2a",
103
- "@orpc/standard-server-aws-lambda": "0.0.0-next.fd1ee2a",
104
- "@orpc/standard-server-fetch": "0.0.0-next.fd1ee2a",
105
- "@orpc/standard-server-peer": "0.0.0-next.fd1ee2a",
106
- "@orpc/standard-server-node": "0.0.0-next.fd1ee2a"
104
+ "cookie": "^1.0.2",
105
+ "@orpc/client": "0.0.0-next.fdd2389",
106
+ "@orpc/contract": "0.0.0-next.fdd2389",
107
+ "@orpc/interop": "0.0.0-next.fdd2389",
108
+ "@orpc/shared": "0.0.0-next.fdd2389",
109
+ "@orpc/standard-server-aws-lambda": "0.0.0-next.fdd2389",
110
+ "@orpc/standard-server-node": "0.0.0-next.fdd2389",
111
+ "@orpc/standard-server-peer": "0.0.0-next.fdd2389",
112
+ "@orpc/standard-server-fetch": "0.0.0-next.fdd2389",
113
+ "@orpc/standard-server": "0.0.0-next.fdd2389"
107
114
  },
108
115
  "devDependencies": {
116
+ "@tanstack/router-core": "^1.132.41",
109
117
  "@types/ws": "^8.18.1",
110
118
  "crossws": "^0.4.1",
111
- "next": "^15.4.1",
112
- "supertest": "^7.1.3",
119
+ "next": "^15.5.4",
120
+ "supertest": "^7.1.4",
113
121
  "ws": "^8.18.3"
114
122
  },
115
123
  "scripts": {
@@ -1,20 +0,0 @@
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 { response } = await handler.handle(
14
- { ...request, body: () => Promise.resolve(request.body) },
15
- resolveFriendlyStandardHandleOptions(options)
16
- );
17
- await peer.response(id, response ?? { status: 404, headers: {}, body: "No procedure matched" });
18
- }
19
-
20
- export { handleStandardServerPeerMessage as h };