@orpc/server 0.0.0-next.d5f0415 → 0.0.0-next.d760838

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.
Files changed (84) hide show
  1. package/README.md +15 -2
  2. package/dist/adapters/fetch/index.d.mts +54 -0
  3. package/dist/adapters/fetch/index.d.ts +54 -0
  4. package/dist/adapters/fetch/index.mjs +9 -0
  5. package/dist/adapters/hono/index.d.mts +22 -0
  6. package/dist/adapters/hono/index.d.ts +22 -0
  7. package/dist/{hono.js → adapters/hono/index.mjs} +11 -13
  8. package/dist/adapters/next/index.d.mts +29 -0
  9. package/dist/adapters/next/index.d.ts +29 -0
  10. package/dist/{next.js → adapters/next/index.mjs} +11 -13
  11. package/dist/adapters/node/index.d.mts +53 -0
  12. package/dist/adapters/node/index.d.ts +53 -0
  13. package/dist/adapters/node/index.mjs +85 -0
  14. package/dist/adapters/standard/index.d.mts +26 -0
  15. package/dist/adapters/standard/index.d.ts +26 -0
  16. package/dist/adapters/standard/index.mjs +6 -0
  17. package/dist/index.d.mts +291 -0
  18. package/dist/index.d.ts +291 -0
  19. package/dist/{index.js → index.mjs} +107 -157
  20. package/dist/plugins/index.d.mts +66 -0
  21. package/dist/plugins/index.d.ts +66 -0
  22. package/dist/plugins/index.mjs +196 -0
  23. package/dist/shared/server.BFt8M4Cr.d.ts +8 -0
  24. package/dist/shared/server.BVwwTHyO.mjs +9 -0
  25. package/dist/shared/server.Bc6jnvPE.d.ts +10 -0
  26. package/dist/shared/server.BlxK0o8R.d.mts +66 -0
  27. package/dist/{chunk-MHVECKBC.js → shared/server.C37gDhSZ.mjs} +167 -224
  28. package/dist/shared/server.CCPFkKqC.mjs +98 -0
  29. package/dist/shared/server.CCgy73tk.d.mts +10 -0
  30. package/dist/{chunk-77FU7QSO.js → shared/server.DJrRF9vD.mjs} +50 -69
  31. package/dist/shared/server.DLt5njUb.d.mts +143 -0
  32. package/dist/shared/server.DLt5njUb.d.ts +143 -0
  33. package/dist/shared/server.DuTpqr2w.d.ts +66 -0
  34. package/dist/shared/server.JgWzFqlo.d.mts +8 -0
  35. package/package.json +30 -35
  36. package/dist/chunk-47YYO5JS.js +0 -32
  37. package/dist/chunk-WQNNSBXW.js +0 -120
  38. package/dist/fetch.js +0 -10
  39. package/dist/node.js +0 -31
  40. package/dist/plugins.js +0 -11
  41. package/dist/src/adapters/fetch/index.d.ts +0 -3
  42. package/dist/src/adapters/fetch/rpc-handler.d.ts +0 -11
  43. package/dist/src/adapters/fetch/types.d.ts +0 -14
  44. package/dist/src/adapters/hono/index.d.ts +0 -3
  45. package/dist/src/adapters/hono/middleware.d.ts +0 -12
  46. package/dist/src/adapters/next/index.d.ts +0 -3
  47. package/dist/src/adapters/next/serve.d.ts +0 -19
  48. package/dist/src/adapters/node/index.d.ts +0 -3
  49. package/dist/src/adapters/node/rpc-handler.d.ts +0 -11
  50. package/dist/src/adapters/node/types.d.ts +0 -22
  51. package/dist/src/adapters/standard/handler.d.ts +0 -53
  52. package/dist/src/adapters/standard/index.d.ts +0 -6
  53. package/dist/src/adapters/standard/rpc-codec.d.ts +0 -16
  54. package/dist/src/adapters/standard/rpc-handler.d.ts +0 -8
  55. package/dist/src/adapters/standard/rpc-matcher.d.ts +0 -10
  56. package/dist/src/adapters/standard/types.d.ts +0 -21
  57. package/dist/src/builder-variants.d.ts +0 -75
  58. package/dist/src/builder.d.ts +0 -58
  59. package/dist/src/config.d.ts +0 -6
  60. package/dist/src/context.d.ts +0 -8
  61. package/dist/src/error.d.ts +0 -12
  62. package/dist/src/hidden.d.ts +0 -8
  63. package/dist/src/implementer-procedure.d.ts +0 -33
  64. package/dist/src/implementer-variants.d.ts +0 -18
  65. package/dist/src/implementer.d.ts +0 -29
  66. package/dist/src/index.d.ts +0 -25
  67. package/dist/src/lazy-utils.d.ts +0 -6
  68. package/dist/src/lazy.d.ts +0 -22
  69. package/dist/src/middleware-decorated.d.ts +0 -11
  70. package/dist/src/middleware-utils.d.ts +0 -5
  71. package/dist/src/middleware.d.ts +0 -38
  72. package/dist/src/plugins/base.d.ts +0 -11
  73. package/dist/src/plugins/cors.d.ts +0 -19
  74. package/dist/src/plugins/index.d.ts +0 -4
  75. package/dist/src/plugins/response-headers.d.ts +0 -10
  76. package/dist/src/procedure-client.d.ts +0 -33
  77. package/dist/src/procedure-decorated.d.ts +0 -24
  78. package/dist/src/procedure-utils.d.ts +0 -19
  79. package/dist/src/procedure.d.ts +0 -31
  80. package/dist/src/router-accessible-lazy.d.ts +0 -8
  81. package/dist/src/router-client.d.ts +0 -12
  82. package/dist/src/router.d.ts +0 -30
  83. package/dist/src/utils.d.ts +0 -24
  84. package/dist/standard.js +0 -13
@@ -0,0 +1,196 @@
1
+ import { value } from '@orpc/shared';
2
+ import { parseBatchRequest, toBatchResponse } from '@orpc/standard-server/batch';
3
+
4
+ class BatchHandlerPlugin {
5
+ maxSize;
6
+ mapRequestItem;
7
+ successStatus;
8
+ headers;
9
+ constructor(options = {}) {
10
+ this.maxSize = options.maxSize ?? 10;
11
+ this.mapRequestItem = options.mapRequestItem ?? ((request, { request: batchRequest }) => ({
12
+ ...request,
13
+ headers: {
14
+ ...batchRequest.headers,
15
+ ...request.headers
16
+ }
17
+ }));
18
+ this.successStatus = options.successStatus ?? 207;
19
+ this.headers = options.headers ?? {};
20
+ }
21
+ init(options) {
22
+ options.rootInterceptors ??= [];
23
+ options.rootInterceptors.unshift(async (options2) => {
24
+ if (options2.request.headers["x-orpc-batch"] !== "1") {
25
+ return options2.next();
26
+ }
27
+ let isParsing = false;
28
+ try {
29
+ isParsing = true;
30
+ const parsed = parseBatchRequest({ ...options2.request, body: await options2.request.body() });
31
+ isParsing = false;
32
+ const maxSize = await value(this.maxSize, options2);
33
+ if (parsed.length > maxSize) {
34
+ return {
35
+ matched: true,
36
+ response: {
37
+ status: 413,
38
+ headers: {},
39
+ body: "Batch request size exceeds the maximum allowed size"
40
+ }
41
+ };
42
+ }
43
+ const responses = parsed.map(
44
+ (request, index) => {
45
+ const mapped = this.mapRequestItem(request, options2);
46
+ return options2.next({ ...options2, request: { ...mapped, body: () => Promise.resolve(mapped.body) } }).then(({ response: response2, matched }) => {
47
+ if (matched) {
48
+ return { ...response2, index };
49
+ }
50
+ return { index, status: 404, headers: {}, body: "No procedure matched" };
51
+ }).catch(() => {
52
+ return { index, status: 500, headers: {}, body: "Internal server error" };
53
+ });
54
+ }
55
+ );
56
+ await Promise.race(responses);
57
+ const status = await value(this.successStatus, responses, options2);
58
+ const headers = await value(this.headers, responses, options2);
59
+ const response = toBatchResponse({
60
+ status,
61
+ headers,
62
+ body: async function* () {
63
+ const promises = [...responses];
64
+ while (true) {
65
+ const handling = promises.filter((p) => p !== void 0);
66
+ if (handling.length === 0) {
67
+ return;
68
+ }
69
+ const result = await Promise.race(handling);
70
+ promises[result.index] = void 0;
71
+ yield result;
72
+ }
73
+ }()
74
+ });
75
+ return {
76
+ matched: true,
77
+ response
78
+ };
79
+ } catch (cause) {
80
+ if (isParsing) {
81
+ return {
82
+ matched: true,
83
+ response: { status: 400, headers: {}, body: "Invalid batch request, this could be caused by a malformed request body or a missing header" }
84
+ };
85
+ }
86
+ throw cause;
87
+ }
88
+ });
89
+ }
90
+ }
91
+
92
+ class CORSPlugin {
93
+ options;
94
+ constructor(options = {}) {
95
+ const defaults = {
96
+ origin: (origin) => origin,
97
+ allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"]
98
+ };
99
+ this.options = {
100
+ ...defaults,
101
+ ...options
102
+ };
103
+ }
104
+ init(options) {
105
+ options.rootInterceptors ??= [];
106
+ options.rootInterceptors.unshift(async (interceptorOptions) => {
107
+ if (interceptorOptions.request.method === "OPTIONS") {
108
+ const resHeaders = {};
109
+ if (this.options.maxAge !== void 0) {
110
+ resHeaders["access-control-max-age"] = this.options.maxAge.toString();
111
+ }
112
+ if (this.options.allowMethods?.length) {
113
+ resHeaders["access-control-allow-methods"] = this.options.allowMethods.join(",");
114
+ }
115
+ const allowHeaders = this.options.allowHeaders ?? interceptorOptions.request.headers["access-control-request-headers"];
116
+ if (Array.isArray(allowHeaders) && allowHeaders.length) {
117
+ resHeaders["access-control-allow-headers"] = allowHeaders.join(",");
118
+ } else if (typeof allowHeaders === "string") {
119
+ resHeaders["access-control-allow-headers"] = allowHeaders;
120
+ }
121
+ return {
122
+ matched: true,
123
+ response: {
124
+ status: 204,
125
+ headers: resHeaders,
126
+ body: void 0
127
+ }
128
+ };
129
+ }
130
+ return interceptorOptions.next();
131
+ });
132
+ options.rootInterceptors.unshift(async (interceptorOptions) => {
133
+ const result = await interceptorOptions.next();
134
+ if (!result.matched) {
135
+ return result;
136
+ }
137
+ const origin = Array.isArray(interceptorOptions.request.headers.origin) ? interceptorOptions.request.headers.origin.join(",") : interceptorOptions.request.headers.origin || "";
138
+ const allowedOrigin = await value(this.options.origin, origin, interceptorOptions);
139
+ const allowedOriginArr = Array.isArray(allowedOrigin) ? allowedOrigin : [allowedOrigin];
140
+ if (allowedOriginArr.includes("*")) {
141
+ result.response.headers["access-control-allow-origin"] = "*";
142
+ } else {
143
+ if (allowedOriginArr.includes(origin)) {
144
+ result.response.headers["access-control-allow-origin"] = origin;
145
+ }
146
+ result.response.headers.vary = interceptorOptions.request.headers.vary ?? "origin";
147
+ }
148
+ const allowedTimingOrigin = await value(this.options.timingOrigin, origin, interceptorOptions);
149
+ const allowedTimingOriginArr = Array.isArray(allowedTimingOrigin) ? allowedTimingOrigin : [allowedTimingOrigin];
150
+ if (allowedTimingOriginArr.includes("*")) {
151
+ result.response.headers["timing-allow-origin"] = "*";
152
+ } else if (allowedTimingOriginArr.includes(origin)) {
153
+ result.response.headers["timing-allow-origin"] = origin;
154
+ }
155
+ if (this.options.credentials) {
156
+ result.response.headers["access-control-allow-credentials"] = "true";
157
+ }
158
+ if (this.options.exposeHeaders?.length) {
159
+ result.response.headers["access-control-expose-headers"] = this.options.exposeHeaders.join(",");
160
+ }
161
+ return result;
162
+ });
163
+ }
164
+ }
165
+
166
+ class ResponseHeadersPlugin {
167
+ init(options) {
168
+ options.rootInterceptors ??= [];
169
+ options.rootInterceptors.push(async (interceptorOptions) => {
170
+ const resHeaders = interceptorOptions.context.resHeaders ?? new Headers();
171
+ const result = await interceptorOptions.next({
172
+ ...interceptorOptions,
173
+ context: {
174
+ ...interceptorOptions.context,
175
+ resHeaders
176
+ }
177
+ });
178
+ if (!result.matched) {
179
+ return result;
180
+ }
181
+ const responseHeaders = result.response.headers;
182
+ for (const [key, value] of resHeaders) {
183
+ if (Array.isArray(responseHeaders[key])) {
184
+ responseHeaders[key].push(value);
185
+ } else if (responseHeaders[key] !== void 0) {
186
+ responseHeaders[key] = [responseHeaders[key], value];
187
+ } else {
188
+ responseHeaders[key] = value;
189
+ }
190
+ }
191
+ return result;
192
+ });
193
+ }
194
+ }
195
+
196
+ export { BatchHandlerPlugin, CORSPlugin, ResponseHeadersPlugin };
@@ -0,0 +1,8 @@
1
+ import { StandardRPCJsonSerializerOptions } from '@orpc/client/standard';
2
+ import { C as Context } from './server.DLt5njUb.js';
3
+ import { a as StandardHandlerOptions } from './server.DuTpqr2w.js';
4
+
5
+ interface StandardRPCHandlerOptions<T extends Context> extends StandardHandlerOptions<T>, StandardRPCJsonSerializerOptions {
6
+ }
7
+
8
+ export type { StandardRPCHandlerOptions as S };
@@ -0,0 +1,9 @@
1
+ function resolveFriendlyStandardHandleOptions(options) {
2
+ return {
3
+ ...options,
4
+ context: options?.context ?? {}
5
+ // Context only optional if all fields are optional
6
+ };
7
+ }
8
+
9
+ export { resolveFriendlyStandardHandleOptions as r };
@@ -0,0 +1,10 @@
1
+ import { C as Context } from './server.DLt5njUb.js';
2
+ import { S as StandardHandleOptions } from './server.DuTpqr2w.js';
3
+
4
+ type FriendlyStandardHandleOptions<T extends Context> = Omit<StandardHandleOptions<T>, 'context'> & (Record<never, never> extends T ? {
5
+ context?: T;
6
+ } : {
7
+ context: T;
8
+ });
9
+
10
+ export type { FriendlyStandardHandleOptions as F };
@@ -0,0 +1,66 @@
1
+ import { HTTPPath, ORPCError } from '@orpc/client';
2
+ import { Meta, InferSchemaOutput, AnySchema, ErrorFromErrorMap } from '@orpc/contract';
3
+ import { Interceptor, ThrowableError } from '@orpc/shared';
4
+ import { StandardResponse, StandardLazyRequest } from '@orpc/standard-server';
5
+ import { a as AnyRouter, A as AnyProcedure, C as Context, P as ProcedureClientInterceptorOptions, R as Router } from './server.DLt5njUb.mjs';
6
+
7
+ type StandardParams = Record<string, string>;
8
+ type StandardMatchResult = {
9
+ path: readonly string[];
10
+ procedure: AnyProcedure;
11
+ params?: StandardParams;
12
+ } | undefined;
13
+ interface StandardMatcher {
14
+ init(router: AnyRouter): void;
15
+ match(method: string, pathname: HTTPPath): Promise<StandardMatchResult>;
16
+ }
17
+ interface StandardCodec {
18
+ encode(output: unknown, procedure: AnyProcedure): StandardResponse;
19
+ encodeError(error: ORPCError<any, any>): StandardResponse;
20
+ decode(request: StandardLazyRequest, params: StandardParams | undefined, procedure: AnyProcedure): Promise<unknown>;
21
+ }
22
+
23
+ interface StandardHandleOptions<T extends Context> {
24
+ prefix?: HTTPPath;
25
+ context: T;
26
+ }
27
+ type StandardHandleResult = {
28
+ matched: true;
29
+ response: StandardResponse;
30
+ } | {
31
+ matched: false;
32
+ response: undefined;
33
+ };
34
+ interface StandardHandlerPlugin<TContext extends Context> {
35
+ init?(options: StandardHandlerOptions<TContext>): void;
36
+ }
37
+ interface StandardHandlerInterceptorOptions<T extends Context> extends StandardHandleOptions<T> {
38
+ request: StandardLazyRequest;
39
+ }
40
+ interface StandardHandlerOptions<TContext extends Context> {
41
+ plugins?: StandardHandlerPlugin<TContext>[];
42
+ /**
43
+ * Interceptors at the request level, helpful when you want catch errors
44
+ */
45
+ interceptors?: Interceptor<StandardHandlerInterceptorOptions<TContext>, StandardHandleResult, ThrowableError>[];
46
+ /**
47
+ * Interceptors at the root level, helpful when you want override the request/response
48
+ */
49
+ rootInterceptors?: Interceptor<StandardHandlerInterceptorOptions<TContext>, StandardHandleResult, ThrowableError>[];
50
+ /**
51
+ *
52
+ * Interceptors for procedure client.
53
+ */
54
+ clientInterceptors?: Interceptor<ProcedureClientInterceptorOptions<TContext, Record<never, never>, Meta>, InferSchemaOutput<AnySchema>, ErrorFromErrorMap<Record<never, never>>>[];
55
+ }
56
+ declare class StandardHandler<T extends Context> {
57
+ private readonly matcher;
58
+ private readonly codec;
59
+ private readonly interceptors;
60
+ private readonly clientInterceptors;
61
+ private readonly rootInterceptors;
62
+ constructor(router: Router<any, T>, matcher: StandardMatcher, codec: StandardCodec, options: NoInfer<StandardHandlerOptions<T>>);
63
+ handle(request: StandardLazyRequest, options: StandardHandleOptions<T>): Promise<StandardHandleResult>;
64
+ }
65
+
66
+ export { type StandardHandleOptions as S, type StandardHandlerOptions as a, type StandardCodec as b, type StandardParams as c, type StandardMatcher as d, type StandardMatchResult as e, type StandardHandleResult as f, type StandardHandlerPlugin as g, type StandardHandlerInterceptorOptions as h, StandardHandler as i };