@enkaku/client 0.13.0 → 0.14.0
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 +2 -0
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +173 -48
- package/package.json +9 -8
package/lib/client.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Disposer } from '@enkaku/async';
|
|
2
2
|
import { type Logger } from '@enkaku/log';
|
|
3
|
+
import { type Tracer } from '@enkaku/otel';
|
|
3
4
|
import type { AnyProcedureDefinition, AnyRequestProcedureDefinition, ChannelProcedureDefinition, ClientTransportOf, DataOf, EventProcedureDefinition, ProtocolDefinition, RequestProcedureDefinition, RequestType, ReturnOf, StreamProcedureDefinition } from '@enkaku/protocol';
|
|
4
5
|
import { type Identity } from '@enkaku/token';
|
|
5
6
|
type FilterNever<T> = {
|
|
@@ -69,6 +70,7 @@ export type ClientParams<Protocol extends ProtocolDefinition> = {
|
|
|
69
70
|
handleTransportDisposed?: (signal: AbortSignal) => ClientTransportOf<Protocol> | void;
|
|
70
71
|
handleTransportError?: (error: Error) => ClientTransportOf<Protocol> | void;
|
|
71
72
|
logger?: Logger;
|
|
73
|
+
tracer?: Tracer;
|
|
72
74
|
transport: ClientTransportOf<Protocol>;
|
|
73
75
|
serverID?: string;
|
|
74
76
|
identity?: Identity | Promise<Identity>;
|
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,WAAW,EACX,QAAQ,EACR,yBAAyB,EAC1B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAuB,KAAK,QAAQ,EAAqB,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/lib/client.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Disposer, defer } from '@enkaku/async';
|
|
2
2
|
import { getEnkakuLogger } from '@enkaku/log';
|
|
3
|
+
import { AttributeKeys, createTracer, injectTraceContext as otelInjectTraceContext, SpanNames, SpanStatusCode, setSpanOnContext, withActiveContext, withSpan } from '@enkaku/otel';
|
|
3
4
|
import { createPipe, writeTo } from '@enkaku/stream';
|
|
4
5
|
import { createUnsignedToken, isSigningIdentity } from '@enkaku/token';
|
|
5
6
|
import { RequestError } from './error.js';
|
|
7
|
+
const defaultTracer = createTracer('client');
|
|
6
8
|
function createController(params, onDone) {
|
|
7
9
|
const deferred = defer();
|
|
8
10
|
return Object.assign(new AbortController(), params, {
|
|
@@ -65,11 +67,13 @@ export class Client extends Disposer {
|
|
|
65
67
|
#controllers = {};
|
|
66
68
|
#createMessage;
|
|
67
69
|
#getRandomID;
|
|
70
|
+
#spans = {};
|
|
68
71
|
// biome-ignore lint/suspicious/noConfusingVoidType: return type
|
|
69
72
|
#handleTransportDisposed;
|
|
70
73
|
// biome-ignore lint/suspicious/noConfusingVoidType: return type
|
|
71
74
|
#handleTransportError;
|
|
72
75
|
#logger;
|
|
76
|
+
#tracer;
|
|
73
77
|
#transport;
|
|
74
78
|
constructor(params){
|
|
75
79
|
super({
|
|
@@ -86,6 +90,7 @@ export class Client extends Disposer {
|
|
|
86
90
|
this.#logger = params.logger ?? getEnkakuLogger('client', {
|
|
87
91
|
clientID: this.#getRandomID()
|
|
88
92
|
});
|
|
93
|
+
this.#tracer = params.tracer ?? defaultTracer;
|
|
89
94
|
this.#transport = params.transport;
|
|
90
95
|
// Start reading from transport
|
|
91
96
|
this.#setupTransport();
|
|
@@ -118,6 +123,27 @@ export class Client extends Disposer {
|
|
|
118
123
|
});
|
|
119
124
|
this.#read();
|
|
120
125
|
}
|
|
126
|
+
#endSpanOnResult(span, result, rid) {
|
|
127
|
+
result.then(()=>{
|
|
128
|
+
span.setStatus({
|
|
129
|
+
code: SpanStatusCode.OK
|
|
130
|
+
});
|
|
131
|
+
span.end();
|
|
132
|
+
if (rid != null) delete this.#spans[rid];
|
|
133
|
+
}, (error)=>{
|
|
134
|
+
if (error instanceof RequestError) {
|
|
135
|
+
span.setAttribute(AttributeKeys.ERROR_CODE, error.code);
|
|
136
|
+
span.setAttribute(AttributeKeys.ERROR_MESSAGE, error.message);
|
|
137
|
+
}
|
|
138
|
+
span.setStatus({
|
|
139
|
+
code: SpanStatusCode.ERROR,
|
|
140
|
+
message: error instanceof Error ? error.message : String(error)
|
|
141
|
+
});
|
|
142
|
+
span.recordException(error instanceof Error ? error : new Error(String(error)));
|
|
143
|
+
span.end();
|
|
144
|
+
if (rid != null) delete this.#spans[rid];
|
|
145
|
+
});
|
|
146
|
+
}
|
|
121
147
|
async #read() {
|
|
122
148
|
while(true){
|
|
123
149
|
let msg;
|
|
@@ -162,7 +188,7 @@ export class Client extends Disposer {
|
|
|
162
188
|
case 'error':
|
|
163
189
|
{
|
|
164
190
|
const error = RequestError.fromPayload(msg.payload);
|
|
165
|
-
this.#logger.debug('error reply for {type} {procedure} with ID {rid}', {
|
|
191
|
+
this.#logger.debug('error reply for {type} {procedure} with ID {rid}: {error}', {
|
|
166
192
|
type: controller.type,
|
|
167
193
|
procedure: controller.procedure,
|
|
168
194
|
rid: msg.payload.rid,
|
|
@@ -173,16 +199,24 @@ export class Client extends Disposer {
|
|
|
173
199
|
break;
|
|
174
200
|
}
|
|
175
201
|
case 'receive':
|
|
176
|
-
|
|
177
|
-
type:
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
202
|
+
{
|
|
203
|
+
this.#logger.trace('receive reply for {type} {procedure} with ID {rid}: {receive}', {
|
|
204
|
+
type: controller.type,
|
|
205
|
+
procedure: controller.procedure,
|
|
206
|
+
rid: msg.payload.rid,
|
|
207
|
+
receive: msg.payload.val
|
|
208
|
+
});
|
|
209
|
+
const receiveSpan = this.#spans[msg.payload.rid];
|
|
210
|
+
if (receiveSpan != null) {
|
|
211
|
+
receiveSpan.addEvent('stream.message.received', {
|
|
212
|
+
[AttributeKeys.MESSAGE_DIRECTION]: 'receive'
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
void controller.receive?.write(msg.payload.val);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
184
218
|
case 'result':
|
|
185
|
-
this.#logger.trace('result reply for {type} {procedure} with ID {rid}', {
|
|
219
|
+
this.#logger.trace('result reply for {type} {procedure} with ID {rid}: {result}', {
|
|
186
220
|
type: controller.type,
|
|
187
221
|
procedure: controller.procedure,
|
|
188
222
|
rid: msg.payload.rid,
|
|
@@ -200,7 +234,10 @@ export class Client extends Disposer {
|
|
|
200
234
|
cause: this.signal.reason
|
|
201
235
|
});
|
|
202
236
|
}
|
|
203
|
-
const
|
|
237
|
+
const baseHeader = header ?? {};
|
|
238
|
+
const enrichedHeader = otelInjectTraceContext(baseHeader);
|
|
239
|
+
const finalHeader = Object.keys(enrichedHeader).length > 0 ? enrichedHeader : undefined;
|
|
240
|
+
const message = await this.#createMessage(payload, finalHeader);
|
|
204
241
|
await this.#transport.write(message);
|
|
205
242
|
}
|
|
206
243
|
#handleSignal(rid, controller, providedSignal) {
|
|
@@ -210,7 +247,7 @@ export class Client extends Disposer {
|
|
|
210
247
|
]) : controller.signal;
|
|
211
248
|
signal.addEventListener('abort', ()=>{
|
|
212
249
|
const reason = signal.reason.name ?? signal.reason;
|
|
213
|
-
this.#logger.trace('abort {type} {procedure} with ID {rid}', {
|
|
250
|
+
this.#logger.trace('abort {type} {procedure} with ID {rid} and reason: {reason}', {
|
|
214
251
|
type: controller.type,
|
|
215
252
|
procedure: controller.procedure,
|
|
216
253
|
rid,
|
|
@@ -232,32 +269,60 @@ export class Client extends Disposer {
|
|
|
232
269
|
}
|
|
233
270
|
async sendEvent(procedure, ...args) {
|
|
234
271
|
const config = args[0] ?? {};
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
272
|
+
return withSpan(this.#tracer, SpanNames.CLIENT_CALL, {
|
|
273
|
+
attributes: {
|
|
274
|
+
[AttributeKeys.RPC_SYSTEM]: 'enkaku',
|
|
275
|
+
[AttributeKeys.RPC_PROCEDURE]: procedure,
|
|
276
|
+
[AttributeKeys.RPC_TYPE]: 'event'
|
|
277
|
+
}
|
|
278
|
+
}, async ()=>{
|
|
279
|
+
const data = config.data;
|
|
280
|
+
const payload = data ? {
|
|
281
|
+
typ: 'event',
|
|
282
|
+
prc: procedure,
|
|
283
|
+
data
|
|
284
|
+
} : {
|
|
285
|
+
typ: 'event',
|
|
286
|
+
prc: procedure
|
|
287
|
+
};
|
|
288
|
+
if (data == null) {
|
|
289
|
+
this.#logger.trace('send event {procedure} without data', {
|
|
290
|
+
procedure
|
|
291
|
+
});
|
|
292
|
+
} else {
|
|
293
|
+
this.#logger.trace('send event {procedure} with data: {data}', {
|
|
294
|
+
procedure,
|
|
295
|
+
data
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
await this.#write(payload, config.header);
|
|
247
299
|
});
|
|
248
|
-
await this.#write(payload, config.header);
|
|
249
300
|
}
|
|
250
301
|
request(procedure, ...args) {
|
|
251
302
|
const config = args[0] ?? {};
|
|
303
|
+
const rid = config.id ?? this.#getRandomID();
|
|
304
|
+
const span = this.#tracer.startSpan(SpanNames.CLIENT_CALL, {
|
|
305
|
+
attributes: {
|
|
306
|
+
[AttributeKeys.RPC_SYSTEM]: 'enkaku',
|
|
307
|
+
[AttributeKeys.RPC_PROCEDURE]: procedure,
|
|
308
|
+
[AttributeKeys.RPC_REQUEST_ID]: rid,
|
|
309
|
+
[AttributeKeys.RPC_TYPE]: 'request'
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
const spanCtx = setSpanOnContext(undefined, span);
|
|
252
313
|
const controller = createController({
|
|
253
314
|
type: 'request',
|
|
254
315
|
procedure,
|
|
255
316
|
header: config.header
|
|
256
317
|
});
|
|
257
|
-
const rid = config.id ?? this.#getRandomID();
|
|
258
318
|
const providedSignal = config.signal;
|
|
259
319
|
if (providedSignal?.aborted) {
|
|
260
|
-
|
|
320
|
+
span.setStatus({
|
|
321
|
+
code: SpanStatusCode.ERROR,
|
|
322
|
+
message: 'Aborted before send'
|
|
323
|
+
});
|
|
324
|
+
span.end();
|
|
325
|
+
this.#logger.debug('reject aborted request {procedure} with ID {rid}', {
|
|
261
326
|
procedure,
|
|
262
327
|
rid
|
|
263
328
|
});
|
|
@@ -280,12 +345,20 @@ export class Client extends Disposer {
|
|
|
280
345
|
rid,
|
|
281
346
|
prc: procedure
|
|
282
347
|
};
|
|
283
|
-
|
|
284
|
-
procedure,
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
348
|
+
if (prm == null) {
|
|
349
|
+
this.#logger.trace('send request {procedure} with ID {rid}', {
|
|
350
|
+
procedure,
|
|
351
|
+
rid
|
|
352
|
+
});
|
|
353
|
+
} else {
|
|
354
|
+
this.#logger.trace('send request {procedure} with ID {rid} and param: {param}', {
|
|
355
|
+
procedure,
|
|
356
|
+
rid,
|
|
357
|
+
param: prm
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
|
|
361
|
+
this.#endSpanOnResult(span, controller.result);
|
|
289
362
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
290
363
|
return createRequest({
|
|
291
364
|
id: rid,
|
|
@@ -296,6 +369,16 @@ export class Client extends Disposer {
|
|
|
296
369
|
}
|
|
297
370
|
createStream(procedure, ...args) {
|
|
298
371
|
const config = args[0] ?? {};
|
|
372
|
+
const rid = config.id ?? this.#getRandomID();
|
|
373
|
+
const span = this.#tracer.startSpan(SpanNames.CLIENT_CALL, {
|
|
374
|
+
attributes: {
|
|
375
|
+
[AttributeKeys.RPC_SYSTEM]: 'enkaku',
|
|
376
|
+
[AttributeKeys.RPC_PROCEDURE]: procedure,
|
|
377
|
+
[AttributeKeys.RPC_REQUEST_ID]: rid,
|
|
378
|
+
[AttributeKeys.RPC_TYPE]: 'stream'
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
const spanCtx = setSpanOnContext(undefined, span);
|
|
299
382
|
const receive = createPipe();
|
|
300
383
|
const writer = receive.writable.getWriter();
|
|
301
384
|
const controller = Object.assign(createController({
|
|
@@ -305,9 +388,13 @@ export class Client extends Disposer {
|
|
|
305
388
|
}, ()=>writer.close()), {
|
|
306
389
|
receive: writer
|
|
307
390
|
});
|
|
308
|
-
const rid = config.id ?? this.#getRandomID();
|
|
309
391
|
const providedSignal = config.signal;
|
|
310
392
|
if (providedSignal?.aborted) {
|
|
393
|
+
span.setStatus({
|
|
394
|
+
code: SpanStatusCode.ERROR,
|
|
395
|
+
message: 'Aborted before send'
|
|
396
|
+
});
|
|
397
|
+
span.end();
|
|
311
398
|
this.#logger.debug('reject aborted stream creation {procedure} with ID {rid}', {
|
|
312
399
|
procedure,
|
|
313
400
|
rid
|
|
@@ -321,6 +408,7 @@ export class Client extends Disposer {
|
|
|
321
408
|
});
|
|
322
409
|
}
|
|
323
410
|
this.#controllers[rid] = controller;
|
|
411
|
+
this.#spans[rid] = span;
|
|
324
412
|
const prm = config.param;
|
|
325
413
|
const payload = prm ? {
|
|
326
414
|
typ: 'stream',
|
|
@@ -332,12 +420,20 @@ export class Client extends Disposer {
|
|
|
332
420
|
rid,
|
|
333
421
|
prc: procedure
|
|
334
422
|
};
|
|
335
|
-
|
|
336
|
-
procedure,
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
423
|
+
if (prm == null) {
|
|
424
|
+
this.#logger.trace('create stream {procedure} with ID {rid}', {
|
|
425
|
+
procedure,
|
|
426
|
+
rid
|
|
427
|
+
});
|
|
428
|
+
} else {
|
|
429
|
+
this.#logger.trace('create stream {procedure} with ID {rid} and param: {param}', {
|
|
430
|
+
procedure,
|
|
431
|
+
rid,
|
|
432
|
+
param: prm
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
|
|
436
|
+
this.#endSpanOnResult(span, controller.result, rid);
|
|
341
437
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
342
438
|
return createStream({
|
|
343
439
|
id: rid,
|
|
@@ -349,6 +445,16 @@ export class Client extends Disposer {
|
|
|
349
445
|
}
|
|
350
446
|
createChannel(procedure, ...args) {
|
|
351
447
|
const config = args[0] ?? {};
|
|
448
|
+
const rid = config.id ?? this.#getRandomID();
|
|
449
|
+
const span = this.#tracer.startSpan(SpanNames.CLIENT_CALL, {
|
|
450
|
+
attributes: {
|
|
451
|
+
[AttributeKeys.RPC_SYSTEM]: 'enkaku',
|
|
452
|
+
[AttributeKeys.RPC_PROCEDURE]: procedure,
|
|
453
|
+
[AttributeKeys.RPC_REQUEST_ID]: rid,
|
|
454
|
+
[AttributeKeys.RPC_TYPE]: 'channel'
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
const spanCtx = setSpanOnContext(undefined, span);
|
|
352
458
|
const receive = createPipe();
|
|
353
459
|
const writer = receive.writable.getWriter();
|
|
354
460
|
const controller = Object.assign(createController({
|
|
@@ -358,9 +464,13 @@ export class Client extends Disposer {
|
|
|
358
464
|
}, ()=>writer.close()), {
|
|
359
465
|
receive: writer
|
|
360
466
|
});
|
|
361
|
-
const rid = config.id ?? this.#getRandomID();
|
|
362
467
|
const providedSignal = config.signal;
|
|
363
468
|
if (providedSignal?.aborted) {
|
|
469
|
+
span.setStatus({
|
|
470
|
+
code: SpanStatusCode.ERROR,
|
|
471
|
+
message: 'Aborted before send'
|
|
472
|
+
});
|
|
473
|
+
span.end();
|
|
364
474
|
this.#logger.debug('reject aborted channel creation {procedure} with ID {rid}', {
|
|
365
475
|
procedure,
|
|
366
476
|
rid
|
|
@@ -379,6 +489,7 @@ export class Client extends Disposer {
|
|
|
379
489
|
});
|
|
380
490
|
}
|
|
381
491
|
this.#controllers[rid] = controller;
|
|
492
|
+
this.#spans[rid] = span;
|
|
382
493
|
const prm = config.param;
|
|
383
494
|
const payload = prm ? {
|
|
384
495
|
typ: 'channel',
|
|
@@ -390,15 +501,29 @@ export class Client extends Disposer {
|
|
|
390
501
|
rid,
|
|
391
502
|
prc: procedure
|
|
392
503
|
};
|
|
393
|
-
|
|
394
|
-
procedure,
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
504
|
+
if (prm == null) {
|
|
505
|
+
this.#logger.trace('create channel {procedure} with ID {rid}', {
|
|
506
|
+
procedure,
|
|
507
|
+
rid
|
|
508
|
+
});
|
|
509
|
+
} else {
|
|
510
|
+
this.#logger.trace('create channel {procedure} with ID {rid} and param: {param}', {
|
|
511
|
+
procedure,
|
|
512
|
+
rid,
|
|
513
|
+
param: prm
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
|
|
517
|
+
this.#endSpanOnResult(span, controller.result, rid);
|
|
399
518
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
400
519
|
const send = async (val)=>{
|
|
401
|
-
|
|
520
|
+
const channelSpan = this.#spans[rid];
|
|
521
|
+
if (channelSpan != null) {
|
|
522
|
+
channelSpan.addEvent('channel.message.sent', {
|
|
523
|
+
[AttributeKeys.MESSAGE_DIRECTION]: 'send'
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
this.#logger.trace('send value to channel {procedure} with ID {rid}: {value}', {
|
|
402
527
|
procedure,
|
|
403
528
|
rid,
|
|
404
529
|
value: val
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enkaku/client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://enkaku.dev",
|
|
6
6
|
"description": "Enkaku RPC client",
|
|
@@ -26,15 +26,16 @@
|
|
|
26
26
|
],
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@enkaku/
|
|
30
|
-
"@enkaku/
|
|
31
|
-
"@enkaku/
|
|
32
|
-
"@enkaku/
|
|
33
|
-
"@enkaku/
|
|
29
|
+
"@enkaku/async": "^0.14.0",
|
|
30
|
+
"@enkaku/execution": "^0.14.0",
|
|
31
|
+
"@enkaku/log": "^0.14.0",
|
|
32
|
+
"@enkaku/stream": "^0.14.0",
|
|
33
|
+
"@enkaku/token": "^0.14.0",
|
|
34
|
+
"@enkaku/otel": "^0.14.0"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
|
-
"@enkaku/
|
|
37
|
-
"@enkaku/
|
|
37
|
+
"@enkaku/transport": "^0.14.0",
|
|
38
|
+
"@enkaku/protocol": "^0.14.0"
|
|
38
39
|
},
|
|
39
40
|
"scripts": {
|
|
40
41
|
"build:clean": "del lib",
|