@orpc/server 0.0.0-next.0ca4e14 → 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 +2 -1
- package/dist/adapters/aws-lambda/index.d.mts +5 -5
- package/dist/adapters/aws-lambda/index.d.ts +5 -5
- package/dist/adapters/aws-lambda/index.mjs +3 -2
- package/dist/adapters/bun-ws/index.d.mts +5 -5
- package/dist/adapters/bun-ws/index.d.ts +5 -5
- package/dist/adapters/bun-ws/index.mjs +10 -10
- package/dist/adapters/crossws/index.d.mts +5 -5
- package/dist/adapters/crossws/index.d.ts +5 -5
- package/dist/adapters/crossws/index.mjs +5 -7
- package/dist/adapters/fetch/index.d.mts +52 -7
- package/dist/adapters/fetch/index.d.ts +52 -7
- package/dist/adapters/fetch/index.mjs +72 -3
- package/dist/adapters/message-port/index.d.mts +5 -5
- package/dist/adapters/message-port/index.d.ts +5 -5
- package/dist/adapters/message-port/index.mjs +5 -7
- package/dist/adapters/node/index.d.mts +28 -7
- package/dist/adapters/node/index.d.ts +28 -7
- package/dist/adapters/node/index.mjs +69 -12
- package/dist/adapters/standard/index.d.mts +6 -6
- package/dist/adapters/standard/index.d.ts +6 -6
- package/dist/adapters/standard/index.mjs +2 -2
- package/dist/adapters/standard-peer/index.d.mts +9 -5
- package/dist/adapters/standard-peer/index.d.ts +9 -5
- package/dist/adapters/standard-peer/index.mjs +1 -1
- package/dist/adapters/websocket/index.d.mts +5 -5
- package/dist/adapters/websocket/index.d.ts +5 -5
- package/dist/adapters/websocket/index.mjs +5 -7
- package/dist/adapters/ws/index.d.mts +5 -5
- package/dist/adapters/ws/index.d.ts +5 -5
- package/dist/adapters/ws/index.mjs +5 -7
- 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 +11 -11
- package/dist/hibernation/index.d.ts +11 -11
- package/dist/hibernation/index.mjs +8 -8
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.mjs +6 -5
- package/dist/plugins/index.d.mts +17 -4
- package/dist/plugins/index.d.ts +17 -4
- package/dist/plugins/index.mjs +83 -57
- package/dist/shared/{server.mGrd7l1v.d.ts → server.B7b2w3_i.d.ts} +2 -2
- package/dist/shared/{server.VjZAmjFs.d.mts → server.BEFBl-Cb.d.mts} +2 -2
- package/dist/shared/{server.C-F_fMXW.d.mts → server.BU4WI18A.d.mts} +3 -3
- package/dist/shared/{server.DLJzqnSX.mjs → server.B_fj3X5m.mjs} +90 -50
- package/dist/shared/{server.BX8Iro5z.d.ts → server.Bmh5xd4n.d.ts} +1 -1
- package/dist/shared/{server.CRejaM08.d.mts → server.CYNGeoCm.d.mts} +4 -2
- package/dist/shared/{server.CRejaM08.d.ts → server.CYNGeoCm.d.ts} +4 -2
- package/dist/shared/{server.Aqc4pYFD.mjs → server.CYRYFTxo.mjs} +64 -39
- package/dist/shared/{server.CPC5w4d2.d.ts → server.D0H-iaY3.d.ts} +3 -3
- package/dist/shared/{server.DrG30u7a.d.mts → server.DhJj-1X9.d.mts} +1 -1
- package/dist/shared/server.UVMTOWrk.mjs +26 -0
- package/dist/shared/{server.De2J-WNx.d.mts → server.gqRxT-yN.d.mts} +1 -1
- package/dist/shared/{server.Bi2_bIHo.d.ts → server.jMTkVNIb.d.ts} +1 -1
- package/package.json +18 -11
- package/dist/shared/server.C6Q5sqYw.mjs +0 -20
package/dist/plugins/index.mjs
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
import { value, isAsyncIteratorObject, clone } from '@orpc/shared';
|
1
|
+
import { runWithSpan, value, setSpanError, isAsyncIteratorObject, clone } from '@orpc/shared';
|
2
2
|
import { flattenHeader } from '@orpc/standard-server';
|
3
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';
|
@@ -32,65 +33,74 @@ class BatchHandlerPlugin {
|
|
32
33
|
}
|
33
34
|
let isParsing = false;
|
34
35
|
try {
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
return options2.next({ ...options2, request: { ...mapped, body: () => Promise.resolve(mapped.body) } }).then(({ response: response2, matched }) => {
|
53
|
-
if (matched) {
|
54
|
-
if (response2.body instanceof Blob || response2.body instanceof FormData || isAsyncIteratorObject(response2.body)) {
|
55
|
-
return {
|
56
|
-
index,
|
57
|
-
status: 500,
|
58
|
-
headers: {},
|
59
|
-
body: "Batch responses do not support file/blob, or event-iterator. Please call this procedure separately outside of the batch request."
|
60
|
-
};
|
61
|
-
}
|
62
|
-
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
|
63
53
|
}
|
64
|
-
|
65
|
-
}).catch(() => {
|
66
|
-
return { index, status: 500, headers: {}, body: "Internal server error" };
|
67
|
-
});
|
54
|
+
};
|
68
55
|
}
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
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
|
+
});
|
87
77
|
}
|
88
|
-
|
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
|
+
};
|
89
103
|
});
|
90
|
-
return {
|
91
|
-
matched: true,
|
92
|
-
response
|
93
|
-
};
|
94
104
|
} catch (cause) {
|
95
105
|
if (isParsing) {
|
96
106
|
return {
|
@@ -177,6 +187,22 @@ class CORSPlugin {
|
|
177
187
|
}
|
178
188
|
}
|
179
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
|
+
|
180
206
|
class ResponseHeadersPlugin {
|
181
207
|
init(options) {
|
182
208
|
options.rootInterceptors ??= [];
|
@@ -256,4 +282,4 @@ class SimpleCsrfProtectionHandlerPlugin {
|
|
256
282
|
}
|
257
283
|
}
|
258
284
|
|
259
|
-
export { BatchHandlerPlugin, CORSPlugin, ResponseHeadersPlugin, SimpleCsrfProtectionHandlerPlugin };
|
285
|
+
export { BatchHandlerPlugin, CORSPlugin, RequestHeadersPlugin, ResponseHeadersPlugin, SimpleCsrfProtectionHandlerPlugin };
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { C as Context } from './server.
|
2
|
-
import { b as StandardHandleOptions } from './server.
|
1
|
+
import { C as Context } from './server.CYNGeoCm.js';
|
2
|
+
import { b as StandardHandleOptions } from './server.Bmh5xd4n.js';
|
3
3
|
|
4
4
|
type FriendlyStandardHandleOptions<T extends Context> = Omit<StandardHandleOptions<T>, 'context'> & (Record<never, never> extends T ? {
|
5
5
|
context?: T;
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { C as Context } from './server.
|
2
|
-
import { b as StandardHandleOptions } from './server.
|
1
|
+
import { C as Context } from './server.CYNGeoCm.mjs';
|
2
|
+
import { b as StandardHandleOptions } from './server.gqRxT-yN.mjs';
|
3
3
|
|
4
4
|
type FriendlyStandardHandleOptions<T extends Context> = Omit<StandardHandleOptions<T>, 'context'> & (Record<never, never> extends T ? {
|
5
5
|
context?: T;
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import { StandardRPCJsonSerializerOptions } from '@orpc/client/standard';
|
2
|
-
import { b as AnyRouter, C as Context, R as Router } from './server.
|
3
|
-
import { i as StandardMatcher, h as StandardMatchResult, e as StandardHandlerOptions, f as StandardHandler } from './server.
|
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
4
|
import { HTTPPath } from '@orpc/client';
|
5
5
|
import { Value } from '@orpc/shared';
|
6
|
-
import { T as TraverseContractProcedureCallbackOptions } from './server.
|
6
|
+
import { T as TraverseContractProcedureCallbackOptions } from './server.DhJj-1X9.mjs';
|
7
7
|
|
8
8
|
interface StandardRPCMatcherOptions {
|
9
9
|
/**
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { isContractProcedure, ValidationError, mergePrefix, mergeErrorMap, enhanceRoute } from '@orpc/contract';
|
2
|
-
import { value, intercept,
|
2
|
+
import { resolveMaybeOptionalOptions, toArray, value, runWithSpan, intercept, isAsyncIteratorObject, asyncIteratorWithSpan } from '@orpc/shared';
|
3
3
|
import { fallbackORPCErrorStatus, ORPCError } 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;
|
@@ -106,28 +108,45 @@ function middlewareOutputFn(output) {
|
|
106
108
|
return { output, context: {} };
|
107
109
|
}
|
108
110
|
|
109
|
-
function createProcedureClient(lazyableProcedure, ...
|
111
|
+
function createProcedureClient(lazyableProcedure, ...rest) {
|
112
|
+
const options = resolveMaybeOptionalOptions(rest);
|
110
113
|
return async (...[input, callerOptions]) => {
|
111
|
-
const path = options
|
114
|
+
const path = toArray(options.path);
|
112
115
|
const { default: procedure } = await unlazy(lazyableProcedure);
|
113
116
|
const clientContext = callerOptions?.context ?? {};
|
114
|
-
const context = await value(options
|
117
|
+
const context = await value(options.context ?? {}, clientContext);
|
115
118
|
const errors = createORPCErrorConstructorMap(procedure["~orpc"].errorMap);
|
116
119
|
try {
|
117
|
-
|
118
|
-
|
119
|
-
{
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
120
|
+
const output = await runWithSpan(
|
121
|
+
{ name: "call_procedure", signal: callerOptions?.signal },
|
122
|
+
(span) => {
|
123
|
+
span?.setAttribute("procedure.path", [...path]);
|
124
|
+
return intercept(
|
125
|
+
toArray(options.interceptors),
|
126
|
+
{
|
127
|
+
context,
|
128
|
+
input,
|
129
|
+
// input only optional when it undefinable so we can safely cast it
|
130
|
+
errors,
|
131
|
+
path,
|
132
|
+
procedure,
|
133
|
+
signal: callerOptions?.signal,
|
134
|
+
lastEventId: callerOptions?.lastEventId
|
135
|
+
},
|
136
|
+
(interceptorOptions) => executeProcedureInternal(interceptorOptions.procedure, interceptorOptions)
|
137
|
+
);
|
138
|
+
}
|
130
139
|
);
|
140
|
+
if (isAsyncIteratorObject(output)) {
|
141
|
+
if (output instanceof HibernationEventIterator) {
|
142
|
+
return output;
|
143
|
+
}
|
144
|
+
return asyncIteratorWithSpan(
|
145
|
+
{ name: "consume_event_iterator_output", signal: callerOptions?.signal },
|
146
|
+
output
|
147
|
+
);
|
148
|
+
}
|
149
|
+
return output;
|
131
150
|
} catch (e) {
|
132
151
|
if (!(e instanceof ORPCError)) {
|
133
152
|
throw e;
|
@@ -142,31 +161,41 @@ async function validateInput(procedure, input) {
|
|
142
161
|
if (!schema) {
|
143
162
|
return input;
|
144
163
|
}
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
164
|
+
return runWithSpan(
|
165
|
+
{ name: "validate_input" },
|
166
|
+
async () => {
|
167
|
+
const result = await schema["~standard"].validate(input);
|
168
|
+
if (result.issues) {
|
169
|
+
throw new ORPCError("BAD_REQUEST", {
|
170
|
+
message: "Input validation failed",
|
171
|
+
data: {
|
172
|
+
issues: result.issues
|
173
|
+
},
|
174
|
+
cause: new ValidationError({ message: "Input validation failed", issues: result.issues })
|
175
|
+
});
|
176
|
+
}
|
177
|
+
return result.value;
|
178
|
+
}
|
179
|
+
);
|
156
180
|
}
|
157
181
|
async function validateOutput(procedure, output) {
|
158
182
|
const schema = procedure["~orpc"].outputSchema;
|
159
183
|
if (!schema) {
|
160
184
|
return output;
|
161
185
|
}
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
186
|
+
return runWithSpan(
|
187
|
+
{ name: "validate_output" },
|
188
|
+
async () => {
|
189
|
+
const result = await schema["~standard"].validate(output);
|
190
|
+
if (result.issues) {
|
191
|
+
throw new ORPCError("INTERNAL_SERVER_ERROR", {
|
192
|
+
message: "Output validation failed",
|
193
|
+
cause: new ValidationError({ message: "Output validation failed", issues: result.issues })
|
194
|
+
});
|
195
|
+
}
|
196
|
+
return result.value;
|
197
|
+
}
|
198
|
+
);
|
170
199
|
}
|
171
200
|
async function executeProcedureInternal(procedure, options) {
|
172
201
|
const middlewares = procedure["~orpc"].middlewares;
|
@@ -178,17 +207,28 @@ async function executeProcedureInternal(procedure, options) {
|
|
178
207
|
currentInput = await validateInput(procedure, currentInput);
|
179
208
|
}
|
180
209
|
const mid = middlewares[index];
|
181
|
-
const output = mid ?
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
context
|
189
|
-
|
210
|
+
const output = mid ? await runWithSpan(
|
211
|
+
{ name: `middleware.${mid.name}`, signal: options.signal },
|
212
|
+
async (span) => {
|
213
|
+
span?.setAttribute("middleware.index", index);
|
214
|
+
span?.setAttribute("middleware.name", mid.name);
|
215
|
+
const result = await mid({
|
216
|
+
...options,
|
217
|
+
context,
|
218
|
+
next: async (...[nextOptions]) => {
|
219
|
+
const nextContext = nextOptions?.context ?? {};
|
220
|
+
return {
|
221
|
+
output: await next(index + 1, mergeCurrentContext(context, nextContext), currentInput),
|
222
|
+
context: nextContext
|
223
|
+
};
|
224
|
+
}
|
225
|
+
}, currentInput, middlewareOutputFn);
|
226
|
+
return result.output;
|
190
227
|
}
|
191
|
-
|
228
|
+
) : await runWithSpan(
|
229
|
+
{ name: "handler", signal: options.signal },
|
230
|
+
() => procedure["~orpc"].handler({ ...options, context, input: currentInput })
|
231
|
+
);
|
192
232
|
if (index === outputValidationIndex) {
|
193
233
|
return await validateOutput(procedure, output);
|
194
234
|
}
|
@@ -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, b as AnyRouter, A as AnyProcedure, d as ProcedureClientInterceptorOptions } from './server.
|
5
|
+
import { C as Context, R as Router, b as AnyRouter, A as AnyProcedure, d as ProcedureClientInterceptorOptions } from './server.CYNGeoCm.js';
|
6
6
|
|
7
7
|
interface StandardHandlerPlugin<T extends Context> {
|
8
8
|
order?: number;
|
@@ -29,7 +29,9 @@ interface Lazy<T> {
|
|
29
29
|
}
|
30
30
|
type Lazyable<T> = T | Lazy<T>;
|
31
31
|
/**
|
32
|
-
*
|
32
|
+
* Creates a lazy-loaded item.
|
33
|
+
*
|
34
|
+
* @warning The `prefix` in `meta` only holds metadata and does not apply the prefix to the lazy router, use `os.prefix(...).lazy(...)` instead.
|
33
35
|
*/
|
34
36
|
declare function lazy<T>(loader: () => Promise<{
|
35
37
|
default: T;
|
@@ -138,7 +140,7 @@ type CreateProcedureClientOptions<TInitialContext extends Context, TOutputSchema
|
|
138
140
|
*
|
139
141
|
* @see {@link https://orpc.unnoq.com/docs/client/server-side Server-side Client Docs}
|
140
142
|
*/
|
141
|
-
declare function createProcedureClient<TInitialContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta, TClientContext extends ClientContext>(lazyableProcedure: Lazyable<Procedure<TInitialContext, any, TInputSchema, TOutputSchema, TErrorMap, TMeta>>, ...
|
143
|
+
declare function createProcedureClient<TInitialContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta, TClientContext extends ClientContext>(lazyableProcedure: Lazyable<Procedure<TInitialContext, any, TInputSchema, TOutputSchema, TErrorMap, TMeta>>, ...rest: MaybeOptionalOptions<CreateProcedureClientOptions<TInitialContext, TOutputSchema, TErrorMap, TMeta, TClientContext>>): ProcedureClient<TClientContext, TInputSchema, TOutputSchema, TErrorMap>;
|
142
144
|
|
143
145
|
/**
|
144
146
|
* Represents a router, which defines a hierarchical structure of procedures.
|
@@ -29,7 +29,9 @@ interface Lazy<T> {
|
|
29
29
|
}
|
30
30
|
type Lazyable<T> = T | Lazy<T>;
|
31
31
|
/**
|
32
|
-
*
|
32
|
+
* Creates a lazy-loaded item.
|
33
|
+
*
|
34
|
+
* @warning The `prefix` in `meta` only holds metadata and does not apply the prefix to the lazy router, use `os.prefix(...).lazy(...)` instead.
|
33
35
|
*/
|
34
36
|
declare function lazy<T>(loader: () => Promise<{
|
35
37
|
default: T;
|
@@ -138,7 +140,7 @@ type CreateProcedureClientOptions<TInitialContext extends Context, TOutputSchema
|
|
138
140
|
*
|
139
141
|
* @see {@link https://orpc.unnoq.com/docs/client/server-side Server-side Client Docs}
|
140
142
|
*/
|
141
|
-
declare function createProcedureClient<TInitialContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta, TClientContext extends ClientContext>(lazyableProcedure: Lazyable<Procedure<TInitialContext, any, TInputSchema, TOutputSchema, TErrorMap, TMeta>>, ...
|
143
|
+
declare function createProcedureClient<TInitialContext extends Context, TInputSchema extends AnySchema, TOutputSchema extends AnySchema, TErrorMap extends ErrorMap, TMeta extends Meta, TClientContext extends ClientContext>(lazyableProcedure: Lazyable<Procedure<TInitialContext, any, TInputSchema, TOutputSchema, TErrorMap, TMeta>>, ...rest: MaybeOptionalOptions<CreateProcedureClientOptions<TInitialContext, TOutputSchema, TErrorMap, TMeta, TClientContext>>): ProcedureClient<TClientContext, TInputSchema, TOutputSchema, TErrorMap>;
|
142
144
|
|
143
145
|
/**
|
144
146
|
* Represents a router, which defines a hierarchical structure of procedures.
|
@@ -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, value } 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.B_fj3X5m.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
|
}
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import { StandardRPCJsonSerializerOptions } from '@orpc/client/standard';
|
2
|
-
import { b as AnyRouter, C as Context, R as Router } from './server.
|
3
|
-
import { i as StandardMatcher, h as StandardMatchResult, e as StandardHandlerOptions, f as StandardHandler } from './server.
|
2
|
+
import { b as AnyRouter, C as Context, R as Router } from './server.CYNGeoCm.js';
|
3
|
+
import { i as StandardMatcher, h as StandardMatchResult, e as StandardHandlerOptions, f as StandardHandler } from './server.Bmh5xd4n.js';
|
4
4
|
import { HTTPPath } from '@orpc/client';
|
5
5
|
import { Value } from '@orpc/shared';
|
6
|
-
import { T as TraverseContractProcedureCallbackOptions } from './server.
|
6
|
+
import { T as TraverseContractProcedureCallbackOptions } from './server.jMTkVNIb.js';
|
7
7
|
|
8
8
|
interface StandardRPCMatcherOptions {
|
9
9
|
/**
|
@@ -1,5 +1,5 @@
|
|
1
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.
|
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.CYNGeoCm.mjs';
|
3
3
|
|
4
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
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> & {
|
@@ -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 };
|
@@ -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, b as AnyRouter, A as AnyProcedure, d as ProcedureClientInterceptorOptions } from './server.
|
5
|
+
import { C as Context, R as Router, b as AnyRouter, A as AnyProcedure, d as ProcedureClientInterceptorOptions } from './server.CYNGeoCm.mjs';
|
6
6
|
|
7
7
|
interface StandardHandlerPlugin<T extends Context> {
|
8
8
|
order?: number;
|
@@ -1,5 +1,5 @@
|
|
1
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.
|
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.CYNGeoCm.js';
|
3
3
|
|
4
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
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> & {
|