@enkaku/client 0.13.1 → 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 +132 -34
- 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;
|
|
@@ -173,14 +199,22 @@ 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
219
|
this.#logger.trace('result reply for {type} {procedure} with ID {rid}: {result}', {
|
|
186
220
|
type: controller.type,
|
|
@@ -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) {
|
|
@@ -232,37 +269,59 @@ 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
|
-
procedure
|
|
247
|
-
});
|
|
248
|
-
} else {
|
|
249
|
-
this.#logger.trace('send event {procedure} with data: {data}', {
|
|
250
|
-
procedure,
|
|
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,
|
|
251
283
|
data
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
|
|
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);
|
|
299
|
+
});
|
|
255
300
|
}
|
|
256
301
|
request(procedure, ...args) {
|
|
257
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);
|
|
258
313
|
const controller = createController({
|
|
259
314
|
type: 'request',
|
|
260
315
|
procedure,
|
|
261
316
|
header: config.header
|
|
262
317
|
});
|
|
263
|
-
const rid = config.id ?? this.#getRandomID();
|
|
264
318
|
const providedSignal = config.signal;
|
|
265
319
|
if (providedSignal?.aborted) {
|
|
320
|
+
span.setStatus({
|
|
321
|
+
code: SpanStatusCode.ERROR,
|
|
322
|
+
message: 'Aborted before send'
|
|
323
|
+
});
|
|
324
|
+
span.end();
|
|
266
325
|
this.#logger.debug('reject aborted request {procedure} with ID {rid}', {
|
|
267
326
|
procedure,
|
|
268
327
|
rid
|
|
@@ -298,7 +357,8 @@ export class Client extends Disposer {
|
|
|
298
357
|
param: prm
|
|
299
358
|
});
|
|
300
359
|
}
|
|
301
|
-
const sent = this.#write(payload, config.header);
|
|
360
|
+
const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
|
|
361
|
+
this.#endSpanOnResult(span, controller.result);
|
|
302
362
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
303
363
|
return createRequest({
|
|
304
364
|
id: rid,
|
|
@@ -309,6 +369,16 @@ export class Client extends Disposer {
|
|
|
309
369
|
}
|
|
310
370
|
createStream(procedure, ...args) {
|
|
311
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);
|
|
312
382
|
const receive = createPipe();
|
|
313
383
|
const writer = receive.writable.getWriter();
|
|
314
384
|
const controller = Object.assign(createController({
|
|
@@ -318,9 +388,13 @@ export class Client extends Disposer {
|
|
|
318
388
|
}, ()=>writer.close()), {
|
|
319
389
|
receive: writer
|
|
320
390
|
});
|
|
321
|
-
const rid = config.id ?? this.#getRandomID();
|
|
322
391
|
const providedSignal = config.signal;
|
|
323
392
|
if (providedSignal?.aborted) {
|
|
393
|
+
span.setStatus({
|
|
394
|
+
code: SpanStatusCode.ERROR,
|
|
395
|
+
message: 'Aborted before send'
|
|
396
|
+
});
|
|
397
|
+
span.end();
|
|
324
398
|
this.#logger.debug('reject aborted stream creation {procedure} with ID {rid}', {
|
|
325
399
|
procedure,
|
|
326
400
|
rid
|
|
@@ -334,6 +408,7 @@ export class Client extends Disposer {
|
|
|
334
408
|
});
|
|
335
409
|
}
|
|
336
410
|
this.#controllers[rid] = controller;
|
|
411
|
+
this.#spans[rid] = span;
|
|
337
412
|
const prm = config.param;
|
|
338
413
|
const payload = prm ? {
|
|
339
414
|
typ: 'stream',
|
|
@@ -357,7 +432,8 @@ export class Client extends Disposer {
|
|
|
357
432
|
param: prm
|
|
358
433
|
});
|
|
359
434
|
}
|
|
360
|
-
const sent = this.#write(payload, config.header);
|
|
435
|
+
const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
|
|
436
|
+
this.#endSpanOnResult(span, controller.result, rid);
|
|
361
437
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
362
438
|
return createStream({
|
|
363
439
|
id: rid,
|
|
@@ -369,6 +445,16 @@ export class Client extends Disposer {
|
|
|
369
445
|
}
|
|
370
446
|
createChannel(procedure, ...args) {
|
|
371
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);
|
|
372
458
|
const receive = createPipe();
|
|
373
459
|
const writer = receive.writable.getWriter();
|
|
374
460
|
const controller = Object.assign(createController({
|
|
@@ -378,9 +464,13 @@ export class Client extends Disposer {
|
|
|
378
464
|
}, ()=>writer.close()), {
|
|
379
465
|
receive: writer
|
|
380
466
|
});
|
|
381
|
-
const rid = config.id ?? this.#getRandomID();
|
|
382
467
|
const providedSignal = config.signal;
|
|
383
468
|
if (providedSignal?.aborted) {
|
|
469
|
+
span.setStatus({
|
|
470
|
+
code: SpanStatusCode.ERROR,
|
|
471
|
+
message: 'Aborted before send'
|
|
472
|
+
});
|
|
473
|
+
span.end();
|
|
384
474
|
this.#logger.debug('reject aborted channel creation {procedure} with ID {rid}', {
|
|
385
475
|
procedure,
|
|
386
476
|
rid
|
|
@@ -399,6 +489,7 @@ export class Client extends Disposer {
|
|
|
399
489
|
});
|
|
400
490
|
}
|
|
401
491
|
this.#controllers[rid] = controller;
|
|
492
|
+
this.#spans[rid] = span;
|
|
402
493
|
const prm = config.param;
|
|
403
494
|
const payload = prm ? {
|
|
404
495
|
typ: 'channel',
|
|
@@ -422,9 +513,16 @@ export class Client extends Disposer {
|
|
|
422
513
|
param: prm
|
|
423
514
|
});
|
|
424
515
|
}
|
|
425
|
-
const sent = this.#write(payload, config.header);
|
|
516
|
+
const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
|
|
517
|
+
this.#endSpanOnResult(span, controller.result, rid);
|
|
426
518
|
const signal = this.#handleSignal(rid, controller, providedSignal);
|
|
427
519
|
const send = async (val)=>{
|
|
520
|
+
const channelSpan = this.#spans[rid];
|
|
521
|
+
if (channelSpan != null) {
|
|
522
|
+
channelSpan.addEvent('channel.message.sent', {
|
|
523
|
+
[AttributeKeys.MESSAGE_DIRECTION]: 'send'
|
|
524
|
+
});
|
|
525
|
+
}
|
|
428
526
|
this.#logger.trace('send value to channel {procedure} with ID {rid}: {value}', {
|
|
429
527
|
procedure,
|
|
430
528
|
rid,
|
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",
|