@orpc/server 2.0.0-beta.48 → 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 +4 -4
- 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 +16 -0
- 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 -0
- 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 -0
- 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 +7 -0
- 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/handler.d.ts +64 -0
- package/dist/adapters/message-port/handler.js +86 -0
- package/dist/adapters/message-port/index.d.ts +2 -0
- 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 +7 -0
- 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/handler.d.ts +68 -0
- package/dist/adapters/standard/handler.js +205 -0
- package/dist/adapters/standard/index.d.ts +6 -0
- 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 -0
- package/dist/adapters/standard-peer/index.js +1 -0
- package/dist/adapters/standard-peer/{utils.d.mts → utils.d.ts} +3 -3
- package/dist/adapters/standard-peer/utils.js +7 -0
- package/dist/adapters/websocket/handler.d.ts +59 -0
- package/dist/adapters/websocket/handler.js +85 -0
- package/dist/adapters/websocket/index.d.ts +2 -0
- 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.d.ts +127 -0
- package/dist/builder.js +226 -0
- package/dist/context.d.ts +6 -0
- package/dist/extensions/callable.d.ts +11 -0
- 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 -0
- 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 +61 -0
- 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/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 +39 -0
- 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/plugins/request-limit.d.ts +30 -0
- 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.mts → router-hidden.d.ts} +3 -3
- package/dist/router-hidden.js +14 -0
- package/dist/router-utils.d.ts +48 -0
- package/dist/router-utils.js +202 -0
- package/dist/router.d.ts +72 -0
- package/package.json +84 -86
- package/dist/adapters/aws-lambda/handler.d.mts +0 -25
- package/dist/adapters/aws-lambda/handler.mjs +0 -21
- package/dist/adapters/aws-lambda/index.d.mts +0 -16
- package/dist/adapters/aws-lambda/index.mjs +0 -2
- package/dist/adapters/aws-lambda/rpc-handler.d.mts +0 -18
- package/dist/adapters/aws-lambda/rpc-handler.mjs +0 -10
- package/dist/adapters/crossws/handler.d.mts +0 -41
- package/dist/adapters/crossws/handler.mjs +0 -38
- package/dist/adapters/crossws/index.d.mts +0 -2
- package/dist/adapters/crossws/index.mjs +0 -2
- package/dist/adapters/crossws/rpc-handler.d.mts +0 -15
- package/dist/adapters/crossws/rpc-handler.mjs +0 -10
- package/dist/adapters/fastify/handler.d.mts +0 -21
- package/dist/adapters/fastify/handler.mjs +0 -20
- package/dist/adapters/fastify/index.d.mts +0 -2
- package/dist/adapters/fastify/index.mjs +0 -2
- package/dist/adapters/fastify/rpc-handler.d.mts +0 -14
- package/dist/adapters/fastify/rpc-handler.mjs +0 -10
- package/dist/adapters/fetch/handler.d.mts +0 -23
- package/dist/adapters/fetch/handler.mjs +0 -22
- package/dist/adapters/fetch/index.d.mts +0 -7
- package/dist/adapters/fetch/index.mjs +0 -5
- package/dist/adapters/fetch/rpc-handler.d.mts +0 -16
- package/dist/adapters/fetch/rpc-handler.mjs +0 -10
- package/dist/adapters/message-port/handler.d.mts +0 -57
- package/dist/adapters/message-port/handler.mjs +0 -62
- package/dist/adapters/message-port/index.d.mts +0 -2
- package/dist/adapters/message-port/index.mjs +0 -2
- package/dist/adapters/message-port/rpc-handler.d.mts +0 -15
- package/dist/adapters/message-port/rpc-handler.mjs +0 -10
- package/dist/adapters/node/handler.d.mts +0 -21
- package/dist/adapters/node/handler.mjs +0 -20
- package/dist/adapters/node/index.d.mts +0 -7
- package/dist/adapters/node/index.mjs +0 -5
- package/dist/adapters/node/rpc-handler.d.mts +0 -15
- package/dist/adapters/node/rpc-handler.mjs +0 -10
- package/dist/adapters/standard/codec.d.mts +0 -16
- package/dist/adapters/standard/handler.d.mts +0 -68
- package/dist/adapters/standard/handler.mjs +0 -185
- package/dist/adapters/standard/index.d.mts +0 -6
- package/dist/adapters/standard/index.mjs +0 -5
- package/dist/adapters/standard/plugin.d.mts +0 -32
- package/dist/adapters/standard/plugin.mjs +0 -16
- package/dist/adapters/standard/rpc-handler-codec.d.mts +0 -42
- package/dist/adapters/standard/rpc-handler-codec.mjs +0 -51
- package/dist/adapters/standard/rpc-matcher.d.mts +0 -53
- package/dist/adapters/standard/rpc-matcher.mjs +0 -140
- package/dist/adapters/standard/utils.d.mts +0 -10
- package/dist/adapters/standard/utils.mjs +0 -6
- package/dist/adapters/standard-peer/index.d.mts +0 -1
- package/dist/adapters/standard-peer/index.mjs +0 -1
- package/dist/adapters/standard-peer/utils.mjs +0 -11
- package/dist/adapters/websocket/handler.d.mts +0 -55
- package/dist/adapters/websocket/handler.mjs +0 -55
- package/dist/adapters/websocket/index.d.mts +0 -2
- package/dist/adapters/websocket/index.mjs +0 -2
- package/dist/adapters/websocket/rpc-handler.d.mts +0 -15
- package/dist/adapters/websocket/rpc-handler.mjs +0 -10
- package/dist/builder-variants.d.mts +0 -267
- package/dist/builder.d.mts +0 -141
- package/dist/builder.mjs +0 -145
- package/dist/context.d.mts +0 -13
- package/dist/extensions/callable.d.mts +0 -17
- package/dist/extensions/callable.mjs +0 -7
- package/dist/helpers/base64url.d.mts +0 -31
- package/dist/helpers/base64url.mjs +0 -25
- package/dist/helpers/cookie.d.mts +0 -50
- package/dist/helpers/cookie.mjs +0 -35
- package/dist/helpers/encryption.d.mts +0 -28
- package/dist/helpers/encryption.mjs +0 -62
- package/dist/helpers/index.d.mts +0 -4
- package/dist/helpers/index.mjs +0 -4
- package/dist/helpers/signing.d.mts +0 -50
- package/dist/helpers/signing.mjs +0 -43
- package/dist/implementer-procedure.d.mts +0 -36
- package/dist/implementer-procedure.mjs +0 -38
- package/dist/implementer-router.d.mts +0 -78
- package/dist/implementer-router.mjs +0 -77
- package/dist/implementer.d.mts +0 -22
- package/dist/implementer.mjs +0 -30
- package/dist/index.d.mts +0 -57
- package/dist/index.mjs +0 -30
- package/dist/lazy.d.mts +0 -20
- package/dist/lazy.mjs +0 -22
- package/dist/middleware-decorated.d.mts +0 -27
- package/dist/middleware-decorated.mjs +0 -65
- package/dist/middleware.d.mts +0 -70
- package/dist/plugins/batch.d.mts +0 -104
- package/dist/plugins/batch.mjs +0 -373
- package/dist/plugins/cors.d.mts +0 -67
- package/dist/plugins/cors.mjs +0 -134
- package/dist/plugins/get-method-csrf-protection.d.mts +0 -23
- package/dist/plugins/get-method-csrf-protection.mjs +0 -45
- package/dist/plugins/head-method.d.mts +0 -23
- package/dist/plugins/head-method.mjs +0 -95
- package/dist/plugins/index.d.mts +0 -39
- package/dist/plugins/index.mjs +0 -23
- package/dist/plugins/method-override.d.mts +0 -38
- package/dist/plugins/method-override.mjs +0 -50
- package/dist/plugins/request-compression.d.mts +0 -16
- package/dist/plugins/request-compression.mjs +0 -67
- package/dist/plugins/request-headers.d.mts +0 -22
- package/dist/plugins/request-headers.mjs +0 -21
- package/dist/plugins/request-limit.d.mts +0 -30
- package/dist/plugins/request-limit.mjs +0 -53
- package/dist/plugins/response-compression.d.mts +0 -59
- package/dist/plugins/response-compression.mjs +0 -172
- package/dist/plugins/response-headers.d.mts +0 -30
- package/dist/plugins/response-headers.mjs +0 -34
- package/dist/plugins/rethrow.d.mts +0 -33
- package/dist/plugins/rethrow.mjs +0 -46
- package/dist/plugins/signal-sync.d.mts +0 -13
- package/dist/plugins/signal-sync.mjs +0 -84
- package/dist/plugins/timeout.d.mts +0 -37
- package/dist/plugins/timeout.mjs +0 -56
- package/dist/procedure-client.d.mts +0 -41
- package/dist/procedure-client.mjs +0 -157
- package/dist/procedure-decorated.d.mts +0 -20
- package/dist/procedure-decorated.mjs +0 -41
- package/dist/procedure-utils.d.mts +0 -52
- package/dist/procedure-utils.mjs +0 -33
- package/dist/procedure.d.mts +0 -93
- package/dist/procedure.mjs +0 -20
- package/dist/router-client.d.mts +0 -27
- package/dist/router-client.mjs +0 -35
- package/dist/router-hidden.mjs +0 -12
- package/dist/router-utils.d.mts +0 -59
- package/dist/router-utils.mjs +0 -191
- package/dist/router.d.mts +0 -61
- /package/dist/adapters/standard/{codec.mjs → codec.js} +0 -0
- /package/dist/{builder-variants.mjs → builder-variants.js} +0 -0
- /package/dist/{constants.d.mts → constants.d.ts} +0 -0
- /package/dist/{constants.mjs → constants.js} +0 -0
- /package/dist/{context.mjs → context.js} +0 -0
- /package/dist/{middleware.mjs → middleware.js} +0 -0
- /package/dist/{router.mjs → router.js} +0 -0
|
@@ -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
|
+
}
|
|
@@ -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,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
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { ORPCError, toORPCError } from '@orpc/client';
|
|
2
|
+
import { getTracer, intercept, isAsyncIteratorObject, matchesHttpPathPrefix, ORPC_NAME, override, recordSpanError, runWithSpan, toArray, toTracingException, traceAsyncIterator, traceReadableStream, value, wrapAsyncIterator, wrapReadableStream, } from '@orpc/shared';
|
|
3
|
+
import { EventStreamErrorEvent, flattenStandardHeader, parseStandardUrl, } from '@standard-server/core';
|
|
4
|
+
import { createProcedureClient } from '../../procedure-client.js';
|
|
5
|
+
import { CompositeStandardHandlerPlugin } from './plugin.js';
|
|
6
|
+
export class StandardHandler {
|
|
7
|
+
codec;
|
|
8
|
+
routingInterceptors;
|
|
9
|
+
interceptors;
|
|
10
|
+
clientInterceptors;
|
|
11
|
+
constructor(codec, options) {
|
|
12
|
+
this.codec = codec;
|
|
13
|
+
options = new CompositeStandardHandlerPlugin([
|
|
14
|
+
...toArray(options.plugins),
|
|
15
|
+
new TracingHandlerPlugin(),
|
|
16
|
+
]).init(options);
|
|
17
|
+
this.routingInterceptors = options.routingInterceptors;
|
|
18
|
+
this.interceptors = options.interceptors;
|
|
19
|
+
this.clientInterceptors = options.clientInterceptors;
|
|
20
|
+
}
|
|
21
|
+
async handle(request, options) {
|
|
22
|
+
const { prefix } = options;
|
|
23
|
+
if (prefix && !matchesHttpPathPrefix(request.url, prefix)) {
|
|
24
|
+
return { matched: false, response: undefined };
|
|
25
|
+
}
|
|
26
|
+
const context = (await value(options.context, request));
|
|
27
|
+
return intercept(this.routingInterceptors, { context, prefix, request }, async ({ context, prefix, request }) => {
|
|
28
|
+
const span = getTracer()?.getActiveSpan();
|
|
29
|
+
let step;
|
|
30
|
+
const matchedOrNot = await runWithSpan('find_procedure', () => this.codec.resolveProcedure(request, { context, prefix }));
|
|
31
|
+
if (!matchedOrNot) {
|
|
32
|
+
/**
|
|
33
|
+
* [Semantic conventions for HTTP spans](https://opentelemetry.io/docs/specs/semconv/http/http-spans/)
|
|
34
|
+
*/
|
|
35
|
+
span?.updateName(`${ORPC_NAME}_no_match`);
|
|
36
|
+
span?.setAttribute('http.request.method', request.method);
|
|
37
|
+
span?.setAttribute('url.path', request.url);
|
|
38
|
+
return { matched: false };
|
|
39
|
+
}
|
|
40
|
+
const { path, procedure, decodeInput } = matchedOrNot;
|
|
41
|
+
/**
|
|
42
|
+
* [Semantic conventions for RPC spans](https://opentelemetry.io/docs/specs/semconv/rpc/rpc-spans/)
|
|
43
|
+
*/
|
|
44
|
+
span?.updateName(`${ORPC_NAME}.${path.join('/')}`);
|
|
45
|
+
span?.setAttribute('rpc.system', ORPC_NAME);
|
|
46
|
+
span?.setAttribute('rpc.method', path.join('.'));
|
|
47
|
+
try {
|
|
48
|
+
const response = await intercept(this.interceptors, { context, prefix, request, path, procedure, decodeInput }, async ({ context, prefix, request, path, procedure, decodeInput }) => {
|
|
49
|
+
step = 'decode_input';
|
|
50
|
+
let input = await runWithSpan('decode_input', decodeInput);
|
|
51
|
+
step = undefined;
|
|
52
|
+
if (getTracer() && isAsyncIteratorObject(input)) {
|
|
53
|
+
/**
|
|
54
|
+
* @warning
|
|
55
|
+
* Remember use `override` for AsyncIteratorObject to remain other special properties
|
|
56
|
+
*/
|
|
57
|
+
input = override(input, traceAsyncIterator('consume_async_iterator_object_input', input));
|
|
58
|
+
}
|
|
59
|
+
else if (getTracer() && input instanceof ReadableStream) {
|
|
60
|
+
/**
|
|
61
|
+
* @warning
|
|
62
|
+
* Remember use `override` for ReadableStream to remain other special properties
|
|
63
|
+
*/
|
|
64
|
+
input = override(input, traceReadableStream('consume_octet_stream_input', input));
|
|
65
|
+
}
|
|
66
|
+
const client = createProcedureClient(procedure, {
|
|
67
|
+
context,
|
|
68
|
+
path,
|
|
69
|
+
interceptors: this.clientInterceptors,
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* No need to use `runWithSpan` here, because the client already has its own span.
|
|
73
|
+
*/
|
|
74
|
+
step = 'call_procedure';
|
|
75
|
+
const output = await client(input, {
|
|
76
|
+
signal: request.signal,
|
|
77
|
+
lastEventId: flattenStandardHeader(request.headers['last-event-id']),
|
|
78
|
+
});
|
|
79
|
+
step = undefined;
|
|
80
|
+
const response = await this.codec.encodeOutput(output, procedure, path, {
|
|
81
|
+
context,
|
|
82
|
+
prefix,
|
|
83
|
+
});
|
|
84
|
+
return response;
|
|
85
|
+
});
|
|
86
|
+
return { matched: true, response };
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
/**
|
|
90
|
+
* Only errors that happen outside of the `call_procedure` step should be set as an error.
|
|
91
|
+
* Because a business logic error should not be considered as a protocol-level error.
|
|
92
|
+
*/
|
|
93
|
+
if (step !== 'call_procedure') {
|
|
94
|
+
recordSpanError(span, e);
|
|
95
|
+
}
|
|
96
|
+
const error = step === 'decode_input' && !(e instanceof ORPCError)
|
|
97
|
+
? new ORPCError('BAD_REQUEST', {
|
|
98
|
+
message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
|
|
99
|
+
cause: e,
|
|
100
|
+
})
|
|
101
|
+
: toORPCError(e);
|
|
102
|
+
const response = await this.codec.encodeError(error, procedure, path, { context, prefix });
|
|
103
|
+
return { matched: true, response };
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
class TracingHandlerPlugin {
|
|
109
|
+
name = '~tracing';
|
|
110
|
+
init(options) {
|
|
111
|
+
return {
|
|
112
|
+
...options,
|
|
113
|
+
routingInterceptors: [
|
|
114
|
+
// Should be placed before user-provided interceptors to help them access the current active span.
|
|
115
|
+
async ({ next, request }) => {
|
|
116
|
+
const tracer = getTracer();
|
|
117
|
+
if (!tracer) {
|
|
118
|
+
return next();
|
|
119
|
+
}
|
|
120
|
+
const parent = tracer.extract?.(request.headers);
|
|
121
|
+
/**
|
|
122
|
+
* The search part is excluded because span names should have low cardinality.
|
|
123
|
+
* The name is replaced with the procedure path once the request is routed.
|
|
124
|
+
*/
|
|
125
|
+
const [pathname] = parseStandardUrl(request.url);
|
|
126
|
+
return tracer.startActiveSpan(`${request.method} ${pathname}`, parent, async (span) => {
|
|
127
|
+
try {
|
|
128
|
+
const result = await next();
|
|
129
|
+
if (!result.matched) {
|
|
130
|
+
span.end();
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
const body = result.response.body;
|
|
134
|
+
if (isAsyncIteratorObject(body)) {
|
|
135
|
+
return {
|
|
136
|
+
...result,
|
|
137
|
+
response: {
|
|
138
|
+
...result.response,
|
|
139
|
+
/**
|
|
140
|
+
* @remarks
|
|
141
|
+
* **Warning**: Remember use `override` for remaining special properties
|
|
142
|
+
*/
|
|
143
|
+
body: override(body, wrapAsyncIterator(body, {
|
|
144
|
+
runWith: (fn) => tracer.withActiveSpan(span, fn),
|
|
145
|
+
onError(error) {
|
|
146
|
+
/**
|
|
147
|
+
* Errors here are internal (interceptor/framework) failures,
|
|
148
|
+
* except `EventStreamErrorEvent`: a business error the protocol delivers
|
|
149
|
+
* inside the event stream, already logged by the client interceptor.
|
|
150
|
+
*/
|
|
151
|
+
if (!(error instanceof EventStreamErrorEvent)) {
|
|
152
|
+
span.recordException('error', toTracingException(error));
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
onFinish() {
|
|
156
|
+
span.end();
|
|
157
|
+
},
|
|
158
|
+
})),
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (body instanceof ReadableStream) {
|
|
163
|
+
return {
|
|
164
|
+
...result,
|
|
165
|
+
response: {
|
|
166
|
+
...result.response,
|
|
167
|
+
/**
|
|
168
|
+
* @remarks
|
|
169
|
+
* **Warning**: Remember use `override` for remaining special properties
|
|
170
|
+
*/
|
|
171
|
+
body: override(body, wrapReadableStream(body, {
|
|
172
|
+
runWith: (fn) => tracer.withActiveSpan(span, fn),
|
|
173
|
+
onError(error) {
|
|
174
|
+
/**
|
|
175
|
+
* Any error here is internal (interceptor/framework), not business logic.
|
|
176
|
+
* Indicates unexpected handler failure.
|
|
177
|
+
*/
|
|
178
|
+
span.recordException('error', toTracingException(error));
|
|
179
|
+
},
|
|
180
|
+
onFinish() {
|
|
181
|
+
span.end();
|
|
182
|
+
},
|
|
183
|
+
})),
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
span.end();
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
/**
|
|
192
|
+
* Any error here is internal (interceptor/framework), not business logic.
|
|
193
|
+
* Always recorded as an error, even when it is an abort error.
|
|
194
|
+
*/
|
|
195
|
+
span.recordException('error', toTracingException(e));
|
|
196
|
+
span.end();
|
|
197
|
+
throw e;
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
},
|
|
201
|
+
...toArray(options.routingInterceptors),
|
|
202
|
+
],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { OrderablePlugin } from '@orpc/shared';
|
|
2
|
+
import type { Context } from '../../context.ts';
|
|
3
|
+
import type { StandardHandlerOptions } from './handler.ts';
|
|
4
|
+
export interface StandardHandlerPlugin<T extends Context> extends OrderablePlugin {
|
|
5
|
+
/**
|
|
6
|
+
* Initializes the plugin and returns new handler options.
|
|
7
|
+
* Called once per plugin instance during composition.
|
|
8
|
+
*
|
|
9
|
+
* This method allows plugins to wrap, extend, or transform handler options
|
|
10
|
+
* such as interceptors, or configuration.
|
|
11
|
+
*
|
|
12
|
+
* @param options - The current handler options from previous plugins or base configuration
|
|
13
|
+
* @returns Transformed handler options with plugin's modifications applied
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* init(options) {
|
|
18
|
+
* return {
|
|
19
|
+
* ...options,
|
|
20
|
+
* interceptors: [...(options.interceptors || []), myInterceptor]
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
init?(options: StandardHandlerOptions<T>): StandardHandlerOptions<T>;
|
|
26
|
+
}
|
|
27
|
+
export declare class CompositeStandardHandlerPlugin<T extends Context> implements StandardHandlerPlugin<T> {
|
|
28
|
+
readonly name = "~composite";
|
|
29
|
+
protected readonly plugins: StandardHandlerPlugin<T>[];
|
|
30
|
+
constructor(plugins?: StandardHandlerPlugin<T>[]);
|
|
31
|
+
init(options: StandardHandlerOptions<T>): StandardHandlerOptions<T>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { sortPlugins } from '@orpc/shared';
|
|
2
|
+
export class CompositeStandardHandlerPlugin {
|
|
3
|
+
name = '~composite';
|
|
4
|
+
plugins;
|
|
5
|
+
constructor(plugins = []) {
|
|
6
|
+
this.plugins = sortPlugins(plugins);
|
|
7
|
+
}
|
|
8
|
+
init(options) {
|
|
9
|
+
for (const plugin of this.plugins) {
|
|
10
|
+
if (plugin.init) {
|
|
11
|
+
options = plugin.init(options);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return options;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AnyORPCError } from '@orpc/client';
|
|
2
|
+
import { RPCSerializer } from '@orpc/client';
|
|
3
|
+
import type { Promisable, Public, Value } from '@orpc/shared';
|
|
4
|
+
import type { StandardLazyRequest, StandardResponse } from '@standard-server/core';
|
|
5
|
+
import type { Context } from '../../context.ts';
|
|
6
|
+
import type { AnyProcedure } from '../../procedure.ts';
|
|
7
|
+
import type { AnyRouter } from '../../router.ts';
|
|
8
|
+
import type { ResolvedStandardHandlerHandleOptions, StandardHandlerCodec, StandardHandlerCodecResolvedProcedure } from '../standard/index.ts';
|
|
9
|
+
import type { RPCMatcherOptions } from './rpc-matcher.ts';
|
|
10
|
+
export interface RPCHandlerCodecOptions<T extends Context> extends RPCMatcherOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Override the default RPC serializer.
|
|
13
|
+
*/
|
|
14
|
+
serializer?: Public<RPCSerializer> | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve HTTP status for encoded successful outputs.
|
|
17
|
+
*
|
|
18
|
+
* Value should be in the `2xx` range and must be less than `400`.
|
|
19
|
+
*
|
|
20
|
+
* @default DEFAULT_SUCCESS_STATUS (200)
|
|
21
|
+
*/
|
|
22
|
+
outputStatus?: Value<number, [
|
|
23
|
+
output: unknown,
|
|
24
|
+
procedure: AnyProcedure,
|
|
25
|
+
path: string[],
|
|
26
|
+
options: ResolvedStandardHandlerHandleOptions<T>
|
|
27
|
+
]> | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Mapping ORPCError Code -> HTTP Status Code
|
|
30
|
+
* The status code should be in the `4xx` or `5xx` range (must be greater than or equal to `400`).
|
|
31
|
+
* Codes missing from the map fall back to `DEFAULT_ERROR_STATUS` (400).
|
|
32
|
+
*
|
|
33
|
+
* @default COMMON_ERROR_STATUS_MAP
|
|
34
|
+
*/
|
|
35
|
+
errorStatusMap?: Record<string, number> | undefined;
|
|
36
|
+
}
|
|
37
|
+
export declare class RPCHandlerCodec<T extends Context> implements StandardHandlerCodec<T> {
|
|
38
|
+
private readonly matcher;
|
|
39
|
+
private readonly serializer;
|
|
40
|
+
private readonly errorStatusMap;
|
|
41
|
+
private readonly outputStatus;
|
|
42
|
+
constructor(router: AnyRouter, options?: RPCHandlerCodecOptions<T>);
|
|
43
|
+
resolveProcedure(request: StandardLazyRequest, options: ResolvedStandardHandlerHandleOptions<T>): Promise<StandardHandlerCodecResolvedProcedure | undefined>;
|
|
44
|
+
encodeOutput(output: unknown, procedure: AnyProcedure, path: string[], options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
|
|
45
|
+
encodeError(error: AnyORPCError, _procedure: AnyProcedure, _path: string[], _options: ResolvedStandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { COMMON_ERROR_STATUS_MAP, RPCSerializer } from '@orpc/client';
|
|
2
|
+
import { getOwn, parseEmptyableJSON, value } from '@orpc/shared';
|
|
3
|
+
import { parseStandardUrl } from '@standard-server/core';
|
|
4
|
+
import { DEFAULT_ERROR_STATUS, DEFAULT_SUCCESS_STATUS } from '../../constants.js';
|
|
5
|
+
import { RPCMatcher } from './rpc-matcher.js';
|
|
6
|
+
export class RPCHandlerCodec {
|
|
7
|
+
matcher;
|
|
8
|
+
serializer;
|
|
9
|
+
errorStatusMap;
|
|
10
|
+
outputStatus;
|
|
11
|
+
constructor(router, options = {}) {
|
|
12
|
+
this.matcher = new RPCMatcher(router, options);
|
|
13
|
+
this.serializer = options.serializer ?? new RPCSerializer();
|
|
14
|
+
this.errorStatusMap = options.errorStatusMap ?? COMMON_ERROR_STATUS_MAP;
|
|
15
|
+
this.outputStatus = options.outputStatus ?? DEFAULT_SUCCESS_STATUS;
|
|
16
|
+
}
|
|
17
|
+
async resolveProcedure(request, options) {
|
|
18
|
+
const [pathname, query] = parseStandardUrl(request.url);
|
|
19
|
+
const matched = await this.matcher.match(request.method, pathname, options.prefix);
|
|
20
|
+
if (!matched) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
procedure: matched.procedure,
|
|
25
|
+
path: matched.path,
|
|
26
|
+
decodeInput: async () => {
|
|
27
|
+
if (request.method === 'GET') {
|
|
28
|
+
const dataString = new URLSearchParams(query).getAll('data').at(-1);
|
|
29
|
+
return this.serializer.deserialize(parseEmptyableJSON(dataString));
|
|
30
|
+
}
|
|
31
|
+
const body = await request.resolveBody();
|
|
32
|
+
return this.serializer.deserialize(body);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
encodeOutput(output, procedure, path, options) {
|
|
37
|
+
return {
|
|
38
|
+
headers: {},
|
|
39
|
+
status: value(this.outputStatus, output, procedure, path, options),
|
|
40
|
+
body: this.serializer.serialize(output),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
encodeError(error, _procedure, _path, _options) {
|
|
44
|
+
const status = getOwn(this.errorStatusMap, error.code) ?? DEFAULT_ERROR_STATUS;
|
|
45
|
+
return {
|
|
46
|
+
headers: {},
|
|
47
|
+
status,
|
|
48
|
+
body: this.serializer.serialize(error.toJSON()),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { AnyProcedureContract } from '@orpc/contract';
|
|
2
|
+
import type { Value } from '@orpc/shared';
|
|
3
|
+
import type { StandardMethod } from '@standard-server/core';
|
|
4
|
+
import type { AnyProcedure } from '../../procedure.ts';
|
|
5
|
+
import type { AnyRouter } from '../../router.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Methods that can invoke procedures by default. Browsers cannot trigger them
|
|
8
|
+
* cross-site without a CORS preflight or an HTML form, unlike `GET`, which a plain
|
|
9
|
+
* `<a>` click or redirect can trigger with `SameSite=Lax` cookies attached. Other
|
|
10
|
+
* methods (`HEAD`, `OPTIONS`, `QUERY`, ...) have safe semantics that should not
|
|
11
|
+
* invoke a procedure that can modify data.
|
|
12
|
+
*
|
|
13
|
+
* @see {@link https://orpc.dev/docs/rpc/handler#supported-http-methods | RPC Handler - Supported HTTP Methods}
|
|
14
|
+
*/
|
|
15
|
+
export declare const RPC_DEFAULT_ALLOW_METHODS: readonly StandardMethod[];
|
|
16
|
+
export interface RPCMatcherOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Filter which procedures are exposed for matching. Return `false` to exclude.
|
|
19
|
+
*
|
|
20
|
+
* @default true
|
|
21
|
+
*/
|
|
22
|
+
filter?: Value<boolean, [procedure: AnyProcedureContract | AnyProcedure, path: string[]]> | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Restricts which HTTP methods can invoke procedures, either with a list of allowed
|
|
25
|
+
* methods or decided per request via a function. Requests using a disallowed method
|
|
26
|
+
* are treated as unmatched. `GET` is excluded by default because it is exposed to
|
|
27
|
+
* Cross-Site Request Forgery (CSRF) attacks.
|
|
28
|
+
*
|
|
29
|
+
* @default RPC_DEFAULT_ALLOW_METHODS (['POST', 'PUT', 'PATCH', 'DELETE'])
|
|
30
|
+
* @see {@link https://orpc.dev/docs/rpc/handler#supported-http-methods | RPC Handler - Supported HTTP Methods}
|
|
31
|
+
*/
|
|
32
|
+
allowMethods?: readonly StandardMethod[] | ((method: StandardMethod, procedure: AnyProcedure, path: string[]) => boolean) | undefined;
|
|
33
|
+
}
|
|
34
|
+
export declare class RPCMatcher {
|
|
35
|
+
private readonly filter;
|
|
36
|
+
private readonly allowMethodsSet;
|
|
37
|
+
private readonly allowMethodsFn;
|
|
38
|
+
private readonly rootRouter;
|
|
39
|
+
private readonly tree;
|
|
40
|
+
private readonly pendingLazyRouters;
|
|
41
|
+
/** segment count of the deepest pending key, never lowered so it stays an upper bound */
|
|
42
|
+
private maxPendingLazyRouterDepth;
|
|
43
|
+
constructor(router: AnyRouter, options?: RPCMatcherOptions);
|
|
44
|
+
private index;
|
|
45
|
+
match(method: StandardMethod, pathname: `/${string}`, prefix: `/${string}` | undefined): Promise<{
|
|
46
|
+
path: string[];
|
|
47
|
+
procedure: AnyProcedure;
|
|
48
|
+
} | undefined>;
|
|
49
|
+
private resolvePendingLazyRouters;
|
|
50
|
+
private loadPendingLazyRouter;
|
|
51
|
+
private indexPendingLazyRouter;
|
|
52
|
+
private resolveProcedure;
|
|
53
|
+
}
|