@orpc/server 0.0.0-next.0ce0926 → 0.0.0-next.0ceddfc
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 +8 -9
- package/dist/adapters/aws-lambda/index.d.mts +46 -0
- package/dist/adapters/aws-lambda/index.d.ts +46 -0
- package/dist/adapters/aws-lambda/index.mjs +42 -0
- package/dist/adapters/bun-ws/index.d.mts +12 -11
- package/dist/adapters/bun-ws/index.d.ts +12 -11
- package/dist/adapters/bun-ws/index.mjs +17 -20
- package/dist/adapters/crossws/index.d.mts +8 -5
- package/dist/adapters/crossws/index.d.ts +8 -5
- package/dist/adapters/crossws/index.mjs +12 -17
- package/dist/adapters/fetch/index.d.mts +54 -8
- package/dist/adapters/fetch/index.d.ts +54 -8
- package/dist/adapters/fetch/index.mjs +74 -5
- package/dist/adapters/message-port/index.d.mts +31 -0
- package/dist/adapters/message-port/index.d.ts +31 -0
- package/dist/adapters/message-port/index.mjs +39 -0
- package/dist/adapters/node/index.d.mts +30 -8
- package/dist/adapters/node/index.d.ts +30 -8
- package/dist/adapters/node/index.mjs +71 -14
- package/dist/adapters/standard/index.d.mts +8 -13
- package/dist/adapters/standard/index.d.ts +8 -13
- package/dist/adapters/standard/index.mjs +4 -2
- package/dist/adapters/standard-peer/index.d.mts +18 -0
- package/dist/adapters/standard-peer/index.d.ts +18 -0
- package/dist/adapters/standard-peer/index.mjs +7 -0
- package/dist/adapters/websocket/index.d.mts +36 -9
- package/dist/adapters/websocket/index.d.ts +36 -9
- package/dist/adapters/websocket/index.mjs +50 -20
- package/dist/adapters/ws/index.d.mts +11 -8
- package/dist/adapters/ws/index.d.ts +11 -8
- package/dist/adapters/ws/index.mjs +14 -14
- package/dist/helpers/index.d.mts +134 -0
- package/dist/helpers/index.d.ts +134 -0
- package/dist/helpers/index.mjs +188 -0
- package/dist/hibernation/index.d.mts +44 -0
- package/dist/hibernation/index.d.ts +44 -0
- package/dist/hibernation/index.mjs +65 -0
- package/dist/index.d.mts +21 -47
- package/dist/index.d.ts +21 -47
- package/dist/index.mjs +23 -8
- package/dist/plugins/index.d.mts +28 -15
- package/dist/plugins/index.d.ts +28 -15
- package/dist/plugins/index.mjs +94 -60
- package/dist/shared/server.B7b2w3_i.d.ts +12 -0
- package/dist/shared/server.BEFBl-Cb.d.mts +12 -0
- package/dist/shared/server.BU4WI18A.d.mts +32 -0
- package/dist/shared/{server.DG7Tamti.mjs → server.B_fj3X5m.mjs} +92 -51
- package/dist/shared/{server.YZzrREz9.d.ts → server.Bmh5xd4n.d.ts} +8 -8
- package/dist/shared/{server.DPWk5pjW.d.mts → server.CYNGeoCm.d.mts} +10 -8
- package/dist/shared/{server.DPWk5pjW.d.ts → server.CYNGeoCm.d.ts} +10 -8
- package/dist/shared/{server.SxlTJfG2.mjs → server.CYRYFTxo.mjs} +76 -40
- package/dist/shared/server.D0H-iaY3.d.ts +32 -0
- package/dist/shared/{server.BVwwTHyO.mjs → server.DZ5BIITo.mjs} +1 -1
- package/dist/shared/server.DhJj-1X9.d.mts +42 -0
- package/dist/shared/server.UVMTOWrk.mjs +26 -0
- package/dist/shared/{server.eWLxY3lq.d.mts → server.gqRxT-yN.d.mts} +8 -8
- package/dist/shared/server.jMTkVNIb.d.ts +42 -0
- package/package.json +40 -12
- package/dist/shared/server.BRoxSiSC.d.mts +0 -12
- package/dist/shared/server.BjiJH9Vo.d.ts +0 -10
- package/dist/shared/server.Cy1vfSiG.d.ts +0 -12
- package/dist/shared/server.QUe9N8P4.d.mts +0 -10
package/dist/index.mjs
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
import { mergeErrorMap, mergeMeta, mergeRoute, mergePrefix, mergeTags, isContractProcedure, getContractRouter } from '@orpc/contract';
|
1
|
+
import { mergeErrorMap, mergeMeta, mergeRoute, mergePrefix, mergeTags, isContractProcedure, getContractRouter, fallbackContractConfig } from '@orpc/contract';
|
2
2
|
export { ValidationError, eventIterator, type } from '@orpc/contract';
|
3
|
-
import { P as Procedure, b as addMiddleware, c as createProcedureClient, e as enhanceRouter, l as lazy, s as setHiddenRouterContract, i as isProcedure, d as isLazy, f as createAssertedLazyProcedure
|
4
|
-
export { L as LAZY_SYMBOL, p as call, r as createAccessibleLazyRouter, a as createContractedProcedure, h as createORPCErrorConstructorMap, q as getHiddenRouterContract, j as getLazyMeta, n as isStartWithMiddlewares, m as mergeCurrentContext, o as mergeMiddlewares, k as middlewareOutputFn, w as resolveContractProcedures, t as traverseContractProcedures,
|
3
|
+
import { P as Procedure, b as addMiddleware, c as createProcedureClient, e as enhanceRouter, l as lazy, s as setHiddenRouterContract, u as unlazy, g as getRouter, i as isProcedure, d as isLazy, f as createAssertedLazyProcedure } from './shared/server.B_fj3X5m.mjs';
|
4
|
+
export { L as LAZY_SYMBOL, p as call, r as createAccessibleLazyRouter, a as createContractedProcedure, h as createORPCErrorConstructorMap, q as getHiddenRouterContract, j as getLazyMeta, n as isStartWithMiddlewares, m as mergeCurrentContext, o as mergeMiddlewares, k as middlewareOutputFn, w as resolveContractProcedures, t as traverseContractProcedures, x as unlazyRouter, v as validateORPCError } from './shared/server.B_fj3X5m.mjs';
|
5
5
|
import { toORPCError } from '@orpc/client';
|
6
6
|
export { ORPCError, isDefinedError, safe } from '@orpc/client';
|
7
|
-
|
7
|
+
import { resolveMaybeOptionalOptions } from '@orpc/shared';
|
8
|
+
export { AsyncIteratorClass, EventPublisher, asyncIteratorToStream as eventIteratorToStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';
|
8
9
|
export { getEventMeta, withEventMeta } from '@orpc/standard-server';
|
9
10
|
|
10
11
|
const DEFAULT_CONFIG = {
|
@@ -150,7 +151,7 @@ class Builder {
|
|
150
151
|
/**
|
151
152
|
* Sets or overrides the config.
|
152
153
|
*
|
153
|
-
* @see {@link https://orpc.unnoq.com/docs/
|
154
|
+
* @see {@link https://orpc.unnoq.com/docs/client/server-side#middlewares-order Middlewares Order Docs}
|
154
155
|
* @see {@link https://orpc.unnoq.com/docs/best-practices/dedupe-middleware#configuration Dedupe Middleware Docs}
|
155
156
|
*/
|
156
157
|
$config(config) {
|
@@ -447,12 +448,26 @@ function implement(contract, config = {}) {
|
|
447
448
|
return impl;
|
448
449
|
}
|
449
450
|
|
451
|
+
function inferRPCMethodFromRouter(router) {
|
452
|
+
return async (_, path) => {
|
453
|
+
const { default: procedure } = await unlazy(getRouter(router, path));
|
454
|
+
if (!isProcedure(procedure)) {
|
455
|
+
throw new Error(
|
456
|
+
`[inferRPCMethodFromRouter] No valid procedure found at path "${path.join(".")}". This may happen when the router is not properly configured.`
|
457
|
+
);
|
458
|
+
}
|
459
|
+
const method = fallbackContractConfig("defaultMethod", procedure["~orpc"].route.method);
|
460
|
+
return method === "HEAD" ? "GET" : method;
|
461
|
+
};
|
462
|
+
}
|
463
|
+
|
450
464
|
function createRouterClient(router, ...rest) {
|
465
|
+
const options = resolveMaybeOptionalOptions(rest);
|
451
466
|
if (isProcedure(router)) {
|
452
|
-
const caller = createProcedureClient(router,
|
467
|
+
const caller = createProcedureClient(router, options);
|
453
468
|
return caller;
|
454
469
|
}
|
455
|
-
const procedureCaller = isLazy(router) ? createProcedureClient(createAssertedLazyProcedure(router),
|
470
|
+
const procedureCaller = isLazy(router) ? createProcedureClient(createAssertedLazyProcedure(router), options) : {};
|
456
471
|
const recursive = new Proxy(procedureCaller, {
|
457
472
|
get(target, key) {
|
458
473
|
if (typeof key !== "string") {
|
@@ -471,4 +486,4 @@ function createRouterClient(router, ...rest) {
|
|
471
486
|
return recursive;
|
472
487
|
}
|
473
488
|
|
474
|
-
export { Builder, DecoratedProcedure, Procedure, addMiddleware, createActionableClient, createAssertedLazyProcedure, createProcedureClient, createRouterClient, decorateMiddleware, enhanceRouter, fallbackConfig, getRouter, implement, implementerInternal, isLazy, isProcedure, lazy, os, setHiddenRouterContract };
|
489
|
+
export { Builder, DecoratedProcedure, Procedure, addMiddleware, createActionableClient, createAssertedLazyProcedure, createProcedureClient, createRouterClient, decorateMiddleware, enhanceRouter, fallbackConfig, getRouter, implement, implementerInternal, inferRPCMethodFromRouter, isLazy, isProcedure, lazy, os, setHiddenRouterContract, unlazy };
|
package/dist/plugins/index.d.mts
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
import { Value } from '@orpc/shared';
|
1
|
+
import { Value, Promisable } from '@orpc/shared';
|
2
2
|
import { StandardRequest, StandardHeaders } from '@orpc/standard-server';
|
3
3
|
import { BatchResponseBodyItem } from '@orpc/standard-server/batch';
|
4
|
-
import {
|
5
|
-
import { C as Context,
|
4
|
+
import { d as StandardHandlerInterceptorOptions, g as StandardHandlerPlugin, e as StandardHandlerOptions } from '../shared/server.gqRxT-yN.mjs';
|
5
|
+
import { C as Context, d as ProcedureClientInterceptorOptions } from '../shared/server.CYNGeoCm.mjs';
|
6
6
|
import { Meta, ORPCError as ORPCError$1 } from '@orpc/contract';
|
7
7
|
import { ORPCError } from '@orpc/client';
|
8
8
|
|
@@ -12,7 +12,7 @@ interface BatchHandlerOptions<T extends Context> {
|
|
12
12
|
*
|
13
13
|
* @default 10
|
14
14
|
*/
|
15
|
-
maxSize?: Value<number
|
15
|
+
maxSize?: Value<Promisable<number>, [StandardHandlerInterceptorOptions<T>]>;
|
16
16
|
/**
|
17
17
|
* Map the request before processing it.
|
18
18
|
*
|
@@ -24,19 +24,19 @@ interface BatchHandlerOptions<T extends Context> {
|
|
24
24
|
*
|
25
25
|
* @default 207
|
26
26
|
*/
|
27
|
-
successStatus?: Value<number
|
27
|
+
successStatus?: Value<Promisable<number>, [responses: Promise<BatchResponseBodyItem>[], batchOptions: StandardHandlerInterceptorOptions<T>]>;
|
28
28
|
/**
|
29
29
|
* success batch response headers.
|
30
30
|
*
|
31
31
|
* @default {}
|
32
32
|
*/
|
33
|
-
headers?: Value<StandardHeaders
|
33
|
+
headers?: Value<Promisable<StandardHeaders>, [responses: Promise<BatchResponseBodyItem>[], batchOptions: StandardHandlerInterceptorOptions<T>]>;
|
34
34
|
}
|
35
35
|
/**
|
36
|
-
* The Batch
|
36
|
+
* The Batch Requests Plugin allows you to combine multiple requests and responses into a single batch,
|
37
37
|
* reducing the overhead of sending each one separately.
|
38
38
|
*
|
39
|
-
* @see {@link https://orpc.unnoq.com/docs/plugins/batch-
|
39
|
+
* @see {@link https://orpc.unnoq.com/docs/plugins/batch-requests Batch Requests Plugin Docs}
|
40
40
|
*/
|
41
41
|
declare class BatchHandlerPlugin<T extends Context> implements StandardHandlerPlugin<T> {
|
42
42
|
private readonly maxSize;
|
@@ -49,8 +49,8 @@ declare class BatchHandlerPlugin<T extends Context> implements StandardHandlerPl
|
|
49
49
|
}
|
50
50
|
|
51
51
|
interface CORSOptions<T extends Context> {
|
52
|
-
origin?: Value<string | readonly string[] | null | undefined
|
53
|
-
timingOrigin?: Value<string | readonly string[] | null | undefined
|
52
|
+
origin?: Value<Promisable<string | readonly string[] | null | undefined>, [origin: string, options: StandardHandlerInterceptorOptions<T>]>;
|
53
|
+
timingOrigin?: Value<Promisable<string | readonly string[] | null | undefined>, [origin: string, options: StandardHandlerInterceptorOptions<T>]>;
|
54
54
|
allowMethods?: readonly string[];
|
55
55
|
allowHeaders?: readonly string[];
|
56
56
|
maxAge?: number;
|
@@ -69,6 +69,19 @@ declare class CORSPlugin<T extends Context> implements StandardHandlerPlugin<T>
|
|
69
69
|
init(options: StandardHandlerOptions<T>): void;
|
70
70
|
}
|
71
71
|
|
72
|
+
interface RequestHeadersPluginContext {
|
73
|
+
reqHeaders?: Headers;
|
74
|
+
}
|
75
|
+
/**
|
76
|
+
* The Request Headers Plugin injects a `reqHeaders` instance into the context,
|
77
|
+
* allowing access to request headers in oRPC.
|
78
|
+
*
|
79
|
+
* @see {@link https://orpc.unnoq.com/docs/plugins/request-headers Request Headers Plugin Docs}
|
80
|
+
*/
|
81
|
+
declare class RequestHeadersPlugin<T extends RequestHeadersPluginContext> implements StandardHandlerPlugin<T> {
|
82
|
+
init(options: StandardHandlerOptions<T>): void;
|
83
|
+
}
|
84
|
+
|
72
85
|
interface ResponseHeadersPluginContext {
|
73
86
|
resHeaders?: Headers;
|
74
87
|
}
|
@@ -88,21 +101,21 @@ interface SimpleCsrfProtectionHandlerPluginOptions<T extends Context> {
|
|
88
101
|
*
|
89
102
|
* @default 'x-csrf-token'
|
90
103
|
*/
|
91
|
-
headerName?: Value<string
|
104
|
+
headerName?: Value<Promisable<string>, [options: StandardHandlerInterceptorOptions<T>]>;
|
92
105
|
/**
|
93
106
|
* The value of the header to check.
|
94
107
|
*
|
95
108
|
* @default 'orpc'
|
96
109
|
*
|
97
110
|
*/
|
98
|
-
headerValue?: Value<string
|
111
|
+
headerValue?: Value<Promisable<string>, [options: StandardHandlerInterceptorOptions<T>]>;
|
99
112
|
/**
|
100
113
|
* Exclude a procedure from the plugin.
|
101
114
|
*
|
102
115
|
* @default false
|
103
116
|
*
|
104
117
|
*/
|
105
|
-
exclude?: Value<boolean
|
118
|
+
exclude?: Value<Promisable<boolean>, [options: ProcedureClientInterceptorOptions<T, Record<never, never>, Meta>]>;
|
106
119
|
/**
|
107
120
|
* The error thrown when the CSRF token is invalid.
|
108
121
|
*
|
@@ -152,5 +165,5 @@ declare class StrictGetMethodPlugin<T extends Context> implements StandardHandle
|
|
152
165
|
init(options: StandardHandlerOptions<T>): void;
|
153
166
|
}
|
154
167
|
|
155
|
-
export { BatchHandlerPlugin, CORSPlugin, ResponseHeadersPlugin, SimpleCsrfProtectionHandlerPlugin, StrictGetMethodPlugin };
|
156
|
-
export type { BatchHandlerOptions, CORSOptions, ResponseHeadersPluginContext, SimpleCsrfProtectionHandlerPluginOptions, StrictGetMethodPluginOptions };
|
168
|
+
export { BatchHandlerPlugin, CORSPlugin, RequestHeadersPlugin, ResponseHeadersPlugin, SimpleCsrfProtectionHandlerPlugin, StrictGetMethodPlugin };
|
169
|
+
export type { BatchHandlerOptions, CORSOptions, RequestHeadersPluginContext, ResponseHeadersPluginContext, SimpleCsrfProtectionHandlerPluginOptions, StrictGetMethodPluginOptions };
|
package/dist/plugins/index.d.ts
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
import { Value } from '@orpc/shared';
|
1
|
+
import { Value, Promisable } from '@orpc/shared';
|
2
2
|
import { StandardRequest, StandardHeaders } from '@orpc/standard-server';
|
3
3
|
import { BatchResponseBodyItem } from '@orpc/standard-server/batch';
|
4
|
-
import {
|
5
|
-
import { C as Context,
|
4
|
+
import { d as StandardHandlerInterceptorOptions, g as StandardHandlerPlugin, e as StandardHandlerOptions } from '../shared/server.Bmh5xd4n.js';
|
5
|
+
import { C as Context, d as ProcedureClientInterceptorOptions } from '../shared/server.CYNGeoCm.js';
|
6
6
|
import { Meta, ORPCError as ORPCError$1 } from '@orpc/contract';
|
7
7
|
import { ORPCError } from '@orpc/client';
|
8
8
|
|
@@ -12,7 +12,7 @@ interface BatchHandlerOptions<T extends Context> {
|
|
12
12
|
*
|
13
13
|
* @default 10
|
14
14
|
*/
|
15
|
-
maxSize?: Value<number
|
15
|
+
maxSize?: Value<Promisable<number>, [StandardHandlerInterceptorOptions<T>]>;
|
16
16
|
/**
|
17
17
|
* Map the request before processing it.
|
18
18
|
*
|
@@ -24,19 +24,19 @@ interface BatchHandlerOptions<T extends Context> {
|
|
24
24
|
*
|
25
25
|
* @default 207
|
26
26
|
*/
|
27
|
-
successStatus?: Value<number
|
27
|
+
successStatus?: Value<Promisable<number>, [responses: Promise<BatchResponseBodyItem>[], batchOptions: StandardHandlerInterceptorOptions<T>]>;
|
28
28
|
/**
|
29
29
|
* success batch response headers.
|
30
30
|
*
|
31
31
|
* @default {}
|
32
32
|
*/
|
33
|
-
headers?: Value<StandardHeaders
|
33
|
+
headers?: Value<Promisable<StandardHeaders>, [responses: Promise<BatchResponseBodyItem>[], batchOptions: StandardHandlerInterceptorOptions<T>]>;
|
34
34
|
}
|
35
35
|
/**
|
36
|
-
* The Batch
|
36
|
+
* The Batch Requests Plugin allows you to combine multiple requests and responses into a single batch,
|
37
37
|
* reducing the overhead of sending each one separately.
|
38
38
|
*
|
39
|
-
* @see {@link https://orpc.unnoq.com/docs/plugins/batch-
|
39
|
+
* @see {@link https://orpc.unnoq.com/docs/plugins/batch-requests Batch Requests Plugin Docs}
|
40
40
|
*/
|
41
41
|
declare class BatchHandlerPlugin<T extends Context> implements StandardHandlerPlugin<T> {
|
42
42
|
private readonly maxSize;
|
@@ -49,8 +49,8 @@ declare class BatchHandlerPlugin<T extends Context> implements StandardHandlerPl
|
|
49
49
|
}
|
50
50
|
|
51
51
|
interface CORSOptions<T extends Context> {
|
52
|
-
origin?: Value<string | readonly string[] | null | undefined
|
53
|
-
timingOrigin?: Value<string | readonly string[] | null | undefined
|
52
|
+
origin?: Value<Promisable<string | readonly string[] | null | undefined>, [origin: string, options: StandardHandlerInterceptorOptions<T>]>;
|
53
|
+
timingOrigin?: Value<Promisable<string | readonly string[] | null | undefined>, [origin: string, options: StandardHandlerInterceptorOptions<T>]>;
|
54
54
|
allowMethods?: readonly string[];
|
55
55
|
allowHeaders?: readonly string[];
|
56
56
|
maxAge?: number;
|
@@ -69,6 +69,19 @@ declare class CORSPlugin<T extends Context> implements StandardHandlerPlugin<T>
|
|
69
69
|
init(options: StandardHandlerOptions<T>): void;
|
70
70
|
}
|
71
71
|
|
72
|
+
interface RequestHeadersPluginContext {
|
73
|
+
reqHeaders?: Headers;
|
74
|
+
}
|
75
|
+
/**
|
76
|
+
* The Request Headers Plugin injects a `reqHeaders` instance into the context,
|
77
|
+
* allowing access to request headers in oRPC.
|
78
|
+
*
|
79
|
+
* @see {@link https://orpc.unnoq.com/docs/plugins/request-headers Request Headers Plugin Docs}
|
80
|
+
*/
|
81
|
+
declare class RequestHeadersPlugin<T extends RequestHeadersPluginContext> implements StandardHandlerPlugin<T> {
|
82
|
+
init(options: StandardHandlerOptions<T>): void;
|
83
|
+
}
|
84
|
+
|
72
85
|
interface ResponseHeadersPluginContext {
|
73
86
|
resHeaders?: Headers;
|
74
87
|
}
|
@@ -88,21 +101,21 @@ interface SimpleCsrfProtectionHandlerPluginOptions<T extends Context> {
|
|
88
101
|
*
|
89
102
|
* @default 'x-csrf-token'
|
90
103
|
*/
|
91
|
-
headerName?: Value<string
|
104
|
+
headerName?: Value<Promisable<string>, [options: StandardHandlerInterceptorOptions<T>]>;
|
92
105
|
/**
|
93
106
|
* The value of the header to check.
|
94
107
|
*
|
95
108
|
* @default 'orpc'
|
96
109
|
*
|
97
110
|
*/
|
98
|
-
headerValue?: Value<string
|
111
|
+
headerValue?: Value<Promisable<string>, [options: StandardHandlerInterceptorOptions<T>]>;
|
99
112
|
/**
|
100
113
|
* Exclude a procedure from the plugin.
|
101
114
|
*
|
102
115
|
* @default false
|
103
116
|
*
|
104
117
|
*/
|
105
|
-
exclude?: Value<boolean
|
118
|
+
exclude?: Value<Promisable<boolean>, [options: ProcedureClientInterceptorOptions<T, Record<never, never>, Meta>]>;
|
106
119
|
/**
|
107
120
|
* The error thrown when the CSRF token is invalid.
|
108
121
|
*
|
@@ -152,5 +165,5 @@ declare class StrictGetMethodPlugin<T extends Context> implements StandardHandle
|
|
152
165
|
init(options: StandardHandlerOptions<T>): void;
|
153
166
|
}
|
154
167
|
|
155
|
-
export { BatchHandlerPlugin, CORSPlugin, ResponseHeadersPlugin, SimpleCsrfProtectionHandlerPlugin, StrictGetMethodPlugin };
|
156
|
-
export type { BatchHandlerOptions, CORSOptions, ResponseHeadersPluginContext, SimpleCsrfProtectionHandlerPluginOptions, StrictGetMethodPluginOptions };
|
168
|
+
export { BatchHandlerPlugin, CORSPlugin, RequestHeadersPlugin, ResponseHeadersPlugin, SimpleCsrfProtectionHandlerPlugin, StrictGetMethodPlugin };
|
169
|
+
export type { BatchHandlerOptions, CORSOptions, RequestHeadersPluginContext, ResponseHeadersPluginContext, SimpleCsrfProtectionHandlerPluginOptions, StrictGetMethodPluginOptions };
|
package/dist/plugins/index.mjs
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
import { value, isAsyncIteratorObject } from '@orpc/shared';
|
2
|
-
import { parseBatchRequest, toBatchResponse } from '@orpc/standard-server/batch';
|
1
|
+
import { runWithSpan, value, setSpanError, isAsyncIteratorObject, clone } from '@orpc/shared';
|
3
2
|
import { flattenHeader } from '@orpc/standard-server';
|
3
|
+
import { parseBatchRequest, toBatchResponse } from '@orpc/standard-server/batch';
|
4
|
+
import { toFetchHeaders } from '@orpc/standard-server-fetch';
|
4
5
|
import { ORPCError } from '@orpc/client';
|
5
6
|
export { S as StrictGetMethodPlugin } from '../shared/server.BW-nUGgA.mjs';
|
6
7
|
import '@orpc/contract';
|
@@ -26,69 +27,80 @@ class BatchHandlerPlugin {
|
|
26
27
|
init(options) {
|
27
28
|
options.rootInterceptors ??= [];
|
28
29
|
options.rootInterceptors.unshift(async (options2) => {
|
29
|
-
|
30
|
+
const xHeader = flattenHeader(options2.request.headers["x-orpc-batch"]);
|
31
|
+
if (xHeader === void 0) {
|
30
32
|
return options2.next();
|
31
33
|
}
|
32
34
|
let isParsing = false;
|
33
35
|
try {
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
return options2.next({ ...options2, request: { ...mapped, body: () => Promise.resolve(mapped.body) } }).then(({ response: response2, matched }) => {
|
52
|
-
if (matched) {
|
53
|
-
if (response2.body instanceof Blob || response2.body instanceof FormData || isAsyncIteratorObject(response2.body)) {
|
54
|
-
return {
|
55
|
-
index,
|
56
|
-
status: 500,
|
57
|
-
headers: {},
|
58
|
-
body: "Batch responses do not support file/blob, or event-iterator. Please call this procedure separately outside of the batch request."
|
59
|
-
};
|
60
|
-
}
|
61
|
-
return { ...response2, index };
|
36
|
+
return await runWithSpan({ name: "handle_batch_request" }, async (span) => {
|
37
|
+
const mode = xHeader === "buffered" ? "buffered" : "streaming";
|
38
|
+
isParsing = true;
|
39
|
+
const parsed = parseBatchRequest({ ...options2.request, body: await options2.request.body() });
|
40
|
+
isParsing = false;
|
41
|
+
span?.setAttribute("batch.mode", mode);
|
42
|
+
span?.setAttribute("batch.size", parsed.length);
|
43
|
+
const maxSize = await value(this.maxSize, options2);
|
44
|
+
if (parsed.length > maxSize) {
|
45
|
+
const message = "Batch request size exceeds the maximum allowed size";
|
46
|
+
setSpanError(span, message);
|
47
|
+
return {
|
48
|
+
matched: true,
|
49
|
+
response: {
|
50
|
+
status: 413,
|
51
|
+
headers: {},
|
52
|
+
body: message
|
62
53
|
}
|
63
|
-
|
64
|
-
}).catch(() => {
|
65
|
-
return { index, status: 500, headers: {}, body: "Internal server error" };
|
66
|
-
});
|
54
|
+
};
|
67
55
|
}
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
56
|
+
const responses = parsed.map(
|
57
|
+
(request, index) => {
|
58
|
+
const mapped = this.mapRequestItem(request, options2);
|
59
|
+
return options2.next({ ...options2, request: { ...mapped, body: () => Promise.resolve(mapped.body) } }).then(({ response: response2, matched }) => {
|
60
|
+
span?.addEvent(`response.${index}.${matched ? "success" : "not_matched"}`);
|
61
|
+
if (matched) {
|
62
|
+
if (response2.body instanceof Blob || response2.body instanceof FormData || isAsyncIteratorObject(response2.body)) {
|
63
|
+
return {
|
64
|
+
index,
|
65
|
+
status: 500,
|
66
|
+
headers: {},
|
67
|
+
body: "Batch responses do not support file/blob, or event-iterator. Please call this procedure separately outside of the batch request."
|
68
|
+
};
|
69
|
+
}
|
70
|
+
return { ...response2, index };
|
71
|
+
}
|
72
|
+
return { index, status: 404, headers: {}, body: "No procedure matched" };
|
73
|
+
}).catch((err) => {
|
74
|
+
Promise.reject(err);
|
75
|
+
return { index, status: 500, headers: {}, body: "Internal server error" };
|
76
|
+
});
|
85
77
|
}
|
86
|
-
|
78
|
+
);
|
79
|
+
await Promise.race(responses);
|
80
|
+
const status = await value(this.successStatus, responses, options2);
|
81
|
+
const headers = await value(this.headers, responses, options2);
|
82
|
+
const response = await toBatchResponse({
|
83
|
+
status,
|
84
|
+
headers,
|
85
|
+
mode,
|
86
|
+
body: async function* () {
|
87
|
+
const promises = [...responses];
|
88
|
+
while (true) {
|
89
|
+
const handling = promises.filter((p) => p !== void 0);
|
90
|
+
if (handling.length === 0) {
|
91
|
+
return;
|
92
|
+
}
|
93
|
+
const result = await Promise.race(handling);
|
94
|
+
promises[result.index] = void 0;
|
95
|
+
yield result;
|
96
|
+
}
|
97
|
+
}()
|
98
|
+
});
|
99
|
+
return {
|
100
|
+
matched: true,
|
101
|
+
response
|
102
|
+
};
|
87
103
|
});
|
88
|
-
return {
|
89
|
-
matched: true,
|
90
|
-
response
|
91
|
-
};
|
92
104
|
} catch (cause) {
|
93
105
|
if (isParsing) {
|
94
106
|
return {
|
@@ -175,6 +187,22 @@ class CORSPlugin {
|
|
175
187
|
}
|
176
188
|
}
|
177
189
|
|
190
|
+
class RequestHeadersPlugin {
|
191
|
+
init(options) {
|
192
|
+
options.rootInterceptors ??= [];
|
193
|
+
options.rootInterceptors.push((interceptorOptions) => {
|
194
|
+
const reqHeaders = interceptorOptions.context.reqHeaders ?? toFetchHeaders(interceptorOptions.request.headers);
|
195
|
+
return interceptorOptions.next({
|
196
|
+
...interceptorOptions,
|
197
|
+
context: {
|
198
|
+
...interceptorOptions.context,
|
199
|
+
reqHeaders
|
200
|
+
}
|
201
|
+
});
|
202
|
+
});
|
203
|
+
}
|
204
|
+
}
|
205
|
+
|
178
206
|
class ResponseHeadersPlugin {
|
179
207
|
init(options) {
|
180
208
|
options.rootInterceptors ??= [];
|
@@ -190,7 +218,7 @@ class ResponseHeadersPlugin {
|
|
190
218
|
if (!result.matched) {
|
191
219
|
return result;
|
192
220
|
}
|
193
|
-
const responseHeaders = result.response.headers;
|
221
|
+
const responseHeaders = clone(result.response.headers);
|
194
222
|
for (const [key, value] of resHeaders) {
|
195
223
|
if (Array.isArray(responseHeaders[key])) {
|
196
224
|
responseHeaders[key].push(value);
|
@@ -200,7 +228,13 @@ class ResponseHeadersPlugin {
|
|
200
228
|
responseHeaders[key] = value;
|
201
229
|
}
|
202
230
|
}
|
203
|
-
return
|
231
|
+
return {
|
232
|
+
...result,
|
233
|
+
response: {
|
234
|
+
...result.response,
|
235
|
+
headers: responseHeaders
|
236
|
+
}
|
237
|
+
};
|
204
238
|
});
|
205
239
|
}
|
206
240
|
}
|
@@ -248,4 +282,4 @@ class SimpleCsrfProtectionHandlerPlugin {
|
|
248
282
|
}
|
249
283
|
}
|
250
284
|
|
251
|
-
export { BatchHandlerPlugin, CORSPlugin, ResponseHeadersPlugin, SimpleCsrfProtectionHandlerPlugin };
|
285
|
+
export { BatchHandlerPlugin, CORSPlugin, RequestHeadersPlugin, ResponseHeadersPlugin, SimpleCsrfProtectionHandlerPlugin };
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { C as Context } from './server.CYNGeoCm.js';
|
2
|
+
import { b as StandardHandleOptions } from './server.Bmh5xd4n.js';
|
3
|
+
|
4
|
+
type FriendlyStandardHandleOptions<T extends Context> = Omit<StandardHandleOptions<T>, 'context'> & (Record<never, never> extends T ? {
|
5
|
+
context?: T;
|
6
|
+
} : {
|
7
|
+
context: T;
|
8
|
+
});
|
9
|
+
declare function resolveFriendlyStandardHandleOptions<T extends Context>(options: FriendlyStandardHandleOptions<T>): StandardHandleOptions<T>;
|
10
|
+
|
11
|
+
export { resolveFriendlyStandardHandleOptions as r };
|
12
|
+
export type { FriendlyStandardHandleOptions as F };
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { C as Context } from './server.CYNGeoCm.mjs';
|
2
|
+
import { b as StandardHandleOptions } from './server.gqRxT-yN.mjs';
|
3
|
+
|
4
|
+
type FriendlyStandardHandleOptions<T extends Context> = Omit<StandardHandleOptions<T>, 'context'> & (Record<never, never> extends T ? {
|
5
|
+
context?: T;
|
6
|
+
} : {
|
7
|
+
context: T;
|
8
|
+
});
|
9
|
+
declare function resolveFriendlyStandardHandleOptions<T extends Context>(options: FriendlyStandardHandleOptions<T>): StandardHandleOptions<T>;
|
10
|
+
|
11
|
+
export { resolveFriendlyStandardHandleOptions as r };
|
12
|
+
export type { FriendlyStandardHandleOptions as F };
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { StandardRPCJsonSerializerOptions } from '@orpc/client/standard';
|
2
|
+
import { b as AnyRouter, C as Context, R as Router } from './server.CYNGeoCm.mjs';
|
3
|
+
import { i as StandardMatcher, h as StandardMatchResult, e as StandardHandlerOptions, f as StandardHandler } from './server.gqRxT-yN.mjs';
|
4
|
+
import { HTTPPath } from '@orpc/client';
|
5
|
+
import { Value } from '@orpc/shared';
|
6
|
+
import { T as TraverseContractProcedureCallbackOptions } from './server.DhJj-1X9.mjs';
|
7
|
+
|
8
|
+
interface StandardRPCMatcherOptions {
|
9
|
+
/**
|
10
|
+
* Filter procedures. Return `false` to exclude a procedure from matching.
|
11
|
+
*
|
12
|
+
* @default true
|
13
|
+
*/
|
14
|
+
filter?: Value<boolean, [options: TraverseContractProcedureCallbackOptions]>;
|
15
|
+
}
|
16
|
+
declare class StandardRPCMatcher implements StandardMatcher {
|
17
|
+
private readonly filter;
|
18
|
+
private readonly tree;
|
19
|
+
private pendingRouters;
|
20
|
+
constructor(options?: StandardRPCMatcherOptions);
|
21
|
+
init(router: AnyRouter, path?: readonly string[]): void;
|
22
|
+
match(_method: string, pathname: HTTPPath): Promise<StandardMatchResult>;
|
23
|
+
}
|
24
|
+
|
25
|
+
interface StandardRPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T>, StandardRPCJsonSerializerOptions, StandardRPCMatcherOptions {
|
26
|
+
}
|
27
|
+
declare class StandardRPCHandler<T extends Context> extends StandardHandler<T> {
|
28
|
+
constructor(router: Router<any, T>, options?: StandardRPCHandlerOptions<T>);
|
29
|
+
}
|
30
|
+
|
31
|
+
export { StandardRPCHandler as a, StandardRPCMatcher as c };
|
32
|
+
export type { StandardRPCHandlerOptions as S, StandardRPCMatcherOptions as b };
|