@orpc/server 2.0.0-beta.35 → 2.0.0-beta.37

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 (43) hide show
  1. package/README.md +29 -20
  2. package/dist/adapters/aws-lambda/index.d.mts +6 -49
  3. package/dist/adapters/aws-lambda/index.d.ts +6 -49
  4. package/dist/adapters/aws-lambda/index.mjs +13 -40
  5. package/dist/adapters/crossws/index.d.mts +2 -2
  6. package/dist/adapters/crossws/index.d.ts +2 -2
  7. package/dist/adapters/crossws/index.mjs +4 -3
  8. package/dist/adapters/fastify/index.d.mts +6 -49
  9. package/dist/adapters/fastify/index.d.ts +6 -49
  10. package/dist/adapters/fastify/index.mjs +13 -40
  11. package/dist/adapters/fetch/index.d.mts +7 -49
  12. package/dist/adapters/fetch/index.d.ts +7 -49
  13. package/dist/adapters/fetch/index.mjs +15 -41
  14. package/dist/adapters/message-port/index.d.mts +3 -3
  15. package/dist/adapters/message-port/index.d.ts +3 -3
  16. package/dist/adapters/message-port/index.mjs +4 -3
  17. package/dist/adapters/node/index.d.mts +7 -50
  18. package/dist/adapters/node/index.d.ts +7 -50
  19. package/dist/adapters/node/index.mjs +13 -40
  20. package/dist/adapters/standard/index.d.mts +91 -17
  21. package/dist/adapters/standard/index.d.ts +91 -17
  22. package/dist/adapters/standard/index.mjs +2 -2
  23. package/dist/adapters/standard-peer/index.d.mts +4 -9
  24. package/dist/adapters/standard-peer/index.d.ts +4 -9
  25. package/dist/adapters/standard-peer/index.mjs +10 -2
  26. package/dist/adapters/websocket/index.d.mts +3 -3
  27. package/dist/adapters/websocket/index.d.ts +3 -3
  28. package/dist/adapters/websocket/index.mjs +4 -3
  29. package/dist/index.mjs +4 -6
  30. package/dist/plugins/index.d.mts +1 -1
  31. package/dist/plugins/index.d.ts +1 -1
  32. package/dist/shared/{server.R0uHWfBo.d.mts → server.B5K1CViq.d.mts} +20 -9
  33. package/dist/shared/{server.BYnwk7Xz.mjs → server.BynNaBBA.mjs} +7 -9
  34. package/dist/shared/{server.sNWd6DAG.mjs → server.C0lFtoHU.mjs} +72 -11
  35. package/dist/shared/{server.CAiLRqPf.d.mts → server.C7xllBNN.d.mts} +1 -1
  36. package/dist/shared/server.CFqSIFnT.d.mts +14 -0
  37. package/dist/shared/{server.DEeCcNd6.d.ts → server.Cxranw-8.d.ts} +20 -9
  38. package/dist/shared/{server.b2-J4t6T.d.ts → server.D0dr-F8u.d.ts} +1 -1
  39. package/dist/shared/server.RRVK1xTV.d.ts +14 -0
  40. package/package.json +10 -10
  41. package/dist/shared/server.BGMO5dst.d.ts +0 -91
  42. package/dist/shared/server.CX4vUnDk.mjs +0 -11
  43. package/dist/shared/server.DcHlvZFK.d.mts +0 -91
@@ -1,59 +1,32 @@
1
1
  export { R as BodyLimitPlugin } from '../../shared/server.1ExWFMze.mjs';
2
- import { sortPlugins, intercept, resolveMaybeOptionalOptions } from '@orpc/shared';
2
+ import { resolveMaybeOptionalOptions } from '@orpc/shared';
3
3
  import { toStandardLazyRequest, sendStandardResponse } from '@standard-server/node';
4
4
  import { r as resolveFriendlyStandardHandlerHandleOptions } from '../../shared/server.W91HSRkE.mjs';
5
- import { R as RPCHandlerCodec, S as StandardHandler } from '../../shared/server.sNWd6DAG.mjs';
5
+ import { R as RPCHandlerCodec, S as StandardHandler } from '../../shared/server.C0lFtoHU.mjs';
6
6
  import '@orpc/client';
7
7
  import '@standard-server/core';
8
8
  import '@standard-server/fetch';
9
9
  import '../../shared/server.Djb_ebJT.mjs';
10
10
  import '@orpc/contract';
11
- import '../../shared/server.BYnwk7Xz.mjs';
12
-
13
- class CompositeNodeHttpHandlerPlugin {
14
- name = "~composite/node-http";
15
- plugins;
16
- constructor(plugins = []) {
17
- this.plugins = sortPlugins(plugins);
18
- }
19
- initNodeHttpHandlerOptions(options) {
20
- for (const plugin of this.plugins) {
21
- if (plugin.initNodeHttpHandlerOptions) {
22
- options = plugin.initNodeHttpHandlerOptions(options);
23
- }
24
- }
25
- return options;
26
- }
27
- }
11
+ import '../../shared/server.BynNaBBA.mjs';
28
12
 
29
13
  class NodeHttpHandler {
30
14
  constructor(standardHandler, options = {}) {
31
15
  this.standardHandler = standardHandler;
32
- options = new CompositeNodeHttpHandlerPlugin(options.plugins).initNodeHttpHandlerOptions(options);
33
- this.nodeHttpInterceptors = options.nodeHttpInterceptors;
34
16
  this.sendStandardResponseOptions = options.sendStandardResponse;
35
17
  }
36
18
  sendStandardResponseOptions;
37
- nodeHttpInterceptors;
38
19
  async handle(request, response, ...rest) {
39
- return intercept(
40
- this.nodeHttpInterceptors,
41
- {
42
- ...resolveFriendlyStandardHandlerHandleOptions(resolveMaybeOptionalOptions(rest)),
43
- request,
44
- response,
45
- sendStandardResponseOptions: this.sendStandardResponseOptions
46
- },
47
- async ({ request: request2, response: response2, sendStandardResponseOptions, ...options }) => {
48
- const standardRequest = toStandardLazyRequest(request2, response2);
49
- const result = await this.standardHandler.handle(standardRequest, options);
50
- if (!result.matched) {
51
- return result;
52
- }
53
- await sendStandardResponse(response2, result.response, sendStandardResponseOptions);
54
- return result;
55
- }
20
+ const standardRequest = toStandardLazyRequest(request, response);
21
+ const result = await this.standardHandler.handle(
22
+ standardRequest,
23
+ resolveFriendlyStandardHandlerHandleOptions(resolveMaybeOptionalOptions(rest))
56
24
  );
25
+ if (!result.matched) {
26
+ return result;
27
+ }
28
+ await sendStandardResponse(response, result.response, this.sendStandardResponseOptions);
29
+ return result;
57
30
  }
58
31
  }
59
32
 
@@ -65,4 +38,4 @@ class RPCHandler extends NodeHttpHandler {
65
38
  }
66
39
  }
67
40
 
68
- export { CompositeNodeHttpHandlerPlugin, NodeHttpHandler, RPCHandler };
41
+ export { NodeHttpHandler, RPCHandler };
@@ -1,19 +1,93 @@
1
- import { c as StandardHandlerHandleOptions } from '../../shared/server.R0uHWfBo.mjs';
2
- export { C as CompositeStandardHandlerPlugin, b as StandardHandler, d as StandardHandlerCodec, e as StandardHandlerCodecResolvedProcedure, h as StandardHandlerHandleResult, i as StandardHandlerInterceptor, g as StandardHandlerInterceptorOptions, a as StandardHandlerOptions, S as StandardHandlerPlugin, j as StandardHandlerRoutingInterceptor, f as StandardHandlerRoutingInterceptorOptions, T as TracingHandlerPlugin } from '../../shared/server.R0uHWfBo.mjs';
3
- export { a as RPCHandlerCodec, R as RPCHandlerCodecOptions, b as RPCMatcher, c as RPCMatcherOptions, d as RPC_DEFAULT_ALLOW_METHODS } from '../../shared/server.DcHlvZFK.mjs';
4
- import { Context } from '../../index.mjs';
5
- import '@orpc/client';
6
- import '@orpc/shared';
7
- import '@standard-server/core';
8
- import '@orpc/contract';
9
- import '../../shared/server.BpmUhems.mjs';
1
+ import { R as ResolvedStandardHandlerHandleOptions, f as StandardHandlerCodec, g as StandardHandlerCodecResolvedProcedure } from '../../shared/server.B5K1CViq.mjs';
2
+ export { C as CompositeStandardHandlerPlugin, S as StandardHandler, a as StandardHandlerHandleOptions, h as StandardHandlerHandleResult, i as StandardHandlerInterceptor, e as StandardHandlerInterceptorOptions, c as StandardHandlerOptions, b as StandardHandlerPlugin, j as StandardHandlerRoutingInterceptor, d as StandardHandlerRoutingInterceptorOptions, T as TracingHandlerPlugin } from '../../shared/server.B5K1CViq.mjs';
3
+ import { RPCSerializer, AnyORPCError } from '@orpc/client';
4
+ import { Value, Public, Promisable } from '@orpc/shared';
5
+ import { StandardMethod, StandardLazyRequest, StandardResponse } from '@standard-server/core';
6
+ import { AnyProcedure, Context } from '../../index.mjs';
7
+ import { AnyRouter } from '../../index.mjs';
8
+ import { AnyProcedureContract } from '@orpc/contract';
9
+ export { F as FriendlyStandardHandlerHandleOptions, r as resolveFriendlyStandardHandlerHandleOptions } from '../../shared/server.CFqSIFnT.mjs';
10
10
 
11
- type FriendlyStandardHandlerHandleOptions<T extends Context> = Omit<StandardHandlerHandleOptions<T>, 'context'> & (object extends T ? {
12
- context?: T;
13
- } : {
14
- context: T;
15
- });
16
- declare function resolveFriendlyStandardHandlerHandleOptions<T extends Context>(options: FriendlyStandardHandlerHandleOptions<T>): StandardHandlerHandleOptions<T>;
11
+ /**
12
+ * Methods that can invoke procedures by default. Browsers cannot trigger them
13
+ * cross-site without a CORS preflight or an HTML form, unlike `GET`, which a plain
14
+ * `<a>` click or redirect can trigger with `SameSite=Lax` cookies attached. Other
15
+ * methods (`HEAD`, `OPTIONS`, `QUERY`, ...) have safe semantics that should not
16
+ * invoke a procedure that can modify data.
17
+ *
18
+ * @see {@link https://orpc.dev/docs/rpc/handler#supported-http-methods | RPC Handler - Supported HTTP Methods}
19
+ */
20
+ declare const RPC_DEFAULT_ALLOW_METHODS: readonly StandardMethod[];
21
+ interface RPCMatcherOptions {
22
+ /**
23
+ * Filter which procedures are exposed for matching. Return `false` to exclude.
24
+ *
25
+ * @default true
26
+ */
27
+ filter?: Value<boolean, [procedure: AnyProcedureContract | AnyProcedure, path: string[]]>;
28
+ /**
29
+ * Restricts which HTTP methods can invoke procedures, either with a list of allowed
30
+ * methods or decided per request via a function. Requests using a disallowed method
31
+ * are treated as unmatched. `GET` is excluded by default because it is exposed to
32
+ * Cross-Site Request Forgery (CSRF) attacks.
33
+ *
34
+ * @default RPC_DEFAULT_ALLOW_METHODS (['POST', 'PUT', 'PATCH', 'DELETE'])
35
+ * @see {@link https://orpc.dev/docs/rpc/handler#supported-http-methods | RPC Handler - Supported HTTP Methods}
36
+ */
37
+ allowMethods?: readonly StandardMethod[] | ((method: StandardMethod, procedure: AnyProcedure, path: string[]) => boolean);
38
+ }
39
+ declare class RPCMatcher {
40
+ private readonly filter;
41
+ private readonly allowMethodsSet;
42
+ private readonly allowMethodsFn;
43
+ private readonly rootRouter;
44
+ private readonly tree;
45
+ private readonly pendingLazyRouters;
46
+ constructor(router: AnyRouter, options?: RPCMatcherOptions);
47
+ private index;
48
+ match(method: StandardMethod, pathname: `/${string}`, prefix: `/${string}` | undefined): Promise<{
49
+ path: string[];
50
+ procedure: AnyProcedure;
51
+ } | undefined>;
52
+ private resolvePendingLazyRouters;
53
+ private loadPendingLazyRouters;
54
+ private loadPendingLazyRouter;
55
+ private indexPendingLazyRouter;
56
+ private resolveProcedure;
57
+ }
17
58
 
18
- export { StandardHandlerHandleOptions, resolveFriendlyStandardHandlerHandleOptions };
19
- export type { FriendlyStandardHandlerHandleOptions };
59
+ interface RPCHandlerCodecOptions<T extends Context> extends RPCMatcherOptions {
60
+ /**
61
+ * Override the default RPC serializer.
62
+ */
63
+ serializer?: Public<RPCSerializer>;
64
+ /**
65
+ * Resolve HTTP status for encoded successful outputs.
66
+ *
67
+ * Value should be in the `2xx` range and must be less than `400`.
68
+ * Return `undefined` or `null` to fallback to default
69
+ *
70
+ * @default DEFAULT_SUCCESS_STATUS (200)
71
+ */
72
+ outputStatus?: Value<number | undefined | null, [output: unknown, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>]>;
73
+ /**
74
+ * Mapping ORPCError Code -> HTTP Status Code
75
+ * The status code should be in the `4xx` or `5xx` range (must be greater than or equal to `400`).
76
+ *
77
+ * @default COMMON_ERROR_STATUS_MAP
78
+ */
79
+ errorStatusMap?: Record<string, number> | undefined;
80
+ }
81
+ declare class RPCHandlerCodec<T extends Context> implements StandardHandlerCodec<T> {
82
+ private readonly matcher;
83
+ private readonly serializer;
84
+ private readonly errorStatusMap;
85
+ private readonly outputStatus;
86
+ constructor(router: AnyRouter, options?: RPCHandlerCodecOptions<T>);
87
+ resolveProcedure(request: StandardLazyRequest, options: ResolvedStandardHandlerHandleOptions<T>): Promise<StandardHandlerCodecResolvedProcedure | undefined>;
88
+ encodeOutput(output: unknown, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
89
+ encodeError(error: AnyORPCError, _procedure: AnyProcedure, _path: string[], _options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
90
+ }
91
+
92
+ export { RPCHandlerCodec, RPCMatcher, RPC_DEFAULT_ALLOW_METHODS, ResolvedStandardHandlerHandleOptions, StandardHandlerCodec, StandardHandlerCodecResolvedProcedure };
93
+ export type { RPCHandlerCodecOptions, RPCMatcherOptions };
@@ -1,19 +1,93 @@
1
- import { c as StandardHandlerHandleOptions } from '../../shared/server.DEeCcNd6.js';
2
- export { C as CompositeStandardHandlerPlugin, b as StandardHandler, d as StandardHandlerCodec, e as StandardHandlerCodecResolvedProcedure, h as StandardHandlerHandleResult, i as StandardHandlerInterceptor, g as StandardHandlerInterceptorOptions, a as StandardHandlerOptions, S as StandardHandlerPlugin, j as StandardHandlerRoutingInterceptor, f as StandardHandlerRoutingInterceptorOptions, T as TracingHandlerPlugin } from '../../shared/server.DEeCcNd6.js';
3
- export { a as RPCHandlerCodec, R as RPCHandlerCodecOptions, b as RPCMatcher, c as RPCMatcherOptions, d as RPC_DEFAULT_ALLOW_METHODS } from '../../shared/server.BGMO5dst.js';
4
- import { Context } from '../../index.js';
5
- import '@orpc/client';
6
- import '@orpc/shared';
7
- import '@standard-server/core';
8
- import '@orpc/contract';
9
- import '../../shared/server.CRwPbhLO.js';
1
+ import { R as ResolvedStandardHandlerHandleOptions, f as StandardHandlerCodec, g as StandardHandlerCodecResolvedProcedure } from '../../shared/server.Cxranw-8.js';
2
+ export { C as CompositeStandardHandlerPlugin, S as StandardHandler, a as StandardHandlerHandleOptions, h as StandardHandlerHandleResult, i as StandardHandlerInterceptor, e as StandardHandlerInterceptorOptions, c as StandardHandlerOptions, b as StandardHandlerPlugin, j as StandardHandlerRoutingInterceptor, d as StandardHandlerRoutingInterceptorOptions, T as TracingHandlerPlugin } from '../../shared/server.Cxranw-8.js';
3
+ import { RPCSerializer, AnyORPCError } from '@orpc/client';
4
+ import { Value, Public, Promisable } from '@orpc/shared';
5
+ import { StandardMethod, StandardLazyRequest, StandardResponse } from '@standard-server/core';
6
+ import { AnyProcedure, Context } from '../../index.js';
7
+ import { AnyRouter } from '../../index.js';
8
+ import { AnyProcedureContract } from '@orpc/contract';
9
+ export { F as FriendlyStandardHandlerHandleOptions, r as resolveFriendlyStandardHandlerHandleOptions } from '../../shared/server.RRVK1xTV.js';
10
10
 
11
- type FriendlyStandardHandlerHandleOptions<T extends Context> = Omit<StandardHandlerHandleOptions<T>, 'context'> & (object extends T ? {
12
- context?: T;
13
- } : {
14
- context: T;
15
- });
16
- declare function resolveFriendlyStandardHandlerHandleOptions<T extends Context>(options: FriendlyStandardHandlerHandleOptions<T>): StandardHandlerHandleOptions<T>;
11
+ /**
12
+ * Methods that can invoke procedures by default. Browsers cannot trigger them
13
+ * cross-site without a CORS preflight or an HTML form, unlike `GET`, which a plain
14
+ * `<a>` click or redirect can trigger with `SameSite=Lax` cookies attached. Other
15
+ * methods (`HEAD`, `OPTIONS`, `QUERY`, ...) have safe semantics that should not
16
+ * invoke a procedure that can modify data.
17
+ *
18
+ * @see {@link https://orpc.dev/docs/rpc/handler#supported-http-methods | RPC Handler - Supported HTTP Methods}
19
+ */
20
+ declare const RPC_DEFAULT_ALLOW_METHODS: readonly StandardMethod[];
21
+ interface RPCMatcherOptions {
22
+ /**
23
+ * Filter which procedures are exposed for matching. Return `false` to exclude.
24
+ *
25
+ * @default true
26
+ */
27
+ filter?: Value<boolean, [procedure: AnyProcedureContract | AnyProcedure, path: string[]]>;
28
+ /**
29
+ * Restricts which HTTP methods can invoke procedures, either with a list of allowed
30
+ * methods or decided per request via a function. Requests using a disallowed method
31
+ * are treated as unmatched. `GET` is excluded by default because it is exposed to
32
+ * Cross-Site Request Forgery (CSRF) attacks.
33
+ *
34
+ * @default RPC_DEFAULT_ALLOW_METHODS (['POST', 'PUT', 'PATCH', 'DELETE'])
35
+ * @see {@link https://orpc.dev/docs/rpc/handler#supported-http-methods | RPC Handler - Supported HTTP Methods}
36
+ */
37
+ allowMethods?: readonly StandardMethod[] | ((method: StandardMethod, procedure: AnyProcedure, path: string[]) => boolean);
38
+ }
39
+ declare class RPCMatcher {
40
+ private readonly filter;
41
+ private readonly allowMethodsSet;
42
+ private readonly allowMethodsFn;
43
+ private readonly rootRouter;
44
+ private readonly tree;
45
+ private readonly pendingLazyRouters;
46
+ constructor(router: AnyRouter, options?: RPCMatcherOptions);
47
+ private index;
48
+ match(method: StandardMethod, pathname: `/${string}`, prefix: `/${string}` | undefined): Promise<{
49
+ path: string[];
50
+ procedure: AnyProcedure;
51
+ } | undefined>;
52
+ private resolvePendingLazyRouters;
53
+ private loadPendingLazyRouters;
54
+ private loadPendingLazyRouter;
55
+ private indexPendingLazyRouter;
56
+ private resolveProcedure;
57
+ }
17
58
 
18
- export { StandardHandlerHandleOptions, resolveFriendlyStandardHandlerHandleOptions };
19
- export type { FriendlyStandardHandlerHandleOptions };
59
+ interface RPCHandlerCodecOptions<T extends Context> extends RPCMatcherOptions {
60
+ /**
61
+ * Override the default RPC serializer.
62
+ */
63
+ serializer?: Public<RPCSerializer>;
64
+ /**
65
+ * Resolve HTTP status for encoded successful outputs.
66
+ *
67
+ * Value should be in the `2xx` range and must be less than `400`.
68
+ * Return `undefined` or `null` to fallback to default
69
+ *
70
+ * @default DEFAULT_SUCCESS_STATUS (200)
71
+ */
72
+ outputStatus?: Value<number | undefined | null, [output: unknown, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>]>;
73
+ /**
74
+ * Mapping ORPCError Code -> HTTP Status Code
75
+ * The status code should be in the `4xx` or `5xx` range (must be greater than or equal to `400`).
76
+ *
77
+ * @default COMMON_ERROR_STATUS_MAP
78
+ */
79
+ errorStatusMap?: Record<string, number> | undefined;
80
+ }
81
+ declare class RPCHandlerCodec<T extends Context> implements StandardHandlerCodec<T> {
82
+ private readonly matcher;
83
+ private readonly serializer;
84
+ private readonly errorStatusMap;
85
+ private readonly outputStatus;
86
+ constructor(router: AnyRouter, options?: RPCHandlerCodecOptions<T>);
87
+ resolveProcedure(request: StandardLazyRequest, options: ResolvedStandardHandlerHandleOptions<T>): Promise<StandardHandlerCodecResolvedProcedure | undefined>;
88
+ encodeOutput(output: unknown, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
89
+ encodeError(error: AnyORPCError, _procedure: AnyProcedure, _path: string[], _options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
90
+ }
91
+
92
+ export { RPCHandlerCodec, RPCMatcher, RPC_DEFAULT_ALLOW_METHODS, ResolvedStandardHandlerHandleOptions, StandardHandlerCodec, StandardHandlerCodecResolvedProcedure };
93
+ export type { RPCHandlerCodecOptions, RPCMatcherOptions };
@@ -1,8 +1,8 @@
1
- export { C as CompositeStandardHandlerPlugin, R as RPCHandlerCodec, a as RPCMatcher, b as RPC_DEFAULT_ALLOW_METHODS, S as StandardHandler, T as TracingHandlerPlugin } from '../../shared/server.sNWd6DAG.mjs';
1
+ export { C as CompositeStandardHandlerPlugin, R as RPCHandlerCodec, a as RPCMatcher, b as RPC_DEFAULT_ALLOW_METHODS, S as StandardHandler, T as TracingHandlerPlugin } from '../../shared/server.C0lFtoHU.mjs';
2
2
  export { r as resolveFriendlyStandardHandlerHandleOptions } from '../../shared/server.W91HSRkE.mjs';
3
3
  import '@orpc/client';
4
4
  import '@orpc/shared';
5
5
  import '@standard-server/core';
6
6
  import '../../shared/server.Djb_ebJT.mjs';
7
7
  import '@orpc/contract';
8
- import '../../shared/server.BYnwk7Xz.mjs';
8
+ import '../../shared/server.BynNaBBA.mjs';
@@ -1,16 +1,11 @@
1
- import { Value, Promisable } from '@orpc/shared';
2
1
  import { StandardLazyRequest, StandardResponse } from '@standard-server/core';
3
2
  import { Context } from '../../index.mjs';
4
- import { StandardHandlerHandleOptions, StandardHandler } from '../standard/index.mjs';
3
+ import { StandardHandler } from '../standard/index.mjs';
4
+ import { FriendlyStandardHandlerHandleOptions } from '../standard/index.mjs';
5
5
  import '@orpc/client';
6
6
  import '@orpc/contract';
7
+ import '@orpc/shared';
7
8
 
8
- type StandardPeerRequestHandlerOptions<T extends Context> = Omit<StandardHandlerHandleOptions<T>, 'context'> & (Record<never, never> extends T ? {
9
- context?: Value<Promisable<T>, [request: StandardLazyRequest]>;
10
- } : {
11
- context: Value<Promisable<T>, [request: StandardLazyRequest]>;
12
- });
13
- declare function createStandardPeerRequestHandler<T extends Context>(handler: StandardHandler<T>, options: StandardPeerRequestHandlerOptions<T>): (request: StandardLazyRequest) => Promise<StandardResponse>;
9
+ declare function createStandardPeerRequestHandler<T extends Context>(handler: StandardHandler<T>, options: FriendlyStandardHandlerHandleOptions<T>): (request: StandardLazyRequest) => Promise<StandardResponse>;
14
10
 
15
11
  export { createStandardPeerRequestHandler };
16
- export type { StandardPeerRequestHandlerOptions };
@@ -1,16 +1,11 @@
1
- import { Value, Promisable } from '@orpc/shared';
2
1
  import { StandardLazyRequest, StandardResponse } from '@standard-server/core';
3
2
  import { Context } from '../../index.js';
4
- import { StandardHandlerHandleOptions, StandardHandler } from '../standard/index.js';
3
+ import { StandardHandler } from '../standard/index.js';
4
+ import { FriendlyStandardHandlerHandleOptions } from '../standard/index.js';
5
5
  import '@orpc/client';
6
6
  import '@orpc/contract';
7
+ import '@orpc/shared';
7
8
 
8
- type StandardPeerRequestHandlerOptions<T extends Context> = Omit<StandardHandlerHandleOptions<T>, 'context'> & (Record<never, never> extends T ? {
9
- context?: Value<Promisable<T>, [request: StandardLazyRequest]>;
10
- } : {
11
- context: Value<Promisable<T>, [request: StandardLazyRequest]>;
12
- });
13
- declare function createStandardPeerRequestHandler<T extends Context>(handler: StandardHandler<T>, options: StandardPeerRequestHandlerOptions<T>): (request: StandardLazyRequest) => Promise<StandardResponse>;
9
+ declare function createStandardPeerRequestHandler<T extends Context>(handler: StandardHandler<T>, options: FriendlyStandardHandlerHandleOptions<T>): (request: StandardLazyRequest) => Promise<StandardResponse>;
14
10
 
15
11
  export { createStandardPeerRequestHandler };
16
- export type { StandardPeerRequestHandlerOptions };
@@ -1,2 +1,10 @@
1
- export { c as createStandardPeerRequestHandler } from '../../shared/server.CX4vUnDk.mjs';
2
- import '@orpc/shared';
1
+ import { r as resolveFriendlyStandardHandlerHandleOptions } from '../../shared/server.W91HSRkE.mjs';
2
+
3
+ function createStandardPeerRequestHandler(handler, options) {
4
+ return async (request) => {
5
+ const { response } = await handler.handle(request, resolveFriendlyStandardHandlerHandleOptions(options));
6
+ return response ?? { status: 404, headers: {}, body: "No procedure matched" };
7
+ };
8
+ }
9
+
10
+ export { createStandardPeerRequestHandler };
@@ -2,7 +2,7 @@ import { Arrayable, MaybeOptionalOptions } from '@orpc/shared';
2
2
  import { EncodePeerMessageOptions, DecodePeerMessageOptions } from '@standard-server/peer';
3
3
  import { Context } from '../../index.mjs';
4
4
  import { StandardHandler, StandardHandlerOptions } from '../standard/index.mjs';
5
- import { StandardPeerRequestHandlerOptions } from '../standard-peer/index.mjs';
5
+ import { FriendlyStandardHandlerHandleOptions } from '../standard/index.mjs';
6
6
  import { Router } from '../../index.mjs';
7
7
  import { RPCHandlerCodecOptions } from '../standard/index.mjs';
8
8
  import '@orpc/client';
@@ -44,7 +44,7 @@ declare class WebSocketHandler<T extends Context> {
44
44
  * @param ws The WebSocket instance. Use the same instance for all messages.
45
45
  * @param data The received message. Binary data should already be loaded (not a `Blob`).
46
46
  */
47
- message(ws: WebSocketLike, data: Arrayable<string | ArrayBuffer | Pick<Uint8Array<ArrayBuffer>, 'buffer' | 'byteOffset' | 'byteLength'>>, ...rest: MaybeOptionalOptions<StandardPeerRequestHandlerOptions<T>>): Promise<{
47
+ message(ws: WebSocketLike, data: Arrayable<string | ArrayBuffer | Pick<Uint8Array<ArrayBuffer>, 'buffer' | 'byteOffset' | 'byteLength'>>, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<{
48
48
  matched: boolean;
49
49
  }>;
50
50
  /**
@@ -58,7 +58,7 @@ declare class WebSocketHandler<T extends Context> {
58
58
  *
59
59
  * Prefer this over calling `.message()` and `.close()` manually.
60
60
  */
61
- upgrade(ws: Pick<WebSocket, 'send' | 'addEventListener' | 'removeEventListener'>, ...rest: MaybeOptionalOptions<StandardPeerRequestHandlerOptions<T>>): void;
61
+ upgrade(ws: Pick<WebSocket, 'send' | 'addEventListener' | 'removeEventListener'>, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): void;
62
62
  }
63
63
 
64
64
  interface RPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T>, RPCHandlerCodecOptions<T>, WebSocketHandlerOptions<T> {
@@ -2,7 +2,7 @@ import { Arrayable, MaybeOptionalOptions } from '@orpc/shared';
2
2
  import { EncodePeerMessageOptions, DecodePeerMessageOptions } from '@standard-server/peer';
3
3
  import { Context } from '../../index.js';
4
4
  import { StandardHandler, StandardHandlerOptions } from '../standard/index.js';
5
- import { StandardPeerRequestHandlerOptions } from '../standard-peer/index.js';
5
+ import { FriendlyStandardHandlerHandleOptions } from '../standard/index.js';
6
6
  import { Router } from '../../index.js';
7
7
  import { RPCHandlerCodecOptions } from '../standard/index.js';
8
8
  import '@orpc/client';
@@ -44,7 +44,7 @@ declare class WebSocketHandler<T extends Context> {
44
44
  * @param ws The WebSocket instance. Use the same instance for all messages.
45
45
  * @param data The received message. Binary data should already be loaded (not a `Blob`).
46
46
  */
47
- message(ws: WebSocketLike, data: Arrayable<string | ArrayBuffer | Pick<Uint8Array<ArrayBuffer>, 'buffer' | 'byteOffset' | 'byteLength'>>, ...rest: MaybeOptionalOptions<StandardPeerRequestHandlerOptions<T>>): Promise<{
47
+ message(ws: WebSocketLike, data: Arrayable<string | ArrayBuffer | Pick<Uint8Array<ArrayBuffer>, 'buffer' | 'byteOffset' | 'byteLength'>>, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<{
48
48
  matched: boolean;
49
49
  }>;
50
50
  /**
@@ -58,7 +58,7 @@ declare class WebSocketHandler<T extends Context> {
58
58
  *
59
59
  * Prefer this over calling `.message()` and `.close()` manually.
60
60
  */
61
- upgrade(ws: Pick<WebSocket, 'send' | 'addEventListener' | 'removeEventListener'>, ...rest: MaybeOptionalOptions<StandardPeerRequestHandlerOptions<T>>): void;
61
+ upgrade(ws: Pick<WebSocket, 'send' | 'addEventListener' | 'removeEventListener'>, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): void;
62
62
  }
63
63
 
64
64
  interface RPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T>, RPCHandlerCodecOptions<T>, WebSocketHandlerOptions<T> {
@@ -1,12 +1,13 @@
1
1
  import { toStringOrBytes, resolveMaybeOptionalOptions, sequential, loadBytes } from '@orpc/shared';
2
2
  import { ServerPeer, encodePeerMessage, decodePeerMessage, isClientPeerSendMessage } from '@standard-server/peer';
3
- import { c as createStandardPeerRequestHandler } from '../../shared/server.CX4vUnDk.mjs';
4
- import { R as RPCHandlerCodec, S as StandardHandler } from '../../shared/server.sNWd6DAG.mjs';
3
+ import { createStandardPeerRequestHandler } from '../standard-peer/index.mjs';
4
+ import { R as RPCHandlerCodec, S as StandardHandler } from '../../shared/server.C0lFtoHU.mjs';
5
+ import '../../shared/server.W91HSRkE.mjs';
5
6
  import '@orpc/client';
6
7
  import '@standard-server/core';
7
8
  import '../../shared/server.Djb_ebJT.mjs';
8
9
  import '@orpc/contract';
9
- import '../../shared/server.BYnwk7Xz.mjs';
10
+ import '../../shared/server.BynNaBBA.mjs';
10
11
 
11
12
  class WebSocketHandler {
12
13
  constructor(handler, options = {}) {
package/dist/index.mjs CHANGED
@@ -5,8 +5,8 @@ export { AsyncIteratorClass, asyncIteratorToStream, asyncIteratorToUnproxiedData
5
5
  import { L as Lazy, P as Procedure, c as createProcedureClient } from './shared/server.Djb_ebJT.mjs';
6
6
  export { u as unlazy } from './shared/server.Djb_ebJT.mjs';
7
7
  import { D as DecoratedProcedure } from './shared/server.24nXyhbl.mjs';
8
- import { b as augmentRouter, d as augmentImplementedRouter, e as withHiddenRouterContract, f as createGuardedProcedureLazy, g as getRouter } from './shared/server.BYnwk7Xz.mjs';
9
- export { a as DEFAULT_ERROR_STATUS, D as DEFAULT_SUCCESS_STATUS, h as call, c as createContractProcedure, i as getHiddenRouterContract, u as unlazyRouter, j as walkProcedureContractsAsync, w as walkProcedureContractsSync } from './shared/server.BYnwk7Xz.mjs';
8
+ import { b as augmentRouter, d as augmentImplementedRouter, e as withHiddenRouterContract, f as createGuardedProcedureLazy, g as getRouter } from './shared/server.BynNaBBA.mjs';
9
+ export { a as DEFAULT_ERROR_STATUS, D as DEFAULT_SUCCESS_STATUS, h as call, c as createContractProcedure, i as getHiddenRouterContract, u as unlazyRouter, j as walkProcedureContractsAsync, w as walkProcedureContractsSync } from './shared/server.BynNaBBA.mjs';
10
10
  import { RECURSIVE_CLIENT_UNWRAP_KEYS } from '@orpc/client';
11
11
  export { COMMON_ERROR_STATUS_MAP, ORPCError, RPCJsonSerializer, RPCSerializer, cloneORPCError, isDefinedError, safe, toORPCError } from '@orpc/client';
12
12
  export { ErrorEvent, getEventMeta, unwrapEvent, withEventMeta } from '@standard-server/core';
@@ -388,13 +388,11 @@ function createRouterImplementerInternal(contract, config, middlewares) {
388
388
  });
389
389
  }
390
390
  const implementer = {};
391
- for (const key in contract) {
392
- const child = contract[key];
391
+ for (const [key, child] of Object.entries(contract)) {
393
392
  implementer[key] = createRouterImplementerInternal(child, config, middlewares);
394
393
  }
395
394
  const shared = bindMethods(SharedRouterImplementer.create(contract, config, middlewares));
396
- for (const key in shared) {
397
- const method = shared[key];
395
+ for (const [key, method] of Object.entries(shared)) {
398
396
  if (key in implementer) {
399
397
  const child = implementer[key];
400
398
  implementer[key] = new Proxy(method, {
@@ -2,7 +2,7 @@ import { Value, Promisable, ThrowableError } from '@orpc/shared';
2
2
  import { StandardLazyRequest, StandardHeaders, StandardMethod } from '@standard-server/core';
3
3
  import { Context } from '../index.mjs';
4
4
  import { StandardHandlerPlugin, StandardHandlerRoutingInterceptorOptions, StandardHandlerOptions, StandardHandlerInterceptorOptions } from '../adapters/standard/index.mjs';
5
- export { R as RequestLimitHandlerPlugin, a as RequestLimitHandlerPluginOptions } from '../shared/server.CAiLRqPf.mjs';
5
+ export { R as RequestLimitHandlerPlugin, a as RequestLimitHandlerPluginOptions } from '../shared/server.C7xllBNN.mjs';
6
6
  import '@orpc/client';
7
7
  import '@orpc/contract';
8
8
 
@@ -2,7 +2,7 @@ import { Value, Promisable, ThrowableError } from '@orpc/shared';
2
2
  import { StandardLazyRequest, StandardHeaders, StandardMethod } from '@standard-server/core';
3
3
  import { Context } from '../index.js';
4
4
  import { StandardHandlerPlugin, StandardHandlerRoutingInterceptorOptions, StandardHandlerOptions, StandardHandlerInterceptorOptions } from '../adapters/standard/index.js';
5
- export { R as RequestLimitHandlerPlugin, a as RequestLimitHandlerPluginOptions } from '../shared/server.b2-J4t6T.js';
5
+ export { R as RequestLimitHandlerPlugin, a as RequestLimitHandlerPluginOptions } from '../shared/server.D0dr-F8u.js';
6
6
  import '@orpc/client';
7
7
  import '@orpc/contract';
8
8
 
@@ -1,5 +1,5 @@
1
1
  import { AnyORPCError } from '@orpc/client';
2
- import { OrderablePlugin, Interceptor, Promisable } from '@orpc/shared';
2
+ import { OrderablePlugin, Value, Promisable, Interceptor } from '@orpc/shared';
3
3
  import { StandardLazyRequest, StandardResponse } from '@standard-server/core';
4
4
  import { C as Context, c as ProcedureClientInterceptor, A as AnyProcedure } from './server.BsujoJoF.mjs';
5
5
  import { Schema, ErrorMap } from '@orpc/contract';
@@ -36,6 +36,17 @@ declare class CompositeStandardHandlerPlugin<T extends Context> implements Stand
36
36
 
37
37
  interface StandardHandlerHandleOptions<T extends Context> {
38
38
  prefix?: `/${string}` | undefined;
39
+ /**
40
+ * The initial context, or a function (sync or async) that receives the request and returns it.
41
+ * The function only runs once the request passes the prefix check.
42
+ */
43
+ context: Value<Promisable<T>, [request: StandardLazyRequest]>;
44
+ }
45
+ /**
46
+ * `StandardHandlerHandleOptions` after the context has been resolved,
47
+ * this is what interceptors and codecs receive.
48
+ */
49
+ interface ResolvedStandardHandlerHandleOptions<T extends Context> extends Omit<StandardHandlerHandleOptions<T>, 'context'> {
39
50
  context: T;
40
51
  }
41
52
  type StandardHandlerHandleResult = {
@@ -45,11 +56,11 @@ type StandardHandlerHandleResult = {
45
56
  matched: false;
46
57
  response?: undefined;
47
58
  };
48
- interface StandardHandlerInterceptorOptions<T extends Context> extends StandardHandlerCodecResolvedProcedure, StandardHandlerHandleOptions<T> {
59
+ interface StandardHandlerInterceptorOptions<T extends Context> extends StandardHandlerCodecResolvedProcedure, ResolvedStandardHandlerHandleOptions<T> {
49
60
  request: StandardLazyRequest;
50
61
  }
51
62
  type StandardHandlerInterceptor<T extends Context> = Interceptor<StandardHandlerInterceptorOptions<T>, Promise<StandardResponse>>;
52
- interface StandardHandlerRoutingInterceptorOptions<T extends Context> extends StandardHandlerHandleOptions<T> {
63
+ interface StandardHandlerRoutingInterceptorOptions<T extends Context> extends ResolvedStandardHandlerHandleOptions<T> {
53
64
  request: StandardLazyRequest;
54
65
  }
55
66
  type StandardHandlerRoutingInterceptor<T extends Context> = Interceptor<StandardHandlerRoutingInterceptorOptions<T>, Promise<StandardHandlerHandleResult>>;
@@ -82,7 +93,7 @@ declare class StandardHandler<T extends Context> {
82
93
  private readonly interceptors;
83
94
  private readonly clientInterceptors;
84
95
  constructor(codec: StandardHandlerCodec<T>, options: StandardHandlerOptions<T>);
85
- handle(request: StandardLazyRequest, { context, prefix }: StandardHandlerHandleOptions<T>): Promise<StandardHandlerHandleResult>;
96
+ handle(request: StandardLazyRequest, options: StandardHandlerHandleOptions<T>): Promise<StandardHandlerHandleResult>;
86
97
  }
87
98
  declare class TracingHandlerPlugin implements StandardHandlerPlugin<any> {
88
99
  name: string;
@@ -95,10 +106,10 @@ interface StandardHandlerCodecResolvedProcedure {
95
106
  decodeInput: () => Promise<unknown>;
96
107
  }
97
108
  interface StandardHandlerCodec<T extends Context> {
98
- resolveProcedure(request: StandardLazyRequest, options: StandardHandlerHandleOptions<T>): Promisable<StandardHandlerCodecResolvedProcedure | undefined>;
99
- encodeOutput(output: unknown, procedure: AnyProcedure, path: string[], options: StandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
100
- encodeError(error: AnyORPCError, procedure: AnyProcedure, path: string[], options: StandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
109
+ resolveProcedure(request: StandardLazyRequest, options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardHandlerCodecResolvedProcedure | undefined>;
110
+ encodeOutput(output: unknown, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
111
+ encodeError(error: AnyORPCError, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
101
112
  }
102
113
 
103
- export { CompositeStandardHandlerPlugin as C, TracingHandlerPlugin as T, StandardHandler as b };
104
- export type { StandardHandlerPlugin as S, StandardHandlerOptions as a, StandardHandlerHandleOptions as c, StandardHandlerCodec as d, StandardHandlerCodecResolvedProcedure as e, StandardHandlerRoutingInterceptorOptions as f, StandardHandlerInterceptorOptions as g, StandardHandlerHandleResult as h, StandardHandlerInterceptor as i, StandardHandlerRoutingInterceptor as j };
114
+ export { CompositeStandardHandlerPlugin as C, StandardHandler as S, TracingHandlerPlugin as T };
115
+ export type { ResolvedStandardHandlerHandleOptions as R, StandardHandlerHandleOptions as a, StandardHandlerPlugin as b, StandardHandlerOptions as c, StandardHandlerRoutingInterceptorOptions as d, StandardHandlerInterceptorOptions as e, StandardHandlerCodec as f, StandardHandlerCodecResolvedProcedure as g, StandardHandlerHandleResult as h, StandardHandlerInterceptor as i, StandardHandlerRoutingInterceptor as j };
@@ -93,8 +93,8 @@ function augmentRouter(router, options) {
93
93
  return router;
94
94
  }
95
95
  const enhanced = {};
96
- for (const key in router) {
97
- enhanced[key] = augmentRouter(router[key], options);
96
+ for (const [key, child] of Object.entries(router)) {
97
+ enhanced[key] = augmentRouter(child, options);
98
98
  }
99
99
  return enhanced;
100
100
  }
@@ -125,8 +125,8 @@ function augmentImplementedRouter(router, options) {
125
125
  return router;
126
126
  }
127
127
  const enhanced = {};
128
- for (const key in router) {
129
- enhanced[key] = augmentImplementedRouter(router[key], options);
128
+ for (const [key, child] of Object.entries(router)) {
129
+ enhanced[key] = augmentImplementedRouter(child, options);
130
130
  }
131
131
  return enhanced;
132
132
  }
@@ -177,8 +177,7 @@ function walkProcedureContractsSyncInternal(router, callback, path, lazyResults)
177
177
  if (!isTypescriptObject(router)) {
178
178
  return;
179
179
  }
180
- for (const key in router) {
181
- const value = router[key];
180
+ for (const [key, value] of Object.entries(router)) {
182
181
  path.push(key);
183
182
  if (value instanceof Lazy) {
184
183
  lazyResults.push({ router: value, path: path.slice() });
@@ -200,8 +199,7 @@ async function walkProcedureContractsAsync(router, callback, path = []) {
200
199
  if (!isTypescriptObject(router)) {
201
200
  return;
202
201
  }
203
- for (const key in router) {
204
- const value = router[key];
202
+ for (const [key, value] of Object.entries(router)) {
205
203
  if (value instanceof Lazy) {
206
204
  const { default: router2 } = await unlazy(value);
207
205
  await walkProcedureContractsAsync(router2, callback, [...path, key]);
@@ -218,7 +216,7 @@ async function unlazyRouter(router) {
218
216
  return router;
219
217
  }
220
218
  const unlazied = {};
221
- for (const key in router) {
219
+ for (const key of Object.keys(router)) {
222
220
  const item = router[key];
223
221
  const { default: unlaziedRouter } = await unlazy(item);
224
222
  unlazied[key] = await unlazyRouter(unlaziedRouter);