@orpc/server 0.0.0-next.f16d90e → 0.0.0-next.f21e305
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 +9 -9
- package/dist/adapters/aws-lambda/index.d.mts +7 -6
- package/dist/adapters/aws-lambda/index.d.ts +7 -6
- package/dist/adapters/aws-lambda/index.mjs +7 -6
- 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 +16 -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 +11 -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 -4
- package/dist/adapters/message-port/index.d.mts +11 -8
- package/dist/adapters/message-port/index.d.ts +11 -8
- package/dist/adapters/message-port/index.mjs +14 -16
- package/dist/adapters/node/index.d.mts +30 -8
- package/dist/adapters/node/index.d.ts +30 -8
- package/dist/adapters/node/index.mjs +70 -13
- package/dist/adapters/standard/index.d.mts +8 -13
- package/dist/adapters/standard/index.d.ts +8 -13
- package/dist/adapters/standard/index.mjs +3 -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 +49 -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 +13 -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 +22 -48
- package/dist/index.d.ts +22 -48
- package/dist/index.mjs +24 -10
- package/dist/plugins/index.d.mts +19 -6
- package/dist/plugins/index.d.ts +19 -6
- package/dist/plugins/index.mjs +96 -60
- package/dist/shared/{server.DD2C4ujN.d.mts → server.B4BGqy3Y.d.mts} +6 -5
- package/dist/shared/{server.DD2C4ujN.d.ts → server.B4BGqy3Y.d.ts} +6 -5
- package/dist/shared/server.COL12UTb.d.ts +32 -0
- package/dist/shared/server.CVKCo60T.d.mts +12 -0
- package/dist/shared/{server.DG7Tamti.mjs → server.CaqDCZX1.mjs} +116 -74
- package/dist/shared/server.Cb6yD7DZ.d.ts +42 -0
- package/dist/shared/server.Ck-gOLzq.d.mts +32 -0
- package/dist/shared/{server.Dq8xr7PQ.d.mts → server.DBCUJijK.d.mts} +3 -3
- package/dist/shared/server.DNtJ-p60.d.ts +12 -0
- package/dist/shared/{server.-ACo36I0.d.ts → server.DPIFWpxG.d.ts} +3 -3
- package/dist/shared/{server.BVwwTHyO.mjs → server.DZ5BIITo.mjs} +1 -1
- package/dist/shared/server.DzV1hr3z.d.mts +42 -0
- package/dist/shared/server.UVMTOWrk.mjs +26 -0
- package/dist/shared/{server.CHvOkcM3.mjs → server.vzZSq5UM.mjs} +74 -41
- package/package.json +30 -13
- package/dist/shared/server.BPAWobQg.d.ts +0 -12
- package/dist/shared/server.Bd52nNaH.d.mts +0 -12
- package/dist/shared/server.BliFSTnG.d.mts +0 -10
- package/dist/shared/server.IG2MjhrD.d.ts +0 -10
@@ -1,6 +1,7 @@
|
|
1
|
-
import { isContractProcedure, ValidationError, mergePrefix, mergeErrorMap, enhanceRoute } from '@orpc/contract';
|
2
|
-
import {
|
3
|
-
import {
|
1
|
+
import { isContractProcedure, validateORPCError, ValidationError, mergePrefix, mergeErrorMap, enhanceRoute } from '@orpc/contract';
|
2
|
+
import { resolveMaybeOptionalOptions, toArray, value, runWithSpan, intercept, isAsyncIteratorObject, asyncIteratorWithSpan } from '@orpc/shared';
|
3
|
+
import { ORPCError, mapEventIterator } from '@orpc/client';
|
4
|
+
import { HibernationEventIterator } from '@orpc/standard-server';
|
4
5
|
|
5
6
|
const LAZY_SYMBOL = Symbol("ORPC_LAZY_SYMBOL");
|
6
7
|
function lazy(loader, meta = {}) {
|
@@ -71,14 +72,15 @@ function createORPCErrorConstructorMap(errors) {
|
|
71
72
|
if (typeof code !== "string") {
|
72
73
|
return Reflect.get(target, code);
|
73
74
|
}
|
74
|
-
const item = (...
|
75
|
+
const item = (...rest) => {
|
76
|
+
const options = resolveMaybeOptionalOptions(rest);
|
75
77
|
const config = errors[code];
|
76
78
|
return new ORPCError(code, {
|
77
79
|
defined: Boolean(config),
|
78
80
|
status: config?.status,
|
79
|
-
message: options
|
80
|
-
data: options
|
81
|
-
cause: options
|
81
|
+
message: options.message ?? config?.message,
|
82
|
+
data: options.data,
|
83
|
+
cause: options.cause
|
82
84
|
});
|
83
85
|
};
|
84
86
|
return item;
|
@@ -86,54 +88,64 @@ function createORPCErrorConstructorMap(errors) {
|
|
86
88
|
});
|
87
89
|
return proxy;
|
88
90
|
}
|
89
|
-
async function validateORPCError(map, error) {
|
90
|
-
const { code, status, message, data, cause, defined } = error;
|
91
|
-
const config = map?.[error.code];
|
92
|
-
if (!config || fallbackORPCErrorStatus(error.code, config.status) !== error.status) {
|
93
|
-
return defined ? new ORPCError(code, { defined: false, status, message, data, cause }) : error;
|
94
|
-
}
|
95
|
-
if (!config.data) {
|
96
|
-
return defined ? error : new ORPCError(code, { defined: true, status, message, data, cause });
|
97
|
-
}
|
98
|
-
const validated = await config.data["~standard"].validate(error.data);
|
99
|
-
if (validated.issues) {
|
100
|
-
return defined ? new ORPCError(code, { defined: false, status, message, data, cause }) : error;
|
101
|
-
}
|
102
|
-
return new ORPCError(code, { defined: true, status, message, data: validated.value, cause });
|
103
|
-
}
|
104
91
|
|
105
92
|
function middlewareOutputFn(output) {
|
106
93
|
return { output, context: {} };
|
107
94
|
}
|
108
95
|
|
109
|
-
function createProcedureClient(lazyableProcedure, ...
|
96
|
+
function createProcedureClient(lazyableProcedure, ...rest) {
|
97
|
+
const options = resolveMaybeOptionalOptions(rest);
|
110
98
|
return async (...[input, callerOptions]) => {
|
111
|
-
const path = options
|
99
|
+
const path = toArray(options.path);
|
112
100
|
const { default: procedure } = await unlazy(lazyableProcedure);
|
113
101
|
const clientContext = callerOptions?.context ?? {};
|
114
|
-
const context = await value(options
|
102
|
+
const context = await value(options.context ?? {}, clientContext);
|
115
103
|
const errors = createORPCErrorConstructorMap(procedure["~orpc"].errorMap);
|
104
|
+
const validateError = async (e) => {
|
105
|
+
if (e instanceof ORPCError) {
|
106
|
+
return await validateORPCError(procedure["~orpc"].errorMap, e);
|
107
|
+
}
|
108
|
+
return e;
|
109
|
+
};
|
116
110
|
try {
|
117
|
-
|
118
|
-
|
119
|
-
{
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
111
|
+
const output = await runWithSpan(
|
112
|
+
{ name: "call_procedure", signal: callerOptions?.signal },
|
113
|
+
(span) => {
|
114
|
+
span?.setAttribute("procedure.path", [...path]);
|
115
|
+
return intercept(
|
116
|
+
toArray(options.interceptors),
|
117
|
+
{
|
118
|
+
context,
|
119
|
+
input,
|
120
|
+
// input only optional when it undefinable so we can safely cast it
|
121
|
+
errors,
|
122
|
+
path,
|
123
|
+
procedure,
|
124
|
+
signal: callerOptions?.signal,
|
125
|
+
lastEventId: callerOptions?.lastEventId
|
126
|
+
},
|
127
|
+
(interceptorOptions) => executeProcedureInternal(interceptorOptions.procedure, interceptorOptions)
|
128
|
+
);
|
129
|
+
}
|
130
130
|
);
|
131
|
-
|
132
|
-
|
133
|
-
|
131
|
+
if (isAsyncIteratorObject(output)) {
|
132
|
+
if (output instanceof HibernationEventIterator) {
|
133
|
+
return output;
|
134
|
+
}
|
135
|
+
return mapEventIterator(
|
136
|
+
asyncIteratorWithSpan(
|
137
|
+
{ name: "consume_event_iterator_output", signal: callerOptions?.signal },
|
138
|
+
output
|
139
|
+
),
|
140
|
+
{
|
141
|
+
value: (v) => v,
|
142
|
+
error: (e) => validateError(e)
|
143
|
+
}
|
144
|
+
);
|
134
145
|
}
|
135
|
-
|
136
|
-
|
146
|
+
return output;
|
147
|
+
} catch (e) {
|
148
|
+
throw await validateError(e);
|
137
149
|
}
|
138
150
|
};
|
139
151
|
}
|
@@ -142,31 +154,49 @@ async function validateInput(procedure, input) {
|
|
142
154
|
if (!schema) {
|
143
155
|
return input;
|
144
156
|
}
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
157
|
+
return runWithSpan(
|
158
|
+
{ name: "validate_input" },
|
159
|
+
async () => {
|
160
|
+
const result = await schema["~standard"].validate(input);
|
161
|
+
if (result.issues) {
|
162
|
+
throw new ORPCError("BAD_REQUEST", {
|
163
|
+
message: "Input validation failed",
|
164
|
+
data: {
|
165
|
+
issues: result.issues
|
166
|
+
},
|
167
|
+
cause: new ValidationError({
|
168
|
+
message: "Input validation failed",
|
169
|
+
issues: result.issues,
|
170
|
+
data: input
|
171
|
+
})
|
172
|
+
});
|
173
|
+
}
|
174
|
+
return result.value;
|
175
|
+
}
|
176
|
+
);
|
156
177
|
}
|
157
178
|
async function validateOutput(procedure, output) {
|
158
179
|
const schema = procedure["~orpc"].outputSchema;
|
159
180
|
if (!schema) {
|
160
181
|
return output;
|
161
182
|
}
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
183
|
+
return runWithSpan(
|
184
|
+
{ name: "validate_output" },
|
185
|
+
async () => {
|
186
|
+
const result = await schema["~standard"].validate(output);
|
187
|
+
if (result.issues) {
|
188
|
+
throw new ORPCError("INTERNAL_SERVER_ERROR", {
|
189
|
+
message: "Output validation failed",
|
190
|
+
cause: new ValidationError({
|
191
|
+
message: "Output validation failed",
|
192
|
+
issues: result.issues,
|
193
|
+
data: output
|
194
|
+
})
|
195
|
+
});
|
196
|
+
}
|
197
|
+
return result.value;
|
198
|
+
}
|
199
|
+
);
|
170
200
|
}
|
171
201
|
async function executeProcedureInternal(procedure, options) {
|
172
202
|
const middlewares = procedure["~orpc"].middlewares;
|
@@ -178,17 +208,28 @@ async function executeProcedureInternal(procedure, options) {
|
|
178
208
|
currentInput = await validateInput(procedure, currentInput);
|
179
209
|
}
|
180
210
|
const mid = middlewares[index];
|
181
|
-
const output = mid ?
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
context
|
189
|
-
|
211
|
+
const output = mid ? await runWithSpan(
|
212
|
+
{ name: `middleware.${mid.name}`, signal: options.signal },
|
213
|
+
async (span) => {
|
214
|
+
span?.setAttribute("middleware.index", index);
|
215
|
+
span?.setAttribute("middleware.name", mid.name);
|
216
|
+
const result = await mid({
|
217
|
+
...options,
|
218
|
+
context,
|
219
|
+
next: async (...[nextOptions]) => {
|
220
|
+
const nextContext = nextOptions?.context ?? {};
|
221
|
+
return {
|
222
|
+
output: await next(index + 1, mergeCurrentContext(context, nextContext), currentInput),
|
223
|
+
context: nextContext
|
224
|
+
};
|
225
|
+
}
|
226
|
+
}, currentInput, middlewareOutputFn);
|
227
|
+
return result.output;
|
190
228
|
}
|
191
|
-
|
229
|
+
) : await runWithSpan(
|
230
|
+
{ name: "handler", signal: options.signal },
|
231
|
+
() => procedure["~orpc"].handler({ ...options, context, input: currentInput })
|
232
|
+
);
|
192
233
|
if (index === outputValidationIndex) {
|
193
234
|
return await validateOutput(procedure, output);
|
194
235
|
}
|
@@ -361,7 +402,8 @@ function createContractedProcedure(procedure, contract) {
|
|
361
402
|
});
|
362
403
|
}
|
363
404
|
function call(procedure, input, ...rest) {
|
364
|
-
|
405
|
+
const options = resolveMaybeOptionalOptions(rest);
|
406
|
+
return createProcedureClient(procedure, options)(input, options);
|
365
407
|
}
|
366
408
|
|
367
|
-
export { LAZY_SYMBOL as L, Procedure as P, createContractedProcedure as a, addMiddleware as b, createProcedureClient as c, isLazy as d, enhanceRouter as e, createAssertedLazyProcedure as f, getRouter as g, createORPCErrorConstructorMap as h, isProcedure as i, getLazyMeta as j, middlewareOutputFn as k, lazy as l, mergeCurrentContext as m, isStartWithMiddlewares as n, mergeMiddlewares as o, call as p, getHiddenRouterContract as q, createAccessibleLazyRouter as r, setHiddenRouterContract as s, traverseContractProcedures as t, unlazy as u,
|
409
|
+
export { LAZY_SYMBOL as L, Procedure as P, createContractedProcedure as a, addMiddleware as b, createProcedureClient as c, isLazy as d, enhanceRouter as e, createAssertedLazyProcedure as f, getRouter as g, createORPCErrorConstructorMap as h, isProcedure as i, getLazyMeta as j, middlewareOutputFn as k, lazy as l, mergeCurrentContext as m, isStartWithMiddlewares as n, mergeMiddlewares as o, call as p, getHiddenRouterContract as q, createAccessibleLazyRouter as r, setHiddenRouterContract as s, traverseContractProcedures as t, unlazy as u, resolveContractProcedures as v, unlazyRouter as w };
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { ErrorMap, EnhanceRouteOptions, MergedErrorMap, AnyContractRouter, AnyContractProcedure } from '@orpc/contract';
|
2
|
+
import { a as AnyMiddleware, L as Lazyable, b as AnyRouter, C as Context, c as Lazy, A as AnyProcedure, P as Procedure, M as MergedInitialContext } from './server.B4BGqy3Y.js';
|
3
|
+
|
4
|
+
declare function getRouter<T extends Lazyable<AnyRouter | undefined>>(router: T, path: readonly string[]): T extends Lazy<any> ? Lazy<AnyRouter | undefined> : Lazyable<AnyRouter | undefined>;
|
5
|
+
type AccessibleLazyRouter<T extends Lazyable<AnyRouter | undefined>> = T extends Lazy<infer U extends AnyRouter | undefined | Lazy<AnyRouter | undefined>> ? AccessibleLazyRouter<U> : T extends AnyProcedure | undefined ? Lazy<T> : Lazy<T> & {
|
6
|
+
[K in keyof T]: T[K] extends Lazyable<AnyRouter> ? AccessibleLazyRouter<T[K]> : never;
|
7
|
+
};
|
8
|
+
declare function createAccessibleLazyRouter<T extends Lazy<AnyRouter | undefined>>(lazied: T): AccessibleLazyRouter<T>;
|
9
|
+
type EnhancedRouter<T extends Lazyable<AnyRouter>, TInitialContext extends Context, TCurrentContext extends Context, TErrorMap extends ErrorMap> = T extends Lazy<infer U extends AnyRouter> ? AccessibleLazyRouter<EnhancedRouter<U, TInitialContext, TCurrentContext, TErrorMap>> : T extends Procedure<infer UInitialContext, infer UCurrentContext, infer UInputSchema, infer UOutputSchema, infer UErrorMap, infer UMeta> ? Procedure<MergedInitialContext<TInitialContext, UInitialContext, TCurrentContext>, UCurrentContext, UInputSchema, UOutputSchema, MergedErrorMap<TErrorMap, UErrorMap>, UMeta> : {
|
10
|
+
[K in keyof T]: T[K] extends Lazyable<AnyRouter> ? EnhancedRouter<T[K], TInitialContext, TCurrentContext, TErrorMap> : never;
|
11
|
+
};
|
12
|
+
interface EnhanceRouterOptions<TErrorMap extends ErrorMap> extends EnhanceRouteOptions {
|
13
|
+
middlewares: readonly AnyMiddleware[];
|
14
|
+
errorMap: TErrorMap;
|
15
|
+
dedupeLeadingMiddlewares: boolean;
|
16
|
+
}
|
17
|
+
declare function enhanceRouter<T extends Lazyable<AnyRouter>, TInitialContext extends Context, TCurrentContext extends Context, TErrorMap extends ErrorMap>(router: T, options: EnhanceRouterOptions<TErrorMap>): EnhancedRouter<T, TInitialContext, TCurrentContext, TErrorMap>;
|
18
|
+
interface TraverseContractProceduresOptions {
|
19
|
+
router: AnyContractRouter | AnyRouter;
|
20
|
+
path: readonly string[];
|
21
|
+
}
|
22
|
+
interface TraverseContractProcedureCallbackOptions {
|
23
|
+
contract: AnyContractProcedure | AnyProcedure;
|
24
|
+
path: readonly string[];
|
25
|
+
}
|
26
|
+
/**
|
27
|
+
* @deprecated Use `TraverseContractProcedureCallbackOptions` instead.
|
28
|
+
*/
|
29
|
+
type ContractProcedureCallbackOptions = TraverseContractProcedureCallbackOptions;
|
30
|
+
interface LazyTraverseContractProceduresOptions {
|
31
|
+
router: Lazy<AnyRouter>;
|
32
|
+
path: readonly string[];
|
33
|
+
}
|
34
|
+
declare function traverseContractProcedures(options: TraverseContractProceduresOptions, callback: (options: TraverseContractProcedureCallbackOptions) => void, lazyOptions?: LazyTraverseContractProceduresOptions[]): LazyTraverseContractProceduresOptions[];
|
35
|
+
declare function resolveContractProcedures(options: TraverseContractProceduresOptions, callback: (options: TraverseContractProcedureCallbackOptions) => void): Promise<void>;
|
36
|
+
type UnlaziedRouter<T extends AnyRouter> = T extends AnyProcedure ? T : {
|
37
|
+
[K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? UnlaziedRouter<U> : never;
|
38
|
+
};
|
39
|
+
declare function unlazyRouter<T extends AnyRouter>(router: T): Promise<UnlaziedRouter<T>>;
|
40
|
+
|
41
|
+
export { createAccessibleLazyRouter as c, enhanceRouter as e, getRouter as g, resolveContractProcedures as r, traverseContractProcedures as t, unlazyRouter as u };
|
42
|
+
export type { AccessibleLazyRouter as A, ContractProcedureCallbackOptions as C, EnhanceRouterOptions as E, LazyTraverseContractProceduresOptions as L, TraverseContractProcedureCallbackOptions as T, UnlaziedRouter as U, EnhancedRouter as a, TraverseContractProceduresOptions as b };
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { StandardRPCJsonSerializerOptions } from '@orpc/client/standard';
|
2
|
+
import { b as AnyRouter, C as Context, R as Router } from './server.B4BGqy3Y.mjs';
|
3
|
+
import { i as StandardMatcher, h as StandardMatchResult, e as StandardHandlerOptions, f as StandardHandler } from './server.DBCUJijK.mjs';
|
4
|
+
import { HTTPPath } from '@orpc/client';
|
5
|
+
import { Value } from '@orpc/shared';
|
6
|
+
import { T as TraverseContractProcedureCallbackOptions } from './server.DzV1hr3z.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 };
|
@@ -2,7 +2,7 @@ import { HTTPPath, ORPCError } from '@orpc/client';
|
|
2
2
|
import { Meta } from '@orpc/contract';
|
3
3
|
import { Interceptor } from '@orpc/shared';
|
4
4
|
import { StandardResponse, StandardLazyRequest } from '@orpc/standard-server';
|
5
|
-
import { C as Context, R as Router,
|
5
|
+
import { C as Context, R as Router, b as AnyRouter, A as AnyProcedure, d as ProcedureClientInterceptorOptions } from './server.B4BGqy3Y.mjs';
|
6
6
|
|
7
7
|
interface StandardHandlerPlugin<T extends Context> {
|
8
8
|
order?: number;
|
@@ -70,5 +70,5 @@ declare class StandardHandler<T extends Context> {
|
|
70
70
|
handle(request: StandardLazyRequest, options: StandardHandleOptions<T>): Promise<StandardHandleResult>;
|
71
71
|
}
|
72
72
|
|
73
|
-
export { CompositeStandardHandlerPlugin as C, StandardHandler as
|
74
|
-
export type {
|
73
|
+
export { CompositeStandardHandlerPlugin as C, StandardHandler as f };
|
74
|
+
export type { StandardCodec as S, StandardParams as a, StandardHandleOptions as b, StandardHandleResult as c, StandardHandlerInterceptorOptions as d, StandardHandlerOptions as e, StandardHandlerPlugin as g, StandardMatchResult as h, StandardMatcher as i };
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { C as Context } from './server.B4BGqy3Y.js';
|
2
|
+
import { b as StandardHandleOptions } from './server.DPIFWpxG.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 };
|
@@ -2,7 +2,7 @@ import { HTTPPath, ORPCError } from '@orpc/client';
|
|
2
2
|
import { Meta } from '@orpc/contract';
|
3
3
|
import { Interceptor } from '@orpc/shared';
|
4
4
|
import { StandardResponse, StandardLazyRequest } from '@orpc/standard-server';
|
5
|
-
import { C as Context, R as Router,
|
5
|
+
import { C as Context, R as Router, b as AnyRouter, A as AnyProcedure, d as ProcedureClientInterceptorOptions } from './server.B4BGqy3Y.js';
|
6
6
|
|
7
7
|
interface StandardHandlerPlugin<T extends Context> {
|
8
8
|
order?: number;
|
@@ -70,5 +70,5 @@ declare class StandardHandler<T extends Context> {
|
|
70
70
|
handle(request: StandardLazyRequest, options: StandardHandleOptions<T>): Promise<StandardHandleResult>;
|
71
71
|
}
|
72
72
|
|
73
|
-
export { CompositeStandardHandlerPlugin as C, StandardHandler as
|
74
|
-
export type {
|
73
|
+
export { CompositeStandardHandlerPlugin as C, StandardHandler as f };
|
74
|
+
export type { StandardCodec as S, StandardParams as a, StandardHandleOptions as b, StandardHandleResult as c, StandardHandlerInterceptorOptions as d, StandardHandlerOptions as e, StandardHandlerPlugin as g, StandardMatchResult as h, StandardMatcher as i };
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { ErrorMap, EnhanceRouteOptions, MergedErrorMap, AnyContractRouter, AnyContractProcedure } from '@orpc/contract';
|
2
|
+
import { a as AnyMiddleware, L as Lazyable, b as AnyRouter, C as Context, c as Lazy, A as AnyProcedure, P as Procedure, M as MergedInitialContext } from './server.B4BGqy3Y.mjs';
|
3
|
+
|
4
|
+
declare function getRouter<T extends Lazyable<AnyRouter | undefined>>(router: T, path: readonly string[]): T extends Lazy<any> ? Lazy<AnyRouter | undefined> : Lazyable<AnyRouter | undefined>;
|
5
|
+
type AccessibleLazyRouter<T extends Lazyable<AnyRouter | undefined>> = T extends Lazy<infer U extends AnyRouter | undefined | Lazy<AnyRouter | undefined>> ? AccessibleLazyRouter<U> : T extends AnyProcedure | undefined ? Lazy<T> : Lazy<T> & {
|
6
|
+
[K in keyof T]: T[K] extends Lazyable<AnyRouter> ? AccessibleLazyRouter<T[K]> : never;
|
7
|
+
};
|
8
|
+
declare function createAccessibleLazyRouter<T extends Lazy<AnyRouter | undefined>>(lazied: T): AccessibleLazyRouter<T>;
|
9
|
+
type EnhancedRouter<T extends Lazyable<AnyRouter>, TInitialContext extends Context, TCurrentContext extends Context, TErrorMap extends ErrorMap> = T extends Lazy<infer U extends AnyRouter> ? AccessibleLazyRouter<EnhancedRouter<U, TInitialContext, TCurrentContext, TErrorMap>> : T extends Procedure<infer UInitialContext, infer UCurrentContext, infer UInputSchema, infer UOutputSchema, infer UErrorMap, infer UMeta> ? Procedure<MergedInitialContext<TInitialContext, UInitialContext, TCurrentContext>, UCurrentContext, UInputSchema, UOutputSchema, MergedErrorMap<TErrorMap, UErrorMap>, UMeta> : {
|
10
|
+
[K in keyof T]: T[K] extends Lazyable<AnyRouter> ? EnhancedRouter<T[K], TInitialContext, TCurrentContext, TErrorMap> : never;
|
11
|
+
};
|
12
|
+
interface EnhanceRouterOptions<TErrorMap extends ErrorMap> extends EnhanceRouteOptions {
|
13
|
+
middlewares: readonly AnyMiddleware[];
|
14
|
+
errorMap: TErrorMap;
|
15
|
+
dedupeLeadingMiddlewares: boolean;
|
16
|
+
}
|
17
|
+
declare function enhanceRouter<T extends Lazyable<AnyRouter>, TInitialContext extends Context, TCurrentContext extends Context, TErrorMap extends ErrorMap>(router: T, options: EnhanceRouterOptions<TErrorMap>): EnhancedRouter<T, TInitialContext, TCurrentContext, TErrorMap>;
|
18
|
+
interface TraverseContractProceduresOptions {
|
19
|
+
router: AnyContractRouter | AnyRouter;
|
20
|
+
path: readonly string[];
|
21
|
+
}
|
22
|
+
interface TraverseContractProcedureCallbackOptions {
|
23
|
+
contract: AnyContractProcedure | AnyProcedure;
|
24
|
+
path: readonly string[];
|
25
|
+
}
|
26
|
+
/**
|
27
|
+
* @deprecated Use `TraverseContractProcedureCallbackOptions` instead.
|
28
|
+
*/
|
29
|
+
type ContractProcedureCallbackOptions = TraverseContractProcedureCallbackOptions;
|
30
|
+
interface LazyTraverseContractProceduresOptions {
|
31
|
+
router: Lazy<AnyRouter>;
|
32
|
+
path: readonly string[];
|
33
|
+
}
|
34
|
+
declare function traverseContractProcedures(options: TraverseContractProceduresOptions, callback: (options: TraverseContractProcedureCallbackOptions) => void, lazyOptions?: LazyTraverseContractProceduresOptions[]): LazyTraverseContractProceduresOptions[];
|
35
|
+
declare function resolveContractProcedures(options: TraverseContractProceduresOptions, callback: (options: TraverseContractProcedureCallbackOptions) => void): Promise<void>;
|
36
|
+
type UnlaziedRouter<T extends AnyRouter> = T extends AnyProcedure ? T : {
|
37
|
+
[K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? UnlaziedRouter<U> : never;
|
38
|
+
};
|
39
|
+
declare function unlazyRouter<T extends AnyRouter>(router: T): Promise<UnlaziedRouter<T>>;
|
40
|
+
|
41
|
+
export { createAccessibleLazyRouter as c, enhanceRouter as e, getRouter as g, resolveContractProcedures as r, traverseContractProcedures as t, unlazyRouter as u };
|
42
|
+
export type { AccessibleLazyRouter as A, ContractProcedureCallbackOptions as C, EnhanceRouterOptions as E, LazyTraverseContractProceduresOptions as L, TraverseContractProcedureCallbackOptions as T, UnlaziedRouter as U, EnhancedRouter as a, TraverseContractProceduresOptions as b };
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import '@orpc/client';
|
2
|
+
import '@orpc/shared';
|
3
|
+
import '@orpc/standard-server';
|
4
|
+
import '@orpc/contract';
|
5
|
+
import '@orpc/client/standard';
|
6
|
+
import { r as resolveFriendlyStandardHandleOptions } from './server.DZ5BIITo.mjs';
|
7
|
+
|
8
|
+
async function handleStandardServerPeerMessage(handler, peer, message, options) {
|
9
|
+
const [id, request] = await peer.message(message);
|
10
|
+
if (!request) {
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
const handle = createServerPeerHandleRequestFn(handler, options);
|
14
|
+
await peer.response(id, await handle(request));
|
15
|
+
}
|
16
|
+
function createServerPeerHandleRequestFn(handler, options) {
|
17
|
+
return async (request) => {
|
18
|
+
const { response } = await handler.handle(
|
19
|
+
{ ...request, body: () => Promise.resolve(request.body) },
|
20
|
+
resolveFriendlyStandardHandleOptions(options)
|
21
|
+
);
|
22
|
+
return response ?? { status: 404, headers: {}, body: "No procedure matched" };
|
23
|
+
};
|
24
|
+
}
|
25
|
+
|
26
|
+
export { createServerPeerHandleRequestFn as c, handleStandardServerPeerMessage as h };
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { toHttpPath, StandardRPCJsonSerializer, StandardRPCSerializer } from '@orpc/client/standard';
|
2
2
|
import { ORPCError, toORPCError } from '@orpc/client';
|
3
|
-
import { toArray, intercept, parseEmptyableJSON, NullProtoObj } from '@orpc/shared';
|
3
|
+
import { toArray, intercept, runWithSpan, ORPC_NAME, isAsyncIteratorObject, asyncIteratorWithSpan, setSpanError, parseEmptyableJSON, NullProtoObj, value } from '@orpc/shared';
|
4
4
|
import { flattenHeader } from '@orpc/standard-server';
|
5
|
-
import { c as createProcedureClient, t as traverseContractProcedures, i as isProcedure, u as unlazy, g as getRouter, a as createContractedProcedure } from './server.
|
5
|
+
import { c as createProcedureClient, t as traverseContractProcedures, i as isProcedure, u as unlazy, g as getRouter, a as createContractedProcedure } from './server.CaqDCZX1.mjs';
|
6
6
|
|
7
7
|
class CompositeStandardHandlerPlugin {
|
8
8
|
plugins;
|
@@ -39,49 +39,74 @@ class StandardHandler {
|
|
39
39
|
this.rootInterceptors,
|
40
40
|
{ ...options, request, prefix },
|
41
41
|
async (interceptorOptions) => {
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
42
|
+
return runWithSpan(
|
43
|
+
{ name: `${request.method} ${request.url.pathname}` },
|
44
|
+
async (span) => {
|
45
|
+
let step;
|
46
|
+
try {
|
47
|
+
return await intercept(
|
48
|
+
this.interceptors,
|
49
|
+
interceptorOptions,
|
50
|
+
async ({ request: request2, context, prefix: prefix2 }) => {
|
51
|
+
const method = request2.method;
|
52
|
+
const url = request2.url;
|
53
|
+
const pathname = prefix2 ? url.pathname.replace(prefix2, "") : url.pathname;
|
54
|
+
const match = await runWithSpan(
|
55
|
+
{ name: "find_procedure" },
|
56
|
+
() => this.matcher.match(method, `/${pathname.replace(/^\/|\/$/g, "")}`)
|
57
|
+
);
|
58
|
+
if (!match) {
|
59
|
+
return { matched: false, response: void 0 };
|
60
|
+
}
|
61
|
+
span?.updateName(`${ORPC_NAME}.${match.path.join("/")}`);
|
62
|
+
span?.setAttribute("rpc.system", ORPC_NAME);
|
63
|
+
span?.setAttribute("rpc.method", match.path.join("."));
|
64
|
+
step = "decode_input";
|
65
|
+
let input = await runWithSpan(
|
66
|
+
{ name: "decode_input" },
|
67
|
+
() => this.codec.decode(request2, match.params, match.procedure)
|
68
|
+
);
|
69
|
+
step = void 0;
|
70
|
+
if (isAsyncIteratorObject(input)) {
|
71
|
+
input = asyncIteratorWithSpan(
|
72
|
+
{ name: "consume_event_iterator_input", signal: request2.signal },
|
73
|
+
input
|
74
|
+
);
|
75
|
+
}
|
76
|
+
const client = createProcedureClient(match.procedure, {
|
77
|
+
context,
|
78
|
+
path: match.path,
|
79
|
+
interceptors: this.clientInterceptors
|
80
|
+
});
|
81
|
+
step = "call_procedure";
|
82
|
+
const output = await client(input, {
|
83
|
+
signal: request2.signal,
|
84
|
+
lastEventId: flattenHeader(request2.headers["last-event-id"])
|
85
|
+
});
|
86
|
+
step = void 0;
|
87
|
+
const response = this.codec.encode(output, match.procedure);
|
88
|
+
return {
|
89
|
+
matched: true,
|
90
|
+
response
|
91
|
+
};
|
92
|
+
}
|
93
|
+
);
|
94
|
+
} catch (e) {
|
95
|
+
if (step !== "call_procedure") {
|
96
|
+
setSpanError(span, e);
|
54
97
|
}
|
55
|
-
const
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
isDecoding = true;
|
61
|
-
const input = await this.codec.decode(request2, match.params, match.procedure);
|
62
|
-
isDecoding = false;
|
63
|
-
const output = await client(input, {
|
64
|
-
signal: request2.signal,
|
65
|
-
lastEventId: flattenHeader(request2.headers["last-event-id"])
|
66
|
-
});
|
67
|
-
const response = this.codec.encode(output, match.procedure);
|
98
|
+
const error = step === "decode_input" && !(e instanceof ORPCError) ? new ORPCError("BAD_REQUEST", {
|
99
|
+
message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
|
100
|
+
cause: e
|
101
|
+
}) : toORPCError(e);
|
102
|
+
const response = this.codec.encodeError(error);
|
68
103
|
return {
|
69
104
|
matched: true,
|
70
105
|
response
|
71
106
|
};
|
72
107
|
}
|
73
|
-
|
74
|
-
|
75
|
-
const error = isDecoding && !(e instanceof ORPCError) ? new ORPCError("BAD_REQUEST", {
|
76
|
-
message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
|
77
|
-
cause: e
|
78
|
-
}) : toORPCError(e);
|
79
|
-
const response = this.codec.encodeError(error);
|
80
|
-
return {
|
81
|
-
matched: true,
|
82
|
-
response
|
83
|
-
};
|
84
|
-
}
|
108
|
+
}
|
109
|
+
);
|
85
110
|
}
|
86
111
|
);
|
87
112
|
}
|
@@ -112,10 +137,18 @@ class StandardRPCCodec {
|
|
112
137
|
}
|
113
138
|
|
114
139
|
class StandardRPCMatcher {
|
140
|
+
filter;
|
115
141
|
tree = new NullProtoObj();
|
116
142
|
pendingRouters = [];
|
143
|
+
constructor(options = {}) {
|
144
|
+
this.filter = options.filter ?? true;
|
145
|
+
}
|
117
146
|
init(router, path = []) {
|
118
|
-
const laziedOptions = traverseContractProcedures({ router, path }, (
|
147
|
+
const laziedOptions = traverseContractProcedures({ router, path }, (traverseOptions) => {
|
148
|
+
if (!value(this.filter, traverseOptions)) {
|
149
|
+
return;
|
150
|
+
}
|
151
|
+
const { path: path2, contract } = traverseOptions;
|
119
152
|
const httpPath = toHttpPath(path2);
|
120
153
|
if (isProcedure(contract)) {
|
121
154
|
this.tree[httpPath] = {
|
@@ -177,7 +210,7 @@ class StandardRPCHandler extends StandardHandler {
|
|
177
210
|
constructor(router, options = {}) {
|
178
211
|
const jsonSerializer = new StandardRPCJsonSerializer(options);
|
179
212
|
const serializer = new StandardRPCSerializer(jsonSerializer);
|
180
|
-
const matcher = new StandardRPCMatcher();
|
213
|
+
const matcher = new StandardRPCMatcher(options);
|
181
214
|
const codec = new StandardRPCCodec(serializer);
|
182
215
|
super(router, matcher, codec, options);
|
183
216
|
}
|