@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 +4 -1
- package/dist/adapters/fetch/index.d.mts +4 -3
- package/dist/adapters/fetch/index.d.ts +4 -3
- package/dist/adapters/fetch/index.mjs +4 -2
- package/dist/adapters/standard/index.d.mts +37 -80
- package/dist/adapters/standard/index.d.ts +37 -80
- package/dist/adapters/standard/index.mjs +2 -1
- package/dist/index.d.mts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.mjs +1 -1
- package/dist/plugins/index.d.mts +62 -0
- package/dist/plugins/index.d.ts +62 -0
- package/dist/plugins/index.mjs +127 -0
- package/dist/shared/{client.D_CzLDyB.d.mts → client.45nqoGFI.d.mts} +1 -1
- package/dist/shared/{client.D_CzLDyB.d.ts → client.45nqoGFI.d.ts} +1 -1
- package/dist/shared/client.CS0uVV6J.d.mts +81 -0
- package/dist/shared/client.CmE0kcXu.d.ts +81 -0
- package/dist/shared/client.CvnV7_uV.mjs +12 -0
- package/dist/shared/{client.Df5pd75N.mjs → client.cZd8JfIk.mjs} +68 -25
- package/package.json +9 -4
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 {
|
|
4
|
-
import {
|
|
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
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
|
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 {
|
|
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
|
|
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 {
|
|
2
|
-
|
|
3
|
-
import {
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
59
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
Segment[]
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
36
|
+
declare class StandardRPCSerializer {
|
|
83
37
|
#private;
|
|
84
38
|
private readonly jsonSerializer;
|
|
85
|
-
constructor(jsonSerializer
|
|
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:
|
|
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
|
-
|
|
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 {
|
|
2
|
-
|
|
3
|
-
import {
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
59
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
Segment[]
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
36
|
+
declare class StandardRPCSerializer {
|
|
83
37
|
#private;
|
|
84
38
|
private readonly jsonSerializer;
|
|
85
|
-
constructor(jsonSerializer
|
|
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:
|
|
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
|
-
|
|
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,
|
|
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,
|
|
2
|
-
export { g as Client, e as ClientOptions, f as ClientRest, E as EventIteratorReconnectOptions, d as createAutoRetryEventIterator, m as mapEventIterator } from './shared/client.
|
|
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,
|
|
2
|
-
export { g as Client, e as ClientOptions, f as ClientRest, E as EventIteratorReconnectOptions, d as createAutoRetryEventIterator, m as mapEventIterator } from './shared/client.
|
|
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
|
|
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
|
|
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 };
|
|
@@ -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
|
-
|
|
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([
|
|
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([
|
|
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([
|
|
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([
|
|
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([
|
|
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([
|
|
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([
|
|
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([
|
|
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
|
|
159
|
+
for (const item of meta) {
|
|
160
|
+
const type = item[0];
|
|
133
161
|
let currentRef = ref;
|
|
134
162
|
let preSegment = "data";
|
|
135
|
-
|
|
163
|
+
for (let i = 1; i < item.length; i++) {
|
|
136
164
|
currentRef = currentRef[preSegment];
|
|
137
|
-
preSegment =
|
|
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
|
|
174
|
+
case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.BIGINT:
|
|
141
175
|
currentRef[preSegment] = BigInt(currentRef[preSegment]);
|
|
142
176
|
break;
|
|
143
|
-
case
|
|
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
|
|
180
|
+
case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.NAN:
|
|
147
181
|
currentRef[preSegment] = Number.NaN;
|
|
148
182
|
break;
|
|
149
|
-
case
|
|
183
|
+
case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.UNDEFINED:
|
|
150
184
|
currentRef[preSegment] = void 0;
|
|
151
185
|
break;
|
|
152
|
-
case
|
|
186
|
+
case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.URL:
|
|
153
187
|
currentRef[preSegment] = new URL(currentRef[preSegment]);
|
|
154
188
|
break;
|
|
155
|
-
case
|
|
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
|
|
194
|
+
case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.SET:
|
|
161
195
|
currentRef[preSegment] = new Set(currentRef[preSegment]);
|
|
162
196
|
break;
|
|
163
|
-
case
|
|
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
|
|
246
|
-
constructor(jsonSerializer
|
|
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,
|
|
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.
|
|
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.
|
|
38
|
-
"@orpc/standard-server": "0.0.0-next.
|
|
39
|
-
"@orpc/standard-server-fetch": "0.0.0-next.
|
|
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"
|