@enkaku/client 0.9.1 → 0.10.1
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/lib/client.d.ts +6 -4
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +64 -16
- package/package.json +6 -6
package/lib/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Disposer } from '@enkaku/async';
|
|
2
2
|
import type { AnyProcedureDefinition, AnyRequestProcedureDefinition, ChannelProcedureDefinition, ClientTransportOf, DataOf, EventProcedureDefinition, ProtocolDefinition, RequestProcedureDefinition, ReturnOf, StreamProcedureDefinition } from '@enkaku/protocol';
|
|
3
3
|
import { type TokenSigner } from '@enkaku/token';
|
|
4
4
|
type FilterNever<T> = {
|
|
@@ -58,15 +58,17 @@ export type RequestArguments<Param> = Param extends never ? [config?: {
|
|
|
58
58
|
}];
|
|
59
59
|
export type ClientParams<Protocol extends ProtocolDefinition> = {
|
|
60
60
|
getRandomID?: () => string;
|
|
61
|
+
handleTransportDisposed?: (signal: AbortSignal) => ClientTransportOf<Protocol> | void;
|
|
62
|
+
handleTransportError?: (error: Error) => ClientTransportOf<Protocol> | void;
|
|
61
63
|
transport: ClientTransportOf<Protocol>;
|
|
62
64
|
serverID?: string;
|
|
63
65
|
signer?: TokenSigner | Promise<TokenSigner>;
|
|
64
66
|
};
|
|
65
|
-
export declare class Client<Protocol extends ProtocolDefinition, ClientDefinitions extends ClientDefinitionsType<Protocol> = ClientDefinitionsType<Protocol>>
|
|
67
|
+
export declare class Client<Protocol extends ProtocolDefinition, ClientDefinitions extends ClientDefinitionsType<Protocol> = ClientDefinitionsType<Protocol>> extends Disposer {
|
|
66
68
|
#private;
|
|
67
69
|
constructor(params: ClientParams<Protocol>);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
/** @internal */
|
|
71
|
+
_dispose(reason?: unknown): Promise<void>;
|
|
70
72
|
sendEvent<Procedure extends keyof ClientDefinitions['Events'] & string, T extends ClientDefinitions['Events'][Procedure] = ClientDefinitions['Events'][Procedure]>(procedure: Procedure, ...args: T['Data'] extends never ? [] : [T['Data']]): Promise<void>;
|
|
71
73
|
request<Procedure extends keyof ClientDefinitions['Requests'] & string, T extends ClientDefinitions['Requests'][Procedure] = ClientDefinitions['Requests'][Procedure]>(procedure: Procedure, ...args: T['Param'] extends never ? [config?: {
|
|
72
74
|
param?: never;
|
package/lib/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/lib/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defer } from '@enkaku/async';
|
|
1
|
+
import { Disposer, defer } from '@enkaku/async';
|
|
2
2
|
import { createPipe } from '@enkaku/stream';
|
|
3
3
|
import { createUnsignedToken } from '@enkaku/token';
|
|
4
4
|
import { RequestError } from './error.js';
|
|
@@ -44,31 +44,80 @@ function getCreateMessage(signer, aud) {
|
|
|
44
44
|
function defaultRandomID() {
|
|
45
45
|
return globalThis.crypto.randomUUID();
|
|
46
46
|
}
|
|
47
|
-
export class Client {
|
|
47
|
+
export class Client extends Disposer {
|
|
48
48
|
#controllers = {};
|
|
49
49
|
#createMessage;
|
|
50
50
|
#getRandomID;
|
|
51
|
+
// biome-ignore lint/suspicious/noConfusingVoidType: return type
|
|
52
|
+
#handleTransportDisposed;
|
|
53
|
+
// biome-ignore lint/suspicious/noConfusingVoidType: return type
|
|
54
|
+
#handleTransportError;
|
|
51
55
|
#transport;
|
|
52
56
|
constructor(params){
|
|
57
|
+
super();
|
|
53
58
|
this.#createMessage = getCreateMessage(params.signer, params.serverID);
|
|
54
59
|
this.#getRandomID = params.getRandomID ?? defaultRandomID;
|
|
60
|
+
this.#handleTransportDisposed = params.handleTransportDisposed;
|
|
61
|
+
this.#handleTransportError = params.handleTransportError;
|
|
55
62
|
this.#transport = params.transport;
|
|
56
|
-
//
|
|
63
|
+
// Start reading from transport
|
|
64
|
+
this.#setupTransport();
|
|
65
|
+
}
|
|
66
|
+
/** @internal */ async _dispose(reason) {
|
|
67
|
+
this.#abortControllers(reason);
|
|
68
|
+
await this.#transport.dispose();
|
|
69
|
+
}
|
|
70
|
+
#abortControllers(reason) {
|
|
71
|
+
for (const controller of Object.values(this.#controllers)){
|
|
72
|
+
controller.abort(reason);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
#setupTransport() {
|
|
57
76
|
this.#transport.disposed.then(()=>{
|
|
58
|
-
|
|
59
|
-
|
|
77
|
+
if (this.signal.aborted) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const newTransport = this.#handleTransportDisposed?.(this.#transport.signal);
|
|
81
|
+
if (newTransport == null) {
|
|
82
|
+
// Abort client if no new transport is provided
|
|
83
|
+
this.abort('TransportDisposed');
|
|
84
|
+
} else {
|
|
85
|
+
// Abort running procedures and start using new transport
|
|
86
|
+
this.#abortControllers('TransportDisposed');
|
|
87
|
+
this.#transport = newTransport;
|
|
88
|
+
this.#setupTransport();
|
|
60
89
|
}
|
|
61
90
|
});
|
|
62
|
-
// Start reading from transport
|
|
63
91
|
this.#read();
|
|
64
92
|
}
|
|
65
93
|
async #read() {
|
|
66
94
|
while(true){
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
95
|
+
let msg;
|
|
96
|
+
try {
|
|
97
|
+
const next = await this.#transport.read();
|
|
98
|
+
if (next.done) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
msg = next.value;
|
|
102
|
+
} catch (cause) {
|
|
103
|
+
if (this.signal.aborted) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const error = new Error('Transport read failed', {
|
|
107
|
+
cause
|
|
108
|
+
});
|
|
109
|
+
const newTransport = this.#handleTransportError?.(error);
|
|
110
|
+
if (newTransport == null) {
|
|
111
|
+
// Abort client if no new transport is provided
|
|
112
|
+
this.abort(error);
|
|
113
|
+
} else {
|
|
114
|
+
// Abort running procedures and start using new transport
|
|
115
|
+
this.#abortControllers(error);
|
|
116
|
+
this.#transport = newTransport;
|
|
117
|
+
this.#setupTransport();
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
70
120
|
}
|
|
71
|
-
const msg = next.value;
|
|
72
121
|
const controller = this.#controllers[msg.payload.rid];
|
|
73
122
|
if (controller == null) {
|
|
74
123
|
console.warn(`No controller for request ${msg.payload.rid}`);
|
|
@@ -92,6 +141,11 @@ export class Client {
|
|
|
92
141
|
}
|
|
93
142
|
}
|
|
94
143
|
async #write(payload) {
|
|
144
|
+
if (this.signal.aborted) {
|
|
145
|
+
throw new Error('Client aborted', {
|
|
146
|
+
cause: this.signal.reason
|
|
147
|
+
});
|
|
148
|
+
}
|
|
95
149
|
const message = await this.#createMessage(payload);
|
|
96
150
|
await this.#transport.write(message);
|
|
97
151
|
}
|
|
@@ -116,12 +170,6 @@ export class Client {
|
|
|
116
170
|
});
|
|
117
171
|
return signal;
|
|
118
172
|
}
|
|
119
|
-
get disposed() {
|
|
120
|
-
return this.#transport.disposed;
|
|
121
|
-
}
|
|
122
|
-
async dispose() {
|
|
123
|
-
await this.#transport.dispose();
|
|
124
|
-
}
|
|
125
173
|
async sendEvent(procedure, ...args) {
|
|
126
174
|
const payload = args.length ? {
|
|
127
175
|
typ: 'event',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enkaku/client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://enkaku.dev",
|
|
6
6
|
"description": "Enkaku RPC client",
|
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
],
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@enkaku/async": "^0.
|
|
30
|
-
"@enkaku/
|
|
31
|
-
"@enkaku/
|
|
29
|
+
"@enkaku/async": "^0.10.1",
|
|
30
|
+
"@enkaku/stream": "^0.10.0",
|
|
31
|
+
"@enkaku/token": "^0.10.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@enkaku/protocol": "^0.
|
|
35
|
-
"@enkaku/transport": "^0.
|
|
34
|
+
"@enkaku/protocol": "^0.10.0",
|
|
35
|
+
"@enkaku/transport": "^0.10.0"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build:clean": "del lib",
|