@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 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
- message.respondError(500, error_.message);
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
- if (result.headers?.get("Nats-Service-Error-Code")) {
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(result.headers.get("Nats-Service-Error"));
454
+ span.recordException(description);
434
455
  throw new CallError(
435
- `received error: ${result.headers.get("Nats-Service-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
@@ -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
- constructor(message: string, target: string, payload: Uint8Array);
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
- constructor(message: string, target: string, payload: Uint8Array);
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
- message.respondError(500, error_.message);
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
- if (result.headers?.get("Nats-Service-Error-Code")) {
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(result.headers.get("Nats-Service-Error"));
425
+ span.recordException(description);
406
426
  throw new CallError(
407
- `received error: ${result.headers.get("Nats-Service-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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kultify/kmicro-js",
3
- "version": "0.2.1",
3
+ "version": "0.2.4",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",