@enkaku/client 0.12.1 → 0.12.3
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 +9 -2
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +143 -22
- package/lib/error.d.ts +2 -0
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +10 -0
- package/package.json +8 -7
package/lib/client.d.ts
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { Disposer } from '@enkaku/async';
|
|
2
|
-
import
|
|
2
|
+
import { type Logger } from '@enkaku/log';
|
|
3
|
+
import type { AnyProcedureDefinition, AnyRequestProcedureDefinition, ChannelProcedureDefinition, ClientTransportOf, DataOf, EventProcedureDefinition, ProtocolDefinition, RequestProcedureDefinition, RequestType, ReturnOf, StreamProcedureDefinition } from '@enkaku/protocol';
|
|
3
4
|
import { type TokenSigner } from '@enkaku/token';
|
|
4
5
|
type FilterNever<T> = {
|
|
5
6
|
[K in keyof T as T[K] extends never ? never : K]: T[K];
|
|
6
7
|
};
|
|
7
|
-
export type
|
|
8
|
+
export type RequestMeta = {
|
|
9
|
+
type: RequestType;
|
|
10
|
+
procedure: string;
|
|
11
|
+
};
|
|
12
|
+
export type RequestCall<Result> = Promise<Result> & RequestMeta & {
|
|
8
13
|
id: string;
|
|
9
14
|
abort: (reason?: string) => void;
|
|
10
15
|
signal: AbortSignal;
|
|
11
16
|
};
|
|
12
17
|
export type StreamCall<Receive, Result> = RequestCall<Result> & {
|
|
13
18
|
close: () => void;
|
|
19
|
+
procedure: string;
|
|
14
20
|
readable: ReadableStream<Receive>;
|
|
15
21
|
};
|
|
16
22
|
export type ChannelCall<Receive, Send, Result> = StreamCall<Receive, Result> & {
|
|
@@ -61,6 +67,7 @@ export type ClientParams<Protocol extends ProtocolDefinition> = {
|
|
|
61
67
|
getRandomID?: () => string;
|
|
62
68
|
handleTransportDisposed?: (signal: AbortSignal) => ClientTransportOf<Protocol> | void;
|
|
63
69
|
handleTransportError?: (error: Error) => ClientTransportOf<Protocol> | void;
|
|
70
|
+
logger?: Logger;
|
|
64
71
|
transport: ClientTransportOf<Protocol>;
|
|
65
72
|
serverID?: string;
|
|
66
73
|
signer?: TokenSigner | Promise<TokenSigner>;
|
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,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
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Disposer, defer } from '@enkaku/async';
|
|
2
|
+
import { getEnkakuLogger } from '@enkaku/log';
|
|
2
3
|
import { createPipe, writeTo } from '@enkaku/stream';
|
|
3
4
|
import { createUnsignedToken } from '@enkaku/token';
|
|
4
5
|
import { RequestError } from './error.js';
|
|
5
|
-
function createController(onDone) {
|
|
6
|
+
function createController(meta, onDone) {
|
|
6
7
|
const deferred = defer();
|
|
7
|
-
return Object.assign(new AbortController(), {
|
|
8
|
+
return Object.assign(new AbortController(), meta, {
|
|
8
9
|
result: deferred.promise,
|
|
9
10
|
ok: (value)=>{
|
|
10
11
|
deferred.resolve(value);
|
|
@@ -20,20 +21,20 @@ function createController(onDone) {
|
|
|
20
21
|
}
|
|
21
22
|
});
|
|
22
23
|
}
|
|
23
|
-
function createRequest(
|
|
24
|
+
function createRequest({ controller, sent, ...call }) {
|
|
24
25
|
const abort = (reason)=>{
|
|
25
26
|
void sent.then(()=>{
|
|
26
27
|
controller.abort(reason);
|
|
27
28
|
});
|
|
28
29
|
};
|
|
29
|
-
return Object.assign(sent.then(()=>controller.result), {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
return Object.assign(sent.then(()=>controller.result), call, {
|
|
31
|
+
type: controller.type,
|
|
32
|
+
procedure: controller.procedure,
|
|
33
|
+
abort
|
|
33
34
|
});
|
|
34
35
|
}
|
|
35
|
-
function createStream(
|
|
36
|
-
const request = createRequest(
|
|
36
|
+
function createStream({ readable, ...requestParams }) {
|
|
37
|
+
const request = createRequest(requestParams);
|
|
37
38
|
return Object.assign(request, {
|
|
38
39
|
close: ()=>request.abort('Close'),
|
|
39
40
|
readable
|
|
@@ -63,18 +64,23 @@ export class Client extends Disposer {
|
|
|
63
64
|
#handleTransportDisposed;
|
|
64
65
|
// biome-ignore lint/suspicious/noConfusingVoidType: return type
|
|
65
66
|
#handleTransportError;
|
|
67
|
+
#logger;
|
|
66
68
|
#transport;
|
|
67
69
|
constructor(params){
|
|
68
70
|
super({
|
|
69
71
|
dispose: async (reason)=>{
|
|
70
72
|
this.#abortControllers(reason);
|
|
71
73
|
await this.#transport.dispose(reason);
|
|
74
|
+
this.#logger.debug('disposed');
|
|
72
75
|
}
|
|
73
76
|
});
|
|
74
77
|
this.#createMessage = getCreateMessage(params.signer, params.serverID);
|
|
75
78
|
this.#getRandomID = params.getRandomID ?? defaultRandomID;
|
|
76
79
|
this.#handleTransportDisposed = params.handleTransportDisposed;
|
|
77
80
|
this.#handleTransportError = params.handleTransportError;
|
|
81
|
+
this.#logger = params.logger ?? getEnkakuLogger('client', {
|
|
82
|
+
clientID: this.#getRandomID()
|
|
83
|
+
});
|
|
78
84
|
this.#transport = params.transport;
|
|
79
85
|
// Start reading from transport
|
|
80
86
|
this.#setupTransport();
|
|
@@ -94,9 +100,11 @@ export class Client extends Disposer {
|
|
|
94
100
|
}
|
|
95
101
|
const newTransport = this.#handleTransportDisposed?.(this.#transport.signal);
|
|
96
102
|
if (newTransport == null) {
|
|
103
|
+
this.#logger.debug('transport disposed');
|
|
97
104
|
// Abort client if no new transport is provided
|
|
98
105
|
this.abort('TransportDisposed');
|
|
99
106
|
} else {
|
|
107
|
+
this.#logger.debug('using new transport provided by transport disposed handler');
|
|
100
108
|
// Abort running procedures and start using new transport
|
|
101
109
|
this.#abortControllers('TransportDisposed');
|
|
102
110
|
this.#transport = newTransport;
|
|
@@ -118,14 +126,19 @@ export class Client extends Disposer {
|
|
|
118
126
|
if (this.signal.aborted) {
|
|
119
127
|
return;
|
|
120
128
|
}
|
|
129
|
+
this.#logger.debug('failed to read from transport', {
|
|
130
|
+
cause
|
|
131
|
+
});
|
|
121
132
|
const error = new Error('Transport read failed', {
|
|
122
133
|
cause
|
|
123
134
|
});
|
|
124
135
|
const newTransport = this.#handleTransportError?.(error);
|
|
125
136
|
if (newTransport == null) {
|
|
137
|
+
this.#logger.warn('aborting following unhanded transport error');
|
|
126
138
|
// Abort client if no new transport is provided
|
|
127
139
|
this.abort(error);
|
|
128
140
|
} else {
|
|
141
|
+
this.#logger.debug('using new transport provided by transport error handler');
|
|
129
142
|
// Abort running procedures and start using new transport
|
|
130
143
|
this.#abortControllers(error);
|
|
131
144
|
this.#transport = newTransport;
|
|
@@ -135,18 +148,41 @@ export class Client extends Disposer {
|
|
|
135
148
|
}
|
|
136
149
|
const controller = this.#controllers[msg.payload.rid];
|
|
137
150
|
if (controller == null) {
|
|
138
|
-
|
|
151
|
+
this.#logger.warn('controller not found for request {rid}', {
|
|
152
|
+
rid: msg.payload.rid
|
|
153
|
+
});
|
|
139
154
|
continue;
|
|
140
155
|
}
|
|
141
156
|
switch(msg.payload.typ){
|
|
142
157
|
case 'error':
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
+
}
|
|
146
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
|
+
});
|
|
147
177
|
void controller.receive?.write(msg.payload.val);
|
|
148
178
|
break;
|
|
149
179
|
case 'result':
|
|
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
|
+
});
|
|
150
186
|
controller.ok(msg.payload.val);
|
|
151
187
|
delete this.#controllers[msg.payload.rid];
|
|
152
188
|
break;
|
|
@@ -169,6 +205,12 @@ export class Client extends Disposer {
|
|
|
169
205
|
]) : controller.signal;
|
|
170
206
|
signal.addEventListener('abort', ()=>{
|
|
171
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
|
+
});
|
|
172
214
|
void this.#write({
|
|
173
215
|
typ: 'abort',
|
|
174
216
|
rid,
|
|
@@ -192,15 +234,31 @@ export class Client extends Disposer {
|
|
|
192
234
|
typ: 'event',
|
|
193
235
|
prc: procedure
|
|
194
236
|
};
|
|
237
|
+
this.#logger.trace('send event {procedure}', {
|
|
238
|
+
procedure,
|
|
239
|
+
data: args[0]
|
|
240
|
+
});
|
|
195
241
|
await this.#write(payload);
|
|
196
242
|
}
|
|
197
243
|
request(procedure, ...args) {
|
|
198
244
|
const config = args[0] ?? {};
|
|
199
|
-
const controller = createController(
|
|
245
|
+
const controller = createController({
|
|
246
|
+
type: 'request',
|
|
247
|
+
procedure
|
|
248
|
+
});
|
|
200
249
|
const rid = config.id ?? this.#getRandomID();
|
|
201
250
|
const providedSignal = config?.signal;
|
|
202
251
|
if (providedSignal?.aborted) {
|
|
203
|
-
|
|
252
|
+
this.#logger.debug('reject aborted request {procedure} with ID { rid }', {
|
|
253
|
+
procedure,
|
|
254
|
+
rid
|
|
255
|
+
});
|
|
256
|
+
return createRequest({
|
|
257
|
+
id: rid,
|
|
258
|
+
controller,
|
|
259
|
+
signal: providedSignal,
|
|
260
|
+
sent: Promise.reject(providedSignal)
|
|
261
|
+
});
|
|
204
262
|
}
|
|
205
263
|
this.#controllers[rid] = controller;
|
|
206
264
|
const prm = config.param;
|
|
@@ -214,21 +272,44 @@ export class Client extends Disposer {
|
|
|
214
272
|
rid,
|
|
215
273
|
prc: procedure
|
|
216
274
|
};
|
|
275
|
+
this.#logger.trace('send request {procedure} with ID {rid}', {
|
|
276
|
+
procedure,
|
|
277
|
+
rid,
|
|
278
|
+
param: prm
|
|
279
|
+
});
|
|
217
280
|
const sent = this.#write(payload);
|
|
218
281
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
219
|
-
return createRequest(
|
|
282
|
+
return createRequest({
|
|
283
|
+
id: rid,
|
|
284
|
+
controller,
|
|
285
|
+
signal,
|
|
286
|
+
sent
|
|
287
|
+
});
|
|
220
288
|
}
|
|
221
289
|
createStream(procedure, ...args) {
|
|
222
290
|
const config = args[0] ?? {};
|
|
223
291
|
const receive = createPipe();
|
|
224
292
|
const writer = receive.writable.getWriter();
|
|
225
|
-
const controller = Object.assign(createController(
|
|
293
|
+
const controller = Object.assign(createController({
|
|
294
|
+
type: 'stream',
|
|
295
|
+
procedure
|
|
296
|
+
}, ()=>writer.close()), {
|
|
226
297
|
receive: writer
|
|
227
298
|
});
|
|
228
299
|
const rid = config.id ?? this.#getRandomID();
|
|
229
300
|
const providedSignal = config?.signal;
|
|
230
301
|
if (providedSignal?.aborted) {
|
|
231
|
-
|
|
302
|
+
this.#logger.debug('reject aborted stream creation {procedure} with ID {rid}', {
|
|
303
|
+
procedure,
|
|
304
|
+
rid
|
|
305
|
+
});
|
|
306
|
+
return createStream({
|
|
307
|
+
id: rid,
|
|
308
|
+
controller,
|
|
309
|
+
signal: providedSignal,
|
|
310
|
+
sent: Promise.reject(providedSignal),
|
|
311
|
+
readable: receive.readable
|
|
312
|
+
});
|
|
232
313
|
}
|
|
233
314
|
this.#controllers[rid] = controller;
|
|
234
315
|
const prm = config?.param;
|
|
@@ -242,23 +323,47 @@ export class Client extends Disposer {
|
|
|
242
323
|
rid,
|
|
243
324
|
prc: procedure
|
|
244
325
|
};
|
|
326
|
+
this.#logger.trace('create stream {procedure} with ID {rid}', {
|
|
327
|
+
procedure,
|
|
328
|
+
rid,
|
|
329
|
+
param: prm
|
|
330
|
+
});
|
|
245
331
|
const sent = this.#write(payload);
|
|
246
332
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
247
|
-
return createStream(
|
|
333
|
+
return createStream({
|
|
334
|
+
id: rid,
|
|
335
|
+
controller,
|
|
336
|
+
signal,
|
|
337
|
+
sent,
|
|
338
|
+
readable: receive.readable
|
|
339
|
+
});
|
|
248
340
|
}
|
|
249
341
|
createChannel(procedure, ...args) {
|
|
250
342
|
const config = args[0] ?? {};
|
|
251
343
|
const receive = createPipe();
|
|
252
344
|
const writer = receive.writable.getWriter();
|
|
253
|
-
const controller = Object.assign(createController(
|
|
345
|
+
const controller = Object.assign(createController({
|
|
346
|
+
type: 'channel',
|
|
347
|
+
procedure
|
|
348
|
+
}, ()=>writer.close()), {
|
|
254
349
|
receive: writer
|
|
255
350
|
});
|
|
256
351
|
const rid = config.id ?? this.#getRandomID();
|
|
257
352
|
const providedSignal = config?.signal;
|
|
258
353
|
if (providedSignal?.aborted) {
|
|
354
|
+
this.#logger.debug('reject aborted channel creation {procedure} with ID {rid}', {
|
|
355
|
+
procedure,
|
|
356
|
+
rid
|
|
357
|
+
});
|
|
259
358
|
// no-op
|
|
260
359
|
const send = async (_val)=>{};
|
|
261
|
-
return Object.assign(createStream(
|
|
360
|
+
return Object.assign(createStream({
|
|
361
|
+
id: rid,
|
|
362
|
+
controller,
|
|
363
|
+
signal: providedSignal,
|
|
364
|
+
sent: Promise.reject(providedSignal),
|
|
365
|
+
readable: receive.readable
|
|
366
|
+
}), {
|
|
262
367
|
send,
|
|
263
368
|
writable: writeTo(send)
|
|
264
369
|
});
|
|
@@ -275,16 +380,32 @@ export class Client extends Disposer {
|
|
|
275
380
|
rid,
|
|
276
381
|
prc: procedure
|
|
277
382
|
};
|
|
383
|
+
this.#logger.trace('create channel {procedure} with ID {rid}', {
|
|
384
|
+
procedure,
|
|
385
|
+
rid,
|
|
386
|
+
param: prm
|
|
387
|
+
});
|
|
278
388
|
const sent = this.#write(payload);
|
|
279
389
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
280
390
|
const send = async (val)=>{
|
|
391
|
+
this.#logger.trace('send value to channel {procedure} with ID {rid}', {
|
|
392
|
+
procedure,
|
|
393
|
+
rid,
|
|
394
|
+
value: val
|
|
395
|
+
});
|
|
281
396
|
await this.#write({
|
|
282
397
|
typ: 'send',
|
|
283
398
|
rid,
|
|
284
399
|
val
|
|
285
400
|
});
|
|
286
401
|
};
|
|
287
|
-
return Object.assign(createStream(
|
|
402
|
+
return Object.assign(createStream({
|
|
403
|
+
id: rid,
|
|
404
|
+
controller,
|
|
405
|
+
signal,
|
|
406
|
+
sent,
|
|
407
|
+
readable: receive.readable
|
|
408
|
+
}), {
|
|
288
409
|
send,
|
|
289
410
|
writable: writeTo(send)
|
|
290
411
|
});
|
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.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://enkaku.dev",
|
|
6
6
|
"description": "Enkaku RPC client",
|
|
@@ -26,14 +26,15 @@
|
|
|
26
26
|
],
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@enkaku/
|
|
29
|
+
"@enkaku/execution": "^0.12.3",
|
|
30
30
|
"@enkaku/async": "^0.12.2",
|
|
31
|
-
"@enkaku/
|
|
32
|
-
"@enkaku/
|
|
31
|
+
"@enkaku/stream": "^0.12.4",
|
|
32
|
+
"@enkaku/log": "^0.12.1",
|
|
33
|
+
"@enkaku/token": "^0.12.3"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
|
-
"@enkaku/
|
|
36
|
-
"@enkaku/
|
|
36
|
+
"@enkaku/protocol": "^0.12.1",
|
|
37
|
+
"@enkaku/transport": "^0.12.0"
|
|
37
38
|
},
|
|
38
39
|
"scripts": {
|
|
39
40
|
"build:clean": "del lib",
|
|
@@ -42,7 +43,7 @@
|
|
|
42
43
|
"build:types:ci": "tsc --emitDeclarationOnly --skipLibCheck --declarationMap false",
|
|
43
44
|
"build": "pnpm run build:clean && pnpm run build:js && pnpm run build:types",
|
|
44
45
|
"test:types": "tsc --noEmit --skipLibCheck",
|
|
45
|
-
"test:unit": "
|
|
46
|
+
"test:unit": "vitest run",
|
|
46
47
|
"test": "pnpm run test:types && pnpm run test:unit"
|
|
47
48
|
}
|
|
48
49
|
}
|