@orpc/server 1.14.5 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -136
- package/dist/adapters/crossws/index.d.mts +42 -21
- package/dist/adapters/crossws/index.d.ts +42 -21
- package/dist/adapters/crossws/index.mjs +37 -18
- package/dist/adapters/fetch/index.d.mts +83 -67
- package/dist/adapters/fetch/index.d.ts +83 -67
- package/dist/adapters/fetch/index.mjs +131 -106
- package/dist/adapters/message-port/index.d.mts +51 -34
- package/dist/adapters/message-port/index.d.ts +51 -34
- package/dist/adapters/message-port/index.mjs +73 -38
- package/dist/adapters/node/index.d.mts +82 -60
- package/dist/adapters/node/index.d.ts +82 -60
- package/dist/adapters/node/index.mjs +127 -98
- package/dist/adapters/standard/index.d.mts +16 -18
- package/dist/adapters/standard/index.d.ts +16 -18
- package/dist/adapters/standard/index.mjs +5 -5
- package/dist/adapters/standard-peer/index.d.mts +12 -14
- package/dist/adapters/standard-peer/index.d.ts +12 -14
- package/dist/adapters/standard-peer/index.mjs +2 -21
- package/dist/adapters/websocket/index.d.mts +39 -34
- package/dist/adapters/websocket/index.d.ts +39 -34
- package/dist/adapters/websocket/index.mjs +42 -33
- package/dist/extensions/callable.d.mts +10 -0
- package/dist/extensions/callable.d.ts +10 -0
- package/dist/extensions/callable.mjs +11 -0
- package/dist/helpers/index.d.mts +2 -2
- package/dist/helpers/index.d.ts +2 -2
- package/dist/helpers/index.mjs +1 -1
- package/dist/index.d.mts +163 -770
- package/dist/index.d.ts +163 -770
- package/dist/index.mjs +296 -403
- package/dist/plugins/index.d.mts +105 -143
- package/dist/plugins/index.d.ts +105 -143
- package/dist/plugins/index.mjs +232 -255
- package/dist/shared/server.BB_Ik9Ph.d.mts +104 -0
- package/dist/shared/server.BL22TloH.d.mts +184 -0
- package/dist/shared/server.BL22TloH.d.ts +184 -0
- package/dist/shared/server.B_U9y00a.d.mts +66 -0
- package/dist/shared/server.BsNNjG5J.d.mts +61 -0
- package/dist/shared/server.BwHnWUuN.mjs +222 -0
- package/dist/shared/server.CX4vUnDk.mjs +11 -0
- package/dist/shared/server.CjOb6ItT.mjs +41 -0
- package/dist/shared/server.CrlKQucM.mjs +233 -0
- package/dist/shared/server.D_QauotT.mjs +30 -0
- package/dist/shared/server.EOHJ3NJr.d.ts +104 -0
- package/dist/shared/server.GDpX6Df8.mjs +271 -0
- package/dist/shared/server.Pa0F03f_.d.ts +61 -0
- package/dist/shared/server.T9F3bzZx.d.ts +66 -0
- package/dist/shared/{server.DZ5BIITo.mjs → server.W91HSRkE.mjs} +2 -2
- package/package.json +26 -55
- package/dist/adapters/aws-lambda/index.d.mts +0 -46
- package/dist/adapters/aws-lambda/index.d.ts +0 -46
- package/dist/adapters/aws-lambda/index.mjs +0 -40
- package/dist/adapters/bun-ws/index.d.mts +0 -36
- package/dist/adapters/bun-ws/index.d.ts +0 -36
- package/dist/adapters/bun-ws/index.mjs +0 -47
- package/dist/adapters/fastify/index.d.mts +0 -53
- package/dist/adapters/fastify/index.d.ts +0 -53
- package/dist/adapters/fastify/index.mjs +0 -52
- package/dist/adapters/ws/index.d.mts +0 -31
- package/dist/adapters/ws/index.d.ts +0 -31
- package/dist/adapters/ws/index.mjs +0 -37
- package/dist/hibernation/index.d.mts +0 -44
- package/dist/hibernation/index.d.ts +0 -44
- package/dist/hibernation/index.mjs +0 -65
- package/dist/shared/server.7cEtMB30.d.ts +0 -74
- package/dist/shared/server.B8gYOD5g.d.mts +0 -12
- package/dist/shared/server.BqadksTP.d.mts +0 -74
- package/dist/shared/server.C8_sRzQB.d.mts +0 -42
- package/dist/shared/server.ChUyt5-i.d.mts +0 -32
- package/dist/shared/server.ChyoA9XY.d.ts +0 -42
- package/dist/shared/server.DEBcqOjg.mjs +0 -418
- package/dist/shared/server.EfTOZ2Q7.d.ts +0 -12
- package/dist/shared/server.TEVCLCFC.mjs +0 -39
- package/dist/shared/server.ZxHCEN1h.mjs +0 -226
- package/dist/shared/server.qKsRrdxW.d.mts +0 -193
- package/dist/shared/server.qKsRrdxW.d.ts +0 -193
- package/dist/shared/server.yoEB3Fx4.d.ts +0 -32
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { ORPCError, toORPCError, RPCSerializer, COMMON_ERROR_STATUS_MAP } from '@orpc/client';
|
|
2
|
+
import { sortPlugins, getOpenTelemetryConfig, runWithSpan, toArray, matchesHttpPathPrefix, intercept, ORPC_NAME, isAsyncIteratorObject, override, traceAsyncIterator, recordSpanError, pathToHttpPath, normalizeHttpPath, value, parseEmptyableJSON } from '@orpc/shared';
|
|
3
|
+
import { flattenStandardHeader, parseStandardUrl } from '@standardserver/core';
|
|
4
|
+
import { c as createProcedureClient, u as unlazy, P as Procedure } from './server.CrlKQucM.mjs';
|
|
5
|
+
import { w as walkProcedureContractsSync, g as getRouter, c as createContractProcedure, D as DEFAULT_SUCCESS_STATUS, a as DEFAULT_ERROR_STATUS } from './server.BwHnWUuN.mjs';
|
|
6
|
+
|
|
7
|
+
class CompositeStandardHandlerPlugin {
|
|
8
|
+
name = "~composite";
|
|
9
|
+
plugins;
|
|
10
|
+
constructor(plugins = []) {
|
|
11
|
+
this.plugins = sortPlugins(plugins);
|
|
12
|
+
}
|
|
13
|
+
init(options) {
|
|
14
|
+
for (const plugin of this.plugins) {
|
|
15
|
+
if (plugin.init) {
|
|
16
|
+
options = plugin.init(options);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return options;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
class StandardHandler {
|
|
24
|
+
constructor(codec, options) {
|
|
25
|
+
this.codec = codec;
|
|
26
|
+
options = new CompositeStandardHandlerPlugin([
|
|
27
|
+
new OtelHandlerPlugin(),
|
|
28
|
+
...toArray(options.plugins)
|
|
29
|
+
]).init(options);
|
|
30
|
+
this.routingInterceptors = options.routingInterceptors;
|
|
31
|
+
this.interceptors = options.interceptors;
|
|
32
|
+
this.clientInterceptors = options.clientInterceptors;
|
|
33
|
+
}
|
|
34
|
+
routingInterceptors;
|
|
35
|
+
interceptors;
|
|
36
|
+
clientInterceptors;
|
|
37
|
+
async handle(request, { context, prefix }) {
|
|
38
|
+
if (prefix && !matchesHttpPathPrefix(request.url, prefix)) {
|
|
39
|
+
return { matched: false, response: void 0 };
|
|
40
|
+
}
|
|
41
|
+
return intercept(
|
|
42
|
+
this.routingInterceptors,
|
|
43
|
+
{ context, prefix, request },
|
|
44
|
+
async ({ context: context2, prefix: prefix2, request: request2 }) => {
|
|
45
|
+
const span = getOpenTelemetryConfig()?.trace.getActiveSpan();
|
|
46
|
+
let step;
|
|
47
|
+
const matchedOrNot = await runWithSpan("find_procedure", () => this.codec.resolveProcedure(request2, { context: context2, prefix: prefix2 }));
|
|
48
|
+
if (!matchedOrNot) {
|
|
49
|
+
span?.updateName(`${ORPC_NAME}_no_match`);
|
|
50
|
+
span?.setAttribute("http.request.method", request2.method);
|
|
51
|
+
span?.setAttribute("url.path", request2.url);
|
|
52
|
+
return { matched: false };
|
|
53
|
+
}
|
|
54
|
+
const { path, procedure, decodeInput } = matchedOrNot;
|
|
55
|
+
span?.updateName(`${ORPC_NAME}.${path.join("/")}`);
|
|
56
|
+
span?.setAttribute("rpc.system", ORPC_NAME);
|
|
57
|
+
span?.setAttribute("rpc.method", path.join("."));
|
|
58
|
+
try {
|
|
59
|
+
const response = await intercept(
|
|
60
|
+
this.interceptors,
|
|
61
|
+
{ context: context2, prefix: prefix2, request: request2, path, procedure, decodeInput },
|
|
62
|
+
async ({ context: context3, prefix: prefix3, request: request3, path: path2, procedure: procedure2, decodeInput: decodeInput2 }) => {
|
|
63
|
+
step = "decode_input";
|
|
64
|
+
let input = await runWithSpan("decode_input", decodeInput2);
|
|
65
|
+
step = void 0;
|
|
66
|
+
if (isAsyncIteratorObject(input)) {
|
|
67
|
+
input = override(input, traceAsyncIterator("consume_event_iterator_input", input));
|
|
68
|
+
}
|
|
69
|
+
const client = createProcedureClient(procedure2, {
|
|
70
|
+
context: context3,
|
|
71
|
+
path: path2,
|
|
72
|
+
interceptors: this.clientInterceptors
|
|
73
|
+
});
|
|
74
|
+
step = "call_procedure";
|
|
75
|
+
const output = await client(input, {
|
|
76
|
+
signal: request3.signal,
|
|
77
|
+
lastEventId: flattenStandardHeader(request3.headers["last-event-id"])
|
|
78
|
+
});
|
|
79
|
+
step = void 0;
|
|
80
|
+
const response2 = await this.codec.encodeOutput(output, procedure2, path2, { context: context3, prefix: prefix3 });
|
|
81
|
+
return response2;
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
return { matched: true, response };
|
|
85
|
+
} catch (e) {
|
|
86
|
+
if (step !== "call_procedure") {
|
|
87
|
+
recordSpanError(span, e);
|
|
88
|
+
}
|
|
89
|
+
const error = step === "decode_input" && !(e instanceof ORPCError) ? new ORPCError("BAD_REQUEST", {
|
|
90
|
+
message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
|
|
91
|
+
cause: e
|
|
92
|
+
}) : toORPCError(e);
|
|
93
|
+
const response = await this.codec.encodeError(error, procedure, path, { context: context2, prefix: prefix2 });
|
|
94
|
+
return { matched: true, response };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
class OtelHandlerPlugin {
|
|
101
|
+
name = "~opentelemetry";
|
|
102
|
+
init(options) {
|
|
103
|
+
return {
|
|
104
|
+
...options,
|
|
105
|
+
routingInterceptors: [
|
|
106
|
+
// Should be placed before user-provided interceptors to help them access the current active context.
|
|
107
|
+
async ({ next, request }) => {
|
|
108
|
+
const otelConfig = getOpenTelemetryConfig();
|
|
109
|
+
let propagationContext;
|
|
110
|
+
if (otelConfig?.propagation) {
|
|
111
|
+
propagationContext = otelConfig.propagation.extract(otelConfig.context.active(), request.headers);
|
|
112
|
+
}
|
|
113
|
+
return runWithSpan(
|
|
114
|
+
{ name: `${request.method} ${request.url}`, context: propagationContext },
|
|
115
|
+
() => next()
|
|
116
|
+
);
|
|
117
|
+
},
|
|
118
|
+
...toArray(options.routingInterceptors)
|
|
119
|
+
]
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
class RPCMatcher {
|
|
125
|
+
filter;
|
|
126
|
+
rootRouter;
|
|
127
|
+
tree = /* @__PURE__ */ new Map();
|
|
128
|
+
pendingLazyRouters = [];
|
|
129
|
+
constructor(router, options = {}) {
|
|
130
|
+
this.filter = options.filter ?? true;
|
|
131
|
+
this.rootRouter = router;
|
|
132
|
+
this.index(router);
|
|
133
|
+
}
|
|
134
|
+
index(router, path = []) {
|
|
135
|
+
const lazyResults = walkProcedureContractsSync(router, (procedure, procedurePath) => {
|
|
136
|
+
if (!value(this.filter, procedure, procedurePath)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const httpPath = pathToHttpPath(procedurePath);
|
|
140
|
+
if (procedure instanceof Procedure) {
|
|
141
|
+
this.tree.set(httpPath, {
|
|
142
|
+
path: procedurePath,
|
|
143
|
+
contract: procedure,
|
|
144
|
+
procedure
|
|
145
|
+
});
|
|
146
|
+
} else {
|
|
147
|
+
this.tree.set(httpPath, {
|
|
148
|
+
path: procedurePath,
|
|
149
|
+
contract: procedure
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}, path);
|
|
153
|
+
this.pendingLazyRouters.push(
|
|
154
|
+
...lazyResults.map((result) => ({
|
|
155
|
+
...result,
|
|
156
|
+
httpPathPrefix: pathToHttpPath(result.path)
|
|
157
|
+
}))
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
async match(_method, pathname, prefix) {
|
|
161
|
+
if (pathname.length > 1 && pathname.endsWith("/")) {
|
|
162
|
+
pathname = pathname.slice(0, -1);
|
|
163
|
+
}
|
|
164
|
+
if (prefix) {
|
|
165
|
+
if (!pathname.startsWith(prefix)) {
|
|
166
|
+
return void 0;
|
|
167
|
+
}
|
|
168
|
+
const charAfterPrefix = pathname[prefix.length];
|
|
169
|
+
if (charAfterPrefix === "/") {
|
|
170
|
+
pathname = pathname.slice(prefix.length);
|
|
171
|
+
} else if (charAfterPrefix === void 0) {
|
|
172
|
+
pathname = "/";
|
|
173
|
+
} else if (prefix[prefix.length - 1] === "/") {
|
|
174
|
+
pathname = pathname.slice(prefix.length - 1);
|
|
175
|
+
} else {
|
|
176
|
+
return void 0;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const result = await this.matchPathname(pathname);
|
|
180
|
+
if (!result && pathname.includes("%")) {
|
|
181
|
+
return this.matchPathname(normalizeHttpPath(pathname));
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
async matchPathname(pathname) {
|
|
186
|
+
await this.resolvePendingLazyRouters(pathname);
|
|
187
|
+
const entry = this.tree.get(pathname);
|
|
188
|
+
if (!entry) {
|
|
189
|
+
return void 0;
|
|
190
|
+
}
|
|
191
|
+
const procedure = await this.resolveProcedure(entry);
|
|
192
|
+
return { path: entry.path, procedure };
|
|
193
|
+
}
|
|
194
|
+
async resolvePendingLazyRouters(pathname) {
|
|
195
|
+
if (!this.pendingLazyRouters.length) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const stillPending = [];
|
|
199
|
+
for (const pending of this.pendingLazyRouters) {
|
|
200
|
+
if (pathname.startsWith(pending.httpPathPrefix)) {
|
|
201
|
+
const { default: router } = await unlazy(pending.router);
|
|
202
|
+
this.index(router, pending.path);
|
|
203
|
+
} else {
|
|
204
|
+
stillPending.push(pending);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this.pendingLazyRouters = stillPending;
|
|
208
|
+
}
|
|
209
|
+
async resolveProcedure(entry) {
|
|
210
|
+
if (entry.procedure) {
|
|
211
|
+
return entry.procedure;
|
|
212
|
+
}
|
|
213
|
+
const { default: maybeProcedure } = await unlazy(getRouter(this.rootRouter, entry.path));
|
|
214
|
+
if (!(maybeProcedure instanceof Procedure)) {
|
|
215
|
+
throw new TypeError(
|
|
216
|
+
`[Contract-First] Missing or invalid implementation for procedure at path: "${entry.path.join(".")}". Ensure the procedure is correctly implemented and matches its contract.`
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
entry.procedure = createContractProcedure(maybeProcedure, entry.contract);
|
|
220
|
+
return entry.procedure;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
class RPCHandlerCodec {
|
|
225
|
+
matcher;
|
|
226
|
+
serializer;
|
|
227
|
+
errorStatusMap;
|
|
228
|
+
outputStatus;
|
|
229
|
+
constructor(router, options = {}) {
|
|
230
|
+
this.matcher = new RPCMatcher(router, options);
|
|
231
|
+
this.serializer = options.serializer ?? new RPCSerializer();
|
|
232
|
+
this.errorStatusMap = options.errorStatusMap ?? COMMON_ERROR_STATUS_MAP;
|
|
233
|
+
this.outputStatus = options.outputStatus;
|
|
234
|
+
}
|
|
235
|
+
async resolveProcedure(request, options) {
|
|
236
|
+
const [pathname, query] = parseStandardUrl(request.url);
|
|
237
|
+
const matched = await this.matcher.match(request.method, pathname, options.prefix);
|
|
238
|
+
if (!matched) {
|
|
239
|
+
return void 0;
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
procedure: matched.procedure,
|
|
243
|
+
path: matched.path,
|
|
244
|
+
decodeInput: async () => {
|
|
245
|
+
if (request.method === "GET") {
|
|
246
|
+
const dataString = new URLSearchParams(query).getAll("data").at(-1);
|
|
247
|
+
return this.serializer.deserialize(parseEmptyableJSON(dataString));
|
|
248
|
+
}
|
|
249
|
+
const body = await request.resolveBody();
|
|
250
|
+
return this.serializer.deserialize(body);
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
encodeOutput(output, procedure, path, options) {
|
|
255
|
+
return {
|
|
256
|
+
headers: {},
|
|
257
|
+
status: value(this.outputStatus, output, procedure, path, options) ?? DEFAULT_SUCCESS_STATUS,
|
|
258
|
+
body: this.serializer.serialize(output)
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
encodeError(error, _procedure, _path, _options) {
|
|
262
|
+
const status = this.errorStatusMap[error.code] ?? DEFAULT_ERROR_STATUS;
|
|
263
|
+
return {
|
|
264
|
+
headers: {},
|
|
265
|
+
status,
|
|
266
|
+
body: this.serializer.serialize(error.toJSON())
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export { CompositeStandardHandlerPlugin as C, OtelHandlerPlugin as O, RPCHandlerCodec as R, StandardHandler as S, RPCMatcher as a };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { RouterContract, ProcedureContract, ORPCErrorFromErrorMap, ThrowableError, InferSchemaInput, InferSchemaOutput } from '@orpc/contract';
|
|
2
|
+
import { C as Context, a as Procedure, L as Lazyable, M as MergedContext } from './server.BL22TloH.js';
|
|
3
|
+
|
|
4
|
+
type Router<TInitialContext extends Context> = Procedure<TInitialContext, any, any, any, any, any> | {
|
|
5
|
+
[k: string]: Lazyable<Router<TInitialContext>>;
|
|
6
|
+
};
|
|
7
|
+
type ContractedRouter<T extends RouterContract, TInitialContext extends Context> = T extends ProcedureContract<infer $InputSchema, infer $OutputSchema, infer $ErrorMap> ? Procedure<TInitialContext, any, $InputSchema, $OutputSchema, $ErrorMap, never> : {
|
|
8
|
+
[K in keyof T]: T[K] extends RouterContract ? Lazyable<ContractedRouter<T[K], TInitialContext>> : never;
|
|
9
|
+
};
|
|
10
|
+
type AnyRouter = Router<any>;
|
|
11
|
+
type InferRouterInitialContext<T extends AnyRouter> = T extends Router<infer $> ? $ : never;
|
|
12
|
+
/**
|
|
13
|
+
* Infer all initial context of the router.
|
|
14
|
+
*
|
|
15
|
+
* @info A procedure is a router too.
|
|
16
|
+
* @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
|
|
17
|
+
*/
|
|
18
|
+
type InferRouterInitialContexts<T extends AnyRouter> = T extends Procedure<infer UInitialContext, any, any, any, any, any> ? UInitialContext : {
|
|
19
|
+
[K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterInitialContexts<U> : never;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Infer all current context of the router.
|
|
23
|
+
*
|
|
24
|
+
* @info A procedure is a router too.
|
|
25
|
+
* @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
|
|
26
|
+
*/
|
|
27
|
+
type InferRouterFinalContexts<T extends AnyRouter> = T extends Procedure<infer UInitialContext, infer UInjectedContext, any, any, any, any> ? MergedContext<UInitialContext, UInjectedContext> : {
|
|
28
|
+
[K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterFinalContexts<U> : never;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Infer all router inputs
|
|
32
|
+
*
|
|
33
|
+
* @info A procedure is a router too.
|
|
34
|
+
* @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
|
|
35
|
+
*/
|
|
36
|
+
type InferRouterInputs<T extends AnyRouter> = T extends Procedure<any, any, infer UInputSchema, any, any, any> ? InferSchemaInput<UInputSchema> : {
|
|
37
|
+
[K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterInputs<U> : never;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Infer all router outputs
|
|
41
|
+
*
|
|
42
|
+
* @info A procedure is a router too.
|
|
43
|
+
* @see {@link https://orpc.dev/docs/router#utilities Router Utilities Docs}
|
|
44
|
+
*/
|
|
45
|
+
type InferRouterOutputs<T extends AnyRouter> = T extends Procedure<any, any, any, infer UOutputSchema, any, any> ? InferSchemaOutput<UOutputSchema> : {
|
|
46
|
+
[K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterOutputs<U> : never;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Infer the union of throwable errors for entire router.
|
|
50
|
+
*/
|
|
51
|
+
type InferRouterError<T extends AnyRouter> = T extends Procedure<any, any, any, any, infer UErrorMap, infer UReturnedError> ? ORPCErrorFromErrorMap<UErrorMap> | UReturnedError | ThrowableError : {
|
|
52
|
+
[K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterError<U> : never;
|
|
53
|
+
}[keyof T];
|
|
54
|
+
/**
|
|
55
|
+
* Infer throwable errors for each procedure, preserving the router shape.
|
|
56
|
+
*/
|
|
57
|
+
type InferRouterErrors<T extends AnyRouter> = T extends Procedure<any, any, any, any, infer UErrorMap, infer UReturnedError> ? ORPCErrorFromErrorMap<UErrorMap> | UReturnedError | ThrowableError : {
|
|
58
|
+
[K in keyof T]: T[K] extends Lazyable<infer U extends AnyRouter> ? InferRouterErrors<U> : never;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export type { AnyRouter as A, ContractedRouter as C, InferRouterInitialContext as I, Router as R, InferRouterError as a, InferRouterErrors as b, InferRouterFinalContexts as c, InferRouterInitialContexts as d, InferRouterInputs as e, InferRouterOutputs as f };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { RPCSerializer, AnyORPCError } from '@orpc/client';
|
|
2
|
+
import { Value, Promisable } from '@orpc/shared';
|
|
3
|
+
import { StandardMethod, StandardLazyRequest, StandardResponse } from '@standardserver/core';
|
|
4
|
+
import { A as AnyProcedure, C as Context } from './server.BL22TloH.js';
|
|
5
|
+
import { A as AnyRouter } from './server.Pa0F03f_.js';
|
|
6
|
+
import { AnyProcedureContract } from '@orpc/contract';
|
|
7
|
+
import { b as StandardHandlerHandleOptions, c as StandardHandlerCodec, d as StandardHandlerCodecResolvedProcedure } from './server.EOHJ3NJr.js';
|
|
8
|
+
|
|
9
|
+
interface RPCMatcherOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Filter which procedures are exposed for matching. Return `false` to exclude.
|
|
12
|
+
*
|
|
13
|
+
* @default true
|
|
14
|
+
*/
|
|
15
|
+
filter?: Value<boolean, [procedure: AnyProcedureContract | AnyProcedure, path: string[]]>;
|
|
16
|
+
}
|
|
17
|
+
declare class RPCMatcher {
|
|
18
|
+
private readonly filter;
|
|
19
|
+
private readonly rootRouter;
|
|
20
|
+
private readonly tree;
|
|
21
|
+
private pendingLazyRouters;
|
|
22
|
+
constructor(router: AnyRouter, options?: RPCMatcherOptions);
|
|
23
|
+
private index;
|
|
24
|
+
match(_method: StandardMethod, pathname: `/${string}`, prefix: `/${string}` | undefined): Promise<{
|
|
25
|
+
path: string[];
|
|
26
|
+
procedure: AnyProcedure;
|
|
27
|
+
} | undefined>;
|
|
28
|
+
private matchPathname;
|
|
29
|
+
private resolvePendingLazyRouters;
|
|
30
|
+
private resolveProcedure;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface RPCHandlerCodecOptions<T extends Context> extends RPCMatcherOptions {
|
|
34
|
+
/**
|
|
35
|
+
* Override the default RPC serializer.
|
|
36
|
+
*/
|
|
37
|
+
serializer?: Pick<RPCSerializer, keyof RPCSerializer>;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve HTTP status for encoded successful outputs.
|
|
40
|
+
*
|
|
41
|
+
* Value should be in range `200-299`
|
|
42
|
+
* Return `undefined` or `null` to fallback to default
|
|
43
|
+
*
|
|
44
|
+
* @default DEFAULT_ERROR_STATUS, DEFAULT_ERROR_STATUS
|
|
45
|
+
*/
|
|
46
|
+
outputStatus?: Value<number | undefined | null, [output: unknown, procedure: AnyProcedure, path: string[], options: StandardHandlerHandleOptions<T>]>;
|
|
47
|
+
/**
|
|
48
|
+
* Mapping ORPCError Code -> HTTP Status Code
|
|
49
|
+
*
|
|
50
|
+
* @default COMMON_ERROR_STATUS_MAP
|
|
51
|
+
*/
|
|
52
|
+
errorStatusMap?: Record<string, number> | undefined;
|
|
53
|
+
}
|
|
54
|
+
declare class RPCHandlerCodec<T extends Context> implements StandardHandlerCodec<T> {
|
|
55
|
+
private readonly matcher;
|
|
56
|
+
private readonly serializer;
|
|
57
|
+
private readonly errorStatusMap;
|
|
58
|
+
private readonly outputStatus;
|
|
59
|
+
constructor(router: AnyRouter, options?: RPCHandlerCodecOptions<T>);
|
|
60
|
+
resolveProcedure(request: StandardLazyRequest, options: StandardHandlerHandleOptions<T>): Promise<StandardHandlerCodecResolvedProcedure | undefined>;
|
|
61
|
+
encodeOutput(output: unknown, procedure: AnyProcedure, path: string[], options: StandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
|
|
62
|
+
encodeError(error: AnyORPCError, _procedure: AnyProcedure, _path: string[], _options: StandardHandlerHandleOptions<T>): Promisable<StandardResponse>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { RPCHandlerCodec as a, RPCMatcher as b };
|
|
66
|
+
export type { RPCHandlerCodecOptions as R, RPCMatcherOptions as c };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function
|
|
1
|
+
function resolveFriendlyStandardHandlerHandleOptions(options) {
|
|
2
2
|
return {
|
|
3
3
|
...options,
|
|
4
4
|
context: options.context ?? {}
|
|
@@ -6,4 +6,4 @@ function resolveFriendlyStandardHandleOptions(options) {
|
|
|
6
6
|
};
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export {
|
|
9
|
+
export { resolveFriendlyStandardHandlerHandleOptions as r };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orpc/server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "2.0.0-beta.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://orpc.dev",
|
|
7
7
|
"repository": {
|
|
@@ -12,8 +12,11 @@
|
|
|
12
12
|
"keywords": [
|
|
13
13
|
"orpc"
|
|
14
14
|
],
|
|
15
|
-
"sideEffects":
|
|
15
|
+
"sideEffects": [
|
|
16
|
+
"./dist/extensions/callable.mjs"
|
|
17
|
+
],
|
|
16
18
|
"exports": {
|
|
19
|
+
"./package.json": "./package.json",
|
|
17
20
|
".": {
|
|
18
21
|
"types": "./dist/index.d.mts",
|
|
19
22
|
"import": "./dist/index.mjs",
|
|
@@ -29,11 +32,6 @@
|
|
|
29
32
|
"import": "./dist/plugins/index.mjs",
|
|
30
33
|
"default": "./dist/plugins/index.mjs"
|
|
31
34
|
},
|
|
32
|
-
"./hibernation": {
|
|
33
|
-
"types": "./dist/hibernation/index.d.mts",
|
|
34
|
-
"import": "./dist/hibernation/index.mjs",
|
|
35
|
-
"default": "./dist/hibernation/index.mjs"
|
|
36
|
-
},
|
|
37
35
|
"./standard": {
|
|
38
36
|
"types": "./dist/adapters/standard/index.d.mts",
|
|
39
37
|
"import": "./dist/adapters/standard/index.mjs",
|
|
@@ -54,83 +52,56 @@
|
|
|
54
52
|
"import": "./dist/adapters/node/index.mjs",
|
|
55
53
|
"default": "./dist/adapters/node/index.mjs"
|
|
56
54
|
},
|
|
57
|
-
"./fastify": {
|
|
58
|
-
"types": "./dist/adapters/fastify/index.d.mts",
|
|
59
|
-
"import": "./dist/adapters/fastify/index.mjs",
|
|
60
|
-
"default": "./dist/adapters/fastify/index.mjs"
|
|
61
|
-
},
|
|
62
|
-
"./aws-lambda": {
|
|
63
|
-
"types": "./dist/adapters/aws-lambda/index.d.mts",
|
|
64
|
-
"import": "./dist/adapters/aws-lambda/index.mjs",
|
|
65
|
-
"default": "./dist/adapters/aws-lambda/index.mjs"
|
|
66
|
-
},
|
|
67
55
|
"./websocket": {
|
|
68
56
|
"types": "./dist/adapters/websocket/index.d.mts",
|
|
69
57
|
"import": "./dist/adapters/websocket/index.mjs",
|
|
70
58
|
"default": "./dist/adapters/websocket/index.mjs"
|
|
71
59
|
},
|
|
60
|
+
"./message-port": {
|
|
61
|
+
"types": "./dist/adapters/message-port/index.d.mts",
|
|
62
|
+
"import": "./dist/adapters/message-port/index.mjs",
|
|
63
|
+
"default": "./dist/adapters/message-port/index.mjs"
|
|
64
|
+
},
|
|
72
65
|
"./crossws": {
|
|
73
66
|
"types": "./dist/adapters/crossws/index.d.mts",
|
|
74
67
|
"import": "./dist/adapters/crossws/index.mjs",
|
|
75
68
|
"default": "./dist/adapters/crossws/index.mjs"
|
|
76
69
|
},
|
|
77
|
-
"./
|
|
78
|
-
"types": "./dist/
|
|
79
|
-
"import": "./dist/
|
|
80
|
-
"default": "./dist/
|
|
81
|
-
},
|
|
82
|
-
"./bun-ws": {
|
|
83
|
-
"types": "./dist/adapters/bun-ws/index.d.mts",
|
|
84
|
-
"import": "./dist/adapters/bun-ws/index.mjs",
|
|
85
|
-
"default": "./dist/adapters/bun-ws/index.mjs"
|
|
86
|
-
},
|
|
87
|
-
"./message-port": {
|
|
88
|
-
"types": "./dist/adapters/message-port/index.d.mts",
|
|
89
|
-
"import": "./dist/adapters/message-port/index.mjs",
|
|
90
|
-
"default": "./dist/adapters/message-port/index.mjs"
|
|
70
|
+
"./extensions/callable": {
|
|
71
|
+
"types": "./dist/extensions/callable.d.mts",
|
|
72
|
+
"import": "./dist/extensions/callable.mjs",
|
|
73
|
+
"default": "./dist/extensions/callable.mjs"
|
|
91
74
|
}
|
|
92
75
|
},
|
|
93
76
|
"files": [
|
|
94
77
|
"dist"
|
|
95
78
|
],
|
|
96
79
|
"peerDependencies": {
|
|
97
|
-
"crossws": ">=0.3.4"
|
|
98
|
-
"ws": ">=8.18.1"
|
|
80
|
+
"crossws": ">=0.3.4"
|
|
99
81
|
},
|
|
100
82
|
"peerDependenciesMeta": {
|
|
101
83
|
"crossws": {
|
|
102
84
|
"optional": true
|
|
103
|
-
},
|
|
104
|
-
"ws": {
|
|
105
|
-
"optional": true
|
|
106
85
|
}
|
|
107
86
|
},
|
|
108
87
|
"dependencies": {
|
|
88
|
+
"@standardserver/core": "^0.0.24",
|
|
89
|
+
"@standardserver/fetch": "^0.0.24",
|
|
90
|
+
"@standardserver/node": "^0.0.24",
|
|
91
|
+
"@standardserver/peer": "^0.0.24",
|
|
109
92
|
"cookie": "^1.1.1",
|
|
110
|
-
"@orpc/
|
|
111
|
-
"@orpc/
|
|
112
|
-
"@orpc/contract": "
|
|
113
|
-
"@orpc/shared": "
|
|
114
|
-
"@orpc/standard-server": "1.14.5",
|
|
115
|
-
"@orpc/standard-server-aws-lambda": "1.14.5",
|
|
116
|
-
"@orpc/standard-server-fastify": "1.14.5",
|
|
117
|
-
"@orpc/standard-server-fetch": "1.14.5",
|
|
118
|
-
"@orpc/standard-server-peer": "1.14.5",
|
|
119
|
-
"@orpc/standard-server-node": "1.14.5"
|
|
93
|
+
"@orpc/client": "2.0.0-beta.1",
|
|
94
|
+
"@orpc/interop": "2.0.0-beta.1",
|
|
95
|
+
"@orpc/contract": "2.0.0-beta.1",
|
|
96
|
+
"@orpc/shared": "2.0.0-beta.1"
|
|
120
97
|
},
|
|
121
98
|
"devDependencies": {
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
"
|
|
125
|
-
"fastify": "^5.8.3",
|
|
126
|
-
"next": "^16.2.3",
|
|
127
|
-
"supertest": "^7.1.4",
|
|
128
|
-
"ws": "^8.18.3",
|
|
129
|
-
"zod": "^4.3.6"
|
|
99
|
+
"crossws": "^0.4.6",
|
|
100
|
+
"supertest": "^7.2.2",
|
|
101
|
+
"zod": "^4.4.3"
|
|
130
102
|
},
|
|
131
103
|
"scripts": {
|
|
132
104
|
"build": "unbuild",
|
|
133
|
-
"build:watch": "pnpm run build --watch",
|
|
134
105
|
"type:check": "tsc -b"
|
|
135
106
|
}
|
|
136
107
|
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { MaybeOptionalOptions } from '@orpc/shared';
|
|
2
|
-
import { SendStandardResponseOptions, APIGatewayProxyEventV2, ResponseStream } from '@orpc/standard-server-aws-lambda';
|
|
3
|
-
import { C as Context, R as Router } from '../../shared/server.qKsRrdxW.mjs';
|
|
4
|
-
import { F as FriendlyStandardHandleOptions } from '../../shared/server.B8gYOD5g.mjs';
|
|
5
|
-
import { f as StandardHandler } from '../../shared/server.BqadksTP.mjs';
|
|
6
|
-
import { S as StandardRPCHandlerOptions } from '../../shared/server.ChUyt5-i.mjs';
|
|
7
|
-
import '@orpc/client';
|
|
8
|
-
import '@orpc/contract';
|
|
9
|
-
import '@orpc/standard-server';
|
|
10
|
-
import '@orpc/client/standard';
|
|
11
|
-
import '../../shared/server.C8_sRzQB.mjs';
|
|
12
|
-
|
|
13
|
-
interface AwsLambdaHandlerOptions extends SendStandardResponseOptions {
|
|
14
|
-
}
|
|
15
|
-
type AwsLambdaHandleResult = {
|
|
16
|
-
matched: true;
|
|
17
|
-
} | {
|
|
18
|
-
matched: false;
|
|
19
|
-
};
|
|
20
|
-
declare class AwsLambdaHandler<T extends Context> {
|
|
21
|
-
private readonly standardHandler;
|
|
22
|
-
private readonly sendStandardResponseOptions;
|
|
23
|
-
constructor(standardHandler: StandardHandler<T>, options?: AwsLambdaHandlerOptions);
|
|
24
|
-
handle(event: APIGatewayProxyEventV2, responseStream: ResponseStream, ...rest: MaybeOptionalOptions<FriendlyStandardHandleOptions<T>>): Promise<AwsLambdaHandleResult>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
type RPCHandlerOptions<T extends Context> = AwsLambdaHandlerOptions & StandardRPCHandlerOptions<T> & {
|
|
28
|
-
/**
|
|
29
|
-
* Enables or disables the StrictGetMethodPlugin.
|
|
30
|
-
*
|
|
31
|
-
* @default true
|
|
32
|
-
*/
|
|
33
|
-
strictGetMethodPluginEnabled?: boolean;
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* RPC Handler for AWS Lambda.
|
|
37
|
-
*
|
|
38
|
-
* @see {@link https://orpc.dev/docs/rpc-handler RPC Handler Docs}
|
|
39
|
-
* @see {@link https://orpc.dev/docs/adapters/http HTTP Adapter Docs}
|
|
40
|
-
*/
|
|
41
|
-
declare class RPCHandler<T extends Context> extends AwsLambdaHandler<T> {
|
|
42
|
-
constructor(router: Router<any, T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export { AwsLambdaHandler, RPCHandler };
|
|
46
|
-
export type { AwsLambdaHandleResult, AwsLambdaHandlerOptions, RPCHandlerOptions };
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { MaybeOptionalOptions } from '@orpc/shared';
|
|
2
|
-
import { SendStandardResponseOptions, APIGatewayProxyEventV2, ResponseStream } from '@orpc/standard-server-aws-lambda';
|
|
3
|
-
import { C as Context, R as Router } from '../../shared/server.qKsRrdxW.js';
|
|
4
|
-
import { F as FriendlyStandardHandleOptions } from '../../shared/server.EfTOZ2Q7.js';
|
|
5
|
-
import { f as StandardHandler } from '../../shared/server.7cEtMB30.js';
|
|
6
|
-
import { S as StandardRPCHandlerOptions } from '../../shared/server.yoEB3Fx4.js';
|
|
7
|
-
import '@orpc/client';
|
|
8
|
-
import '@orpc/contract';
|
|
9
|
-
import '@orpc/standard-server';
|
|
10
|
-
import '@orpc/client/standard';
|
|
11
|
-
import '../../shared/server.ChyoA9XY.js';
|
|
12
|
-
|
|
13
|
-
interface AwsLambdaHandlerOptions extends SendStandardResponseOptions {
|
|
14
|
-
}
|
|
15
|
-
type AwsLambdaHandleResult = {
|
|
16
|
-
matched: true;
|
|
17
|
-
} | {
|
|
18
|
-
matched: false;
|
|
19
|
-
};
|
|
20
|
-
declare class AwsLambdaHandler<T extends Context> {
|
|
21
|
-
private readonly standardHandler;
|
|
22
|
-
private readonly sendStandardResponseOptions;
|
|
23
|
-
constructor(standardHandler: StandardHandler<T>, options?: AwsLambdaHandlerOptions);
|
|
24
|
-
handle(event: APIGatewayProxyEventV2, responseStream: ResponseStream, ...rest: MaybeOptionalOptions<FriendlyStandardHandleOptions<T>>): Promise<AwsLambdaHandleResult>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
type RPCHandlerOptions<T extends Context> = AwsLambdaHandlerOptions & StandardRPCHandlerOptions<T> & {
|
|
28
|
-
/**
|
|
29
|
-
* Enables or disables the StrictGetMethodPlugin.
|
|
30
|
-
*
|
|
31
|
-
* @default true
|
|
32
|
-
*/
|
|
33
|
-
strictGetMethodPluginEnabled?: boolean;
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* RPC Handler for AWS Lambda.
|
|
37
|
-
*
|
|
38
|
-
* @see {@link https://orpc.dev/docs/rpc-handler RPC Handler Docs}
|
|
39
|
-
* @see {@link https://orpc.dev/docs/adapters/http HTTP Adapter Docs}
|
|
40
|
-
*/
|
|
41
|
-
declare class RPCHandler<T extends Context> extends AwsLambdaHandler<T> {
|
|
42
|
-
constructor(router: Router<any, T>, options?: NoInfer<RPCHandlerOptions<T>>);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export { AwsLambdaHandler, RPCHandler };
|
|
46
|
-
export type { AwsLambdaHandleResult, AwsLambdaHandlerOptions, RPCHandlerOptions };
|