@orpc/server 2.0.0-beta.47 → 2.0.0-beta.49
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 +6 -7
- package/dist/adapters/aws-lambda/handler.d.ts +25 -0
- package/dist/adapters/aws-lambda/handler.js +24 -0
- package/dist/adapters/aws-lambda/index.d.ts +10 -45
- package/dist/adapters/aws-lambda/index.js +2 -0
- package/dist/adapters/aws-lambda/rpc-handler.d.ts +19 -0
- package/dist/adapters/aws-lambda/rpc-handler.js +18 -0
- package/dist/adapters/crossws/handler.d.ts +45 -0
- package/dist/adapters/crossws/handler.js +60 -0
- package/dist/adapters/crossws/index.d.ts +2 -63
- package/dist/adapters/crossws/index.js +2 -0
- package/dist/adapters/crossws/rpc-handler.d.ts +16 -0
- package/dist/adapters/crossws/rpc-handler.js +15 -0
- package/dist/adapters/fastify/handler.d.ts +21 -0
- package/dist/adapters/fastify/handler.js +20 -0
- package/dist/adapters/fastify/index.d.ts +2 -42
- package/dist/adapters/fastify/index.js +2 -0
- package/dist/adapters/fastify/rpc-handler.d.ts +15 -0
- package/dist/adapters/fastify/rpc-handler.js +14 -0
- package/dist/adapters/fetch/handler.d.ts +23 -0
- package/dist/adapters/fetch/handler.js +22 -0
- package/dist/adapters/fetch/index.d.ts +5 -45
- package/dist/adapters/fetch/index.js +7 -0
- package/dist/adapters/fetch/rpc-handler.d.ts +17 -0
- package/dist/adapters/fetch/rpc-handler.js +16 -0
- package/dist/adapters/message-port/{index.d.mts → handler.d.ts} +17 -30
- package/dist/adapters/message-port/handler.js +86 -0
- package/dist/adapters/message-port/index.d.ts +2 -77
- package/dist/adapters/message-port/index.js +2 -0
- package/dist/adapters/message-port/rpc-handler.d.ts +16 -0
- package/dist/adapters/message-port/rpc-handler.js +15 -0
- package/dist/adapters/node/handler.d.ts +21 -0
- package/dist/adapters/node/handler.js +20 -0
- package/dist/adapters/node/index.d.ts +5 -42
- package/dist/adapters/node/index.js +7 -0
- package/dist/adapters/node/rpc-handler.d.ts +16 -0
- package/dist/adapters/node/rpc-handler.js +15 -0
- package/dist/adapters/standard/codec.d.ts +16 -0
- package/dist/adapters/standard/codec.js +1 -0
- package/dist/adapters/standard/handler.d.ts +68 -0
- package/dist/adapters/standard/handler.js +205 -0
- package/dist/adapters/standard/index.d.ts +6 -95
- package/dist/adapters/standard/index.js +5 -0
- package/dist/adapters/standard/plugin.d.ts +32 -0
- package/dist/adapters/standard/plugin.js +16 -0
- package/dist/adapters/standard/rpc-handler-codec.d.ts +46 -0
- package/dist/adapters/standard/rpc-handler-codec.js +51 -0
- package/dist/adapters/standard/rpc-matcher.d.ts +53 -0
- package/dist/adapters/standard/rpc-matcher.js +152 -0
- package/dist/adapters/standard/utils.d.ts +10 -0
- package/dist/adapters/standard/utils.js +6 -0
- package/dist/adapters/standard-peer/index.d.ts +1 -11
- package/dist/adapters/standard-peer/index.js +1 -0
- package/dist/adapters/standard-peer/utils.d.ts +4 -0
- package/dist/adapters/standard-peer/utils.js +7 -0
- package/dist/adapters/websocket/{index.d.mts → handler.d.ts} +11 -29
- package/dist/adapters/websocket/handler.js +85 -0
- package/dist/adapters/websocket/index.d.ts +2 -77
- package/dist/adapters/websocket/index.js +2 -0
- package/dist/adapters/websocket/rpc-handler.d.ts +16 -0
- package/dist/adapters/websocket/rpc-handler.js +15 -0
- package/dist/builder-variants.d.ts +226 -0
- package/dist/builder-variants.js +1 -0
- package/dist/builder.d.ts +127 -0
- package/dist/builder.js +226 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +2 -0
- package/dist/context.d.ts +6 -0
- package/dist/context.js +1 -0
- package/dist/extensions/callable.d.ts +6 -5
- package/dist/extensions/callable.js +7 -0
- package/dist/helpers/base64url.d.ts +31 -0
- package/dist/helpers/base64url.js +53 -0
- package/dist/helpers/cookie.d.ts +51 -0
- package/dist/helpers/cookie.js +69 -0
- package/dist/helpers/encryption.d.ts +28 -0
- package/dist/helpers/encryption.js +80 -0
- package/dist/helpers/index.d.ts +4 -167
- package/dist/helpers/index.js +4 -0
- package/dist/helpers/signing.d.ts +50 -0
- package/dist/helpers/signing.js +88 -0
- package/dist/implementer-procedure.d.ts +16 -0
- package/dist/implementer-procedure.js +44 -0
- package/dist/implementer-router.d.ts +40 -0
- package/dist/implementer-router.js +117 -0
- package/dist/implementer.d.ts +16 -0
- package/dist/implementer.js +37 -0
- package/dist/index.d.ts +45 -460
- package/dist/index.js +48 -0
- package/dist/lazy.d.ts +20 -0
- package/dist/lazy.js +31 -0
- package/dist/middleware-decorated.d.ts +10 -0
- package/dist/middleware-decorated.js +71 -0
- package/dist/middleware.d.ts +54 -0
- package/dist/middleware.js +1 -0
- package/dist/plugins/batch.d.ts +102 -0
- package/dist/plugins/batch.js +405 -0
- package/dist/plugins/cors.d.ts +73 -0
- package/dist/plugins/cors.js +112 -0
- package/dist/plugins/get-method-csrf-protection.d.ts +23 -0
- package/dist/plugins/get-method-csrf-protection.js +64 -0
- package/dist/plugins/head-method.d.ts +23 -0
- package/dist/plugins/head-method.js +104 -0
- package/dist/plugins/index.d.ts +29 -422
- package/dist/plugins/index.js +29 -0
- package/dist/plugins/method-override.d.ts +38 -0
- package/dist/plugins/method-override.js +50 -0
- package/dist/plugins/request-compression.d.ts +16 -0
- package/dist/plugins/request-compression.js +82 -0
- package/dist/plugins/request-headers.d.ts +22 -0
- package/dist/plugins/request-headers.js +30 -0
- package/dist/{shared/server.CgBF3Vj1.d.ts → plugins/request-limit.d.ts} +4 -8
- package/dist/plugins/request-limit.js +68 -0
- package/dist/plugins/response-compression.d.ts +59 -0
- package/dist/plugins/response-compression.js +209 -0
- package/dist/plugins/response-headers.d.ts +30 -0
- package/dist/plugins/response-headers.js +47 -0
- package/dist/plugins/rethrow.d.ts +33 -0
- package/dist/plugins/rethrow.js +59 -0
- package/dist/plugins/signal-sync.d.ts +13 -0
- package/dist/plugins/signal-sync.js +91 -0
- package/dist/plugins/timeout.d.ts +37 -0
- package/dist/plugins/timeout.js +59 -0
- package/dist/procedure-client.d.ts +19 -0
- package/dist/procedure-client.js +175 -0
- package/dist/procedure-decorated.d.ts +10 -0
- package/dist/procedure-decorated.js +44 -0
- package/dist/procedure-utils.d.ts +41 -0
- package/dist/procedure-utils.js +49 -0
- package/dist/procedure.d.ts +72 -0
- package/dist/procedure.js +24 -0
- package/dist/router-client.d.ts +23 -0
- package/dist/router-client.js +43 -0
- package/dist/router-hidden.d.ts +5 -0
- package/dist/router-hidden.js +14 -0
- package/dist/router-utils.d.ts +48 -0
- package/dist/router-utils.js +202 -0
- package/dist/{shared/server.Dz7j9BEh.d.ts → router.d.ts} +14 -15
- package/dist/router.js +1 -0
- package/package.json +84 -86
- package/dist/adapters/aws-lambda/index.d.mts +0 -51
- package/dist/adapters/aws-lambda/index.mjs +0 -39
- package/dist/adapters/crossws/index.d.mts +0 -63
- package/dist/adapters/crossws/index.mjs +0 -68
- package/dist/adapters/fastify/index.d.mts +0 -42
- package/dist/adapters/fastify/index.mjs +0 -39
- package/dist/adapters/fetch/index.d.mts +0 -47
- package/dist/adapters/fetch/index.mjs +0 -42
- package/dist/adapters/message-port/index.mjs +0 -87
- package/dist/adapters/node/index.d.mts +0 -44
- package/dist/adapters/node/index.mjs +0 -41
- package/dist/adapters/standard/index.d.mts +0 -95
- package/dist/adapters/standard/index.mjs +0 -8
- package/dist/adapters/standard-peer/index.d.mts +0 -11
- package/dist/adapters/standard-peer/index.mjs +0 -10
- package/dist/adapters/websocket/index.mjs +0 -87
- package/dist/extensions/callable.d.mts +0 -10
- package/dist/extensions/callable.mjs +0 -11
- package/dist/helpers/index.d.mts +0 -167
- package/dist/helpers/index.mjs +0 -200
- package/dist/index.d.mts +0 -476
- package/dist/index.mjs +0 -463
- package/dist/plugins/index.d.mts +0 -432
- package/dist/plugins/index.mjs +0 -965
- package/dist/shared/server.1ExWFMze.mjs +0 -69
- package/dist/shared/server.9B1jEm5a.d.mts +0 -105
- package/dist/shared/server.BB464y-6.mjs +0 -207
- package/dist/shared/server.BC5BIu02.d.mts +0 -73
- package/dist/shared/server.BSYGskId.d.ts +0 -14
- package/dist/shared/server.BvG3boBj.d.mts +0 -14
- package/dist/shared/server.CTV_mC2P.d.mts +0 -34
- package/dist/shared/server.CYbIpHbH.mjs +0 -239
- package/dist/shared/server.Chq5FpXf.mjs +0 -353
- package/dist/shared/server.DFPxP2v3.d.mts +0 -166
- package/dist/shared/server.DFPxP2v3.d.ts +0 -166
- package/dist/shared/server.DOg7ke6y.d.ts +0 -105
- package/dist/shared/server.W91HSRkE.mjs +0 -9
- package/dist/shared/server.sBQSgqK3.mjs +0 -41
|
@@ -1,47 +1,7 @@
|
|
|
1
|
-
export {
|
|
2
|
-
import { MaybeOptionalOptions } from '@orpc/shared';
|
|
3
|
-
import { ToFetchResponseOptions } from '@standard-server/fetch';
|
|
4
|
-
import { Context } from '../../index.js';
|
|
5
|
-
import { StandardHandler, StandardHandlerOptions } from '../standard/index.js';
|
|
6
|
-
import { FriendlyStandardHandlerHandleOptions } from '../standard/index.js';
|
|
7
|
-
import { Router } from '../../index.js';
|
|
8
|
-
import { RPCHandlerCodecOptions } from '../standard/index.js';
|
|
9
|
-
import '@orpc/client';
|
|
10
|
-
import '@orpc/contract';
|
|
11
|
-
import '@standard-server/core';
|
|
12
|
-
|
|
13
|
-
type FetchHandlerHandleResult = {
|
|
14
|
-
matched: true;
|
|
15
|
-
response: Response;
|
|
16
|
-
} | {
|
|
17
|
-
matched: false;
|
|
18
|
-
response?: undefined;
|
|
19
|
-
};
|
|
20
|
-
interface FetchHandlerOptions<_T extends Context> {
|
|
21
|
-
/**
|
|
22
|
-
* Options for how to convert the Fetch Response to a Standard Response, like event stream options, etc.
|
|
23
|
-
*/
|
|
24
|
-
toFetchResponse?: ToFetchResponseOptions | undefined;
|
|
25
|
-
}
|
|
26
|
-
declare class FetchHandler<T extends Context> {
|
|
27
|
-
private readonly standardHandler;
|
|
28
|
-
private readonly toFetchResponseOptions;
|
|
29
|
-
constructor(standardHandler: StandardHandler<T>, options?: NoInfer<FetchHandlerOptions<T>>);
|
|
30
|
-
handle(request: Request, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<FetchHandlerHandleResult>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
interface RPCHandlerOptions<T extends Context> extends FetchHandlerOptions<T>, StandardHandlerOptions<T>, RPCHandlerCodecOptions<T> {
|
|
34
|
-
}
|
|
1
|
+
export {
|
|
35
2
|
/**
|
|
36
|
-
*
|
|
37
|
-
* (Request/Response), supported by modern runtimes like Deno, Bun,
|
|
38
|
-
* Cloudflare Workers, and browsers.
|
|
39
|
-
*
|
|
40
|
-
* @see {@link https://orpc.dev/docs/adapters/fetch-api | Fetch API Adapter}
|
|
3
|
+
* @deprecated Use `RequestLimitHandlerPlugin` from `@orpc/server/plugins` instead.
|
|
41
4
|
*/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
export { FetchHandler, RPCHandler };
|
|
47
|
-
export type { FetchHandlerHandleResult, FetchHandlerOptions, RPCHandlerOptions };
|
|
5
|
+
RequestLimitHandlerPlugin as BodyLimitPlugin, } from '../../plugins/request-limit.ts';
|
|
6
|
+
export * from './handler.ts';
|
|
7
|
+
export * from './rpc-handler.ts';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Context } from '../../context.ts';
|
|
2
|
+
import type { Router } from '../../router.ts';
|
|
3
|
+
import type { RPCHandlerCodecOptions, StandardHandlerOptions } from '../standard/index.ts';
|
|
4
|
+
import type { FetchHandlerOptions } from './handler.ts';
|
|
5
|
+
import { FetchHandler } from './handler.ts';
|
|
6
|
+
export interface RPCHandlerOptions<T extends Context> extends FetchHandlerOptions<T>, StandardHandlerOptions<T>, RPCHandlerCodecOptions<T> {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Serves an oRPC router over the RPC protocol using the Fetch API
|
|
10
|
+
* (Request/Response), supported by modern runtimes like Deno, Bun,
|
|
11
|
+
* Cloudflare Workers, and browsers.
|
|
12
|
+
*
|
|
13
|
+
* @see {@link https://orpc.dev/docs/adapters/fetch-api | Fetch API Adapter}
|
|
14
|
+
*/
|
|
15
|
+
export declare class RPCHandler<T extends Context> extends FetchHandler<T> {
|
|
16
|
+
constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RPCHandlerCodec, StandardHandler } from '../standard/index.js';
|
|
2
|
+
import { FetchHandler } from './handler.js';
|
|
3
|
+
/**
|
|
4
|
+
* Serves an oRPC router over the RPC protocol using the Fetch API
|
|
5
|
+
* (Request/Response), supported by modern runtimes like Deno, Bun,
|
|
6
|
+
* Cloudflare Workers, and browsers.
|
|
7
|
+
*
|
|
8
|
+
* @see {@link https://orpc.dev/docs/adapters/fetch-api | Fetch API Adapter}
|
|
9
|
+
*/
|
|
10
|
+
export class RPCHandler extends FetchHandler {
|
|
11
|
+
constructor(router, options = {}) {
|
|
12
|
+
const codec = new RPCHandlerCodec(router, options);
|
|
13
|
+
const handler = new StandardHandler(codec, options);
|
|
14
|
+
super(handler, options);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
import { SupportedMessagePort } from '@orpc/client/message-port';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { FriendlyStandardHandlerHandleOptions } from '../standard/index.
|
|
7
|
-
import { Router } from '../../index.mjs';
|
|
8
|
-
import { RPCHandlerCodecOptions } from '../standard/index.mjs';
|
|
9
|
-
import '@orpc/client';
|
|
10
|
-
import '@orpc/contract';
|
|
11
|
-
import '@standard-server/core';
|
|
12
|
-
|
|
1
|
+
import type { SupportedMessagePort } from '@orpc/client/message-port';
|
|
2
|
+
import type { MaybeOptionalOptions, Promisable, Value } from '@orpc/shared';
|
|
3
|
+
import type { DecodePeerMessageOptions, EncodePeerMessageOptions } from '@standard-server/peer';
|
|
4
|
+
import { ServerPeer } from '@standard-server/peer';
|
|
5
|
+
import type { Context } from '../../context.ts';
|
|
6
|
+
import type { FriendlyStandardHandlerHandleOptions, StandardHandler } from '../standard/index.ts';
|
|
13
7
|
type DecodedResponseMessage = ConstructorParameters<typeof ServerPeer>[0] extends (message: infer TMessage) => unknown ? TMessage : never;
|
|
14
|
-
interface MessagePortHandlerOptions<_T extends Context> {
|
|
8
|
+
export interface MessagePortHandlerOptions<_T extends Context> {
|
|
15
9
|
/**
|
|
16
10
|
* By default, oRPC encodes peer messages as strings or binary data before sending them over the message port.
|
|
17
11
|
* Use this option to bypass encoding and leverage the full capabilities of the
|
|
@@ -22,7 +16,10 @@ interface MessagePortHandlerOptions<_T extends Context> {
|
|
|
22
16
|
* **Note**: Returning `null` or `undefined` disables this feature.
|
|
23
17
|
* **Warning**: Ensure your message port implementation supports `transferable` objects before enabling this.
|
|
24
18
|
*/
|
|
25
|
-
experimental_transfer?: Value<Promisable<object[] | null | undefined>, [
|
|
19
|
+
experimental_transfer?: Value<Promisable<object[] | null | undefined>, [
|
|
20
|
+
message: DecodedResponseMessage,
|
|
21
|
+
port: SupportedMessagePort
|
|
22
|
+
]> | undefined;
|
|
26
23
|
/**
|
|
27
24
|
* Options for encoding peer messages. such as `prefix` for distinguishing messages on the same channel..
|
|
28
25
|
*/
|
|
@@ -32,8 +29,11 @@ interface MessagePortHandlerOptions<_T extends Context> {
|
|
|
32
29
|
*/
|
|
33
30
|
decodePeerMessage?: DecodePeerMessageOptions | undefined;
|
|
34
31
|
}
|
|
35
|
-
declare class MessagePortHandler<T extends Context> {
|
|
32
|
+
export declare class MessagePortHandler<T extends Context> {
|
|
36
33
|
private readonly handler;
|
|
34
|
+
/**
|
|
35
|
+
* `null` marks a closed port, so late messages never create a new peer.
|
|
36
|
+
*/
|
|
37
37
|
private readonly peers;
|
|
38
38
|
private readonly transfer;
|
|
39
39
|
private readonly encodePeerMessageOptions;
|
|
@@ -55,23 +55,10 @@ declare class MessagePortHandler<T extends Context> {
|
|
|
55
55
|
}>;
|
|
56
56
|
/**
|
|
57
57
|
* Cleans up peer state for a closed message port.
|
|
58
|
+
* Messages passed to `.message()` for this port afterwards are ignored.
|
|
58
59
|
*
|
|
59
60
|
* @param port The same message port instance passed to `.message()`.
|
|
60
61
|
*/
|
|
61
62
|
close(port: SupportedMessagePort): Promise<void>;
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
-
interface RPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T>, RPCHandlerCodecOptions<T>, MessagePortHandlerOptions<T> {
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Serves an oRPC router over the RPC protocol on a message port,
|
|
68
|
-
* such as browser extensions, Electron, or worker threads.
|
|
69
|
-
*
|
|
70
|
-
* @see {@link https://orpc.dev/docs/adapters/message-port | Message Port Adapter}
|
|
71
|
-
*/
|
|
72
|
-
declare class RPCHandler<T extends Context> extends MessagePortHandler<T> {
|
|
73
|
-
constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export { MessagePortHandler, RPCHandler };
|
|
77
|
-
export type { MessagePortHandlerOptions, RPCHandlerOptions };
|
|
64
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { onMessagePortClose, onMessagePortMessage, postMessagePortMessage, } from '@orpc/client/message-port';
|
|
2
|
+
import { resolveMaybeOptionalOptions, value } from '@orpc/shared';
|
|
3
|
+
import { decodePeerMessage, encodePeerMessage, isClientPeerSendMessage, isPeerMessage, ServerPeer, } from '@standard-server/peer';
|
|
4
|
+
import { createStandardPeerRequestHandler } from '../standard-peer/index.js';
|
|
5
|
+
export class MessagePortHandler {
|
|
6
|
+
handler;
|
|
7
|
+
/**
|
|
8
|
+
* `null` marks a closed port, so late messages never create a new peer.
|
|
9
|
+
*/
|
|
10
|
+
peers = new WeakMap();
|
|
11
|
+
transfer;
|
|
12
|
+
encodePeerMessageOptions;
|
|
13
|
+
decodePeerMessageOptions;
|
|
14
|
+
constructor(handler, options = {}) {
|
|
15
|
+
this.handler = handler;
|
|
16
|
+
this.transfer = options.experimental_transfer;
|
|
17
|
+
this.encodePeerMessageOptions = options.encodePeerMessage;
|
|
18
|
+
this.decodePeerMessageOptions = options.decodePeerMessage;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Attaches message and close listeners to a message port.
|
|
22
|
+
*
|
|
23
|
+
* Prefer this over calling `.message()` and `.close()` manually.
|
|
24
|
+
*/
|
|
25
|
+
upgrade(port, ...rest) {
|
|
26
|
+
/**
|
|
27
|
+
* Message order is important: loading -> decode -> .message.
|
|
28
|
+
* This flow must stay synchronous, or we need to use `sequential` helper
|
|
29
|
+
*/
|
|
30
|
+
onMessagePortMessage(port, (message) => this.message(port, message, ...rest));
|
|
31
|
+
onMessagePortClose(port, () => this.close(port));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Handles a single message received from a message port.
|
|
35
|
+
*
|
|
36
|
+
* @param port The message port instance. Use the same instance for all messages.
|
|
37
|
+
*/
|
|
38
|
+
async message(port, data, ...rest) {
|
|
39
|
+
let peerMessage;
|
|
40
|
+
if (typeof data === 'string' || data instanceof Uint8Array) {
|
|
41
|
+
// MessagePort receives the exact payload sent, and `encodePeerMessage` only returns string or Uint8Array.
|
|
42
|
+
const result = decodePeerMessage(data, this.decodePeerMessageOptions);
|
|
43
|
+
if (result.matched && isClientPeerSendMessage(result.message)) {
|
|
44
|
+
peerMessage = result.message;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (isPeerMessage(data) && isClientPeerSendMessage(data)) {
|
|
48
|
+
peerMessage = data;
|
|
49
|
+
}
|
|
50
|
+
if (peerMessage === undefined) {
|
|
51
|
+
return { matched: false };
|
|
52
|
+
}
|
|
53
|
+
let peer = this.peers.get(port);
|
|
54
|
+
if (peer === null) {
|
|
55
|
+
return { matched: true };
|
|
56
|
+
}
|
|
57
|
+
if (!peer) {
|
|
58
|
+
this.peers.set(port, (peer = new ServerPeer(async (message) => {
|
|
59
|
+
const transfer = await value(this.transfer, message, port);
|
|
60
|
+
if (transfer) {
|
|
61
|
+
postMessagePortMessage(port, message, transfer);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
postMessagePortMessage(port, await encodePeerMessage(message, this.encodePeerMessageOptions));
|
|
65
|
+
}
|
|
66
|
+
})));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Message order is important: loading -> decode -> .message.
|
|
70
|
+
* This flow must stay synchronous, or we need to use `sequential` helper
|
|
71
|
+
*/
|
|
72
|
+
await peer.message(peerMessage, createStandardPeerRequestHandler(this.handler, resolveMaybeOptionalOptions(rest)));
|
|
73
|
+
return { matched: true };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Cleans up peer state for a closed message port.
|
|
77
|
+
* Messages passed to `.message()` for this port afterwards are ignored.
|
|
78
|
+
*
|
|
79
|
+
* @param port The same message port instance passed to `.message()`.
|
|
80
|
+
*/
|
|
81
|
+
async close(port) {
|
|
82
|
+
const peer = this.peers.get(port);
|
|
83
|
+
this.peers.set(port, null);
|
|
84
|
+
await peer?.close();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -1,77 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { ServerPeer, EncodePeerMessageOptions, DecodePeerMessageOptions } from '@standard-server/peer';
|
|
4
|
-
import { Context } from '../../index.js';
|
|
5
|
-
import { StandardHandler, StandardHandlerOptions } from '../standard/index.js';
|
|
6
|
-
import { FriendlyStandardHandlerHandleOptions } from '../standard/index.js';
|
|
7
|
-
import { Router } from '../../index.js';
|
|
8
|
-
import { RPCHandlerCodecOptions } from '../standard/index.js';
|
|
9
|
-
import '@orpc/client';
|
|
10
|
-
import '@orpc/contract';
|
|
11
|
-
import '@standard-server/core';
|
|
12
|
-
|
|
13
|
-
type DecodedResponseMessage = ConstructorParameters<typeof ServerPeer>[0] extends (message: infer TMessage) => unknown ? TMessage : never;
|
|
14
|
-
interface MessagePortHandlerOptions<_T extends Context> {
|
|
15
|
-
/**
|
|
16
|
-
* By default, oRPC encodes peer messages as strings or binary data before sending them over the message port.
|
|
17
|
-
* Use this option to bypass encoding and leverage the full capabilities of the
|
|
18
|
-
* [MessagePort: postMessage() method](https://developer.mozilla.org/en-US/docs/Web/API/MessagePort/postMessage),
|
|
19
|
-
* such as transferring object ownership or supporting non-serializable objects like `OffscreenCanvas` or improving performance.
|
|
20
|
-
*
|
|
21
|
-
* @remarks
|
|
22
|
-
* **Note**: Returning `null` or `undefined` disables this feature.
|
|
23
|
-
* **Warning**: Ensure your message port implementation supports `transferable` objects before enabling this.
|
|
24
|
-
*/
|
|
25
|
-
experimental_transfer?: Value<Promisable<object[] | null | undefined>, [message: DecodedResponseMessage, port: SupportedMessagePort]> | undefined;
|
|
26
|
-
/**
|
|
27
|
-
* Options for encoding peer messages. such as `prefix` for distinguishing messages on the same channel..
|
|
28
|
-
*/
|
|
29
|
-
encodePeerMessage?: EncodePeerMessageOptions | undefined;
|
|
30
|
-
/**
|
|
31
|
-
* Options for decoding peer messages. such as `prefix` for distinguishing messages on the same channel..
|
|
32
|
-
*/
|
|
33
|
-
decodePeerMessage?: DecodePeerMessageOptions | undefined;
|
|
34
|
-
}
|
|
35
|
-
declare class MessagePortHandler<T extends Context> {
|
|
36
|
-
private readonly handler;
|
|
37
|
-
private readonly peers;
|
|
38
|
-
private readonly transfer;
|
|
39
|
-
private readonly encodePeerMessageOptions;
|
|
40
|
-
private readonly decodePeerMessageOptions;
|
|
41
|
-
constructor(handler: StandardHandler<T>, options?: NoInfer<MessagePortHandlerOptions<T>>);
|
|
42
|
-
/**
|
|
43
|
-
* Attaches message and close listeners to a message port.
|
|
44
|
-
*
|
|
45
|
-
* Prefer this over calling `.message()` and `.close()` manually.
|
|
46
|
-
*/
|
|
47
|
-
upgrade(port: SupportedMessagePort, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): void;
|
|
48
|
-
/**
|
|
49
|
-
* Handles a single message received from a message port.
|
|
50
|
-
*
|
|
51
|
-
* @param port The message port instance. Use the same instance for all messages.
|
|
52
|
-
*/
|
|
53
|
-
message(port: SupportedMessagePort, data: unknown, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<{
|
|
54
|
-
matched: boolean;
|
|
55
|
-
}>;
|
|
56
|
-
/**
|
|
57
|
-
* Cleans up peer state for a closed message port.
|
|
58
|
-
*
|
|
59
|
-
* @param port The same message port instance passed to `.message()`.
|
|
60
|
-
*/
|
|
61
|
-
close(port: SupportedMessagePort): Promise<void>;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
interface RPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T>, RPCHandlerCodecOptions<T>, MessagePortHandlerOptions<T> {
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Serves an oRPC router over the RPC protocol on a message port,
|
|
68
|
-
* such as browser extensions, Electron, or worker threads.
|
|
69
|
-
*
|
|
70
|
-
* @see {@link https://orpc.dev/docs/adapters/message-port | Message Port Adapter}
|
|
71
|
-
*/
|
|
72
|
-
declare class RPCHandler<T extends Context> extends MessagePortHandler<T> {
|
|
73
|
-
constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export { MessagePortHandler, RPCHandler };
|
|
77
|
-
export type { MessagePortHandlerOptions, RPCHandlerOptions };
|
|
1
|
+
export * from './handler.ts';
|
|
2
|
+
export * from './rpc-handler.ts';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Context } from '../../context.ts';
|
|
2
|
+
import type { Router } from '../../router.ts';
|
|
3
|
+
import type { RPCHandlerCodecOptions, StandardHandlerOptions } from '../standard/index.ts';
|
|
4
|
+
import type { MessagePortHandlerOptions } from './handler.ts';
|
|
5
|
+
import { MessagePortHandler } from './handler.ts';
|
|
6
|
+
export interface RPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T>, RPCHandlerCodecOptions<T>, MessagePortHandlerOptions<T> {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Serves an oRPC router over the RPC protocol on a message port,
|
|
10
|
+
* such as browser extensions, Electron, or worker threads.
|
|
11
|
+
*
|
|
12
|
+
* @see {@link https://orpc.dev/docs/adapters/message-port | Message Port Adapter}
|
|
13
|
+
*/
|
|
14
|
+
export declare class RPCHandler<T extends Context> extends MessagePortHandler<T> {
|
|
15
|
+
constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RPCHandlerCodec, StandardHandler } from '../standard/index.js';
|
|
2
|
+
import { MessagePortHandler } from './handler.js';
|
|
3
|
+
/**
|
|
4
|
+
* Serves an oRPC router over the RPC protocol on a message port,
|
|
5
|
+
* such as browser extensions, Electron, or worker threads.
|
|
6
|
+
*
|
|
7
|
+
* @see {@link https://orpc.dev/docs/adapters/message-port | Message Port Adapter}
|
|
8
|
+
*/
|
|
9
|
+
export class RPCHandler extends MessagePortHandler {
|
|
10
|
+
constructor(router, options = {}) {
|
|
11
|
+
const codec = new RPCHandlerCodec(router, options);
|
|
12
|
+
const handler = new StandardHandler(codec, options);
|
|
13
|
+
super(handler, options);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MaybeOptionalOptions } from '@orpc/shared';
|
|
2
|
+
import type { NodeHttpRequest, NodeHttpResponse, SendStandardResponseOptions } from '@standard-server/node';
|
|
3
|
+
import type { Context } from '../../context.ts';
|
|
4
|
+
import type { FriendlyStandardHandlerHandleOptions, StandardHandler } from '../standard/index.ts';
|
|
5
|
+
export type NodeHttpHandlerHandleResult = {
|
|
6
|
+
matched: true;
|
|
7
|
+
} | {
|
|
8
|
+
matched: false;
|
|
9
|
+
};
|
|
10
|
+
export interface NodeHttpHandlerOptions<_T extends Context> {
|
|
11
|
+
/**
|
|
12
|
+
* Custom options for `sendStandardResponse`, used to send a `Standard Response`
|
|
13
|
+
*/
|
|
14
|
+
sendStandardResponse?: SendStandardResponseOptions | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare class NodeHttpHandler<T extends Context> {
|
|
17
|
+
private readonly standardHandler;
|
|
18
|
+
private readonly sendStandardResponseOptions;
|
|
19
|
+
constructor(standardHandler: StandardHandler<T>, options?: NoInfer<NodeHttpHandlerOptions<T>>);
|
|
20
|
+
handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<NodeHttpHandlerHandleResult>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { resolveMaybeOptionalOptions } from '@orpc/shared';
|
|
2
|
+
import { sendStandardResponse, toStandardLazyRequest } from '@standard-server/node';
|
|
3
|
+
import { resolveFriendlyStandardHandlerHandleOptions } from '../standard/index.js';
|
|
4
|
+
export class NodeHttpHandler {
|
|
5
|
+
standardHandler;
|
|
6
|
+
sendStandardResponseOptions;
|
|
7
|
+
constructor(standardHandler, options = {}) {
|
|
8
|
+
this.standardHandler = standardHandler;
|
|
9
|
+
this.sendStandardResponseOptions = options.sendStandardResponse;
|
|
10
|
+
}
|
|
11
|
+
async handle(request, response, ...rest) {
|
|
12
|
+
const standardRequest = toStandardLazyRequest(request, response);
|
|
13
|
+
const result = await this.standardHandler.handle(standardRequest, resolveFriendlyStandardHandlerHandleOptions(resolveMaybeOptionalOptions(rest)));
|
|
14
|
+
if (!result.matched) {
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
await sendStandardResponse(response, result.response, this.sendStandardResponseOptions);
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -1,44 +1,7 @@
|
|
|
1
|
-
export {
|
|
2
|
-
import { MaybeOptionalOptions } from '@orpc/shared';
|
|
3
|
-
import { SendStandardResponseOptions, NodeHttpRequest, NodeHttpResponse } from '@standard-server/node';
|
|
4
|
-
import { Context } from '../../index.js';
|
|
5
|
-
import { StandardHandler, StandardHandlerOptions } from '../standard/index.js';
|
|
6
|
-
import { FriendlyStandardHandlerHandleOptions } from '../standard/index.js';
|
|
7
|
-
import { Router } from '../../index.js';
|
|
8
|
-
import { RPCHandlerCodecOptions } from '../standard/index.js';
|
|
9
|
-
import '@orpc/client';
|
|
10
|
-
import '@orpc/contract';
|
|
11
|
-
import '@standard-server/core';
|
|
12
|
-
|
|
13
|
-
type NodeHttpHandlerHandleResult = {
|
|
14
|
-
matched: true;
|
|
15
|
-
} | {
|
|
16
|
-
matched: false;
|
|
17
|
-
};
|
|
18
|
-
interface NodeHttpHandlerOptions<_T extends Context> {
|
|
19
|
-
/**
|
|
20
|
-
* Custom options for `sendStandardResponse`, used to send a `Standard Response`
|
|
21
|
-
*/
|
|
22
|
-
sendStandardResponse?: SendStandardResponseOptions | undefined;
|
|
23
|
-
}
|
|
24
|
-
declare class NodeHttpHandler<T extends Context> {
|
|
25
|
-
private readonly standardHandler;
|
|
26
|
-
private readonly sendStandardResponseOptions;
|
|
27
|
-
constructor(standardHandler: StandardHandler<T>, options?: NoInfer<NodeHttpHandlerOptions<T>>);
|
|
28
|
-
handle(request: NodeHttpRequest, response: NodeHttpResponse, ...rest: MaybeOptionalOptions<FriendlyStandardHandlerHandleOptions<T>>): Promise<NodeHttpHandlerHandleResult>;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
interface RPCHandlerOptions<T extends Context> extends NodeHttpHandlerOptions<T>, StandardHandlerOptions<T>, RPCHandlerCodecOptions<T> {
|
|
32
|
-
}
|
|
1
|
+
export {
|
|
33
2
|
/**
|
|
34
|
-
*
|
|
35
|
-
* HTTP request/response objects.
|
|
36
|
-
*
|
|
37
|
-
* @see {@link https://orpc.dev/docs/adapters/node-http | Node HTTP Adapter}
|
|
3
|
+
* @deprecated Use `RequestLimitHandlerPlugin` from `@orpc/server/plugins` instead.
|
|
38
4
|
*/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export { NodeHttpHandler, RPCHandler };
|
|
44
|
-
export type { NodeHttpHandlerHandleResult, NodeHttpHandlerOptions, RPCHandlerOptions };
|
|
5
|
+
RequestLimitHandlerPlugin as BodyLimitPlugin, } from '../../plugins/request-limit.ts';
|
|
6
|
+
export * from './handler.ts';
|
|
7
|
+
export * from './rpc-handler.ts';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Context } from '../../context.ts';
|
|
2
|
+
import type { Router } from '../../router.ts';
|
|
3
|
+
import type { RPCHandlerCodecOptions, StandardHandlerOptions } from '../standard/index.ts';
|
|
4
|
+
import type { NodeHttpHandlerOptions } from './handler.ts';
|
|
5
|
+
import { NodeHttpHandler } from './handler.ts';
|
|
6
|
+
export interface RPCHandlerOptions<T extends Context> extends NodeHttpHandlerOptions<T>, StandardHandlerOptions<T>, RPCHandlerCodecOptions<T> {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Serves an oRPC router over the RPC protocol using Node.js built-in
|
|
10
|
+
* HTTP request/response objects.
|
|
11
|
+
*
|
|
12
|
+
* @see {@link https://orpc.dev/docs/adapters/node-http | Node HTTP Adapter}
|
|
13
|
+
*/
|
|
14
|
+
export declare class RPCHandler<T extends Context> extends NodeHttpHandler<T> {
|
|
15
|
+
constructor(router: Router<T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RPCHandlerCodec, StandardHandler } from '../standard/index.js';
|
|
2
|
+
import { NodeHttpHandler } from './handler.js';
|
|
3
|
+
/**
|
|
4
|
+
* Serves an oRPC router over the RPC protocol using Node.js built-in
|
|
5
|
+
* HTTP request/response objects.
|
|
6
|
+
*
|
|
7
|
+
* @see {@link https://orpc.dev/docs/adapters/node-http | Node HTTP Adapter}
|
|
8
|
+
*/
|
|
9
|
+
export class RPCHandler extends NodeHttpHandler {
|
|
10
|
+
constructor(router, options = {}) {
|
|
11
|
+
const codec = new RPCHandlerCodec(router, options);
|
|
12
|
+
const handler = new StandardHandler(codec, options);
|
|
13
|
+
super(handler, options);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AnyORPCError } from '@orpc/client';
|
|
2
|
+
import type { Promisable } from '@orpc/shared';
|
|
3
|
+
import type { StandardLazyRequest, StandardResponse } from '@standard-server/core';
|
|
4
|
+
import type { Context } from '../../context.ts';
|
|
5
|
+
import type { AnyProcedure } from '../../procedure.ts';
|
|
6
|
+
import type { ResolvedStandardHandlerHandleOptions } from './handler.ts';
|
|
7
|
+
export interface StandardHandlerCodecResolvedProcedure {
|
|
8
|
+
path: string[];
|
|
9
|
+
procedure: AnyProcedure;
|
|
10
|
+
decodeInput: () => Promise<unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface StandardHandlerCodec<T extends Context> {
|
|
13
|
+
resolveProcedure(request: StandardLazyRequest, options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardHandlerCodecResolvedProcedure | undefined>;
|
|
14
|
+
encodeOutput(output: unknown, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
|
|
15
|
+
encodeError(error: AnyORPCError, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ErrorMap, Schema } from '@orpc/contract';
|
|
2
|
+
import type { Interceptor, Promisable, Value } from '@orpc/shared';
|
|
3
|
+
import type { StandardLazyRequest, StandardResponse } from '@standard-server/core';
|
|
4
|
+
import type { Context } from '../../context.ts';
|
|
5
|
+
import type { ProcedureClientInterceptor } from '../../procedure-client.ts';
|
|
6
|
+
import type { StandardHandlerCodec, StandardHandlerCodecResolvedProcedure } from './codec.ts';
|
|
7
|
+
import type { StandardHandlerPlugin } from './plugin.ts';
|
|
8
|
+
export interface StandardHandlerHandleOptions<T extends Context> {
|
|
9
|
+
prefix?: `/${string}` | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* The initial context, or a function (sync or async) that receives the request and returns it.
|
|
12
|
+
* The function only runs once the request passes the prefix check.
|
|
13
|
+
*/
|
|
14
|
+
context: Value<Promisable<T>, [request: StandardLazyRequest]>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* `StandardHandlerHandleOptions` after the context has been resolved,
|
|
18
|
+
* this is what interceptors and codecs receive.
|
|
19
|
+
*/
|
|
20
|
+
export interface ResolvedStandardHandlerHandleOptions<T extends Context> extends Omit<StandardHandlerHandleOptions<T>, 'context'> {
|
|
21
|
+
context: T;
|
|
22
|
+
}
|
|
23
|
+
export type StandardHandlerHandleResult = {
|
|
24
|
+
matched: true;
|
|
25
|
+
response: StandardResponse;
|
|
26
|
+
} | {
|
|
27
|
+
matched: false;
|
|
28
|
+
response?: undefined;
|
|
29
|
+
};
|
|
30
|
+
export interface StandardHandlerInterceptorOptions<T extends Context> extends StandardHandlerCodecResolvedProcedure, ResolvedStandardHandlerHandleOptions<T> {
|
|
31
|
+
request: StandardLazyRequest;
|
|
32
|
+
}
|
|
33
|
+
export type StandardHandlerInterceptor<T extends Context> = Interceptor<StandardHandlerInterceptorOptions<T>, Promise<StandardResponse>>;
|
|
34
|
+
export interface StandardHandlerRoutingInterceptorOptions<T extends Context> extends ResolvedStandardHandlerHandleOptions<T> {
|
|
35
|
+
request: StandardLazyRequest;
|
|
36
|
+
}
|
|
37
|
+
export type StandardHandlerRoutingInterceptor<T extends Context> = Interceptor<StandardHandlerRoutingInterceptorOptions<T>, Promise<StandardHandlerHandleResult>>;
|
|
38
|
+
export interface StandardHandlerOptions<TContext extends Context> {
|
|
39
|
+
/**
|
|
40
|
+
* Fired on every request before routing, useful when you want
|
|
41
|
+
* to intercept all requests regardless of whether they match a procedure or not.
|
|
42
|
+
*
|
|
43
|
+
* @examples
|
|
44
|
+
* - batch plugins - separate one request into multiple and call multiple next
|
|
45
|
+
* - openapi spec plugin - to intercept a request and early response
|
|
46
|
+
*/
|
|
47
|
+
routingInterceptors?: StandardHandlerRoutingInterceptor<TContext>[] | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* interceptor run after routing and before error handler,
|
|
50
|
+
* useful for error handling, logging, metrics, etc.
|
|
51
|
+
*/
|
|
52
|
+
interceptors?: StandardHandlerInterceptor<TContext>[] | undefined;
|
|
53
|
+
/**
|
|
54
|
+
*
|
|
55
|
+
* ClientInterceptor equivalent with createRouterClient.interceptors / createProcedure.interceptors
|
|
56
|
+
* useful for error handling, logging, metrics, etc. (not counting encoding/decoding)
|
|
57
|
+
*/
|
|
58
|
+
clientInterceptors?: ProcedureClientInterceptor<TContext, Schema<unknown>, ErrorMap>[] | undefined;
|
|
59
|
+
plugins?: StandardHandlerPlugin<TContext>[] | undefined;
|
|
60
|
+
}
|
|
61
|
+
export declare class StandardHandler<T extends Context> {
|
|
62
|
+
private readonly codec;
|
|
63
|
+
private readonly routingInterceptors;
|
|
64
|
+
private readonly interceptors;
|
|
65
|
+
private readonly clientInterceptors;
|
|
66
|
+
constructor(codec: StandardHandlerCodec<T>, options: StandardHandlerOptions<T>);
|
|
67
|
+
handle(request: StandardLazyRequest, options: StandardHandlerHandleOptions<T>): Promise<StandardHandlerHandleResult>;
|
|
68
|
+
}
|