@orpc/server 0.0.0-next.9fe2a8b → 0.0.0-next.a05fbfd
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 +118 -0
- package/dist/adapters/fetch/index.d.mts +27 -0
- package/dist/adapters/fetch/index.d.ts +27 -0
- package/dist/adapters/fetch/index.mjs +9 -0
- package/dist/adapters/hono/index.d.mts +20 -0
- package/dist/adapters/hono/index.d.ts +20 -0
- package/dist/adapters/hono/index.mjs +32 -0
- package/dist/adapters/next/index.d.mts +27 -0
- package/dist/adapters/next/index.d.ts +27 -0
- package/dist/{next.js → adapters/next/index.mjs} +11 -18
- package/dist/adapters/node/index.d.mts +35 -0
- package/dist/adapters/node/index.d.ts +35 -0
- package/dist/adapters/node/index.mjs +28 -0
- package/dist/adapters/standard/index.d.mts +29 -0
- package/dist/adapters/standard/index.d.ts +29 -0
- package/dist/adapters/standard/index.mjs +7 -0
- package/dist/index.d.mts +253 -0
- package/dist/index.d.ts +253 -0
- package/dist/{index.js → index.mjs} +41 -99
- package/dist/plugins/index.d.mts +31 -0
- package/dist/plugins/index.d.ts +31 -0
- package/dist/plugins/index.mjs +103 -0
- package/dist/shared/server.BBGuTxHE.mjs +163 -0
- package/dist/shared/server.BqEaivV1.d.ts +9 -0
- package/dist/shared/server.CHpDfeOK.d.mts +77 -0
- package/dist/shared/server.CI7U5gRZ.d.mts +152 -0
- package/dist/shared/server.CI7U5gRZ.d.ts +152 -0
- package/dist/shared/server.CUE4Aija.mjs +24 -0
- package/dist/shared/server.DSZ2XY8G.d.ts +77 -0
- package/dist/shared/server.MnOqRlBp.d.mts +9 -0
- package/dist/shared/server.Q6ZmnTgO.mjs +12 -0
- package/dist/{chunk-KK4SDLC7.js → shared/server.V6zT5iYQ.mjs} +148 -89
- package/package.json +36 -24
- package/dist/chunk-ESTRJAOX.js +0 -299
- package/dist/chunk-WUOGVGWG.js +0 -1
- package/dist/fetch.js +0 -15
- package/dist/hono.js +0 -30
- package/dist/node.js +0 -87
- package/dist/src/adapters/fetch/index.d.ts +0 -6
- package/dist/src/adapters/fetch/orpc-handler.d.ts +0 -20
- package/dist/src/adapters/fetch/orpc-payload-codec.d.ts +0 -16
- package/dist/src/adapters/fetch/orpc-procedure-matcher.d.ts +0 -12
- package/dist/src/adapters/fetch/super-json.d.ts +0 -12
- package/dist/src/adapters/fetch/types.d.ts +0 -21
- package/dist/src/adapters/hono/index.d.ts +0 -3
- package/dist/src/adapters/hono/middleware.d.ts +0 -12
- package/dist/src/adapters/next/index.d.ts +0 -3
- package/dist/src/adapters/next/serve.d.ts +0 -19
- package/dist/src/adapters/node/index.d.ts +0 -5
- package/dist/src/adapters/node/orpc-handler.d.ts +0 -12
- package/dist/src/adapters/node/request-listener.d.ts +0 -28
- package/dist/src/adapters/node/types.d.ts +0 -22
- package/dist/src/builder-variants.d.ts +0 -74
- package/dist/src/builder.d.ts +0 -57
- package/dist/src/config.d.ts +0 -6
- package/dist/src/context.d.ts +0 -9
- package/dist/src/hidden.d.ts +0 -8
- package/dist/src/implementer-procedure.d.ts +0 -30
- package/dist/src/implementer-variants.d.ts +0 -17
- package/dist/src/implementer.d.ts +0 -28
- package/dist/src/index.d.ts +0 -21
- package/dist/src/lazy-utils.d.ts +0 -6
- package/dist/src/lazy.d.ts +0 -22
- package/dist/src/middleware-decorated.d.ts +0 -10
- package/dist/src/middleware-utils.d.ts +0 -5
- package/dist/src/middleware.d.ts +0 -37
- package/dist/src/procedure-client.d.ts +0 -20
- package/dist/src/procedure-decorated.d.ts +0 -21
- package/dist/src/procedure-utils.d.ts +0 -17
- package/dist/src/procedure.d.ts +0 -29
- package/dist/src/router-accessible-lazy.d.ts +0 -8
- package/dist/src/router-client.d.ts +0 -22
- package/dist/src/router.d.ts +0 -29
@@ -1,29 +1,12 @@
|
|
1
|
-
import {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
createProcedureClient,
|
9
|
-
deepSetLazyRouterPrefix,
|
10
|
-
flatLazy,
|
11
|
-
getLazyRouterPrefix,
|
12
|
-
getRouterChild,
|
13
|
-
getRouterContract,
|
14
|
-
isLazy,
|
15
|
-
isProcedure,
|
16
|
-
lazy,
|
17
|
-
middlewareOutputFn,
|
18
|
-
setRouterContract,
|
19
|
-
unlazy
|
20
|
-
} from "./chunk-KK4SDLC7.js";
|
1
|
+
import { mergeErrorMap, mergeMeta, mergeRoute, mergePrefix, mergeTags, isContractProcedure } from '@orpc/contract';
|
2
|
+
export { ValidationError, eventIterator, type } from '@orpc/contract';
|
3
|
+
import { P as Procedure, d as addMiddleware, c as createProcedureClient, f as adaptRouter, h as flatLazy, l as lazy, s as setRouterContract, i as isProcedure, j as isLazy, k as createLazyProcedureFormAnyLazy, g as getRouterChild } from './shared/server.V6zT5iYQ.mjs';
|
4
|
+
export { L as LAZY_LOADER_SYMBOL, a as convertPathToHttpPath, q as createAccessibleLazyRouter, b as createContractedProcedure, n as deepSetLazyRouterPrefix, r as eachAllContractProcedure, e as eachContractProcedure, o as getLazyRouterPrefix, m as getRouterContract, p as middlewareOutputFn, u as unlazy } from './shared/server.V6zT5iYQ.mjs';
|
5
|
+
export { ORPCError, isDefinedError, safe } from '@orpc/client';
|
6
|
+
export { onError, onFinish, onStart, onSuccess } from '@orpc/shared';
|
7
|
+
export { getEventMeta, withEventMeta } from '@orpc/standard-server';
|
21
8
|
|
22
|
-
|
23
|
-
import { mergeErrorMap as mergeErrorMap2, mergeMeta as mergeMeta2, mergePrefix, mergeRoute as mergeRoute2, mergeTags } from "@orpc/contract";
|
24
|
-
|
25
|
-
// src/config.ts
|
26
|
-
var DEFAULT_CONFIG = {
|
9
|
+
const DEFAULT_CONFIG = {
|
27
10
|
initialInputValidationIndex: 0,
|
28
11
|
initialOutputValidationIndex: 0
|
29
12
|
};
|
@@ -34,7 +17,6 @@ function fallbackConfig(key, value) {
|
|
34
17
|
return value;
|
35
18
|
}
|
36
19
|
|
37
|
-
// src/middleware-decorated.ts
|
38
20
|
function decorateMiddleware(middleware) {
|
39
21
|
const decorated = middleware;
|
40
22
|
decorated.mapInput = (mapInput) => {
|
@@ -46,10 +28,14 @@ function decorateMiddleware(middleware) {
|
|
46
28
|
decorated.concat = (concatMiddleware, mapInput) => {
|
47
29
|
const mapped = mapInput ? decorateMiddleware(concatMiddleware).mapInput(mapInput) : concatMiddleware;
|
48
30
|
const concatted = decorateMiddleware((options, input, output, ...rest) => {
|
49
|
-
const
|
50
|
-
|
51
|
-
|
52
|
-
|
31
|
+
const merged = middleware({
|
32
|
+
...options,
|
33
|
+
next: (...[nextOptions1]) => mapped({
|
34
|
+
...options,
|
35
|
+
context: { ...options.context, ...nextOptions1?.context },
|
36
|
+
next: (...[nextOptions2]) => options.next({ context: { ...nextOptions1?.context, ...nextOptions2?.context } })
|
37
|
+
}, input, output, ...rest)
|
38
|
+
}, input, output, ...rest);
|
53
39
|
return merged;
|
54
40
|
});
|
55
41
|
return concatted;
|
@@ -57,30 +43,28 @@ function decorateMiddleware(middleware) {
|
|
57
43
|
return decorated;
|
58
44
|
}
|
59
45
|
|
60
|
-
|
61
|
-
import { mergeErrorMap, mergeMeta, mergeRoute } from "@orpc/contract";
|
62
|
-
var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
|
46
|
+
class DecoratedProcedure extends Procedure {
|
63
47
|
errors(errors) {
|
64
|
-
return new
|
48
|
+
return new DecoratedProcedure({
|
65
49
|
...this["~orpc"],
|
66
50
|
errorMap: mergeErrorMap(this["~orpc"].errorMap, errors)
|
67
51
|
});
|
68
52
|
}
|
69
53
|
meta(meta) {
|
70
|
-
return new
|
54
|
+
return new DecoratedProcedure({
|
71
55
|
...this["~orpc"],
|
72
56
|
meta: mergeMeta(this["~orpc"].meta, meta)
|
73
57
|
});
|
74
58
|
}
|
75
59
|
route(route) {
|
76
|
-
return new
|
60
|
+
return new DecoratedProcedure({
|
77
61
|
...this["~orpc"],
|
78
62
|
route: mergeRoute(this["~orpc"].route, route)
|
79
63
|
});
|
80
64
|
}
|
81
65
|
use(middleware, mapInput) {
|
82
66
|
const mapped = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
|
83
|
-
return new
|
67
|
+
return new DecoratedProcedure({
|
84
68
|
...this["~orpc"],
|
85
69
|
middlewares: addMiddleware(this["~orpc"].middlewares, mapped)
|
86
70
|
});
|
@@ -100,10 +84,9 @@ var DecoratedProcedure = class _DecoratedProcedure extends Procedure {
|
|
100
84
|
actionable(...rest) {
|
101
85
|
return this.callable(...rest);
|
102
86
|
}
|
103
|
-
}
|
87
|
+
}
|
104
88
|
|
105
|
-
|
106
|
-
var Builder = class _Builder {
|
89
|
+
class Builder {
|
107
90
|
"~orpc";
|
108
91
|
constructor(def) {
|
109
92
|
this["~orpc"] = def;
|
@@ -114,7 +97,7 @@ var Builder = class _Builder {
|
|
114
97
|
$config(config) {
|
115
98
|
const inputValidationCount = this["~orpc"].inputValidationIndex - fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex);
|
116
99
|
const outputValidationCount = this["~orpc"].outputValidationIndex - fallbackConfig("initialOutputValidationIndex", this["~orpc"].config.initialOutputValidationIndex);
|
117
|
-
return new
|
100
|
+
return new Builder({
|
118
101
|
...this["~orpc"],
|
119
102
|
config,
|
120
103
|
inputValidationIndex: fallbackConfig("initialInputValidationIndex", config.initialInputValidationIndex) + inputValidationCount,
|
@@ -125,7 +108,7 @@ var Builder = class _Builder {
|
|
125
108
|
* Reset initial context
|
126
109
|
*/
|
127
110
|
$context() {
|
128
|
-
return new
|
111
|
+
return new Builder({
|
129
112
|
...this["~orpc"],
|
130
113
|
middlewares: [],
|
131
114
|
inputValidationIndex: fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex),
|
@@ -136,7 +119,7 @@ var Builder = class _Builder {
|
|
136
119
|
* Reset initial meta
|
137
120
|
*/
|
138
121
|
$meta(initialMeta) {
|
139
|
-
return new
|
122
|
+
return new Builder({
|
140
123
|
...this["~orpc"],
|
141
124
|
meta: initialMeta
|
142
125
|
});
|
@@ -145,7 +128,7 @@ var Builder = class _Builder {
|
|
145
128
|
* Reset initial route
|
146
129
|
*/
|
147
130
|
$route(initialRoute) {
|
148
|
-
return new
|
131
|
+
return new Builder({
|
149
132
|
...this["~orpc"],
|
150
133
|
route: initialRoute
|
151
134
|
});
|
@@ -154,39 +137,39 @@ var Builder = class _Builder {
|
|
154
137
|
return decorateMiddleware(middleware);
|
155
138
|
}
|
156
139
|
errors(errors) {
|
157
|
-
return new
|
140
|
+
return new Builder({
|
158
141
|
...this["~orpc"],
|
159
|
-
errorMap:
|
142
|
+
errorMap: mergeErrorMap(this["~orpc"].errorMap, errors)
|
160
143
|
});
|
161
144
|
}
|
162
145
|
use(middleware, mapInput) {
|
163
146
|
const mapped = mapInput ? decorateMiddleware(middleware).mapInput(mapInput) : middleware;
|
164
|
-
return new
|
147
|
+
return new Builder({
|
165
148
|
...this["~orpc"],
|
166
149
|
middlewares: addMiddleware(this["~orpc"].middlewares, mapped)
|
167
150
|
});
|
168
151
|
}
|
169
152
|
meta(meta) {
|
170
|
-
return new
|
153
|
+
return new Builder({
|
171
154
|
...this["~orpc"],
|
172
|
-
meta:
|
155
|
+
meta: mergeMeta(this["~orpc"].meta, meta)
|
173
156
|
});
|
174
157
|
}
|
175
158
|
route(route) {
|
176
|
-
return new
|
159
|
+
return new Builder({
|
177
160
|
...this["~orpc"],
|
178
|
-
route:
|
161
|
+
route: mergeRoute(this["~orpc"].route, route)
|
179
162
|
});
|
180
163
|
}
|
181
164
|
input(schema) {
|
182
|
-
return new
|
165
|
+
return new Builder({
|
183
166
|
...this["~orpc"],
|
184
167
|
inputSchema: schema,
|
185
168
|
inputValidationIndex: fallbackConfig("initialInputValidationIndex", this["~orpc"].config.initialInputValidationIndex) + this["~orpc"].middlewares.length
|
186
169
|
});
|
187
170
|
}
|
188
171
|
output(schema) {
|
189
|
-
return new
|
172
|
+
return new Builder({
|
190
173
|
...this["~orpc"],
|
191
174
|
outputSchema: schema,
|
192
175
|
outputValidationIndex: fallbackConfig("initialOutputValidationIndex", this["~orpc"].config.initialOutputValidationIndex) + this["~orpc"].middlewares.length
|
@@ -199,13 +182,13 @@ var Builder = class _Builder {
|
|
199
182
|
});
|
200
183
|
}
|
201
184
|
prefix(prefix) {
|
202
|
-
return new
|
185
|
+
return new Builder({
|
203
186
|
...this["~orpc"],
|
204
187
|
prefix: mergePrefix(this["~orpc"].prefix, prefix)
|
205
188
|
});
|
206
189
|
}
|
207
190
|
tag(...tags) {
|
208
|
-
return new
|
191
|
+
return new Builder({
|
209
192
|
...this["~orpc"],
|
210
193
|
tags: mergeTags(this["~orpc"].tags, tags)
|
211
194
|
});
|
@@ -216,8 +199,8 @@ var Builder = class _Builder {
|
|
216
199
|
lazy(loader) {
|
217
200
|
return adaptRouter(flatLazy(lazy(loader)), this["~orpc"]);
|
218
201
|
}
|
219
|
-
}
|
220
|
-
|
202
|
+
}
|
203
|
+
const os = new Builder({
|
221
204
|
config: {},
|
222
205
|
route: {},
|
223
206
|
meta: {},
|
@@ -229,13 +212,10 @@ var os = new Builder({
|
|
229
212
|
middlewares: []
|
230
213
|
});
|
231
214
|
|
232
|
-
// src/context.ts
|
233
215
|
function mergeContext(context, other) {
|
234
216
|
return { ...context, ...other };
|
235
217
|
}
|
236
218
|
|
237
|
-
// src/implementer.ts
|
238
|
-
import { isContractProcedure } from "@orpc/contract";
|
239
219
|
function implementerInternal(contract, config, middlewares) {
|
240
220
|
if (isContractProcedure(contract)) {
|
241
221
|
const impl2 = new Builder({
|
@@ -321,12 +301,10 @@ function implement(contract, config = {}) {
|
|
321
301
|
return impl;
|
322
302
|
}
|
323
303
|
|
324
|
-
// src/procedure-utils.ts
|
325
304
|
function call(procedure, input, ...rest) {
|
326
305
|
return createProcedureClient(procedure, ...rest)(input);
|
327
306
|
}
|
328
307
|
|
329
|
-
// src/router-client.ts
|
330
308
|
function createRouterClient(router, ...rest) {
|
331
309
|
if (isProcedure(router)) {
|
332
310
|
const caller = createProcedureClient(router, ...rest);
|
@@ -352,40 +330,4 @@ function createRouterClient(router, ...rest) {
|
|
352
330
|
return recursive;
|
353
331
|
}
|
354
332
|
|
355
|
-
|
356
|
-
import { isDefinedError, ORPCError, safe, type, ValidationError } from "@orpc/contract";
|
357
|
-
export {
|
358
|
-
Builder,
|
359
|
-
DecoratedProcedure,
|
360
|
-
LAZY_LOADER_SYMBOL,
|
361
|
-
ORPCError,
|
362
|
-
Procedure,
|
363
|
-
ValidationError,
|
364
|
-
adaptRouter,
|
365
|
-
call,
|
366
|
-
createAccessibleLazyRouter,
|
367
|
-
createLazyProcedureFormAnyLazy,
|
368
|
-
createProcedureClient,
|
369
|
-
createRouterClient,
|
370
|
-
decorateMiddleware,
|
371
|
-
deepSetLazyRouterPrefix,
|
372
|
-
fallbackConfig,
|
373
|
-
flatLazy,
|
374
|
-
getLazyRouterPrefix,
|
375
|
-
getRouterChild,
|
376
|
-
getRouterContract,
|
377
|
-
implement,
|
378
|
-
implementerInternal,
|
379
|
-
isDefinedError,
|
380
|
-
isLazy,
|
381
|
-
isProcedure,
|
382
|
-
lazy,
|
383
|
-
mergeContext,
|
384
|
-
middlewareOutputFn,
|
385
|
-
os,
|
386
|
-
safe,
|
387
|
-
setRouterContract,
|
388
|
-
type,
|
389
|
-
unlazy
|
390
|
-
};
|
391
|
-
//# sourceMappingURL=index.js.map
|
333
|
+
export { Builder, DecoratedProcedure, Procedure, adaptRouter, call, createLazyProcedureFormAnyLazy, createProcedureClient, createRouterClient, decorateMiddleware, fallbackConfig, flatLazy, getRouterChild, implement, implementerInternal, isLazy, isProcedure, lazy, mergeContext, os, setRouterContract };
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { d as StandardHandlerInterceptorOptions, P as Plugin, a as StandardHandlerOptions } from '../shared/server.CHpDfeOK.mjs';
|
2
|
+
export { C as CompositePlugin } from '../shared/server.CHpDfeOK.mjs';
|
3
|
+
import { Value } from '@orpc/shared';
|
4
|
+
import { C as Context } from '../shared/server.CI7U5gRZ.mjs';
|
5
|
+
import '@orpc/contract';
|
6
|
+
import '@orpc/standard-server';
|
7
|
+
import '@orpc/client';
|
8
|
+
|
9
|
+
interface CORSOptions<TContext extends Context> {
|
10
|
+
origin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>;
|
11
|
+
timingOrigin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>;
|
12
|
+
allowMethods?: string[];
|
13
|
+
allowHeaders?: string[];
|
14
|
+
maxAge?: number;
|
15
|
+
credentials?: boolean;
|
16
|
+
exposeHeaders?: string[];
|
17
|
+
}
|
18
|
+
declare class CORSPlugin<TContext extends Context> implements Plugin<TContext> {
|
19
|
+
private readonly options;
|
20
|
+
constructor(options?: Partial<CORSOptions<TContext>>);
|
21
|
+
init(options: StandardHandlerOptions<TContext>): void;
|
22
|
+
}
|
23
|
+
|
24
|
+
interface ResponseHeadersPluginContext {
|
25
|
+
resHeaders?: Headers;
|
26
|
+
}
|
27
|
+
declare class ResponseHeadersPlugin<TContext extends ResponseHeadersPluginContext & Context> implements Plugin<TContext> {
|
28
|
+
init(options: StandardHandlerOptions<TContext>): void;
|
29
|
+
}
|
30
|
+
|
31
|
+
export { type CORSOptions, CORSPlugin, Plugin, ResponseHeadersPlugin, type ResponseHeadersPluginContext };
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { d as StandardHandlerInterceptorOptions, P as Plugin, a as StandardHandlerOptions } from '../shared/server.DSZ2XY8G.js';
|
2
|
+
export { C as CompositePlugin } from '../shared/server.DSZ2XY8G.js';
|
3
|
+
import { Value } from '@orpc/shared';
|
4
|
+
import { C as Context } from '../shared/server.CI7U5gRZ.js';
|
5
|
+
import '@orpc/contract';
|
6
|
+
import '@orpc/standard-server';
|
7
|
+
import '@orpc/client';
|
8
|
+
|
9
|
+
interface CORSOptions<TContext extends Context> {
|
10
|
+
origin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>;
|
11
|
+
timingOrigin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>;
|
12
|
+
allowMethods?: string[];
|
13
|
+
allowHeaders?: string[];
|
14
|
+
maxAge?: number;
|
15
|
+
credentials?: boolean;
|
16
|
+
exposeHeaders?: string[];
|
17
|
+
}
|
18
|
+
declare class CORSPlugin<TContext extends Context> implements Plugin<TContext> {
|
19
|
+
private readonly options;
|
20
|
+
constructor(options?: Partial<CORSOptions<TContext>>);
|
21
|
+
init(options: StandardHandlerOptions<TContext>): void;
|
22
|
+
}
|
23
|
+
|
24
|
+
interface ResponseHeadersPluginContext {
|
25
|
+
resHeaders?: Headers;
|
26
|
+
}
|
27
|
+
declare class ResponseHeadersPlugin<TContext extends ResponseHeadersPluginContext & Context> implements Plugin<TContext> {
|
28
|
+
init(options: StandardHandlerOptions<TContext>): void;
|
29
|
+
}
|
30
|
+
|
31
|
+
export { type CORSOptions, CORSPlugin, Plugin, ResponseHeadersPlugin, type ResponseHeadersPluginContext };
|
@@ -0,0 +1,103 @@
|
|
1
|
+
export { C as CompositePlugin } from '../shared/server.Q6ZmnTgO.mjs';
|
2
|
+
import { value } from '@orpc/shared';
|
3
|
+
|
4
|
+
class CORSPlugin {
|
5
|
+
options;
|
6
|
+
constructor(options) {
|
7
|
+
const defaults = {
|
8
|
+
origin: (origin) => origin,
|
9
|
+
allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"]
|
10
|
+
};
|
11
|
+
this.options = {
|
12
|
+
...defaults,
|
13
|
+
...options
|
14
|
+
};
|
15
|
+
}
|
16
|
+
init(options) {
|
17
|
+
options.rootInterceptors ??= [];
|
18
|
+
options.rootInterceptors.unshift(async (interceptorOptions) => {
|
19
|
+
if (interceptorOptions.request.method === "OPTIONS") {
|
20
|
+
const resHeaders = {};
|
21
|
+
if (this.options.maxAge !== void 0) {
|
22
|
+
resHeaders["access-control-max-age"] = this.options.maxAge.toString();
|
23
|
+
}
|
24
|
+
if (this.options.allowMethods?.length) {
|
25
|
+
resHeaders["access-control-allow-methods"] = this.options.allowMethods.join(",");
|
26
|
+
}
|
27
|
+
const allowHeaders = this.options.allowHeaders ?? interceptorOptions.request.headers["access-control-request-headers"];
|
28
|
+
if (Array.isArray(allowHeaders) && allowHeaders.length) {
|
29
|
+
resHeaders["access-control-allow-headers"] = allowHeaders.join(",");
|
30
|
+
} else if (typeof allowHeaders === "string") {
|
31
|
+
resHeaders["access-control-allow-headers"] = allowHeaders;
|
32
|
+
}
|
33
|
+
return {
|
34
|
+
matched: true,
|
35
|
+
response: {
|
36
|
+
status: 204,
|
37
|
+
headers: resHeaders,
|
38
|
+
body: void 0
|
39
|
+
}
|
40
|
+
};
|
41
|
+
}
|
42
|
+
return interceptorOptions.next();
|
43
|
+
});
|
44
|
+
options.rootInterceptors.unshift(async (interceptorOptions) => {
|
45
|
+
const result = await interceptorOptions.next();
|
46
|
+
if (!result.matched) {
|
47
|
+
return result;
|
48
|
+
}
|
49
|
+
const origin = Array.isArray(interceptorOptions.request.headers.origin) ? interceptorOptions.request.headers.origin.join(",") : interceptorOptions.request.headers.origin || "";
|
50
|
+
const allowedOrigin = await value(this.options.origin, origin, interceptorOptions);
|
51
|
+
const allowedOriginArr = Array.isArray(allowedOrigin) ? allowedOrigin : [allowedOrigin];
|
52
|
+
if (allowedOriginArr.includes("*")) {
|
53
|
+
result.response.headers["access-control-allow-origin"] = "*";
|
54
|
+
} else {
|
55
|
+
if (allowedOriginArr.includes(origin)) {
|
56
|
+
result.response.headers["access-control-allow-origin"] = origin;
|
57
|
+
}
|
58
|
+
result.response.headers.vary = interceptorOptions.request.headers.vary ?? "origin";
|
59
|
+
}
|
60
|
+
const allowedTimingOrigin = await value(this.options.timingOrigin, origin, interceptorOptions);
|
61
|
+
const allowedTimingOriginArr = Array.isArray(allowedTimingOrigin) ? allowedTimingOrigin : [allowedTimingOrigin];
|
62
|
+
if (allowedTimingOriginArr.includes("*")) {
|
63
|
+
result.response.headers["timing-allow-origin"] = "*";
|
64
|
+
} else if (allowedTimingOriginArr.includes(origin)) {
|
65
|
+
result.response.headers["timing-allow-origin"] = origin;
|
66
|
+
}
|
67
|
+
if (this.options.credentials) {
|
68
|
+
result.response.headers["access-control-allow-credentials"] = "true";
|
69
|
+
}
|
70
|
+
if (this.options.exposeHeaders?.length) {
|
71
|
+
result.response.headers["access-control-expose-headers"] = this.options.exposeHeaders.join(",");
|
72
|
+
}
|
73
|
+
return result;
|
74
|
+
});
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
class ResponseHeadersPlugin {
|
79
|
+
init(options) {
|
80
|
+
options.rootInterceptors ??= [];
|
81
|
+
options.rootInterceptors.push(async (interceptorOptions) => {
|
82
|
+
const headers = new Headers();
|
83
|
+
interceptorOptions.context.resHeaders = headers;
|
84
|
+
const result = await interceptorOptions.next();
|
85
|
+
if (!result.matched) {
|
86
|
+
return result;
|
87
|
+
}
|
88
|
+
const responseHeaders = result.response.headers;
|
89
|
+
for (const [key, value] of headers) {
|
90
|
+
if (Array.isArray(responseHeaders[key])) {
|
91
|
+
responseHeaders[key].push(value);
|
92
|
+
} else if (responseHeaders[key] !== void 0) {
|
93
|
+
responseHeaders[key] = [responseHeaders[key], value];
|
94
|
+
} else {
|
95
|
+
responseHeaders[key] = value;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
return result;
|
99
|
+
});
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
export { CORSPlugin, ResponseHeadersPlugin };
|
@@ -0,0 +1,163 @@
|
|
1
|
+
import { ORPCError, toORPCError } from '@orpc/client';
|
2
|
+
import { intercept, trim, parseEmptyableJSON } from '@orpc/shared';
|
3
|
+
import { C as CompositePlugin } from './server.Q6ZmnTgO.mjs';
|
4
|
+
import { c as createProcedureClient, e as eachContractProcedure, a as convertPathToHttpPath, i as isProcedure, u as unlazy, g as getRouterChild, b as createContractedProcedure } from './server.V6zT5iYQ.mjs';
|
5
|
+
import { RPCSerializer } from '@orpc/client/standard';
|
6
|
+
|
7
|
+
class StandardHandler {
|
8
|
+
constructor(router, matcher, codec, options = {}) {
|
9
|
+
this.matcher = matcher;
|
10
|
+
this.codec = codec;
|
11
|
+
this.options = options;
|
12
|
+
this.plugin = new CompositePlugin(options.plugins);
|
13
|
+
this.plugin.init(this.options);
|
14
|
+
this.matcher.init(router);
|
15
|
+
}
|
16
|
+
plugin;
|
17
|
+
handle(request, ...[options]) {
|
18
|
+
return intercept(
|
19
|
+
this.options.rootInterceptors ?? [],
|
20
|
+
{
|
21
|
+
request,
|
22
|
+
...options,
|
23
|
+
context: options?.context ?? {}
|
24
|
+
// context is optional only when all fields are optional so we can safely force it to have a context
|
25
|
+
},
|
26
|
+
async (interceptorOptions) => {
|
27
|
+
let isDecoding = false;
|
28
|
+
try {
|
29
|
+
return await intercept(
|
30
|
+
this.options.interceptors ?? [],
|
31
|
+
interceptorOptions,
|
32
|
+
async (interceptorOptions2) => {
|
33
|
+
const method = interceptorOptions2.request.method;
|
34
|
+
const url = interceptorOptions2.request.url;
|
35
|
+
const pathname = `/${trim(url.pathname.replace(interceptorOptions2.prefix ?? "", ""), "/")}`;
|
36
|
+
const match = await this.matcher.match(method, pathname);
|
37
|
+
if (!match) {
|
38
|
+
return { matched: false, response: void 0 };
|
39
|
+
}
|
40
|
+
const client = createProcedureClient(match.procedure, {
|
41
|
+
context: interceptorOptions2.context,
|
42
|
+
path: match.path,
|
43
|
+
interceptors: this.options.clientInterceptors
|
44
|
+
});
|
45
|
+
isDecoding = true;
|
46
|
+
const input = await this.codec.decode(request, match.params, match.procedure);
|
47
|
+
isDecoding = false;
|
48
|
+
const lastEventId = Array.isArray(request.headers["last-event-id"]) ? request.headers["last-event-id"].at(-1) : request.headers["last-event-id"];
|
49
|
+
const output = await client(input, { signal: request.signal, lastEventId });
|
50
|
+
const response = this.codec.encode(output, match.procedure);
|
51
|
+
return {
|
52
|
+
matched: true,
|
53
|
+
response
|
54
|
+
};
|
55
|
+
}
|
56
|
+
);
|
57
|
+
} catch (e) {
|
58
|
+
const error = isDecoding ? new ORPCError("BAD_REQUEST", {
|
59
|
+
message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
|
60
|
+
cause: e
|
61
|
+
}) : toORPCError(e);
|
62
|
+
const response = this.codec.encodeError(error);
|
63
|
+
return {
|
64
|
+
matched: true,
|
65
|
+
response
|
66
|
+
};
|
67
|
+
}
|
68
|
+
}
|
69
|
+
);
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
class RPCCodec {
|
74
|
+
serializer;
|
75
|
+
constructor(options = {}) {
|
76
|
+
this.serializer = options.serializer ?? new RPCSerializer();
|
77
|
+
}
|
78
|
+
async decode(request, _params, _procedure) {
|
79
|
+
const serialized = request.method === "GET" ? parseEmptyableJSON(request.url.searchParams.getAll("data").at(-1)) : await request.body();
|
80
|
+
return this.serializer.deserialize(serialized);
|
81
|
+
}
|
82
|
+
encode(output, _procedure) {
|
83
|
+
return {
|
84
|
+
status: 200,
|
85
|
+
headers: {},
|
86
|
+
body: this.serializer.serialize(output)
|
87
|
+
};
|
88
|
+
}
|
89
|
+
encodeError(error) {
|
90
|
+
return {
|
91
|
+
status: error.status,
|
92
|
+
headers: {},
|
93
|
+
body: this.serializer.serialize(error.toJSON())
|
94
|
+
};
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
class RPCMatcher {
|
99
|
+
tree = {};
|
100
|
+
pendingRouters = [];
|
101
|
+
init(router, path = []) {
|
102
|
+
const laziedOptions = eachContractProcedure({
|
103
|
+
router,
|
104
|
+
path
|
105
|
+
}, ({ path: path2, contract }) => {
|
106
|
+
const httpPath = convertPathToHttpPath(path2);
|
107
|
+
if (isProcedure(contract)) {
|
108
|
+
this.tree[httpPath] = {
|
109
|
+
path: path2,
|
110
|
+
contract,
|
111
|
+
procedure: contract,
|
112
|
+
// this mean dev not used contract-first so we can used contract as procedure directly
|
113
|
+
router
|
114
|
+
};
|
115
|
+
} else {
|
116
|
+
this.tree[httpPath] = {
|
117
|
+
path: path2,
|
118
|
+
contract,
|
119
|
+
procedure: void 0,
|
120
|
+
router
|
121
|
+
};
|
122
|
+
}
|
123
|
+
});
|
124
|
+
this.pendingRouters.push(...laziedOptions.map((option) => ({
|
125
|
+
...option,
|
126
|
+
httpPathPrefix: convertPathToHttpPath(option.path)
|
127
|
+
})));
|
128
|
+
}
|
129
|
+
async match(_method, pathname) {
|
130
|
+
if (this.pendingRouters.length) {
|
131
|
+
const newPendingRouters = [];
|
132
|
+
for (const pendingRouter of this.pendingRouters) {
|
133
|
+
if (pathname.startsWith(pendingRouter.httpPathPrefix)) {
|
134
|
+
const { default: router } = await unlazy(pendingRouter.lazied);
|
135
|
+
this.init(router, pendingRouter.path);
|
136
|
+
} else {
|
137
|
+
newPendingRouters.push(pendingRouter);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
this.pendingRouters = newPendingRouters;
|
141
|
+
}
|
142
|
+
const match = this.tree[pathname];
|
143
|
+
if (!match) {
|
144
|
+
return void 0;
|
145
|
+
}
|
146
|
+
if (!match.procedure) {
|
147
|
+
const { default: maybeProcedure } = await unlazy(getRouterChild(match.router, ...match.path));
|
148
|
+
if (!isProcedure(maybeProcedure)) {
|
149
|
+
throw new Error(`
|
150
|
+
[Contract-First] Missing or invalid implementation for procedure at path: ${convertPathToHttpPath(match.path)}.
|
151
|
+
Ensure that the procedure is correctly defined and matches the expected contract.
|
152
|
+
`);
|
153
|
+
}
|
154
|
+
match.procedure = createContractedProcedure(match.contract, maybeProcedure);
|
155
|
+
}
|
156
|
+
return {
|
157
|
+
path: match.path,
|
158
|
+
procedure: match.procedure
|
159
|
+
};
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
export { RPCCodec as R, StandardHandler as S, RPCMatcher as a };
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { C as Context } from './server.CI7U5gRZ.js';
|
2
|
+
import { a as StandardHandlerOptions, b as StandardMatcher, c as StandardCodec } from './server.DSZ2XY8G.js';
|
3
|
+
|
4
|
+
interface RPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T> {
|
5
|
+
matcher?: StandardMatcher;
|
6
|
+
codec?: StandardCodec;
|
7
|
+
}
|
8
|
+
|
9
|
+
export type { RPCHandlerOptions as R };
|