@orpc/client 0.0.0-next.eea495c → 0.0.0-next.f16d90e
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 +1 -0
- package/dist/adapters/fetch/index.d.mts +3 -3
- package/dist/adapters/fetch/index.d.ts +3 -3
- 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 +3 -3
- package/dist/adapters/standard/index.d.ts +3 -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 +31 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/plugins/index.d.mts +47 -15
- package/dist/plugins/index.d.ts +47 -15
- package/dist/plugins/index.mjs +99 -4
- package/dist/shared/{client.CipPQkhk.d.ts → client.4TS_0JaO.d.mts} +1 -1
- package/dist/shared/{client.CipPQkhk.d.mts → client.4TS_0JaO.d.ts} +1 -1
- package/dist/shared/{client.8TjrVhkC.d.ts → client.7UM0t5o-.d.ts} +8 -8
- package/dist/shared/{client.C9U9n1f3.d.ts → client.BMoG_EdN.d.mts} +4 -4
- package/dist/shared/{client.BjJBZryq.d.mts → client.BdD8cpjs.d.mts} +8 -8
- package/dist/shared/{client.FXep-a3a.d.mts → client.C0KbSWlC.d.ts} +4 -4
- package/package.json +16 -5
package/README.md
CHANGED
@@ -49,6 +49,7 @@ You can find the full documentation [here](https://orpc.unnoq.com).
|
|
49
49
|
- [@orpc/contract](https://www.npmjs.com/package/@orpc/contract): Build your API contract.
|
50
50
|
- [@orpc/server](https://www.npmjs.com/package/@orpc/server): Build your API or implement API contract.
|
51
51
|
- [@orpc/client](https://www.npmjs.com/package/@orpc/client): Consume your API on the client with type-safety.
|
52
|
+
- [@orpc/nest](https://www.npmjs.com/package/@orpc/nest): Deeply integrate oRPC with NestJS.
|
52
53
|
- [@orpc/react](https://www.npmjs.com/package/@orpc/react): Utilities for integrating oRPC with React and React Server Actions.
|
53
54
|
- [@orpc/react-query](https://www.npmjs.com/package/@orpc/react-query): Integration with [React Query](https://tanstack.com/query/latest/docs/framework/react/overview).
|
54
55
|
- [@orpc/vue-query](https://www.npmjs.com/package/@orpc/vue-query): Integration with [Vue Query](https://tanstack.com/query/latest/docs/framework/vue/overview).
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
2
2
|
import { ToFetchRequestOptions } from '@orpc/standard-server-fetch';
|
3
|
-
import { a as ClientContext, b as ClientOptions } from '../../shared/client.
|
4
|
-
import { f as StandardLinkClient } from '../../shared/client.
|
5
|
-
import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.
|
3
|
+
import { a as ClientContext, b as ClientOptions } from '../../shared/client.4TS_0JaO.mjs';
|
4
|
+
import { f as StandardLinkClient } from '../../shared/client.BMoG_EdN.mjs';
|
5
|
+
import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.BdD8cpjs.mjs';
|
6
6
|
import '@orpc/shared';
|
7
7
|
|
8
8
|
interface LinkFetchClientOptions<T extends ClientContext> extends ToFetchRequestOptions {
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
2
2
|
import { ToFetchRequestOptions } from '@orpc/standard-server-fetch';
|
3
|
-
import { a as ClientContext, b as ClientOptions } from '../../shared/client.
|
4
|
-
import { f as StandardLinkClient } from '../../shared/client.
|
5
|
-
import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.
|
3
|
+
import { a as ClientContext, b as ClientOptions } from '../../shared/client.4TS_0JaO.js';
|
4
|
+
import { f as StandardLinkClient } from '../../shared/client.C0KbSWlC.js';
|
5
|
+
import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.7UM0t5o-.js';
|
6
6
|
import '@orpc/shared';
|
7
7
|
|
8
8
|
interface LinkFetchClientOptions<T extends ClientContext> extends ToFetchRequestOptions {
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
2
|
+
import { a as ClientContext, b as ClientOptions } from '../../shared/client.4TS_0JaO.mjs';
|
3
|
+
import { f as StandardLinkClient } from '../../shared/client.BMoG_EdN.mjs';
|
4
|
+
import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.BdD8cpjs.mjs';
|
5
|
+
import '@orpc/shared';
|
6
|
+
|
7
|
+
/**
|
8
|
+
* The message port used by electron in main process
|
9
|
+
*/
|
10
|
+
interface MessagePortMainLike {
|
11
|
+
on: <T extends string>(event: T, callback: (event?: {
|
12
|
+
data: any;
|
13
|
+
}) => void) => void;
|
14
|
+
postMessage: (data: any) => void;
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* The message port used by browser extension
|
18
|
+
*/
|
19
|
+
interface BrowserPortLike {
|
20
|
+
onMessage: {
|
21
|
+
addListener: (callback: (data: any) => void) => void;
|
22
|
+
};
|
23
|
+
onDisconnect: {
|
24
|
+
addListener: (callback: () => void) => void;
|
25
|
+
};
|
26
|
+
postMessage: (data: any) => void;
|
27
|
+
}
|
28
|
+
type SupportedMessagePort = Pick<MessagePort, 'addEventListener' | 'postMessage'> | MessagePortMainLike | BrowserPortLike;
|
29
|
+
/**
|
30
|
+
* Message port can support [The structured clone algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm)
|
31
|
+
*/
|
32
|
+
type SupportedMessagePortData = string | ArrayBufferLike;
|
33
|
+
declare function postMessagePortMessage(port: SupportedMessagePort, data: SupportedMessagePortData): void;
|
34
|
+
declare function onMessagePortMessage(port: SupportedMessagePort, callback: (data: SupportedMessagePortData) => void): void;
|
35
|
+
declare function onMessagePortClose(port: SupportedMessagePort, callback: () => void): void;
|
36
|
+
|
37
|
+
interface experimental_LinkMessagePortClientOptions {
|
38
|
+
port: SupportedMessagePort;
|
39
|
+
}
|
40
|
+
declare class experimental_LinkMessagePortClient<T extends ClientContext> implements StandardLinkClient<T> {
|
41
|
+
private readonly peer;
|
42
|
+
constructor(options: experimental_LinkMessagePortClientOptions);
|
43
|
+
call(request: StandardRequest, _options: ClientOptions<T>, _path: readonly string[], _input: unknown): Promise<StandardLazyResponse>;
|
44
|
+
}
|
45
|
+
|
46
|
+
interface experimental_RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'headers' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, experimental_LinkMessagePortClientOptions {
|
47
|
+
}
|
48
|
+
/**
|
49
|
+
* The RPC Link for common message port implementations.
|
50
|
+
*
|
51
|
+
* @see {@link https://orpc.unnoq.com/docs/client/rpc-link RPC Link Docs}
|
52
|
+
* @see {@link https://orpc.unnoq.com/docs/adapters/message-port Message Port Adapter Docs}
|
53
|
+
*/
|
54
|
+
declare class experimental_RPCLink<T extends ClientContext> extends StandardRPCLink<T> {
|
55
|
+
constructor(options: experimental_RPCLinkOptions<T>);
|
56
|
+
}
|
57
|
+
|
58
|
+
export { experimental_LinkMessagePortClient, experimental_RPCLink, onMessagePortClose, onMessagePortMessage, postMessagePortMessage };
|
59
|
+
export type { BrowserPortLike, MessagePortMainLike, SupportedMessagePort, SupportedMessagePortData, experimental_LinkMessagePortClientOptions, experimental_RPCLinkOptions };
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
2
|
+
import { a as ClientContext, b as ClientOptions } from '../../shared/client.4TS_0JaO.js';
|
3
|
+
import { f as StandardLinkClient } from '../../shared/client.C0KbSWlC.js';
|
4
|
+
import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.7UM0t5o-.js';
|
5
|
+
import '@orpc/shared';
|
6
|
+
|
7
|
+
/**
|
8
|
+
* The message port used by electron in main process
|
9
|
+
*/
|
10
|
+
interface MessagePortMainLike {
|
11
|
+
on: <T extends string>(event: T, callback: (event?: {
|
12
|
+
data: any;
|
13
|
+
}) => void) => void;
|
14
|
+
postMessage: (data: any) => void;
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* The message port used by browser extension
|
18
|
+
*/
|
19
|
+
interface BrowserPortLike {
|
20
|
+
onMessage: {
|
21
|
+
addListener: (callback: (data: any) => void) => void;
|
22
|
+
};
|
23
|
+
onDisconnect: {
|
24
|
+
addListener: (callback: () => void) => void;
|
25
|
+
};
|
26
|
+
postMessage: (data: any) => void;
|
27
|
+
}
|
28
|
+
type SupportedMessagePort = Pick<MessagePort, 'addEventListener' | 'postMessage'> | MessagePortMainLike | BrowserPortLike;
|
29
|
+
/**
|
30
|
+
* Message port can support [The structured clone algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm)
|
31
|
+
*/
|
32
|
+
type SupportedMessagePortData = string | ArrayBufferLike;
|
33
|
+
declare function postMessagePortMessage(port: SupportedMessagePort, data: SupportedMessagePortData): void;
|
34
|
+
declare function onMessagePortMessage(port: SupportedMessagePort, callback: (data: SupportedMessagePortData) => void): void;
|
35
|
+
declare function onMessagePortClose(port: SupportedMessagePort, callback: () => void): void;
|
36
|
+
|
37
|
+
interface experimental_LinkMessagePortClientOptions {
|
38
|
+
port: SupportedMessagePort;
|
39
|
+
}
|
40
|
+
declare class experimental_LinkMessagePortClient<T extends ClientContext> implements StandardLinkClient<T> {
|
41
|
+
private readonly peer;
|
42
|
+
constructor(options: experimental_LinkMessagePortClientOptions);
|
43
|
+
call(request: StandardRequest, _options: ClientOptions<T>, _path: readonly string[], _input: unknown): Promise<StandardLazyResponse>;
|
44
|
+
}
|
45
|
+
|
46
|
+
interface experimental_RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'headers' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, experimental_LinkMessagePortClientOptions {
|
47
|
+
}
|
48
|
+
/**
|
49
|
+
* The RPC Link for common message port implementations.
|
50
|
+
*
|
51
|
+
* @see {@link https://orpc.unnoq.com/docs/client/rpc-link RPC Link Docs}
|
52
|
+
* @see {@link https://orpc.unnoq.com/docs/adapters/message-port Message Port Adapter Docs}
|
53
|
+
*/
|
54
|
+
declare class experimental_RPCLink<T extends ClientContext> extends StandardRPCLink<T> {
|
55
|
+
constructor(options: experimental_RPCLinkOptions<T>);
|
56
|
+
}
|
57
|
+
|
58
|
+
export { experimental_LinkMessagePortClient, experimental_RPCLink, onMessagePortClose, onMessagePortMessage, postMessagePortMessage };
|
59
|
+
export type { BrowserPortLike, MessagePortMainLike, SupportedMessagePort, SupportedMessagePortData, experimental_LinkMessagePortClientOptions, experimental_RPCLinkOptions };
|
@@ -0,0 +1,71 @@
|
|
1
|
+
import { ClientPeer } from '@orpc/standard-server-peer';
|
2
|
+
import '@orpc/shared';
|
3
|
+
import { c as StandardRPCLink } from '../../shared/client.DpICn1BD.mjs';
|
4
|
+
import '@orpc/standard-server';
|
5
|
+
import '../../shared/client.CRWEpqLB.mjs';
|
6
|
+
|
7
|
+
function postMessagePortMessage(port, data) {
|
8
|
+
port.postMessage(data);
|
9
|
+
}
|
10
|
+
function onMessagePortMessage(port, callback) {
|
11
|
+
if ("addEventListener" in port) {
|
12
|
+
port.addEventListener("message", (event) => {
|
13
|
+
callback(event.data);
|
14
|
+
});
|
15
|
+
} else if ("on" in port) {
|
16
|
+
port.on("message", (event) => {
|
17
|
+
callback(event?.data);
|
18
|
+
});
|
19
|
+
} else if ("onMessage" in port) {
|
20
|
+
port.onMessage.addListener((data) => {
|
21
|
+
callback(data);
|
22
|
+
});
|
23
|
+
} else {
|
24
|
+
throw new Error("Cannot find a addEventListener/on/onMessage method on the port");
|
25
|
+
}
|
26
|
+
}
|
27
|
+
function onMessagePortClose(port, callback) {
|
28
|
+
if ("addEventListener" in port) {
|
29
|
+
port.addEventListener("close", async () => {
|
30
|
+
callback();
|
31
|
+
});
|
32
|
+
} else if ("on" in port) {
|
33
|
+
port.on("close", async () => {
|
34
|
+
callback();
|
35
|
+
});
|
36
|
+
} else if ("onDisconnect" in port) {
|
37
|
+
port.onDisconnect.addListener(() => {
|
38
|
+
callback();
|
39
|
+
});
|
40
|
+
} else {
|
41
|
+
throw new Error("Cannot find a addEventListener/on/onDisconnect method on the port");
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
class experimental_LinkMessagePortClient {
|
46
|
+
peer;
|
47
|
+
constructor(options) {
|
48
|
+
this.peer = new ClientPeer(async (message) => {
|
49
|
+
postMessagePortMessage(options.port, message instanceof Blob ? await message.arrayBuffer() : message);
|
50
|
+
});
|
51
|
+
onMessagePortMessage(options.port, async (message) => {
|
52
|
+
await this.peer.message(message);
|
53
|
+
});
|
54
|
+
onMessagePortClose(options.port, () => {
|
55
|
+
this.peer.close();
|
56
|
+
});
|
57
|
+
}
|
58
|
+
async call(request, _options, _path, _input) {
|
59
|
+
const response = await this.peer.request(request);
|
60
|
+
return { ...response, body: () => Promise.resolve(response.body) };
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
class experimental_RPCLink extends StandardRPCLink {
|
65
|
+
constructor(options) {
|
66
|
+
const linkClient = new experimental_LinkMessagePortClient(options);
|
67
|
+
super(linkClient, { ...options, url: "orpc:/" });
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
export { experimental_LinkMessagePortClient, experimental_RPCLink, onMessagePortClose, onMessagePortMessage, postMessagePortMessage };
|
@@ -1,6 +1,6 @@
|
|
1
|
-
export { C as CompositeStandardLinkPlugin, d as StandardLink, f as StandardLinkClient, S as StandardLinkClientInterceptorOptions, e as StandardLinkCodec, c as StandardLinkInterceptorOptions, b as StandardLinkOptions, a as StandardLinkPlugin } from '../../shared/client.
|
2
|
-
export { S as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, c as StandardRPCCustomJsonSerializer, b as StandardRPCJsonSerialized, a as StandardRPCJsonSerializedMetaItem, e as StandardRPCJsonSerializer, d as StandardRPCJsonSerializerOptions, g as StandardRPCLink, i as StandardRPCLinkCodec, h as StandardRPCLinkCodecOptions, f as StandardRPCLinkOptions, j as StandardRPCSerializer } from '../../shared/client.
|
3
|
-
import { H as HTTPPath } from '../../shared/client.
|
1
|
+
export { C as CompositeStandardLinkPlugin, d as StandardLink, f as StandardLinkClient, S as StandardLinkClientInterceptorOptions, e as StandardLinkCodec, c as StandardLinkInterceptorOptions, b as StandardLinkOptions, a as StandardLinkPlugin } from '../../shared/client.BMoG_EdN.mjs';
|
2
|
+
export { S as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, c as StandardRPCCustomJsonSerializer, b as StandardRPCJsonSerialized, a as StandardRPCJsonSerializedMetaItem, e as StandardRPCJsonSerializer, d as StandardRPCJsonSerializerOptions, g as StandardRPCLink, i as StandardRPCLinkCodec, h as StandardRPCLinkCodecOptions, f as StandardRPCLinkOptions, j as StandardRPCSerializer } from '../../shared/client.BdD8cpjs.mjs';
|
3
|
+
import { H as HTTPPath } from '../../shared/client.4TS_0JaO.mjs';
|
4
4
|
import '@orpc/shared';
|
5
5
|
import '@orpc/standard-server';
|
6
6
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
export { C as CompositeStandardLinkPlugin, d as StandardLink, f as StandardLinkClient, S as StandardLinkClientInterceptorOptions, e as StandardLinkCodec, c as StandardLinkInterceptorOptions, b as StandardLinkOptions, a as StandardLinkPlugin } from '../../shared/client.
|
2
|
-
export { S as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, c as StandardRPCCustomJsonSerializer, b as StandardRPCJsonSerialized, a as StandardRPCJsonSerializedMetaItem, e as StandardRPCJsonSerializer, d as StandardRPCJsonSerializerOptions, g as StandardRPCLink, i as StandardRPCLinkCodec, h as StandardRPCLinkCodecOptions, f as StandardRPCLinkOptions, j as StandardRPCSerializer } from '../../shared/client.
|
3
|
-
import { H as HTTPPath } from '../../shared/client.
|
1
|
+
export { C as CompositeStandardLinkPlugin, d as StandardLink, f as StandardLinkClient, S as StandardLinkClientInterceptorOptions, e as StandardLinkCodec, c as StandardLinkInterceptorOptions, b as StandardLinkOptions, a as StandardLinkPlugin } from '../../shared/client.C0KbSWlC.js';
|
2
|
+
export { S as STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES, c as StandardRPCCustomJsonSerializer, b as StandardRPCJsonSerialized, a as StandardRPCJsonSerializedMetaItem, e as StandardRPCJsonSerializer, d as StandardRPCJsonSerializerOptions, g as StandardRPCLink, i as StandardRPCLinkCodec, h as StandardRPCLinkCodecOptions, f as StandardRPCLinkOptions, j as StandardRPCSerializer } from '../../shared/client.7UM0t5o-.js';
|
3
|
+
import { H as HTTPPath } from '../../shared/client.4TS_0JaO.js';
|
4
4
|
import '@orpc/shared';
|
5
5
|
import '@orpc/standard-server';
|
6
6
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
2
|
+
import { a as ClientContext, b as ClientOptions } from '../../shared/client.4TS_0JaO.mjs';
|
3
|
+
import { f as StandardLinkClient } from '../../shared/client.BMoG_EdN.mjs';
|
4
|
+
import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.BdD8cpjs.mjs';
|
5
|
+
import '@orpc/shared';
|
6
|
+
|
7
|
+
interface experimental_LinkWebsocketClientOptions {
|
8
|
+
websocket: Pick<WebSocket, 'addEventListener' | 'send'>;
|
9
|
+
}
|
10
|
+
declare class experimental_LinkWebsocketClient<T extends ClientContext> implements StandardLinkClient<T> {
|
11
|
+
private readonly peer;
|
12
|
+
constructor(options: experimental_LinkWebsocketClientOptions);
|
13
|
+
call(request: StandardRequest, _options: ClientOptions<T>, _path: readonly string[], _input: unknown): Promise<StandardLazyResponse>;
|
14
|
+
}
|
15
|
+
|
16
|
+
interface experimental_RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'headers' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, experimental_LinkWebsocketClientOptions {
|
17
|
+
}
|
18
|
+
/**
|
19
|
+
* The RPC Link communicates with the server using the RPC protocol over WebSocket.
|
20
|
+
*
|
21
|
+
* @see {@link https://orpc.unnoq.com/docs/client/rpc-link RPC Link Docs}
|
22
|
+
* @see {@link https://orpc.unnoq.com/docs/adapters/websocket WebSocket Adapter Docs}
|
23
|
+
*/
|
24
|
+
declare class experimental_RPCLink<T extends ClientContext> extends StandardRPCLink<T> {
|
25
|
+
constructor(options: experimental_RPCLinkOptions<T>);
|
26
|
+
}
|
27
|
+
|
28
|
+
export { experimental_LinkWebsocketClient, experimental_RPCLink };
|
29
|
+
export type { experimental_LinkWebsocketClientOptions, experimental_RPCLinkOptions };
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
2
|
+
import { a as ClientContext, b as ClientOptions } from '../../shared/client.4TS_0JaO.js';
|
3
|
+
import { f as StandardLinkClient } from '../../shared/client.C0KbSWlC.js';
|
4
|
+
import { f as StandardRPCLinkOptions, g as StandardRPCLink } from '../../shared/client.7UM0t5o-.js';
|
5
|
+
import '@orpc/shared';
|
6
|
+
|
7
|
+
interface experimental_LinkWebsocketClientOptions {
|
8
|
+
websocket: Pick<WebSocket, 'addEventListener' | 'send'>;
|
9
|
+
}
|
10
|
+
declare class experimental_LinkWebsocketClient<T extends ClientContext> implements StandardLinkClient<T> {
|
11
|
+
private readonly peer;
|
12
|
+
constructor(options: experimental_LinkWebsocketClientOptions);
|
13
|
+
call(request: StandardRequest, _options: ClientOptions<T>, _path: readonly string[], _input: unknown): Promise<StandardLazyResponse>;
|
14
|
+
}
|
15
|
+
|
16
|
+
interface experimental_RPCLinkOptions<T extends ClientContext> extends Omit<StandardRPCLinkOptions<T>, 'url' | 'headers' | 'method' | 'fallbackMethod' | 'maxUrlLength'>, experimental_LinkWebsocketClientOptions {
|
17
|
+
}
|
18
|
+
/**
|
19
|
+
* The RPC Link communicates with the server using the RPC protocol over WebSocket.
|
20
|
+
*
|
21
|
+
* @see {@link https://orpc.unnoq.com/docs/client/rpc-link RPC Link Docs}
|
22
|
+
* @see {@link https://orpc.unnoq.com/docs/adapters/websocket WebSocket Adapter Docs}
|
23
|
+
*/
|
24
|
+
declare class experimental_RPCLink<T extends ClientContext> extends StandardRPCLink<T> {
|
25
|
+
constructor(options: experimental_RPCLinkOptions<T>);
|
26
|
+
}
|
27
|
+
|
28
|
+
export { experimental_LinkWebsocketClient, experimental_RPCLink };
|
29
|
+
export type { experimental_LinkWebsocketClientOptions, experimental_RPCLinkOptions };
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { ClientPeer } from '@orpc/standard-server-peer';
|
2
|
+
import '@orpc/shared';
|
3
|
+
import { c as StandardRPCLink } from '../../shared/client.DpICn1BD.mjs';
|
4
|
+
import '@orpc/standard-server';
|
5
|
+
import '../../shared/client.CRWEpqLB.mjs';
|
6
|
+
|
7
|
+
class experimental_LinkWebsocketClient {
|
8
|
+
peer;
|
9
|
+
constructor(options) {
|
10
|
+
this.peer = new ClientPeer(options.websocket.send.bind(options.websocket));
|
11
|
+
options.websocket.addEventListener("message", (event) => {
|
12
|
+
this.peer.message(event.data);
|
13
|
+
});
|
14
|
+
options.websocket.addEventListener("close", () => {
|
15
|
+
this.peer.close();
|
16
|
+
});
|
17
|
+
}
|
18
|
+
async call(request, _options, _path, _input) {
|
19
|
+
const response = await this.peer.request(request);
|
20
|
+
return { ...response, body: () => Promise.resolve(response.body) };
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
class experimental_RPCLink extends StandardRPCLink {
|
25
|
+
constructor(options) {
|
26
|
+
const linkClient = new experimental_LinkWebsocketClient(options);
|
27
|
+
super(linkClient, { ...options, url: "orpc:/" });
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
export { experimental_LinkWebsocketClient, experimental_RPCLink };
|
package/dist/index.d.mts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
import { N as NestedClient, C as ClientLink, I as InferClientContext, a as ClientContext, b as ClientOptions, c as ClientPromiseResult, F as FriendlyClientOptions } from './shared/client.
|
2
|
-
export { f as Client, e as ClientRest, d as HTTPMethod, H as HTTPPath } from './shared/client.
|
1
|
+
import { N as NestedClient, C as ClientLink, I as InferClientContext, a as ClientContext, b as ClientOptions, c as ClientPromiseResult, F as FriendlyClientOptions } from './shared/client.4TS_0JaO.mjs';
|
2
|
+
export { f as Client, e as ClientRest, d as HTTPMethod, H as HTTPPath } from './shared/client.4TS_0JaO.mjs';
|
3
3
|
import { Promisable, MaybeOptionalOptions, ThrowableError } from '@orpc/shared';
|
4
4
|
export { Registry, ThrowableError, onError, onFinish, onStart, onSuccess } from '@orpc/shared';
|
5
5
|
export { ErrorEvent } from '@orpc/standard-server';
|
package/dist/index.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
import { N as NestedClient, C as ClientLink, I as InferClientContext, a as ClientContext, b as ClientOptions, c as ClientPromiseResult, F as FriendlyClientOptions } from './shared/client.
|
2
|
-
export { f as Client, e as ClientRest, d as HTTPMethod, H as HTTPPath } from './shared/client.
|
1
|
+
import { N as NestedClient, C as ClientLink, I as InferClientContext, a as ClientContext, b as ClientOptions, c as ClientPromiseResult, F as FriendlyClientOptions } from './shared/client.4TS_0JaO.js';
|
2
|
+
export { f as Client, e as ClientRest, d as HTTPMethod, H as HTTPPath } from './shared/client.4TS_0JaO.js';
|
3
3
|
import { Promisable, MaybeOptionalOptions, ThrowableError } from '@orpc/shared';
|
4
4
|
export { Registry, ThrowableError, onError, onFinish, onStart, onSuccess } from '@orpc/shared';
|
5
5
|
export { ErrorEvent } from '@orpc/standard-server';
|
package/dist/plugins/index.d.mts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
import { Value } from '@orpc/shared';
|
1
|
+
import { Value, Promisable } from '@orpc/shared';
|
2
2
|
import { StandardHeaders, StandardRequest } from '@orpc/standard-server';
|
3
|
-
import { S as StandardLinkClientInterceptorOptions, a as StandardLinkPlugin, b as StandardLinkOptions, c as StandardLinkInterceptorOptions } from '../shared/client.
|
4
|
-
import { a as ClientContext } from '../shared/client.
|
3
|
+
import { S as StandardLinkClientInterceptorOptions, a as StandardLinkPlugin, b as StandardLinkOptions, c as StandardLinkInterceptorOptions } from '../shared/client.BMoG_EdN.mjs';
|
4
|
+
import { a as ClientContext } from '../shared/client.4TS_0JaO.mjs';
|
5
5
|
|
6
6
|
interface BatchLinkPluginGroup<T extends ClientContext> {
|
7
7
|
condition(options: StandardLinkClientInterceptorOptions<T>): boolean;
|
@@ -16,25 +16,25 @@ interface BatchLinkPluginOptions<T extends ClientContext> {
|
|
16
16
|
*
|
17
17
|
* @default 10
|
18
18
|
*/
|
19
|
-
maxSize?: Value<number
|
19
|
+
maxSize?: Value<Promisable<number>, [readonly [StandardLinkClientInterceptorOptions<T>, ...StandardLinkClientInterceptorOptions<T>[]]]>;
|
20
20
|
/**
|
21
21
|
* Defines the URL to use for the batch request.
|
22
22
|
*
|
23
23
|
* @default the URL of the first request in the batch + '/__batch__'
|
24
24
|
*/
|
25
|
-
url?: Value<string | URL
|
25
|
+
url?: Value<Promisable<string | URL>, [readonly [StandardLinkClientInterceptorOptions<T>, ...StandardLinkClientInterceptorOptions<T>[]]]>;
|
26
26
|
/**
|
27
27
|
* The maximum length of the URL.
|
28
28
|
*
|
29
29
|
* @default 2083
|
30
30
|
*/
|
31
|
-
maxUrlLength?: Value<number
|
31
|
+
maxUrlLength?: Value<Promisable<number>, [readonly [StandardLinkClientInterceptorOptions<T>, ...StandardLinkClientInterceptorOptions<T>[]]]>;
|
32
32
|
/**
|
33
33
|
* Defines the HTTP headers to use for the batch request.
|
34
34
|
*
|
35
35
|
* @default The same headers of all requests in the batch
|
36
36
|
*/
|
37
|
-
headers?: Value<StandardHeaders
|
37
|
+
headers?: Value<Promisable<StandardHeaders>, [readonly [StandardLinkClientInterceptorOptions<T>, ...StandardLinkClientInterceptorOptions<T>[]]]>;
|
38
38
|
/**
|
39
39
|
* Map the batch request items before sending them.
|
40
40
|
*
|
@@ -72,6 +72,38 @@ declare class BatchLinkPlugin<T extends ClientContext> implements StandardLinkPl
|
|
72
72
|
init(options: StandardLinkOptions<T>): void;
|
73
73
|
}
|
74
74
|
|
75
|
+
interface DedupeRequestsPluginGroup<T extends ClientContext> {
|
76
|
+
condition(options: StandardLinkClientInterceptorOptions<T>): boolean;
|
77
|
+
/**
|
78
|
+
* The context used for the rest of the request lifecycle.
|
79
|
+
*/
|
80
|
+
context: T;
|
81
|
+
}
|
82
|
+
interface DedupeRequestsPluginOptions<T extends ClientContext> {
|
83
|
+
/**
|
84
|
+
* To enable deduplication, a request must match at least one defined group.
|
85
|
+
* Requests that fall into the same group are considered for deduplication together.
|
86
|
+
*/
|
87
|
+
groups: readonly [DedupeRequestsPluginGroup<T>, ...DedupeRequestsPluginGroup<T>[]];
|
88
|
+
/**
|
89
|
+
* Filters requests to dedupe
|
90
|
+
*
|
91
|
+
* @default (({ request }) => request.method === 'GET')
|
92
|
+
*/
|
93
|
+
filter?: (options: StandardLinkClientInterceptorOptions<T>) => boolean;
|
94
|
+
}
|
95
|
+
/**
|
96
|
+
* Prevents duplicate requests by deduplicating similar ones to reduce server load.
|
97
|
+
*
|
98
|
+
* @see {@link https://orpc.unnoq.com/docs/plugins/dedupe-requests Dedupe Requests Plugin}
|
99
|
+
*/
|
100
|
+
declare class DedupeRequestsPlugin<T extends ClientContext> implements StandardLinkPlugin<T> {
|
101
|
+
#private;
|
102
|
+
order: number;
|
103
|
+
constructor(options: NoInfer<DedupeRequestsPluginOptions<T>>);
|
104
|
+
init(options: StandardLinkOptions<T>): void;
|
105
|
+
}
|
106
|
+
|
75
107
|
interface ClientRetryPluginAttemptOptions<T extends ClientContext> extends StandardLinkInterceptorOptions<T> {
|
76
108
|
lastEventRetry: number | undefined;
|
77
109
|
attemptIndex: number;
|
@@ -84,19 +116,19 @@ interface ClientRetryPluginContext {
|
|
84
116
|
*
|
85
117
|
* @default 0
|
86
118
|
*/
|
87
|
-
retry?: Value<number
|
119
|
+
retry?: Value<Promisable<number>, [StandardLinkInterceptorOptions<ClientRetryPluginContext>]>;
|
88
120
|
/**
|
89
121
|
* Delay (in ms) before retrying.
|
90
122
|
*
|
91
123
|
* @default (o) => o.lastEventRetry ?? 2000
|
92
124
|
*/
|
93
|
-
retryDelay?: Value<number
|
125
|
+
retryDelay?: Value<Promisable<number>, [ClientRetryPluginAttemptOptions<ClientRetryPluginContext>]>;
|
94
126
|
/**
|
95
127
|
* Determine should retry or not.
|
96
128
|
*
|
97
129
|
* @default true
|
98
130
|
*/
|
99
|
-
shouldRetry?: Value<boolean
|
131
|
+
shouldRetry?: Value<Promisable<boolean>, [ClientRetryPluginAttemptOptions<ClientRetryPluginContext>]>;
|
100
132
|
/**
|
101
133
|
* The hook called when retrying, and return the unsubscribe function.
|
102
134
|
*/
|
@@ -127,20 +159,20 @@ interface SimpleCsrfProtectionLinkPluginOptions<T extends ClientContext> {
|
|
127
159
|
*
|
128
160
|
* @default 'x-csrf-token'
|
129
161
|
*/
|
130
|
-
headerName?: Value<string
|
162
|
+
headerName?: Value<Promisable<string>, [options: StandardLinkClientInterceptorOptions<T>]>;
|
131
163
|
/**
|
132
164
|
* The value of the header to check.
|
133
165
|
*
|
134
166
|
* @default 'orpc'
|
135
167
|
*
|
136
168
|
*/
|
137
|
-
headerValue?: Value<string
|
169
|
+
headerValue?: Value<Promisable<string>, [options: StandardLinkClientInterceptorOptions<T>]>;
|
138
170
|
/**
|
139
171
|
* Exclude a procedure from the plugin.
|
140
172
|
*
|
141
173
|
* @default false
|
142
174
|
*/
|
143
|
-
exclude?: Value<boolean
|
175
|
+
exclude?: Value<Promisable<boolean>, [options: StandardLinkClientInterceptorOptions<T>]>;
|
144
176
|
}
|
145
177
|
/**
|
146
178
|
* This plugin adds basic Cross-Site Request Forgery (CSRF) protection to your oRPC application.
|
@@ -158,5 +190,5 @@ declare class SimpleCsrfProtectionLinkPlugin<T extends ClientContext> implements
|
|
158
190
|
init(options: StandardLinkOptions<T>): void;
|
159
191
|
}
|
160
192
|
|
161
|
-
export { BatchLinkPlugin, ClientRetryPlugin, ClientRetryPluginInvalidEventIteratorRetryResponse, SimpleCsrfProtectionLinkPlugin };
|
162
|
-
export type { BatchLinkPluginGroup, BatchLinkPluginOptions, ClientRetryPluginAttemptOptions, ClientRetryPluginContext, ClientRetryPluginOptions, SimpleCsrfProtectionLinkPluginOptions };
|
193
|
+
export { BatchLinkPlugin, ClientRetryPlugin, ClientRetryPluginInvalidEventIteratorRetryResponse, DedupeRequestsPlugin, SimpleCsrfProtectionLinkPlugin };
|
194
|
+
export type { BatchLinkPluginGroup, BatchLinkPluginOptions, ClientRetryPluginAttemptOptions, ClientRetryPluginContext, ClientRetryPluginOptions, DedupeRequestsPluginGroup, DedupeRequestsPluginOptions, SimpleCsrfProtectionLinkPluginOptions };
|
package/dist/plugins/index.d.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
import { Value } from '@orpc/shared';
|
1
|
+
import { Value, Promisable } from '@orpc/shared';
|
2
2
|
import { StandardHeaders, StandardRequest } from '@orpc/standard-server';
|
3
|
-
import { S as StandardLinkClientInterceptorOptions, a as StandardLinkPlugin, b as StandardLinkOptions, c as StandardLinkInterceptorOptions } from '../shared/client.
|
4
|
-
import { a as ClientContext } from '../shared/client.
|
3
|
+
import { S as StandardLinkClientInterceptorOptions, a as StandardLinkPlugin, b as StandardLinkOptions, c as StandardLinkInterceptorOptions } from '../shared/client.C0KbSWlC.js';
|
4
|
+
import { a as ClientContext } from '../shared/client.4TS_0JaO.js';
|
5
5
|
|
6
6
|
interface BatchLinkPluginGroup<T extends ClientContext> {
|
7
7
|
condition(options: StandardLinkClientInterceptorOptions<T>): boolean;
|
@@ -16,25 +16,25 @@ interface BatchLinkPluginOptions<T extends ClientContext> {
|
|
16
16
|
*
|
17
17
|
* @default 10
|
18
18
|
*/
|
19
|
-
maxSize?: Value<number
|
19
|
+
maxSize?: Value<Promisable<number>, [readonly [StandardLinkClientInterceptorOptions<T>, ...StandardLinkClientInterceptorOptions<T>[]]]>;
|
20
20
|
/**
|
21
21
|
* Defines the URL to use for the batch request.
|
22
22
|
*
|
23
23
|
* @default the URL of the first request in the batch + '/__batch__'
|
24
24
|
*/
|
25
|
-
url?: Value<string | URL
|
25
|
+
url?: Value<Promisable<string | URL>, [readonly [StandardLinkClientInterceptorOptions<T>, ...StandardLinkClientInterceptorOptions<T>[]]]>;
|
26
26
|
/**
|
27
27
|
* The maximum length of the URL.
|
28
28
|
*
|
29
29
|
* @default 2083
|
30
30
|
*/
|
31
|
-
maxUrlLength?: Value<number
|
31
|
+
maxUrlLength?: Value<Promisable<number>, [readonly [StandardLinkClientInterceptorOptions<T>, ...StandardLinkClientInterceptorOptions<T>[]]]>;
|
32
32
|
/**
|
33
33
|
* Defines the HTTP headers to use for the batch request.
|
34
34
|
*
|
35
35
|
* @default The same headers of all requests in the batch
|
36
36
|
*/
|
37
|
-
headers?: Value<StandardHeaders
|
37
|
+
headers?: Value<Promisable<StandardHeaders>, [readonly [StandardLinkClientInterceptorOptions<T>, ...StandardLinkClientInterceptorOptions<T>[]]]>;
|
38
38
|
/**
|
39
39
|
* Map the batch request items before sending them.
|
40
40
|
*
|
@@ -72,6 +72,38 @@ declare class BatchLinkPlugin<T extends ClientContext> implements StandardLinkPl
|
|
72
72
|
init(options: StandardLinkOptions<T>): void;
|
73
73
|
}
|
74
74
|
|
75
|
+
interface DedupeRequestsPluginGroup<T extends ClientContext> {
|
76
|
+
condition(options: StandardLinkClientInterceptorOptions<T>): boolean;
|
77
|
+
/**
|
78
|
+
* The context used for the rest of the request lifecycle.
|
79
|
+
*/
|
80
|
+
context: T;
|
81
|
+
}
|
82
|
+
interface DedupeRequestsPluginOptions<T extends ClientContext> {
|
83
|
+
/**
|
84
|
+
* To enable deduplication, a request must match at least one defined group.
|
85
|
+
* Requests that fall into the same group are considered for deduplication together.
|
86
|
+
*/
|
87
|
+
groups: readonly [DedupeRequestsPluginGroup<T>, ...DedupeRequestsPluginGroup<T>[]];
|
88
|
+
/**
|
89
|
+
* Filters requests to dedupe
|
90
|
+
*
|
91
|
+
* @default (({ request }) => request.method === 'GET')
|
92
|
+
*/
|
93
|
+
filter?: (options: StandardLinkClientInterceptorOptions<T>) => boolean;
|
94
|
+
}
|
95
|
+
/**
|
96
|
+
* Prevents duplicate requests by deduplicating similar ones to reduce server load.
|
97
|
+
*
|
98
|
+
* @see {@link https://orpc.unnoq.com/docs/plugins/dedupe-requests Dedupe Requests Plugin}
|
99
|
+
*/
|
100
|
+
declare class DedupeRequestsPlugin<T extends ClientContext> implements StandardLinkPlugin<T> {
|
101
|
+
#private;
|
102
|
+
order: number;
|
103
|
+
constructor(options: NoInfer<DedupeRequestsPluginOptions<T>>);
|
104
|
+
init(options: StandardLinkOptions<T>): void;
|
105
|
+
}
|
106
|
+
|
75
107
|
interface ClientRetryPluginAttemptOptions<T extends ClientContext> extends StandardLinkInterceptorOptions<T> {
|
76
108
|
lastEventRetry: number | undefined;
|
77
109
|
attemptIndex: number;
|
@@ -84,19 +116,19 @@ interface ClientRetryPluginContext {
|
|
84
116
|
*
|
85
117
|
* @default 0
|
86
118
|
*/
|
87
|
-
retry?: Value<number
|
119
|
+
retry?: Value<Promisable<number>, [StandardLinkInterceptorOptions<ClientRetryPluginContext>]>;
|
88
120
|
/**
|
89
121
|
* Delay (in ms) before retrying.
|
90
122
|
*
|
91
123
|
* @default (o) => o.lastEventRetry ?? 2000
|
92
124
|
*/
|
93
|
-
retryDelay?: Value<number
|
125
|
+
retryDelay?: Value<Promisable<number>, [ClientRetryPluginAttemptOptions<ClientRetryPluginContext>]>;
|
94
126
|
/**
|
95
127
|
* Determine should retry or not.
|
96
128
|
*
|
97
129
|
* @default true
|
98
130
|
*/
|
99
|
-
shouldRetry?: Value<boolean
|
131
|
+
shouldRetry?: Value<Promisable<boolean>, [ClientRetryPluginAttemptOptions<ClientRetryPluginContext>]>;
|
100
132
|
/**
|
101
133
|
* The hook called when retrying, and return the unsubscribe function.
|
102
134
|
*/
|
@@ -127,20 +159,20 @@ interface SimpleCsrfProtectionLinkPluginOptions<T extends ClientContext> {
|
|
127
159
|
*
|
128
160
|
* @default 'x-csrf-token'
|
129
161
|
*/
|
130
|
-
headerName?: Value<string
|
162
|
+
headerName?: Value<Promisable<string>, [options: StandardLinkClientInterceptorOptions<T>]>;
|
131
163
|
/**
|
132
164
|
* The value of the header to check.
|
133
165
|
*
|
134
166
|
* @default 'orpc'
|
135
167
|
*
|
136
168
|
*/
|
137
|
-
headerValue?: Value<string
|
169
|
+
headerValue?: Value<Promisable<string>, [options: StandardLinkClientInterceptorOptions<T>]>;
|
138
170
|
/**
|
139
171
|
* Exclude a procedure from the plugin.
|
140
172
|
*
|
141
173
|
* @default false
|
142
174
|
*/
|
143
|
-
exclude?: Value<boolean
|
175
|
+
exclude?: Value<Promisable<boolean>, [options: StandardLinkClientInterceptorOptions<T>]>;
|
144
176
|
}
|
145
177
|
/**
|
146
178
|
* This plugin adds basic Cross-Site Request Forgery (CSRF) protection to your oRPC application.
|
@@ -158,5 +190,5 @@ declare class SimpleCsrfProtectionLinkPlugin<T extends ClientContext> implements
|
|
158
190
|
init(options: StandardLinkOptions<T>): void;
|
159
191
|
}
|
160
192
|
|
161
|
-
export { BatchLinkPlugin, ClientRetryPlugin, ClientRetryPluginInvalidEventIteratorRetryResponse, SimpleCsrfProtectionLinkPlugin };
|
162
|
-
export type { BatchLinkPluginGroup, BatchLinkPluginOptions, ClientRetryPluginAttemptOptions, ClientRetryPluginContext, ClientRetryPluginOptions, SimpleCsrfProtectionLinkPluginOptions };
|
193
|
+
export { BatchLinkPlugin, ClientRetryPlugin, ClientRetryPluginInvalidEventIteratorRetryResponse, DedupeRequestsPlugin, SimpleCsrfProtectionLinkPlugin };
|
194
|
+
export type { BatchLinkPluginGroup, BatchLinkPluginOptions, ClientRetryPluginAttemptOptions, ClientRetryPluginContext, ClientRetryPluginOptions, DedupeRequestsPluginGroup, DedupeRequestsPluginOptions, SimpleCsrfProtectionLinkPluginOptions };
|
package/dist/plugins/index.mjs
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
import { isAsyncIteratorObject, value, splitInHalf, toArray } from '@orpc/shared';
|
2
|
-
import { toBatchRequest, parseBatchResponse } from '@orpc/standard-server/batch';
|
3
|
-
import { getEventMeta } from '@orpc/standard-server';
|
1
|
+
import { isAsyncIteratorObject, value, splitInHalf, toArray, stringifyJSON } from '@orpc/shared';
|
2
|
+
import { toBatchRequest, parseBatchResponse, toBatchAbortSignal } from '@orpc/standard-server/batch';
|
3
|
+
import { replicateStandardLazyResponse, getEventMeta } from '@orpc/standard-server';
|
4
4
|
|
5
5
|
class BatchLinkPlugin {
|
6
6
|
groups;
|
@@ -147,6 +147,101 @@ class BatchLinkPlugin {
|
|
147
147
|
}
|
148
148
|
}
|
149
149
|
|
150
|
+
class DedupeRequestsPlugin {
|
151
|
+
#groups;
|
152
|
+
#filter;
|
153
|
+
order = 4e6;
|
154
|
+
// make sure execute before batch plugin
|
155
|
+
#queue = /* @__PURE__ */ new Map();
|
156
|
+
constructor(options) {
|
157
|
+
this.#groups = options.groups;
|
158
|
+
this.#filter = options.filter ?? (({ request }) => request.method === "GET");
|
159
|
+
}
|
160
|
+
init(options) {
|
161
|
+
options.clientInterceptors ??= [];
|
162
|
+
options.clientInterceptors.push((options2) => {
|
163
|
+
if (options2.request.body instanceof Blob || options2.request.body instanceof FormData || options2.request.body instanceof URLSearchParams || isAsyncIteratorObject(options2.request.body) || !this.#filter(options2)) {
|
164
|
+
return options2.next();
|
165
|
+
}
|
166
|
+
const group = this.#groups.find((group2) => group2.condition(options2));
|
167
|
+
if (!group) {
|
168
|
+
return options2.next();
|
169
|
+
}
|
170
|
+
return new Promise((resolve, reject) => {
|
171
|
+
this.#enqueue(group, options2, resolve, reject);
|
172
|
+
setTimeout(() => this.#dequeue());
|
173
|
+
});
|
174
|
+
});
|
175
|
+
}
|
176
|
+
#enqueue(group, options, resolve, reject) {
|
177
|
+
let queue = this.#queue.get(group);
|
178
|
+
if (!queue) {
|
179
|
+
this.#queue.set(group, queue = []);
|
180
|
+
}
|
181
|
+
const matched = queue.find((item) => {
|
182
|
+
const requestString1 = stringifyJSON({
|
183
|
+
body: item.options.request.body,
|
184
|
+
headers: item.options.request.headers,
|
185
|
+
method: item.options.request.method,
|
186
|
+
url: item.options.request.url
|
187
|
+
});
|
188
|
+
const requestString2 = stringifyJSON({
|
189
|
+
body: options.request.body,
|
190
|
+
headers: options.request.headers,
|
191
|
+
method: options.request.method,
|
192
|
+
url: options.request.url
|
193
|
+
});
|
194
|
+
return requestString1 === requestString2;
|
195
|
+
});
|
196
|
+
if (matched) {
|
197
|
+
matched.signals.push(options.request.signal);
|
198
|
+
matched.resolves.push(resolve);
|
199
|
+
matched.rejects.push(reject);
|
200
|
+
} else {
|
201
|
+
queue.push({
|
202
|
+
options,
|
203
|
+
signals: [options.request.signal],
|
204
|
+
resolves: [resolve],
|
205
|
+
rejects: [reject]
|
206
|
+
});
|
207
|
+
}
|
208
|
+
}
|
209
|
+
async #dequeue() {
|
210
|
+
const promises = [];
|
211
|
+
for (const [group, items] of this.#queue) {
|
212
|
+
for (const { options, signals, resolves, rejects } of items) {
|
213
|
+
promises.push(
|
214
|
+
this.#execute(group, options, signals, resolves, rejects)
|
215
|
+
);
|
216
|
+
}
|
217
|
+
}
|
218
|
+
this.#queue.clear();
|
219
|
+
await Promise.all(promises);
|
220
|
+
}
|
221
|
+
async #execute(group, options, signals, resolves, rejects) {
|
222
|
+
try {
|
223
|
+
const dedupedRequest = {
|
224
|
+
...options.request,
|
225
|
+
signal: toBatchAbortSignal(signals)
|
226
|
+
};
|
227
|
+
const response = await options.next({
|
228
|
+
...options,
|
229
|
+
request: dedupedRequest,
|
230
|
+
signal: dedupedRequest.signal,
|
231
|
+
context: group.context
|
232
|
+
});
|
233
|
+
const replicatedResponses = replicateStandardLazyResponse(response, resolves.length);
|
234
|
+
for (const resolve of resolves) {
|
235
|
+
resolve(replicatedResponses.shift());
|
236
|
+
}
|
237
|
+
} catch (error) {
|
238
|
+
for (const reject of rejects) {
|
239
|
+
reject(error);
|
240
|
+
}
|
241
|
+
}
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
150
245
|
class ClientRetryPluginInvalidEventIteratorRetryResponse extends Error {
|
151
246
|
}
|
152
247
|
class ClientRetryPlugin {
|
@@ -288,4 +383,4 @@ class SimpleCsrfProtectionLinkPlugin {
|
|
288
383
|
}
|
289
384
|
}
|
290
385
|
|
291
|
-
export { BatchLinkPlugin, ClientRetryPlugin, ClientRetryPluginInvalidEventIteratorRetryResponse, SimpleCsrfProtectionLinkPlugin };
|
386
|
+
export { BatchLinkPlugin, ClientRetryPlugin, ClientRetryPluginInvalidEventIteratorRetryResponse, DedupeRequestsPlugin, SimpleCsrfProtectionLinkPlugin };
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { PromiseWithError } from '@orpc/shared';
|
2
2
|
|
3
3
|
type HTTPPath = `/${string}`;
|
4
|
-
type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
4
|
+
type HTTPMethod = 'HEAD' | 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
5
5
|
type ClientContext = Record<PropertyKey, any>;
|
6
6
|
interface ClientOptions<T extends ClientContext> {
|
7
7
|
signal?: AbortSignal;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { PromiseWithError } from '@orpc/shared';
|
2
2
|
|
3
3
|
type HTTPPath = `/${string}`;
|
4
|
-
type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
4
|
+
type HTTPMethod = 'HEAD' | 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
5
5
|
type ClientContext = Record<PropertyKey, any>;
|
6
6
|
interface ClientOptions<T extends ClientContext> {
|
7
7
|
signal?: AbortSignal;
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import { a as ClientContext, b as ClientOptions, d as HTTPMethod } from './client.
|
2
|
-
import { e as StandardLinkCodec, b as StandardLinkOptions, d as StandardLink, f as StandardLinkClient } from './client.
|
3
|
-
import { Segment, Value } from '@orpc/shared';
|
1
|
+
import { a as ClientContext, b as ClientOptions, d as HTTPMethod } from './client.4TS_0JaO.js';
|
2
|
+
import { e as StandardLinkCodec, b as StandardLinkOptions, d as StandardLink, f as StandardLinkClient } from './client.C0KbSWlC.js';
|
3
|
+
import { Segment, Value, Promisable } from '@orpc/shared';
|
4
4
|
import { StandardHeaders, StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
5
5
|
|
6
6
|
declare const STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES: {
|
@@ -44,30 +44,30 @@ interface StandardRPCLinkCodecOptions<T extends ClientContext> {
|
|
44
44
|
/**
|
45
45
|
* Base url for all requests.
|
46
46
|
*/
|
47
|
-
url: Value<string | URL
|
47
|
+
url: Value<Promisable<string | URL>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
48
48
|
/**
|
49
49
|
* The maximum length of the URL.
|
50
50
|
*
|
51
51
|
* @default 2083
|
52
52
|
*/
|
53
|
-
maxUrlLength?: Value<number
|
53
|
+
maxUrlLength?: Value<Promisable<number>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
54
54
|
/**
|
55
55
|
* The method used to make the request.
|
56
56
|
*
|
57
57
|
* @default 'POST'
|
58
58
|
*/
|
59
|
-
method?: Value<HTTPMethod, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
59
|
+
method?: Value<Promisable<Exclude<HTTPMethod, 'HEAD'>>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
60
60
|
/**
|
61
61
|
* The method to use when the payload cannot safely pass to the server with method return from method function.
|
62
62
|
* GET is not allowed, it's very dangerous.
|
63
63
|
*
|
64
64
|
* @default 'POST'
|
65
65
|
*/
|
66
|
-
fallbackMethod?: Exclude<HTTPMethod, 'GET'>;
|
66
|
+
fallbackMethod?: Exclude<HTTPMethod, 'HEAD' | 'GET'>;
|
67
67
|
/**
|
68
68
|
* Inject headers to the request.
|
69
69
|
*/
|
70
|
-
headers?: Value<StandardHeaders
|
70
|
+
headers?: Value<Promisable<StandardHeaders>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
71
71
|
}
|
72
72
|
declare class StandardRPCLinkCodec<T extends ClientContext> implements StandardLinkCodec<T> {
|
73
73
|
private readonly serializer;
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import { Interceptor
|
1
|
+
import { Interceptor } from '@orpc/shared';
|
2
2
|
import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
3
|
-
import { a as ClientContext, b as ClientOptions, C as ClientLink } from './client.
|
3
|
+
import { a as ClientContext, b as ClientOptions, C as ClientLink } from './client.4TS_0JaO.mjs';
|
4
4
|
|
5
5
|
interface StandardLinkPlugin<T extends ClientContext> {
|
6
6
|
order?: number;
|
@@ -28,8 +28,8 @@ interface StandardLinkClientInterceptorOptions<T extends ClientContext> extends
|
|
28
28
|
request: StandardRequest;
|
29
29
|
}
|
30
30
|
interface StandardLinkOptions<T extends ClientContext> {
|
31
|
-
interceptors?: Interceptor<StandardLinkInterceptorOptions<T>, unknown
|
32
|
-
clientInterceptors?: Interceptor<StandardLinkClientInterceptorOptions<T>, StandardLazyResponse
|
31
|
+
interceptors?: Interceptor<StandardLinkInterceptorOptions<T>, Promise<unknown>>[];
|
32
|
+
clientInterceptors?: Interceptor<StandardLinkClientInterceptorOptions<T>, Promise<StandardLazyResponse>>[];
|
33
33
|
plugins?: StandardLinkPlugin<T>[];
|
34
34
|
}
|
35
35
|
declare class StandardLink<T extends ClientContext> implements ClientLink<T> {
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import { a as ClientContext, b as ClientOptions, d as HTTPMethod } from './client.
|
2
|
-
import { e as StandardLinkCodec, b as StandardLinkOptions, d as StandardLink, f as StandardLinkClient } from './client.
|
3
|
-
import { Segment, Value } from '@orpc/shared';
|
1
|
+
import { a as ClientContext, b as ClientOptions, d as HTTPMethod } from './client.4TS_0JaO.mjs';
|
2
|
+
import { e as StandardLinkCodec, b as StandardLinkOptions, d as StandardLink, f as StandardLinkClient } from './client.BMoG_EdN.mjs';
|
3
|
+
import { Segment, Value, Promisable } from '@orpc/shared';
|
4
4
|
import { StandardHeaders, StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
5
5
|
|
6
6
|
declare const STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES: {
|
@@ -44,30 +44,30 @@ interface StandardRPCLinkCodecOptions<T extends ClientContext> {
|
|
44
44
|
/**
|
45
45
|
* Base url for all requests.
|
46
46
|
*/
|
47
|
-
url: Value<string | URL
|
47
|
+
url: Value<Promisable<string | URL>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
48
48
|
/**
|
49
49
|
* The maximum length of the URL.
|
50
50
|
*
|
51
51
|
* @default 2083
|
52
52
|
*/
|
53
|
-
maxUrlLength?: Value<number
|
53
|
+
maxUrlLength?: Value<Promisable<number>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
54
54
|
/**
|
55
55
|
* The method used to make the request.
|
56
56
|
*
|
57
57
|
* @default 'POST'
|
58
58
|
*/
|
59
|
-
method?: Value<HTTPMethod, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
59
|
+
method?: Value<Promisable<Exclude<HTTPMethod, 'HEAD'>>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
60
60
|
/**
|
61
61
|
* The method to use when the payload cannot safely pass to the server with method return from method function.
|
62
62
|
* GET is not allowed, it's very dangerous.
|
63
63
|
*
|
64
64
|
* @default 'POST'
|
65
65
|
*/
|
66
|
-
fallbackMethod?: Exclude<HTTPMethod, 'GET'>;
|
66
|
+
fallbackMethod?: Exclude<HTTPMethod, 'HEAD' | 'GET'>;
|
67
67
|
/**
|
68
68
|
* Inject headers to the request.
|
69
69
|
*/
|
70
|
-
headers?: Value<StandardHeaders
|
70
|
+
headers?: Value<Promisable<StandardHeaders>, [options: ClientOptions<T>, path: readonly string[], input: unknown]>;
|
71
71
|
}
|
72
72
|
declare class StandardRPCLinkCodec<T extends ClientContext> implements StandardLinkCodec<T> {
|
73
73
|
private readonly serializer;
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import { Interceptor
|
1
|
+
import { Interceptor } from '@orpc/shared';
|
2
2
|
import { StandardRequest, StandardLazyResponse } from '@orpc/standard-server';
|
3
|
-
import { a as ClientContext, b as ClientOptions, C as ClientLink } from './client.
|
3
|
+
import { a as ClientContext, b as ClientOptions, C as ClientLink } from './client.4TS_0JaO.js';
|
4
4
|
|
5
5
|
interface StandardLinkPlugin<T extends ClientContext> {
|
6
6
|
order?: number;
|
@@ -28,8 +28,8 @@ interface StandardLinkClientInterceptorOptions<T extends ClientContext> extends
|
|
28
28
|
request: StandardRequest;
|
29
29
|
}
|
30
30
|
interface StandardLinkOptions<T extends ClientContext> {
|
31
|
-
interceptors?: Interceptor<StandardLinkInterceptorOptions<T>, unknown
|
32
|
-
clientInterceptors?: Interceptor<StandardLinkClientInterceptorOptions<T>, StandardLazyResponse
|
31
|
+
interceptors?: Interceptor<StandardLinkInterceptorOptions<T>, Promise<unknown>>[];
|
32
|
+
clientInterceptors?: Interceptor<StandardLinkClientInterceptorOptions<T>, Promise<StandardLazyResponse>>[];
|
33
33
|
plugins?: StandardLinkPlugin<T>[];
|
34
34
|
}
|
35
35
|
declare class StandardLink<T extends ClientContext> implements ClientLink<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.f16d90e",
|
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/standard-server": "0.0.0-next.
|
43
|
-
"@orpc/standard-server-fetch": "0.0.0-next.
|
44
|
-
"@orpc/shared": "0.0.0-next.
|
52
|
+
"@orpc/standard-server": "0.0.0-next.f16d90e",
|
53
|
+
"@orpc/standard-server-fetch": "0.0.0-next.f16d90e",
|
54
|
+
"@orpc/shared": "0.0.0-next.f16d90e",
|
55
|
+
"@orpc/standard-server-peer": "0.0.0-next.f16d90e"
|
45
56
|
},
|
46
57
|
"devDependencies": {
|
47
|
-
"zod": "^3.
|
58
|
+
"zod": "^3.25.11"
|
48
59
|
},
|
49
60
|
"scripts": {
|
50
61
|
"build": "unbuild",
|