@orpc/server 0.0.0-next.a3c9e47 → 0.0.0-next.a419c18

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 (79) hide show
  1. package/README.md +130 -0
  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/adapters/hono/index.mjs +32 -0
  8. package/dist/adapters/next/index.d.mts +29 -0
  9. package/dist/adapters/next/index.d.ts +29 -0
  10. package/dist/adapters/next/index.mjs +29 -0
  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 +5 -0
  17. package/dist/index.d.mts +277 -0
  18. package/dist/index.d.ts +277 -0
  19. package/dist/index.mjs +342 -0
  20. package/dist/plugins/index.d.mts +30 -0
  21. package/dist/plugins/index.d.ts +30 -0
  22. package/dist/plugins/index.mjs +107 -0
  23. package/dist/shared/server.23VRZIfj.d.ts +66 -0
  24. package/dist/shared/server.B4eSvRkD.mjs +98 -0
  25. package/dist/shared/server.BG5ftPWa.d.ts +10 -0
  26. package/dist/shared/server.BVwwTHyO.mjs +9 -0
  27. package/dist/shared/server.BtxZnWJ9.mjs +374 -0
  28. package/dist/shared/server.C-CCcROC.d.mts +10 -0
  29. package/dist/shared/server.CIbpOMZX.d.mts +8 -0
  30. package/dist/shared/server.DCcCuA52.d.ts +8 -0
  31. package/dist/shared/server.DJqfB27m.d.mts +66 -0
  32. package/dist/shared/server.DnR6v9pj.mjs +160 -0
  33. package/dist/shared/server.MZvbGc3n.d.mts +143 -0
  34. package/dist/shared/server.MZvbGc3n.d.ts +143 -0
  35. package/package.json +36 -24
  36. package/dist/chunk-2HRHHZJD.js +0 -301
  37. package/dist/chunk-SA7HGGVY.js +0 -242
  38. package/dist/chunk-WUOGVGWG.js +0 -1
  39. package/dist/fetch.js +0 -15
  40. package/dist/hono.js +0 -30
  41. package/dist/index.js +0 -591
  42. package/dist/next.js +0 -36
  43. package/dist/node.js +0 -87
  44. package/dist/src/adapters/fetch/index.d.ts +0 -6
  45. package/dist/src/adapters/fetch/orpc-handler.d.ts +0 -20
  46. package/dist/src/adapters/fetch/orpc-payload-codec.d.ts +0 -16
  47. package/dist/src/adapters/fetch/orpc-procedure-matcher.d.ts +0 -12
  48. package/dist/src/adapters/fetch/super-json.d.ts +0 -12
  49. package/dist/src/adapters/fetch/types.d.ts +0 -21
  50. package/dist/src/adapters/hono/index.d.ts +0 -3
  51. package/dist/src/adapters/hono/middleware.d.ts +0 -12
  52. package/dist/src/adapters/next/index.d.ts +0 -3
  53. package/dist/src/adapters/next/serve.d.ts +0 -19
  54. package/dist/src/adapters/node/index.d.ts +0 -5
  55. package/dist/src/adapters/node/orpc-handler.d.ts +0 -12
  56. package/dist/src/adapters/node/request-listener.d.ts +0 -28
  57. package/dist/src/adapters/node/types.d.ts +0 -22
  58. package/dist/src/builder.d.ts +0 -38
  59. package/dist/src/error.d.ts +0 -10
  60. package/dist/src/hidden.d.ts +0 -6
  61. package/dist/src/implementer-chainable.d.ts +0 -10
  62. package/dist/src/index.d.ts +0 -25
  63. package/dist/src/lazy-decorated.d.ts +0 -7
  64. package/dist/src/lazy-utils.d.ts +0 -4
  65. package/dist/src/lazy.d.ts +0 -18
  66. package/dist/src/middleware-decorated.d.ts +0 -9
  67. package/dist/src/middleware.d.ts +0 -36
  68. package/dist/src/procedure-builder.d.ts +0 -24
  69. package/dist/src/procedure-client.d.ts +0 -22
  70. package/dist/src/procedure-decorated.d.ts +0 -27
  71. package/dist/src/procedure-implementer.d.ts +0 -20
  72. package/dist/src/procedure-utils.d.ts +0 -17
  73. package/dist/src/procedure.d.ts +0 -44
  74. package/dist/src/router-builder.d.ts +0 -31
  75. package/dist/src/router-client.d.ts +0 -26
  76. package/dist/src/router-implementer.d.ts +0 -21
  77. package/dist/src/router.d.ts +0 -16
  78. package/dist/src/types.d.ts +0 -14
  79. package/dist/src/utils.d.ts +0 -3
@@ -0,0 +1,30 @@
1
+ import { b as StandardHandlerInterceptorOptions, c as StandardHandlerPlugin, a as StandardHandlerOptions } from '../shared/server.DJqfB27m.mjs';
2
+ import { Value } from '@orpc/shared';
3
+ import { C as Context } from '../shared/server.MZvbGc3n.mjs';
4
+ import '@orpc/contract';
5
+ import '@orpc/standard-server';
6
+ import '@orpc/client';
7
+
8
+ interface CORSOptions<T extends Context> {
9
+ origin?: Value<string | readonly string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<T>]>;
10
+ timingOrigin?: Value<string | readonly string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<T>]>;
11
+ allowMethods?: readonly string[];
12
+ allowHeaders?: readonly string[];
13
+ maxAge?: number;
14
+ credentials?: boolean;
15
+ exposeHeaders?: readonly string[];
16
+ }
17
+ declare class CORSPlugin<T extends Context> implements StandardHandlerPlugin<T> {
18
+ private readonly options;
19
+ constructor(options?: CORSOptions<T>);
20
+ init(options: StandardHandlerOptions<T>): void;
21
+ }
22
+
23
+ interface ResponseHeadersPluginContext {
24
+ resHeaders?: Headers;
25
+ }
26
+ declare class ResponseHeadersPlugin<T extends ResponseHeadersPluginContext> implements StandardHandlerPlugin<T> {
27
+ init(options: StandardHandlerOptions<T>): void;
28
+ }
29
+
30
+ export { type CORSOptions, CORSPlugin, ResponseHeadersPlugin, type ResponseHeadersPluginContext };
@@ -0,0 +1,30 @@
1
+ import { b as StandardHandlerInterceptorOptions, c as StandardHandlerPlugin, a as StandardHandlerOptions } from '../shared/server.23VRZIfj.js';
2
+ import { Value } from '@orpc/shared';
3
+ import { C as Context } from '../shared/server.MZvbGc3n.js';
4
+ import '@orpc/contract';
5
+ import '@orpc/standard-server';
6
+ import '@orpc/client';
7
+
8
+ interface CORSOptions<T extends Context> {
9
+ origin?: Value<string | readonly string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<T>]>;
10
+ timingOrigin?: Value<string | readonly string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<T>]>;
11
+ allowMethods?: readonly string[];
12
+ allowHeaders?: readonly string[];
13
+ maxAge?: number;
14
+ credentials?: boolean;
15
+ exposeHeaders?: readonly string[];
16
+ }
17
+ declare class CORSPlugin<T extends Context> implements StandardHandlerPlugin<T> {
18
+ private readonly options;
19
+ constructor(options?: CORSOptions<T>);
20
+ init(options: StandardHandlerOptions<T>): void;
21
+ }
22
+
23
+ interface ResponseHeadersPluginContext {
24
+ resHeaders?: Headers;
25
+ }
26
+ declare class ResponseHeadersPlugin<T extends ResponseHeadersPluginContext> implements StandardHandlerPlugin<T> {
27
+ init(options: StandardHandlerOptions<T>): void;
28
+ }
29
+
30
+ export { type CORSOptions, CORSPlugin, ResponseHeadersPlugin, type ResponseHeadersPluginContext };
@@ -0,0 +1,107 @@
1
+ import { value } from '@orpc/shared';
2
+
3
+ class CORSPlugin {
4
+ options;
5
+ constructor(options = {}) {
6
+ const defaults = {
7
+ origin: (origin) => origin,
8
+ allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"]
9
+ };
10
+ this.options = {
11
+ ...defaults,
12
+ ...options
13
+ };
14
+ }
15
+ init(options) {
16
+ options.rootInterceptors ??= [];
17
+ options.rootInterceptors.unshift(async (interceptorOptions) => {
18
+ if (interceptorOptions.request.method === "OPTIONS") {
19
+ const resHeaders = {};
20
+ if (this.options.maxAge !== void 0) {
21
+ resHeaders["access-control-max-age"] = this.options.maxAge.toString();
22
+ }
23
+ if (this.options.allowMethods?.length) {
24
+ resHeaders["access-control-allow-methods"] = this.options.allowMethods.join(",");
25
+ }
26
+ const allowHeaders = this.options.allowHeaders ?? interceptorOptions.request.headers["access-control-request-headers"];
27
+ if (Array.isArray(allowHeaders) && allowHeaders.length) {
28
+ resHeaders["access-control-allow-headers"] = allowHeaders.join(",");
29
+ } else if (typeof allowHeaders === "string") {
30
+ resHeaders["access-control-allow-headers"] = allowHeaders;
31
+ }
32
+ return {
33
+ matched: true,
34
+ response: {
35
+ status: 204,
36
+ headers: resHeaders,
37
+ body: void 0
38
+ }
39
+ };
40
+ }
41
+ return interceptorOptions.next();
42
+ });
43
+ options.rootInterceptors.unshift(async (interceptorOptions) => {
44
+ const result = await interceptorOptions.next();
45
+ if (!result.matched) {
46
+ return result;
47
+ }
48
+ const origin = Array.isArray(interceptorOptions.request.headers.origin) ? interceptorOptions.request.headers.origin.join(",") : interceptorOptions.request.headers.origin || "";
49
+ const allowedOrigin = await value(this.options.origin, origin, interceptorOptions);
50
+ const allowedOriginArr = Array.isArray(allowedOrigin) ? allowedOrigin : [allowedOrigin];
51
+ if (allowedOriginArr.includes("*")) {
52
+ result.response.headers["access-control-allow-origin"] = "*";
53
+ } else {
54
+ if (allowedOriginArr.includes(origin)) {
55
+ result.response.headers["access-control-allow-origin"] = origin;
56
+ }
57
+ result.response.headers.vary = interceptorOptions.request.headers.vary ?? "origin";
58
+ }
59
+ const allowedTimingOrigin = await value(this.options.timingOrigin, origin, interceptorOptions);
60
+ const allowedTimingOriginArr = Array.isArray(allowedTimingOrigin) ? allowedTimingOrigin : [allowedTimingOrigin];
61
+ if (allowedTimingOriginArr.includes("*")) {
62
+ result.response.headers["timing-allow-origin"] = "*";
63
+ } else if (allowedTimingOriginArr.includes(origin)) {
64
+ result.response.headers["timing-allow-origin"] = origin;
65
+ }
66
+ if (this.options.credentials) {
67
+ result.response.headers["access-control-allow-credentials"] = "true";
68
+ }
69
+ if (this.options.exposeHeaders?.length) {
70
+ result.response.headers["access-control-expose-headers"] = this.options.exposeHeaders.join(",");
71
+ }
72
+ return result;
73
+ });
74
+ }
75
+ }
76
+
77
+ class ResponseHeadersPlugin {
78
+ init(options) {
79
+ options.rootInterceptors ??= [];
80
+ options.rootInterceptors.push(async (interceptorOptions) => {
81
+ const resHeaders = interceptorOptions.context.resHeaders ?? new Headers();
82
+ const result = await interceptorOptions.next({
83
+ ...interceptorOptions,
84
+ context: {
85
+ ...interceptorOptions.context,
86
+ resHeaders
87
+ }
88
+ });
89
+ if (!result.matched) {
90
+ return result;
91
+ }
92
+ const responseHeaders = result.response.headers;
93
+ for (const [key, value] of resHeaders) {
94
+ if (Array.isArray(responseHeaders[key])) {
95
+ responseHeaders[key].push(value);
96
+ } else if (responseHeaders[key] !== void 0) {
97
+ responseHeaders[key] = [responseHeaders[key], value];
98
+ } else {
99
+ responseHeaders[key] = value;
100
+ }
101
+ }
102
+ return result;
103
+ });
104
+ }
105
+ }
106
+
107
+ export { CORSPlugin, ResponseHeadersPlugin };
@@ -0,0 +1,66 @@
1
+ import { HTTPPath, AnySchema, Meta, InferSchemaOutput, ErrorFromErrorMap } from '@orpc/contract';
2
+ import { Interceptor } from '@orpc/shared';
3
+ import { StandardResponse, StandardLazyRequest } from '@orpc/standard-server';
4
+ import { a as AnyRouter, A as AnyProcedure, C as Context, P as ProcedureClientInterceptorOptions, R as Router } from './server.MZvbGc3n.js';
5
+ import { ORPCError } from '@orpc/client';
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, unknown>[];
46
+ /**
47
+ * Interceptors at the root level, helpful when you want override the request/response
48
+ */
49
+ rootInterceptors?: Interceptor<StandardHandlerInterceptorOptions<TContext>, StandardHandleResult, unknown>[];
50
+ /**
51
+ *
52
+ * Interceptors for procedure client.
53
+ */
54
+ clientInterceptors?: Interceptor<ProcedureClientInterceptorOptions<TContext, AnySchema, 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 StandardHandlerInterceptorOptions as b, type StandardHandlerPlugin as c, type StandardCodec as d, type StandardParams as e, type StandardMatcher as f, type StandardMatchResult as g, type StandardHandleResult as h, StandardHandler as i };
@@ -0,0 +1,98 @@
1
+ import { ORPCError } from '@orpc/client';
2
+ import { StandardRPCJsonSerializer, StandardRPCSerializer } from '@orpc/client/standard';
3
+ import { S as StandardHandler, b as StandardRPCMatcher, a as StandardRPCCodec } from './server.DnR6v9pj.mjs';
4
+ import { toArray, intercept, resolveMaybeOptionalOptions } from '@orpc/shared';
5
+ import { toStandardLazyRequest, toFetchResponse } from '@orpc/standard-server-fetch';
6
+ import { r as resolveFriendlyStandardHandleOptions } from './server.BVwwTHyO.mjs';
7
+
8
+ class BodyLimitPlugin {
9
+ maxBodySize;
10
+ constructor(options) {
11
+ this.maxBodySize = options.maxBodySize;
12
+ }
13
+ initRuntimeAdapter(options) {
14
+ options.adapterInterceptors ??= [];
15
+ options.adapterInterceptors.push(async (options2) => {
16
+ if (!options2.request.body) {
17
+ return options2.next();
18
+ }
19
+ let currentBodySize = 0;
20
+ const rawReader = options2.request.body.getReader();
21
+ const reader = new ReadableStream({
22
+ start: async (controller) => {
23
+ try {
24
+ if (Number(options2.request.headers.get("content-length")) > this.maxBodySize) {
25
+ controller.error(new ORPCError("PAYLOAD_TOO_LARGE"));
26
+ return;
27
+ }
28
+ while (true) {
29
+ const { done, value } = await rawReader.read();
30
+ if (done) {
31
+ break;
32
+ }
33
+ currentBodySize += value.length;
34
+ if (currentBodySize > this.maxBodySize) {
35
+ controller.error(new ORPCError("PAYLOAD_TOO_LARGE"));
36
+ break;
37
+ }
38
+ controller.enqueue(value);
39
+ }
40
+ } finally {
41
+ controller.close();
42
+ }
43
+ }
44
+ });
45
+ const requestInit = { body: reader, duplex: "half" };
46
+ return options2.next({
47
+ ...options2,
48
+ request: new Request(options2.request, requestInit)
49
+ });
50
+ });
51
+ }
52
+ }
53
+
54
+ class FetchHandler {
55
+ constructor(standardHandler, options = {}) {
56
+ this.standardHandler = standardHandler;
57
+ for (const plugin of toArray(options.plugins)) {
58
+ plugin.initRuntimeAdapter?.(options);
59
+ }
60
+ this.adapterInterceptors = toArray(options.adapterInterceptors);
61
+ this.toFetchResponseOptions = options;
62
+ }
63
+ toFetchResponseOptions;
64
+ adapterInterceptors;
65
+ async handle(request, ...rest) {
66
+ return intercept(
67
+ this.adapterInterceptors,
68
+ {
69
+ ...resolveFriendlyStandardHandleOptions(resolveMaybeOptionalOptions(rest)),
70
+ request,
71
+ toFetchResponseOptions: this.toFetchResponseOptions
72
+ },
73
+ async ({ request: request2, toFetchResponseOptions, ...options }) => {
74
+ const standardRequest = toStandardLazyRequest(request2);
75
+ const result = await this.standardHandler.handle(standardRequest, options);
76
+ if (!result.matched) {
77
+ return result;
78
+ }
79
+ return {
80
+ matched: true,
81
+ response: toFetchResponse(result.response, toFetchResponseOptions)
82
+ };
83
+ }
84
+ );
85
+ }
86
+ }
87
+
88
+ class RPCHandler extends FetchHandler {
89
+ constructor(router, options = {}) {
90
+ const jsonSerializer = new StandardRPCJsonSerializer(options);
91
+ const serializer = new StandardRPCSerializer(jsonSerializer);
92
+ const matcher = new StandardRPCMatcher();
93
+ const codec = new StandardRPCCodec(serializer);
94
+ super(new StandardHandler(router, matcher, codec, options), options);
95
+ }
96
+ }
97
+
98
+ export { BodyLimitPlugin as B, FetchHandler as F, RPCHandler as R };
@@ -0,0 +1,10 @@
1
+ import { C as Context } from './server.MZvbGc3n.js';
2
+ import { S as StandardHandleOptions } from './server.23VRZIfj.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,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 };