@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.
- package/README.md +75 -136
- package/dist/adapters/crossws/index.d.mts +42 -21
- package/dist/adapters/crossws/index.d.ts +42 -21
- package/dist/adapters/crossws/index.mjs +37 -18
- package/dist/adapters/fetch/index.d.mts +83 -67
- package/dist/adapters/fetch/index.d.ts +83 -67
- package/dist/adapters/fetch/index.mjs +131 -106
- package/dist/adapters/message-port/index.d.mts +51 -34
- package/dist/adapters/message-port/index.d.ts +51 -34
- package/dist/adapters/message-port/index.mjs +73 -38
- package/dist/adapters/node/index.d.mts +82 -60
- package/dist/adapters/node/index.d.ts +82 -60
- package/dist/adapters/node/index.mjs +127 -98
- package/dist/adapters/standard/index.d.mts +16 -18
- package/dist/adapters/standard/index.d.ts +16 -18
- package/dist/adapters/standard/index.mjs +5 -5
- package/dist/adapters/standard-peer/index.d.mts +12 -14
- package/dist/adapters/standard-peer/index.d.ts +12 -14
- package/dist/adapters/standard-peer/index.mjs +2 -21
- package/dist/adapters/websocket/index.d.mts +39 -34
- package/dist/adapters/websocket/index.d.ts +39 -34
- package/dist/adapters/websocket/index.mjs +42 -33
- package/dist/extensions/callable.d.mts +10 -0
- package/dist/extensions/callable.d.ts +10 -0
- package/dist/extensions/callable.mjs +11 -0
- package/dist/helpers/index.d.mts +2 -2
- package/dist/helpers/index.d.ts +2 -2
- package/dist/helpers/index.mjs +1 -1
- package/dist/index.d.mts +163 -770
- package/dist/index.d.ts +163 -770
- package/dist/index.mjs +296 -403
- package/dist/plugins/index.d.mts +105 -143
- package/dist/plugins/index.d.ts +105 -143
- package/dist/plugins/index.mjs +232 -255
- package/dist/shared/server.BB_Ik9Ph.d.mts +104 -0
- package/dist/shared/server.BL22TloH.d.mts +184 -0
- package/dist/shared/server.BL22TloH.d.ts +184 -0
- package/dist/shared/server.B_U9y00a.d.mts +66 -0
- package/dist/shared/server.BsNNjG5J.d.mts +61 -0
- package/dist/shared/server.BwHnWUuN.mjs +222 -0
- package/dist/shared/server.CX4vUnDk.mjs +11 -0
- package/dist/shared/server.CjOb6ItT.mjs +41 -0
- package/dist/shared/server.CrlKQucM.mjs +233 -0
- package/dist/shared/server.D_QauotT.mjs +30 -0
- package/dist/shared/server.EOHJ3NJr.d.ts +104 -0
- package/dist/shared/server.GDpX6Df8.mjs +271 -0
- package/dist/shared/server.Pa0F03f_.d.ts +61 -0
- package/dist/shared/server.T9F3bzZx.d.ts +66 -0
- package/dist/shared/{server.DZ5BIITo.mjs → server.W91HSRkE.mjs} +2 -2
- package/package.json +26 -55
- package/dist/adapters/aws-lambda/index.d.mts +0 -46
- package/dist/adapters/aws-lambda/index.d.ts +0 -46
- package/dist/adapters/aws-lambda/index.mjs +0 -40
- package/dist/adapters/bun-ws/index.d.mts +0 -36
- package/dist/adapters/bun-ws/index.d.ts +0 -36
- package/dist/adapters/bun-ws/index.mjs +0 -47
- package/dist/adapters/fastify/index.d.mts +0 -53
- package/dist/adapters/fastify/index.d.ts +0 -53
- package/dist/adapters/fastify/index.mjs +0 -52
- package/dist/adapters/ws/index.d.mts +0 -31
- package/dist/adapters/ws/index.d.ts +0 -31
- package/dist/adapters/ws/index.mjs +0 -37
- package/dist/hibernation/index.d.mts +0 -44
- package/dist/hibernation/index.d.ts +0 -44
- package/dist/hibernation/index.mjs +0 -65
- package/dist/shared/server.7cEtMB30.d.ts +0 -74
- package/dist/shared/server.B8gYOD5g.d.mts +0 -12
- package/dist/shared/server.BqadksTP.d.mts +0 -74
- package/dist/shared/server.C8_sRzQB.d.mts +0 -42
- package/dist/shared/server.ChUyt5-i.d.mts +0 -32
- package/dist/shared/server.ChyoA9XY.d.ts +0 -42
- package/dist/shared/server.DEBcqOjg.mjs +0 -418
- package/dist/shared/server.EfTOZ2Q7.d.ts +0 -12
- package/dist/shared/server.TEVCLCFC.mjs +0 -39
- package/dist/shared/server.ZxHCEN1h.mjs +0 -226
- package/dist/shared/server.qKsRrdxW.d.mts +0 -193
- package/dist/shared/server.qKsRrdxW.d.ts +0 -193
- package/dist/shared/server.yoEB3Fx4.d.ts +0 -32
|
@@ -1,99 +1,121 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
4
|
-
import {
|
|
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 {
|
|
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 '@
|
|
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
|
-
|
|
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
|
|
18
|
-
|
|
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
|
|
43
|
+
type NodeHttpHandlerHandleResult = {
|
|
22
44
|
matched: true;
|
|
23
45
|
} | {
|
|
24
46
|
matched: false;
|
|
25
47
|
};
|
|
26
|
-
interface
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
69
|
+
private readonly nodeHttpInterceptors;
|
|
39
70
|
constructor(standardHandler: StandardHandler<T>, options?: NoInfer<NodeHttpHandlerOptions<T>>);
|
|
40
|
-
handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<
|
|
71
|
+
handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<NodeHttpHandlerHandleResult>;
|
|
41
72
|
}
|
|
42
73
|
|
|
43
|
-
interface
|
|
74
|
+
interface BodyCompressionHandlerPluginOptions extends compression.CompressionOptions {
|
|
44
75
|
/**
|
|
45
|
-
*
|
|
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
|
-
|
|
81
|
+
filter?: (request: NodeHttpRequest, response: NodeHttpResponse) => boolean;
|
|
48
82
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
90
|
+
interface BodyLimitHandlerPluginOptions {
|
|
61
91
|
/**
|
|
62
|
-
*
|
|
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
|
-
|
|
94
|
+
maxBodySize: number;
|
|
68
95
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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<
|
|
103
|
+
interface RPCHandlerOptions<T extends Context> extends NodeHttpHandlerOptions<T>, Omit<StandardHandlerOptions<T>, 'plugins'>, RPCHandlerCodecOptions<T> {
|
|
81
104
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* @default true
|
|
105
|
+
* Configuration for {@link CSRFGuardHandlerPlugin}, which is enabled by default for `RPCHandler` over HTTP.
|
|
85
106
|
*/
|
|
86
|
-
|
|
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<
|
|
117
|
+
constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
96
118
|
}
|
|
97
119
|
|
|
98
|
-
export {
|
|
99
|
-
export type {
|
|
120
|
+
export { BodyCompressionHandlerPlugin, BodyLimitHandlerPlugin, CompositeNodeHttpHandlerPlugin, NodeHttpHandler, RPCHandler };
|
|
121
|
+
export type { BodyCompressionHandlerPluginOptions, BodyLimitHandlerPluginOptions, NodeHttpHandlerHandleResult, NodeHttpHandlerNodeHttpInterceptor, NodeHttpHandlerNodeHttpInterceptorOptions, NodeHttpHandlerOptions, NodeHttpHandlerPlugin, RPCHandlerOptions };
|
|
@@ -1,99 +1,121 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
4
|
-
import {
|
|
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 {
|
|
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 '@
|
|
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
|
-
|
|
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
|
|
18
|
-
|
|
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
|
|
43
|
+
type NodeHttpHandlerHandleResult = {
|
|
22
44
|
matched: true;
|
|
23
45
|
} | {
|
|
24
46
|
matched: false;
|
|
25
47
|
};
|
|
26
|
-
interface
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
69
|
+
private readonly nodeHttpInterceptors;
|
|
39
70
|
constructor(standardHandler: StandardHandler<T>, options?: NoInfer<NodeHttpHandlerOptions<T>>);
|
|
40
|
-
handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<
|
|
71
|
+
handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<NodeHttpHandlerHandleResult>;
|
|
41
72
|
}
|
|
42
73
|
|
|
43
|
-
interface
|
|
74
|
+
interface BodyCompressionHandlerPluginOptions extends compression.CompressionOptions {
|
|
44
75
|
/**
|
|
45
|
-
*
|
|
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
|
-
|
|
81
|
+
filter?: (request: NodeHttpRequest, response: NodeHttpResponse) => boolean;
|
|
48
82
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
90
|
+
interface BodyLimitHandlerPluginOptions {
|
|
61
91
|
/**
|
|
62
|
-
*
|
|
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
|
-
|
|
94
|
+
maxBodySize: number;
|
|
68
95
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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<
|
|
103
|
+
interface RPCHandlerOptions<T extends Context> extends NodeHttpHandlerOptions<T>, Omit<StandardHandlerOptions<T>, 'plugins'>, RPCHandlerCodecOptions<T> {
|
|
81
104
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* @default true
|
|
105
|
+
* Configuration for {@link CSRFGuardHandlerPlugin}, which is enabled by default for `RPCHandler` over HTTP.
|
|
85
106
|
*/
|
|
86
|
-
|
|
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<
|
|
117
|
+
constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
96
118
|
}
|
|
97
119
|
|
|
98
|
-
export {
|
|
99
|
-
export type {
|
|
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 {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import '
|
|
9
|
-
import '
|
|
10
|
-
import '
|
|
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
|
|
14
|
-
|
|
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: (
|
|
53
|
-
const hasContentDisposition =
|
|
54
|
-
const contentType =
|
|
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(
|
|
25
|
+
return options.filter ? options.filter(request, response) : compression.filter(request, response);
|
|
59
26
|
}
|
|
60
27
|
});
|
|
61
28
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
90
|
-
|
|
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
|
|
101
|
-
|
|
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.
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
this.
|
|
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
|
-
|
|
142
|
+
nodeHttpInterceptors;
|
|
118
143
|
async handle(request, response, ...rest) {
|
|
119
144
|
return intercept(
|
|
120
|
-
this.
|
|
145
|
+
this.nodeHttpInterceptors,
|
|
121
146
|
{
|
|
122
|
-
...
|
|
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
|
|
156
|
+
return result;
|
|
132
157
|
}
|
|
133
158
|
await sendStandardResponse(response2, result.response, sendStandardResponseOptions);
|
|
134
|
-
return
|
|
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.
|
|
143
|
-
options
|
|
144
|
-
|
|
167
|
+
if (options.csrfGuardPlugin?.enabled !== false) {
|
|
168
|
+
options = {
|
|
169
|
+
...options,
|
|
170
|
+
plugins: [...toArray(options.plugins), new CSRFGuardHandlerPlugin()]
|
|
171
|
+
};
|
|
145
172
|
}
|
|
146
|
-
|
|
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 {
|
|
179
|
+
export { BodyCompressionHandlerPlugin, BodyLimitHandlerPlugin, CompositeNodeHttpHandlerPlugin, NodeHttpHandler, RPCHandler };
|