@orpc/server 1.14.5 → 2.0.0-beta.1

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 (78) hide show
  1. package/README.md +75 -136
  2. package/dist/adapters/crossws/index.d.mts +42 -21
  3. package/dist/adapters/crossws/index.d.ts +42 -21
  4. package/dist/adapters/crossws/index.mjs +37 -18
  5. package/dist/adapters/fetch/index.d.mts +83 -67
  6. package/dist/adapters/fetch/index.d.ts +83 -67
  7. package/dist/adapters/fetch/index.mjs +131 -106
  8. package/dist/adapters/message-port/index.d.mts +51 -34
  9. package/dist/adapters/message-port/index.d.ts +51 -34
  10. package/dist/adapters/message-port/index.mjs +73 -38
  11. package/dist/adapters/node/index.d.mts +82 -60
  12. package/dist/adapters/node/index.d.ts +82 -60
  13. package/dist/adapters/node/index.mjs +127 -98
  14. package/dist/adapters/standard/index.d.mts +16 -18
  15. package/dist/adapters/standard/index.d.ts +16 -18
  16. package/dist/adapters/standard/index.mjs +5 -5
  17. package/dist/adapters/standard-peer/index.d.mts +12 -14
  18. package/dist/adapters/standard-peer/index.d.ts +12 -14
  19. package/dist/adapters/standard-peer/index.mjs +2 -21
  20. package/dist/adapters/websocket/index.d.mts +39 -34
  21. package/dist/adapters/websocket/index.d.ts +39 -34
  22. package/dist/adapters/websocket/index.mjs +42 -33
  23. package/dist/extensions/callable.d.mts +10 -0
  24. package/dist/extensions/callable.d.ts +10 -0
  25. package/dist/extensions/callable.mjs +11 -0
  26. package/dist/helpers/index.d.mts +2 -2
  27. package/dist/helpers/index.d.ts +2 -2
  28. package/dist/helpers/index.mjs +1 -1
  29. package/dist/index.d.mts +163 -770
  30. package/dist/index.d.ts +163 -770
  31. package/dist/index.mjs +296 -403
  32. package/dist/plugins/index.d.mts +105 -143
  33. package/dist/plugins/index.d.ts +105 -143
  34. package/dist/plugins/index.mjs +232 -255
  35. package/dist/shared/server.BB_Ik9Ph.d.mts +104 -0
  36. package/dist/shared/server.BL22TloH.d.mts +184 -0
  37. package/dist/shared/server.BL22TloH.d.ts +184 -0
  38. package/dist/shared/server.B_U9y00a.d.mts +66 -0
  39. package/dist/shared/server.BsNNjG5J.d.mts +61 -0
  40. package/dist/shared/server.BwHnWUuN.mjs +222 -0
  41. package/dist/shared/server.CX4vUnDk.mjs +11 -0
  42. package/dist/shared/server.CjOb6ItT.mjs +41 -0
  43. package/dist/shared/server.CrlKQucM.mjs +233 -0
  44. package/dist/shared/server.D_QauotT.mjs +30 -0
  45. package/dist/shared/server.EOHJ3NJr.d.ts +104 -0
  46. package/dist/shared/server.GDpX6Df8.mjs +271 -0
  47. package/dist/shared/server.Pa0F03f_.d.ts +61 -0
  48. package/dist/shared/server.T9F3bzZx.d.ts +66 -0
  49. package/dist/shared/{server.DZ5BIITo.mjs → server.W91HSRkE.mjs} +2 -2
  50. package/package.json +26 -55
  51. package/dist/adapters/aws-lambda/index.d.mts +0 -46
  52. package/dist/adapters/aws-lambda/index.d.ts +0 -46
  53. package/dist/adapters/aws-lambda/index.mjs +0 -40
  54. package/dist/adapters/bun-ws/index.d.mts +0 -36
  55. package/dist/adapters/bun-ws/index.d.ts +0 -36
  56. package/dist/adapters/bun-ws/index.mjs +0 -47
  57. package/dist/adapters/fastify/index.d.mts +0 -53
  58. package/dist/adapters/fastify/index.d.ts +0 -53
  59. package/dist/adapters/fastify/index.mjs +0 -52
  60. package/dist/adapters/ws/index.d.mts +0 -31
  61. package/dist/adapters/ws/index.d.ts +0 -31
  62. package/dist/adapters/ws/index.mjs +0 -37
  63. package/dist/hibernation/index.d.mts +0 -44
  64. package/dist/hibernation/index.d.ts +0 -44
  65. package/dist/hibernation/index.mjs +0 -65
  66. package/dist/shared/server.7cEtMB30.d.ts +0 -74
  67. package/dist/shared/server.B8gYOD5g.d.mts +0 -12
  68. package/dist/shared/server.BqadksTP.d.mts +0 -74
  69. package/dist/shared/server.C8_sRzQB.d.mts +0 -42
  70. package/dist/shared/server.ChUyt5-i.d.mts +0 -32
  71. package/dist/shared/server.ChyoA9XY.d.ts +0 -42
  72. package/dist/shared/server.DEBcqOjg.mjs +0 -418
  73. package/dist/shared/server.EfTOZ2Q7.d.ts +0 -12
  74. package/dist/shared/server.TEVCLCFC.mjs +0 -39
  75. package/dist/shared/server.ZxHCEN1h.mjs +0 -226
  76. package/dist/shared/server.qKsRrdxW.d.mts +0 -193
  77. package/dist/shared/server.qKsRrdxW.d.ts +0 -193
  78. package/dist/shared/server.yoEB3Fx4.d.ts +0 -32
@@ -1,99 +1,121 @@
1
- import { C as Context, R as Router } from '../../shared/server.qKsRrdxW.mjs';
1
+ import { SendStandardResponseOptions, NodeHttpRequest, NodeHttpResponse } from '@standardserver/node';
2
+ import { C as Context } from '../../shared/server.BL22TloH.mjs';
2
3
  import { Interceptor, MaybeOptionalOptions } from '@orpc/shared';
3
- import { SendStandardResponseOptions, NodeHttpRequest, NodeHttpResponse } from '@orpc/standard-server-node';
4
- import { F as FriendlyStandardHandleOptions } from '../../shared/server.B8gYOD5g.mjs';
5
- import { g as StandardHandlerPlugin, C as CompositeStandardHandlerPlugin, b as StandardHandleOptions, f as StandardHandler } from '../../shared/server.BqadksTP.mjs';
4
+ import { e as StandardHandlerPlugin, b as StandardHandlerHandleOptions, S as StandardHandler, a as StandardHandlerOptions } from '../../shared/server.BB_Ik9Ph.mjs';
5
+ import { FriendlyStandardHandlerHandleOptions } from '../standard/index.mjs';
6
6
  import compression from '@orpc/interop/compression';
7
- import { S as StandardRPCHandlerOptions } from '../../shared/server.ChUyt5-i.mjs';
7
+ import { R as Router } from '../../shared/server.BsNNjG5J.mjs';
8
+ import { R as RPCHandlerCodecOptions } from '../../shared/server.B_U9y00a.mjs';
8
9
  import '@orpc/client';
9
10
  import '@orpc/contract';
10
- import '@orpc/standard-server';
11
- import '@orpc/client/standard';
12
- import '../../shared/server.C8_sRzQB.mjs';
11
+ import '@standardserver/core';
13
12
 
14
13
  interface NodeHttpHandlerPlugin<T extends Context> extends StandardHandlerPlugin<T> {
15
- initRuntimeAdapter?(options: NodeHttpHandlerOptions<T>): void;
14
+ /**
15
+ * Initializes the plugin and returns new node HTTP handler options.
16
+ * Called once per plugin instance during composition.
17
+ *
18
+ * This method allows plugins to wrap, extend, or transform node HTTP handler options
19
+ * such as interceptors, or other configuration.
20
+ *
21
+ * @param options - The current handler options from previous plugins or base configuration
22
+ * @returns Transformed handler options with plugin's modifications applied
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * initNodeHttpHandlerOptions(options) {
27
+ * return {
28
+ * ...options,
29
+ * nodeHttpInterceptors: [...(options.nodeHttpInterceptors || []), myInterceptor]
30
+ * }
31
+ * }
32
+ * ```
33
+ */
34
+ initNodeHttpHandlerOptions?(options: NodeHttpHandlerOptions<T>): NodeHttpHandlerOptions<T>;
16
35
  }
17
- declare class CompositeNodeHttpHandlerPlugin<T extends Context, TPlugin extends NodeHttpHandlerPlugin<T>> extends CompositeStandardHandlerPlugin<T, TPlugin> implements NodeHttpHandlerPlugin<T> {
18
- initRuntimeAdapter(options: NodeHttpHandlerOptions<T>): void;
36
+ declare class CompositeNodeHttpHandlerPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
37
+ readonly name = "~composite/node-http-handler";
38
+ protected readonly plugins: NodeHttpHandlerPlugin<T>[];
39
+ constructor(plugins?: NodeHttpHandlerPlugin<T>[]);
40
+ initNodeHttpHandlerOptions(options: NodeHttpHandlerOptions<T>): NodeHttpHandlerOptions<T>;
19
41
  }
20
42
 
21
- type NodeHttpHandleResult = {
43
+ type NodeHttpHandlerHandleResult = {
22
44
  matched: true;
23
45
  } | {
24
46
  matched: false;
25
47
  };
26
- interface NodeHttpHandlerInterceptorOptions<T extends Context> extends StandardHandleOptions<T> {
48
+ interface NodeHttpHandlerNodeHttpInterceptorOptions<T extends Context> extends StandardHandlerHandleOptions<T> {
27
49
  request: NodeHttpRequest;
28
50
  response: NodeHttpResponse;
29
- sendStandardResponseOptions: SendStandardResponseOptions;
51
+ sendStandardResponseOptions: SendStandardResponseOptions | undefined;
30
52
  }
31
- interface NodeHttpHandlerOptions<T extends Context> extends SendStandardResponseOptions {
32
- adapterInterceptors?: Interceptor<NodeHttpHandlerInterceptorOptions<T>, Promise<NodeHttpHandleResult>>[];
33
- plugins?: NodeHttpHandlerPlugin<T>[];
53
+ type NodeHttpHandlerNodeHttpInterceptor<T extends Context> = Interceptor<NodeHttpHandlerNodeHttpInterceptorOptions<T>, Promise<NodeHttpHandlerHandleResult>>;
54
+ interface NodeHttpHandlerOptions<T extends Context> {
55
+ /**
56
+ * Custom options for `sendStandardResponse`, used to send a `Standard Response`
57
+ */
58
+ sendStandardResponse?: SendStandardResponseOptions | undefined;
59
+ /**
60
+ * Interceptors that run before the mapping between the Standard API and Node HTTP API,
61
+ * useful for extending Node HTTP request/response before handling, ...
62
+ */
63
+ nodeHttpInterceptors?: NodeHttpHandlerNodeHttpInterceptor<T>[] | undefined;
64
+ plugins?: NodeHttpHandlerPlugin<T>[] | undefined;
34
65
  }
35
66
  declare class NodeHttpHandler<T extends Context> {
36
67
  private readonly standardHandler;
37
68
  private readonly sendStandardResponseOptions;
38
- private readonly adapterInterceptors;
69
+ private readonly nodeHttpInterceptors;
39
70
  constructor(standardHandler: StandardHandler<T>, options?: NoInfer<NodeHttpHandlerOptions<T>>);
40
- handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<FriendlyStandardHandleOptions<T>>): Promise<NodeHttpHandleResult>;
71
+ handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<NodeHttpHandlerHandleResult>;
41
72
  }
42
73
 
43
- interface BodyLimitPluginOptions {
74
+ interface BodyCompressionHandlerPluginOptions extends compression.CompressionOptions {
44
75
  /**
45
- * The maximum size of the body in bytes.
76
+ * Override the default content-type filter used to determine which responses should be compressed.
77
+ *
78
+ * @warning Event stream responses are never compressed, regardless of this filter's return value.
79
+ * @default only responses with compressible content types are compressed.
46
80
  */
47
- maxBodySize: number;
81
+ filter?: (request: NodeHttpRequest, response: NodeHttpResponse) => boolean;
48
82
  }
49
- /**
50
- * The Body Limit Plugin restricts the size of the request body for the Node.js HTTP Server.
51
- *
52
- * @see {@link https://orpc.dev/docs/plugins/body-limit Body Limit Plugin Docs}
53
- */
54
- declare class BodyLimitPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
55
- private readonly maxBodySize;
56
- constructor(options: BodyLimitPluginOptions);
57
- initRuntimeAdapter(options: NodeHttpHandlerOptions<T>): void;
83
+ declare class BodyCompressionHandlerPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
84
+ name: string;
85
+ private readonly compressionHandler;
86
+ constructor(options?: BodyCompressionHandlerPluginOptions);
87
+ initNodeHttpHandlerOptions(options: NodeHttpHandlerOptions<T>): NodeHttpHandlerOptions<T>;
58
88
  }
59
89
 
60
- interface CompressionPluginOptions extends compression.CompressionOptions {
90
+ interface BodyLimitHandlerPluginOptions {
61
91
  /**
62
- * Override the default content-type filter used to determine which responses should be compressed.
63
- *
64
- * @warning [Event Iterator](https://orpc.dev/docs/event-iterator) responses are never compressed, regardless of this filter's return value.
65
- * @default only responses with compressible content types are compressed.
92
+ * The maximum size of the body in bytes.
66
93
  */
67
- filter?: (req: NodeHttpRequest, res: NodeHttpResponse) => boolean;
94
+ maxBodySize: number;
68
95
  }
69
- /**
70
- * The Compression Plugin adds response compression to the Node.js HTTP Server.
71
- *
72
- * @see {@link https://orpc.dev/docs/plugins/compression Compression Plugin Docs}
73
- */
74
- declare class CompressionPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
75
- private readonly compressionHandler;
76
- constructor(options?: CompressionPluginOptions);
77
- initRuntimeAdapter(options: NodeHttpHandlerOptions<T>): void;
96
+ declare class BodyLimitHandlerPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
97
+ name: string;
98
+ private readonly maxBodySize;
99
+ constructor(options: BodyLimitHandlerPluginOptions);
100
+ initNodeHttpHandlerOptions(options: NodeHttpHandlerOptions<T>): NodeHttpHandlerOptions<T>;
78
101
  }
79
102
 
80
- interface RPCHandlerOptions<T extends Context> extends NodeHttpHandlerOptions<T>, Omit<StandardRPCHandlerOptions<T>, 'plugins'> {
103
+ interface RPCHandlerOptions<T extends Context> extends NodeHttpHandlerOptions<T>, Omit<StandardHandlerOptions<T>, 'plugins'>, RPCHandlerCodecOptions<T> {
81
104
  /**
82
- * Enables or disables the StrictGetMethodPlugin.
83
- *
84
- * @default true
105
+ * Configuration for {@link CSRFGuardHandlerPlugin}, which is enabled by default for `RPCHandler` over HTTP.
85
106
  */
86
- strictGetMethodPluginEnabled?: boolean;
107
+ csrfGuardPlugin?: {
108
+ /**
109
+ * If `false`, this plugin is disabled.
110
+ *
111
+ * @default true
112
+ */
113
+ enabled?: boolean;
114
+ };
87
115
  }
88
- /**
89
- * RPC Handler for Node.js HTTP Server
90
- *
91
- * @see {@link https://orpc.dev/docs/rpc-handler RPC Handler Docs}
92
- * @see {@link https://orpc.dev/docs/adapters/http HTTP Adapter Docs}
93
- */
94
116
  declare class RPCHandler<T extends Context> extends NodeHttpHandler<T> {
95
- constructor(router: Router<any, T>, options?: NoInfer<RPCHandlerOptions<T>>);
117
+ constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
96
118
  }
97
119
 
98
- export { BodyLimitPlugin, CompositeNodeHttpHandlerPlugin, CompressionPlugin, NodeHttpHandler, RPCHandler };
99
- export type { BodyLimitPluginOptions, CompressionPluginOptions, NodeHttpHandleResult, NodeHttpHandlerInterceptorOptions, NodeHttpHandlerOptions, NodeHttpHandlerPlugin, RPCHandlerOptions };
120
+ export { BodyCompressionHandlerPlugin, BodyLimitHandlerPlugin, CompositeNodeHttpHandlerPlugin, NodeHttpHandler, RPCHandler };
121
+ export type { BodyCompressionHandlerPluginOptions, BodyLimitHandlerPluginOptions, NodeHttpHandlerHandleResult, NodeHttpHandlerNodeHttpInterceptor, NodeHttpHandlerNodeHttpInterceptorOptions, NodeHttpHandlerOptions, NodeHttpHandlerPlugin, RPCHandlerOptions };
@@ -1,99 +1,121 @@
1
- import { C as Context, R as Router } from '../../shared/server.qKsRrdxW.js';
1
+ import { SendStandardResponseOptions, NodeHttpRequest, NodeHttpResponse } from '@standardserver/node';
2
+ import { C as Context } from '../../shared/server.BL22TloH.js';
2
3
  import { Interceptor, MaybeOptionalOptions } from '@orpc/shared';
3
- import { SendStandardResponseOptions, NodeHttpRequest, NodeHttpResponse } from '@orpc/standard-server-node';
4
- import { F as FriendlyStandardHandleOptions } from '../../shared/server.EfTOZ2Q7.js';
5
- import { g as StandardHandlerPlugin, C as CompositeStandardHandlerPlugin, b as StandardHandleOptions, f as StandardHandler } from '../../shared/server.7cEtMB30.js';
4
+ import { e as StandardHandlerPlugin, b as StandardHandlerHandleOptions, S as StandardHandler, a as StandardHandlerOptions } from '../../shared/server.EOHJ3NJr.js';
5
+ import { FriendlyStandardHandlerHandleOptions } from '../standard/index.js';
6
6
  import compression from '@orpc/interop/compression';
7
- import { S as StandardRPCHandlerOptions } from '../../shared/server.yoEB3Fx4.js';
7
+ import { R as Router } from '../../shared/server.Pa0F03f_.js';
8
+ import { R as RPCHandlerCodecOptions } from '../../shared/server.T9F3bzZx.js';
8
9
  import '@orpc/client';
9
10
  import '@orpc/contract';
10
- import '@orpc/standard-server';
11
- import '@orpc/client/standard';
12
- import '../../shared/server.ChyoA9XY.js';
11
+ import '@standardserver/core';
13
12
 
14
13
  interface NodeHttpHandlerPlugin<T extends Context> extends StandardHandlerPlugin<T> {
15
- initRuntimeAdapter?(options: NodeHttpHandlerOptions<T>): void;
14
+ /**
15
+ * Initializes the plugin and returns new node HTTP handler options.
16
+ * Called once per plugin instance during composition.
17
+ *
18
+ * This method allows plugins to wrap, extend, or transform node HTTP handler options
19
+ * such as interceptors, or other configuration.
20
+ *
21
+ * @param options - The current handler options from previous plugins or base configuration
22
+ * @returns Transformed handler options with plugin's modifications applied
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * initNodeHttpHandlerOptions(options) {
27
+ * return {
28
+ * ...options,
29
+ * nodeHttpInterceptors: [...(options.nodeHttpInterceptors || []), myInterceptor]
30
+ * }
31
+ * }
32
+ * ```
33
+ */
34
+ initNodeHttpHandlerOptions?(options: NodeHttpHandlerOptions<T>): NodeHttpHandlerOptions<T>;
16
35
  }
17
- declare class CompositeNodeHttpHandlerPlugin<T extends Context, TPlugin extends NodeHttpHandlerPlugin<T>> extends CompositeStandardHandlerPlugin<T, TPlugin> implements NodeHttpHandlerPlugin<T> {
18
- initRuntimeAdapter(options: NodeHttpHandlerOptions<T>): void;
36
+ declare class CompositeNodeHttpHandlerPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
37
+ readonly name = "~composite/node-http-handler";
38
+ protected readonly plugins: NodeHttpHandlerPlugin<T>[];
39
+ constructor(plugins?: NodeHttpHandlerPlugin<T>[]);
40
+ initNodeHttpHandlerOptions(options: NodeHttpHandlerOptions<T>): NodeHttpHandlerOptions<T>;
19
41
  }
20
42
 
21
- type NodeHttpHandleResult = {
43
+ type NodeHttpHandlerHandleResult = {
22
44
  matched: true;
23
45
  } | {
24
46
  matched: false;
25
47
  };
26
- interface NodeHttpHandlerInterceptorOptions<T extends Context> extends StandardHandleOptions<T> {
48
+ interface NodeHttpHandlerNodeHttpInterceptorOptions<T extends Context> extends StandardHandlerHandleOptions<T> {
27
49
  request: NodeHttpRequest;
28
50
  response: NodeHttpResponse;
29
- sendStandardResponseOptions: SendStandardResponseOptions;
51
+ sendStandardResponseOptions: SendStandardResponseOptions | undefined;
30
52
  }
31
- interface NodeHttpHandlerOptions<T extends Context> extends SendStandardResponseOptions {
32
- adapterInterceptors?: Interceptor<NodeHttpHandlerInterceptorOptions<T>, Promise<NodeHttpHandleResult>>[];
33
- plugins?: NodeHttpHandlerPlugin<T>[];
53
+ type NodeHttpHandlerNodeHttpInterceptor<T extends Context> = Interceptor<NodeHttpHandlerNodeHttpInterceptorOptions<T>, Promise<NodeHttpHandlerHandleResult>>;
54
+ interface NodeHttpHandlerOptions<T extends Context> {
55
+ /**
56
+ * Custom options for `sendStandardResponse`, used to send a `Standard Response`
57
+ */
58
+ sendStandardResponse?: SendStandardResponseOptions | undefined;
59
+ /**
60
+ * Interceptors that run before the mapping between the Standard API and Node HTTP API,
61
+ * useful for extending Node HTTP request/response before handling, ...
62
+ */
63
+ nodeHttpInterceptors?: NodeHttpHandlerNodeHttpInterceptor<T>[] | undefined;
64
+ plugins?: NodeHttpHandlerPlugin<T>[] | undefined;
34
65
  }
35
66
  declare class NodeHttpHandler<T extends Context> {
36
67
  private readonly standardHandler;
37
68
  private readonly sendStandardResponseOptions;
38
- private readonly adapterInterceptors;
69
+ private readonly nodeHttpInterceptors;
39
70
  constructor(standardHandler: StandardHandler<T>, options?: NoInfer<NodeHttpHandlerOptions<T>>);
40
- handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<FriendlyStandardHandleOptions<T>>): Promise<NodeHttpHandleResult>;
71
+ handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<NodeHttpHandlerHandleResult>;
41
72
  }
42
73
 
43
- interface BodyLimitPluginOptions {
74
+ interface BodyCompressionHandlerPluginOptions extends compression.CompressionOptions {
44
75
  /**
45
- * The maximum size of the body in bytes.
76
+ * Override the default content-type filter used to determine which responses should be compressed.
77
+ *
78
+ * @warning Event stream responses are never compressed, regardless of this filter's return value.
79
+ * @default only responses with compressible content types are compressed.
46
80
  */
47
- maxBodySize: number;
81
+ filter?: (request: NodeHttpRequest, response: NodeHttpResponse) => boolean;
48
82
  }
49
- /**
50
- * The Body Limit Plugin restricts the size of the request body for the Node.js HTTP Server.
51
- *
52
- * @see {@link https://orpc.dev/docs/plugins/body-limit Body Limit Plugin Docs}
53
- */
54
- declare class BodyLimitPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
55
- private readonly maxBodySize;
56
- constructor(options: BodyLimitPluginOptions);
57
- initRuntimeAdapter(options: NodeHttpHandlerOptions<T>): void;
83
+ declare class BodyCompressionHandlerPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
84
+ name: string;
85
+ private readonly compressionHandler;
86
+ constructor(options?: BodyCompressionHandlerPluginOptions);
87
+ initNodeHttpHandlerOptions(options: NodeHttpHandlerOptions<T>): NodeHttpHandlerOptions<T>;
58
88
  }
59
89
 
60
- interface CompressionPluginOptions extends compression.CompressionOptions {
90
+ interface BodyLimitHandlerPluginOptions {
61
91
  /**
62
- * Override the default content-type filter used to determine which responses should be compressed.
63
- *
64
- * @warning [Event Iterator](https://orpc.dev/docs/event-iterator) responses are never compressed, regardless of this filter's return value.
65
- * @default only responses with compressible content types are compressed.
92
+ * The maximum size of the body in bytes.
66
93
  */
67
- filter?: (req: NodeHttpRequest, res: NodeHttpResponse) => boolean;
94
+ maxBodySize: number;
68
95
  }
69
- /**
70
- * The Compression Plugin adds response compression to the Node.js HTTP Server.
71
- *
72
- * @see {@link https://orpc.dev/docs/plugins/compression Compression Plugin Docs}
73
- */
74
- declare class CompressionPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
75
- private readonly compressionHandler;
76
- constructor(options?: CompressionPluginOptions);
77
- initRuntimeAdapter(options: NodeHttpHandlerOptions<T>): void;
96
+ declare class BodyLimitHandlerPlugin<T extends Context> implements NodeHttpHandlerPlugin<T> {
97
+ name: string;
98
+ private readonly maxBodySize;
99
+ constructor(options: BodyLimitHandlerPluginOptions);
100
+ initNodeHttpHandlerOptions(options: NodeHttpHandlerOptions<T>): NodeHttpHandlerOptions<T>;
78
101
  }
79
102
 
80
- interface RPCHandlerOptions<T extends Context> extends NodeHttpHandlerOptions<T>, Omit<StandardRPCHandlerOptions<T>, 'plugins'> {
103
+ interface RPCHandlerOptions<T extends Context> extends NodeHttpHandlerOptions<T>, Omit<StandardHandlerOptions<T>, 'plugins'>, RPCHandlerCodecOptions<T> {
81
104
  /**
82
- * Enables or disables the StrictGetMethodPlugin.
83
- *
84
- * @default true
105
+ * Configuration for {@link CSRFGuardHandlerPlugin}, which is enabled by default for `RPCHandler` over HTTP.
85
106
  */
86
- strictGetMethodPluginEnabled?: boolean;
107
+ csrfGuardPlugin?: {
108
+ /**
109
+ * If `false`, this plugin is disabled.
110
+ *
111
+ * @default true
112
+ */
113
+ enabled?: boolean;
114
+ };
87
115
  }
88
- /**
89
- * RPC Handler for Node.js HTTP Server
90
- *
91
- * @see {@link https://orpc.dev/docs/rpc-handler RPC Handler Docs}
92
- * @see {@link https://orpc.dev/docs/adapters/http HTTP Adapter Docs}
93
- */
94
116
  declare class RPCHandler<T extends Context> extends NodeHttpHandler<T> {
95
- constructor(router: Router<any, T>, options?: NoInfer<RPCHandlerOptions<T>>);
117
+ constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
96
118
  }
97
119
 
98
- export { BodyLimitPlugin, CompositeNodeHttpHandlerPlugin, CompressionPlugin, NodeHttpHandler, RPCHandler };
99
- export type { BodyLimitPluginOptions, CompressionPluginOptions, NodeHttpHandleResult, NodeHttpHandlerInterceptorOptions, NodeHttpHandlerOptions, NodeHttpHandlerPlugin, RPCHandlerOptions };
120
+ export { BodyCompressionHandlerPlugin, BodyLimitHandlerPlugin, CompositeNodeHttpHandlerPlugin, NodeHttpHandler, RPCHandler };
121
+ export type { BodyCompressionHandlerPluginOptions, BodyLimitHandlerPluginOptions, NodeHttpHandlerHandleResult, NodeHttpHandlerNodeHttpInterceptor, NodeHttpHandlerNodeHttpInterceptorOptions, NodeHttpHandlerOptions, NodeHttpHandlerPlugin, RPCHandlerOptions };
@@ -1,125 +1,150 @@
1
- import { ORPCError } from '@orpc/client';
2
- import { once, toArray, intercept, resolveMaybeOptionalOptions } from '@orpc/shared';
3
1
  import compression from '@orpc/interop/compression';
4
- import { toStandardLazyRequest, sendStandardResponse } from '@orpc/standard-server-node';
5
- import { r as resolveFriendlyStandardHandleOptions } from '../../shared/server.DZ5BIITo.mjs';
6
- import { C as CompositeStandardHandlerPlugin, b as StandardRPCHandler } from '../../shared/server.ZxHCEN1h.mjs';
7
- import { S as StrictGetMethodPlugin } from '../../shared/server.TEVCLCFC.mjs';
8
- import '@orpc/client/standard';
9
- import '@orpc/standard-server';
10
- import '../../shared/server.DEBcqOjg.mjs';
2
+ import { toArray, sortPlugins, intercept, resolveMaybeOptionalOptions } from '@orpc/shared';
3
+ import { ORPCError } from '@orpc/client';
4
+ import { toStandardLazyRequest, sendStandardResponse } from '@standardserver/node';
5
+ import { r as resolveFriendlyStandardHandlerHandleOptions } from '../../shared/server.W91HSRkE.mjs';
6
+ import { C as CSRFGuardHandlerPlugin } from '../../shared/server.D_QauotT.mjs';
7
+ import { R as RPCHandlerCodec, S as StandardHandler } from '../../shared/server.GDpX6Df8.mjs';
8
+ import '@standardserver/core';
9
+ import '../../shared/server.CrlKQucM.mjs';
11
10
  import '@orpc/contract';
11
+ import '../../shared/server.BwHnWUuN.mjs';
12
12
 
13
- class BodyLimitPlugin {
14
- maxBodySize;
15
- constructor(options) {
16
- this.maxBodySize = options.maxBodySize;
17
- }
18
- initRuntimeAdapter(options) {
19
- options.adapterInterceptors ??= [];
20
- options.adapterInterceptors.push(async (options2) => {
21
- const checkHeader = once(() => {
22
- if (Number(options2.request.headers["content-length"]) > this.maxBodySize) {
23
- throw new ORPCError("PAYLOAD_TOO_LARGE");
24
- }
25
- });
26
- const originalEmit = options2.request.emit;
27
- let currentBodySize = 0;
28
- options2.request.emit = (event, ...args) => {
29
- if (event === "data") {
30
- checkHeader();
31
- currentBodySize += args[0].length;
32
- if (currentBodySize > this.maxBodySize) {
33
- throw new ORPCError("PAYLOAD_TOO_LARGE");
34
- }
35
- }
36
- return originalEmit.call(options2.request, event, ...args);
37
- };
38
- try {
39
- return await options2.next(options2);
40
- } finally {
41
- options2.request.emit = originalEmit;
42
- }
43
- });
44
- }
45
- }
46
-
47
- class CompressionPlugin {
13
+ class BodyCompressionHandlerPlugin {
14
+ name = "~body-compression";
48
15
  compressionHandler;
49
16
  constructor(options = {}) {
50
17
  this.compressionHandler = compression({
51
18
  ...options,
52
- filter: (req, res) => {
53
- const hasContentDisposition = res.hasHeader("content-disposition");
54
- const contentType = res.getHeader("content-type")?.toString();
19
+ filter: (request, response) => {
20
+ const hasContentDisposition = response.hasHeader("content-disposition");
21
+ const contentType = response.getHeader("content-type")?.toString();
55
22
  if (!hasContentDisposition && contentType?.startsWith("text/event-stream")) {
56
23
  return false;
57
24
  }
58
- return options.filter ? options.filter(req, res) : compression.filter(req, res);
25
+ return options.filter ? options.filter(request, response) : compression.filter(request, response);
59
26
  }
60
27
  });
61
28
  }
62
- initRuntimeAdapter(options) {
63
- options.adapterInterceptors ??= [];
64
- options.adapterInterceptors.unshift(async (options2) => {
65
- let resolve;
66
- let reject;
67
- const promise = new Promise((res, rej) => {
68
- resolve = res;
69
- reject = rej;
70
- });
71
- const originalWrite = options2.response.write;
72
- const originalEnd = options2.response.end;
73
- const originalOn = options2.response.on;
74
- this.compressionHandler(
75
- options2.request,
76
- options2.response,
77
- async (err) => {
78
- if (err) {
79
- reject(err);
80
- } else {
81
- try {
82
- resolve(await options2.next());
83
- } catch (error) {
84
- reject(error);
29
+ initNodeHttpHandlerOptions(options) {
30
+ return {
31
+ ...options,
32
+ nodeHttpInterceptors: [
33
+ async (interceptorOptions) => {
34
+ let resolve;
35
+ let reject;
36
+ const promise = new Promise((res, rej) => {
37
+ resolve = res;
38
+ reject = rej;
39
+ });
40
+ const originalWrite = interceptorOptions.response.write;
41
+ const originalEnd = interceptorOptions.response.end;
42
+ const originalOn = interceptorOptions.response.on;
43
+ this.compressionHandler(
44
+ interceptorOptions.request,
45
+ interceptorOptions.response,
46
+ async (error) => {
47
+ if (error) {
48
+ reject(error);
49
+ } else {
50
+ try {
51
+ resolve(await interceptorOptions.next(interceptorOptions));
52
+ } catch (nextError) {
53
+ reject(nextError);
54
+ }
55
+ }
85
56
  }
57
+ );
58
+ try {
59
+ return await promise;
60
+ } finally {
61
+ interceptorOptions.response.write = originalWrite;
62
+ interceptorOptions.response.end = originalEnd;
63
+ interceptorOptions.response.on = originalOn;
86
64
  }
87
- }
88
- );
89
- try {
90
- return await promise;
91
- } finally {
92
- options2.response.write = originalWrite;
93
- options2.response.end = originalEnd;
94
- options2.response.on = originalOn;
95
- }
96
- });
65
+ },
66
+ ...toArray(options.nodeHttpInterceptors)
67
+ ]
68
+ };
97
69
  }
98
70
  }
99
71
 
100
- class CompositeNodeHttpHandlerPlugin extends CompositeStandardHandlerPlugin {
101
- initRuntimeAdapter(options) {
72
+ class BodyLimitHandlerPlugin {
73
+ name = "~body-limit";
74
+ maxBodySize;
75
+ constructor(options) {
76
+ this.maxBodySize = options.maxBodySize;
77
+ }
78
+ initNodeHttpHandlerOptions(options) {
79
+ return {
80
+ ...options,
81
+ nodeHttpInterceptors: [
82
+ async (interceptorOptions) => {
83
+ let isHeaderChecked = false;
84
+ const checkHeader = () => {
85
+ if (isHeaderChecked) {
86
+ return;
87
+ }
88
+ isHeaderChecked = true;
89
+ const contentLength = interceptorOptions.request.headers["content-length"];
90
+ if (contentLength && Number(contentLength) > this.maxBodySize) {
91
+ throw new ORPCError("PAYLOAD_TOO_LARGE");
92
+ }
93
+ };
94
+ const originalEmit = interceptorOptions.request.emit;
95
+ let currentBodySize = 0;
96
+ interceptorOptions.request.emit = (event, ...args) => {
97
+ if (event === "data") {
98
+ checkHeader();
99
+ currentBodySize += args[0]?.length ?? 0;
100
+ if (currentBodySize > this.maxBodySize) {
101
+ throw new ORPCError("PAYLOAD_TOO_LARGE");
102
+ }
103
+ }
104
+ return originalEmit.call(interceptorOptions.request, event, ...args);
105
+ };
106
+ try {
107
+ return await interceptorOptions.next(interceptorOptions);
108
+ } finally {
109
+ interceptorOptions.request.emit = originalEmit;
110
+ }
111
+ },
112
+ ...toArray(options.nodeHttpInterceptors)
113
+ ]
114
+ };
115
+ }
116
+ }
117
+
118
+ class CompositeNodeHttpHandlerPlugin {
119
+ name = "~composite/node-http-handler";
120
+ plugins;
121
+ constructor(plugins = []) {
122
+ this.plugins = sortPlugins(plugins);
123
+ }
124
+ initNodeHttpHandlerOptions(options) {
102
125
  for (const plugin of this.plugins) {
103
- plugin.initRuntimeAdapter?.(options);
126
+ if (plugin.initNodeHttpHandlerOptions) {
127
+ options = plugin.initNodeHttpHandlerOptions(options);
128
+ }
104
129
  }
130
+ return options;
105
131
  }
106
132
  }
107
133
 
108
134
  class NodeHttpHandler {
109
135
  constructor(standardHandler, options = {}) {
110
136
  this.standardHandler = standardHandler;
111
- const plugin = new CompositeNodeHttpHandlerPlugin(options.plugins);
112
- plugin.initRuntimeAdapter(options);
113
- this.adapterInterceptors = toArray(options.adapterInterceptors);
114
- this.sendStandardResponseOptions = options;
137
+ options = new CompositeNodeHttpHandlerPlugin(options.plugins).initNodeHttpHandlerOptions(options);
138
+ this.nodeHttpInterceptors = options.nodeHttpInterceptors;
139
+ this.sendStandardResponseOptions = options.sendStandardResponse;
115
140
  }
116
141
  sendStandardResponseOptions;
117
- adapterInterceptors;
142
+ nodeHttpInterceptors;
118
143
  async handle(request, response, ...rest) {
119
144
  return intercept(
120
- this.adapterInterceptors,
145
+ this.nodeHttpInterceptors,
121
146
  {
122
- ...resolveFriendlyStandardHandleOptions(resolveMaybeOptionalOptions(rest)),
147
+ ...resolveFriendlyStandardHandlerHandleOptions(resolveMaybeOptionalOptions(rest)),
123
148
  request,
124
149
  response,
125
150
  sendStandardResponseOptions: this.sendStandardResponseOptions
@@ -128,10 +153,10 @@ class NodeHttpHandler {
128
153
  const standardRequest = toStandardLazyRequest(request2, response2);
129
154
  const result = await this.standardHandler.handle(standardRequest, options);
130
155
  if (!result.matched) {
131
- return { matched: false };
156
+ return result;
132
157
  }
133
158
  await sendStandardResponse(response2, result.response, sendStandardResponseOptions);
134
- return { matched: true };
159
+ return result;
135
160
  }
136
161
  );
137
162
  }
@@ -139,12 +164,16 @@ class NodeHttpHandler {
139
164
 
140
165
  class RPCHandler extends NodeHttpHandler {
141
166
  constructor(router, options = {}) {
142
- if (options.strictGetMethodPluginEnabled ?? true) {
143
- options.plugins ??= [];
144
- options.plugins.push(new StrictGetMethodPlugin());
167
+ if (options.csrfGuardPlugin?.enabled !== false) {
168
+ options = {
169
+ ...options,
170
+ plugins: [...toArray(options.plugins), new CSRFGuardHandlerPlugin()]
171
+ };
145
172
  }
146
- super(new StandardRPCHandler(router, options), options);
173
+ const codec = new RPCHandlerCodec(router, options);
174
+ const handler = new StandardHandler(codec, options);
175
+ super(handler, options);
147
176
  }
148
177
  }
149
178
 
150
- export { BodyLimitPlugin, CompositeNodeHttpHandlerPlugin, CompressionPlugin, NodeHttpHandler, RPCHandler };
179
+ export { BodyCompressionHandlerPlugin, BodyLimitHandlerPlugin, CompositeNodeHttpHandlerPlugin, NodeHttpHandler, RPCHandler };