@orpc/client 0.0.0-next.9b9ade5 → 0.0.0-next.9e880d7

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
@@ -32,7 +32,7 @@
32
32
  - **Contract-First Development 📜**: (Optional) Define your API contract upfront and implement it with confidence.
33
33
  - **Exceptional Developer Experience ✨**: Enjoy a streamlined workflow with robust typing and clear, in-code documentation.
34
34
  - **Multi-Runtime Support 🌍**: Run your code seamlessly on Cloudflare, Deno, Bun, Node.js, and more.
35
- - **Framework Integrations 🧩**: Supports Tanstack Query (React, Vue, Solid), Pinia Colada, and more.
35
+ - **Framework Integrations 🧩**: Supports Tanstack Query (React, Vue, Solid, Svelte), Pinia Colada, and more.
36
36
  - **Server Actions ⚡️**: Fully compatible with React Server Actions on Next.js, TanStack Start, and more.
37
37
  - **Standard Schema Support 🗂️**: Effortlessly work with Zod, Valibot, ArkType, and others right out of the box.
38
38
  - **Fast & Lightweight 💨**: Built on native APIs across all runtimes – optimized for speed and efficiency.
@@ -56,9 +56,12 @@ You can find the full documentation [here](https://orpc.unnoq.com).
56
56
  - [@orpc/react-query](https://www.npmjs.com/package/@orpc/react-query): Integration with [React Query](https://tanstack.com/query/latest/docs/framework/react/overview).
57
57
  - [@orpc/vue-query](https://www.npmjs.com/package/@orpc/vue-query): Integration with [Vue Query](https://tanstack.com/query/latest/docs/framework/vue/overview).
58
58
  - [@orpc/solid-query](https://www.npmjs.com/package/@orpc/solid-query): Integration with [Solid Query](https://tanstack.com/query/latest/docs/framework/solid/overview).
59
+ - [@orpc/svelte-query](https://www.npmjs.com/package/@orpc/svelte-query): Integration with [Svelte Query](https://tanstack.com/query/latest/docs/framework/svelte/overview).
59
60
  - [@orpc/vue-colada](https://www.npmjs.com/package/@orpc/vue-colada): Integration with [Pinia Colada](https://pinia-colada.esm.dev/).
60
61
  - [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi): Generate OpenAPI specs and handle OpenAPI requests.
61
62
  - [@orpc/zod](https://www.npmjs.com/package/@orpc/zod): More schemas that [Zod](https://zod.dev/) doesn't support yet.
63
+ - [@orpc/valibot](https://www.npmjs.com/package/@orpc/valibot): OpenAPI spec generation from [Valibot](https://valibot.dev/).
64
+ - [@orpc/arktype](https://www.npmjs.com/package/@orpc/arktype): OpenAPI spec generation from [ArkType](https://arktype.io/).
62
65
 
63
66
  ## `@orpc/client`
64
67
 
@@ -1,7 +1,8 @@
1
1
  import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
2
2
  import { ToFetchRequestOptions } from '@orpc/standard-server-fetch';
3
- import { C as ClientContext, a as ClientOptionsOut, b as ClientLink } from '../../shared/client.D_CzLDyB.mjs';
4
- import { StandardLinkClient, StandardLinkOptions, StandardRPCLinkCodecOptions } from '../standard/index.mjs';
3
+ import { a as ClientContext, C as ClientOptionsOut, b as ClientLink } from '../../shared/client.45nqoGFI.mjs';
4
+ import { b as StandardLinkClient } from '../../shared/client.CS0uVV6J.mjs';
5
+ import { StandardRPCLinkOptions } from '../standard/index.mjs';
5
6
  import '@orpc/shared';
6
7
 
7
8
  interface LinkFetchClientOptions<T extends ClientContext> extends ToFetchRequestOptions {
@@ -14,7 +15,7 @@ declare class LinkFetchClient<T extends ClientContext> implements StandardLinkCl
14
15
  call(request: StandardRequest, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<StandardLazyResponse>;
15
16
  }
16
17
 
17
- interface RPCLinkOptions<T extends ClientContext> extends StandardLinkOptions<T>, StandardRPCLinkCodecOptions<T>, LinkFetchClientOptions<T> {
18
+ interface RPCLinkOptions<T extends ClientContext> extends StandardRPCLinkOptions<T>, LinkFetchClientOptions<T> {
18
19
  }
19
20
  declare class RPCLink<T extends ClientContext> implements ClientLink<T> {
20
21
  private readonly standardLink;
@@ -1,7 +1,8 @@
1
1
  import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
2
2
  import { ToFetchRequestOptions } from '@orpc/standard-server-fetch';
3
- import { C as ClientContext, a as ClientOptionsOut, b as ClientLink } from '../../shared/client.D_CzLDyB.js';
4
- import { StandardLinkClient, StandardLinkOptions, StandardRPCLinkCodecOptions } from '../standard/index.js';
3
+ import { a as ClientContext, C as ClientOptionsOut, b as ClientLink } from '../../shared/client.45nqoGFI.js';
4
+ import { b as StandardLinkClient } from '../../shared/client.CmE0kcXu.js';
5
+ import { StandardRPCLinkOptions } from '../standard/index.js';
5
6
  import '@orpc/shared';
6
7
 
7
8
  interface LinkFetchClientOptions<T extends ClientContext> extends ToFetchRequestOptions {
@@ -14,7 +15,7 @@ declare class LinkFetchClient<T extends ClientContext> implements StandardLinkCl
14
15
  call(request: StandardRequest, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<StandardLazyResponse>;
15
16
  }
16
17
 
17
- interface RPCLinkOptions<T extends ClientContext> extends StandardLinkOptions<T>, StandardRPCLinkCodecOptions<T>, LinkFetchClientOptions<T> {
18
+ interface RPCLinkOptions<T extends ClientContext> extends StandardRPCLinkOptions<T>, LinkFetchClientOptions<T> {
18
19
  }
19
20
  declare class RPCLink<T extends ClientContext> implements ClientLink<T> {
20
21
  private readonly standardLink;
@@ -1,8 +1,9 @@
1
1
  import { toFetchRequest, toStandardLazyResponse } from '@orpc/standard-server-fetch';
2
- import { a as StandardRPCLinkCodec, b as RPCSerializer, S as StandardLink } from '../../shared/client.Df5pd75N.mjs';
2
+ import { b as StandardRPCJsonSerializer, c as StandardRPCLinkCodec, d as StandardRPCSerializer, S as StandardLink } from '../../shared/client.cZd8JfIk.mjs';
3
3
  import '@orpc/shared';
4
4
  import '../../shared/client.XAn8cDTM.mjs';
5
5
  import '@orpc/standard-server';
6
+ import '../../shared/client.CvnV7_uV.mjs';
6
7
 
7
8
  class LinkFetchClient {
8
9
  fetch;
@@ -22,7 +23,8 @@ class LinkFetchClient {
22
23
  class RPCLink {
23
24
  standardLink;
24
25
  constructor(options) {
25
- const serializer = new RPCSerializer();
26
+ const jsonSerializer = new StandardRPCJsonSerializer(options);
27
+ const serializer = new StandardRPCSerializer(jsonSerializer);
26
28
  const linkCodec = new StandardRPCLinkCodec(serializer, options);
27
29
  const linkClient = new LinkFetchClient(options);
28
30
  this.standardLink = new StandardLink(linkCodec, linkClient, options);
@@ -1,88 +1,42 @@
1
- import { Value, Interceptor, Segment } from '@orpc/shared';
2
- import { StandardRequest, StandardLazyResponse, StandardHeaders } from '@orpc/standard-server';
3
- import { C as ClientContext, a as ClientOptionsOut, E as EventIteratorReconnectOptions, b as ClientLink } from '../../shared/client.D_CzLDyB.mjs';
1
+ import { c as StandardLinkCodec, S as StandardLinkOptions } from '../../shared/client.CS0uVV6J.mjs';
2
+ export { I as InvalidEventIteratorRetryResponse, d as StandardLink, b as StandardLinkClient } from '../../shared/client.CS0uVV6J.mjs';
3
+ import { Segment, Value } from '@orpc/shared';
4
+ import { a as ClientContext, C as ClientOptionsOut } from '../../shared/client.45nqoGFI.mjs';
5
+ import { StandardHeaders, StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
4
6
 
5
- interface StandardLinkCodec<T extends ClientContext> {
6
- encode(path: readonly string[], input: unknown, options: ClientOptionsOut<any>): Promise<StandardRequest>;
7
- decode(response: StandardLazyResponse, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<unknown>;
8
- }
9
- interface StandardLinkClient<T extends ClientContext> {
10
- call(request: StandardRequest, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<StandardLazyResponse>;
11
- }
12
-
13
- declare class InvalidEventIteratorRetryResponse extends Error {
14
- }
15
- interface StandardLinkOptions<T extends ClientContext> {
16
- /**
17
- * Maximum number of retry attempts for event iterator errors before throwing.
18
- *
19
- * @default 5
20
- */
21
- eventIteratorMaxRetries?: Value<number, [
22
- reconnectOptions: EventIteratorReconnectOptions,
23
- options: ClientOptionsOut<T>,
24
- path: readonly string[],
25
- input: unknown
26
- ]>;
27
- /**
28
- * Delay (in ms) before retrying an event iterator call.
29
- *
30
- * @default (o) => o.lastRetry ?? (1000 * 2 ** o.retryTimes)
31
- */
32
- eventIteratorRetryDelay?: Value<number, [
33
- reconnectOptions: EventIteratorReconnectOptions,
34
- options: ClientOptionsOut<T>,
35
- path: readonly string[],
36
- input: unknown
37
- ]>;
38
- /**
39
- * Function to determine if an error is retryable.
40
- *
41
- * @default true
42
- */
43
- eventIteratorShouldRetry?: Value<boolean, [
44
- reconnectOptions: EventIteratorReconnectOptions,
45
- options: ClientOptionsOut<T>,
46
- path: readonly string[],
47
- input: unknown
48
- ]>;
49
- interceptors?: Interceptor<{
50
- path: readonly string[];
51
- input: unknown;
52
- options: ClientOptionsOut<T>;
53
- }, unknown, unknown>[];
54
- clientInterceptors?: Interceptor<{
55
- request: StandardRequest;
56
- }, StandardLazyResponse, unknown>[];
7
+ declare const STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES: {
8
+ readonly BIGINT: 0;
9
+ readonly DATE: 1;
10
+ readonly NAN: 2;
11
+ readonly UNDEFINED: 3;
12
+ readonly URL: 4;
13
+ readonly REGEXP: 5;
14
+ readonly SET: 6;
15
+ readonly MAP: 7;
16
+ };
17
+ type StandardRPCJsonSerializedMetaItem = readonly [type: number, ...path: Segment[]];
18
+ type StandardRPCJsonSerialized = [json: unknown, meta: StandardRPCJsonSerializedMetaItem[], maps: Segment[][], blobs: Blob[]];
19
+ interface StandardRPCCustomJsonSerializer {
20
+ type: number;
21
+ condition(data: unknown): boolean;
22
+ serialize(data: any): unknown;
23
+ deserialize(serialized: any): unknown;
57
24
  }
58
- declare class StandardLink<T extends ClientContext> implements ClientLink<T> {
59
- #private;
60
- readonly codec: StandardLinkCodec<T>;
61
- readonly sender: StandardLinkClient<T>;
62
- private readonly eventIteratorMaxRetries;
63
- private readonly eventIteratorRetryDelay;
64
- private readonly eventIteratorShouldRetry;
65
- private readonly interceptors;
66
- private readonly clientInterceptors;
67
- constructor(codec: StandardLinkCodec<T>, sender: StandardLinkClient<T>, options: StandardLinkOptions<T>);
68
- call(path: readonly string[], input: unknown, options: ClientOptionsOut<T>): Promise<unknown>;
25
+ interface StandardRPCJsonSerializerOptions {
26
+ customJsonSerializers?: readonly StandardRPCCustomJsonSerializer[];
69
27
  }
70
-
71
- type RPCJsonSerializedMeta = [
72
- 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7,
73
- Segment[]
74
- ][];
75
- type RPCJsonSerialized = [json: unknown, meta: RPCJsonSerializedMeta, maps: Segment[][], blobs: Blob[]];
76
- declare class RPCJsonSerializer {
77
- serialize(data: unknown, segments?: Segment[], meta?: RPCJsonSerializedMeta, maps?: Segment[][], blobs?: Blob[]): RPCJsonSerialized;
78
- deserialize(json: unknown, meta: RPCJsonSerializedMeta): unknown;
79
- deserialize(json: unknown, meta: RPCJsonSerializedMeta, maps: Segment[][], getBlob: (index: number) => Blob): unknown;
28
+ declare class StandardRPCJsonSerializer {
29
+ private readonly customSerializers;
30
+ constructor(options?: StandardRPCJsonSerializerOptions);
31
+ serialize(data: unknown, segments?: Segment[], meta?: StandardRPCJsonSerializedMetaItem[], maps?: Segment[][], blobs?: Blob[]): StandardRPCJsonSerialized;
32
+ deserialize(json: unknown, meta: readonly StandardRPCJsonSerializedMetaItem[]): unknown;
33
+ deserialize(json: unknown, meta: readonly StandardRPCJsonSerializedMetaItem[], maps: readonly Segment[][], getBlob: (index: number) => Blob): unknown;
80
34
  }
81
35
 
82
- declare class RPCSerializer {
36
+ declare class StandardRPCSerializer {
83
37
  #private;
84
38
  private readonly jsonSerializer;
85
- constructor(jsonSerializer?: RPCJsonSerializer);
39
+ constructor(jsonSerializer: StandardRPCJsonSerializer);
86
40
  serialize(data: unknown): unknown;
87
41
  deserialize(data: unknown): unknown;
88
42
  }
@@ -140,9 +94,12 @@ declare class StandardRPCLinkCodec<T extends ClientContext> implements StandardL
140
94
  private readonly fallbackMethod;
141
95
  private readonly expectedMethod;
142
96
  private readonly headers;
143
- constructor(serializer: RPCSerializer, options: StandardRPCLinkCodecOptions<T>);
97
+ constructor(serializer: StandardRPCSerializer, options: StandardRPCLinkCodecOptions<T>);
144
98
  encode(path: readonly string[], input: unknown, options: ClientOptionsOut<any>): Promise<StandardRequest>;
145
99
  decode(response: StandardLazyResponse): Promise<unknown>;
146
100
  }
147
101
 
148
- export { InvalidEventIteratorRetryResponse, type RPCJsonSerialized, type RPCJsonSerializedMeta, RPCJsonSerializer, RPCSerializer, StandardLink, type StandardLinkClient, type StandardLinkCodec, type StandardLinkOptions, StandardRPCLinkCodec, type StandardRPCLinkCodecOptions };
102
+ interface StandardRPCLinkOptions<T extends ClientContext> extends StandardLinkOptions<T>, StandardRPCLinkCodecOptions<T>, StandardRPCJsonSerializerOptions {
103
+ }
104
+
105
+ export { STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, StandardLinkCodec, StandardLinkOptions, type StandardRPCCustomJsonSerializer, type StandardRPCJsonSerialized, type StandardRPCJsonSerializedMetaItem, StandardRPCJsonSerializer, type StandardRPCJsonSerializerOptions, StandardRPCLinkCodec, type StandardRPCLinkCodecOptions, type StandardRPCLinkOptions, StandardRPCSerializer };
@@ -1,88 +1,42 @@
1
- import { Value, Interceptor, Segment } from '@orpc/shared';
2
- import { StandardRequest, StandardLazyResponse, StandardHeaders } from '@orpc/standard-server';
3
- import { C as ClientContext, a as ClientOptionsOut, E as EventIteratorReconnectOptions, b as ClientLink } from '../../shared/client.D_CzLDyB.js';
1
+ import { c as StandardLinkCodec, S as StandardLinkOptions } from '../../shared/client.CmE0kcXu.js';
2
+ export { I as InvalidEventIteratorRetryResponse, d as StandardLink, b as StandardLinkClient } from '../../shared/client.CmE0kcXu.js';
3
+ import { Segment, Value } from '@orpc/shared';
4
+ import { a as ClientContext, C as ClientOptionsOut } from '../../shared/client.45nqoGFI.js';
5
+ import { StandardHeaders, StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
4
6
 
5
- interface StandardLinkCodec<T extends ClientContext> {
6
- encode(path: readonly string[], input: unknown, options: ClientOptionsOut<any>): Promise<StandardRequest>;
7
- decode(response: StandardLazyResponse, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<unknown>;
8
- }
9
- interface StandardLinkClient<T extends ClientContext> {
10
- call(request: StandardRequest, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<StandardLazyResponse>;
11
- }
12
-
13
- declare class InvalidEventIteratorRetryResponse extends Error {
14
- }
15
- interface StandardLinkOptions<T extends ClientContext> {
16
- /**
17
- * Maximum number of retry attempts for event iterator errors before throwing.
18
- *
19
- * @default 5
20
- */
21
- eventIteratorMaxRetries?: Value<number, [
22
- reconnectOptions: EventIteratorReconnectOptions,
23
- options: ClientOptionsOut<T>,
24
- path: readonly string[],
25
- input: unknown
26
- ]>;
27
- /**
28
- * Delay (in ms) before retrying an event iterator call.
29
- *
30
- * @default (o) => o.lastRetry ?? (1000 * 2 ** o.retryTimes)
31
- */
32
- eventIteratorRetryDelay?: Value<number, [
33
- reconnectOptions: EventIteratorReconnectOptions,
34
- options: ClientOptionsOut<T>,
35
- path: readonly string[],
36
- input: unknown
37
- ]>;
38
- /**
39
- * Function to determine if an error is retryable.
40
- *
41
- * @default true
42
- */
43
- eventIteratorShouldRetry?: Value<boolean, [
44
- reconnectOptions: EventIteratorReconnectOptions,
45
- options: ClientOptionsOut<T>,
46
- path: readonly string[],
47
- input: unknown
48
- ]>;
49
- interceptors?: Interceptor<{
50
- path: readonly string[];
51
- input: unknown;
52
- options: ClientOptionsOut<T>;
53
- }, unknown, unknown>[];
54
- clientInterceptors?: Interceptor<{
55
- request: StandardRequest;
56
- }, StandardLazyResponse, unknown>[];
7
+ declare const STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES: {
8
+ readonly BIGINT: 0;
9
+ readonly DATE: 1;
10
+ readonly NAN: 2;
11
+ readonly UNDEFINED: 3;
12
+ readonly URL: 4;
13
+ readonly REGEXP: 5;
14
+ readonly SET: 6;
15
+ readonly MAP: 7;
16
+ };
17
+ type StandardRPCJsonSerializedMetaItem = readonly [type: number, ...path: Segment[]];
18
+ type StandardRPCJsonSerialized = [json: unknown, meta: StandardRPCJsonSerializedMetaItem[], maps: Segment[][], blobs: Blob[]];
19
+ interface StandardRPCCustomJsonSerializer {
20
+ type: number;
21
+ condition(data: unknown): boolean;
22
+ serialize(data: any): unknown;
23
+ deserialize(serialized: any): unknown;
57
24
  }
58
- declare class StandardLink<T extends ClientContext> implements ClientLink<T> {
59
- #private;
60
- readonly codec: StandardLinkCodec<T>;
61
- readonly sender: StandardLinkClient<T>;
62
- private readonly eventIteratorMaxRetries;
63
- private readonly eventIteratorRetryDelay;
64
- private readonly eventIteratorShouldRetry;
65
- private readonly interceptors;
66
- private readonly clientInterceptors;
67
- constructor(codec: StandardLinkCodec<T>, sender: StandardLinkClient<T>, options: StandardLinkOptions<T>);
68
- call(path: readonly string[], input: unknown, options: ClientOptionsOut<T>): Promise<unknown>;
25
+ interface StandardRPCJsonSerializerOptions {
26
+ customJsonSerializers?: readonly StandardRPCCustomJsonSerializer[];
69
27
  }
70
-
71
- type RPCJsonSerializedMeta = [
72
- 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7,
73
- Segment[]
74
- ][];
75
- type RPCJsonSerialized = [json: unknown, meta: RPCJsonSerializedMeta, maps: Segment[][], blobs: Blob[]];
76
- declare class RPCJsonSerializer {
77
- serialize(data: unknown, segments?: Segment[], meta?: RPCJsonSerializedMeta, maps?: Segment[][], blobs?: Blob[]): RPCJsonSerialized;
78
- deserialize(json: unknown, meta: RPCJsonSerializedMeta): unknown;
79
- deserialize(json: unknown, meta: RPCJsonSerializedMeta, maps: Segment[][], getBlob: (index: number) => Blob): unknown;
28
+ declare class StandardRPCJsonSerializer {
29
+ private readonly customSerializers;
30
+ constructor(options?: StandardRPCJsonSerializerOptions);
31
+ serialize(data: unknown, segments?: Segment[], meta?: StandardRPCJsonSerializedMetaItem[], maps?: Segment[][], blobs?: Blob[]): StandardRPCJsonSerialized;
32
+ deserialize(json: unknown, meta: readonly StandardRPCJsonSerializedMetaItem[]): unknown;
33
+ deserialize(json: unknown, meta: readonly StandardRPCJsonSerializedMetaItem[], maps: readonly Segment[][], getBlob: (index: number) => Blob): unknown;
80
34
  }
81
35
 
82
- declare class RPCSerializer {
36
+ declare class StandardRPCSerializer {
83
37
  #private;
84
38
  private readonly jsonSerializer;
85
- constructor(jsonSerializer?: RPCJsonSerializer);
39
+ constructor(jsonSerializer: StandardRPCJsonSerializer);
86
40
  serialize(data: unknown): unknown;
87
41
  deserialize(data: unknown): unknown;
88
42
  }
@@ -140,9 +94,12 @@ declare class StandardRPCLinkCodec<T extends ClientContext> implements StandardL
140
94
  private readonly fallbackMethod;
141
95
  private readonly expectedMethod;
142
96
  private readonly headers;
143
- constructor(serializer: RPCSerializer, options: StandardRPCLinkCodecOptions<T>);
97
+ constructor(serializer: StandardRPCSerializer, options: StandardRPCLinkCodecOptions<T>);
144
98
  encode(path: readonly string[], input: unknown, options: ClientOptionsOut<any>): Promise<StandardRequest>;
145
99
  decode(response: StandardLazyResponse): Promise<unknown>;
146
100
  }
147
101
 
148
- export { InvalidEventIteratorRetryResponse, type RPCJsonSerialized, type RPCJsonSerializedMeta, RPCJsonSerializer, RPCSerializer, StandardLink, type StandardLinkClient, type StandardLinkCodec, type StandardLinkOptions, StandardRPCLinkCodec, type StandardRPCLinkCodecOptions };
102
+ interface StandardRPCLinkOptions<T extends ClientContext> extends StandardLinkOptions<T>, StandardRPCLinkCodecOptions<T>, StandardRPCJsonSerializerOptions {
103
+ }
104
+
105
+ export { STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, StandardLinkCodec, StandardLinkOptions, type StandardRPCCustomJsonSerializer, type StandardRPCJsonSerialized, type StandardRPCJsonSerializedMetaItem, StandardRPCJsonSerializer, type StandardRPCJsonSerializerOptions, StandardRPCLinkCodec, type StandardRPCLinkCodecOptions, type StandardRPCLinkOptions, StandardRPCSerializer };
@@ -1,4 +1,5 @@
1
- export { I as InvalidEventIteratorRetryResponse, R as RPCJsonSerializer, b as RPCSerializer, S as StandardLink, a as StandardRPCLinkCodec } from '../../shared/client.Df5pd75N.mjs';
1
+ export { I as InvalidEventIteratorRetryResponse, a as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, S as StandardLink, b as StandardRPCJsonSerializer, c as StandardRPCLinkCodec, d as StandardRPCSerializer } from '../../shared/client.cZd8JfIk.mjs';
2
2
  import '@orpc/shared';
3
3
  import '../../shared/client.XAn8cDTM.mjs';
4
4
  import '@orpc/standard-server';
5
+ import '../../shared/client.CvnV7_uV.mjs';
package/dist/index.d.mts CHANGED
@@ -1,6 +1,7 @@
1
- import { N as NestedClient, b as ClientLink, I as InferClientContext, C as ClientContext, a as ClientOptionsOut, c as ClientPromiseResult } from './shared/client.D_CzLDyB.mjs';
2
- export { g as Client, e as ClientOptions, f as ClientRest, E as EventIteratorReconnectOptions, d as createAutoRetryEventIterator, m as mapEventIterator } from './shared/client.D_CzLDyB.mjs';
1
+ import { N as NestedClient, b as ClientLink, I as InferClientContext, a as ClientContext, C as ClientOptionsOut, c as ClientPromiseResult } from './shared/client.45nqoGFI.mjs';
2
+ export { g as Client, e as ClientOptions, f as ClientRest, E as EventIteratorReconnectOptions, d as createAutoRetryEventIterator, m as mapEventIterator } from './shared/client.45nqoGFI.mjs';
3
3
  import { Promisable, MaybeOptionalOptions } from '@orpc/shared';
4
+ export { onError, onFinish, onStart, onSuccess } from '@orpc/shared';
4
5
  export { ErrorEvent } from '@orpc/standard-server';
5
6
 
6
7
  interface createORPCClientOptions {
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { N as NestedClient, b as ClientLink, I as InferClientContext, C as ClientContext, a as ClientOptionsOut, c as ClientPromiseResult } from './shared/client.D_CzLDyB.js';
2
- export { g as Client, e as ClientOptions, f as ClientRest, E as EventIteratorReconnectOptions, d as createAutoRetryEventIterator, m as mapEventIterator } from './shared/client.D_CzLDyB.js';
1
+ import { N as NestedClient, b as ClientLink, I as InferClientContext, a as ClientContext, C as ClientOptionsOut, c as ClientPromiseResult } from './shared/client.45nqoGFI.js';
2
+ export { g as Client, e as ClientOptions, f as ClientRest, E as EventIteratorReconnectOptions, d as createAutoRetryEventIterator, m as mapEventIterator } from './shared/client.45nqoGFI.js';
3
3
  import { Promisable, MaybeOptionalOptions } from '@orpc/shared';
4
+ export { onError, onFinish, onStart, onSuccess } from '@orpc/shared';
4
5
  export { ErrorEvent } from '@orpc/standard-server';
5
6
 
6
7
  interface createORPCClientOptions {
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { i as isDefinedError } from './shared/client.XAn8cDTM.mjs';
2
2
  export { C as COMMON_ORPC_ERROR_DEFS, O as ORPCError, c as createAutoRetryEventIterator, a as fallbackORPCErrorMessage, f as fallbackORPCErrorStatus, m as mapEventIterator, o as onEventIteratorStatusChange, r as registerEventIteratorState, t as toORPCError, u as updateEventIteratorStatus } from './shared/client.XAn8cDTM.mjs';
3
+ export { onError, onFinish, onStart, onSuccess } from '@orpc/shared';
3
4
  export { ErrorEvent } from '@orpc/standard-server';
4
- import '@orpc/shared';
5
5
 
6
6
  function createORPCClient(link, options) {
7
7
  const path = options?.path ?? [];
@@ -0,0 +1,62 @@
1
+ import { C as ClientPlugin, S as StandardLinkOptions } from '../shared/client.CS0uVV6J.mjs';
2
+ export { a as CompositeClientPlugin } from '../shared/client.CS0uVV6J.mjs';
3
+ import { Value } from '@orpc/shared';
4
+ import { C as ClientOptionsOut, a as ClientContext } from '../shared/client.45nqoGFI.mjs';
5
+ import '@orpc/standard-server';
6
+
7
+ interface ClientRetryPluginAttemptOptions {
8
+ eventIteratorLastRetry: number | undefined;
9
+ eventIteratorLastEventId: string | undefined;
10
+ attemptIndex: number;
11
+ error: unknown;
12
+ }
13
+ interface ClientRetryPluginContext {
14
+ /**
15
+ * Maximum retry attempts before throwing
16
+ * Use `Number.POSITIVE_INFINITY` for infinite retries (e.g., when handling Server-Sent Events).
17
+ *
18
+ * @default 0
19
+ */
20
+ retry?: number;
21
+ /**
22
+ * Delay (in ms) before retrying.
23
+ *
24
+ * @default (o) => o.eventIteratorLastRetry ?? 2000
25
+ */
26
+ retryDelay?: Value<number, [
27
+ attemptOptions: ClientRetryPluginAttemptOptions,
28
+ clientOptions: ClientOptionsOut<ClientRetryPluginContext>,
29
+ path: readonly string[],
30
+ input: unknown
31
+ ]>;
32
+ /**
33
+ * Determine should retry or not.
34
+ *
35
+ * @default true
36
+ */
37
+ shouldRetry?: Value<boolean, [
38
+ attemptOptions: ClientRetryPluginAttemptOptions,
39
+ clientOptions: ClientOptionsOut<ClientRetryPluginContext>,
40
+ path: readonly string[],
41
+ input: unknown
42
+ ]>;
43
+ /**
44
+ * The hook called when retrying, and return the unsubscribe function.
45
+ */
46
+ onRetry?: (options: ClientRetryPluginAttemptOptions, clientOptions: ClientOptionsOut<ClientRetryPluginContext>, path: readonly string[], input: unknown) => void | (() => void);
47
+ }
48
+ declare class ClientRetryPluginInvalidEventIteratorRetryResponse extends Error {
49
+ }
50
+ interface ClientRetryPluginOptions {
51
+ default?: ClientRetryPluginContext;
52
+ }
53
+ declare class ClientRetryPlugin<T extends ClientContext & ClientRetryPluginContext> implements ClientPlugin<T> {
54
+ private readonly defaultRetry;
55
+ private readonly defaultRetryDelay;
56
+ private readonly defaultShouldRetry;
57
+ private readonly defaultOnRetry;
58
+ constructor(options?: ClientRetryPluginOptions);
59
+ init(options: StandardLinkOptions<T>): void;
60
+ }
61
+
62
+ export { ClientPlugin, ClientRetryPlugin, type ClientRetryPluginAttemptOptions, type ClientRetryPluginContext, ClientRetryPluginInvalidEventIteratorRetryResponse, type ClientRetryPluginOptions };
@@ -0,0 +1,62 @@
1
+ import { C as ClientPlugin, S as StandardLinkOptions } from '../shared/client.CmE0kcXu.js';
2
+ export { a as CompositeClientPlugin } from '../shared/client.CmE0kcXu.js';
3
+ import { Value } from '@orpc/shared';
4
+ import { C as ClientOptionsOut, a as ClientContext } from '../shared/client.45nqoGFI.js';
5
+ import '@orpc/standard-server';
6
+
7
+ interface ClientRetryPluginAttemptOptions {
8
+ eventIteratorLastRetry: number | undefined;
9
+ eventIteratorLastEventId: string | undefined;
10
+ attemptIndex: number;
11
+ error: unknown;
12
+ }
13
+ interface ClientRetryPluginContext {
14
+ /**
15
+ * Maximum retry attempts before throwing
16
+ * Use `Number.POSITIVE_INFINITY` for infinite retries (e.g., when handling Server-Sent Events).
17
+ *
18
+ * @default 0
19
+ */
20
+ retry?: number;
21
+ /**
22
+ * Delay (in ms) before retrying.
23
+ *
24
+ * @default (o) => o.eventIteratorLastRetry ?? 2000
25
+ */
26
+ retryDelay?: Value<number, [
27
+ attemptOptions: ClientRetryPluginAttemptOptions,
28
+ clientOptions: ClientOptionsOut<ClientRetryPluginContext>,
29
+ path: readonly string[],
30
+ input: unknown
31
+ ]>;
32
+ /**
33
+ * Determine should retry or not.
34
+ *
35
+ * @default true
36
+ */
37
+ shouldRetry?: Value<boolean, [
38
+ attemptOptions: ClientRetryPluginAttemptOptions,
39
+ clientOptions: ClientOptionsOut<ClientRetryPluginContext>,
40
+ path: readonly string[],
41
+ input: unknown
42
+ ]>;
43
+ /**
44
+ * The hook called when retrying, and return the unsubscribe function.
45
+ */
46
+ onRetry?: (options: ClientRetryPluginAttemptOptions, clientOptions: ClientOptionsOut<ClientRetryPluginContext>, path: readonly string[], input: unknown) => void | (() => void);
47
+ }
48
+ declare class ClientRetryPluginInvalidEventIteratorRetryResponse extends Error {
49
+ }
50
+ interface ClientRetryPluginOptions {
51
+ default?: ClientRetryPluginContext;
52
+ }
53
+ declare class ClientRetryPlugin<T extends ClientContext & ClientRetryPluginContext> implements ClientPlugin<T> {
54
+ private readonly defaultRetry;
55
+ private readonly defaultRetryDelay;
56
+ private readonly defaultShouldRetry;
57
+ private readonly defaultOnRetry;
58
+ constructor(options?: ClientRetryPluginOptions);
59
+ init(options: StandardLinkOptions<T>): void;
60
+ }
61
+
62
+ export { ClientPlugin, ClientRetryPlugin, type ClientRetryPluginAttemptOptions, type ClientRetryPluginContext, ClientRetryPluginInvalidEventIteratorRetryResponse, type ClientRetryPluginOptions };
@@ -0,0 +1,127 @@
1
+ export { C as CompositeClientPlugin } from '../shared/client.CvnV7_uV.mjs';
2
+ import { isAsyncIteratorObject, value } from '@orpc/shared';
3
+ import { getEventMeta } from '@orpc/standard-server';
4
+
5
+ class ClientRetryPluginInvalidEventIteratorRetryResponse extends Error {
6
+ }
7
+ class ClientRetryPlugin {
8
+ defaultRetry;
9
+ defaultRetryDelay;
10
+ defaultShouldRetry;
11
+ defaultOnRetry;
12
+ constructor(options = {}) {
13
+ this.defaultRetry = options.default?.retry ?? 0;
14
+ this.defaultRetryDelay = options.default?.retryDelay ?? ((o) => o.eventIteratorLastRetry ?? 2e3);
15
+ this.defaultShouldRetry = options.default?.shouldRetry ?? true;
16
+ this.defaultOnRetry = options.default?.onRetry;
17
+ }
18
+ init(options) {
19
+ options.interceptors ??= [];
20
+ options.interceptors.push(async (interceptorOptions) => {
21
+ const maxAttempts = interceptorOptions.options.context.retry ?? this.defaultRetry;
22
+ const retryDelay = interceptorOptions.options.context.retryDelay ?? this.defaultRetryDelay;
23
+ const shouldRetry = interceptorOptions.options.context.shouldRetry ?? this.defaultShouldRetry;
24
+ const onRetry = interceptorOptions.options.context.onRetry ?? this.defaultOnRetry;
25
+ if (maxAttempts <= 0) {
26
+ return interceptorOptions.next();
27
+ }
28
+ let eventIteratorLastEventId = interceptorOptions.options.lastEventId;
29
+ let eventIteratorLastRetry;
30
+ let unsubscribe;
31
+ let attemptIndex = 0;
32
+ const next = async (initial) => {
33
+ let current = initial;
34
+ while (true) {
35
+ if (current) {
36
+ if (attemptIndex >= maxAttempts) {
37
+ throw current.error;
38
+ }
39
+ const attemptOptions = {
40
+ attemptIndex,
41
+ error: current.error,
42
+ eventIteratorLastEventId,
43
+ eventIteratorLastRetry
44
+ };
45
+ const shouldRetryBool = await value(
46
+ shouldRetry,
47
+ attemptOptions,
48
+ interceptorOptions.options,
49
+ interceptorOptions.path,
50
+ interceptorOptions.input
51
+ );
52
+ if (!shouldRetryBool) {
53
+ throw current.error;
54
+ }
55
+ unsubscribe = onRetry?.(
56
+ attemptOptions,
57
+ interceptorOptions.options,
58
+ interceptorOptions.path,
59
+ interceptorOptions.input
60
+ );
61
+ const retryDelayMs = await value(
62
+ retryDelay,
63
+ attemptOptions,
64
+ interceptorOptions.options,
65
+ interceptorOptions.path,
66
+ interceptorOptions.input
67
+ );
68
+ await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
69
+ attemptIndex++;
70
+ }
71
+ try {
72
+ const newClientOptions = { ...interceptorOptions.options, lastEventId: eventIteratorLastEventId };
73
+ const output2 = await interceptorOptions.next({
74
+ ...interceptorOptions,
75
+ options: newClientOptions
76
+ });
77
+ return output2;
78
+ } catch (error) {
79
+ if (interceptorOptions.options.signal?.aborted === true) {
80
+ throw error;
81
+ }
82
+ current = { error };
83
+ } finally {
84
+ unsubscribe?.();
85
+ unsubscribe = void 0;
86
+ }
87
+ }
88
+ };
89
+ const output = await next();
90
+ if (!isAsyncIteratorObject(output)) {
91
+ return output;
92
+ }
93
+ return async function* () {
94
+ let current = output;
95
+ try {
96
+ while (true) {
97
+ try {
98
+ const item = await current.next();
99
+ const meta = getEventMeta(item.value);
100
+ eventIteratorLastEventId = meta?.id ?? eventIteratorLastEventId;
101
+ eventIteratorLastRetry = meta?.retry ?? eventIteratorLastRetry;
102
+ if (item.done) {
103
+ return item.value;
104
+ }
105
+ yield item.value;
106
+ } catch (error) {
107
+ const meta = getEventMeta(error);
108
+ eventIteratorLastEventId = meta?.id ?? eventIteratorLastEventId;
109
+ eventIteratorLastRetry = meta?.retry ?? eventIteratorLastRetry;
110
+ const maybeEventIterator = await next({ error });
111
+ if (!isAsyncIteratorObject(maybeEventIterator)) {
112
+ throw new ClientRetryPluginInvalidEventIteratorRetryResponse(
113
+ "RetryPlugin: Expected an Event Iterator, got a non-Event Iterator"
114
+ );
115
+ }
116
+ current = maybeEventIterator;
117
+ }
118
+ }
119
+ } finally {
120
+ await current.return?.();
121
+ }
122
+ }();
123
+ });
124
+ }
125
+ }
126
+
127
+ export { ClientRetryPlugin, ClientRetryPluginInvalidEventIteratorRetryResponse };
@@ -39,4 +39,4 @@ interface EventIteratorReconnectOptions {
39
39
  }
40
40
  declare function createAutoRetryEventIterator<TYield, TReturn>(initial: AsyncIterator<TYield, TReturn, void>, reconnect: (options: EventIteratorReconnectOptions) => Promise<AsyncIterator<TYield, TReturn, void> | null>, initialLastEventId: string | undefined): AsyncGenerator<TYield, TReturn, void>;
41
41
 
42
- export { type ClientContext as C, type EventIteratorReconnectOptions as E, type InferClientContext as I, type NestedClient as N, type ClientOptionsOut as a, type ClientLink as b, type ClientPromiseResult as c, createAutoRetryEventIterator as d, type ClientOptions as e, type ClientRest as f, type Client as g, mapEventIterator as m };
42
+ export { type ClientOptionsOut as C, type EventIteratorReconnectOptions as E, type InferClientContext as I, type NestedClient as N, type ClientContext as a, type ClientLink as b, type ClientPromiseResult as c, createAutoRetryEventIterator as d, type ClientOptions as e, type ClientRest as f, type Client as g, mapEventIterator as m };
@@ -39,4 +39,4 @@ interface EventIteratorReconnectOptions {
39
39
  }
40
40
  declare function createAutoRetryEventIterator<TYield, TReturn>(initial: AsyncIterator<TYield, TReturn, void>, reconnect: (options: EventIteratorReconnectOptions) => Promise<AsyncIterator<TYield, TReturn, void> | null>, initialLastEventId: string | undefined): AsyncGenerator<TYield, TReturn, void>;
41
41
 
42
- export { type ClientContext as C, type EventIteratorReconnectOptions as E, type InferClientContext as I, type NestedClient as N, type ClientOptionsOut as a, type ClientLink as b, type ClientPromiseResult as c, createAutoRetryEventIterator as d, type ClientOptions as e, type ClientRest as f, type Client as g, mapEventIterator as m };
42
+ export { type ClientOptionsOut as C, type EventIteratorReconnectOptions as E, type InferClientContext as I, type NestedClient as N, type ClientContext as a, type ClientLink as b, type ClientPromiseResult as c, createAutoRetryEventIterator as d, type ClientOptions as e, type ClientRest as f, type Client as g, mapEventIterator as m };
@@ -0,0 +1,81 @@
1
+ import { Value, Interceptor } from '@orpc/shared';
2
+ import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
3
+ import { a as ClientContext, C as ClientOptionsOut, E as EventIteratorReconnectOptions, b as ClientLink } from './client.45nqoGFI.mjs';
4
+
5
+ interface StandardLinkCodec<T extends ClientContext> {
6
+ encode(path: readonly string[], input: unknown, options: ClientOptionsOut<any>): Promise<StandardRequest>;
7
+ decode(response: StandardLazyResponse, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<unknown>;
8
+ }
9
+ interface StandardLinkClient<T extends ClientContext> {
10
+ call(request: StandardRequest, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<StandardLazyResponse>;
11
+ }
12
+
13
+ declare class InvalidEventIteratorRetryResponse extends Error {
14
+ }
15
+ interface StandardLinkOptions<T extends ClientContext> {
16
+ /**
17
+ * Maximum retry attempts for **consecutive failures** before throwing
18
+ *
19
+ * @default 5
20
+ */
21
+ eventIteratorMaxRetries?: Value<number, [
22
+ reconnectOptions: EventIteratorReconnectOptions,
23
+ options: ClientOptionsOut<T>,
24
+ path: readonly string[],
25
+ input: unknown
26
+ ]>;
27
+ /**
28
+ * Delay (in ms) before retrying an event iterator call.
29
+ *
30
+ * @default (o) => o.lastRetry ?? (1000 * 2 ** o.retryTimes)
31
+ */
32
+ eventIteratorRetryDelay?: Value<number, [
33
+ reconnectOptions: EventIteratorReconnectOptions,
34
+ options: ClientOptionsOut<T>,
35
+ path: readonly string[],
36
+ input: unknown
37
+ ]>;
38
+ /**
39
+ * Function to determine if an error is retryable.
40
+ *
41
+ * @default true
42
+ */
43
+ eventIteratorShouldRetry?: Value<boolean, [
44
+ reconnectOptions: EventIteratorReconnectOptions,
45
+ options: ClientOptionsOut<T>,
46
+ path: readonly string[],
47
+ input: unknown
48
+ ]>;
49
+ interceptors?: Interceptor<{
50
+ path: readonly string[];
51
+ input: unknown;
52
+ options: ClientOptionsOut<T>;
53
+ }, unknown, unknown>[];
54
+ clientInterceptors?: Interceptor<{
55
+ request: StandardRequest;
56
+ }, StandardLazyResponse, unknown>[];
57
+ plugins?: ClientPlugin<T>[];
58
+ }
59
+ declare class StandardLink<T extends ClientContext> implements ClientLink<T> {
60
+ #private;
61
+ readonly codec: StandardLinkCodec<T>;
62
+ readonly sender: StandardLinkClient<T>;
63
+ private readonly eventIteratorMaxRetries;
64
+ private readonly eventIteratorRetryDelay;
65
+ private readonly eventIteratorShouldRetry;
66
+ private readonly interceptors;
67
+ private readonly clientInterceptors;
68
+ constructor(codec: StandardLinkCodec<T>, sender: StandardLinkClient<T>, options: StandardLinkOptions<T>);
69
+ call(path: readonly string[], input: unknown, options: ClientOptionsOut<T>): Promise<unknown>;
70
+ }
71
+
72
+ interface ClientPlugin<T extends ClientContext> {
73
+ init?(options: StandardLinkOptions<T>): void;
74
+ }
75
+ declare class CompositeClientPlugin<T extends ClientContext> implements ClientPlugin<T> {
76
+ private readonly plugins;
77
+ constructor(plugins?: ClientPlugin<T>[]);
78
+ init(options: StandardLinkOptions<T>): void;
79
+ }
80
+
81
+ export { type ClientPlugin as C, InvalidEventIteratorRetryResponse as I, type StandardLinkOptions as S, CompositeClientPlugin as a, type StandardLinkClient as b, type StandardLinkCodec as c, StandardLink as d };
@@ -0,0 +1,81 @@
1
+ import { Value, Interceptor } from '@orpc/shared';
2
+ import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
3
+ import { a as ClientContext, C as ClientOptionsOut, E as EventIteratorReconnectOptions, b as ClientLink } from './client.45nqoGFI.js';
4
+
5
+ interface StandardLinkCodec<T extends ClientContext> {
6
+ encode(path: readonly string[], input: unknown, options: ClientOptionsOut<any>): Promise<StandardRequest>;
7
+ decode(response: StandardLazyResponse, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<unknown>;
8
+ }
9
+ interface StandardLinkClient<T extends ClientContext> {
10
+ call(request: StandardRequest, options: ClientOptionsOut<T>, path: readonly string[], input: unknown): Promise<StandardLazyResponse>;
11
+ }
12
+
13
+ declare class InvalidEventIteratorRetryResponse extends Error {
14
+ }
15
+ interface StandardLinkOptions<T extends ClientContext> {
16
+ /**
17
+ * Maximum retry attempts for **consecutive failures** before throwing
18
+ *
19
+ * @default 5
20
+ */
21
+ eventIteratorMaxRetries?: Value<number, [
22
+ reconnectOptions: EventIteratorReconnectOptions,
23
+ options: ClientOptionsOut<T>,
24
+ path: readonly string[],
25
+ input: unknown
26
+ ]>;
27
+ /**
28
+ * Delay (in ms) before retrying an event iterator call.
29
+ *
30
+ * @default (o) => o.lastRetry ?? (1000 * 2 ** o.retryTimes)
31
+ */
32
+ eventIteratorRetryDelay?: Value<number, [
33
+ reconnectOptions: EventIteratorReconnectOptions,
34
+ options: ClientOptionsOut<T>,
35
+ path: readonly string[],
36
+ input: unknown
37
+ ]>;
38
+ /**
39
+ * Function to determine if an error is retryable.
40
+ *
41
+ * @default true
42
+ */
43
+ eventIteratorShouldRetry?: Value<boolean, [
44
+ reconnectOptions: EventIteratorReconnectOptions,
45
+ options: ClientOptionsOut<T>,
46
+ path: readonly string[],
47
+ input: unknown
48
+ ]>;
49
+ interceptors?: Interceptor<{
50
+ path: readonly string[];
51
+ input: unknown;
52
+ options: ClientOptionsOut<T>;
53
+ }, unknown, unknown>[];
54
+ clientInterceptors?: Interceptor<{
55
+ request: StandardRequest;
56
+ }, StandardLazyResponse, unknown>[];
57
+ plugins?: ClientPlugin<T>[];
58
+ }
59
+ declare class StandardLink<T extends ClientContext> implements ClientLink<T> {
60
+ #private;
61
+ readonly codec: StandardLinkCodec<T>;
62
+ readonly sender: StandardLinkClient<T>;
63
+ private readonly eventIteratorMaxRetries;
64
+ private readonly eventIteratorRetryDelay;
65
+ private readonly eventIteratorShouldRetry;
66
+ private readonly interceptors;
67
+ private readonly clientInterceptors;
68
+ constructor(codec: StandardLinkCodec<T>, sender: StandardLinkClient<T>, options: StandardLinkOptions<T>);
69
+ call(path: readonly string[], input: unknown, options: ClientOptionsOut<T>): Promise<unknown>;
70
+ }
71
+
72
+ interface ClientPlugin<T extends ClientContext> {
73
+ init?(options: StandardLinkOptions<T>): void;
74
+ }
75
+ declare class CompositeClientPlugin<T extends ClientContext> implements ClientPlugin<T> {
76
+ private readonly plugins;
77
+ constructor(plugins?: ClientPlugin<T>[]);
78
+ init(options: StandardLinkOptions<T>): void;
79
+ }
80
+
81
+ export { type ClientPlugin as C, InvalidEventIteratorRetryResponse as I, type StandardLinkOptions as S, CompositeClientPlugin as a, type StandardLinkClient as b, type StandardLinkCodec as c, StandardLink as d };
@@ -0,0 +1,12 @@
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 };
@@ -1,5 +1,6 @@
1
1
  import { intercept, isAsyncIteratorObject, value, isObject, trim, stringifyJSON } from '@orpc/shared';
2
2
  import { c as createAutoRetryEventIterator, O as ORPCError, m as mapEventIterator, t as toORPCError } from './client.XAn8cDTM.mjs';
3
+ import { C as CompositeClientPlugin } from './client.CvnV7_uV.mjs';
3
4
  import { ErrorEvent } from '@orpc/standard-server';
4
5
 
5
6
  class InvalidEventIteratorRetryResponse extends Error {
@@ -8,6 +9,8 @@ class StandardLink {
8
9
  constructor(codec, sender, options) {
9
10
  this.codec = codec;
10
11
  this.sender = sender;
12
+ const plugin = new CompositeClientPlugin(options.plugins);
13
+ plugin.init(options);
11
14
  this.eventIteratorMaxRetries = options.eventIteratorMaxRetries ?? 5;
12
15
  this.eventIteratorRetryDelay = options.eventIteratorRetryDelay ?? ((o) => o.lastRetry ?? 1e3 * 2 ** o.retryTimes);
13
16
  this.eventIteratorShouldRetry = options.eventIteratorShouldRetry ?? true;
@@ -57,50 +60,74 @@ class StandardLink {
57
60
  }
58
61
  }
59
62
 
60
- class RPCJsonSerializer {
63
+ const STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES = {
64
+ BIGINT: 0,
65
+ DATE: 1,
66
+ NAN: 2,
67
+ UNDEFINED: 3,
68
+ URL: 4,
69
+ REGEXP: 5,
70
+ SET: 6,
71
+ MAP: 7
72
+ };
73
+ class StandardRPCJsonSerializer {
74
+ customSerializers;
75
+ constructor(options = {}) {
76
+ this.customSerializers = options.customJsonSerializers ?? [];
77
+ if (this.customSerializers.length !== new Set(this.customSerializers.map((custom) => custom.type)).size) {
78
+ throw new Error("Custom serializer type must be unique.");
79
+ }
80
+ }
61
81
  serialize(data, segments = [], meta = [], maps = [], blobs = []) {
82
+ for (const custom of this.customSerializers) {
83
+ if (custom.condition(data)) {
84
+ const result = this.serialize(custom.serialize(data), segments, meta, maps, blobs);
85
+ meta.push([custom.type, ...segments]);
86
+ return result;
87
+ }
88
+ }
62
89
  if (data instanceof Blob) {
63
90
  maps.push(segments);
64
91
  blobs.push(data);
65
92
  return [data, meta, maps, blobs];
66
93
  }
67
94
  if (typeof data === "bigint") {
68
- meta.push([0, segments]);
95
+ meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.BIGINT, ...segments]);
69
96
  return [data.toString(), meta, maps, blobs];
70
97
  }
71
98
  if (data instanceof Date) {
72
- meta.push([1, segments]);
99
+ meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.DATE, ...segments]);
73
100
  if (Number.isNaN(data.getTime())) {
74
101
  return [null, meta, maps, blobs];
75
102
  }
76
103
  return [data.toISOString(), meta, maps, blobs];
77
104
  }
78
105
  if (Number.isNaN(data)) {
79
- meta.push([2, segments]);
106
+ meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.NAN, ...segments]);
80
107
  return [null, meta, maps, blobs];
81
108
  }
82
109
  if (data instanceof URL) {
83
- meta.push([4, segments]);
110
+ meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.URL, ...segments]);
84
111
  return [data.toString(), meta, maps, blobs];
85
112
  }
86
113
  if (data instanceof RegExp) {
87
- meta.push([5, segments]);
114
+ meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.REGEXP, ...segments]);
88
115
  return [data.toString(), meta, maps, blobs];
89
116
  }
90
117
  if (data instanceof Set) {
91
118
  const result = this.serialize(Array.from(data), segments, meta, maps, blobs);
92
- meta.push([6, segments]);
119
+ meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.SET, ...segments]);
93
120
  return result;
94
121
  }
95
122
  if (data instanceof Map) {
96
123
  const result = this.serialize(Array.from(data.entries()), segments, meta, maps, blobs);
97
- meta.push([7, segments]);
124
+ meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.MAP, ...segments]);
98
125
  return result;
99
126
  }
100
127
  if (Array.isArray(data)) {
101
128
  const json = data.map((v, i) => {
102
129
  if (v === void 0) {
103
- meta.push([3, [...segments, i]]);
130
+ meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.UNDEFINED, ...segments, i]);
104
131
  return v;
105
132
  }
106
133
  return this.serialize(v, [...segments, i], meta, maps, blobs)[0];
@@ -129,38 +156,45 @@ class RPCJsonSerializer {
129
156
  currentRef[preSegment] = getBlob(i);
130
157
  });
131
158
  }
132
- for (const [type, segments] of meta) {
159
+ for (const item of meta) {
160
+ const type = item[0];
133
161
  let currentRef = ref;
134
162
  let preSegment = "data";
135
- segments.forEach((segment) => {
163
+ for (let i = 1; i < item.length; i++) {
136
164
  currentRef = currentRef[preSegment];
137
- preSegment = segment;
138
- });
165
+ preSegment = item[i];
166
+ }
167
+ for (const custom of this.customSerializers) {
168
+ if (custom.type === type) {
169
+ currentRef[preSegment] = custom.deserialize(currentRef[preSegment]);
170
+ break;
171
+ }
172
+ }
139
173
  switch (type) {
140
- case 0:
174
+ case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.BIGINT:
141
175
  currentRef[preSegment] = BigInt(currentRef[preSegment]);
142
176
  break;
143
- case 1:
177
+ case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.DATE:
144
178
  currentRef[preSegment] = new Date(currentRef[preSegment] ?? "Invalid Date");
145
179
  break;
146
- case 2:
180
+ case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.NAN:
147
181
  currentRef[preSegment] = Number.NaN;
148
182
  break;
149
- case 3:
183
+ case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.UNDEFINED:
150
184
  currentRef[preSegment] = void 0;
151
185
  break;
152
- case 4:
186
+ case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.URL:
153
187
  currentRef[preSegment] = new URL(currentRef[preSegment]);
154
188
  break;
155
- case 5: {
189
+ case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.REGEXP: {
156
190
  const [, pattern, flags] = currentRef[preSegment].match(/^\/(.*)\/([a-z]*)$/);
157
191
  currentRef[preSegment] = new RegExp(pattern, flags);
158
192
  break;
159
193
  }
160
- case 6:
194
+ case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.SET:
161
195
  currentRef[preSegment] = new Set(currentRef[preSegment]);
162
196
  break;
163
- case 7:
197
+ case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.MAP:
164
198
  currentRef[preSegment] = new Map(currentRef[preSegment]);
165
199
  break;
166
200
  }
@@ -185,9 +219,18 @@ class StandardRPCLinkCodec {
185
219
  headers;
186
220
  async encode(path, input, options) {
187
221
  const expectedMethod = await value(this.expectedMethod, options, path, input);
188
- const headers = await value(this.headers, options, path, input);
222
+ const headers = { ...await value(this.headers, options, path, input) };
189
223
  const baseUrl = await value(this.baseUrl, options, path, input);
190
224
  const url = new URL(`${trim(baseUrl.toString(), "/")}/${path.map(encodeURIComponent).join("/")}`);
225
+ if (options.lastEventId !== void 0) {
226
+ if (Array.isArray(headers["last-event-id"])) {
227
+ headers["last-event-id"] = [...headers["last-event-id"], options.lastEventId];
228
+ } else if (headers["last-event-id"] !== void 0) {
229
+ headers["last-event-id"] = [headers["last-event-id"], options.lastEventId];
230
+ } else {
231
+ headers["last-event-id"] = options.lastEventId;
232
+ }
233
+ }
191
234
  const serialized = this.serializer.serialize(input);
192
235
  if (expectedMethod === "GET" && !(serialized instanceof FormData) && !(serialized instanceof Blob) && !isAsyncIteratorObject(serialized)) {
193
236
  const maxUrlLength = await value(this.maxUrlLength, options, path, input);
@@ -242,8 +285,8 @@ class StandardRPCLinkCodec {
242
285
  }
243
286
  }
244
287
 
245
- class RPCSerializer {
246
- constructor(jsonSerializer = new RPCJsonSerializer()) {
288
+ class StandardRPCSerializer {
289
+ constructor(jsonSerializer) {
247
290
  this.jsonSerializer = jsonSerializer;
248
291
  }
249
292
  serialize(data) {
@@ -317,4 +360,4 @@ class RPCSerializer {
317
360
  }
318
361
  }
319
362
 
320
- export { InvalidEventIteratorRetryResponse as I, RPCJsonSerializer as R, StandardLink as S, StandardRPCLinkCodec as a, RPCSerializer as b };
363
+ 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 };
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.9b9ade5",
4
+ "version": "0.0.0-next.9e880d7",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.unnoq.com",
7
7
  "repository": {
@@ -19,6 +19,11 @@
19
19
  "import": "./dist/index.mjs",
20
20
  "default": "./dist/index.mjs"
21
21
  },
22
+ "./plugins": {
23
+ "types": "./dist/plugins/index.d.mts",
24
+ "import": "./dist/plugins/index.mjs",
25
+ "default": "./dist/plugins/index.mjs"
26
+ },
22
27
  "./standard": {
23
28
  "types": "./dist/adapters/standard/index.d.mts",
24
29
  "import": "./dist/adapters/standard/index.mjs",
@@ -34,9 +39,9 @@
34
39
  "dist"
35
40
  ],
36
41
  "dependencies": {
37
- "@orpc/shared": "0.0.0-next.9b9ade5",
38
- "@orpc/standard-server": "0.0.0-next.9b9ade5",
39
- "@orpc/standard-server-fetch": "0.0.0-next.9b9ade5"
42
+ "@orpc/shared": "0.0.0-next.9e880d7",
43
+ "@orpc/standard-server": "0.0.0-next.9e880d7",
44
+ "@orpc/standard-server-fetch": "0.0.0-next.9e880d7"
40
45
  },
41
46
  "devDependencies": {
42
47
  "zod": "^3.24.2"