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