@enkaku/client 0.12.2 → 0.12.4
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 +21 -3
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +136 -46
- package/lib/error.d.ts +2 -0
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +10 -0
- package/package.json +4 -4
package/lib/client.d.ts
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import { Disposer } from '@enkaku/async';
|
|
2
2
|
import { type Logger } from '@enkaku/log';
|
|
3
|
-
import type { AnyProcedureDefinition, AnyRequestProcedureDefinition, ChannelProcedureDefinition, ClientTransportOf, DataOf, EventProcedureDefinition, ProtocolDefinition, RequestProcedureDefinition, ReturnOf, StreamProcedureDefinition } from '@enkaku/protocol';
|
|
3
|
+
import type { AnyProcedureDefinition, AnyRequestProcedureDefinition, ChannelProcedureDefinition, ClientTransportOf, DataOf, EventProcedureDefinition, ProtocolDefinition, RequestProcedureDefinition, RequestType, ReturnOf, StreamProcedureDefinition } from '@enkaku/protocol';
|
|
4
4
|
import { type TokenSigner } from '@enkaku/token';
|
|
5
5
|
type FilterNever<T> = {
|
|
6
6
|
[K in keyof T as T[K] extends never ? never : K]: T[K];
|
|
7
7
|
};
|
|
8
|
-
export type
|
|
8
|
+
export type AnyHeader = Record<string, unknown>;
|
|
9
|
+
export type RequestMeta = {
|
|
10
|
+
type: RequestType;
|
|
11
|
+
procedure: string;
|
|
12
|
+
};
|
|
13
|
+
export type RequestCall<Result> = Promise<Result> & RequestMeta & {
|
|
9
14
|
id: string;
|
|
10
15
|
abort: (reason?: string) => void;
|
|
11
16
|
signal: AbortSignal;
|
|
12
17
|
};
|
|
13
18
|
export type StreamCall<Receive, Result> = RequestCall<Result> & {
|
|
14
19
|
close: () => void;
|
|
20
|
+
procedure: string;
|
|
15
21
|
readable: ReadableStream<Receive>;
|
|
16
22
|
};
|
|
17
23
|
export type ChannelCall<Receive, Send, Result> = StreamCall<Receive, Result> & {
|
|
@@ -70,30 +76,42 @@ export type ClientParams<Protocol extends ProtocolDefinition> = {
|
|
|
70
76
|
export declare class Client<Protocol extends ProtocolDefinition, ClientDefinitions extends ClientDefinitionsType<Protocol> = ClientDefinitionsType<Protocol>> extends Disposer {
|
|
71
77
|
#private;
|
|
72
78
|
constructor(params: ClientParams<Protocol>);
|
|
73
|
-
sendEvent<Procedure extends keyof ClientDefinitions['Events'] & string, T extends ClientDefinitions['Events'][Procedure] = ClientDefinitions['Events'][Procedure]>(procedure: Procedure, ...args: T['Data'] extends never ? [
|
|
79
|
+
sendEvent<Procedure extends keyof ClientDefinitions['Events'] & string, T extends ClientDefinitions['Events'][Procedure] = ClientDefinitions['Events'][Procedure]>(procedure: Procedure, ...args: T['Data'] extends never ? [config?: {
|
|
80
|
+
data?: never;
|
|
81
|
+
header?: AnyHeader;
|
|
82
|
+
}] : [config: {
|
|
83
|
+
data: T['Data'];
|
|
84
|
+
header?: AnyHeader;
|
|
85
|
+
}]): Promise<void>;
|
|
74
86
|
request<Procedure extends keyof ClientDefinitions['Requests'] & string, T extends ClientDefinitions['Requests'][Procedure] = ClientDefinitions['Requests'][Procedure]>(procedure: Procedure, ...args: T['Param'] extends never ? [config?: {
|
|
87
|
+
header?: AnyHeader;
|
|
75
88
|
id?: string;
|
|
76
89
|
param?: never;
|
|
77
90
|
signal?: AbortSignal;
|
|
78
91
|
}] : [config: {
|
|
92
|
+
header?: AnyHeader;
|
|
79
93
|
id?: string;
|
|
80
94
|
param: T['Param'];
|
|
81
95
|
signal?: AbortSignal;
|
|
82
96
|
}]): RequestCall<T['Result']> & Promise<T['Result']>;
|
|
83
97
|
createStream<Procedure extends keyof ClientDefinitions['Streams'] & string, T extends ClientDefinitions['Streams'][Procedure] = ClientDefinitions['Streams'][Procedure]>(procedure: Procedure, ...args: T['Param'] extends never ? [config?: {
|
|
98
|
+
header?: AnyHeader;
|
|
84
99
|
id?: string;
|
|
85
100
|
param?: never;
|
|
86
101
|
signal?: AbortSignal;
|
|
87
102
|
}] : [config: {
|
|
103
|
+
header?: AnyHeader;
|
|
88
104
|
id?: string;
|
|
89
105
|
param: T['Param'];
|
|
90
106
|
signal?: AbortSignal;
|
|
91
107
|
}]): StreamCall<T['Receive'], T['Result']>;
|
|
92
108
|
createChannel<Procedure extends keyof ClientDefinitions['Channels'] & string, T extends ClientDefinitions['Channels'][Procedure] = ClientDefinitions['Channels'][Procedure]>(procedure: Procedure, ...args: T['Param'] extends never ? [config?: {
|
|
109
|
+
header?: AnyHeader;
|
|
93
110
|
id?: string;
|
|
94
111
|
param?: never;
|
|
95
112
|
signal?: AbortSignal;
|
|
96
113
|
}] : [config: {
|
|
114
|
+
header?: AnyHeader;
|
|
97
115
|
id?: string;
|
|
98
116
|
param: T['Param'];
|
|
99
117
|
signal?: AbortSignal;
|
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,QAAQ,EAAS,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAGV,sBAAsB,EACtB,6BAA6B,EAE7B,0BAA0B,EAC1B,iBAAiB,EACjB,MAAM,EACN,wBAAwB,EACxB,kBAAkB,EAClB,0BAA0B,EAC1B,QAAQ,EACR,yBAAyB,EAC1B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAIrE,KAAK,WAAW,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAEhF,MAAM,MAAM,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/lib/client.js
CHANGED
|
@@ -3,9 +3,9 @@ import { getEnkakuLogger } from '@enkaku/log';
|
|
|
3
3
|
import { createPipe, writeTo } from '@enkaku/stream';
|
|
4
4
|
import { createUnsignedToken } from '@enkaku/token';
|
|
5
5
|
import { RequestError } from './error.js';
|
|
6
|
-
function createController(onDone) {
|
|
6
|
+
function createController(params, onDone) {
|
|
7
7
|
const deferred = defer();
|
|
8
|
-
return Object.assign(new AbortController(), {
|
|
8
|
+
return Object.assign(new AbortController(), params, {
|
|
9
9
|
result: deferred.promise,
|
|
10
10
|
ok: (value)=>{
|
|
11
11
|
deferred.resolve(value);
|
|
@@ -21,20 +21,20 @@ function createController(onDone) {
|
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
function createRequest(
|
|
24
|
+
function createRequest({ controller, sent, ...call }) {
|
|
25
25
|
const abort = (reason)=>{
|
|
26
26
|
void sent.then(()=>{
|
|
27
27
|
controller.abort(reason);
|
|
28
28
|
});
|
|
29
29
|
};
|
|
30
|
-
return Object.assign(sent.then(()=>controller.result), {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
return Object.assign(sent.then(()=>controller.result), call, {
|
|
31
|
+
type: controller.type,
|
|
32
|
+
procedure: controller.procedure,
|
|
33
|
+
abort
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
|
-
function createStream(
|
|
37
|
-
const request = createRequest(
|
|
36
|
+
function createStream({ readable, ...requestParams }) {
|
|
37
|
+
const request = createRequest(requestParams);
|
|
38
38
|
return Object.assign(request, {
|
|
39
39
|
close: ()=>request.abort('Close'),
|
|
40
40
|
readable
|
|
@@ -45,13 +45,13 @@ function getCreateMessage(signer, aud) {
|
|
|
45
45
|
return createUnsignedToken;
|
|
46
46
|
}
|
|
47
47
|
const signerPromise = Promise.resolve(signer);
|
|
48
|
-
const createToken = (payload)=>{
|
|
49
|
-
return signerPromise.then((s)=>s.createToken(payload));
|
|
48
|
+
const createToken = (payload, header)=>{
|
|
49
|
+
return signerPromise.then((s)=>s.createToken(payload, header));
|
|
50
50
|
};
|
|
51
|
-
return aud ? (payload)=>createToken({
|
|
51
|
+
return aud ? (payload, header)=>createToken({
|
|
52
52
|
aud,
|
|
53
53
|
...payload
|
|
54
|
-
}) : createToken;
|
|
54
|
+
}, header) : createToken;
|
|
55
55
|
}
|
|
56
56
|
function defaultRandomID() {
|
|
57
57
|
return globalThis.crypto.randomUUID();
|
|
@@ -71,6 +71,7 @@ export class Client extends Disposer {
|
|
|
71
71
|
dispose: async (reason)=>{
|
|
72
72
|
this.#abortControllers(reason);
|
|
73
73
|
await this.#transport.dispose(reason);
|
|
74
|
+
this.#logger.debug('disposed');
|
|
74
75
|
}
|
|
75
76
|
});
|
|
76
77
|
this.#createMessage = getCreateMessage(params.signer, params.serverID);
|
|
@@ -99,9 +100,11 @@ export class Client extends Disposer {
|
|
|
99
100
|
}
|
|
100
101
|
const newTransport = this.#handleTransportDisposed?.(this.#transport.signal);
|
|
101
102
|
if (newTransport == null) {
|
|
103
|
+
this.#logger.debug('transport disposed');
|
|
102
104
|
// Abort client if no new transport is provided
|
|
103
105
|
this.abort('TransportDisposed');
|
|
104
106
|
} else {
|
|
107
|
+
this.#logger.debug('using new transport provided by transport disposed handler');
|
|
105
108
|
// Abort running procedures and start using new transport
|
|
106
109
|
this.#abortControllers('TransportDisposed');
|
|
107
110
|
this.#transport = newTransport;
|
|
@@ -123,14 +126,19 @@ export class Client extends Disposer {
|
|
|
123
126
|
if (this.signal.aborted) {
|
|
124
127
|
return;
|
|
125
128
|
}
|
|
129
|
+
this.#logger.debug('failed to read from transport', {
|
|
130
|
+
cause
|
|
131
|
+
});
|
|
126
132
|
const error = new Error('Transport read failed', {
|
|
127
133
|
cause
|
|
128
134
|
});
|
|
129
135
|
const newTransport = this.#handleTransportError?.(error);
|
|
130
136
|
if (newTransport == null) {
|
|
137
|
+
this.#logger.warn('aborting following unhanded transport error');
|
|
131
138
|
// Abort client if no new transport is provided
|
|
132
139
|
this.abort(error);
|
|
133
140
|
} else {
|
|
141
|
+
this.#logger.debug('using new transport provided by transport error handler');
|
|
134
142
|
// Abort running procedures and start using new transport
|
|
135
143
|
this.#abortControllers(error);
|
|
136
144
|
this.#transport = newTransport;
|
|
@@ -147,28 +155,47 @@ export class Client extends Disposer {
|
|
|
147
155
|
}
|
|
148
156
|
switch(msg.payload.typ){
|
|
149
157
|
case 'error':
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
158
|
+
{
|
|
159
|
+
const error = RequestError.fromPayload(msg.payload);
|
|
160
|
+
this.#logger.debug('error reply for {type} {procedure} with ID {rid}', {
|
|
161
|
+
type: controller.type,
|
|
162
|
+
procedure: controller.procedure,
|
|
163
|
+
rid: msg.payload.rid,
|
|
164
|
+
error
|
|
165
|
+
});
|
|
166
|
+
controller.error(error);
|
|
167
|
+
delete this.#controllers[msg.payload.rid];
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
154
170
|
case 'receive':
|
|
171
|
+
this.#logger.trace('receive reply for {type} {procedure} with ID {rid}', {
|
|
172
|
+
type: controller.type,
|
|
173
|
+
procedure: controller.procedure,
|
|
174
|
+
rid: msg.payload.rid,
|
|
175
|
+
receive: msg.payload.val
|
|
176
|
+
});
|
|
155
177
|
void controller.receive?.write(msg.payload.val);
|
|
156
178
|
break;
|
|
157
179
|
case 'result':
|
|
158
|
-
this.#logger.trace('
|
|
180
|
+
this.#logger.trace('result reply for {type} {procedure} with ID {rid}', {
|
|
181
|
+
type: controller.type,
|
|
182
|
+
procedure: controller.procedure,
|
|
183
|
+
rid: msg.payload.rid,
|
|
184
|
+
result: msg.payload.val
|
|
185
|
+
});
|
|
159
186
|
controller.ok(msg.payload.val);
|
|
160
187
|
delete this.#controllers[msg.payload.rid];
|
|
161
188
|
break;
|
|
162
189
|
}
|
|
163
190
|
}
|
|
164
191
|
}
|
|
165
|
-
async #write(payload) {
|
|
192
|
+
async #write(payload, header) {
|
|
166
193
|
if (this.signal.aborted) {
|
|
167
194
|
throw new Error('Client aborted', {
|
|
168
195
|
cause: this.signal.reason
|
|
169
196
|
});
|
|
170
197
|
}
|
|
171
|
-
const message = await this.#createMessage(payload);
|
|
198
|
+
const message = await this.#createMessage(payload, header);
|
|
172
199
|
await this.#transport.write(message);
|
|
173
200
|
}
|
|
174
201
|
#handleSignal(rid, controller, providedSignal) {
|
|
@@ -178,11 +205,17 @@ export class Client extends Disposer {
|
|
|
178
205
|
]) : controller.signal;
|
|
179
206
|
signal.addEventListener('abort', ()=>{
|
|
180
207
|
const reason = signal.reason.name ?? signal.reason;
|
|
208
|
+
this.#logger.trace('abort {type} {procedure} with ID {rid}', {
|
|
209
|
+
type: controller.type,
|
|
210
|
+
procedure: controller.procedure,
|
|
211
|
+
rid,
|
|
212
|
+
reason
|
|
213
|
+
});
|
|
181
214
|
void this.#write({
|
|
182
215
|
typ: 'abort',
|
|
183
216
|
rid,
|
|
184
217
|
rsn: reason
|
|
185
|
-
});
|
|
218
|
+
}, controller.header);
|
|
186
219
|
if (signal.reason !== 'Close') {
|
|
187
220
|
controller.aborted(signal);
|
|
188
221
|
delete this.#controllers[rid];
|
|
@@ -193,30 +226,42 @@ export class Client extends Disposer {
|
|
|
193
226
|
return signal;
|
|
194
227
|
}
|
|
195
228
|
async sendEvent(procedure, ...args) {
|
|
196
|
-
const
|
|
229
|
+
const config = args[0] ?? {};
|
|
230
|
+
const data = config.data;
|
|
231
|
+
const payload = data ? {
|
|
197
232
|
typ: 'event',
|
|
198
233
|
prc: procedure,
|
|
199
|
-
data
|
|
234
|
+
data
|
|
200
235
|
} : {
|
|
201
236
|
typ: 'event',
|
|
202
237
|
prc: procedure
|
|
203
238
|
};
|
|
204
239
|
this.#logger.trace('send event {procedure}', {
|
|
205
|
-
procedure
|
|
240
|
+
procedure,
|
|
241
|
+
data
|
|
206
242
|
});
|
|
207
|
-
await this.#write(payload);
|
|
243
|
+
await this.#write(payload, config.header);
|
|
208
244
|
}
|
|
209
245
|
request(procedure, ...args) {
|
|
210
246
|
const config = args[0] ?? {};
|
|
211
|
-
const controller = createController(
|
|
247
|
+
const controller = createController({
|
|
248
|
+
type: 'request',
|
|
249
|
+
procedure,
|
|
250
|
+
header: config.header
|
|
251
|
+
});
|
|
212
252
|
const rid = config.id ?? this.#getRandomID();
|
|
213
|
-
const providedSignal = config
|
|
253
|
+
const providedSignal = config.signal;
|
|
214
254
|
if (providedSignal?.aborted) {
|
|
215
255
|
this.#logger.debug('reject aborted request {procedure} with ID { rid }', {
|
|
216
256
|
procedure,
|
|
217
257
|
rid
|
|
218
258
|
});
|
|
219
|
-
return createRequest(
|
|
259
|
+
return createRequest({
|
|
260
|
+
id: rid,
|
|
261
|
+
controller,
|
|
262
|
+
signal: providedSignal,
|
|
263
|
+
sent: Promise.reject(providedSignal)
|
|
264
|
+
});
|
|
220
265
|
}
|
|
221
266
|
this.#controllers[rid] = controller;
|
|
222
267
|
const prm = config.param;
|
|
@@ -232,30 +277,46 @@ export class Client extends Disposer {
|
|
|
232
277
|
};
|
|
233
278
|
this.#logger.trace('send request {procedure} with ID {rid}', {
|
|
234
279
|
procedure,
|
|
235
|
-
rid
|
|
280
|
+
rid,
|
|
281
|
+
param: prm
|
|
236
282
|
});
|
|
237
|
-
const sent = this.#write(payload);
|
|
283
|
+
const sent = this.#write(payload, config.header);
|
|
238
284
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
239
|
-
return createRequest(
|
|
285
|
+
return createRequest({
|
|
286
|
+
id: rid,
|
|
287
|
+
controller,
|
|
288
|
+
signal,
|
|
289
|
+
sent
|
|
290
|
+
});
|
|
240
291
|
}
|
|
241
292
|
createStream(procedure, ...args) {
|
|
242
293
|
const config = args[0] ?? {};
|
|
243
294
|
const receive = createPipe();
|
|
244
295
|
const writer = receive.writable.getWriter();
|
|
245
|
-
const controller = Object.assign(createController(
|
|
296
|
+
const controller = Object.assign(createController({
|
|
297
|
+
type: 'stream',
|
|
298
|
+
procedure,
|
|
299
|
+
header: config.header
|
|
300
|
+
}, ()=>writer.close()), {
|
|
246
301
|
receive: writer
|
|
247
302
|
});
|
|
248
303
|
const rid = config.id ?? this.#getRandomID();
|
|
249
|
-
const providedSignal = config
|
|
304
|
+
const providedSignal = config.signal;
|
|
250
305
|
if (providedSignal?.aborted) {
|
|
251
306
|
this.#logger.debug('reject aborted stream creation {procedure} with ID {rid}', {
|
|
252
307
|
procedure,
|
|
253
308
|
rid
|
|
254
309
|
});
|
|
255
|
-
return createStream(
|
|
310
|
+
return createStream({
|
|
311
|
+
id: rid,
|
|
312
|
+
controller,
|
|
313
|
+
signal: providedSignal,
|
|
314
|
+
sent: Promise.reject(providedSignal),
|
|
315
|
+
readable: receive.readable
|
|
316
|
+
});
|
|
256
317
|
}
|
|
257
318
|
this.#controllers[rid] = controller;
|
|
258
|
-
const prm = config
|
|
319
|
+
const prm = config.param;
|
|
259
320
|
const payload = prm ? {
|
|
260
321
|
typ: 'stream',
|
|
261
322
|
rid,
|
|
@@ -268,21 +329,32 @@ export class Client extends Disposer {
|
|
|
268
329
|
};
|
|
269
330
|
this.#logger.trace('create stream {procedure} with ID {rid}', {
|
|
270
331
|
procedure,
|
|
271
|
-
rid
|
|
332
|
+
rid,
|
|
333
|
+
param: prm
|
|
272
334
|
});
|
|
273
|
-
const sent = this.#write(payload);
|
|
335
|
+
const sent = this.#write(payload, config.header);
|
|
274
336
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
275
|
-
return createStream(
|
|
337
|
+
return createStream({
|
|
338
|
+
id: rid,
|
|
339
|
+
controller,
|
|
340
|
+
signal,
|
|
341
|
+
sent,
|
|
342
|
+
readable: receive.readable
|
|
343
|
+
});
|
|
276
344
|
}
|
|
277
345
|
createChannel(procedure, ...args) {
|
|
278
346
|
const config = args[0] ?? {};
|
|
279
347
|
const receive = createPipe();
|
|
280
348
|
const writer = receive.writable.getWriter();
|
|
281
|
-
const controller = Object.assign(createController(
|
|
349
|
+
const controller = Object.assign(createController({
|
|
350
|
+
type: 'channel',
|
|
351
|
+
procedure,
|
|
352
|
+
header: config.header
|
|
353
|
+
}, ()=>writer.close()), {
|
|
282
354
|
receive: writer
|
|
283
355
|
});
|
|
284
356
|
const rid = config.id ?? this.#getRandomID();
|
|
285
|
-
const providedSignal = config
|
|
357
|
+
const providedSignal = config.signal;
|
|
286
358
|
if (providedSignal?.aborted) {
|
|
287
359
|
this.#logger.debug('reject aborted channel creation {procedure} with ID {rid}', {
|
|
288
360
|
procedure,
|
|
@@ -290,13 +362,19 @@ export class Client extends Disposer {
|
|
|
290
362
|
});
|
|
291
363
|
// no-op
|
|
292
364
|
const send = async (_val)=>{};
|
|
293
|
-
return Object.assign(createStream(
|
|
365
|
+
return Object.assign(createStream({
|
|
366
|
+
id: rid,
|
|
367
|
+
controller,
|
|
368
|
+
signal: providedSignal,
|
|
369
|
+
sent: Promise.reject(providedSignal),
|
|
370
|
+
readable: receive.readable
|
|
371
|
+
}), {
|
|
294
372
|
send,
|
|
295
373
|
writable: writeTo(send)
|
|
296
374
|
});
|
|
297
375
|
}
|
|
298
376
|
this.#controllers[rid] = controller;
|
|
299
|
-
const prm = config
|
|
377
|
+
const prm = config.param;
|
|
300
378
|
const payload = prm ? {
|
|
301
379
|
typ: 'channel',
|
|
302
380
|
rid,
|
|
@@ -309,18 +387,30 @@ export class Client extends Disposer {
|
|
|
309
387
|
};
|
|
310
388
|
this.#logger.trace('create channel {procedure} with ID {rid}', {
|
|
311
389
|
procedure,
|
|
312
|
-
rid
|
|
390
|
+
rid,
|
|
391
|
+
param: prm
|
|
313
392
|
});
|
|
314
|
-
const sent = this.#write(payload);
|
|
393
|
+
const sent = this.#write(payload, config.header);
|
|
315
394
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
316
395
|
const send = async (val)=>{
|
|
396
|
+
this.#logger.trace('send value to channel {procedure} with ID {rid}', {
|
|
397
|
+
procedure,
|
|
398
|
+
rid,
|
|
399
|
+
value: val
|
|
400
|
+
});
|
|
317
401
|
await this.#write({
|
|
318
402
|
typ: 'send',
|
|
319
403
|
rid,
|
|
320
404
|
val
|
|
321
|
-
});
|
|
405
|
+
}, config.header);
|
|
322
406
|
};
|
|
323
|
-
return Object.assign(createStream(
|
|
407
|
+
return Object.assign(createStream({
|
|
408
|
+
id: rid,
|
|
409
|
+
controller,
|
|
410
|
+
signal,
|
|
411
|
+
sent,
|
|
412
|
+
readable: receive.readable
|
|
413
|
+
}), {
|
|
324
414
|
send,
|
|
325
415
|
writable: writeTo(send)
|
|
326
416
|
});
|
package/lib/error.d.ts
CHANGED
|
@@ -11,5 +11,7 @@ export declare class RequestError<Code extends string = string, Data extends Rec
|
|
|
11
11
|
constructor(params: RequestErrorParams<Code, Data>);
|
|
12
12
|
get code(): Code;
|
|
13
13
|
get data(): Data;
|
|
14
|
+
toString(): string;
|
|
15
|
+
toJSON(): ErrorObjectType<Code, Data>;
|
|
14
16
|
}
|
|
15
17
|
//# sourceMappingURL=error.d.ts.map
|
package/lib/error.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,MAAM,eAAe,CACzB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D;IACF,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,kBAAkB,CAC5B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAE9C,qBAAa,YAAY,CACrB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhE,SAAQ,KACR,YAAW,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;;IAEtC,MAAM,CAAC,WAAW,CAChB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;gBAWvD,MAAM,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC;IAOlD,IAAI,IAAI,IAAI,IAAI,CAEf;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,MAAM,eAAe,CACzB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D;IACF,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,kBAAkB,CAC5B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAE9C,qBAAa,YAAY,CACrB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhE,SAAQ,KACR,YAAW,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;;IAEtC,MAAM,CAAC,WAAW,CAChB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;gBAWvD,MAAM,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC;IAOlD,IAAI,IAAI,IAAI,IAAI,CAEf;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;IAED,QAAQ;IAIR,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;CAGtC"}
|
package/lib/error.js
CHANGED
|
@@ -20,4 +20,14 @@ export class RequestError extends Error {
|
|
|
20
20
|
get data() {
|
|
21
21
|
return this.#data;
|
|
22
22
|
}
|
|
23
|
+
toString() {
|
|
24
|
+
return `[RequestError] code ${this.#code}: ${this.message}`;
|
|
25
|
+
}
|
|
26
|
+
toJSON() {
|
|
27
|
+
return {
|
|
28
|
+
code: this.#code,
|
|
29
|
+
data: this.#data,
|
|
30
|
+
message: this.message
|
|
31
|
+
};
|
|
32
|
+
}
|
|
23
33
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enkaku/client",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.4",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://enkaku.dev",
|
|
6
6
|
"description": "Enkaku RPC client",
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@enkaku/async": "^0.12.2",
|
|
30
30
|
"@enkaku/execution": "^0.12.3",
|
|
31
|
-
"@enkaku/
|
|
32
|
-
"@enkaku/log": "^0.12.
|
|
33
|
-
"@enkaku/
|
|
31
|
+
"@enkaku/stream": "^0.12.4",
|
|
32
|
+
"@enkaku/log": "^0.12.1",
|
|
33
|
+
"@enkaku/token": "^0.12.3"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@enkaku/protocol": "^0.12.1",
|