@orpc/server 0.0.0-next.6acfc62 → 0.0.0-next.6affcc9

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 (39) hide show
  1. package/dist/chunk-L4ESXQX7.js +32 -0
  2. package/dist/{chunk-SUGWQSMQ.js → chunk-NXEANHUK.js} +68 -25
  3. package/dist/{chunk-OWMUECGT.js → chunk-XI6WGCB3.js} +20 -6
  4. package/dist/{chunk-NOA3GBJQ.js → chunk-XXBE6CYD.js} +18 -19
  5. package/dist/fetch.js +6 -14
  6. package/dist/hono.js +7 -15
  7. package/dist/index.js +15 -7
  8. package/dist/next.js +6 -14
  9. package/dist/node.js +7 -151
  10. package/dist/plugins.js +1 -1
  11. package/dist/src/adapters/fetch/index.d.ts +0 -1
  12. package/dist/src/adapters/fetch/rpc-handler.d.ts +3 -2
  13. package/dist/src/adapters/fetch/types.d.ts +3 -2
  14. package/dist/src/adapters/hono/middleware.d.ts +2 -3
  15. package/dist/src/adapters/next/serve.d.ts +2 -3
  16. package/dist/src/adapters/node/index.d.ts +0 -1
  17. package/dist/src/adapters/node/rpc-handler.d.ts +3 -2
  18. package/dist/src/adapters/node/types.d.ts +3 -2
  19. package/dist/src/adapters/standard/handler.d.ts +11 -7
  20. package/dist/src/adapters/standard/rpc-codec.d.ts +2 -1
  21. package/dist/src/adapters/standard/rpc-serializer.d.ts +7 -1
  22. package/dist/src/adapters/standard/types.d.ts +2 -26
  23. package/dist/src/context.d.ts +0 -1
  24. package/dist/src/implementer-procedure.d.ts +5 -4
  25. package/dist/src/index.d.ts +2 -1
  26. package/dist/src/middleware.d.ts +4 -4
  27. package/dist/src/plugins/base.d.ts +3 -1
  28. package/dist/src/plugins/cors.d.ts +2 -1
  29. package/dist/src/procedure-client.d.ts +19 -8
  30. package/dist/src/procedure-decorated.d.ts +5 -4
  31. package/dist/src/procedure-utils.d.ts +4 -3
  32. package/dist/src/procedure.d.ts +4 -3
  33. package/dist/src/router-client.d.ts +6 -17
  34. package/dist/src/router.d.ts +1 -0
  35. package/dist/standard.js +3 -3
  36. package/package.json +6 -4
  37. package/dist/chunk-JBPBLCBJ.js +0 -136
  38. package/dist/src/adapters/fetch/utils.d.ts +0 -6
  39. package/dist/src/adapters/node/utils.d.ts +0 -5
@@ -0,0 +1,32 @@
1
+ import {
2
+ RPCCodec,
3
+ RPCMatcher,
4
+ StandardHandler
5
+ } from "./chunk-NXEANHUK.js";
6
+
7
+ // src/adapters/fetch/rpc-handler.ts
8
+ import { toFetchResponse, toStandardRequest } from "@orpc/server-standard-fetch";
9
+ var RPCHandler = class {
10
+ standardHandler;
11
+ constructor(router, options) {
12
+ const matcher = options?.matcher ?? new RPCMatcher();
13
+ const codec = options?.codec ?? new RPCCodec();
14
+ this.standardHandler = new StandardHandler(router, matcher, codec, options);
15
+ }
16
+ async handle(request, ...rest) {
17
+ const standardRequest = toStandardRequest(request);
18
+ const result = await this.standardHandler.handle(standardRequest, ...rest);
19
+ if (!result.matched) {
20
+ return result;
21
+ }
22
+ return {
23
+ matched: true,
24
+ response: toFetchResponse(result.response)
25
+ };
26
+ }
27
+ };
28
+
29
+ export {
30
+ RPCHandler
31
+ };
32
+ //# sourceMappingURL=chunk-L4ESXQX7.js.map
@@ -6,13 +6,13 @@ import {
6
6
  getRouterChild,
7
7
  isProcedure,
8
8
  unlazy
9
- } from "./chunk-NOA3GBJQ.js";
9
+ } from "./chunk-XXBE6CYD.js";
10
10
  import {
11
11
  CompositePlugin
12
- } from "./chunk-OWMUECGT.js";
12
+ } from "./chunk-XI6WGCB3.js";
13
13
 
14
14
  // src/adapters/standard/handler.ts
15
- import { toORPCError } from "@orpc/contract";
15
+ import { ORPCError, toORPCError } from "@orpc/contract";
16
16
  import { intercept, trim } from "@orpc/shared";
17
17
  var StandardHandler = class {
18
18
  constructor(router, matcher, codec, options = {}) {
@@ -25,30 +25,39 @@ var StandardHandler = class {
25
25
  }
26
26
  plugin;
27
27
  handle(request, ...[options]) {
28
- const handleOptions = options ?? {};
29
- handleOptions.context ??= {};
30
28
  return intercept(
31
29
  this.options.interceptorsRoot ?? [],
32
- { request, ...handleOptions },
33
- async (interceptorRootOptions) => {
30
+ {
31
+ request,
32
+ ...options,
33
+ context: options?.context ?? {}
34
+ // context is optional only when all fields are optional so we can safely force it to have a context
35
+ },
36
+ async (interceptorOptions) => {
37
+ let isDecoding = false;
34
38
  try {
35
39
  return await intercept(
36
40
  this.options.interceptors ?? [],
37
- interceptorRootOptions,
38
- async ({ request: request2, context }) => {
39
- const method = request2.method;
40
- const url = request2.url;
41
- const pathname = `/${trim(url.pathname.replace(options?.prefix ?? "", ""), "/")}`;
41
+ interceptorOptions,
42
+ async (interceptorOptions2) => {
43
+ const method = interceptorOptions2.request.method;
44
+ const url = interceptorOptions2.request.url;
45
+ const pathname = `/${trim(url.pathname.replace(interceptorOptions2.prefix ?? "", ""), "/")}`;
42
46
  const match = await this.matcher.match(method, pathname);
43
47
  if (!match) {
44
48
  return { matched: false, response: void 0 };
45
49
  }
46
- const client = createProcedureClient(match.procedure, {
47
- context,
50
+ const clientOptions = {
51
+ context: interceptorOptions2.context,
48
52
  path: match.path
49
- });
50
- const input = await this.codec.decode(request2, match.params, match.procedure);
51
- const output = await client(input, { signal: request2.signal });
53
+ };
54
+ this.plugin.beforeCreateProcedureClient(clientOptions, interceptorOptions2);
55
+ const client = createProcedureClient(match.procedure, clientOptions);
56
+ isDecoding = true;
57
+ const input = await this.codec.decode(request, match.params, match.procedure);
58
+ isDecoding = false;
59
+ const lastEventId = Array.isArray(request.headers["last-event-id"]) ? request.headers["last-event-id"].at(-1) : request.headers["last-event-id"];
60
+ const output = await client(input, { signal: request.signal, lastEventId });
52
61
  const response = this.codec.encode(output, match.procedure);
53
62
  return {
54
63
  matched: true,
@@ -57,7 +66,10 @@ var StandardHandler = class {
57
66
  }
58
67
  );
59
68
  } catch (e) {
60
- const error = toORPCError(e);
69
+ const error = isDecoding ? new ORPCError("BAD_REQUEST", {
70
+ message: `Malformed request. Ensure the request body is properly formatted and the 'Content-Type' header is set correctly.`,
71
+ cause: e
72
+ }) : toORPCError(e);
61
73
  const response = this.codec.encodeError(error);
62
74
  return {
63
75
  matched: true,
@@ -70,11 +82,27 @@ var StandardHandler = class {
70
82
  };
71
83
 
72
84
  // src/adapters/standard/rpc-serializer.ts
73
- import { findDeepMatches, isPlainObject, set } from "@orpc/shared";
85
+ import { mapEventIterator, ORPCError as ORPCError2, toORPCError as toORPCError2 } from "@orpc/contract";
86
+ import { ErrorEvent, isAsyncIteratorObject } from "@orpc/server-standard";
87
+ import { findDeepMatches, isObject, set } from "@orpc/shared";
74
88
  var RPCSerializer = class {
75
89
  serialize(data) {
76
- if (data instanceof Blob) {
77
- return data;
90
+ if (isAsyncIteratorObject(data)) {
91
+ return mapEventIterator(data, {
92
+ value: async (value) => serializeRPCJson(value),
93
+ error: async (e) => {
94
+ if (e instanceof ErrorEvent) {
95
+ return new ErrorEvent({
96
+ data: serializeRPCJson(e.data),
97
+ cause: e
98
+ });
99
+ }
100
+ return new ErrorEvent({
101
+ data: serializeRPCJson(toORPCError2(e).toJSON()),
102
+ cause: e
103
+ });
104
+ }
105
+ });
78
106
  }
79
107
  const serializedJSON = serializeRPCJson(data);
80
108
  const { maps, values: blobs } = findDeepMatches((v) => v instanceof Blob, serializedJSON.json);
@@ -90,8 +118,23 @@ var RPCSerializer = class {
90
118
  return form;
91
119
  }
92
120
  deserialize(serialized) {
93
- if (serialized instanceof Blob) {
94
- return serialized;
121
+ if (isAsyncIteratorObject(serialized)) {
122
+ return mapEventIterator(serialized, {
123
+ value: async (value) => deserializeRPCJson(value),
124
+ error: async (e) => {
125
+ if (!(e instanceof ErrorEvent)) {
126
+ return e;
127
+ }
128
+ const deserialized = deserializeRPCJson(e.data);
129
+ if (ORPCError2.isValidJSON(deserialized)) {
130
+ return ORPCError2.fromJSON(deserialized, { cause: e });
131
+ }
132
+ return new ErrorEvent({
133
+ data: deserialized,
134
+ cause: e
135
+ });
136
+ }
137
+ });
95
138
  }
96
139
  if (!(serialized instanceof FormData)) {
97
140
  return deserializeRPCJson(serialized);
@@ -126,7 +169,7 @@ function serializeRPCJson(value, segments = [], meta = []) {
126
169
  meta.push(["url", segments]);
127
170
  return { json: value.toString(), meta };
128
171
  }
129
- if (isPlainObject(value)) {
172
+ if (isObject(value)) {
130
173
  const json = {};
131
174
  for (const k in value) {
132
175
  json[k] = serializeRPCJson(value[k], [...segments, k], meta).json;
@@ -305,4 +348,4 @@ export {
305
348
  RPCCodec,
306
349
  RPCMatcher
307
350
  };
308
- //# sourceMappingURL=chunk-SUGWQSMQ.js.map
351
+ //# sourceMappingURL=chunk-NXEANHUK.js.map
@@ -8,6 +8,11 @@ var CompositePlugin = class {
8
8
  plugin.init?.(options);
9
9
  }
10
10
  }
11
+ beforeCreateProcedureClient(clientOptions, interceptorOptions) {
12
+ for (const plugin of this.plugins) {
13
+ plugin.beforeCreateProcedureClient?.(clientOptions, interceptorOptions);
14
+ }
15
+ }
11
16
  };
12
17
 
13
18
  // src/plugins/cors.ts
@@ -16,7 +21,7 @@ var CORSPlugin = class {
16
21
  options;
17
22
  constructor(options) {
18
23
  const defaults = {
19
- origin: "*",
24
+ origin: (origin) => origin,
20
25
  allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"]
21
26
  };
22
27
  this.options = {
@@ -60,12 +65,21 @@ var CORSPlugin = class {
60
65
  const origin = Array.isArray(interceptorOptions.request.headers.origin) ? interceptorOptions.request.headers.origin.join(",") : interceptorOptions.request.headers.origin || "";
61
66
  const allowedOrigin = await value(this.options.origin, origin, interceptorOptions);
62
67
  const allowedOriginArr = Array.isArray(allowedOrigin) ? allowedOrigin : [allowedOrigin];
63
- if (allowedOriginArr.includes(origin) || allowedOriginArr.includes("*")) {
64
- result.response.headers["access-control-allow-origin"] = origin;
65
- }
66
- if (!allowedOriginArr.includes("*")) {
68
+ if (allowedOriginArr.includes("*")) {
69
+ result.response.headers["access-control-allow-origin"] = "*";
70
+ } else {
71
+ if (allowedOriginArr.includes(origin)) {
72
+ result.response.headers["access-control-allow-origin"] = origin;
73
+ }
67
74
  result.response.headers.vary = interceptorOptions.request.headers.vary ?? "origin";
68
75
  }
76
+ const allowedTimingOrigin = await value(this.options.timingOrigin, origin, interceptorOptions);
77
+ const allowedTimingOriginArr = Array.isArray(allowedTimingOrigin) ? allowedTimingOrigin : [allowedTimingOrigin];
78
+ if (allowedTimingOriginArr.includes("*")) {
79
+ result.response.headers["timing-allow-origin"] = "*";
80
+ } else if (allowedTimingOriginArr.includes(origin)) {
81
+ result.response.headers["timing-allow-origin"] = origin;
82
+ }
69
83
  if (this.options.credentials) {
70
84
  result.response.headers["access-control-allow-credentials"] = "true";
71
85
  }
@@ -108,4 +122,4 @@ export {
108
122
  CORSPlugin,
109
123
  ResponseHeadersPlugin
110
124
  };
111
- //# sourceMappingURL=chunk-OWMUECGT.js.map
125
+ //# sourceMappingURL=chunk-XI6WGCB3.js.map
@@ -63,30 +63,29 @@ function middlewareOutputFn(output) {
63
63
 
64
64
  // src/procedure-client.ts
65
65
  import { createORPCErrorConstructorMap, ORPCError, validateORPCError, ValidationError } from "@orpc/contract";
66
- import { executeWithHooks, toError, value } from "@orpc/shared";
66
+ import { intercept, toError, value } from "@orpc/shared";
67
67
  function createProcedureClient(lazyableProcedure, ...[options]) {
68
68
  return async (...[input, callerOptions]) => {
69
69
  const path = options?.path ?? [];
70
70
  const { default: procedure } = await unlazy(lazyableProcedure);
71
- const context = await value(options?.context ?? {}, callerOptions?.context);
71
+ const clientContext = callerOptions?.context ?? {};
72
+ const context = await value(options?.context ?? {}, clientContext);
72
73
  const errors = createORPCErrorConstructorMap(procedure["~orpc"].errorMap);
73
- const executeOptions = {
74
- input,
75
- context,
76
- errors,
77
- path,
78
- procedure,
79
- signal: callerOptions?.signal
80
- };
81
74
  try {
82
- const output = await executeWithHooks({
83
- hooks: options,
84
- input,
85
- context,
86
- meta: executeOptions,
87
- execute: () => executeProcedureInternal(procedure, executeOptions)
88
- });
89
- return output;
75
+ return await intercept(
76
+ options?.interceptors ?? [],
77
+ {
78
+ context,
79
+ input,
80
+ // input only optional when it undefinable so we can safely cast it
81
+ errors,
82
+ path,
83
+ procedure,
84
+ signal: callerOptions?.signal,
85
+ lastEventId: callerOptions?.lastEventId
86
+ },
87
+ (interceptorOptions) => executeProcedureInternal(interceptorOptions.procedure, interceptorOptions)
88
+ );
90
89
  } catch (e) {
91
90
  if (!(e instanceof ORPCError)) {
92
91
  throw toError(e);
@@ -377,4 +376,4 @@ export {
377
376
  convertPathToHttpPath,
378
377
  createContractedProcedure
379
378
  };
380
- //# sourceMappingURL=chunk-NOA3GBJQ.js.map
379
+ //# sourceMappingURL=chunk-XXBE6CYD.js.map
package/dist/fetch.js CHANGED
@@ -1,18 +1,10 @@
1
1
  import {
2
- RPCHandler,
3
- fetchReToStandardBody,
4
- fetchRequestToStandardRequest,
5
- standardBodyToFetchBody,
6
- standardResponseToFetchResponse
7
- } from "./chunk-JBPBLCBJ.js";
8
- import "./chunk-SUGWQSMQ.js";
9
- import "./chunk-NOA3GBJQ.js";
10
- import "./chunk-OWMUECGT.js";
2
+ RPCHandler
3
+ } from "./chunk-L4ESXQX7.js";
4
+ import "./chunk-NXEANHUK.js";
5
+ import "./chunk-XXBE6CYD.js";
6
+ import "./chunk-XI6WGCB3.js";
11
7
  export {
12
- RPCHandler,
13
- fetchReToStandardBody,
14
- fetchRequestToStandardRequest,
15
- standardBodyToFetchBody,
16
- standardResponseToFetchResponse
8
+ RPCHandler
17
9
  };
18
10
  //# sourceMappingURL=fetch.js.map
package/dist/hono.js CHANGED
@@ -1,13 +1,9 @@
1
1
  import {
2
- RPCHandler,
3
- fetchReToStandardBody,
4
- fetchRequestToStandardRequest,
5
- standardBodyToFetchBody,
6
- standardResponseToFetchResponse
7
- } from "./chunk-JBPBLCBJ.js";
8
- import "./chunk-SUGWQSMQ.js";
9
- import "./chunk-NOA3GBJQ.js";
10
- import "./chunk-OWMUECGT.js";
2
+ RPCHandler
3
+ } from "./chunk-L4ESXQX7.js";
4
+ import "./chunk-NXEANHUK.js";
5
+ import "./chunk-XXBE6CYD.js";
6
+ import "./chunk-XI6WGCB3.js";
11
7
 
12
8
  // src/adapters/hono/middleware.ts
13
9
  import { value } from "@orpc/shared";
@@ -26,17 +22,13 @@ function createMiddleware(handler, ...[options]) {
26
22
  const context = await value(options?.context ?? {}, c);
27
23
  const { matched, response } = await handler.handle(request, { ...options, context });
28
24
  if (matched) {
29
- return c.body(response.body, response);
25
+ return c.newResponse(response.body, response);
30
26
  }
31
27
  await next();
32
28
  };
33
29
  }
34
30
  export {
35
31
  RPCHandler,
36
- createMiddleware,
37
- fetchReToStandardBody,
38
- fetchRequestToStandardRequest,
39
- standardBodyToFetchBody,
40
- standardResponseToFetchResponse
32
+ createMiddleware
41
33
  };
42
34
  //# sourceMappingURL=hono.js.map
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  middlewareOutputFn,
22
22
  setRouterContract,
23
23
  unlazy
24
- } from "./chunk-NOA3GBJQ.js";
24
+ } from "./chunk-XXBE6CYD.js";
25
25
 
26
26
  // src/builder.ts
27
27
  import { mergeErrorMap as mergeErrorMap2, mergeMeta as mergeMeta2, mergePrefix, mergeRoute as mergeRoute2, mergeTags } from "@orpc/contract";
@@ -50,10 +50,14 @@ function decorateMiddleware(middleware) {
50
50
  decorated.concat = (concatMiddleware, mapInput) => {
51
51
  const mapped = mapInput ? decorateMiddleware(concatMiddleware).mapInput(mapInput) : concatMiddleware;
52
52
  const concatted = decorateMiddleware((options, input, output, ...rest) => {
53
- const next = async (...[nextOptions]) => {
54
- return mapped({ ...options, context: { ...nextOptions?.context, ...options.context } }, input, output, ...rest);
55
- };
56
- const merged = middleware({ ...options, next }, input, output, ...rest);
53
+ const merged = middleware({
54
+ ...options,
55
+ next: (...[nextOptions1]) => mapped({
56
+ ...options,
57
+ context: { ...options.context, ...nextOptions1?.context },
58
+ next: (...[nextOptions2]) => options.next({ context: { ...nextOptions1?.context, ...nextOptions2?.context } })
59
+ }, input, output, ...rest)
60
+ }, input, output, ...rest);
57
61
  return merged;
58
62
  });
59
63
  return concatted;
@@ -357,7 +361,8 @@ function createRouterClient(router, ...rest) {
357
361
  }
358
362
 
359
363
  // src/index.ts
360
- import { isDefinedError, ORPCError, safe, type, ValidationError } from "@orpc/contract";
364
+ import { eventIterator, isDefinedError, ORPCError, safe, type, ValidationError } from "@orpc/contract";
365
+ import { getEventMeta, withEventMeta } from "@orpc/server-standard";
361
366
  import { onError, onFinish, onStart, onSuccess } from "@orpc/shared";
362
367
  export {
363
368
  Builder,
@@ -378,8 +383,10 @@ export {
378
383
  deepSetLazyRouterPrefix,
379
384
  eachAllContractProcedure,
380
385
  eachContractProcedure,
386
+ eventIterator,
381
387
  fallbackConfig,
382
388
  flatLazy,
389
+ getEventMeta,
383
390
  getLazyRouterPrefix,
384
391
  getRouterChild,
385
392
  getRouterContract,
@@ -399,6 +406,7 @@ export {
399
406
  safe,
400
407
  setRouterContract,
401
408
  type,
402
- unlazy
409
+ unlazy,
410
+ withEventMeta
403
411
  };
404
412
  //# sourceMappingURL=index.js.map
package/dist/next.js CHANGED
@@ -1,13 +1,9 @@
1
1
  import {
2
- RPCHandler,
3
- fetchReToStandardBody,
4
- fetchRequestToStandardRequest,
5
- standardBodyToFetchBody,
6
- standardResponseToFetchResponse
7
- } from "./chunk-JBPBLCBJ.js";
8
- import "./chunk-SUGWQSMQ.js";
9
- import "./chunk-NOA3GBJQ.js";
10
- import "./chunk-OWMUECGT.js";
2
+ RPCHandler
3
+ } from "./chunk-L4ESXQX7.js";
4
+ import "./chunk-NXEANHUK.js";
5
+ import "./chunk-XXBE6CYD.js";
6
+ import "./chunk-XI6WGCB3.js";
11
7
 
12
8
  // src/adapters/next/serve.ts
13
9
  import { value } from "@orpc/shared";
@@ -30,10 +26,6 @@ function serve(handler, ...[options]) {
30
26
  }
31
27
  export {
32
28
  RPCHandler,
33
- fetchReToStandardBody,
34
- fetchRequestToStandardRequest,
35
- serve,
36
- standardBodyToFetchBody,
37
- standardResponseToFetchResponse
29
+ serve
38
30
  };
39
31
  //# sourceMappingURL=next.js.map
package/dist/node.js CHANGED
@@ -2,154 +2,12 @@ import {
2
2
  RPCCodec,
3
3
  RPCMatcher,
4
4
  StandardHandler
5
- } from "./chunk-SUGWQSMQ.js";
6
- import "./chunk-NOA3GBJQ.js";
7
- import "./chunk-OWMUECGT.js";
8
-
9
- // src/adapters/node/utils.ts
10
- import { Buffer, File } from "node:buffer";
11
- import { Readable } from "node:stream";
12
- import { once } from "@orpc/shared";
13
- import cd from "content-disposition";
14
- function nodeHttpToStandardRequest(req, res) {
15
- const method = req.method ?? "GET";
16
- const protocol = "encrypted" in req.socket && req.socket.encrypted ? "https:" : "http:";
17
- const host = req.headers.host ?? "localhost";
18
- const url = new URL(req.originalUrl ?? req.url ?? "/", `${protocol}//${host}`);
19
- return {
20
- raw: { request: req, response: res },
21
- method,
22
- url,
23
- headers: req.headers,
24
- body: once(() => {
25
- return nodeHttpRequestToStandardBody(req);
26
- }),
27
- get signal() {
28
- const signal = nodeHttpResponseToAbortSignal(res);
29
- Object.defineProperty(this, "signal", { value: signal, writable: true });
30
- return signal;
31
- },
32
- set signal(value) {
33
- Object.defineProperty(this, "signal", { value, writable: true });
34
- }
35
- };
36
- }
37
- function nodeHttpResponseSendStandardResponse(res, standardResponse) {
38
- return new Promise((resolve, reject) => {
39
- res.on("error", reject);
40
- res.on("finish", resolve);
41
- if (standardResponse.body === void 0) {
42
- res.writeHead(standardResponse.status, standardResponse.headers);
43
- res.end();
44
- return;
45
- }
46
- if (standardResponse.body instanceof Blob) {
47
- const resHeaders = {
48
- ...standardResponse.headers,
49
- "content-type": standardResponse.body.type,
50
- "content-length": standardResponse.body.size.toString()
51
- };
52
- if (!standardResponse.headers["content-disposition"] && standardResponse.body instanceof Blob) {
53
- resHeaders["content-disposition"] = cd(standardResponse.body instanceof File ? standardResponse.body.name : "blob");
54
- }
55
- res.writeHead(standardResponse.status, resHeaders);
56
- Readable.fromWeb(
57
- standardResponse.body.stream()
58
- // Conflict between types=node and lib=dom so we need to cast it
59
- ).pipe(res);
60
- return;
61
- }
62
- if (standardResponse.body instanceof FormData) {
63
- const response = new Response(standardResponse.body);
64
- res.writeHead(standardResponse.status, {
65
- ...standardResponse.headers,
66
- "content-type": response.headers.get("content-type")
67
- });
68
- Readable.fromWeb(
69
- response.body
70
- // Conflict between types=node and lib=dom so we need to cast it
71
- ).pipe(res);
72
- return;
73
- }
74
- if (standardResponse.body instanceof URLSearchParams) {
75
- res.writeHead(standardResponse.status, {
76
- ...standardResponse.headers,
77
- "content-type": "application/x-www-form-urlencoded"
78
- });
79
- const string2 = standardResponse.body.toString();
80
- res.end(string2);
81
- return;
82
- }
83
- res.writeHead(standardResponse.status, {
84
- ...standardResponse.headers,
85
- "content-type": "application/json"
86
- });
87
- const string = JSON.stringify(standardResponse.body);
88
- res.end(string);
89
- });
90
- }
91
- async function nodeHttpRequestToStandardBody(req) {
92
- const method = req.method ?? "GET";
93
- if (method === "GET" || method === "HEAD") {
94
- return void 0;
95
- }
96
- const contentDisposition = req.headers["content-disposition"];
97
- const fileName = contentDisposition ? cd.parse(contentDisposition).parameters.filename : void 0;
98
- const contentType = req.headers["content-type"];
99
- if (fileName) {
100
- return await streamToFile(req, fileName, contentType || "application/octet-stream");
101
- }
102
- if (!contentType || contentType.startsWith("application/json")) {
103
- const text = await streamToString(req);
104
- if (!text) {
105
- return void 0;
106
- }
107
- return JSON.parse(text);
108
- }
109
- if (contentType.startsWith("multipart/form-data")) {
110
- return await streamToFormData(req, contentType);
111
- }
112
- if (contentType.startsWith("application/x-www-form-urlencoded")) {
113
- const text = await streamToString(req);
114
- return new URLSearchParams(text);
115
- }
116
- if (contentType.startsWith("text/")) {
117
- return await streamToString(req);
118
- }
119
- return streamToFile(req, "blob", contentType);
120
- }
121
- function streamToFormData(stream, contentType) {
122
- const response = new Response(stream, {
123
- // Conflict between types=node and lib=dom so we need to cast it
124
- headers: {
125
- "content-type": contentType
126
- }
127
- });
128
- return response.formData();
129
- }
130
- async function streamToString(stream) {
131
- let string = "";
132
- for await (const chunk of stream) {
133
- string += chunk.toString();
134
- }
135
- return string;
136
- }
137
- async function streamToFile(stream, fileName, contentType) {
138
- const chunks = [];
139
- for await (const chunk of stream) {
140
- chunks.push(chunk);
141
- }
142
- return new File([Buffer.concat(chunks)], fileName, { type: contentType });
143
- }
144
- function nodeHttpResponseToAbortSignal(res) {
145
- const controller = new AbortController();
146
- res.on("close", () => {
147
- controller.abort();
148
- });
149
- return controller.signal;
150
- }
5
+ } from "./chunk-NXEANHUK.js";
6
+ import "./chunk-XXBE6CYD.js";
7
+ import "./chunk-XI6WGCB3.js";
151
8
 
152
9
  // src/adapters/node/rpc-handler.ts
10
+ import { sendStandardResponse, toStandardRequest } from "@orpc/server-standard-node";
153
11
  var RPCHandler = class {
154
12
  standardHandler;
155
13
  constructor(router, options) {
@@ -158,18 +16,16 @@ var RPCHandler = class {
158
16
  this.standardHandler = new StandardHandler(router, matcher, codec, options);
159
17
  }
160
18
  async handle(req, res, ...rest) {
161
- const standardRequest = nodeHttpToStandardRequest(req, res);
19
+ const standardRequest = toStandardRequest(req, res);
162
20
  const result = await this.standardHandler.handle(standardRequest, ...rest);
163
21
  if (!result.matched) {
164
22
  return { matched: false };
165
23
  }
166
- await nodeHttpResponseSendStandardResponse(res, result.response);
24
+ await sendStandardResponse(res, result.response);
167
25
  return { matched: true };
168
26
  }
169
27
  };
170
28
  export {
171
- RPCHandler,
172
- nodeHttpResponseSendStandardResponse,
173
- nodeHttpToStandardRequest
29
+ RPCHandler
174
30
  };
175
31
  //# sourceMappingURL=node.js.map
package/dist/plugins.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  CORSPlugin,
3
3
  CompositePlugin,
4
4
  ResponseHeadersPlugin
5
- } from "./chunk-OWMUECGT.js";
5
+ } from "./chunk-XI6WGCB3.js";
6
6
  export {
7
7
  CORSPlugin,
8
8
  CompositePlugin,
@@ -1,4 +1,3 @@
1
1
  export * from './rpc-handler';
2
2
  export * from './types';
3
- export * from './utils';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,10 +1,11 @@
1
+ import type { MaybeOptionalOptions } from '@orpc/shared';
1
2
  import type { Context } from '../../context';
2
3
  import type { Router } from '../../router';
3
- import type { RPCHandlerOptions, StandardHandleRest } from '../standard';
4
+ import type { RPCHandlerOptions, StandardHandleOptions } from '../standard';
4
5
  import type { FetchHandler, FetchHandleResult } from './types';
5
6
  export declare class RPCHandler<T extends Context> implements FetchHandler<T> {
6
7
  private readonly standardHandler;
7
8
  constructor(router: Router<T, any>, options?: NoInfer<RPCHandlerOptions<T>>);
8
- handle(request: Request, ...rest: StandardHandleRest<T>): Promise<FetchHandleResult>;
9
+ handle(request: Request, ...rest: MaybeOptionalOptions<StandardHandleOptions<T>>): Promise<FetchHandleResult>;
9
10
  }
10
11
  //# sourceMappingURL=rpc-handler.d.ts.map
@@ -1,5 +1,6 @@
1
+ import type { MaybeOptionalOptions } from '@orpc/shared';
1
2
  import type { Context } from '../../context';
2
- import type { StandardHandleRest } from '../standard';
3
+ import type { StandardHandleOptions } from '../standard';
3
4
  export type FetchHandleResult = {
4
5
  matched: true;
5
6
  response: Response;
@@ -8,6 +9,6 @@ export type FetchHandleResult = {
8
9
  response: undefined;
9
10
  };
10
11
  export interface FetchHandler<T extends Context> {
11
- handle(request: Request, ...rest: StandardHandleRest<T>): Promise<FetchHandleResult>;
12
+ handle(request: Request, ...rest: MaybeOptionalOptions<StandardHandleOptions<T>>): Promise<FetchHandleResult>;
12
13
  }
13
14
  //# sourceMappingURL=types.d.ts.map