@orpc/client 0.0.0-next.0ca4e14 → 0.0.0-next.0ceddfc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,6 +30,7 @@
30
30
  - **🔗 End-to-End Type Safety**: Ensure type-safe inputs, outputs, and errors from client to server.
31
31
  - **📘 First-Class OpenAPI**: Built-in support that fully adheres to the OpenAPI standard.
32
32
  - **📝 Contract-First Development**: Optionally define your API contract before implementation.
33
+ - **🔍 First-Class OpenTelemetry**: Seamlessly integrate with OpenTelemetry for observability.
33
34
  - **⚙️ Framework Integrations**: Seamlessly integrate with TanStack Query (React, Vue, Solid, Svelte, Angular), Pinia Colada, and more.
34
35
  - **🚀 Server Actions**: Fully compatible with React Server Actions on Next.js, TanStack Start, and other platforms.
35
36
  - **🔠 Standard Schema Support**: Works out of the box with Zod, Valibot, ArkType, and other schema validators.
@@ -38,7 +39,6 @@
38
39
  - **📡 SSE & Streaming**: Enjoy full type-safe support for SSE and streaming.
39
40
  - **🌍 Multi-Runtime Support**: Fast and lightweight on Cloudflare, Deno, Bun, Node.js, and beyond.
40
41
  - **🔌 Extendability**: Easily extend functionality with plugins, middleware, and interceptors.
41
- - **🛡️ Reliability**: Well-tested, TypeScript-based, production-ready, and MIT licensed.
42
42
 
43
43
  ## Documentation
44
44
 
@@ -50,6 +50,7 @@ You can find the full documentation [here](https://orpc.unnoq.com).
50
50
  - [@orpc/server](https://www.npmjs.com/package/@orpc/server): Build your API or implement API contract.
51
51
  - [@orpc/client](https://www.npmjs.com/package/@orpc/client): Consume your API on the client with type-safety.
52
52
  - [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi): Generate OpenAPI specs and handle OpenAPI requests.
53
+ - [@orpc/otel](https://www.npmjs.com/package/@orpc/otel): [OpenTelemetry](https://opentelemetry.io/) integration for observability.
53
54
  - [@orpc/nest](https://www.npmjs.com/package/@orpc/nest): Deeply integrate oRPC with [NestJS](https://nestjs.com/).
54
55
  - [@orpc/react](https://www.npmjs.com/package/@orpc/react): Utilities for integrating oRPC with React and React Server Actions.
55
56
  - [@orpc/tanstack-query](https://www.npmjs.com/package/@orpc/tanstack-query): [TanStack Query](https://tanstack.com/query/latest) integration.
@@ -1,8 +1,8 @@
1
1
  import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
2
2
  import { ToFetchRequestOptions } from '@orpc/standard-server-fetch';
3
3
  import { b as ClientContext, c as ClientOptions } from '../../shared/client.BOYsZIRq.mjs';
4
- import { f as StandardLinkClient } from '../../shared/client.C4VxIexA.mjs';
5
- import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.aTp4sII-.mjs';
4
+ import { f as StandardLinkClient } from '../../shared/client.Bwgm6dgk.mjs';
5
+ import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.Ycwr4Tuo.mjs';
6
6
  import '@orpc/shared';
7
7
 
8
8
  interface LinkFetchClientOptions<T extends ClientContext> extends ToFetchRequestOptions {
@@ -1,8 +1,8 @@
1
1
  import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
2
2
  import { ToFetchRequestOptions } from '@orpc/standard-server-fetch';
3
3
  import { b as ClientContext, c as ClientOptions } from '../../shared/client.BOYsZIRq.js';
4
- import { f as StandardLinkClient } from '../../shared/client.CXXEPIbK.js';
5
- import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.WCinBImJ.js';
4
+ import { f as StandardLinkClient } from '../../shared/client.BG98rYdO.js';
5
+ import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.C176log5.js';
6
6
  import '@orpc/shared';
7
7
 
8
8
  interface LinkFetchClientOptions<T extends ClientContext> extends ToFetchRequestOptions {
@@ -1,8 +1,8 @@
1
1
  import { toFetchRequest, toStandardLazyResponse } from '@orpc/standard-server-fetch';
2
2
  import '@orpc/shared';
3
- import { c as StandardRPCLink } from '../../shared/client.DwfV9Oyl.mjs';
3
+ import { c as StandardRPCLink } from '../../shared/client.DKmRtVO2.mjs';
4
4
  import '@orpc/standard-server';
5
- import '../../shared/client.DHOfWE0c.mjs';
5
+ import '../../shared/client.txdq_i5V.mjs';
6
6
 
7
7
  class LinkFetchClient {
8
8
  fetch;
@@ -14,7 +14,7 @@ class LinkFetchClient {
14
14
  async call(request, options, path, input) {
15
15
  const fetchRequest = toFetchRequest(request, this.toFetchRequestOptions);
16
16
  const fetchResponse = await this.fetch(fetchRequest, { redirect: "manual" }, options, path, input);
17
- const lazyResponse = toStandardLazyResponse(fetchResponse);
17
+ const lazyResponse = toStandardLazyResponse(fetchResponse, { signal: fetchRequest.signal });
18
18
  return lazyResponse;
19
19
  }
20
20
  }
@@ -1,7 +1,7 @@
1
1
  import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
2
2
  import { b as ClientContext, c as ClientOptions } from '../../shared/client.BOYsZIRq.mjs';
3
- import { f as StandardLinkClient } from '../../shared/client.C4VxIexA.mjs';
4
- import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.aTp4sII-.mjs';
3
+ import { f as StandardLinkClient } from '../../shared/client.Bwgm6dgk.mjs';
4
+ import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.Ycwr4Tuo.mjs';
5
5
  import '@orpc/shared';
6
6
 
7
7
  /**
@@ -43,7 +43,7 @@ declare class LinkMessagePortClient<T extends ClientContext> implements Standard
43
43
  call(request: StandardRequest, _options: ClientOptions<T>, _path: readonly string[], _input: unknown): Promise<StandardLazyResponse>;
44
44
  }
45
45
 
46
- interface RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'headers' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, LinkMessagePortClientOptions {
46
+ interface RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, LinkMessagePortClientOptions {
47
47
  }
48
48
  /**
49
49
  * The RPC Link for common message port implementations.
@@ -1,7 +1,7 @@
1
1
  import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
2
2
  import { b as ClientContext, c as ClientOptions } from '../../shared/client.BOYsZIRq.js';
3
- import { f as StandardLinkClient } from '../../shared/client.CXXEPIbK.js';
4
- import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.WCinBImJ.js';
3
+ import { f as StandardLinkClient } from '../../shared/client.BG98rYdO.js';
4
+ import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.C176log5.js';
5
5
  import '@orpc/shared';
6
6
 
7
7
  /**
@@ -43,7 +43,7 @@ declare class LinkMessagePortClient<T extends ClientContext> implements Standard
43
43
  call(request: StandardRequest, _options: ClientOptions<T>, _path: readonly string[], _input: unknown): Promise<StandardLazyResponse>;
44
44
  }
45
45
 
46
- interface RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'headers' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, LinkMessagePortClientOptions {
46
+ interface RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, LinkMessagePortClientOptions {
47
47
  }
48
48
  /**
49
49
  * The RPC Link for common message port implementations.
@@ -1,8 +1,8 @@
1
1
  import { ClientPeer } from '@orpc/standard-server-peer';
2
2
  import '@orpc/shared';
3
- import { c as StandardRPCLink } from '../../shared/client.DwfV9Oyl.mjs';
3
+ import { c as StandardRPCLink } from '../../shared/client.DKmRtVO2.mjs';
4
4
  import '@orpc/standard-server';
5
- import '../../shared/client.DHOfWE0c.mjs';
5
+ import '../../shared/client.txdq_i5V.mjs';
6
6
 
7
7
  function postMessagePortMessage(port, data) {
8
8
  port.postMessage(data);
@@ -1,5 +1,5 @@
1
- export { C as CompositeStandardLinkPlugin, d as StandardLink, f as StandardLinkClient, S as StandardLinkClientInterceptorOptions, e as StandardLinkCodec, c as StandardLinkInterceptorOptions, b as StandardLinkOptions, a as StandardLinkPlugin } from '../../shared/client.C4VxIexA.mjs';
2
- export { S as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, c as StandardRPCCustomJsonSerializer, b as StandardRPCJsonSerialized, a as StandardRPCJsonSerializedMetaItem, e as StandardRPCJsonSerializer, d as StandardRPCJsonSerializerOptions, g as StandardRPCLink, i as StandardRPCLinkCodec, h as StandardRPCLinkCodecOptions, f as StandardRPCLinkOptions, j as StandardRPCSerializer } from '../../shared/client.aTp4sII-.mjs';
1
+ export { C as CompositeStandardLinkPlugin, d as StandardLink, f as StandardLinkClient, S as StandardLinkClientInterceptorOptions, e as StandardLinkCodec, c as StandardLinkInterceptorOptions, b as StandardLinkOptions, a as StandardLinkPlugin } from '../../shared/client.Bwgm6dgk.mjs';
2
+ export { S as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, c as StandardRPCCustomJsonSerializer, b as StandardRPCJsonSerialized, a as StandardRPCJsonSerializedMetaItem, e as StandardRPCJsonSerializer, d as StandardRPCJsonSerializerOptions, g as StandardRPCLink, i as StandardRPCLinkCodec, h as StandardRPCLinkCodecOptions, f as StandardRPCLinkOptions, j as StandardRPCSerializer } from '../../shared/client.Ycwr4Tuo.mjs';
3
3
  import { H as HTTPPath } from '../../shared/client.BOYsZIRq.mjs';
4
4
  import '@orpc/shared';
5
5
  import '@orpc/standard-server';
@@ -1,5 +1,5 @@
1
- export { C as CompositeStandardLinkPlugin, d as StandardLink, f as StandardLinkClient, S as StandardLinkClientInterceptorOptions, e as StandardLinkCodec, c as StandardLinkInterceptorOptions, b as StandardLinkOptions, a as StandardLinkPlugin } from '../../shared/client.CXXEPIbK.js';
2
- export { S as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, c as StandardRPCCustomJsonSerializer, b as StandardRPCJsonSerialized, a as StandardRPCJsonSerializedMetaItem, e as StandardRPCJsonSerializer, d as StandardRPCJsonSerializerOptions, g as StandardRPCLink, i as StandardRPCLinkCodec, h as StandardRPCLinkCodecOptions, f as StandardRPCLinkOptions, j as StandardRPCSerializer } from '../../shared/client.WCinBImJ.js';
1
+ export { C as CompositeStandardLinkPlugin, d as StandardLink, f as StandardLinkClient, S as StandardLinkClientInterceptorOptions, e as StandardLinkCodec, c as StandardLinkInterceptorOptions, b as StandardLinkOptions, a as StandardLinkPlugin } from '../../shared/client.BG98rYdO.js';
2
+ export { S as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, c as StandardRPCCustomJsonSerializer, b as StandardRPCJsonSerialized, a as StandardRPCJsonSerializedMetaItem, e as StandardRPCJsonSerializer, d as StandardRPCJsonSerializerOptions, g as StandardRPCLink, i as StandardRPCLinkCodec, h as StandardRPCLinkCodecOptions, f as StandardRPCLinkOptions, j as StandardRPCSerializer } from '../../shared/client.C176log5.js';
3
3
  import { H as HTTPPath } from '../../shared/client.BOYsZIRq.js';
4
4
  import '@orpc/shared';
5
5
  import '@orpc/standard-server';
@@ -1,4 +1,4 @@
1
- export { C as CompositeStandardLinkPlugin, a as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, S as StandardLink, b as StandardRPCJsonSerializer, c as StandardRPCLink, d as StandardRPCLinkCodec, e as StandardRPCSerializer, g as getMalformedResponseErrorCode, t as toHttpPath } from '../../shared/client.DwfV9Oyl.mjs';
1
+ export { C as CompositeStandardLinkPlugin, a as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, S as StandardLink, b as StandardRPCJsonSerializer, c as StandardRPCLink, d as StandardRPCLinkCodec, e as StandardRPCSerializer, g as getMalformedResponseErrorCode, t as toHttpPath } from '../../shared/client.DKmRtVO2.mjs';
2
2
  import '@orpc/shared';
3
3
  import '@orpc/standard-server';
4
- import '../../shared/client.DHOfWE0c.mjs';
4
+ import '../../shared/client.txdq_i5V.mjs';
@@ -1,7 +1,7 @@
1
1
  import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
2
2
  import { b as ClientContext, c as ClientOptions } from '../../shared/client.BOYsZIRq.mjs';
3
- import { f as StandardLinkClient } from '../../shared/client.C4VxIexA.mjs';
4
- import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.aTp4sII-.mjs';
3
+ import { f as StandardLinkClient } from '../../shared/client.Bwgm6dgk.mjs';
4
+ import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.Ycwr4Tuo.mjs';
5
5
  import '@orpc/shared';
6
6
 
7
7
  interface LinkWebsocketClientOptions {
@@ -13,7 +13,7 @@ declare class LinkWebsocketClient<T extends ClientContext> implements StandardLi
13
13
  call(request: StandardRequest, _options: ClientOptions<T>, _path: readonly string[], _input: unknown): Promise<StandardLazyResponse>;
14
14
  }
15
15
 
16
- interface RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'headers' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, LinkWebsocketClientOptions {
16
+ interface RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, LinkWebsocketClientOptions {
17
17
  }
18
18
  /**
19
19
  * The RPC Link communicates with the server using the RPC protocol over WebSocket.
@@ -1,7 +1,7 @@
1
1
  import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
2
2
  import { b as ClientContext, c as ClientOptions } from '../../shared/client.BOYsZIRq.js';
3
- import { f as StandardLinkClient } from '../../shared/client.CXXEPIbK.js';
4
- import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.WCinBImJ.js';
3
+ import { f as StandardLinkClient } from '../../shared/client.BG98rYdO.js';
4
+ import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.C176log5.js';
5
5
  import '@orpc/shared';
6
6
 
7
7
  interface LinkWebsocketClientOptions {
@@ -13,7 +13,7 @@ declare class LinkWebsocketClient<T extends ClientContext> implements StandardLi
13
13
  call(request: StandardRequest, _options: ClientOptions<T>, _path: readonly string[], _input: unknown): Promise<StandardLazyResponse>;
14
14
  }
15
15
 
16
- interface RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'headers' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, LinkWebsocketClientOptions {
16
+ interface RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, LinkWebsocketClientOptions {
17
17
  }
18
18
  /**
19
19
  * The RPC Link communicates with the server using the RPC protocol over WebSocket.
@@ -1,14 +1,15 @@
1
1
  import { readAsBuffer } from '@orpc/shared';
2
2
  import { ClientPeer } from '@orpc/standard-server-peer';
3
- import { c as StandardRPCLink } from '../../shared/client.DwfV9Oyl.mjs';
3
+ import { c as StandardRPCLink } from '../../shared/client.DKmRtVO2.mjs';
4
4
  import '@orpc/standard-server';
5
- import '../../shared/client.DHOfWE0c.mjs';
5
+ import '../../shared/client.txdq_i5V.mjs';
6
6
 
7
+ const WEBSOCKET_CONNECTING = 0;
7
8
  class LinkWebsocketClient {
8
9
  peer;
9
10
  constructor(options) {
10
11
  const untilOpen = new Promise((resolve) => {
11
- if (options.websocket.readyState === 0) {
12
+ if (options.websocket.readyState === WEBSOCKET_CONNECTING) {
12
13
  options.websocket.addEventListener("open", () => {
13
14
  resolve();
14
15
  }, { once: true });
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { N as NestedClient, C as ClientLink, I as InferClientContext, a as ClientPromiseResult, b as ClientContext, F as FriendlyClientOptions, c as ClientOptions, d as Client, e as ClientRest } from './shared/client.BOYsZIRq.mjs';
2
2
  export { f as HTTPMethod, H as HTTPPath } from './shared/client.BOYsZIRq.mjs';
3
3
  import { MaybeOptionalOptions, ThrowableError, Promisable, AsyncIteratorClass } from '@orpc/shared';
4
- export { EventPublisher, EventPublisherOptions, EventPublisherSubscribeIteratorOptions, Registry, ThrowableError, asyncIteratorToStream as eventIteratorToStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';
4
+ export { AsyncIteratorClass, EventPublisher, EventPublisherOptions, EventPublisherSubscribeIteratorOptions, Registry, ThrowableError, asyncIteratorToStream as eventIteratorToStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';
5
5
  export { ErrorEvent } from '@orpc/standard-server';
6
6
 
7
7
  interface createORPCClientOptions {
@@ -113,7 +113,7 @@ declare class ORPCError<TCode extends ORPCErrorCode, TData> extends Error {
113
113
  readonly code: TCode;
114
114
  readonly status: number;
115
115
  readonly data: TData;
116
- constructor(code: TCode, ...[options]: MaybeOptionalOptions<ORPCErrorOptions<TData>>);
116
+ constructor(code: TCode, ...rest: MaybeOptionalOptions<ORPCErrorOptions<TData>>);
117
117
  toJSON(): ORPCErrorJSON<TCode, TData>;
118
118
  }
119
119
  type ORPCErrorJSON<TCode extends string, TData> = Pick<ORPCError<TCode, TData>, 'defined' | 'code' | 'status' | 'message' | 'data'>;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { N as NestedClient, C as ClientLink, I as InferClientContext, a as ClientPromiseResult, b as ClientContext, F as FriendlyClientOptions, c as ClientOptions, d as Client, e as ClientRest } from './shared/client.BOYsZIRq.js';
2
2
  export { f as HTTPMethod, H as HTTPPath } from './shared/client.BOYsZIRq.js';
3
3
  import { MaybeOptionalOptions, ThrowableError, Promisable, AsyncIteratorClass } from '@orpc/shared';
4
- export { EventPublisher, EventPublisherOptions, EventPublisherSubscribeIteratorOptions, Registry, ThrowableError, asyncIteratorToStream as eventIteratorToStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';
4
+ export { AsyncIteratorClass, EventPublisher, EventPublisherOptions, EventPublisherSubscribeIteratorOptions, Registry, ThrowableError, asyncIteratorToStream as eventIteratorToStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';
5
5
  export { ErrorEvent } from '@orpc/standard-server';
6
6
 
7
7
  interface createORPCClientOptions {
@@ -113,7 +113,7 @@ declare class ORPCError<TCode extends ORPCErrorCode, TData> extends Error {
113
113
  readonly code: TCode;
114
114
  readonly status: number;
115
115
  readonly data: TData;
116
- constructor(code: TCode, ...[options]: MaybeOptionalOptions<ORPCErrorOptions<TData>>);
116
+ constructor(code: TCode, ...rest: MaybeOptionalOptions<ORPCErrorOptions<TData>>);
117
117
  toJSON(): ORPCErrorJSON<TCode, TData>;
118
118
  }
119
119
  type ORPCErrorJSON<TCode extends string, TData> = Pick<ORPCError<TCode, TData>, 'defined' | 'code' | 'status' | 'message' | 'data'>;
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import { i as isDefinedError } from './shared/client.DHOfWE0c.mjs';
2
- export { C as COMMON_ORPC_ERROR_DEFS, O as ORPCError, d as createORPCErrorFromJson, a as fallbackORPCErrorMessage, f as fallbackORPCErrorStatus, c as isORPCErrorJson, b as isORPCErrorStatus, m as mapEventIterator, t as toORPCError } from './shared/client.DHOfWE0c.mjs';
1
+ import { i as isDefinedError } from './shared/client.txdq_i5V.mjs';
2
+ export { C as COMMON_ORPC_ERROR_DEFS, O as ORPCError, d as createORPCErrorFromJson, a as fallbackORPCErrorMessage, f as fallbackORPCErrorStatus, c as isORPCErrorJson, b as isORPCErrorStatus, m as mapEventIterator, t as toORPCError } from './shared/client.txdq_i5V.mjs';
3
3
  import { isTypescriptObject } from '@orpc/shared';
4
- export { EventPublisher, asyncIteratorToStream as eventIteratorToStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';
4
+ export { AsyncIteratorClass, EventPublisher, asyncIteratorToStream as eventIteratorToStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';
5
5
  export { ErrorEvent } from '@orpc/standard-server';
6
6
 
7
7
  async function safe(promise) {
@@ -1,7 +1,7 @@
1
1
  import { Value, Promisable } from '@orpc/shared';
2
2
  import { StandardHeaders, StandardRequest } from '@orpc/standard-server';
3
3
  import { BatchResponseMode } from '@orpc/standard-server/batch';
4
- import { S as StandardLinkClientInterceptorOptions, a as StandardLinkPlugin, b as StandardLinkOptions, c as StandardLinkInterceptorOptions } from '../shared/client.C4VxIexA.mjs';
4
+ import { S as StandardLinkClientInterceptorOptions, a as StandardLinkPlugin, b as StandardLinkOptions, c as StandardLinkInterceptorOptions } from '../shared/client.Bwgm6dgk.mjs';
5
5
  import { b as ClientContext } from '../shared/client.BOYsZIRq.mjs';
6
6
 
7
7
  interface BatchLinkPluginGroup<T extends ClientContext> {
@@ -1,7 +1,7 @@
1
1
  import { Value, Promisable } from '@orpc/shared';
2
2
  import { StandardHeaders, StandardRequest } from '@orpc/standard-server';
3
3
  import { BatchResponseMode } from '@orpc/standard-server/batch';
4
- import { S as StandardLinkClientInterceptorOptions, a as StandardLinkPlugin, b as StandardLinkOptions, c as StandardLinkInterceptorOptions } from '../shared/client.CXXEPIbK.js';
4
+ import { S as StandardLinkClientInterceptorOptions, a as StandardLinkPlugin, b as StandardLinkOptions, c as StandardLinkInterceptorOptions } from '../shared/client.BG98rYdO.js';
5
5
  import { b as ClientContext } from '../shared/client.BOYsZIRq.js';
6
6
 
7
7
  interface BatchLinkPluginGroup<T extends ClientContext> {
@@ -64,7 +64,7 @@ class BatchLinkPlugin {
64
64
  });
65
65
  });
66
66
  options.clientInterceptors.push((options2) => {
67
- if (this.exclude(options2) || options2.request.body instanceof Blob || options2.request.body instanceof FormData || isAsyncIteratorObject(options2.request.body)) {
67
+ if (this.exclude(options2) || options2.request.body instanceof Blob || options2.request.body instanceof FormData || isAsyncIteratorObject(options2.request.body) || options2.request.signal?.aborted) {
68
68
  return options2.next();
69
69
  }
70
70
  const group = this.groups.find((group2) => group2.condition(options2));
@@ -130,16 +130,27 @@ class BatchLinkPlugin {
130
130
  return;
131
131
  }
132
132
  const mode = value(this.mode, options);
133
- const lazyResponse = await options[0].next({
134
- request: { ...batchRequest, headers: { ...batchRequest.headers, "x-orpc-batch": mode } },
135
- signal: batchRequest.signal,
136
- context: group.context,
137
- input: group.input,
138
- path: toArray(group.path)
139
- });
140
- const parsed = parseBatchResponse({ ...lazyResponse, body: await lazyResponse.body() });
141
- for await (const item of parsed) {
142
- batchItems[item.index]?.[1]({ ...item, body: () => Promise.resolve(item.body) });
133
+ try {
134
+ const lazyResponse = await options[0].next({
135
+ request: { ...batchRequest, headers: { ...batchRequest.headers, "x-orpc-batch": mode } },
136
+ signal: batchRequest.signal,
137
+ context: group.context,
138
+ input: group.input,
139
+ path: toArray(group.path)
140
+ });
141
+ const parsed = parseBatchResponse({ ...lazyResponse, body: await lazyResponse.body() });
142
+ for await (const item of parsed) {
143
+ batchItems[item.index]?.[1]({ ...item, body: () => Promise.resolve(item.body) });
144
+ }
145
+ } catch (err) {
146
+ if (batchRequest.signal?.aborted && batchRequest.signal.reason === err) {
147
+ for (const [{ signal }, , reject] of batchItems) {
148
+ if (signal?.aborted) {
149
+ reject(signal.reason);
150
+ }
151
+ }
152
+ }
153
+ throw err;
143
154
  }
144
155
  throw new Error("Something went wrong make batch response not contains enough responses. This can be a bug please report it.");
145
156
  } catch (error) {
@@ -33,7 +33,6 @@ interface StandardLinkOptions<T extends ClientContext> {
33
33
  plugins?: StandardLinkPlugin<T>[];
34
34
  }
35
35
  declare class StandardLink<T extends ClientContext> implements ClientLink<T> {
36
- #private;
37
36
  readonly codec: StandardLinkCodec<T>;
38
37
  readonly sender: StandardLinkClient<T>;
39
38
  private readonly interceptors;
@@ -33,7 +33,6 @@ interface StandardLinkOptions<T extends ClientContext> {
33
33
  plugins?: StandardLinkPlugin<T>[];
34
34
  }
35
35
  declare class StandardLink<T extends ClientContext> implements ClientLink<T> {
36
- #private;
37
36
  readonly codec: StandardLinkCodec<T>;
38
37
  readonly sender: StandardLinkClient<T>;
39
38
  private readonly interceptors;
@@ -1,5 +1,5 @@
1
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.CXXEPIbK.js';
2
+ import { e as StandardLinkCodec, b as StandardLinkOptions, d as StandardLink, f as StandardLinkClient } from './client.BG98rYdO.js';
3
3
  import { Segment, Value, Promisable } from '@orpc/shared';
4
4
  import { StandardHeaders, StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
5
5
 
@@ -1,6 +1,6 @@
1
- import { toArray, intercept, isObject, value, isAsyncIteratorObject, stringifyJSON } from '@orpc/shared';
1
+ import { toArray, runWithSpan, ORPC_NAME, isAsyncIteratorObject, asyncIteratorWithSpan, intercept, getGlobalOtelConfig, isObject, value, stringifyJSON } from '@orpc/shared';
2
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.DHOfWE0c.mjs';
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';
4
4
 
5
5
  class CompositeStandardLinkPlugin {
6
6
  plugins;
@@ -26,20 +26,52 @@ class StandardLink {
26
26
  interceptors;
27
27
  clientInterceptors;
28
28
  call(path, input, options) {
29
- return intercept(this.interceptors, { ...options, path, input }, async ({ path: path2, input: input2, ...options2 }) => {
30
- const output = await this.#call(path2, input2, options2);
31
- return output;
32
- });
33
- }
34
- async #call(path, input, options) {
35
- const request = await this.codec.encode(path, input, options);
36
- const response = await intercept(
37
- this.clientInterceptors,
38
- { ...options, input, path, request },
39
- ({ input: input2, path: path2, request: request2, ...options2 }) => this.sender.call(request2, options2, path2, input2)
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
+ }
40
74
  );
41
- const output = await this.codec.decode(response, options, path, input);
42
- return output;
43
75
  }
44
76
  }
45
77
 
@@ -330,6 +362,9 @@ class StandardRPCSerializer {
330
362
  return this.#deserialize(data);
331
363
  }
332
364
  #deserialize(data) {
365
+ if (data === void 0) {
366
+ return void 0;
367
+ }
333
368
  if (!(data instanceof FormData)) {
334
369
  return this.jsonSerializer.deserialize(data.json, data.meta ?? []);
335
370
  }
@@ -1,5 +1,5 @@
1
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.C4VxIexA.mjs';
2
+ import { e as StandardLinkCodec, b as StandardLinkOptions, d as StandardLink, f as StandardLinkClient } from './client.Bwgm6dgk.mjs';
3
3
  import { Segment, Value, Promisable } from '@orpc/shared';
4
4
  import { StandardHeaders, StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
5
5
 
@@ -1,4 +1,4 @@
1
- import { isObject, AsyncIteratorClass, 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 && !isORPCErrorStatus(options.status)) {
93
+ constructor(code, ...rest) {
94
+ const options = resolveMaybeOptionalOptions(rest);
95
+ if (options.status !== void 0 && !isORPCErrorStatus(options.status)) {
95
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 {
@@ -141,19 +142,22 @@ function createORPCErrorFromJson(json, options = {}) {
141
142
  }
142
143
 
143
144
  function mapEventIterator(iterator, maps) {
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);
151
+ }
152
+ }
153
+ return mappedError;
154
+ };
144
155
  return new AsyncIteratorClass(async () => {
145
156
  const { done, value } = await (async () => {
146
157
  try {
147
158
  return await iterator.next();
148
159
  } catch (error) {
149
- let mappedError = await maps.error(error);
150
- if (mappedError !== error) {
151
- const meta = getEventMeta(error);
152
- if (meta && isTypescriptObject(mappedError)) {
153
- mappedError = withEventMeta(mappedError, meta);
154
- }
155
- }
156
- throw mappedError;
160
+ throw await mapError(error);
157
161
  }
158
162
  })();
159
163
  let mappedValue = await maps.value(value, done);
@@ -165,7 +169,11 @@ function mapEventIterator(iterator, maps) {
165
169
  }
166
170
  return { done, value: mappedValue };
167
171
  }, async () => {
168
- await iterator.return?.();
172
+ try {
173
+ await iterator.return?.();
174
+ } catch (error) {
175
+ throw await mapError(error);
176
+ }
169
177
  });
170
178
  }
171
179
 
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.0ca4e14",
4
+ "version": "0.0.0-next.0ceddfc",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.unnoq.com",
7
7
  "repository": {
@@ -49,13 +49,13 @@
49
49
  "dist"
50
50
  ],
51
51
  "dependencies": {
52
- "@orpc/shared": "0.0.0-next.0ca4e14",
53
- "@orpc/standard-server-fetch": "0.0.0-next.0ca4e14",
54
- "@orpc/standard-server": "0.0.0-next.0ca4e14",
55
- "@orpc/standard-server-peer": "0.0.0-next.0ca4e14"
52
+ "@orpc/shared": "0.0.0-next.0ceddfc",
53
+ "@orpc/standard-server": "0.0.0-next.0ceddfc",
54
+ "@orpc/standard-server-fetch": "0.0.0-next.0ceddfc",
55
+ "@orpc/standard-server-peer": "0.0.0-next.0ceddfc"
56
56
  },
57
57
  "devDependencies": {
58
- "zod": "^4.0.5"
58
+ "zod": "^4.0.17"
59
59
  },
60
60
  "scripts": {
61
61
  "build": "unbuild",