@orpc/client 0.0.0-next.b5ac9a3 → 0.0.0-next.b5e327f

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 (33) hide show
  1. package/README.md +28 -22
  2. package/dist/adapters/fetch/index.d.mts +31 -15
  3. package/dist/adapters/fetch/index.d.ts +31 -15
  4. package/dist/adapters/fetch/index.mjs +26 -18
  5. package/dist/adapters/message-port/index.d.mts +59 -0
  6. package/dist/adapters/message-port/index.d.ts +59 -0
  7. package/dist/adapters/message-port/index.mjs +71 -0
  8. package/dist/adapters/standard/index.d.mts +8 -103
  9. package/dist/adapters/standard/index.d.ts +8 -103
  10. package/dist/adapters/standard/index.mjs +2 -3
  11. package/dist/adapters/websocket/index.d.mts +29 -0
  12. package/dist/adapters/websocket/index.d.ts +29 -0
  13. package/dist/adapters/websocket/index.mjs +45 -0
  14. package/dist/index.d.mts +62 -27
  15. package/dist/index.d.ts +62 -27
  16. package/dist/index.mjs +55 -36
  17. package/dist/plugins/index.d.mts +165 -25
  18. package/dist/plugins/index.d.ts +165 -25
  19. package/dist/plugins/index.mjs +326 -53
  20. package/dist/shared/client.BG98rYdO.d.ts +45 -0
  21. package/dist/shared/client.BOYsZIRq.d.mts +29 -0
  22. package/dist/shared/client.BOYsZIRq.d.ts +29 -0
  23. package/dist/shared/client.Bwgm6dgk.d.mts +45 -0
  24. package/dist/shared/client.C176log5.d.ts +91 -0
  25. package/dist/shared/{client.Be-O_tdu.mjs → client.DKmRtVO2.mjs} +97 -38
  26. package/dist/shared/client.Ycwr4Tuo.d.mts +91 -0
  27. package/dist/shared/{client.BacCdg3F.mjs → client.txdq_i5V.mjs} +58 -50
  28. package/package.json +16 -5
  29. package/dist/shared/client.CupM8eRP.d.mts +0 -30
  30. package/dist/shared/client.CupM8eRP.d.ts +0 -30
  31. package/dist/shared/client.CvnV7_uV.mjs +0 -12
  32. package/dist/shared/client.DrOAzyMB.d.mts +0 -45
  33. package/dist/shared/client.aGal-uGY.d.ts +0 -45
@@ -0,0 +1,91 @@
1
+ import { b as ClientContext, c as ClientOptions, f as HTTPMethod } from './client.BOYsZIRq.js';
2
+ import { e as StandardLinkCodec, b as StandardLinkOptions, d as StandardLink, f as StandardLinkClient } from './client.BG98rYdO.js';
3
+ import { Segment, Value, Promisable } from '@orpc/shared';
4
+ import { StandardHeaders, StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
5
+
6
+ declare const STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES: {
7
+ readonly BIGINT: 0;
8
+ readonly DATE: 1;
9
+ readonly NAN: 2;
10
+ readonly UNDEFINED: 3;
11
+ readonly URL: 4;
12
+ readonly REGEXP: 5;
13
+ readonly SET: 6;
14
+ readonly MAP: 7;
15
+ };
16
+ type StandardRPCJsonSerializedMetaItem = readonly [type: number, ...path: Segment[]];
17
+ type StandardRPCJsonSerialized = [json: unknown, meta: StandardRPCJsonSerializedMetaItem[], maps: Segment[][], blobs: Blob[]];
18
+ interface StandardRPCCustomJsonSerializer {
19
+ type: number;
20
+ condition(data: unknown): boolean;
21
+ serialize(data: any): unknown;
22
+ deserialize(serialized: any): unknown;
23
+ }
24
+ interface StandardRPCJsonSerializerOptions {
25
+ customJsonSerializers?: readonly StandardRPCCustomJsonSerializer[];
26
+ }
27
+ declare class StandardRPCJsonSerializer {
28
+ private readonly customSerializers;
29
+ constructor(options?: StandardRPCJsonSerializerOptions);
30
+ serialize(data: unknown, segments?: Segment[], meta?: StandardRPCJsonSerializedMetaItem[], maps?: Segment[][], blobs?: Blob[]): StandardRPCJsonSerialized;
31
+ deserialize(json: unknown, meta: readonly StandardRPCJsonSerializedMetaItem[]): unknown;
32
+ deserialize(json: unknown, meta: readonly StandardRPCJsonSerializedMetaItem[], maps: readonly Segment[][], getBlob: (index: number) => Blob): unknown;
33
+ }
34
+
35
+ declare class StandardRPCSerializer {
36
+ #private;
37
+ private readonly jsonSerializer;
38
+ constructor(jsonSerializer: StandardRPCJsonSerializer);
39
+ serialize(data: unknown): object;
40
+ deserialize(data: unknown): unknown;
41
+ }
42
+
43
+ interface StandardRPCLinkCodecOptions<T extends ClientContext> {
44
+ /**
45
+ * Base url for all requests.
46
+ */
47
+ url: Value<Promisable<string | URL>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
48
+ /**
49
+ * The maximum length of the URL.
50
+ *
51
+ * @default 2083
52
+ */
53
+ maxUrlLength?: Value<Promisable<number>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
54
+ /**
55
+ * The method used to make the request.
56
+ *
57
+ * @default 'POST'
58
+ */
59
+ method?: Value<Promisable<Exclude<HTTPMethod, 'HEAD'>>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
60
+ /**
61
+ * The method to use when the payload cannot safely pass to the server with method return from method function.
62
+ * GET is not allowed, it's very dangerous.
63
+ *
64
+ * @default 'POST'
65
+ */
66
+ fallbackMethod?: Exclude<HTTPMethod, 'HEAD' | 'GET'>;
67
+ /**
68
+ * Inject headers to the request.
69
+ */
70
+ headers?: Value<Promisable<StandardHeaders>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
71
+ }
72
+ declare class StandardRPCLinkCodec<T extends ClientContext> implements StandardLinkCodec<T> {
73
+ private readonly serializer;
74
+ private readonly baseUrl;
75
+ private readonly maxUrlLength;
76
+ private readonly fallbackMethod;
77
+ private readonly expectedMethod;
78
+ private readonly headers;
79
+ constructor(serializer: StandardRPCSerializer, options: StandardRPCLinkCodecOptions<T>);
80
+ encode(path: readonly string[], input: unknown, options: ClientOptions<T>): Promise<StandardRequest>;
81
+ decode(response: StandardLazyResponse): Promise<unknown>;
82
+ }
83
+
84
+ interface StandardRPCLinkOptions<T extends ClientContext> extends StandardLinkOptions<T>, StandardRPCLinkCodecOptions<T>, StandardRPCJsonSerializerOptions {
85
+ }
86
+ declare class StandardRPCLink<T extends ClientContext> extends StandardLink<T> {
87
+ constructor(linkClient: StandardLinkClient<T>, options: StandardRPCLinkOptions<T>);
88
+ }
89
+
90
+ export { STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES as S, StandardRPCJsonSerializer as e, StandardRPCLink as g, StandardRPCLinkCodec as i, StandardRPCSerializer as j };
91
+ export type { StandardRPCJsonSerializedMetaItem as a, StandardRPCJsonSerialized as b, StandardRPCCustomJsonSerializer as c, StandardRPCJsonSerializerOptions as d, StandardRPCLinkOptions as f, StandardRPCLinkCodecOptions as h };
@@ -1,36 +1,77 @@
1
- import { intercept, isObject, value, trim, isAsyncIteratorObject, stringifyJSON } from '@orpc/shared';
2
- import { C as CompositeClientPlugin } from './client.CvnV7_uV.mjs';
3
- import { ErrorEvent } from '@orpc/standard-server';
4
- import { O as ORPCError, m as mapEventIterator, t as toORPCError } from './client.BacCdg3F.mjs';
1
+ import { toArray, runWithSpan, ORPC_NAME, isAsyncIteratorObject, asyncIteratorWithSpan, intercept, getGlobalOtelConfig, isObject, value, stringifyJSON } from '@orpc/shared';
2
+ import { mergeStandardHeaders, ErrorEvent } from '@orpc/standard-server';
3
+ import { C as COMMON_ORPC_ERROR_DEFS, b as isORPCErrorStatus, c as isORPCErrorJson, d as createORPCErrorFromJson, O as ORPCError, m as mapEventIterator, t as toORPCError } from './client.txdq_i5V.mjs';
5
4
 
6
- class InvalidEventIteratorRetryResponse extends Error {
5
+ class CompositeStandardLinkPlugin {
6
+ plugins;
7
+ constructor(plugins = []) {
8
+ this.plugins = [...plugins].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
9
+ }
10
+ init(options) {
11
+ for (const plugin of this.plugins) {
12
+ plugin.init?.(options);
13
+ }
14
+ }
7
15
  }
16
+
8
17
  class StandardLink {
9
18
  constructor(codec, sender, options = {}) {
10
19
  this.codec = codec;
11
20
  this.sender = sender;
12
- const plugin = new CompositeClientPlugin(options.plugins);
21
+ const plugin = new CompositeStandardLinkPlugin(options.plugins);
13
22
  plugin.init(options);
14
- this.interceptors = options.interceptors ?? [];
15
- this.clientInterceptors = options.clientInterceptors ?? [];
23
+ this.interceptors = toArray(options.interceptors);
24
+ this.clientInterceptors = toArray(options.clientInterceptors);
16
25
  }
17
26
  interceptors;
18
27
  clientInterceptors;
19
28
  call(path, input, options) {
20
- return intercept(this.interceptors, { path, input, options }, async ({ path: path2, input: input2, options: options2 }) => {
21
- const output = await this.#call(path2, input2, options2);
22
- return output;
23
- });
24
- }
25
- async #call(path, input, options) {
26
- const request = await this.codec.encode(path, input, options);
27
- const response = await intercept(
28
- this.clientInterceptors,
29
- { request },
30
- ({ request: request2 }) => this.sender.call(request2, options, path, input)
29
+ return runWithSpan(
30
+ { name: `${ORPC_NAME}.${path.join("/")}`, signal: options.signal },
31
+ (span) => {
32
+ span?.setAttribute("rpc.system", ORPC_NAME);
33
+ span?.setAttribute("rpc.method", path.join("."));
34
+ if (isAsyncIteratorObject(input)) {
35
+ input = asyncIteratorWithSpan(
36
+ { name: "consume_event_iterator_input", signal: options.signal },
37
+ input
38
+ );
39
+ }
40
+ return intercept(this.interceptors, { ...options, path, input }, async ({ path: path2, input: input2, ...options2 }) => {
41
+ const otelConfig = getGlobalOtelConfig();
42
+ let otelContext;
43
+ const currentSpan = otelConfig?.trace.getActiveSpan() ?? span;
44
+ if (currentSpan && otelConfig) {
45
+ otelContext = otelConfig?.trace.setSpan(otelConfig.context.active(), currentSpan);
46
+ }
47
+ const request = await runWithSpan(
48
+ { name: "encode_request", context: otelContext },
49
+ () => this.codec.encode(path2, input2, options2)
50
+ );
51
+ const response = await intercept(
52
+ this.clientInterceptors,
53
+ { ...options2, input: input2, path: path2, request },
54
+ ({ input: input3, path: path3, request: request2, ...options3 }) => {
55
+ return runWithSpan(
56
+ { name: "send_request", signal: options3.signal, context: otelContext },
57
+ () => this.sender.call(request2, options3, path3, input3)
58
+ );
59
+ }
60
+ );
61
+ const output = await runWithSpan(
62
+ { name: "decode_response", context: otelContext },
63
+ () => this.codec.decode(response, options2, path2, input2)
64
+ );
65
+ if (isAsyncIteratorObject(output)) {
66
+ return asyncIteratorWithSpan(
67
+ { name: "consume_event_iterator_output", signal: options2.signal },
68
+ output
69
+ );
70
+ }
71
+ return output;
72
+ });
73
+ }
31
74
  );
32
- const output = await this.codec.decode(response, options, path, input);
33
- return output;
34
75
  }
35
76
  }
36
77
 
@@ -111,6 +152,9 @@ class StandardRPCJsonSerializer {
111
152
  if (isObject(data)) {
112
153
  const json = {};
113
154
  for (const k in data) {
155
+ if (k === "toJSON" && typeof data[k] === "function") {
156
+ continue;
157
+ }
114
158
  json[k] = this.serialize(data[k], [...segments, k], meta, maps, blobs)[0];
115
159
  }
116
160
  return [json, meta, maps, blobs];
@@ -177,6 +221,13 @@ class StandardRPCJsonSerializer {
177
221
  }
178
222
  }
179
223
 
224
+ function toHttpPath(path) {
225
+ return `/${path.map(encodeURIComponent).join("/")}`;
226
+ }
227
+ function getMalformedResponseErrorCode(status) {
228
+ return Object.entries(COMMON_ORPC_ERROR_DEFS).find(([, def]) => def.status === status)?.[0] ?? "MALFORMED_ORPC_ERROR_RESPONSE";
229
+ }
230
+
180
231
  class StandardRPCLinkCodec {
181
232
  constructor(serializer, options) {
182
233
  this.serializer = serializer;
@@ -193,17 +244,12 @@ class StandardRPCLinkCodec {
193
244
  headers;
194
245
  async encode(path, input, options) {
195
246
  const expectedMethod = await value(this.expectedMethod, options, path, input);
196
- const headers = { ...await value(this.headers, options, path, input) };
247
+ let headers = await value(this.headers, options, path, input);
197
248
  const baseUrl = await value(this.baseUrl, options, path, input);
198
- const url = new URL(`${trim(baseUrl.toString(), "/")}/${path.map(encodeURIComponent).join("/")}`);
249
+ const url = new URL(baseUrl);
250
+ url.pathname = `${url.pathname.replace(/\/$/, "")}${toHttpPath(path)}`;
199
251
  if (options.lastEventId !== void 0) {
200
- if (Array.isArray(headers["last-event-id"])) {
201
- headers["last-event-id"] = [...headers["last-event-id"], options.lastEventId];
202
- } else if (headers["last-event-id"] !== void 0) {
203
- headers["last-event-id"] = [headers["last-event-id"], options.lastEventId];
204
- } else {
205
- headers["last-event-id"] = options.lastEventId;
206
- }
252
+ headers = mergeStandardHeaders(headers, { "last-event-id": options.lastEventId });
207
253
  }
208
254
  const serialized = this.serializer.serialize(input);
209
255
  if (expectedMethod === "GET" && !(serialized instanceof FormData) && !isAsyncIteratorObject(serialized)) {
@@ -229,7 +275,7 @@ class StandardRPCLinkCodec {
229
275
  };
230
276
  }
231
277
  async decode(response) {
232
- const isOk = response.status >= 200 && response.status < 300;
278
+ const isOk = !isORPCErrorStatus(response.status);
233
279
  const deserialized = await (async () => {
234
280
  let isBodyOk = false;
235
281
  try {
@@ -248,11 +294,12 @@ class StandardRPCLinkCodec {
248
294
  }
249
295
  })();
250
296
  if (!isOk) {
251
- if (ORPCError.isValidJSON(deserialized)) {
252
- throw ORPCError.fromJSON(deserialized);
297
+ if (isORPCErrorJson(deserialized)) {
298
+ throw createORPCErrorFromJson(deserialized);
253
299
  }
254
- throw new Error("Invalid RPC error response format.", {
255
- cause: deserialized
300
+ throw new ORPCError(getMalformedResponseErrorCode(response.status), {
301
+ status: response.status,
302
+ data: { ...response, body: deserialized }
256
303
  });
257
304
  }
258
305
  return deserialized;
@@ -302,8 +349,8 @@ class StandardRPCSerializer {
302
349
  return e;
303
350
  }
304
351
  const deserialized = this.#deserialize(e.data);
305
- if (ORPCError.isValidJSON(deserialized)) {
306
- return ORPCError.fromJSON(deserialized, { cause: e });
352
+ if (isORPCErrorJson(deserialized)) {
353
+ return createORPCErrorFromJson(deserialized, { cause: e });
307
354
  }
308
355
  return new ErrorEvent({
309
356
  data: deserialized,
@@ -315,6 +362,9 @@ class StandardRPCSerializer {
315
362
  return this.#deserialize(data);
316
363
  }
317
364
  #deserialize(data) {
365
+ if (data === void 0) {
366
+ return void 0;
367
+ }
318
368
  if (!(data instanceof FormData)) {
319
369
  return this.jsonSerializer.deserialize(data.json, data.meta ?? []);
320
370
  }
@@ -328,4 +378,13 @@ class StandardRPCSerializer {
328
378
  }
329
379
  }
330
380
 
331
- export { InvalidEventIteratorRetryResponse as I, StandardLink as S, STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES as a, StandardRPCJsonSerializer as b, StandardRPCLinkCodec as c, StandardRPCSerializer as d };
381
+ class StandardRPCLink extends StandardLink {
382
+ constructor(linkClient, options) {
383
+ const jsonSerializer = new StandardRPCJsonSerializer(options);
384
+ const serializer = new StandardRPCSerializer(jsonSerializer);
385
+ const linkCodec = new StandardRPCLinkCodec(serializer, options);
386
+ super(linkCodec, linkClient, options);
387
+ }
388
+ }
389
+
390
+ export { CompositeStandardLinkPlugin as C, StandardLink as S, STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES as a, StandardRPCJsonSerializer as b, StandardRPCLink as c, StandardRPCLinkCodec as d, StandardRPCSerializer as e, getMalformedResponseErrorCode as g, toHttpPath as t };
@@ -0,0 +1,91 @@
1
+ import { b as ClientContext, c as ClientOptions, f as HTTPMethod } from './client.BOYsZIRq.mjs';
2
+ import { e as StandardLinkCodec, b as StandardLinkOptions, d as StandardLink, f as StandardLinkClient } from './client.Bwgm6dgk.mjs';
3
+ import { Segment, Value, Promisable } from '@orpc/shared';
4
+ import { StandardHeaders, StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
5
+
6
+ declare const STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES: {
7
+ readonly BIGINT: 0;
8
+ readonly DATE: 1;
9
+ readonly NAN: 2;
10
+ readonly UNDEFINED: 3;
11
+ readonly URL: 4;
12
+ readonly REGEXP: 5;
13
+ readonly SET: 6;
14
+ readonly MAP: 7;
15
+ };
16
+ type StandardRPCJsonSerializedMetaItem = readonly [type: number, ...path: Segment[]];
17
+ type StandardRPCJsonSerialized = [json: unknown, meta: StandardRPCJsonSerializedMetaItem[], maps: Segment[][], blobs: Blob[]];
18
+ interface StandardRPCCustomJsonSerializer {
19
+ type: number;
20
+ condition(data: unknown): boolean;
21
+ serialize(data: any): unknown;
22
+ deserialize(serialized: any): unknown;
23
+ }
24
+ interface StandardRPCJsonSerializerOptions {
25
+ customJsonSerializers?: readonly StandardRPCCustomJsonSerializer[];
26
+ }
27
+ declare class StandardRPCJsonSerializer {
28
+ private readonly customSerializers;
29
+ constructor(options?: StandardRPCJsonSerializerOptions);
30
+ serialize(data: unknown, segments?: Segment[], meta?: StandardRPCJsonSerializedMetaItem[], maps?: Segment[][], blobs?: Blob[]): StandardRPCJsonSerialized;
31
+ deserialize(json: unknown, meta: readonly StandardRPCJsonSerializedMetaItem[]): unknown;
32
+ deserialize(json: unknown, meta: readonly StandardRPCJsonSerializedMetaItem[], maps: readonly Segment[][], getBlob: (index: number) => Blob): unknown;
33
+ }
34
+
35
+ declare class StandardRPCSerializer {
36
+ #private;
37
+ private readonly jsonSerializer;
38
+ constructor(jsonSerializer: StandardRPCJsonSerializer);
39
+ serialize(data: unknown): object;
40
+ deserialize(data: unknown): unknown;
41
+ }
42
+
43
+ interface StandardRPCLinkCodecOptions<T extends ClientContext> {
44
+ /**
45
+ * Base url for all requests.
46
+ */
47
+ url: Value<Promisable<string | URL>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
48
+ /**
49
+ * The maximum length of the URL.
50
+ *
51
+ * @default 2083
52
+ */
53
+ maxUrlLength?: Value<Promisable<number>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
54
+ /**
55
+ * The method used to make the request.
56
+ *
57
+ * @default 'POST'
58
+ */
59
+ method?: Value<Promisable<Exclude<HTTPMethod, 'HEAD'>>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
60
+ /**
61
+ * The method to use when the payload cannot safely pass to the server with method return from method function.
62
+ * GET is not allowed, it's very dangerous.
63
+ *
64
+ * @default 'POST'
65
+ */
66
+ fallbackMethod?: Exclude<HTTPMethod, 'HEAD' | 'GET'>;
67
+ /**
68
+ * Inject headers to the request.
69
+ */
70
+ headers?: Value<Promisable<StandardHeaders>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
71
+ }
72
+ declare class StandardRPCLinkCodec<T extends ClientContext> implements StandardLinkCodec<T> {
73
+ private readonly serializer;
74
+ private readonly baseUrl;
75
+ private readonly maxUrlLength;
76
+ private readonly fallbackMethod;
77
+ private readonly expectedMethod;
78
+ private readonly headers;
79
+ constructor(serializer: StandardRPCSerializer, options: StandardRPCLinkCodecOptions<T>);
80
+ encode(path: readonly string[], input: unknown, options: ClientOptions<T>): Promise<StandardRequest>;
81
+ decode(response: StandardLazyResponse): Promise<unknown>;
82
+ }
83
+
84
+ interface StandardRPCLinkOptions<T extends ClientContext> extends StandardLinkOptions<T>, StandardRPCLinkCodecOptions<T>, StandardRPCJsonSerializerOptions {
85
+ }
86
+ declare class StandardRPCLink<T extends ClientContext> extends StandardLink<T> {
87
+ constructor(linkClient: StandardLinkClient<T>, options: StandardRPCLinkOptions<T>);
88
+ }
89
+
90
+ export { STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES as S, StandardRPCJsonSerializer as e, StandardRPCLink as g, StandardRPCLinkCodec as i, StandardRPCSerializer as j };
91
+ export type { StandardRPCJsonSerializedMetaItem as a, StandardRPCJsonSerialized as b, StandardRPCCustomJsonSerializer as c, StandardRPCJsonSerializerOptions as d, StandardRPCLinkOptions as f, StandardRPCLinkCodecOptions as h };
@@ -1,4 +1,4 @@
1
- import { isObject, isTypescriptObject } from '@orpc/shared';
1
+ import { resolveMaybeOptionalOptions, isObject, AsyncIteratorClass, isTypescriptObject } from '@orpc/shared';
2
2
  import { getEventMeta, withEventMeta } from '@orpc/standard-server';
3
3
 
4
4
  const COMMON_ORPC_ERROR_DEFS = {
@@ -90,16 +90,17 @@ class ORPCError extends Error {
90
90
  code;
91
91
  status;
92
92
  data;
93
- constructor(code, ...[options]) {
94
- if (options?.status && (options.status < 400 || options.status >= 600)) {
95
- throw new Error("[ORPCError] The error status code must be in the 400-599 range.");
93
+ constructor(code, ...rest) {
94
+ const options = resolveMaybeOptionalOptions(rest);
95
+ if (options.status !== void 0 && !isORPCErrorStatus(options.status)) {
96
+ throw new Error("[ORPCError] Invalid error status code.");
96
97
  }
97
- const message = fallbackORPCErrorMessage(code, options?.message);
98
+ const message = fallbackORPCErrorMessage(code, options.message);
98
99
  super(message, options);
99
100
  this.code = code;
100
- this.status = fallbackORPCErrorStatus(code, options?.status);
101
- this.defined = options?.defined ?? false;
102
- this.data = options?.data;
101
+ this.status = fallbackORPCErrorStatus(code, options.status);
102
+ this.defined = options.defined ?? false;
103
+ this.data = options.data;
103
104
  }
104
105
  toJSON() {
105
106
  return {
@@ -110,22 +111,6 @@ class ORPCError extends Error {
110
111
  data: this.data
111
112
  };
112
113
  }
113
- static fromJSON(json, options) {
114
- return new ORPCError(json.code, {
115
- ...options,
116
- ...json
117
- });
118
- }
119
- static isValidJSON(json) {
120
- if (!isObject(json)) {
121
- return false;
122
- }
123
- const validKeys = ["defined", "code", "status", "message", "data"];
124
- if (Object.keys(json).some((k) => !validKeys.includes(k))) {
125
- return false;
126
- }
127
- return "defined" in json && typeof json.defined === "boolean" && "code" in json && typeof json.code === "string" && "status" in json && typeof json.status === "number" && "message" in json && typeof json.message === "string";
128
- }
129
114
  }
130
115
  function isDefinedError(error) {
131
116
  return error instanceof ORPCError && error.defined;
@@ -136,37 +121,60 @@ function toORPCError(error) {
136
121
  cause: error
137
122
  });
138
123
  }
124
+ function isORPCErrorStatus(status) {
125
+ return status < 200 || status >= 400;
126
+ }
127
+ function isORPCErrorJson(json) {
128
+ if (!isObject(json)) {
129
+ return false;
130
+ }
131
+ const validKeys = ["defined", "code", "status", "message", "data"];
132
+ if (Object.keys(json).some((k) => !validKeys.includes(k))) {
133
+ return false;
134
+ }
135
+ return "defined" in json && typeof json.defined === "boolean" && "code" in json && typeof json.code === "string" && "status" in json && typeof json.status === "number" && isORPCErrorStatus(json.status) && "message" in json && typeof json.message === "string";
136
+ }
137
+ function createORPCErrorFromJson(json, options = {}) {
138
+ return new ORPCError(json.code, {
139
+ ...options,
140
+ ...json
141
+ });
142
+ }
139
143
 
140
144
  function mapEventIterator(iterator, maps) {
141
- return async function* () {
142
- try {
143
- while (true) {
144
- const { done, value } = await iterator.next();
145
- let mappedValue = await maps.value(value, done);
146
- if (mappedValue !== value) {
147
- const meta = getEventMeta(value);
148
- if (meta && isTypescriptObject(mappedValue)) {
149
- mappedValue = withEventMeta(mappedValue, meta);
150
- }
151
- }
152
- if (done) {
153
- return mappedValue;
154
- }
155
- yield mappedValue;
145
+ const mapError = async (error) => {
146
+ let mappedError = await maps.error(error);
147
+ if (mappedError !== error) {
148
+ const meta = getEventMeta(error);
149
+ if (meta && isTypescriptObject(mappedError)) {
150
+ mappedError = withEventMeta(mappedError, meta);
156
151
  }
157
- } catch (error) {
158
- let mappedError = await maps.error(error);
159
- if (mappedError !== error) {
160
- const meta = getEventMeta(error);
161
- if (meta && isTypescriptObject(mappedError)) {
162
- mappedError = withEventMeta(mappedError, meta);
163
- }
152
+ }
153
+ return mappedError;
154
+ };
155
+ return new AsyncIteratorClass(async () => {
156
+ const { done, value } = await (async () => {
157
+ try {
158
+ return await iterator.next();
159
+ } catch (error) {
160
+ throw await mapError(error);
161
+ }
162
+ })();
163
+ let mappedValue = await maps.value(value, done);
164
+ if (mappedValue !== value) {
165
+ const meta = getEventMeta(value);
166
+ if (meta && isTypescriptObject(mappedValue)) {
167
+ mappedValue = withEventMeta(mappedValue, meta);
164
168
  }
165
- throw mappedError;
166
- } finally {
169
+ }
170
+ return { done, value: mappedValue };
171
+ }, async () => {
172
+ try {
167
173
  await iterator.return?.();
174
+ } catch (error) {
175
+ throw await mapError(error);
168
176
  }
169
- }();
177
+ });
170
178
  }
171
179
 
172
- export { COMMON_ORPC_ERROR_DEFS as C, ORPCError as O, fallbackORPCErrorMessage as a, fallbackORPCErrorStatus as f, isDefinedError as i, mapEventIterator as m, toORPCError as t };
180
+ export { COMMON_ORPC_ERROR_DEFS as C, ORPCError as O, fallbackORPCErrorMessage as a, isORPCErrorStatus as b, isORPCErrorJson as c, createORPCErrorFromJson as d, fallbackORPCErrorStatus as f, isDefinedError as i, mapEventIterator as m, toORPCError as t };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/client",
3
3
  "type": "module",
4
- "version": "0.0.0-next.b5ac9a3",
4
+ "version": "0.0.0-next.b5e327f",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.unnoq.com",
7
7
  "repository": {
@@ -33,18 +33,29 @@
33
33
  "types": "./dist/adapters/fetch/index.d.mts",
34
34
  "import": "./dist/adapters/fetch/index.mjs",
35
35
  "default": "./dist/adapters/fetch/index.mjs"
36
+ },
37
+ "./websocket": {
38
+ "types": "./dist/adapters/websocket/index.d.mts",
39
+ "import": "./dist/adapters/websocket/index.mjs",
40
+ "default": "./dist/adapters/websocket/index.mjs"
41
+ },
42
+ "./message-port": {
43
+ "types": "./dist/adapters/message-port/index.d.mts",
44
+ "import": "./dist/adapters/message-port/index.mjs",
45
+ "default": "./dist/adapters/message-port/index.mjs"
36
46
  }
37
47
  },
38
48
  "files": [
39
49
  "dist"
40
50
  ],
41
51
  "dependencies": {
42
- "@orpc/shared": "0.0.0-next.b5ac9a3",
43
- "@orpc/standard-server": "0.0.0-next.b5ac9a3",
44
- "@orpc/standard-server-fetch": "0.0.0-next.b5ac9a3"
52
+ "@orpc/shared": "0.0.0-next.b5e327f",
53
+ "@orpc/standard-server": "0.0.0-next.b5e327f",
54
+ "@orpc/standard-server-peer": "0.0.0-next.b5e327f",
55
+ "@orpc/standard-server-fetch": "0.0.0-next.b5e327f"
45
56
  },
46
57
  "devDependencies": {
47
- "zod": "^3.24.2"
58
+ "zod": "^4.0.17"
48
59
  },
49
60
  "scripts": {
50
61
  "build": "unbuild",
@@ -1,30 +0,0 @@
1
- type ClientContext = Record<string, any>;
2
- type ClientOptions<TClientContext extends ClientContext> = {
3
- signal?: AbortSignal;
4
- lastEventId?: string | undefined;
5
- } & (Record<never, never> extends TClientContext ? {
6
- context?: TClientContext;
7
- } : {
8
- context: TClientContext;
9
- });
10
- type ClientRest<TClientContext extends ClientContext, TInput> = Record<never, never> extends TClientContext ? undefined extends TInput ? [input?: TInput, options?: ClientOptions<TClientContext>] : [input: TInput, options?: ClientOptions<TClientContext>] : [input: TInput, options: ClientOptions<TClientContext>];
11
- type ClientPromiseResult<TOutput, TError extends Error> = Promise<TOutput> & {
12
- __error?: {
13
- type: TError;
14
- };
15
- };
16
- interface Client<TClientContext extends ClientContext, TInput, TOutput, TError extends Error> {
17
- (...rest: ClientRest<TClientContext, TInput>): ClientPromiseResult<TOutput, TError>;
18
- }
19
- type NestedClient<TClientContext extends ClientContext> = Client<TClientContext, any, any, any> | {
20
- [k: string]: NestedClient<TClientContext>;
21
- };
22
- type InferClientContext<T extends NestedClient<any>> = T extends NestedClient<infer U> ? U : never;
23
- type ClientOptionsOut<TClientContext extends ClientContext> = ClientOptions<TClientContext> & {
24
- context: TClientContext;
25
- };
26
- interface ClientLink<TClientContext extends ClientContext> {
27
- call: (path: readonly string[], input: unknown, options: ClientOptionsOut<TClientContext>) => Promise<unknown>;
28
- }
29
-
30
- export type { ClientOptionsOut as C, InferClientContext as I, NestedClient as N, ClientContext as a, ClientLink as b, ClientPromiseResult as c, ClientOptions as d, ClientRest as e, Client as f };
@@ -1,30 +0,0 @@
1
- type ClientContext = Record<string, any>;
2
- type ClientOptions<TClientContext extends ClientContext> = {
3
- signal?: AbortSignal;
4
- lastEventId?: string | undefined;
5
- } & (Record<never, never> extends TClientContext ? {
6
- context?: TClientContext;
7
- } : {
8
- context: TClientContext;
9
- });
10
- type ClientRest<TClientContext extends ClientContext, TInput> = Record<never, never> extends TClientContext ? undefined extends TInput ? [input?: TInput, options?: ClientOptions<TClientContext>] : [input: TInput, options?: ClientOptions<TClientContext>] : [input: TInput, options: ClientOptions<TClientContext>];
11
- type ClientPromiseResult<TOutput, TError extends Error> = Promise<TOutput> & {
12
- __error?: {
13
- type: TError;
14
- };
15
- };
16
- interface Client<TClientContext extends ClientContext, TInput, TOutput, TError extends Error> {
17
- (...rest: ClientRest<TClientContext, TInput>): ClientPromiseResult<TOutput, TError>;
18
- }
19
- type NestedClient<TClientContext extends ClientContext> = Client<TClientContext, any, any, any> | {
20
- [k: string]: NestedClient<TClientContext>;
21
- };
22
- type InferClientContext<T extends NestedClient<any>> = T extends NestedClient<infer U> ? U : never;
23
- type ClientOptionsOut<TClientContext extends ClientContext> = ClientOptions<TClientContext> & {
24
- context: TClientContext;
25
- };
26
- interface ClientLink<TClientContext extends ClientContext> {
27
- call: (path: readonly string[], input: unknown, options: ClientOptionsOut<TClientContext>) => Promise<unknown>;
28
- }
29
-
30
- export type { ClientOptionsOut as C, InferClientContext as I, NestedClient as N, ClientContext as a, ClientLink as b, ClientPromiseResult as c, ClientOptions as d, ClientRest as e, Client as f };
@@ -1,12 +0,0 @@
1
- class CompositeClientPlugin {
2
- constructor(plugins = []) {
3
- this.plugins = plugins;
4
- }
5
- init(options) {
6
- for (const plugin of this.plugins) {
7
- plugin.init?.(options);
8
- }
9
- }
10
- }
11
-
12
- export { CompositeClientPlugin as C };