@kultify/kmicro-js 0.2.2 → 0.2.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/dist/index.cjs +29 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -2
- package/dist/index.d.ts +23 -2
- package/dist/index.js +28 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -33,6 +33,7 @@ __export(index_exports, {
|
|
|
33
33
|
CallError: () => CallError,
|
|
34
34
|
Kmicro: () => Kmicro,
|
|
35
35
|
RequestContext: () => RequestContext,
|
|
36
|
+
ServiceError: () => ServiceError,
|
|
36
37
|
init: () => init
|
|
37
38
|
});
|
|
38
39
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -302,7 +303,8 @@ var Kmicro = class {
|
|
|
302
303
|
`error in handler: ${error_?.message}`
|
|
303
304
|
);
|
|
304
305
|
span.recordException(error_);
|
|
305
|
-
|
|
306
|
+
const code = error_ instanceof ServiceError ? error_.code : 500;
|
|
307
|
+
message.respondError(code, error_.message);
|
|
306
308
|
span.setStatus({ code: import_api.SpanStatusCode.ERROR });
|
|
307
309
|
} finally {
|
|
308
310
|
span.end();
|
|
@@ -372,13 +374,29 @@ var RequestContext = class {
|
|
|
372
374
|
);
|
|
373
375
|
}
|
|
374
376
|
};
|
|
377
|
+
var ServiceError = class extends Error {
|
|
378
|
+
constructor(code, message) {
|
|
379
|
+
super(message);
|
|
380
|
+
this.code = code;
|
|
381
|
+
this.name = "ServiceError";
|
|
382
|
+
}
|
|
383
|
+
};
|
|
375
384
|
var CallError = class extends Error {
|
|
376
|
-
constructor(message, target, payload) {
|
|
385
|
+
constructor(message, target, payload, code = "", description = "") {
|
|
377
386
|
super(message);
|
|
378
387
|
this.target = target;
|
|
379
388
|
this.payload = payload;
|
|
389
|
+
this.code = code;
|
|
390
|
+
this.description = description;
|
|
380
391
|
this.name = "CallError";
|
|
381
392
|
}
|
|
393
|
+
/**
|
|
394
|
+
* isClientError reports whether the endpoint refused the request with a
|
|
395
|
+
* 4xx code: sending the same request again gets the same answer.
|
|
396
|
+
*/
|
|
397
|
+
isClientError() {
|
|
398
|
+
return /^4\d\d$/.test(this.code);
|
|
399
|
+
}
|
|
382
400
|
};
|
|
383
401
|
async function doCall(nc, target, payload, meta, options) {
|
|
384
402
|
if (meta.callDepth >= 20) {
|
|
@@ -429,13 +447,17 @@ async function doCall(nc, target, payload, meta, options) {
|
|
|
429
447
|
headers: natsHeadersMap,
|
|
430
448
|
timeout: options?.timeout ?? 5e3
|
|
431
449
|
});
|
|
432
|
-
|
|
450
|
+
const errorCode = result.headers?.get("Nats-Service-Error-Code");
|
|
451
|
+
if (errorCode) {
|
|
452
|
+
const description = result.headers?.get("Nats-Service-Error") ?? "";
|
|
433
453
|
span.setStatus({ code: import_api.SpanStatusCode.ERROR });
|
|
434
|
-
span.recordException(
|
|
454
|
+
span.recordException(description);
|
|
435
455
|
throw new CallError(
|
|
436
|
-
`received error: ${
|
|
456
|
+
`received error: ${description}`,
|
|
437
457
|
target,
|
|
438
|
-
payload
|
|
458
|
+
payload,
|
|
459
|
+
errorCode,
|
|
460
|
+
description
|
|
439
461
|
);
|
|
440
462
|
}
|
|
441
463
|
span.setStatus({ code: import_api.SpanStatusCode.OK });
|
|
@@ -451,6 +473,7 @@ async function doCall(nc, target, payload, meta, options) {
|
|
|
451
473
|
CallError,
|
|
452
474
|
Kmicro,
|
|
453
475
|
RequestContext,
|
|
476
|
+
ServiceError,
|
|
454
477
|
init
|
|
455
478
|
});
|
|
456
479
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/KMicro.ts"],"sourcesContent":["export * from \"./KMicro.js\";\n","import assert from \"node:assert\";\nimport {\n\ttype ConsumerMessages,\n\ttype JetStreamClient,\n\tjetstream,\n} from \"@nats-io/jetstream\";\nimport { type Service, type ServiceGroup, Svcm } from \"@nats-io/services\";\nimport { connect, headers, type NatsConnection } from \"@nats-io/transport-node\";\nimport {\n\ttype Context,\n\tcontext,\n\tpropagation,\n\ttype Span,\n\tSpanKind,\n\tSpanStatusCode,\n\ttrace,\n} from \"@opentelemetry/api\";\nimport {\n\tATTR_RPC_METHOD,\n\tATTR_RPC_SERVICE,\n} from \"@opentelemetry/semantic-conventions/incubating\";\nimport pino, { type Logger } from \"pino\";\n\n/**\n * Use init to create a kmicro instance and directly start (init) it\n */\nexport async function init(\n\tnats: string,\n\tserviceName: string,\n\tversion: string,\n\tdescription?: string,\n\tlogger?: Logger,\n) {\n\tconst kmicro = new Kmicro(\n\t\t{\n\t\t\tname: serviceName,\n\t\t\tversion,\n\t\t\tdescription,\n\t\t},\n\t\tlogger,\n\t);\n\tawait kmicro.init(nats);\n\treturn kmicro;\n}\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ninterface Callable {\n\tcall(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t},\n\t): Promise<Uint8Array>;\n}\n\nexport type DomainEvent = {\n\tid: string;\n\tdomain: string;\n\ttype: string;\n\torgId: string;\n\tentityId: string;\n\tpayload: Uint8Array;\n};\n\nexport type EventHandler = (\n\tcontext_: RequestContext,\n\tevent: DomainEvent,\n) => Promise<void>;\n\nexport class Kmicro implements Callable {\n\tprivate service: Service | undefined;\n\tprivate group: ServiceGroup | undefined;\n\tprivate nc: NatsConnection | undefined;\n\tprivate js: JetStreamClient | undefined;\n\tprivate readonly consumers: ConsumerMessages[] = [];\n\tprivate readonly logger: Logger;\n\tprivate eventSubjectPrefix = \"events\";\n\n\tconstructor(\n\t\tprivate readonly meta: {\n\t\t\tname: string;\n\t\t\tversion: string;\n\t\t\tdescription: string | undefined;\n\t\t},\n\t\tlogger?: Logger,\n\t\toptions?: {\n\t\t\teventSubjectPrefix?: string;\n\t\t},\n\t) {\n\t\tthis.logger = logger ?? pino.pino();\n\t\tif (options?.eventSubjectPrefix) {\n\t\t\tthis.eventSubjectPrefix = options.eventSubjectPrefix;\n\t\t}\n\t}\n\n\tpublic getLogger(module?: string) {\n\t\treturn this.logger.child({ module });\n\t}\n\n\tpublic getNc(): NatsConnection {\n\t\tassert(this.nc);\n\t\treturn this.nc;\n\t}\n\n\tpublic async init(natsURI: string) {\n\t\tconst natsUrl = new URL(natsURI);\n\t\tthis.nc = await connect({\n\t\t\tname: this.meta.name,\n\t\t\tuser: natsUrl.username,\n\t\t\tpass: natsUrl.password,\n\t\t\tservers: [natsUrl.host],\n\t\t});\n\t\tconst svc = new Svcm(this.nc);\n\t\tthis.service = await svc.add({\n\t\t\tname: this.meta.name,\n\t\t\tversion: this.meta.version,\n\t\t\tdescription: this.meta.description,\n\t\t});\n\t\tthis.group = this.service.addGroup(this.meta.name);\n\t}\n\n\tprivate getJetStream(): JetStreamClient {\n\t\tassert(this.nc);\n\t\tif (!this.js) {\n\t\t\tthis.js = jetstream(this.nc);\n\t\t}\n\t\treturn this.js;\n\t}\n\n\tpublic async publish(event: DomainEvent): Promise<void> {\n\t\tassert(this.nc);\n\t\tconst js = this.getJetStream();\n\t\tconst subject = `${this.eventSubjectPrefix}.${event.orgId}.${event.domain}`;\n\n\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\t\tawait tracer.startActiveSpan(\n\t\t\t`publish: ${subject}`,\n\t\t\t{ kind: SpanKind.PRODUCER },\n\t\t\tasync (span) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst body = JSON.stringify({\n\t\t\t\t\t\tid: event.id,\n\t\t\t\t\t\tdomain: event.domain,\n\t\t\t\t\t\ttype: event.type,\n\t\t\t\t\t\torgId: event.orgId,\n\t\t\t\t\t\tpayload: Array.from(event.payload),\n\t\t\t\t\t});\n\n\t\t\t\t\tawait js.publish(subject, Buffer.from(body), {\n\t\t\t\t\t\tmsgID: event.id,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t} catch (error_) {\n\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\tthrow error_;\n\t\t\t\t} finally {\n\t\t\t\t\tspan.end();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic async subscribe(\n\t\tstreamName: string,\n\t\tconsumerName: string,\n\t\thandler: EventHandler,\n\t): Promise<void> {\n\t\tconst js = this.getJetStream();\n\t\tconst consumer = await js.consumers.get(streamName, consumerName);\n\t\tconst messages = await consumer.consume();\n\t\tthis.consumers.push(messages);\n\n\t\t(async () => {\n\t\t\tfor await (const msg of messages) {\n\t\t\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\n\t\t\t\tconst contextWithOtel: Context = propagation.extract(\n\t\t\t\t\tcontext.active(),\n\t\t\t\t\tmsg.headers,\n\t\t\t\t\t{\n\t\t\t\t\t\tget(carrier, key) {\n\t\t\t\t\t\t\treturn carrier?.get(key);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tkeys(carrier) {\n\t\t\t\t\t\t\treturn carrier?.keys() ?? [];\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tawait tracer.startActiveSpan(\n\t\t\t\t\t`event: ${streamName}.${consumerName}`,\n\t\t\t\t\t{ kind: SpanKind.CONSUMER },\n\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\tasync (span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet event: DomainEvent;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst parsed = JSON.parse(Buffer.from(msg.data).toString());\n\t\t\t\t\t\t\t\tevent = {\n\t\t\t\t\t\t\t\t\tid: parsed.id,\n\t\t\t\t\t\t\t\t\tdomain: parsed.domain,\n\t\t\t\t\t\t\t\t\ttype: parsed.type,\n\t\t\t\t\t\t\t\t\torgId: parsed.orgId,\n\t\t\t\t\t\t\t\t\tentityId: parsed.entityId,\n\t\t\t\t\t\t\t\t\tpayload: new Uint8Array(parsed.payload),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t\"failed to unmarshal domain event, terminating message\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tmsg.term();\n\t\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst header: Record<string, string> = {};\n\t\t\t\t\t\t\tfor (const key of msg.headers?.keys() ?? []) {\n\t\t\t\t\t\t\t\tif (msg.headers?.has(key)) {\n\t\t\t\t\t\t\t\t\theader[key] = msg.headers?.get(key);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst spanLogger = this.logger.child({\n\t\t\t\t\t\t\t\tevent: `${event.domain}.${event.type}`,\n\t\t\t\t\t\t\t\tspanId: span.spanContext().spanId,\n\t\t\t\t\t\t\t\ttraceId: span.spanContext().traceId,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst requestContext = new RequestContext(\n\t\t\t\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\t\tthis.getNc(),\n\t\t\t\t\t\t\t\tspanLogger,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcallDepth: 0,\n\t\t\t\t\t\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tawait handler(requestContext, event);\n\t\t\t\t\t\t\tmsg.ack();\n\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\t\t} catch (error_) {\n\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t{ err: error_ },\n\t\t\t\t\t\t\t\t`error in event handler: ${(error_ as Error)?.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t\t\tmsg.nak();\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t})();\n\t}\n\n\tpublic async stop() {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.close();\n\t\t}\n\t\tawait this.service?.stop().catch((error: unknown) => {\n\t\t\tconsole.error(error);\n\t\t});\n\t\tawait this.nc?.close().catch((error: unknown) => {\n\t\t\tconsole.error(error);\n\t\t});\n\t}\n\n\tpublic addEndpoint(\n\t\tname: string,\n\t\thandler: (\n\t\t\tcontext_: RequestContext,\n\t\t\tdata: Uint8Array,\n\t\t) => Promise<Uint8Array>,\n\t) {\n\t\tassert(this.group);\n\n\t\tthis.group.addEndpoint(name, async (error, message) => {\n\t\t\tassert(this.nc);\n\t\t\tif (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent infinite loops\n\t\t\tconst currentCallDepth = Number.parseInt(\n\t\t\t\tmessage.headers?.get(\"kmc-depth\") ?? \"0\",\n\t\t\t\t10,\n\t\t\t);\n\t\t\tif (currentCallDepth >= 20) {\n\t\t\t\tthrow new Error(`max call depth reached: ${currentCallDepth}`);\n\t\t\t}\n\n\t\t\tconst contextWithOtel: Context = propagation.extract(\n\t\t\t\tcontext.active(),\n\t\t\t\tmessage.headers,\n\t\t\t\t{\n\t\t\t\t\tget(carrier, key) {\n\t\t\t\t\t\treturn carrier?.get(key);\n\t\t\t\t\t},\n\t\t\t\t\tkeys(carrier) {\n\t\t\t\t\t\treturn carrier?.keys() ?? [];\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\t\t\tconst spanName = `handle: ${this.meta.name}.${name}`;\n\t\t\tawait tracer.startActiveSpan(\n\t\t\t\tspanName,\n\t\t\t\t{\n\t\t\t\t\tkind: SpanKind.SERVER,\n\t\t\t\t},\n\t\t\t\tcontextWithOtel,\n\t\t\t\tasync (span) => {\n\t\t\t\t\tconst spanLogger = this.logger.child({\n\t\t\t\t\t\taction: name,\n\t\t\t\t\t\tspanId: span.spanContext().spanId,\n\t\t\t\t\t\ttraceId: span.spanContext().traceId,\n\t\t\t\t\t});\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst header: Record<string, string> = {};\n\t\t\t\t\t\tfor (const key of message.headers?.keys() ?? []) {\n\t\t\t\t\t\t\tif (message.headers?.has(key)) {\n\t\t\t\t\t\t\t\theader[key] = message.headers?.get(key);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst requestContext = new RequestContext(\n\t\t\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: Checked with assert\n\t\t\t\t\t\t\tthis.nc!,\n\t\t\t\t\t\t\tspanLogger,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcallDepth: currentCallDepth,\n\t\t\t\t\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst result = await handler(requestContext, message.data);\n\t\t\t\t\t\tmessage.respond(result);\n\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\t} catch (error_) {\n\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terr: error_,\n\t\t\t\t\t\t\t\taction: name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`error in handler: ${(error_ as Error)?.message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\t\tmessage.respondError(500, (error_ as Error).message);\n\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tspan.end();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Start a new call\n\t */\n\tpublic async call(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t\theader?: Record<string, string>;\n\t\t\tmoleculerTrace?: {\n\t\t\t\ttraceId?: string | undefined;\n\t\t\t\tparentId?: string | undefined;\n\t\t\t};\n\t\t},\n\t): Promise<Uint8Array> {\n\t\tassert(this.nc);\n\n\t\tlet trace:\n\t\t\t| undefined\n\t\t\t| {\n\t\t\t\t\ttraceId: string;\n\t\t\t\t\tparentId: string;\n\t\t\t };\n\t\tif (options?.moleculerTrace) {\n\t\t\t// we have to shorten the moleculer trace id because the jaeger exporter uses only 16 chars\n\t\t\tconst molTraceId = options.moleculerTrace.traceId\n\t\t\t\t?.replaceAll(\"-\", \"\")\n\t\t\t\t.slice(0, 16);\n\t\t\tconst traceId = Array.from({ length: 16 })\n\t\t\t\t.fill(\"0\")\n\t\t\t\t.join(\"\")\n\t\t\t\t.concat(molTraceId ?? \"\");\n\t\t\tconst molParentId = options.moleculerTrace.parentId\n\t\t\t\t?.replaceAll(\"-\", \"\")\n\t\t\t\t.slice(0, 16);\n\t\t\ttrace = {\n\t\t\t\ttraceId,\n\t\t\t\tparentId: molParentId ?? \"\",\n\t\t\t};\n\t\t}\n\n\t\treturn doCall(\n\t\t\tthis.nc,\n\t\t\ttarget,\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\tcallDepth: 0,\n\t\t\t\tcontext: undefined,\n\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\theader: options?.header ?? {},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: options?.timeout,\n\t\t\t\ttrace,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class RequestContext {\n\t// eslint-disable-next-line max-params\n\tconstructor(\n\t\treadonly context: Context,\n\t\treadonly span: Span,\n\t\treadonly nc: NatsConnection,\n\t\tprivate readonly logger: Logger,\n\t\treadonly meta: {\n\t\t\tcallDepth: number;\n\t\t\tcurrentService: string;\n\t\t\theader: Record<string, string>;\n\t\t},\n\t) {}\n\n\tpublic getLogger(module?: string) {\n\t\treturn this.logger.child({\n\t\t\tmodule,\n\t\t});\n\t}\n\n\tpublic async call(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t\theader?: Record<string, string>;\n\t\t},\n\t): Promise<Uint8Array> {\n\t\treturn doCall(\n\t\t\tthis.nc,\n\t\t\ttarget,\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\tcallDepth: this.meta.callDepth,\n\t\t\t\tcontext: this.context,\n\t\t\t\tcurrentService: this.meta.currentService,\n\t\t\t\theader: this.meta.header,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n}\n\nexport class CallError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tprivate readonly target: string,\n\t\tprivate readonly payload: Uint8Array,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"CallError\";\n\t}\n}\n\n// eslint-disable-next-line max-params\nasync function doCall(\n\tnc: NatsConnection,\n\ttarget: string,\n\tpayload: Uint8Array,\n\tmeta: {\n\t\tcallDepth: number;\n\t\t/**\n\t\t * The otel context\n\t\t */\n\t\tcontext: Context | undefined;\n\t\tcurrentService: string;\n\t\t/**\n\t\t * Headers from the parent calls\n\t\t */\n\t\theader: Record<string, string>;\n\t},\n\toptions?: {\n\t\t/**\n\t\t * @default 5000 ms\n\t\t */\n\t\ttimeout?: number;\n\t\theader?: Record<string, string>;\n\t\t/**\n\t\t * Optionally pass an existing trace from the moleculer framework\n\t\t */\n\t\ttrace?: {\n\t\t\t/**\n\t\t\t * This is the ID of the whole trace forest and is used to uniquely identify a distributed trace through a system.\n\t\t\t */\n\t\t\ttraceId: string | undefined;\n\t\t\t/**\n\t\t\t * or span id: This is the ID of this request as known by the caller\n\t\t\t */\n\t\t\tparentId: string | undefined;\n\t\t};\n\t},\n): Promise<Uint8Array> {\n\tif (meta.callDepth >= 20) {\n\t\tthrow new Error(`max call depth reached: ${meta.callDepth}`);\n\t}\n\n\tconst carrierData: Context | { traceparent?: string } = meta.context ?? {};\n\tif (options?.trace && !meta.context) {\n\t\tconst version = Buffer.alloc(1).toString(\"hex\");\n\t\tconst flags = \"01\"; // means sampled\n\t\tconst header = `${version}-${options.trace.traceId}-${options.trace.parentId}-${flags}`;\n\t\t(carrierData as { traceparent?: string | undefined }).traceparent = header;\n\t}\n\n\tconst callingContext: Context = propagation.extract(\n\t\tcontext.active(),\n\t\tcarrierData,\n\t);\n\tconst tracer = trace.getTracer(\"default\");\n\tconst [service, action] = target.split(\".\");\n\treturn tracer.startActiveSpan(\n\t\t`call: ${target}`,\n\t\t{\n\t\t\tkind: SpanKind.CLIENT,\n\t\t\tattributes: {\n\t\t\t\t[ATTR_RPC_SERVICE]: service,\n\t\t\t\t[ATTR_RPC_METHOD]: action,\n\t\t\t},\n\t\t},\n\t\tcallingContext,\n\t\tasync (span) => {\n\t\t\t// Add kmicro and otel headers to the nats message headers\n\t\t\tconst natsHeadersMap = headers();\n\t\t\tnatsHeadersMap.set(\"kmc-depth\", (meta.callDepth + 1).toFixed(0));\n\t\t\tpropagation.inject(context.active(), natsHeadersMap, {\n\t\t\t\tset(carrier, key, value) {\n\t\t\t\t\tcarrier.set(key, value);\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst mergedHeaders = { ...meta.header, ...options?.header };\n\t\t\tfor (const key in mergedHeaders) {\n\t\t\t\tif (!Object.hasOwn(mergedHeaders, key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (mergedHeaders[key]) {\n\t\t\t\t\tnatsHeadersMap.set(key, mergedHeaders[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await nc.request(target, payload, {\n\t\t\t\t\theaders: natsHeadersMap,\n\t\t\t\t\ttimeout: options?.timeout ?? 5000,\n\t\t\t\t});\n\t\t\t\tif (result.headers?.get(\"Nats-Service-Error-Code\")) {\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\tspan.recordException(result.headers.get(\"Nats-Service-Error\"));\n\t\t\t\t\tthrow new CallError(\n\t\t\t\t\t\t`received error: ${result.headers.get(\"Nats-Service-Error\")}`,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\treturn result.data;\n\t\t\t} finally {\n\t\t\t\tspan.end();\n\t\t\t}\n\t\t},\n\t);\n}\n"],"mappings":"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","names":["pino","module","assert","trace","context"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/KMicro.ts"],"sourcesContent":["export * from \"./KMicro.js\";\n","import assert from \"node:assert\";\nimport {\n\ttype ConsumerMessages,\n\ttype JetStreamClient,\n\tjetstream,\n} from \"@nats-io/jetstream\";\nimport { type Service, type ServiceGroup, Svcm } from \"@nats-io/services\";\nimport { connect, headers, type NatsConnection } from \"@nats-io/transport-node\";\nimport {\n\ttype Context,\n\tcontext,\n\tpropagation,\n\ttype Span,\n\tSpanKind,\n\tSpanStatusCode,\n\ttrace,\n} from \"@opentelemetry/api\";\nimport {\n\tATTR_RPC_METHOD,\n\tATTR_RPC_SERVICE,\n} from \"@opentelemetry/semantic-conventions/incubating\";\nimport pino, { type Logger } from \"pino\";\n\n/**\n * Use init to create a kmicro instance and directly start (init) it\n */\nexport async function init(\n\tnats: string,\n\tserviceName: string,\n\tversion: string,\n\tdescription?: string,\n\tlogger?: Logger,\n) {\n\tconst kmicro = new Kmicro(\n\t\t{\n\t\t\tname: serviceName,\n\t\t\tversion,\n\t\t\tdescription,\n\t\t},\n\t\tlogger,\n\t);\n\tawait kmicro.init(nats);\n\treturn kmicro;\n}\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ninterface Callable {\n\tcall(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t},\n\t): Promise<Uint8Array>;\n}\n\nexport type DomainEvent = {\n\tid: string;\n\tdomain: string;\n\ttype: string;\n\torgId: string;\n\tentityId: string;\n\tpayload: Uint8Array;\n};\n\nexport type EventHandler = (\n\tcontext_: RequestContext,\n\tevent: DomainEvent,\n) => Promise<void>;\n\nexport class Kmicro implements Callable {\n\tprivate service: Service | undefined;\n\tprivate group: ServiceGroup | undefined;\n\tprivate nc: NatsConnection | undefined;\n\tprivate js: JetStreamClient | undefined;\n\tprivate readonly consumers: ConsumerMessages[] = [];\n\tprivate readonly logger: Logger;\n\tprivate eventSubjectPrefix = \"events\";\n\n\tconstructor(\n\t\tprivate readonly meta: {\n\t\t\tname: string;\n\t\t\tversion: string;\n\t\t\tdescription: string | undefined;\n\t\t},\n\t\tlogger?: Logger,\n\t\toptions?: {\n\t\t\teventSubjectPrefix?: string;\n\t\t},\n\t) {\n\t\tthis.logger = logger ?? pino.pino();\n\t\tif (options?.eventSubjectPrefix) {\n\t\t\tthis.eventSubjectPrefix = options.eventSubjectPrefix;\n\t\t}\n\t}\n\n\tpublic getLogger(module?: string) {\n\t\treturn this.logger.child({ module });\n\t}\n\n\tpublic getNc(): NatsConnection {\n\t\tassert(this.nc);\n\t\treturn this.nc;\n\t}\n\n\tpublic async init(natsURI: string) {\n\t\tconst natsUrl = new URL(natsURI);\n\t\tthis.nc = await connect({\n\t\t\tname: this.meta.name,\n\t\t\tuser: natsUrl.username,\n\t\t\tpass: natsUrl.password,\n\t\t\tservers: [natsUrl.host],\n\t\t});\n\t\tconst svc = new Svcm(this.nc);\n\t\tthis.service = await svc.add({\n\t\t\tname: this.meta.name,\n\t\t\tversion: this.meta.version,\n\t\t\tdescription: this.meta.description,\n\t\t});\n\t\tthis.group = this.service.addGroup(this.meta.name);\n\t}\n\n\tprivate getJetStream(): JetStreamClient {\n\t\tassert(this.nc);\n\t\tif (!this.js) {\n\t\t\tthis.js = jetstream(this.nc);\n\t\t}\n\t\treturn this.js;\n\t}\n\n\tpublic async publish(event: DomainEvent): Promise<void> {\n\t\tassert(this.nc);\n\t\tconst js = this.getJetStream();\n\t\tconst subject = `${this.eventSubjectPrefix}.${event.orgId}.${event.domain}`;\n\n\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\t\tawait tracer.startActiveSpan(\n\t\t\t`publish: ${subject}`,\n\t\t\t{ kind: SpanKind.PRODUCER },\n\t\t\tasync (span) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst body = JSON.stringify({\n\t\t\t\t\t\tid: event.id,\n\t\t\t\t\t\tdomain: event.domain,\n\t\t\t\t\t\ttype: event.type,\n\t\t\t\t\t\torgId: event.orgId,\n\t\t\t\t\t\tpayload: Array.from(event.payload),\n\t\t\t\t\t});\n\n\t\t\t\t\tawait js.publish(subject, Buffer.from(body), {\n\t\t\t\t\t\tmsgID: event.id,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t} catch (error_) {\n\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\tthrow error_;\n\t\t\t\t} finally {\n\t\t\t\t\tspan.end();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic async subscribe(\n\t\tstreamName: string,\n\t\tconsumerName: string,\n\t\thandler: EventHandler,\n\t): Promise<void> {\n\t\tconst js = this.getJetStream();\n\t\tconst consumer = await js.consumers.get(streamName, consumerName);\n\t\tconst messages = await consumer.consume();\n\t\tthis.consumers.push(messages);\n\n\t\t(async () => {\n\t\t\tfor await (const msg of messages) {\n\t\t\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\n\t\t\t\tconst contextWithOtel: Context = propagation.extract(\n\t\t\t\t\tcontext.active(),\n\t\t\t\t\tmsg.headers,\n\t\t\t\t\t{\n\t\t\t\t\t\tget(carrier, key) {\n\t\t\t\t\t\t\treturn carrier?.get(key);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tkeys(carrier) {\n\t\t\t\t\t\t\treturn carrier?.keys() ?? [];\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tawait tracer.startActiveSpan(\n\t\t\t\t\t`event: ${streamName}.${consumerName}`,\n\t\t\t\t\t{ kind: SpanKind.CONSUMER },\n\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\tasync (span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet event: DomainEvent;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst parsed = JSON.parse(Buffer.from(msg.data).toString());\n\t\t\t\t\t\t\t\tevent = {\n\t\t\t\t\t\t\t\t\tid: parsed.id,\n\t\t\t\t\t\t\t\t\tdomain: parsed.domain,\n\t\t\t\t\t\t\t\t\ttype: parsed.type,\n\t\t\t\t\t\t\t\t\torgId: parsed.orgId,\n\t\t\t\t\t\t\t\t\tentityId: parsed.entityId,\n\t\t\t\t\t\t\t\t\tpayload: new Uint8Array(parsed.payload),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t\"failed to unmarshal domain event, terminating message\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tmsg.term();\n\t\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst header: Record<string, string> = {};\n\t\t\t\t\t\t\tfor (const key of msg.headers?.keys() ?? []) {\n\t\t\t\t\t\t\t\tif (msg.headers?.has(key)) {\n\t\t\t\t\t\t\t\t\theader[key] = msg.headers?.get(key);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst spanLogger = this.logger.child({\n\t\t\t\t\t\t\t\tevent: `${event.domain}.${event.type}`,\n\t\t\t\t\t\t\t\tspanId: span.spanContext().spanId,\n\t\t\t\t\t\t\t\ttraceId: span.spanContext().traceId,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst requestContext = new RequestContext(\n\t\t\t\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\t\tthis.getNc(),\n\t\t\t\t\t\t\t\tspanLogger,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcallDepth: 0,\n\t\t\t\t\t\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tawait handler(requestContext, event);\n\t\t\t\t\t\t\tmsg.ack();\n\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\t\t} catch (error_) {\n\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t{ err: error_ },\n\t\t\t\t\t\t\t\t`error in event handler: ${(error_ as Error)?.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t\t\tmsg.nak();\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t})();\n\t}\n\n\tpublic async stop() {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.close();\n\t\t}\n\t\tawait this.service?.stop().catch((error: unknown) => {\n\t\t\tconsole.error(error);\n\t\t});\n\t\tawait this.nc?.close().catch((error: unknown) => {\n\t\t\tconsole.error(error);\n\t\t});\n\t}\n\n\tpublic addEndpoint(\n\t\tname: string,\n\t\thandler: (\n\t\t\tcontext_: RequestContext,\n\t\t\tdata: Uint8Array,\n\t\t) => Promise<Uint8Array>,\n\t) {\n\t\tassert(this.group);\n\n\t\tthis.group.addEndpoint(name, async (error, message) => {\n\t\t\tassert(this.nc);\n\t\t\tif (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent infinite loops\n\t\t\tconst currentCallDepth = Number.parseInt(\n\t\t\t\tmessage.headers?.get(\"kmc-depth\") ?? \"0\",\n\t\t\t\t10,\n\t\t\t);\n\t\t\tif (currentCallDepth >= 20) {\n\t\t\t\tthrow new Error(`max call depth reached: ${currentCallDepth}`);\n\t\t\t}\n\n\t\t\tconst contextWithOtel: Context = propagation.extract(\n\t\t\t\tcontext.active(),\n\t\t\t\tmessage.headers,\n\t\t\t\t{\n\t\t\t\t\tget(carrier, key) {\n\t\t\t\t\t\treturn carrier?.get(key);\n\t\t\t\t\t},\n\t\t\t\t\tkeys(carrier) {\n\t\t\t\t\t\treturn carrier?.keys() ?? [];\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\t\t\tconst spanName = `handle: ${this.meta.name}.${name}`;\n\t\t\tawait tracer.startActiveSpan(\n\t\t\t\tspanName,\n\t\t\t\t{\n\t\t\t\t\tkind: SpanKind.SERVER,\n\t\t\t\t},\n\t\t\t\tcontextWithOtel,\n\t\t\t\tasync (span) => {\n\t\t\t\t\tconst spanLogger = this.logger.child({\n\t\t\t\t\t\taction: name,\n\t\t\t\t\t\tspanId: span.spanContext().spanId,\n\t\t\t\t\t\ttraceId: span.spanContext().traceId,\n\t\t\t\t\t});\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst header: Record<string, string> = {};\n\t\t\t\t\t\tfor (const key of message.headers?.keys() ?? []) {\n\t\t\t\t\t\t\tif (message.headers?.has(key)) {\n\t\t\t\t\t\t\t\theader[key] = message.headers?.get(key);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst requestContext = new RequestContext(\n\t\t\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: Checked with assert\n\t\t\t\t\t\t\tthis.nc!,\n\t\t\t\t\t\t\tspanLogger,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcallDepth: currentCallDepth,\n\t\t\t\t\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst result = await handler(requestContext, message.data);\n\t\t\t\t\t\tmessage.respond(result);\n\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\t} catch (error_) {\n\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terr: error_,\n\t\t\t\t\t\t\t\taction: name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`error in handler: ${(error_ as Error)?.message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\t\tconst code = error_ instanceof ServiceError ? error_.code : 500;\n\t\t\t\t\t\tmessage.respondError(code, (error_ as Error).message);\n\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tspan.end();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Start a new call\n\t */\n\tpublic async call(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t\theader?: Record<string, string>;\n\t\t\tmoleculerTrace?: {\n\t\t\t\ttraceId?: string | undefined;\n\t\t\t\tparentId?: string | undefined;\n\t\t\t};\n\t\t},\n\t): Promise<Uint8Array> {\n\t\tassert(this.nc);\n\n\t\tlet trace:\n\t\t\t| undefined\n\t\t\t| {\n\t\t\t\t\ttraceId: string;\n\t\t\t\t\tparentId: string;\n\t\t\t };\n\t\tif (options?.moleculerTrace) {\n\t\t\t// we have to shorten the moleculer trace id because the jaeger exporter uses only 16 chars\n\t\t\tconst molTraceId = options.moleculerTrace.traceId\n\t\t\t\t?.replaceAll(\"-\", \"\")\n\t\t\t\t.slice(0, 16);\n\t\t\tconst traceId = Array.from({ length: 16 })\n\t\t\t\t.fill(\"0\")\n\t\t\t\t.join(\"\")\n\t\t\t\t.concat(molTraceId ?? \"\");\n\t\t\tconst molParentId = options.moleculerTrace.parentId\n\t\t\t\t?.replaceAll(\"-\", \"\")\n\t\t\t\t.slice(0, 16);\n\t\t\ttrace = {\n\t\t\t\ttraceId,\n\t\t\t\tparentId: molParentId ?? \"\",\n\t\t\t};\n\t\t}\n\n\t\treturn doCall(\n\t\t\tthis.nc,\n\t\t\ttarget,\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\tcallDepth: 0,\n\t\t\t\tcontext: undefined,\n\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\theader: options?.header ?? {},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: options?.timeout,\n\t\t\t\ttrace,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class RequestContext {\n\t// eslint-disable-next-line max-params\n\tconstructor(\n\t\treadonly context: Context,\n\t\treadonly span: Span,\n\t\treadonly nc: NatsConnection,\n\t\tprivate readonly logger: Logger,\n\t\treadonly meta: {\n\t\t\tcallDepth: number;\n\t\t\tcurrentService: string;\n\t\t\theader: Record<string, string>;\n\t\t},\n\t) {}\n\n\tpublic getLogger(module?: string) {\n\t\treturn this.logger.child({\n\t\t\tmodule,\n\t\t});\n\t}\n\n\tpublic async call(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t\theader?: Record<string, string>;\n\t\t},\n\t): Promise<Uint8Array> {\n\t\treturn doCall(\n\t\t\tthis.nc,\n\t\t\ttarget,\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\tcallDepth: this.meta.callDepth,\n\t\t\t\tcontext: this.context,\n\t\t\t\tcurrentService: this.meta.currentService,\n\t\t\t\theader: this.meta.header,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n}\n\n/**\n * ServiceError is a failure a handler answers with a code of its choosing,\n * such as 400 for a request it refuses. Any other error a handler throws\n * answers 500.\n */\nexport class ServiceError extends Error {\n\tconstructor(\n\t\treadonly code: number,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"ServiceError\";\n\t}\n}\n\n/**\n * CallError is a remote endpoint that answered with an error. code is the\n * endpoint's Nats-Service-Error-Code, such as \"400\" or \"500\", and\n * description its Nats-Service-Error text.\n */\nexport class CallError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tprivate readonly target: string,\n\t\tprivate readonly payload: Uint8Array,\n\t\treadonly code: string = \"\",\n\t\treadonly description: string = \"\",\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"CallError\";\n\t}\n\n\t/**\n\t * isClientError reports whether the endpoint refused the request with a\n\t * 4xx code: sending the same request again gets the same answer.\n\t */\n\tisClientError(): boolean {\n\t\treturn /^4\\d\\d$/.test(this.code);\n\t}\n}\n\n// eslint-disable-next-line max-params\nasync function doCall(\n\tnc: NatsConnection,\n\ttarget: string,\n\tpayload: Uint8Array,\n\tmeta: {\n\t\tcallDepth: number;\n\t\t/**\n\t\t * The otel context\n\t\t */\n\t\tcontext: Context | undefined;\n\t\tcurrentService: string;\n\t\t/**\n\t\t * Headers from the parent calls\n\t\t */\n\t\theader: Record<string, string>;\n\t},\n\toptions?: {\n\t\t/**\n\t\t * @default 5000 ms\n\t\t */\n\t\ttimeout?: number;\n\t\theader?: Record<string, string>;\n\t\t/**\n\t\t * Optionally pass an existing trace from the moleculer framework\n\t\t */\n\t\ttrace?: {\n\t\t\t/**\n\t\t\t * This is the ID of the whole trace forest and is used to uniquely identify a distributed trace through a system.\n\t\t\t */\n\t\t\ttraceId: string | undefined;\n\t\t\t/**\n\t\t\t * or span id: This is the ID of this request as known by the caller\n\t\t\t */\n\t\t\tparentId: string | undefined;\n\t\t};\n\t},\n): Promise<Uint8Array> {\n\tif (meta.callDepth >= 20) {\n\t\tthrow new Error(`max call depth reached: ${meta.callDepth}`);\n\t}\n\n\tconst carrierData: Context | { traceparent?: string } = meta.context ?? {};\n\tif (options?.trace && !meta.context) {\n\t\tconst version = Buffer.alloc(1).toString(\"hex\");\n\t\tconst flags = \"01\"; // means sampled\n\t\tconst header = `${version}-${options.trace.traceId}-${options.trace.parentId}-${flags}`;\n\t\t(carrierData as { traceparent?: string | undefined }).traceparent = header;\n\t}\n\n\tconst callingContext: Context = propagation.extract(\n\t\tcontext.active(),\n\t\tcarrierData,\n\t);\n\tconst tracer = trace.getTracer(\"default\");\n\tconst [service, action] = target.split(\".\");\n\treturn tracer.startActiveSpan(\n\t\t`call: ${target}`,\n\t\t{\n\t\t\tkind: SpanKind.CLIENT,\n\t\t\tattributes: {\n\t\t\t\t[ATTR_RPC_SERVICE]: service,\n\t\t\t\t[ATTR_RPC_METHOD]: action,\n\t\t\t},\n\t\t},\n\t\tcallingContext,\n\t\tasync (span) => {\n\t\t\t// Add kmicro and otel headers to the nats message headers\n\t\t\tconst natsHeadersMap = headers();\n\t\t\tnatsHeadersMap.set(\"kmc-depth\", (meta.callDepth + 1).toFixed(0));\n\t\t\tpropagation.inject(context.active(), natsHeadersMap, {\n\t\t\t\tset(carrier, key, value) {\n\t\t\t\t\tcarrier.set(key, value);\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst mergedHeaders = { ...meta.header, ...options?.header };\n\t\t\tfor (const key in mergedHeaders) {\n\t\t\t\tif (!Object.hasOwn(mergedHeaders, key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (mergedHeaders[key]) {\n\t\t\t\t\tnatsHeadersMap.set(key, mergedHeaders[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await nc.request(target, payload, {\n\t\t\t\t\theaders: natsHeadersMap,\n\t\t\t\t\ttimeout: options?.timeout ?? 5000,\n\t\t\t\t});\n\t\t\t\tconst errorCode = result.headers?.get(\"Nats-Service-Error-Code\");\n\t\t\t\tif (errorCode) {\n\t\t\t\t\tconst description = result.headers?.get(\"Nats-Service-Error\") ?? \"\";\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\tspan.recordException(description);\n\t\t\t\t\tthrow new CallError(\n\t\t\t\t\t\t`received error: ${description}`,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t\terrorCode,\n\t\t\t\t\t\tdescription,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\treturn result.data;\n\t\t\t} finally {\n\t\t\t\tspan.end();\n\t\t\t}\n\t\t},\n\t);\n}\n"],"mappings":"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","names":["pino","module","assert","trace","context"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -86,10 +86,31 @@ declare class RequestContext {
|
|
|
86
86
|
header?: Record<string, string>;
|
|
87
87
|
}): Promise<Uint8Array>;
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* ServiceError is a failure a handler answers with a code of its choosing,
|
|
91
|
+
* such as 400 for a request it refuses. Any other error a handler throws
|
|
92
|
+
* answers 500.
|
|
93
|
+
*/
|
|
94
|
+
declare class ServiceError extends Error {
|
|
95
|
+
readonly code: number;
|
|
96
|
+
constructor(code: number, message: string);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* CallError is a remote endpoint that answered with an error. code is the
|
|
100
|
+
* endpoint's Nats-Service-Error-Code, such as "400" or "500", and
|
|
101
|
+
* description its Nats-Service-Error text.
|
|
102
|
+
*/
|
|
89
103
|
declare class CallError extends Error {
|
|
90
104
|
private readonly target;
|
|
91
105
|
private readonly payload;
|
|
92
|
-
|
|
106
|
+
readonly code: string;
|
|
107
|
+
readonly description: string;
|
|
108
|
+
constructor(message: string, target: string, payload: Uint8Array, code?: string, description?: string);
|
|
109
|
+
/**
|
|
110
|
+
* isClientError reports whether the endpoint refused the request with a
|
|
111
|
+
* 4xx code: sending the same request again gets the same answer.
|
|
112
|
+
*/
|
|
113
|
+
isClientError(): boolean;
|
|
93
114
|
}
|
|
94
115
|
|
|
95
|
-
export { CallError, type DomainEvent, type EventHandler, Kmicro, RequestContext, init };
|
|
116
|
+
export { CallError, type DomainEvent, type EventHandler, Kmicro, RequestContext, ServiceError, init };
|
package/dist/index.d.ts
CHANGED
|
@@ -86,10 +86,31 @@ declare class RequestContext {
|
|
|
86
86
|
header?: Record<string, string>;
|
|
87
87
|
}): Promise<Uint8Array>;
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* ServiceError is a failure a handler answers with a code of its choosing,
|
|
91
|
+
* such as 400 for a request it refuses. Any other error a handler throws
|
|
92
|
+
* answers 500.
|
|
93
|
+
*/
|
|
94
|
+
declare class ServiceError extends Error {
|
|
95
|
+
readonly code: number;
|
|
96
|
+
constructor(code: number, message: string);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* CallError is a remote endpoint that answered with an error. code is the
|
|
100
|
+
* endpoint's Nats-Service-Error-Code, such as "400" or "500", and
|
|
101
|
+
* description its Nats-Service-Error text.
|
|
102
|
+
*/
|
|
89
103
|
declare class CallError extends Error {
|
|
90
104
|
private readonly target;
|
|
91
105
|
private readonly payload;
|
|
92
|
-
|
|
106
|
+
readonly code: string;
|
|
107
|
+
readonly description: string;
|
|
108
|
+
constructor(message: string, target: string, payload: Uint8Array, code?: string, description?: string);
|
|
109
|
+
/**
|
|
110
|
+
* isClientError reports whether the endpoint refused the request with a
|
|
111
|
+
* 4xx code: sending the same request again gets the same answer.
|
|
112
|
+
*/
|
|
113
|
+
isClientError(): boolean;
|
|
93
114
|
}
|
|
94
115
|
|
|
95
|
-
export { CallError, type DomainEvent, type EventHandler, Kmicro, RequestContext, init };
|
|
116
|
+
export { CallError, type DomainEvent, type EventHandler, Kmicro, RequestContext, ServiceError, init };
|
package/dist/index.js
CHANGED
|
@@ -274,7 +274,8 @@ var Kmicro = class {
|
|
|
274
274
|
`error in handler: ${error_?.message}`
|
|
275
275
|
);
|
|
276
276
|
span.recordException(error_);
|
|
277
|
-
|
|
277
|
+
const code = error_ instanceof ServiceError ? error_.code : 500;
|
|
278
|
+
message.respondError(code, error_.message);
|
|
278
279
|
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
279
280
|
} finally {
|
|
280
281
|
span.end();
|
|
@@ -344,13 +345,29 @@ var RequestContext = class {
|
|
|
344
345
|
);
|
|
345
346
|
}
|
|
346
347
|
};
|
|
348
|
+
var ServiceError = class extends Error {
|
|
349
|
+
constructor(code, message) {
|
|
350
|
+
super(message);
|
|
351
|
+
this.code = code;
|
|
352
|
+
this.name = "ServiceError";
|
|
353
|
+
}
|
|
354
|
+
};
|
|
347
355
|
var CallError = class extends Error {
|
|
348
|
-
constructor(message, target, payload) {
|
|
356
|
+
constructor(message, target, payload, code = "", description = "") {
|
|
349
357
|
super(message);
|
|
350
358
|
this.target = target;
|
|
351
359
|
this.payload = payload;
|
|
360
|
+
this.code = code;
|
|
361
|
+
this.description = description;
|
|
352
362
|
this.name = "CallError";
|
|
353
363
|
}
|
|
364
|
+
/**
|
|
365
|
+
* isClientError reports whether the endpoint refused the request with a
|
|
366
|
+
* 4xx code: sending the same request again gets the same answer.
|
|
367
|
+
*/
|
|
368
|
+
isClientError() {
|
|
369
|
+
return /^4\d\d$/.test(this.code);
|
|
370
|
+
}
|
|
354
371
|
};
|
|
355
372
|
async function doCall(nc, target, payload, meta, options) {
|
|
356
373
|
if (meta.callDepth >= 20) {
|
|
@@ -401,13 +418,17 @@ async function doCall(nc, target, payload, meta, options) {
|
|
|
401
418
|
headers: natsHeadersMap,
|
|
402
419
|
timeout: options?.timeout ?? 5e3
|
|
403
420
|
});
|
|
404
|
-
|
|
421
|
+
const errorCode = result.headers?.get("Nats-Service-Error-Code");
|
|
422
|
+
if (errorCode) {
|
|
423
|
+
const description = result.headers?.get("Nats-Service-Error") ?? "";
|
|
405
424
|
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
406
|
-
span.recordException(
|
|
425
|
+
span.recordException(description);
|
|
407
426
|
throw new CallError(
|
|
408
|
-
`received error: ${
|
|
427
|
+
`received error: ${description}`,
|
|
409
428
|
target,
|
|
410
|
-
payload
|
|
429
|
+
payload,
|
|
430
|
+
errorCode,
|
|
431
|
+
description
|
|
411
432
|
);
|
|
412
433
|
}
|
|
413
434
|
span.setStatus({ code: SpanStatusCode.OK });
|
|
@@ -422,6 +443,7 @@ export {
|
|
|
422
443
|
CallError,
|
|
423
444
|
Kmicro,
|
|
424
445
|
RequestContext,
|
|
446
|
+
ServiceError,
|
|
425
447
|
init
|
|
426
448
|
};
|
|
427
449
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/KMicro.ts"],"sourcesContent":["import assert from \"node:assert\";\nimport {\n\ttype ConsumerMessages,\n\ttype JetStreamClient,\n\tjetstream,\n} from \"@nats-io/jetstream\";\nimport { type Service, type ServiceGroup, Svcm } from \"@nats-io/services\";\nimport { connect, headers, type NatsConnection } from \"@nats-io/transport-node\";\nimport {\n\ttype Context,\n\tcontext,\n\tpropagation,\n\ttype Span,\n\tSpanKind,\n\tSpanStatusCode,\n\ttrace,\n} from \"@opentelemetry/api\";\nimport {\n\tATTR_RPC_METHOD,\n\tATTR_RPC_SERVICE,\n} from \"@opentelemetry/semantic-conventions/incubating\";\nimport pino, { type Logger } from \"pino\";\n\n/**\n * Use init to create a kmicro instance and directly start (init) it\n */\nexport async function init(\n\tnats: string,\n\tserviceName: string,\n\tversion: string,\n\tdescription?: string,\n\tlogger?: Logger,\n) {\n\tconst kmicro = new Kmicro(\n\t\t{\n\t\t\tname: serviceName,\n\t\t\tversion,\n\t\t\tdescription,\n\t\t},\n\t\tlogger,\n\t);\n\tawait kmicro.init(nats);\n\treturn kmicro;\n}\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ninterface Callable {\n\tcall(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t},\n\t): Promise<Uint8Array>;\n}\n\nexport type DomainEvent = {\n\tid: string;\n\tdomain: string;\n\ttype: string;\n\torgId: string;\n\tentityId: string;\n\tpayload: Uint8Array;\n};\n\nexport type EventHandler = (\n\tcontext_: RequestContext,\n\tevent: DomainEvent,\n) => Promise<void>;\n\nexport class Kmicro implements Callable {\n\tprivate service: Service | undefined;\n\tprivate group: ServiceGroup | undefined;\n\tprivate nc: NatsConnection | undefined;\n\tprivate js: JetStreamClient | undefined;\n\tprivate readonly consumers: ConsumerMessages[] = [];\n\tprivate readonly logger: Logger;\n\tprivate eventSubjectPrefix = \"events\";\n\n\tconstructor(\n\t\tprivate readonly meta: {\n\t\t\tname: string;\n\t\t\tversion: string;\n\t\t\tdescription: string | undefined;\n\t\t},\n\t\tlogger?: Logger,\n\t\toptions?: {\n\t\t\teventSubjectPrefix?: string;\n\t\t},\n\t) {\n\t\tthis.logger = logger ?? pino.pino();\n\t\tif (options?.eventSubjectPrefix) {\n\t\t\tthis.eventSubjectPrefix = options.eventSubjectPrefix;\n\t\t}\n\t}\n\n\tpublic getLogger(module?: string) {\n\t\treturn this.logger.child({ module });\n\t}\n\n\tpublic getNc(): NatsConnection {\n\t\tassert(this.nc);\n\t\treturn this.nc;\n\t}\n\n\tpublic async init(natsURI: string) {\n\t\tconst natsUrl = new URL(natsURI);\n\t\tthis.nc = await connect({\n\t\t\tname: this.meta.name,\n\t\t\tuser: natsUrl.username,\n\t\t\tpass: natsUrl.password,\n\t\t\tservers: [natsUrl.host],\n\t\t});\n\t\tconst svc = new Svcm(this.nc);\n\t\tthis.service = await svc.add({\n\t\t\tname: this.meta.name,\n\t\t\tversion: this.meta.version,\n\t\t\tdescription: this.meta.description,\n\t\t});\n\t\tthis.group = this.service.addGroup(this.meta.name);\n\t}\n\n\tprivate getJetStream(): JetStreamClient {\n\t\tassert(this.nc);\n\t\tif (!this.js) {\n\t\t\tthis.js = jetstream(this.nc);\n\t\t}\n\t\treturn this.js;\n\t}\n\n\tpublic async publish(event: DomainEvent): Promise<void> {\n\t\tassert(this.nc);\n\t\tconst js = this.getJetStream();\n\t\tconst subject = `${this.eventSubjectPrefix}.${event.orgId}.${event.domain}`;\n\n\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\t\tawait tracer.startActiveSpan(\n\t\t\t`publish: ${subject}`,\n\t\t\t{ kind: SpanKind.PRODUCER },\n\t\t\tasync (span) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst body = JSON.stringify({\n\t\t\t\t\t\tid: event.id,\n\t\t\t\t\t\tdomain: event.domain,\n\t\t\t\t\t\ttype: event.type,\n\t\t\t\t\t\torgId: event.orgId,\n\t\t\t\t\t\tpayload: Array.from(event.payload),\n\t\t\t\t\t});\n\n\t\t\t\t\tawait js.publish(subject, Buffer.from(body), {\n\t\t\t\t\t\tmsgID: event.id,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t} catch (error_) {\n\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\tthrow error_;\n\t\t\t\t} finally {\n\t\t\t\t\tspan.end();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic async subscribe(\n\t\tstreamName: string,\n\t\tconsumerName: string,\n\t\thandler: EventHandler,\n\t): Promise<void> {\n\t\tconst js = this.getJetStream();\n\t\tconst consumer = await js.consumers.get(streamName, consumerName);\n\t\tconst messages = await consumer.consume();\n\t\tthis.consumers.push(messages);\n\n\t\t(async () => {\n\t\t\tfor await (const msg of messages) {\n\t\t\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\n\t\t\t\tconst contextWithOtel: Context = propagation.extract(\n\t\t\t\t\tcontext.active(),\n\t\t\t\t\tmsg.headers,\n\t\t\t\t\t{\n\t\t\t\t\t\tget(carrier, key) {\n\t\t\t\t\t\t\treturn carrier?.get(key);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tkeys(carrier) {\n\t\t\t\t\t\t\treturn carrier?.keys() ?? [];\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tawait tracer.startActiveSpan(\n\t\t\t\t\t`event: ${streamName}.${consumerName}`,\n\t\t\t\t\t{ kind: SpanKind.CONSUMER },\n\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\tasync (span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet event: DomainEvent;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst parsed = JSON.parse(Buffer.from(msg.data).toString());\n\t\t\t\t\t\t\t\tevent = {\n\t\t\t\t\t\t\t\t\tid: parsed.id,\n\t\t\t\t\t\t\t\t\tdomain: parsed.domain,\n\t\t\t\t\t\t\t\t\ttype: parsed.type,\n\t\t\t\t\t\t\t\t\torgId: parsed.orgId,\n\t\t\t\t\t\t\t\t\tentityId: parsed.entityId,\n\t\t\t\t\t\t\t\t\tpayload: new Uint8Array(parsed.payload),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t\"failed to unmarshal domain event, terminating message\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tmsg.term();\n\t\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst header: Record<string, string> = {};\n\t\t\t\t\t\t\tfor (const key of msg.headers?.keys() ?? []) {\n\t\t\t\t\t\t\t\tif (msg.headers?.has(key)) {\n\t\t\t\t\t\t\t\t\theader[key] = msg.headers?.get(key);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst spanLogger = this.logger.child({\n\t\t\t\t\t\t\t\tevent: `${event.domain}.${event.type}`,\n\t\t\t\t\t\t\t\tspanId: span.spanContext().spanId,\n\t\t\t\t\t\t\t\ttraceId: span.spanContext().traceId,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst requestContext = new RequestContext(\n\t\t\t\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\t\tthis.getNc(),\n\t\t\t\t\t\t\t\tspanLogger,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcallDepth: 0,\n\t\t\t\t\t\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tawait handler(requestContext, event);\n\t\t\t\t\t\t\tmsg.ack();\n\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\t\t} catch (error_) {\n\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t{ err: error_ },\n\t\t\t\t\t\t\t\t`error in event handler: ${(error_ as Error)?.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t\t\tmsg.nak();\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t})();\n\t}\n\n\tpublic async stop() {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.close();\n\t\t}\n\t\tawait this.service?.stop().catch((error: unknown) => {\n\t\t\tconsole.error(error);\n\t\t});\n\t\tawait this.nc?.close().catch((error: unknown) => {\n\t\t\tconsole.error(error);\n\t\t});\n\t}\n\n\tpublic addEndpoint(\n\t\tname: string,\n\t\thandler: (\n\t\t\tcontext_: RequestContext,\n\t\t\tdata: Uint8Array,\n\t\t) => Promise<Uint8Array>,\n\t) {\n\t\tassert(this.group);\n\n\t\tthis.group.addEndpoint(name, async (error, message) => {\n\t\t\tassert(this.nc);\n\t\t\tif (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent infinite loops\n\t\t\tconst currentCallDepth = Number.parseInt(\n\t\t\t\tmessage.headers?.get(\"kmc-depth\") ?? \"0\",\n\t\t\t\t10,\n\t\t\t);\n\t\t\tif (currentCallDepth >= 20) {\n\t\t\t\tthrow new Error(`max call depth reached: ${currentCallDepth}`);\n\t\t\t}\n\n\t\t\tconst contextWithOtel: Context = propagation.extract(\n\t\t\t\tcontext.active(),\n\t\t\t\tmessage.headers,\n\t\t\t\t{\n\t\t\t\t\tget(carrier, key) {\n\t\t\t\t\t\treturn carrier?.get(key);\n\t\t\t\t\t},\n\t\t\t\t\tkeys(carrier) {\n\t\t\t\t\t\treturn carrier?.keys() ?? [];\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\t\t\tconst spanName = `handle: ${this.meta.name}.${name}`;\n\t\t\tawait tracer.startActiveSpan(\n\t\t\t\tspanName,\n\t\t\t\t{\n\t\t\t\t\tkind: SpanKind.SERVER,\n\t\t\t\t},\n\t\t\t\tcontextWithOtel,\n\t\t\t\tasync (span) => {\n\t\t\t\t\tconst spanLogger = this.logger.child({\n\t\t\t\t\t\taction: name,\n\t\t\t\t\t\tspanId: span.spanContext().spanId,\n\t\t\t\t\t\ttraceId: span.spanContext().traceId,\n\t\t\t\t\t});\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst header: Record<string, string> = {};\n\t\t\t\t\t\tfor (const key of message.headers?.keys() ?? []) {\n\t\t\t\t\t\t\tif (message.headers?.has(key)) {\n\t\t\t\t\t\t\t\theader[key] = message.headers?.get(key);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst requestContext = new RequestContext(\n\t\t\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: Checked with assert\n\t\t\t\t\t\t\tthis.nc!,\n\t\t\t\t\t\t\tspanLogger,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcallDepth: currentCallDepth,\n\t\t\t\t\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst result = await handler(requestContext, message.data);\n\t\t\t\t\t\tmessage.respond(result);\n\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\t} catch (error_) {\n\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terr: error_,\n\t\t\t\t\t\t\t\taction: name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`error in handler: ${(error_ as Error)?.message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\t\tmessage.respondError(500, (error_ as Error).message);\n\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tspan.end();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Start a new call\n\t */\n\tpublic async call(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t\theader?: Record<string, string>;\n\t\t\tmoleculerTrace?: {\n\t\t\t\ttraceId?: string | undefined;\n\t\t\t\tparentId?: string | undefined;\n\t\t\t};\n\t\t},\n\t): Promise<Uint8Array> {\n\t\tassert(this.nc);\n\n\t\tlet trace:\n\t\t\t| undefined\n\t\t\t| {\n\t\t\t\t\ttraceId: string;\n\t\t\t\t\tparentId: string;\n\t\t\t };\n\t\tif (options?.moleculerTrace) {\n\t\t\t// we have to shorten the moleculer trace id because the jaeger exporter uses only 16 chars\n\t\t\tconst molTraceId = options.moleculerTrace.traceId\n\t\t\t\t?.replaceAll(\"-\", \"\")\n\t\t\t\t.slice(0, 16);\n\t\t\tconst traceId = Array.from({ length: 16 })\n\t\t\t\t.fill(\"0\")\n\t\t\t\t.join(\"\")\n\t\t\t\t.concat(molTraceId ?? \"\");\n\t\t\tconst molParentId = options.moleculerTrace.parentId\n\t\t\t\t?.replaceAll(\"-\", \"\")\n\t\t\t\t.slice(0, 16);\n\t\t\ttrace = {\n\t\t\t\ttraceId,\n\t\t\t\tparentId: molParentId ?? \"\",\n\t\t\t};\n\t\t}\n\n\t\treturn doCall(\n\t\t\tthis.nc,\n\t\t\ttarget,\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\tcallDepth: 0,\n\t\t\t\tcontext: undefined,\n\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\theader: options?.header ?? {},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: options?.timeout,\n\t\t\t\ttrace,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class RequestContext {\n\t// eslint-disable-next-line max-params\n\tconstructor(\n\t\treadonly context: Context,\n\t\treadonly span: Span,\n\t\treadonly nc: NatsConnection,\n\t\tprivate readonly logger: Logger,\n\t\treadonly meta: {\n\t\t\tcallDepth: number;\n\t\t\tcurrentService: string;\n\t\t\theader: Record<string, string>;\n\t\t},\n\t) {}\n\n\tpublic getLogger(module?: string) {\n\t\treturn this.logger.child({\n\t\t\tmodule,\n\t\t});\n\t}\n\n\tpublic async call(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t\theader?: Record<string, string>;\n\t\t},\n\t): Promise<Uint8Array> {\n\t\treturn doCall(\n\t\t\tthis.nc,\n\t\t\ttarget,\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\tcallDepth: this.meta.callDepth,\n\t\t\t\tcontext: this.context,\n\t\t\t\tcurrentService: this.meta.currentService,\n\t\t\t\theader: this.meta.header,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n}\n\nexport class CallError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tprivate readonly target: string,\n\t\tprivate readonly payload: Uint8Array,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"CallError\";\n\t}\n}\n\n// eslint-disable-next-line max-params\nasync function doCall(\n\tnc: NatsConnection,\n\ttarget: string,\n\tpayload: Uint8Array,\n\tmeta: {\n\t\tcallDepth: number;\n\t\t/**\n\t\t * The otel context\n\t\t */\n\t\tcontext: Context | undefined;\n\t\tcurrentService: string;\n\t\t/**\n\t\t * Headers from the parent calls\n\t\t */\n\t\theader: Record<string, string>;\n\t},\n\toptions?: {\n\t\t/**\n\t\t * @default 5000 ms\n\t\t */\n\t\ttimeout?: number;\n\t\theader?: Record<string, string>;\n\t\t/**\n\t\t * Optionally pass an existing trace from the moleculer framework\n\t\t */\n\t\ttrace?: {\n\t\t\t/**\n\t\t\t * This is the ID of the whole trace forest and is used to uniquely identify a distributed trace through a system.\n\t\t\t */\n\t\t\ttraceId: string | undefined;\n\t\t\t/**\n\t\t\t * or span id: This is the ID of this request as known by the caller\n\t\t\t */\n\t\t\tparentId: string | undefined;\n\t\t};\n\t},\n): Promise<Uint8Array> {\n\tif (meta.callDepth >= 20) {\n\t\tthrow new Error(`max call depth reached: ${meta.callDepth}`);\n\t}\n\n\tconst carrierData: Context | { traceparent?: string } = meta.context ?? {};\n\tif (options?.trace && !meta.context) {\n\t\tconst version = Buffer.alloc(1).toString(\"hex\");\n\t\tconst flags = \"01\"; // means sampled\n\t\tconst header = `${version}-${options.trace.traceId}-${options.trace.parentId}-${flags}`;\n\t\t(carrierData as { traceparent?: string | undefined }).traceparent = header;\n\t}\n\n\tconst callingContext: Context = propagation.extract(\n\t\tcontext.active(),\n\t\tcarrierData,\n\t);\n\tconst tracer = trace.getTracer(\"default\");\n\tconst [service, action] = target.split(\".\");\n\treturn tracer.startActiveSpan(\n\t\t`call: ${target}`,\n\t\t{\n\t\t\tkind: SpanKind.CLIENT,\n\t\t\tattributes: {\n\t\t\t\t[ATTR_RPC_SERVICE]: service,\n\t\t\t\t[ATTR_RPC_METHOD]: action,\n\t\t\t},\n\t\t},\n\t\tcallingContext,\n\t\tasync (span) => {\n\t\t\t// Add kmicro and otel headers to the nats message headers\n\t\t\tconst natsHeadersMap = headers();\n\t\t\tnatsHeadersMap.set(\"kmc-depth\", (meta.callDepth + 1).toFixed(0));\n\t\t\tpropagation.inject(context.active(), natsHeadersMap, {\n\t\t\t\tset(carrier, key, value) {\n\t\t\t\t\tcarrier.set(key, value);\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst mergedHeaders = { ...meta.header, ...options?.header };\n\t\t\tfor (const key in mergedHeaders) {\n\t\t\t\tif (!Object.hasOwn(mergedHeaders, key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (mergedHeaders[key]) {\n\t\t\t\t\tnatsHeadersMap.set(key, mergedHeaders[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await nc.request(target, payload, {\n\t\t\t\t\theaders: natsHeadersMap,\n\t\t\t\t\ttimeout: options?.timeout ?? 5000,\n\t\t\t\t});\n\t\t\t\tif (result.headers?.get(\"Nats-Service-Error-Code\")) {\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\tspan.recordException(result.headers.get(\"Nats-Service-Error\"));\n\t\t\t\t\tthrow new CallError(\n\t\t\t\t\t\t`received error: ${result.headers.get(\"Nats-Service-Error\")}`,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\treturn result.data;\n\t\t\t} finally {\n\t\t\t\tspan.end();\n\t\t\t}\n\t\t},\n\t);\n}\n"],"mappings":"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","names":["trace","context"]}
|
|
1
|
+
{"version":3,"sources":["../src/KMicro.ts"],"sourcesContent":["import assert from \"node:assert\";\nimport {\n\ttype ConsumerMessages,\n\ttype JetStreamClient,\n\tjetstream,\n} from \"@nats-io/jetstream\";\nimport { type Service, type ServiceGroup, Svcm } from \"@nats-io/services\";\nimport { connect, headers, type NatsConnection } from \"@nats-io/transport-node\";\nimport {\n\ttype Context,\n\tcontext,\n\tpropagation,\n\ttype Span,\n\tSpanKind,\n\tSpanStatusCode,\n\ttrace,\n} from \"@opentelemetry/api\";\nimport {\n\tATTR_RPC_METHOD,\n\tATTR_RPC_SERVICE,\n} from \"@opentelemetry/semantic-conventions/incubating\";\nimport pino, { type Logger } from \"pino\";\n\n/**\n * Use init to create a kmicro instance and directly start (init) it\n */\nexport async function init(\n\tnats: string,\n\tserviceName: string,\n\tversion: string,\n\tdescription?: string,\n\tlogger?: Logger,\n) {\n\tconst kmicro = new Kmicro(\n\t\t{\n\t\t\tname: serviceName,\n\t\t\tversion,\n\t\t\tdescription,\n\t\t},\n\t\tlogger,\n\t);\n\tawait kmicro.init(nats);\n\treturn kmicro;\n}\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ninterface Callable {\n\tcall(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t},\n\t): Promise<Uint8Array>;\n}\n\nexport type DomainEvent = {\n\tid: string;\n\tdomain: string;\n\ttype: string;\n\torgId: string;\n\tentityId: string;\n\tpayload: Uint8Array;\n};\n\nexport type EventHandler = (\n\tcontext_: RequestContext,\n\tevent: DomainEvent,\n) => Promise<void>;\n\nexport class Kmicro implements Callable {\n\tprivate service: Service | undefined;\n\tprivate group: ServiceGroup | undefined;\n\tprivate nc: NatsConnection | undefined;\n\tprivate js: JetStreamClient | undefined;\n\tprivate readonly consumers: ConsumerMessages[] = [];\n\tprivate readonly logger: Logger;\n\tprivate eventSubjectPrefix = \"events\";\n\n\tconstructor(\n\t\tprivate readonly meta: {\n\t\t\tname: string;\n\t\t\tversion: string;\n\t\t\tdescription: string | undefined;\n\t\t},\n\t\tlogger?: Logger,\n\t\toptions?: {\n\t\t\teventSubjectPrefix?: string;\n\t\t},\n\t) {\n\t\tthis.logger = logger ?? pino.pino();\n\t\tif (options?.eventSubjectPrefix) {\n\t\t\tthis.eventSubjectPrefix = options.eventSubjectPrefix;\n\t\t}\n\t}\n\n\tpublic getLogger(module?: string) {\n\t\treturn this.logger.child({ module });\n\t}\n\n\tpublic getNc(): NatsConnection {\n\t\tassert(this.nc);\n\t\treturn this.nc;\n\t}\n\n\tpublic async init(natsURI: string) {\n\t\tconst natsUrl = new URL(natsURI);\n\t\tthis.nc = await connect({\n\t\t\tname: this.meta.name,\n\t\t\tuser: natsUrl.username,\n\t\t\tpass: natsUrl.password,\n\t\t\tservers: [natsUrl.host],\n\t\t});\n\t\tconst svc = new Svcm(this.nc);\n\t\tthis.service = await svc.add({\n\t\t\tname: this.meta.name,\n\t\t\tversion: this.meta.version,\n\t\t\tdescription: this.meta.description,\n\t\t});\n\t\tthis.group = this.service.addGroup(this.meta.name);\n\t}\n\n\tprivate getJetStream(): JetStreamClient {\n\t\tassert(this.nc);\n\t\tif (!this.js) {\n\t\t\tthis.js = jetstream(this.nc);\n\t\t}\n\t\treturn this.js;\n\t}\n\n\tpublic async publish(event: DomainEvent): Promise<void> {\n\t\tassert(this.nc);\n\t\tconst js = this.getJetStream();\n\t\tconst subject = `${this.eventSubjectPrefix}.${event.orgId}.${event.domain}`;\n\n\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\t\tawait tracer.startActiveSpan(\n\t\t\t`publish: ${subject}`,\n\t\t\t{ kind: SpanKind.PRODUCER },\n\t\t\tasync (span) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst body = JSON.stringify({\n\t\t\t\t\t\tid: event.id,\n\t\t\t\t\t\tdomain: event.domain,\n\t\t\t\t\t\ttype: event.type,\n\t\t\t\t\t\torgId: event.orgId,\n\t\t\t\t\t\tpayload: Array.from(event.payload),\n\t\t\t\t\t});\n\n\t\t\t\t\tawait js.publish(subject, Buffer.from(body), {\n\t\t\t\t\t\tmsgID: event.id,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t} catch (error_) {\n\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\tthrow error_;\n\t\t\t\t} finally {\n\t\t\t\t\tspan.end();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic async subscribe(\n\t\tstreamName: string,\n\t\tconsumerName: string,\n\t\thandler: EventHandler,\n\t): Promise<void> {\n\t\tconst js = this.getJetStream();\n\t\tconst consumer = await js.consumers.get(streamName, consumerName);\n\t\tconst messages = await consumer.consume();\n\t\tthis.consumers.push(messages);\n\n\t\t(async () => {\n\t\t\tfor await (const msg of messages) {\n\t\t\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\n\t\t\t\tconst contextWithOtel: Context = propagation.extract(\n\t\t\t\t\tcontext.active(),\n\t\t\t\t\tmsg.headers,\n\t\t\t\t\t{\n\t\t\t\t\t\tget(carrier, key) {\n\t\t\t\t\t\t\treturn carrier?.get(key);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tkeys(carrier) {\n\t\t\t\t\t\t\treturn carrier?.keys() ?? [];\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tawait tracer.startActiveSpan(\n\t\t\t\t\t`event: ${streamName}.${consumerName}`,\n\t\t\t\t\t{ kind: SpanKind.CONSUMER },\n\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\tasync (span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet event: DomainEvent;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst parsed = JSON.parse(Buffer.from(msg.data).toString());\n\t\t\t\t\t\t\t\tevent = {\n\t\t\t\t\t\t\t\t\tid: parsed.id,\n\t\t\t\t\t\t\t\t\tdomain: parsed.domain,\n\t\t\t\t\t\t\t\t\ttype: parsed.type,\n\t\t\t\t\t\t\t\t\torgId: parsed.orgId,\n\t\t\t\t\t\t\t\t\tentityId: parsed.entityId,\n\t\t\t\t\t\t\t\t\tpayload: new Uint8Array(parsed.payload),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t\"failed to unmarshal domain event, terminating message\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tmsg.term();\n\t\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst header: Record<string, string> = {};\n\t\t\t\t\t\t\tfor (const key of msg.headers?.keys() ?? []) {\n\t\t\t\t\t\t\t\tif (msg.headers?.has(key)) {\n\t\t\t\t\t\t\t\t\theader[key] = msg.headers?.get(key);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst spanLogger = this.logger.child({\n\t\t\t\t\t\t\t\tevent: `${event.domain}.${event.type}`,\n\t\t\t\t\t\t\t\tspanId: span.spanContext().spanId,\n\t\t\t\t\t\t\t\ttraceId: span.spanContext().traceId,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst requestContext = new RequestContext(\n\t\t\t\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\t\tthis.getNc(),\n\t\t\t\t\t\t\t\tspanLogger,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcallDepth: 0,\n\t\t\t\t\t\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tawait handler(requestContext, event);\n\t\t\t\t\t\t\tmsg.ack();\n\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\t\t} catch (error_) {\n\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t{ err: error_ },\n\t\t\t\t\t\t\t\t`error in event handler: ${(error_ as Error)?.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t\t\tmsg.nak();\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t})();\n\t}\n\n\tpublic async stop() {\n\t\tfor (const consumer of this.consumers) {\n\t\t\tconsumer.close();\n\t\t}\n\t\tawait this.service?.stop().catch((error: unknown) => {\n\t\t\tconsole.error(error);\n\t\t});\n\t\tawait this.nc?.close().catch((error: unknown) => {\n\t\t\tconsole.error(error);\n\t\t});\n\t}\n\n\tpublic addEndpoint(\n\t\tname: string,\n\t\thandler: (\n\t\t\tcontext_: RequestContext,\n\t\t\tdata: Uint8Array,\n\t\t) => Promise<Uint8Array>,\n\t) {\n\t\tassert(this.group);\n\n\t\tthis.group.addEndpoint(name, async (error, message) => {\n\t\t\tassert(this.nc);\n\t\t\tif (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent infinite loops\n\t\t\tconst currentCallDepth = Number.parseInt(\n\t\t\t\tmessage.headers?.get(\"kmc-depth\") ?? \"0\",\n\t\t\t\t10,\n\t\t\t);\n\t\t\tif (currentCallDepth >= 20) {\n\t\t\t\tthrow new Error(`max call depth reached: ${currentCallDepth}`);\n\t\t\t}\n\n\t\t\tconst contextWithOtel: Context = propagation.extract(\n\t\t\t\tcontext.active(),\n\t\t\t\tmessage.headers,\n\t\t\t\t{\n\t\t\t\t\tget(carrier, key) {\n\t\t\t\t\t\treturn carrier?.get(key);\n\t\t\t\t\t},\n\t\t\t\t\tkeys(carrier) {\n\t\t\t\t\t\treturn carrier?.keys() ?? [];\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst tracer = trace.getTracer(this.meta.name, this.meta.version);\n\t\t\tconst spanName = `handle: ${this.meta.name}.${name}`;\n\t\t\tawait tracer.startActiveSpan(\n\t\t\t\tspanName,\n\t\t\t\t{\n\t\t\t\t\tkind: SpanKind.SERVER,\n\t\t\t\t},\n\t\t\t\tcontextWithOtel,\n\t\t\t\tasync (span) => {\n\t\t\t\t\tconst spanLogger = this.logger.child({\n\t\t\t\t\t\taction: name,\n\t\t\t\t\t\tspanId: span.spanContext().spanId,\n\t\t\t\t\t\ttraceId: span.spanContext().traceId,\n\t\t\t\t\t});\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst header: Record<string, string> = {};\n\t\t\t\t\t\tfor (const key of message.headers?.keys() ?? []) {\n\t\t\t\t\t\t\tif (message.headers?.has(key)) {\n\t\t\t\t\t\t\t\theader[key] = message.headers?.get(key);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst requestContext = new RequestContext(\n\t\t\t\t\t\t\tcontextWithOtel,\n\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: Checked with assert\n\t\t\t\t\t\t\tthis.nc!,\n\t\t\t\t\t\t\tspanLogger,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcallDepth: currentCallDepth,\n\t\t\t\t\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst result = await handler(requestContext, message.data);\n\t\t\t\t\t\tmessage.respond(result);\n\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\t} catch (error_) {\n\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terr: error_,\n\t\t\t\t\t\t\t\taction: name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`error in handler: ${(error_ as Error)?.message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tspan.recordException(error_ as Error);\n\t\t\t\t\t\tconst code = error_ instanceof ServiceError ? error_.code : 500;\n\t\t\t\t\t\tmessage.respondError(code, (error_ as Error).message);\n\t\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tspan.end();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Start a new call\n\t */\n\tpublic async call(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t\theader?: Record<string, string>;\n\t\t\tmoleculerTrace?: {\n\t\t\t\ttraceId?: string | undefined;\n\t\t\t\tparentId?: string | undefined;\n\t\t\t};\n\t\t},\n\t): Promise<Uint8Array> {\n\t\tassert(this.nc);\n\n\t\tlet trace:\n\t\t\t| undefined\n\t\t\t| {\n\t\t\t\t\ttraceId: string;\n\t\t\t\t\tparentId: string;\n\t\t\t };\n\t\tif (options?.moleculerTrace) {\n\t\t\t// we have to shorten the moleculer trace id because the jaeger exporter uses only 16 chars\n\t\t\tconst molTraceId = options.moleculerTrace.traceId\n\t\t\t\t?.replaceAll(\"-\", \"\")\n\t\t\t\t.slice(0, 16);\n\t\t\tconst traceId = Array.from({ length: 16 })\n\t\t\t\t.fill(\"0\")\n\t\t\t\t.join(\"\")\n\t\t\t\t.concat(molTraceId ?? \"\");\n\t\t\tconst molParentId = options.moleculerTrace.parentId\n\t\t\t\t?.replaceAll(\"-\", \"\")\n\t\t\t\t.slice(0, 16);\n\t\t\ttrace = {\n\t\t\t\ttraceId,\n\t\t\t\tparentId: molParentId ?? \"\",\n\t\t\t};\n\t\t}\n\n\t\treturn doCall(\n\t\t\tthis.nc,\n\t\t\ttarget,\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\tcallDepth: 0,\n\t\t\t\tcontext: undefined,\n\t\t\t\tcurrentService: this.meta.name,\n\t\t\t\theader: options?.header ?? {},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: options?.timeout,\n\t\t\t\ttrace,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class RequestContext {\n\t// eslint-disable-next-line max-params\n\tconstructor(\n\t\treadonly context: Context,\n\t\treadonly span: Span,\n\t\treadonly nc: NatsConnection,\n\t\tprivate readonly logger: Logger,\n\t\treadonly meta: {\n\t\t\tcallDepth: number;\n\t\t\tcurrentService: string;\n\t\t\theader: Record<string, string>;\n\t\t},\n\t) {}\n\n\tpublic getLogger(module?: string) {\n\t\treturn this.logger.child({\n\t\t\tmodule,\n\t\t});\n\t}\n\n\tpublic async call(\n\t\ttarget: string,\n\t\tpayload: Uint8Array,\n\t\toptions?: {\n\t\t\t/**\n\t\t\t * @default 5000 ms\n\t\t\t */\n\t\t\ttimeout?: number;\n\t\t\theader?: Record<string, string>;\n\t\t},\n\t): Promise<Uint8Array> {\n\t\treturn doCall(\n\t\t\tthis.nc,\n\t\t\ttarget,\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\tcallDepth: this.meta.callDepth,\n\t\t\t\tcontext: this.context,\n\t\t\t\tcurrentService: this.meta.currentService,\n\t\t\t\theader: this.meta.header,\n\t\t\t},\n\t\t\toptions,\n\t\t);\n\t}\n}\n\n/**\n * ServiceError is a failure a handler answers with a code of its choosing,\n * such as 400 for a request it refuses. Any other error a handler throws\n * answers 500.\n */\nexport class ServiceError extends Error {\n\tconstructor(\n\t\treadonly code: number,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"ServiceError\";\n\t}\n}\n\n/**\n * CallError is a remote endpoint that answered with an error. code is the\n * endpoint's Nats-Service-Error-Code, such as \"400\" or \"500\", and\n * description its Nats-Service-Error text.\n */\nexport class CallError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tprivate readonly target: string,\n\t\tprivate readonly payload: Uint8Array,\n\t\treadonly code: string = \"\",\n\t\treadonly description: string = \"\",\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"CallError\";\n\t}\n\n\t/**\n\t * isClientError reports whether the endpoint refused the request with a\n\t * 4xx code: sending the same request again gets the same answer.\n\t */\n\tisClientError(): boolean {\n\t\treturn /^4\\d\\d$/.test(this.code);\n\t}\n}\n\n// eslint-disable-next-line max-params\nasync function doCall(\n\tnc: NatsConnection,\n\ttarget: string,\n\tpayload: Uint8Array,\n\tmeta: {\n\t\tcallDepth: number;\n\t\t/**\n\t\t * The otel context\n\t\t */\n\t\tcontext: Context | undefined;\n\t\tcurrentService: string;\n\t\t/**\n\t\t * Headers from the parent calls\n\t\t */\n\t\theader: Record<string, string>;\n\t},\n\toptions?: {\n\t\t/**\n\t\t * @default 5000 ms\n\t\t */\n\t\ttimeout?: number;\n\t\theader?: Record<string, string>;\n\t\t/**\n\t\t * Optionally pass an existing trace from the moleculer framework\n\t\t */\n\t\ttrace?: {\n\t\t\t/**\n\t\t\t * This is the ID of the whole trace forest and is used to uniquely identify a distributed trace through a system.\n\t\t\t */\n\t\t\ttraceId: string | undefined;\n\t\t\t/**\n\t\t\t * or span id: This is the ID of this request as known by the caller\n\t\t\t */\n\t\t\tparentId: string | undefined;\n\t\t};\n\t},\n): Promise<Uint8Array> {\n\tif (meta.callDepth >= 20) {\n\t\tthrow new Error(`max call depth reached: ${meta.callDepth}`);\n\t}\n\n\tconst carrierData: Context | { traceparent?: string } = meta.context ?? {};\n\tif (options?.trace && !meta.context) {\n\t\tconst version = Buffer.alloc(1).toString(\"hex\");\n\t\tconst flags = \"01\"; // means sampled\n\t\tconst header = `${version}-${options.trace.traceId}-${options.trace.parentId}-${flags}`;\n\t\t(carrierData as { traceparent?: string | undefined }).traceparent = header;\n\t}\n\n\tconst callingContext: Context = propagation.extract(\n\t\tcontext.active(),\n\t\tcarrierData,\n\t);\n\tconst tracer = trace.getTracer(\"default\");\n\tconst [service, action] = target.split(\".\");\n\treturn tracer.startActiveSpan(\n\t\t`call: ${target}`,\n\t\t{\n\t\t\tkind: SpanKind.CLIENT,\n\t\t\tattributes: {\n\t\t\t\t[ATTR_RPC_SERVICE]: service,\n\t\t\t\t[ATTR_RPC_METHOD]: action,\n\t\t\t},\n\t\t},\n\t\tcallingContext,\n\t\tasync (span) => {\n\t\t\t// Add kmicro and otel headers to the nats message headers\n\t\t\tconst natsHeadersMap = headers();\n\t\t\tnatsHeadersMap.set(\"kmc-depth\", (meta.callDepth + 1).toFixed(0));\n\t\t\tpropagation.inject(context.active(), natsHeadersMap, {\n\t\t\t\tset(carrier, key, value) {\n\t\t\t\t\tcarrier.set(key, value);\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst mergedHeaders = { ...meta.header, ...options?.header };\n\t\t\tfor (const key in mergedHeaders) {\n\t\t\t\tif (!Object.hasOwn(mergedHeaders, key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (mergedHeaders[key]) {\n\t\t\t\t\tnatsHeadersMap.set(key, mergedHeaders[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await nc.request(target, payload, {\n\t\t\t\t\theaders: natsHeadersMap,\n\t\t\t\t\ttimeout: options?.timeout ?? 5000,\n\t\t\t\t});\n\t\t\t\tconst errorCode = result.headers?.get(\"Nats-Service-Error-Code\");\n\t\t\t\tif (errorCode) {\n\t\t\t\t\tconst description = result.headers?.get(\"Nats-Service-Error\") ?? \"\";\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.ERROR });\n\t\t\t\t\tspan.recordException(description);\n\t\t\t\t\tthrow new CallError(\n\t\t\t\t\t\t`received error: ${description}`,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t\terrorCode,\n\t\t\t\t\t\tdescription,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\treturn result.data;\n\t\t\t} finally {\n\t\t\t\tspan.end();\n\t\t\t}\n\t\t},\n\t);\n}\n"],"mappings":"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","names":["trace","context"]}
|