@kultify/kmicro-js 0.2.1 → 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 +30 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -2
- package/dist/index.d.ts +24 -2
- package/dist/index.js +29 -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);
|
|
@@ -167,6 +168,7 @@ var Kmicro = class {
|
|
|
167
168
|
domain: parsed.domain,
|
|
168
169
|
type: parsed.type,
|
|
169
170
|
orgId: parsed.orgId,
|
|
171
|
+
entityId: parsed.entityId,
|
|
170
172
|
payload: new Uint8Array(parsed.payload)
|
|
171
173
|
};
|
|
172
174
|
} catch {
|
|
@@ -301,7 +303,8 @@ var Kmicro = class {
|
|
|
301
303
|
`error in handler: ${error_?.message}`
|
|
302
304
|
);
|
|
303
305
|
span.recordException(error_);
|
|
304
|
-
|
|
306
|
+
const code = error_ instanceof ServiceError ? error_.code : 500;
|
|
307
|
+
message.respondError(code, error_.message);
|
|
305
308
|
span.setStatus({ code: import_api.SpanStatusCode.ERROR });
|
|
306
309
|
} finally {
|
|
307
310
|
span.end();
|
|
@@ -371,13 +374,29 @@ var RequestContext = class {
|
|
|
371
374
|
);
|
|
372
375
|
}
|
|
373
376
|
};
|
|
377
|
+
var ServiceError = class extends Error {
|
|
378
|
+
constructor(code, message) {
|
|
379
|
+
super(message);
|
|
380
|
+
this.code = code;
|
|
381
|
+
this.name = "ServiceError";
|
|
382
|
+
}
|
|
383
|
+
};
|
|
374
384
|
var CallError = class extends Error {
|
|
375
|
-
constructor(message, target, payload) {
|
|
385
|
+
constructor(message, target, payload, code = "", description = "") {
|
|
376
386
|
super(message);
|
|
377
387
|
this.target = target;
|
|
378
388
|
this.payload = payload;
|
|
389
|
+
this.code = code;
|
|
390
|
+
this.description = description;
|
|
379
391
|
this.name = "CallError";
|
|
380
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
|
+
}
|
|
381
400
|
};
|
|
382
401
|
async function doCall(nc, target, payload, meta, options) {
|
|
383
402
|
if (meta.callDepth >= 20) {
|
|
@@ -428,13 +447,17 @@ async function doCall(nc, target, payload, meta, options) {
|
|
|
428
447
|
headers: natsHeadersMap,
|
|
429
448
|
timeout: options?.timeout ?? 5e3
|
|
430
449
|
});
|
|
431
|
-
|
|
450
|
+
const errorCode = result.headers?.get("Nats-Service-Error-Code");
|
|
451
|
+
if (errorCode) {
|
|
452
|
+
const description = result.headers?.get("Nats-Service-Error") ?? "";
|
|
432
453
|
span.setStatus({ code: import_api.SpanStatusCode.ERROR });
|
|
433
|
-
span.recordException(
|
|
454
|
+
span.recordException(description);
|
|
434
455
|
throw new CallError(
|
|
435
|
-
`received error: ${
|
|
456
|
+
`received error: ${description}`,
|
|
436
457
|
target,
|
|
437
|
-
payload
|
|
458
|
+
payload,
|
|
459
|
+
errorCode,
|
|
460
|
+
description
|
|
438
461
|
);
|
|
439
462
|
}
|
|
440
463
|
span.setStatus({ code: import_api.SpanStatusCode.OK });
|
|
@@ -450,6 +473,7 @@ async function doCall(nc, target, payload, meta, options) {
|
|
|
450
473
|
CallError,
|
|
451
474
|
Kmicro,
|
|
452
475
|
RequestContext,
|
|
476
|
+
ServiceError,
|
|
453
477
|
init
|
|
454
478
|
});
|
|
455
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\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\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
|
@@ -19,6 +19,7 @@ type DomainEvent = {
|
|
|
19
19
|
domain: string;
|
|
20
20
|
type: string;
|
|
21
21
|
orgId: string;
|
|
22
|
+
entityId: string;
|
|
22
23
|
payload: Uint8Array;
|
|
23
24
|
};
|
|
24
25
|
type EventHandler = (context_: RequestContext, event: DomainEvent) => Promise<void>;
|
|
@@ -85,10 +86,31 @@ declare class RequestContext {
|
|
|
85
86
|
header?: Record<string, string>;
|
|
86
87
|
}): Promise<Uint8Array>;
|
|
87
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
|
+
*/
|
|
88
103
|
declare class CallError extends Error {
|
|
89
104
|
private readonly target;
|
|
90
105
|
private readonly payload;
|
|
91
|
-
|
|
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;
|
|
92
114
|
}
|
|
93
115
|
|
|
94
|
-
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
|
@@ -19,6 +19,7 @@ type DomainEvent = {
|
|
|
19
19
|
domain: string;
|
|
20
20
|
type: string;
|
|
21
21
|
orgId: string;
|
|
22
|
+
entityId: string;
|
|
22
23
|
payload: Uint8Array;
|
|
23
24
|
};
|
|
24
25
|
type EventHandler = (context_: RequestContext, event: DomainEvent) => Promise<void>;
|
|
@@ -85,10 +86,31 @@ declare class RequestContext {
|
|
|
85
86
|
header?: Record<string, string>;
|
|
86
87
|
}): Promise<Uint8Array>;
|
|
87
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
|
+
*/
|
|
88
103
|
declare class CallError extends Error {
|
|
89
104
|
private readonly target;
|
|
90
105
|
private readonly payload;
|
|
91
|
-
|
|
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;
|
|
92
114
|
}
|
|
93
115
|
|
|
94
|
-
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
|
@@ -139,6 +139,7 @@ var Kmicro = class {
|
|
|
139
139
|
domain: parsed.domain,
|
|
140
140
|
type: parsed.type,
|
|
141
141
|
orgId: parsed.orgId,
|
|
142
|
+
entityId: parsed.entityId,
|
|
142
143
|
payload: new Uint8Array(parsed.payload)
|
|
143
144
|
};
|
|
144
145
|
} catch {
|
|
@@ -273,7 +274,8 @@ var Kmicro = class {
|
|
|
273
274
|
`error in handler: ${error_?.message}`
|
|
274
275
|
);
|
|
275
276
|
span.recordException(error_);
|
|
276
|
-
|
|
277
|
+
const code = error_ instanceof ServiceError ? error_.code : 500;
|
|
278
|
+
message.respondError(code, error_.message);
|
|
277
279
|
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
278
280
|
} finally {
|
|
279
281
|
span.end();
|
|
@@ -343,13 +345,29 @@ var RequestContext = class {
|
|
|
343
345
|
);
|
|
344
346
|
}
|
|
345
347
|
};
|
|
348
|
+
var ServiceError = class extends Error {
|
|
349
|
+
constructor(code, message) {
|
|
350
|
+
super(message);
|
|
351
|
+
this.code = code;
|
|
352
|
+
this.name = "ServiceError";
|
|
353
|
+
}
|
|
354
|
+
};
|
|
346
355
|
var CallError = class extends Error {
|
|
347
|
-
constructor(message, target, payload) {
|
|
356
|
+
constructor(message, target, payload, code = "", description = "") {
|
|
348
357
|
super(message);
|
|
349
358
|
this.target = target;
|
|
350
359
|
this.payload = payload;
|
|
360
|
+
this.code = code;
|
|
361
|
+
this.description = description;
|
|
351
362
|
this.name = "CallError";
|
|
352
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
|
+
}
|
|
353
371
|
};
|
|
354
372
|
async function doCall(nc, target, payload, meta, options) {
|
|
355
373
|
if (meta.callDepth >= 20) {
|
|
@@ -400,13 +418,17 @@ async function doCall(nc, target, payload, meta, options) {
|
|
|
400
418
|
headers: natsHeadersMap,
|
|
401
419
|
timeout: options?.timeout ?? 5e3
|
|
402
420
|
});
|
|
403
|
-
|
|
421
|
+
const errorCode = result.headers?.get("Nats-Service-Error-Code");
|
|
422
|
+
if (errorCode) {
|
|
423
|
+
const description = result.headers?.get("Nats-Service-Error") ?? "";
|
|
404
424
|
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
405
|
-
span.recordException(
|
|
425
|
+
span.recordException(description);
|
|
406
426
|
throw new CallError(
|
|
407
|
-
`received error: ${
|
|
427
|
+
`received error: ${description}`,
|
|
408
428
|
target,
|
|
409
|
-
payload
|
|
429
|
+
payload,
|
|
430
|
+
errorCode,
|
|
431
|
+
description
|
|
410
432
|
);
|
|
411
433
|
}
|
|
412
434
|
span.setStatus({ code: SpanStatusCode.OK });
|
|
@@ -421,6 +443,7 @@ export {
|
|
|
421
443
|
CallError,
|
|
422
444
|
Kmicro,
|
|
423
445
|
RequestContext,
|
|
446
|
+
ServiceError,
|
|
424
447
|
init
|
|
425
448
|
};
|
|
426
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\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\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"]}
|