arvo-event-handler 2.0.3 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,17 @@ var __extends = (this && this.__extends) || (function () {
14
14
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
15
  };
16
16
  })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
17
28
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
29
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
30
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -55,168 +66,159 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
55
66
  };
56
67
  Object.defineProperty(exports, "__esModule", { value: true });
57
68
  var arvo_core_1 = require("arvo-core");
58
- var schema_1 = require("arvo-core/dist/ArvoEvent/schema");
59
69
  var api_1 = require("@opentelemetry/api");
60
70
  var utils_1 = require("../utils");
61
71
  var AbstractArvoEventHandler_1 = __importDefault(require("../AbstractArvoEventHandler"));
62
- var OpenTelemetry_1 = require("../OpenTelemetry");
63
- var utils_2 = require("../OpenTelemetry/utils");
64
72
  /**
65
- * Represents an event handler for Arvo contracts.
66
- *
67
- * @template TContract - The type of ArvoContract this handler is associated with.
73
+ * ArvoEventHandler manages the execution and processing of events in accordance with
74
+ * Arvo contracts. This class serves as the cornerstone for event handling operations,
75
+ * integrating contract validation, telemetry management, and event processing.
68
76
  *
69
- * @remarks
70
- * This class is the core component for handling Arvo events. It encapsulates the logic
71
- * for executing event handlers, managing telemetry, and ensuring proper contract validation.
72
- * It's designed to be flexible and reusable across different Arvo contract implementations.
77
+ * The handler implements a robust execution flow that ensures proper validation,
78
+ * versioning, and error handling while maintaining detailed telemetry through
79
+ * OpenTelemetry integration. It supports versioned contracts and handles routing
80
+ * of both successful and error events.
73
81
  */
74
82
  var ArvoEventHandler = /** @class */ (function (_super) {
75
83
  __extends(ArvoEventHandler, _super);
76
84
  /**
77
- * Creates an instance of ArvoEventHandler.
85
+ * Initializes a new ArvoEventHandler instance with the specified contract and configuration.
86
+ * Validates handler implementations against contract versions during initialization.
78
87
  *
79
- * @param param - The configuration parameters for the event handler.
88
+ * The constructor ensures that handler implementations exist for all supported contract
89
+ * versions and configures OpenTelemetry span attributes for monitoring event handling.
80
90
  *
81
- * @throws {Error} Throws an error if the provided source is invalid.
82
- *
83
- * @remarks
84
- * The constructor validates the source parameter against the CloudEventContextSchema.
85
- * If no source is provided, it defaults to the contract's accepted event type.
91
+ * @param param - Handler configuration including contract, execution units, and handler implementations
92
+ * @throws When handler implementations are missing for any contract version
86
93
  */
87
94
  function ArvoEventHandler(param) {
88
- var _a, _b, _c, _d, _e, _f, _g;
95
+ var _a;
96
+ var _b, _c;
89
97
  var _this = _super.call(this) || this;
90
- _this.openInferenceSpanKind = arvo_core_1.OpenInferenceSpanKind.CHAIN;
91
- _this.arvoExecutionSpanKind = arvo_core_1.ArvoExecutionSpanKind.EVENT_HANDLER;
92
- _this.openTelemetrySpanKind = api_1.SpanKind.INTERNAL;
93
98
  _this.contract = param.contract;
94
99
  _this.executionunits = param.executionunits;
95
- _this._handler = param.handler;
96
- if (param.source) {
97
- var error = schema_1.CloudEventContextSchema.pick({
98
- source: true,
99
- }).safeParse({ source: param.source }).error;
100
- if (error) {
101
- throw new Error("The provided 'source' is not a valid string. Error: ".concat(error.message));
102
- }
103
- }
104
- _this.source = (_a = param.source) !== null && _a !== void 0 ? _a : _this.contract.type;
105
- _this.arvoExecutionSpanKind =
106
- (_c = (_b = param.spanKind) === null || _b === void 0 ? void 0 : _b.arvoExecution) !== null && _c !== void 0 ? _c : _this.arvoExecutionSpanKind;
107
- _this.openInferenceSpanKind =
108
- (_e = (_d = param.spanKind) === null || _d === void 0 ? void 0 : _d.openInference) !== null && _e !== void 0 ? _e : _this.openInferenceSpanKind;
109
- _this.openTelemetrySpanKind =
110
- (_g = (_f = param.spanKind) === null || _f === void 0 ? void 0 : _f.openTelemetry) !== null && _g !== void 0 ? _g : _this.openTelemetrySpanKind;
111
- for (var _i = 0, _h = Object.keys(_this.contract.versions); _i < _h.length; _i++) {
112
- var contractVersions = _h[_i];
113
- if (!_this._handler[contractVersions]) {
114
- throw new Error("The event handler for contract (uri=".concat(_this.contract.uri, ") must contain a handler for version ").concat(contractVersions, "."));
100
+ _this.handler = param.handler;
101
+ for (var _i = 0, _d = Object.keys(_this.contract.versions); _i < _d.length; _i++) {
102
+ var contractVersions = _d[_i];
103
+ if (!_this.handler[contractVersions]) {
104
+ throw new Error("Contract ".concat(_this.contract.uri, " requires handler implementation for version ").concat(contractVersions));
115
105
  }
116
106
  }
107
+ _this.spanOptions = __assign(__assign({ kind: api_1.SpanKind.CONSUMER }, param.spanOptions), { attributes: __assign(__assign((_a = {}, _a[arvo_core_1.ArvoExecution.ATTR_SPAN_KIND] = arvo_core_1.ArvoExecutionSpanKind.EVENT_HANDLER, _a[arvo_core_1.OpenInference.ATTR_SPAN_KIND] = arvo_core_1.OpenInferenceSpanKind.CHAIN, _a), ((_c = (_b = param.spanOptions) === null || _b === void 0 ? void 0 : _b.attributes) !== null && _c !== void 0 ? _c : {})), { 'arvo.contract.uri': _this.contract.uri, 'arvo.handler.source': _this.source }) });
117
108
  return _this;
118
109
  }
110
+ Object.defineProperty(ArvoEventHandler.prototype, "source", {
111
+ /** The source identifier for events produced by this handler */
112
+ get: function () {
113
+ return this.contract.type;
114
+ },
115
+ enumerable: false,
116
+ configurable: true
117
+ });
119
118
  /**
120
- * Executes the event handler for a given event.
121
- *
122
- * @param event - The event to handle.
123
- * @param opentelemetry - Configuration for OpenTelemetry integration, including tracing options
124
- * and context inheritance settings. Default is inherit from event and internal tracer
125
- * @returns A promise that resolves to an array of resulting ArvoEvents.
126
- *
127
- * This method performs the following steps:
128
- * 1. Creates an OpenTelemetry span for the execution.
129
- * 2. Validates the input event against the contract.
130
- * 3. Executes the handler function.
131
- * 4. Creates and returns the result event(s).
132
- * 5. Handles any errors and creates an error event if necessary.
133
- *
134
- * All telemetry data is properly set and propagated throughout the execution.
135
- *
136
- * @example
137
- * ```typescript
138
- * const contract = createArvoContract({ ... })
139
- * const handler = createArvoEventHandler({
140
- * contract: contract,
141
- * ...
142
- * });
143
- * const inputEvent: ArvoEvent<...> = createArvoEvent({ ... });
144
- * const resultEvents = await handler.execute(inputEvent);
145
- * ```
119
+ * Processes an event according to the contract specifications. The execution flow encompasses
120
+ * span management, validation, handler execution, and error processing phases.
146
121
  *
147
- * @throws All error throw during the execution are returned as a system error event
122
+ * Event Routing Logic:
123
+ * - Success events: Routes based on priority (handler result -> redirectto -> source)
124
+ * - Error events: Always routes back to the source
148
125
  *
149
- * **Routing**
126
+ * Telemetry Integration:
127
+ * - Creates and manages OpenTelemetry spans for execution tracking
128
+ * - Propagates trace context through the event chain
129
+ * - Records execution metrics and error details
150
130
  *
151
- * The routing of the resulting events is determined as follows:
152
- * - The `to` field of the output event is set in this priority:
153
- * 1. The `to` field provided by the handler result
154
- * 2. The `redirectto` field from the input event
155
- * 3. The `source` field from the input event (as a form of reply)
156
- * - For system error events, the `to` field is always set to the `source` of the input event.
131
+ * Version Resolution:
132
+ * - Extracts version from event dataschema
133
+ * - Falls back to latest version if unspecified
134
+ * - Validates event data against versioned contract schema
157
135
  *
158
- * **Telemetry**
136
+ * Error Handling:
137
+ * - Converts all errors to system error events
138
+ * - Maintains telemetry context for error scenarios
139
+ * - Ensures proper error event routing
159
140
  *
160
- * - Creates a new span for each execution as per the traceparent and tracestate field
161
- * of the event. If those are not present, then a brand new span is created and distributed
162
- * tracing is disabled
163
- * - Sets span attributes for input and output events
164
- * - Propagates trace context to output events
165
- * - Handles error cases and sets appropriate span status
141
+ * @param event - The event to process
142
+ * @param opentelemetry - Configuration for OpenTelemetry context inheritance
143
+ * @returns Promise resolving to array of result events or error event
166
144
  */
167
- ArvoEventHandler.prototype.execute = function (event, opentelemetry) {
168
- return __awaiter(this, void 0, void 0, function () {
169
- var span;
145
+ ArvoEventHandler.prototype.execute = function (event_1) {
146
+ return __awaiter(this, arguments, void 0, function (event, opentelemetry) {
170
147
  var _this = this;
148
+ if (opentelemetry === void 0) { opentelemetry = {
149
+ inheritFrom: 'EVENT',
150
+ }; }
171
151
  return __generator(this, function (_a) {
172
152
  switch (_a.label) {
173
- case 0:
174
- span = (0, utils_2.createOtelSpan)({
175
- spanName: "ArvoEventHandler<".concat(this.contract.uri, ">.execute<").concat(event.type, ">"),
176
- spanKinds: {
177
- kind: this.openTelemetrySpanKind,
178
- openInference: this.openInferenceSpanKind,
179
- arvoExecution: this.arvoExecutionSpanKind,
180
- },
181
- event: event,
182
- opentelemetryConfig: opentelemetry,
183
- });
184
- return [4 /*yield*/, api_1.context.with(api_1.trace.setSpan(api_1.context.active(), span), function () { return __awaiter(_this, void 0, void 0, function () {
185
- var otelSpanHeaders, parsedDataSchema, handlerContract, inputEventValidation, _handleOutput, outputs, eventFactory_1, error_1, eventFactory, result;
186
- var _a, _b, _c, _d, _e;
187
- return __generator(this, function (_f) {
188
- switch (_f.label) {
153
+ case 0: return [4 /*yield*/, arvo_core_1.ArvoOpenTelemetry.getInstance().startActiveSpan({
154
+ name: 'ArvoEventHandler',
155
+ spanOptions: this.spanOptions,
156
+ disableSpanManagement: true,
157
+ context: opentelemetry.inheritFrom === 'EVENT'
158
+ ? {
159
+ inheritFrom: 'TRACE_HEADERS',
160
+ traceHeaders: {
161
+ traceparent: event.traceparent,
162
+ tracestate: event.tracestate,
163
+ },
164
+ }
165
+ : {
166
+ inheritFrom: 'CONTEXT',
167
+ context: api_1.context.active(),
168
+ },
169
+ fn: function (span) { return __awaiter(_this, void 0, void 0, function () {
170
+ var otelSpanHeaders, parsedDataSchema, handlerContract, inputEventValidation, _handleOutput, outputs, eventFactory_1, result, error_1, eventFactory, result;
171
+ var _a, _b, _c, _d;
172
+ return __generator(this, function (_e) {
173
+ switch (_e.label) {
189
174
  case 0:
190
175
  otelSpanHeaders = (0, arvo_core_1.currentOpenTelemetryHeaders)();
191
- _f.label = 1;
176
+ _e.label = 1;
192
177
  case 1:
193
- _f.trys.push([1, 3, 4, 5]);
178
+ _e.trys.push([1, 3, 4, 5]);
194
179
  span.setStatus({ code: api_1.SpanStatusCode.OK });
180
+ Object.entries(event.otelAttributes).forEach(function (_a) {
181
+ var key = _a[0], value = _a[1];
182
+ return span.setAttribute("to_process.0.".concat(key), value);
183
+ });
195
184
  if (this.contract.type !== event.type) {
196
- throw new Error("Invalid event type='".concat(event.type, "' is provide to handler for type='").concat(this.contract.type, "'"));
185
+ throw new Error("Event type mismatch: Received '".concat(event.type, "', expected '").concat(this.contract.type, "'"));
197
186
  }
198
- parsedDataSchema = (0, arvo_core_1.parseEventDataSchema)(event);
187
+ (0, arvo_core_1.logToSpan)({
188
+ level: 'INFO',
189
+ message: "Event type '".concat(event.type, "' validated against contract '").concat(this.contract.uri, "'"),
190
+ });
191
+ parsedDataSchema = arvo_core_1.EventDataschemaUtil.parse(event);
199
192
  if (!(parsedDataSchema === null || parsedDataSchema === void 0 ? void 0 : parsedDataSchema.version)) {
200
193
  (0, arvo_core_1.logToSpan)({
201
194
  level: 'WARNING',
202
- message: "Unable to resolve the event version from dataschema \"".concat(event.dataschema, "\". Defaulting to the latest version."),
195
+ message: "Version resolution failed for event with dataschema '".concat(event.dataschema, "'. Defaulting to latest version (=").concat(this.contract.version('latest').version, ") of contract (uri=").concat(this.contract.uri, ")"),
203
196
  });
204
197
  }
205
198
  handlerContract = this.contract.version((_a = parsedDataSchema === null || parsedDataSchema === void 0 ? void 0 : parsedDataSchema.version) !== null && _a !== void 0 ? _a : 'latest');
206
- Object.entries(event.otelAttributes).forEach(function (_a) {
207
- var key = _a[0], value = _a[1];
208
- return span.setAttribute("to_process.0.".concat(key), value);
199
+ (0, arvo_core_1.logToSpan)({
200
+ level: 'INFO',
201
+ message: "Processing event with contract version ".concat(handlerContract.version),
209
202
  });
210
203
  inputEventValidation = handlerContract.accepts.schema.safeParse(event.data);
211
204
  if (inputEventValidation.error) {
212
- throw new Error("Invalid event payload: ".concat(inputEventValidation.error));
205
+ throw new Error("Event payload validation failed: ".concat(inputEventValidation.error));
213
206
  }
214
- return [4 /*yield*/, this._handler[handlerContract.version]({
207
+ (0, arvo_core_1.logToSpan)({
208
+ level: 'INFO',
209
+ message: "Event payload validated successfully against contract ".concat(arvo_core_1.EventDataschemaUtil.create(handlerContract)),
210
+ });
211
+ (0, arvo_core_1.logToSpan)({
212
+ level: 'INFO',
213
+ message: "Executing handler for event type '".concat(event.type, "'"),
214
+ });
215
+ return [4 /*yield*/, this.handler[handlerContract.version]({
215
216
  event: event,
216
217
  source: this.source,
218
+ span: span,
217
219
  })];
218
220
  case 2:
219
- _handleOutput = _f.sent();
221
+ _handleOutput = _e.sent();
220
222
  if (!_handleOutput)
221
223
  return [2 /*return*/, []];
222
224
  outputs = [];
@@ -227,19 +229,23 @@ var ArvoEventHandler = /** @class */ (function (_super) {
227
229
  outputs = [_handleOutput];
228
230
  }
229
231
  eventFactory_1 = (0, arvo_core_1.createArvoEventFactory)(handlerContract);
230
- return [2 /*return*/, (0, utils_1.eventHandlerOutputEventCreator)(outputs, otelSpanHeaders, this.source, event, this.executionunits, function (param, extension) {
231
- var _a;
232
- return eventFactory_1.emits(param, extension, {
233
- tracer: (_a = opentelemetry === null || opentelemetry === void 0 ? void 0 : opentelemetry.tracer) !== null && _a !== void 0 ? _a : (0, OpenTelemetry_1.fetchOpenTelemetryTracer)(),
234
- });
235
- })];
232
+ result = (0, utils_1.eventHandlerOutputEventCreator)(outputs, otelSpanHeaders, this.source, event, this.executionunits, function (param, extensions) { return eventFactory_1.emits(param, extensions); });
233
+ (0, arvo_core_1.logToSpan)({
234
+ level: 'INFO',
235
+ message: "Event processing completed successfully. Generated ".concat(result.length, " event(s)"),
236
+ });
237
+ (0, arvo_core_1.logToSpan)({
238
+ level: 'INFO',
239
+ message: 'Event handled successfully',
240
+ });
241
+ return [2 /*return*/, result];
236
242
  case 3:
237
- error_1 = _f.sent();
238
- eventFactory = (0, arvo_core_1.createArvoEventFactory)(this.contract.version('any'));
243
+ error_1 = _e.sent();
244
+ eventFactory = (0, arvo_core_1.createArvoEventFactory)(this.contract.version('latest'));
239
245
  (0, arvo_core_1.exceptionToSpan)(error_1);
240
246
  span.setStatus({
241
247
  code: api_1.SpanStatusCode.ERROR,
242
- message: error_1.message,
248
+ message: "Event processing failed: ".concat(error_1.message),
243
249
  });
244
250
  result = eventFactory.systemError({
245
251
  source: this.source,
@@ -252,7 +258,7 @@ var ArvoEventHandler = /** @class */ (function (_super) {
252
258
  traceparent: (_b = otelSpanHeaders.traceparent) !== null && _b !== void 0 ? _b : undefined,
253
259
  tracestate: (_c = otelSpanHeaders.tracestate) !== null && _c !== void 0 ? _c : undefined,
254
260
  accesscontrol: (_d = event.accesscontrol) !== null && _d !== void 0 ? _d : undefined,
255
- }, {}, { tracer: (_e = opentelemetry === null || opentelemetry === void 0 ? void 0 : opentelemetry.tracer) !== null && _e !== void 0 ? _e : (0, OpenTelemetry_1.fetchOpenTelemetryTracer)() });
261
+ }, {});
256
262
  Object.entries(result.otelAttributes).forEach(function (_a) {
257
263
  var key = _a[0], value = _a[1];
258
264
  return span.setAttribute("to_emit.0.".concat(key), value);
@@ -264,7 +270,8 @@ var ArvoEventHandler = /** @class */ (function (_super) {
264
270
  case 5: return [2 /*return*/];
265
271
  }
266
272
  });
267
- }); })];
273
+ }); },
274
+ })];
268
275
  case 1: return [2 /*return*/, _a.sent()];
269
276
  }
270
277
  });
@@ -272,19 +279,12 @@ var ArvoEventHandler = /** @class */ (function (_super) {
272
279
  };
273
280
  Object.defineProperty(ArvoEventHandler.prototype, "systemErrorSchema", {
274
281
  /**
275
- * Provides the schema for system error events.
276
- *
277
- * @returns An object containing the error event type and schema.
278
- *
279
- * @remarks
280
- * This getter defines the structure for system error events that may be emitted
281
- * when an unexpected error occurs during event handling. The error event type
282
- * is prefixed with 'sys.' followed by the contract's accepted event type and '.error'.
283
- * The schema used for these error events is the standard ArvoErrorSchema.
282
+ * Provides access to the system error event schema configuration.
283
+ * The schema defines the structure of error events emitted during execution failures.
284
284
  *
285
- * @example
286
- * // If the contract's accepted event type is 'user.created'
287
- * // The system error event type would be 'sys.user.created.error'
285
+ * Error events follow the naming convention: sys.<contract-type>.error
286
+ * For example, a contract handling 'user.created' events will emit error events
287
+ * with the type 'sys.user.created.error'.
288
288
  */
289
289
  get: function () {
290
290
  return this.contract.systemError;
@@ -1,22 +1,22 @@
1
- import { SpanKind } from '@opentelemetry/api';
2
- import { ArvoContract, ArvoEvent, CreateArvoEvent, OpenInferenceSpanKind, ArvoExecutionSpanKind, VersionedArvoContract, ArvoSemanticVersion } from 'arvo-core';
1
+ import { Span, SpanOptions } from '@opentelemetry/api';
2
+ import { ArvoContract, ArvoEvent, CreateArvoEvent, VersionedArvoContract, ArvoSemanticVersion } from 'arvo-core';
3
3
  import { z } from 'zod';
4
4
  /**
5
5
  * Represents the input for an ArvoEvent handler function.
6
- * @template TAccepts - The type of ArvoContractRecord that the handler accepts.
7
6
  */
8
- export type ArvoEventHandlerFunctionInput<TContract extends VersionedArvoContract<ArvoContract, ArvoSemanticVersion>> = {
7
+ export type ArvoEventHandlerFunctionInput<TContract extends VersionedArvoContract<any, any>> = {
9
8
  /** The ArvoEvent object. */
10
9
  event: ArvoEvent<z.infer<TContract['accepts']['schema']>, Record<string, any>, TContract['accepts']['type']>;
11
10
  /** The source field data of the handler */
12
11
  source: string;
12
+ /** The OpenTelemetry span */
13
+ span: Span;
13
14
  };
14
15
  /**
15
16
  * Represents the output of an ArvoEvent handler function.
16
- * @template TContract - The type of ArvoContract that the handler is associated with.
17
17
  */
18
- export type ArvoEventHandlerFunctionOutput<TContract extends VersionedArvoContract<ArvoContract, ArvoSemanticVersion>> = {
19
- [K in keyof TContract['emits']]: Omit<CreateArvoEvent<z.infer<TContract['emits'][K]>, K & string>, 'subject' | 'source' | 'executionunits' | 'traceparent' | 'tracestate'> & {
18
+ export type ArvoEventHandlerFunctionOutput<TContract extends VersionedArvoContract<any, any>> = {
19
+ [K in keyof TContract['emits']]: Pick<CreateArvoEvent<z.infer<TContract['emits'][K]>, K & string>, 'id' | 'time' | 'type' | 'data' | 'to' | 'accesscontrol' | 'redirectto'> & {
20
20
  /**
21
21
  * An optional override for the execution units of this specific event.
22
22
  *
@@ -31,29 +31,14 @@ export type ArvoEventHandlerFunctionOutput<TContract extends VersionedArvoContra
31
31
  }[keyof TContract['emits']];
32
32
  /**
33
33
  * Defines the structure of an ArvoEvent handler function.
34
- * @template TContract - The type of ArvoContract that the handler is associated with.
35
34
  */
36
35
  export type ArvoEventHandlerFunction<TContract extends ArvoContract> = {
37
36
  [V in ArvoSemanticVersion & keyof TContract['versions']]: (params: ArvoEventHandlerFunctionInput<VersionedArvoContract<TContract, V>>) => Promise<Array<ArvoEventHandlerFunctionOutput<VersionedArvoContract<TContract, V>>> | ArvoEventHandlerFunctionOutput<VersionedArvoContract<TContract, V>> | void>;
38
37
  };
39
38
  /**
40
39
  * Interface for an ArvoEvent handler.
41
- * @template T - The type of the contract (defaults to string).
42
- * @template TAccepts - The type of ArvoContractRecord that the handler accepts.
43
- * @template TEmits - The type of ArvoContractRecord that the handler emits.
44
40
  */
45
41
  export interface IArvoEventHandler<TContract extends ArvoContract> {
46
- /**
47
- * An override source for emitted events.
48
- * @remarks
49
- * When provided, this value will be used as the source for emitted events
50
- * instead of the `contract.accepts.type`. Use this very carefully as it may
51
- * reduce system transparency and make event tracking more difficult.
52
- *
53
- * It's recommended to rely on the default source (`contract.accepts.type`)
54
- * whenever possible to maintain consistent and traceable event chains.
55
- */
56
- source?: string;
57
42
  /**
58
43
  * The contract for the handler defining its input and outputs as well as the description.
59
44
  */
@@ -70,15 +55,7 @@ export interface IArvoEventHandler<TContract extends ArvoContract> {
70
55
  */
71
56
  handler: ArvoEventHandlerFunction<TContract>;
72
57
  /**
73
- * The OpenTelemetry span kind attributes for the handler
74
- * executor.
75
- * @param [openInference] - The OpenInference span kind. Default is "CHAIN"
76
- * @param [arvoExecution] - The ArvoExecution span kind. Default is "EVENT_HANDLER"
77
- * @param [openTelemetry] - The OpenTelemetry span kind. Default is "INTERNAL"
58
+ * The OpenTelemetry span options
78
59
  */
79
- spanKind?: {
80
- openInference?: OpenInferenceSpanKind;
81
- arvoExecution?: ArvoExecutionSpanKind;
82
- openTelemetry?: SpanKind;
83
- };
60
+ spanOptions?: SpanOptions;
84
61
  }
@@ -1,36 +1,19 @@
1
1
  import { ArvoEventRouter } from '.';
2
2
  import { IArvoEventRouter } from './types';
3
3
  /**
4
- * Creates and returns a new instance of ArvoEventRouter.
4
+ * Creates a new ArvoEventRouter instance with the provided configuration.
5
+ * Validates source format and ensures unique handlers per event type.
5
6
  *
6
- * @param {IArvoEventRouter} param - Configuration object for the ArvoEventRouter.
7
- * @returns {ArvoEventRouter} A new instance of ArvoEventRouter.
8
- *
9
- * @throws {Error} If there are duplicate handlers for the same event type.
10
- * @throws {Error} If the provided source is an invalid string.
7
+ * @param param Configuration for router initialization including source,
8
+ * handlers, and execution metrics
9
+ * @returns Configured ArvoEventRouter instance
10
+ * @throws When handlers have duplicate event types or source format is invalid
11
11
  *
12
12
  * @example
13
13
  * const router = createArvoEventRouter({
14
- * source: 'my-router',
15
- * handlers: [handler1, handler2],
14
+ * source: 'payment.service',
15
+ * handlers: [paymentHandler, notificationHandler],
16
16
  * executionunits: 10
17
17
  * });
18
- *
19
- * @remarks
20
- * This function is a factory method that simplifies the creation of an ArvoEventRouter instance.
21
- * It encapsulates the instantiation process, allowing for a more concise and readable way to create routers.
22
- *
23
- * The `IArvoEventRouter` parameter should include:
24
- * - `source`: (optional) A string identifying the source of the router. Used to match the `event.to` field.
25
- * - `handlers`: An array of ArvoEventHandler instances that the router will use to process events.
26
- * - `executionunits`: A number representing the default execution cost of the function.
27
- *
28
- * The created ArvoEventRouter will:
29
- * - Validate the source string if provided.
30
- * - Check for and prevent duplicate handlers for the same event type.
31
- * - Set up internal data structures for efficient event routing.
32
- *
33
- * @see {@link ArvoEventRouter} for more details on the router's functionality.
34
- * @see {@link IArvoEventRouter} for the structure of the configuration object.
35
18
  */
36
19
  export declare const createArvoEventRouter: (param: IArvoEventRouter) => ArvoEventRouter;
@@ -3,37 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createArvoEventRouter = void 0;
4
4
  var _1 = require(".");
5
5
  /**
6
- * Creates and returns a new instance of ArvoEventRouter.
6
+ * Creates a new ArvoEventRouter instance with the provided configuration.
7
+ * Validates source format and ensures unique handlers per event type.
7
8
  *
8
- * @param {IArvoEventRouter} param - Configuration object for the ArvoEventRouter.
9
- * @returns {ArvoEventRouter} A new instance of ArvoEventRouter.
10
- *
11
- * @throws {Error} If there are duplicate handlers for the same event type.
12
- * @throws {Error} If the provided source is an invalid string.
9
+ * @param param Configuration for router initialization including source,
10
+ * handlers, and execution metrics
11
+ * @returns Configured ArvoEventRouter instance
12
+ * @throws When handlers have duplicate event types or source format is invalid
13
13
  *
14
14
  * @example
15
15
  * const router = createArvoEventRouter({
16
- * source: 'my-router',
17
- * handlers: [handler1, handler2],
16
+ * source: 'payment.service',
17
+ * handlers: [paymentHandler, notificationHandler],
18
18
  * executionunits: 10
19
19
  * });
20
- *
21
- * @remarks
22
- * This function is a factory method that simplifies the creation of an ArvoEventRouter instance.
23
- * It encapsulates the instantiation process, allowing for a more concise and readable way to create routers.
24
- *
25
- * The `IArvoEventRouter` parameter should include:
26
- * - `source`: (optional) A string identifying the source of the router. Used to match the `event.to` field.
27
- * - `handlers`: An array of ArvoEventHandler instances that the router will use to process events.
28
- * - `executionunits`: A number representing the default execution cost of the function.
29
- *
30
- * The created ArvoEventRouter will:
31
- * - Validate the source string if provided.
32
- * - Check for and prevent duplicate handlers for the same event type.
33
- * - Set up internal data structures for efficient event routing.
34
- *
35
- * @see {@link ArvoEventRouter} for more details on the router's functionality.
36
- * @see {@link IArvoEventRouter} for the structure of the configuration object.
37
20
  */
38
21
  var createArvoEventRouter = function (param) {
39
22
  return new _1.ArvoEventRouter(param);