@orpc/server 0.0.0-next.3864cdc → 0.0.0-next.39c8cfb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- 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 +7 -6
- 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.DLJzqnSX.mjs → server.7jWaIryJ.mjs} +104 -56
- 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.Aqc4pYFD.mjs → server.BHZCyRuJ.mjs} +64 -39
- package/dist/shared/{server.C-F_fMXW.d.mts → server.BU4WI18A.d.mts} +3 -3
- 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.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,6 +1,7 @@
|
|
1
1
|
import { isContractProcedure, ValidationError, mergePrefix, mergeErrorMap, enhanceRoute } from '@orpc/contract';
|
2
|
-
import { value, intercept,
|
3
|
-
import { fallbackORPCErrorStatus,
|
2
|
+
import { resolveMaybeOptionalOptions, toArray, value, runWithSpan, intercept, isAsyncIteratorObject, asyncIteratorWithSpan } from '@orpc/shared';
|
3
|
+
import { ORPCError, fallbackORPCErrorStatus, 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;
|
@@ -106,34 +108,59 @@ 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);
|
119
|
+
const validateError = async (e) => {
|
120
|
+
if (e instanceof ORPCError) {
|
121
|
+
return await validateORPCError(procedure["~orpc"].errorMap, e);
|
122
|
+
}
|
123
|
+
return e;
|
124
|
+
};
|
116
125
|
try {
|
117
|
-
|
118
|
-
|
119
|
-
{
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
126
|
+
const output = await runWithSpan(
|
127
|
+
{ name: "call_procedure", signal: callerOptions?.signal },
|
128
|
+
(span) => {
|
129
|
+
span?.setAttribute("procedure.path", [...path]);
|
130
|
+
return intercept(
|
131
|
+
toArray(options.interceptors),
|
132
|
+
{
|
133
|
+
context,
|
134
|
+
input,
|
135
|
+
// input only optional when it undefinable so we can safely cast it
|
136
|
+
errors,
|
137
|
+
path,
|
138
|
+
procedure,
|
139
|
+
signal: callerOptions?.signal,
|
140
|
+
lastEventId: callerOptions?.lastEventId
|
141
|
+
},
|
142
|
+
(interceptorOptions) => executeProcedureInternal(interceptorOptions.procedure, interceptorOptions)
|
143
|
+
);
|
144
|
+
}
|
130
145
|
);
|
131
|
-
|
132
|
-
|
133
|
-
|
146
|
+
if (isAsyncIteratorObject(output)) {
|
147
|
+
if (output instanceof HibernationEventIterator) {
|
148
|
+
return output;
|
149
|
+
}
|
150
|
+
return mapEventIterator(
|
151
|
+
asyncIteratorWithSpan(
|
152
|
+
{ name: "consume_event_iterator_output", signal: callerOptions?.signal },
|
153
|
+
output
|
154
|
+
),
|
155
|
+
{
|
156
|
+
value: (v) => v,
|
157
|
+
error: (e) => validateError(e)
|
158
|
+
}
|
159
|
+
);
|
134
160
|
}
|
135
|
-
|
136
|
-
|
161
|
+
return output;
|
162
|
+
} catch (e) {
|
163
|
+
throw await validateError(e);
|
137
164
|
}
|
138
165
|
};
|
139
166
|
}
|
@@ -142,31 +169,41 @@ async function validateInput(procedure, input) {
|
|
142
169
|
if (!schema) {
|
143
170
|
return input;
|
144
171
|
}
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
172
|
+
return runWithSpan(
|
173
|
+
{ name: "validate_input" },
|
174
|
+
async () => {
|
175
|
+
const result = await schema["~standard"].validate(input);
|
176
|
+
if (result.issues) {
|
177
|
+
throw new ORPCError("BAD_REQUEST", {
|
178
|
+
message: "Input validation failed",
|
179
|
+
data: {
|
180
|
+
issues: result.issues
|
181
|
+
},
|
182
|
+
cause: new ValidationError({ message: "Input validation failed", issues: result.issues })
|
183
|
+
});
|
184
|
+
}
|
185
|
+
return result.value;
|
186
|
+
}
|
187
|
+
);
|
156
188
|
}
|
157
189
|
async function validateOutput(procedure, output) {
|
158
190
|
const schema = procedure["~orpc"].outputSchema;
|
159
191
|
if (!schema) {
|
160
192
|
return output;
|
161
193
|
}
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
194
|
+
return runWithSpan(
|
195
|
+
{ name: "validate_output" },
|
196
|
+
async () => {
|
197
|
+
const result = await schema["~standard"].validate(output);
|
198
|
+
if (result.issues) {
|
199
|
+
throw new ORPCError("INTERNAL_SERVER_ERROR", {
|
200
|
+
message: "Output validation failed",
|
201
|
+
cause: new ValidationError({ message: "Output validation failed", issues: result.issues })
|
202
|
+
});
|
203
|
+
}
|
204
|
+
return result.value;
|
205
|
+
}
|
206
|
+
);
|
170
207
|
}
|
171
208
|
async function executeProcedureInternal(procedure, options) {
|
172
209
|
const middlewares = procedure["~orpc"].middlewares;
|
@@ -178,17 +215,28 @@ async function executeProcedureInternal(procedure, options) {
|
|
178
215
|
currentInput = await validateInput(procedure, currentInput);
|
179
216
|
}
|
180
217
|
const mid = middlewares[index];
|
181
|
-
const output = mid ?
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
context
|
189
|
-
|
218
|
+
const output = mid ? await runWithSpan(
|
219
|
+
{ name: `middleware.${mid.name}`, signal: options.signal },
|
220
|
+
async (span) => {
|
221
|
+
span?.setAttribute("middleware.index", index);
|
222
|
+
span?.setAttribute("middleware.name", mid.name);
|
223
|
+
const result = await mid({
|
224
|
+
...options,
|
225
|
+
context,
|
226
|
+
next: async (...[nextOptions]) => {
|
227
|
+
const nextContext = nextOptions?.context ?? {};
|
228
|
+
return {
|
229
|
+
output: await next(index + 1, mergeCurrentContext(context, nextContext), currentInput),
|
230
|
+
context: nextContext
|
231
|
+
};
|
232
|
+
}
|
233
|
+
}, currentInput, middlewareOutputFn);
|
234
|
+
return result.output;
|
190
235
|
}
|
191
|
-
|
236
|
+
) : await runWithSpan(
|
237
|
+
{ name: "handler", signal: options.signal },
|
238
|
+
() => procedure["~orpc"].handler({ ...options, context, input: currentInput })
|
239
|
+
);
|
192
240
|
if (index === outputValidationIndex) {
|
193
241
|
return await validateOutput(procedure, output);
|
194
242
|
}
|
@@ -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,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.7jWaIryJ.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.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
|
/**
|
@@ -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,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;
|