duron 0.3.0-beta.10 → 0.3.0-beta.11

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.
Files changed (60) hide show
  1. package/dist/action-job.d.ts +31 -0
  2. package/dist/action-job.d.ts.map +1 -1
  3. package/dist/action-job.js +59 -0
  4. package/dist/action-manager.d.ts +42 -0
  5. package/dist/action-manager.d.ts.map +1 -1
  6. package/dist/action-manager.js +61 -0
  7. package/dist/action.d.ts +143 -0
  8. package/dist/action.d.ts.map +1 -1
  9. package/dist/action.js +131 -0
  10. package/dist/adapters/adapter.d.ts +359 -0
  11. package/dist/adapters/adapter.d.ts.map +1 -1
  12. package/dist/adapters/adapter.js +208 -0
  13. package/dist/adapters/postgres/base.d.ts +166 -0
  14. package/dist/adapters/postgres/base.d.ts.map +1 -1
  15. package/dist/adapters/postgres/base.js +268 -17
  16. package/dist/adapters/postgres/pglite.d.ts +37 -0
  17. package/dist/adapters/postgres/pglite.d.ts.map +1 -1
  18. package/dist/adapters/postgres/pglite.js +38 -0
  19. package/dist/adapters/postgres/postgres.d.ts +35 -0
  20. package/dist/adapters/postgres/postgres.d.ts.map +1 -1
  21. package/dist/adapters/postgres/postgres.js +42 -0
  22. package/dist/adapters/postgres/schema.js +11 -1
  23. package/dist/adapters/schemas.d.ts +9 -0
  24. package/dist/adapters/schemas.d.ts.map +1 -1
  25. package/dist/adapters/schemas.js +73 -1
  26. package/dist/client.d.ts +224 -0
  27. package/dist/client.d.ts.map +1 -1
  28. package/dist/client.js +311 -1
  29. package/dist/constants.js +6 -0
  30. package/dist/errors.d.ts +119 -0
  31. package/dist/errors.d.ts.map +1 -1
  32. package/dist/errors.js +111 -0
  33. package/dist/server.d.ts +44 -0
  34. package/dist/server.d.ts.map +1 -1
  35. package/dist/server.js +56 -0
  36. package/dist/step-manager.d.ts +83 -0
  37. package/dist/step-manager.d.ts.map +1 -1
  38. package/dist/step-manager.js +237 -5
  39. package/dist/telemetry/adapter.d.ts +322 -0
  40. package/dist/telemetry/adapter.d.ts.map +1 -1
  41. package/dist/telemetry/adapter.js +145 -0
  42. package/dist/telemetry/index.js +1 -0
  43. package/dist/telemetry/local.d.ts +48 -0
  44. package/dist/telemetry/local.d.ts.map +1 -1
  45. package/dist/telemetry/local.js +102 -0
  46. package/dist/telemetry/noop.d.ts +10 -0
  47. package/dist/telemetry/noop.d.ts.map +1 -1
  48. package/dist/telemetry/noop.js +43 -0
  49. package/dist/telemetry/opentelemetry.d.ts +23 -0
  50. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  51. package/dist/telemetry/opentelemetry.js +39 -0
  52. package/dist/utils/p-retry.d.ts +5 -0
  53. package/dist/utils/p-retry.d.ts.map +1 -1
  54. package/dist/utils/p-retry.js +8 -0
  55. package/dist/utils/wait-for-abort.d.ts +1 -0
  56. package/dist/utils/wait-for-abort.d.ts.map +1 -1
  57. package/dist/utils/wait-for-abort.js +1 -0
  58. package/package.json +1 -1
  59. package/src/adapters/postgres/base.ts +40 -17
  60. package/src/adapters/schemas.ts +11 -1
@@ -1,7 +1,28 @@
1
1
  import { type AddSpanAttributeOptions, type AddSpanEventOptions, type EndSpanOptions, type RecordMetricOptions, type Span, type StartDatabaseSpanOptions, type StartJobSpanOptions, type StartStepSpanOptions, TelemetryAdapter, type Tracer } from './adapter.js';
2
2
  export interface LocalTelemetryAdapterOptions {
3
+ /**
4
+ * Delay in milliseconds before flushing queued metrics to the database.
5
+ * Metrics are batched and inserted after this delay of inactivity.
6
+ * @default 1000
7
+ */
3
8
  flushDelayMs?: number;
4
9
  }
10
+ /**
11
+ * Local telemetry adapter that stores metrics directly in the Duron database.
12
+ * Perfect for development and self-hosted deployments.
13
+ *
14
+ * This adapter automatically uses the database adapter configured in the Duron client.
15
+ * Metrics are batched and inserted after a configurable delay of inactivity to reduce database load.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const client = duron({
20
+ * database: postgresAdapter({ connection: 'postgres://...' }),
21
+ * telemetry: localTelemetryAdapter({ flushDelayMs: 500 }), // Custom 500ms delay
22
+ * actions: { ... }
23
+ * })
24
+ * ```
25
+ */
5
26
  export declare class LocalTelemetryAdapter extends TelemetryAdapter {
6
27
  #private;
7
28
  constructor(options?: LocalTelemetryAdapterOptions);
@@ -18,5 +39,32 @@ export declare class LocalTelemetryAdapter extends TelemetryAdapter {
18
39
  protected _addSpanAttribute(options: AddSpanAttributeOptions): Promise<void>;
19
40
  protected _getTracer(name: string): Tracer;
20
41
  }
42
+ /**
43
+ * Create a local telemetry adapter that stores metrics in the Duron database.
44
+ * Perfect for development and self-hosted deployments.
45
+ *
46
+ * The database adapter is automatically obtained from the Duron client.
47
+ * Metrics are batched and inserted after a configurable delay of inactivity to reduce database load.
48
+ *
49
+ * @param options - Configuration options
50
+ * @param options.flushDelayMs - Delay in milliseconds before flushing queued metrics (default: 1000)
51
+ * @returns LocalTelemetryAdapter instance
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * const client = duron({
56
+ * database: postgresAdapter({ connection: 'postgres://...' }),
57
+ * telemetry: localTelemetryAdapter(), // Uses default 1 second delay
58
+ * actions: { ... }
59
+ * })
60
+ *
61
+ * // Or with custom flush delay
62
+ * const client = duron({
63
+ * database: postgresAdapter({ connection: 'postgres://...' }),
64
+ * telemetry: localTelemetryAdapter({ flushDelayMs: 500 }), // 500ms delay
65
+ * actions: { ... }
66
+ * })
67
+ * ```
68
+ */
21
69
  export declare const localTelemetryAdapter: (options?: LocalTelemetryAdapterOptions) => LocalTelemetryAdapter;
22
70
  //# sourceMappingURL=local.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/telemetry/local.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAExB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,MAAM,EAEZ,MAAM,cAAc,CAAA;AAMrB,MAAM,WAAW,4BAA4B;IAM3C,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AA4BD,qBAAa,qBAAsB,SAAQ,gBAAgB;;gBAO7C,OAAO,CAAC,EAAE,4BAA4B;cAwFlC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;cAIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;cAUtB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAyB1D,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAoB/D,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;cA2B5D,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAqBhE,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;cAK5E,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAQtE,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAW1D,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAc1D,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBlF,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAqF3C;AA6BD,eAAO,MAAM,qBAAqB,GAAI,UAAU,4BAA4B,0BAAuC,CAAA"}
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/telemetry/local.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAExB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,MAAM,EAEZ,MAAM,cAAc,CAAA;AAMrB,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAYD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,qBAAsB,SAAQ,gBAAgB;;gBAO7C,OAAO,CAAC,EAAE,4BAA4B;cAwFlC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;cAIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;cAUtB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAyB1D,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAoB/D,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;cA2B5D,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAqBhE,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;cAK5E,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAQtE,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAW1D,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAc1D,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBlF,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAqF3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,4BAA4B,0BAAuC,CAAA"}
@@ -1,5 +1,27 @@
1
1
  import { TelemetryAdapter, } from './adapter.js';
2
+ // ============================================================================
3
+ // Constants
4
+ // ============================================================================
2
5
  const DEFAULT_FLUSH_DELAY_MS = 1000;
6
+ // ============================================================================
7
+ // Local Telemetry Adapter
8
+ // ============================================================================
9
+ /**
10
+ * Local telemetry adapter that stores metrics directly in the Duron database.
11
+ * Perfect for development and self-hosted deployments.
12
+ *
13
+ * This adapter automatically uses the database adapter configured in the Duron client.
14
+ * Metrics are batched and inserted after a configurable delay of inactivity to reduce database load.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const client = duron({
19
+ * database: postgresAdapter({ connection: 'postgres://...' }),
20
+ * telemetry: localTelemetryAdapter({ flushDelayMs: 500 }), // Custom 500ms delay
21
+ * actions: { ... }
22
+ * })
23
+ * ```
24
+ */
3
25
  export class LocalTelemetryAdapter extends TelemetryAdapter {
4
26
  #spanStartTimes = new Map();
5
27
  #metricsQueue = [];
@@ -10,6 +32,10 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
10
32
  super();
11
33
  this.#flushDelayMs = options?.flushDelayMs ?? DEFAULT_FLUSH_DELAY_MS;
12
34
  }
35
+ /**
36
+ * Get the database adapter from the Duron client.
37
+ * @throws Error if the client is not set
38
+ */
13
39
  get #database() {
14
40
  const client = this.client;
15
41
  if (!client) {
@@ -17,10 +43,21 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
17
43
  }
18
44
  return client.database;
19
45
  }
46
+ // ============================================================================
47
+ // Queue Management
48
+ // ============================================================================
49
+ /**
50
+ * Queue a metric for batch insertion.
51
+ * The metric will be inserted after 1 second of inactivity.
52
+ */
20
53
  #queueMetric(options) {
21
54
  this.#metricsQueue.push(options);
22
55
  this.#scheduleFlush();
23
56
  }
57
+ /**
58
+ * Schedule a flush of the metrics queue.
59
+ * Resets the timer on each call (debounce behavior).
60
+ */
24
61
  #scheduleFlush() {
25
62
  if (this.#flushTimer) {
26
63
  clearTimeout(this.#flushTimer);
@@ -32,32 +69,53 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
32
69
  });
33
70
  }, this.#flushDelayMs);
34
71
  }
72
+ /**
73
+ * Flush all queued metrics to the database.
74
+ */
35
75
  async #flushQueue() {
36
76
  if (this.#metricsQueue.length === 0) {
37
77
  return;
38
78
  }
79
+ // Take all metrics from the queue
39
80
  const metrics = this.#metricsQueue.splice(0, this.#metricsQueue.length);
81
+ // Batch insert all metrics in a single database operation
40
82
  await this.#database.insertMetrics(metrics);
41
83
  }
84
+ /**
85
+ * Force flush the queue immediately.
86
+ * Used during shutdown to ensure all metrics are persisted.
87
+ */
42
88
  async #forceFlush() {
89
+ // Clear any pending timer
43
90
  if (this.#flushTimer) {
44
91
  clearTimeout(this.#flushTimer);
45
92
  this.#flushTimer = null;
46
93
  }
94
+ // Wait for any in-progress flush
47
95
  if (this.#flushPromise) {
48
96
  await this.#flushPromise;
49
97
  }
98
+ // Flush remaining metrics
50
99
  await this.#flushQueue();
51
100
  }
101
+ // ============================================================================
102
+ // Lifecycle Methods
103
+ // ============================================================================
52
104
  async _start() {
105
+ // Database adapter should already be started by the client
53
106
  }
54
107
  async _stop() {
108
+ // Flush any remaining metrics before stopping
55
109
  await this.#forceFlush();
56
110
  this.#spanStartTimes.clear();
57
111
  }
112
+ // ============================================================================
113
+ // Span Methods
114
+ // ============================================================================
58
115
  async _startJobSpan(options) {
59
116
  const spanId = `job:${options.jobId}`;
60
117
  this.#spanStartTimes.set(spanId, Date.now());
118
+ // Record span start as a metric
61
119
  this.#queueMetric({
62
120
  jobId: options.jobId,
63
121
  name: 'duron.job.span.start',
@@ -80,6 +138,7 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
80
138
  const startTime = this.#spanStartTimes.get(span.id);
81
139
  const duration = startTime ? Date.now() - startTime : 0;
82
140
  this.#spanStartTimes.delete(span.id);
141
+ // Record span end with duration
83
142
  this.#queueMetric({
84
143
  jobId: span.jobId,
85
144
  name: 'duron.job.span.end',
@@ -96,6 +155,7 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
96
155
  async _startStepSpan(options) {
97
156
  const spanId = `step:${options.stepId}`;
98
157
  this.#spanStartTimes.set(spanId, Date.now());
158
+ // Record span start as a metric
99
159
  this.#queueMetric({
100
160
  jobId: options.jobId,
101
161
  stepId: options.stepId,
@@ -120,6 +180,7 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
120
180
  const startTime = this.#spanStartTimes.get(span.id);
121
181
  const duration = startTime ? Date.now() - startTime : 0;
122
182
  this.#spanStartTimes.delete(span.id);
183
+ // Record span end with duration
123
184
  this.#queueMetric({
124
185
  jobId: span.jobId,
125
186
  stepId: span.stepId ?? undefined,
@@ -135,10 +196,15 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
135
196
  });
136
197
  }
137
198
  async _startDatabaseSpan(_options) {
199
+ // Local adapter doesn't trace database operations to avoid infinite loops
138
200
  return null;
139
201
  }
140
202
  async _endDatabaseSpan(_span, _options) {
203
+ // No-op for local adapter
141
204
  }
205
+ // ============================================================================
206
+ // Metrics Methods
207
+ // ============================================================================
142
208
  async _recordMetric(options) {
143
209
  this.#queueMetric({
144
210
  jobId: options.jobId,
@@ -176,6 +242,9 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
176
242
  },
177
243
  });
178
244
  }
245
+ // ============================================================================
246
+ // Tracer Methods
247
+ // ============================================================================
179
248
  _getTracer(name) {
180
249
  const adapter = this;
181
250
  return {
@@ -187,6 +256,10 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
187
256
  const attributes = {
188
257
  ...options?.attributes,
189
258
  };
259
+ // Note: Local adapter tracer spans don't have a jobId context,
260
+ // so they can't be stored in the database. They're essentially no-ops
261
+ // but provide a consistent API for code that needs a tracer.
262
+ // For actual metrics storage, use ctx.observe within action/step handlers.
190
263
  const tracerSpan = {
191
264
  setAttribute(key, value) {
192
265
  if (!ended) {
@@ -212,11 +285,13 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
212
285
  },
213
286
  setStatusOk() {
214
287
  if (!ended) {
288
+ // biome-ignore lint/complexity/useLiteralKeys: Index signature requires bracket notation
215
289
  attributes['status'] = 'ok';
216
290
  }
217
291
  },
218
292
  setStatusError(message) {
219
293
  if (!ended) {
294
+ // biome-ignore lint/complexity/useLiteralKeys: Index signature requires bracket notation
220
295
  attributes['status'] = 'error';
221
296
  if (message) {
222
297
  attributes['status.message'] = message;
@@ -240,4 +315,31 @@ export class LocalTelemetryAdapter extends TelemetryAdapter {
240
315
  };
241
316
  }
242
317
  }
318
+ /**
319
+ * Create a local telemetry adapter that stores metrics in the Duron database.
320
+ * Perfect for development and self-hosted deployments.
321
+ *
322
+ * The database adapter is automatically obtained from the Duron client.
323
+ * Metrics are batched and inserted after a configurable delay of inactivity to reduce database load.
324
+ *
325
+ * @param options - Configuration options
326
+ * @param options.flushDelayMs - Delay in milliseconds before flushing queued metrics (default: 1000)
327
+ * @returns LocalTelemetryAdapter instance
328
+ *
329
+ * @example
330
+ * ```typescript
331
+ * const client = duron({
332
+ * database: postgresAdapter({ connection: 'postgres://...' }),
333
+ * telemetry: localTelemetryAdapter(), // Uses default 1 second delay
334
+ * actions: { ... }
335
+ * })
336
+ *
337
+ * // Or with custom flush delay
338
+ * const client = duron({
339
+ * database: postgresAdapter({ connection: 'postgres://...' }),
340
+ * telemetry: localTelemetryAdapter({ flushDelayMs: 500 }), // 500ms delay
341
+ * actions: { ... }
342
+ * })
343
+ * ```
344
+ */
243
345
  export const localTelemetryAdapter = (options) => new LocalTelemetryAdapter(options);
@@ -1,4 +1,8 @@
1
1
  import { type AddSpanAttributeOptions, type AddSpanEventOptions, type EndSpanOptions, type RecordMetricOptions, type Span, type StartDatabaseSpanOptions, type StartJobSpanOptions, type StartStepSpanOptions, TelemetryAdapter, type Tracer } from './adapter.js';
2
+ /**
3
+ * No-operation telemetry adapter.
4
+ * Used when telemetry is disabled. All methods are no-ops.
5
+ */
2
6
  export declare class NoopTelemetryAdapter extends TelemetryAdapter {
3
7
  protected _start(): Promise<void>;
4
8
  protected _stop(): Promise<void>;
@@ -13,5 +17,11 @@ export declare class NoopTelemetryAdapter extends TelemetryAdapter {
13
17
  protected _addSpanAttribute(_options: AddSpanAttributeOptions): Promise<void>;
14
18
  protected _getTracer(name: string): Tracer;
15
19
  }
20
+ /**
21
+ * Create a no-operation telemetry adapter.
22
+ * Use this when telemetry should be disabled.
23
+ *
24
+ * @returns NoopTelemetryAdapter instance
25
+ */
16
26
  export declare const noopTelemetryAdapter: () => NoopTelemetryAdapter;
17
27
  //# sourceMappingURL=noop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../src/telemetry/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,MAAM,EAEZ,MAAM,cAAc,CAAA;AAyCrB,qBAAa,oBAAqB,SAAQ,gBAAgB;cAKxC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;cAIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;cAQtB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAS1D,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAIjE,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;cAS5D,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAIlE,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;cAI5E,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAQtE,aAAa,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAI3D,aAAa,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAI3D,iBAAiB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnF,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAQ3C;AAQD,eAAO,MAAM,oBAAoB,4BAAmC,CAAA"}
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../src/telemetry/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,MAAM,EAEZ,MAAM,cAAc,CAAA;AAqCrB;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;cAKxC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;cAIvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;cAQtB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAS1D,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAIjE,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;cAS5D,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAIlE,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;cAI5E,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAQtE,aAAa,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAI3D,aAAa,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAI3D,iBAAiB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnF,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAQ3C;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,4BAAmC,CAAA"}
@@ -1,28 +1,53 @@
1
1
  import { TelemetryAdapter, } from './adapter.js';
2
+ // ============================================================================
3
+ // Noop Tracer Span
4
+ // ============================================================================
2
5
  const noopTracerSpan = {
3
6
  setAttribute() {
7
+ // No-op
4
8
  },
5
9
  setAttributes() {
10
+ // No-op
6
11
  },
7
12
  addEvent() {
13
+ // No-op
8
14
  },
9
15
  recordException() {
16
+ // No-op
10
17
  },
11
18
  setStatusOk() {
19
+ // No-op
12
20
  },
13
21
  setStatusError() {
22
+ // No-op
14
23
  },
15
24
  end() {
25
+ // No-op
16
26
  },
17
27
  isRecording() {
18
28
  return false;
19
29
  },
20
30
  };
31
+ // ============================================================================
32
+ // Noop Telemetry Adapter
33
+ // ============================================================================
34
+ /**
35
+ * No-operation telemetry adapter.
36
+ * Used when telemetry is disabled. All methods are no-ops.
37
+ */
21
38
  export class NoopTelemetryAdapter extends TelemetryAdapter {
39
+ // ============================================================================
40
+ // Lifecycle Methods
41
+ // ============================================================================
22
42
  async _start() {
43
+ // No-op
23
44
  }
24
45
  async _stop() {
46
+ // No-op
25
47
  }
48
+ // ============================================================================
49
+ // Span Methods
50
+ // ============================================================================
26
51
  async _startJobSpan(options) {
27
52
  return {
28
53
  id: 'noop',
@@ -32,6 +57,7 @@ export class NoopTelemetryAdapter extends TelemetryAdapter {
32
57
  };
33
58
  }
34
59
  async _endJobSpan(_span, _options) {
60
+ // No-op
35
61
  }
36
62
  async _startStepSpan(options) {
37
63
  return {
@@ -42,18 +68,29 @@ export class NoopTelemetryAdapter extends TelemetryAdapter {
42
68
  };
43
69
  }
44
70
  async _endStepSpan(_span, _options) {
71
+ // No-op
45
72
  }
46
73
  async _startDatabaseSpan(_options) {
47
74
  return null;
48
75
  }
49
76
  async _endDatabaseSpan(_span, _options) {
77
+ // No-op
50
78
  }
79
+ // ============================================================================
80
+ // Metrics Methods
81
+ // ============================================================================
51
82
  async _recordMetric(_options) {
83
+ // No-op
52
84
  }
53
85
  async _addSpanEvent(_options) {
86
+ // No-op
54
87
  }
55
88
  async _addSpanAttribute(_options) {
89
+ // No-op
56
90
  }
91
+ // ============================================================================
92
+ // Tracer Methods
93
+ // ============================================================================
57
94
  _getTracer(name) {
58
95
  return {
59
96
  name,
@@ -63,4 +100,10 @@ export class NoopTelemetryAdapter extends TelemetryAdapter {
63
100
  };
64
101
  }
65
102
  }
103
+ /**
104
+ * Create a no-operation telemetry adapter.
105
+ * Use this when telemetry should be disabled.
106
+ *
107
+ * @returns NoopTelemetryAdapter instance
108
+ */
66
109
  export const noopTelemetryAdapter = () => new NoopTelemetryAdapter();
@@ -1,10 +1,26 @@
1
1
  import type { TracerProvider } from '@opentelemetry/api';
2
2
  import { type AddSpanAttributeOptions, type AddSpanEventOptions, type EndSpanOptions, type RecordMetricOptions, type Span, type StartDatabaseSpanOptions, type StartJobSpanOptions, type StartStepSpanOptions, TelemetryAdapter, type Tracer } from './adapter.js';
3
3
  export interface OpenTelemetryAdapterOptions {
4
+ /**
5
+ * Service name for telemetry.
6
+ * Used as the tracer name.
7
+ */
4
8
  serviceName?: string;
9
+ /**
10
+ * Optional TracerProvider to use.
11
+ * If not provided, uses the global tracer provider.
12
+ */
5
13
  tracerProvider?: TracerProvider;
14
+ /**
15
+ * Whether to trace database queries.
16
+ * @default false
17
+ */
6
18
  traceDatabaseQueries?: boolean;
7
19
  }
20
+ /**
21
+ * OpenTelemetry telemetry adapter.
22
+ * Exports traces to external systems like Jaeger, OTLP, etc.
23
+ */
8
24
  export declare class OpenTelemetryAdapter extends TelemetryAdapter {
9
25
  #private;
10
26
  constructor(options?: OpenTelemetryAdapterOptions);
@@ -21,5 +37,12 @@ export declare class OpenTelemetryAdapter extends TelemetryAdapter {
21
37
  protected _addSpanAttribute(options: AddSpanAttributeOptions): Promise<void>;
22
38
  protected _getTracer(name: string): Tracer;
23
39
  }
40
+ /**
41
+ * Create an OpenTelemetry telemetry adapter.
42
+ * Exports traces to external systems like Jaeger, OTLP, etc.
43
+ *
44
+ * @param options - Configuration options
45
+ * @returns OpenTelemetryAdapter instance
46
+ */
24
47
  export declare const openTelemetryAdapter: (options?: OpenTelemetryAdapterOptions) => OpenTelemetryAdapter;
25
48
  //# sourceMappingURL=opentelemetry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"opentelemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/opentelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0C,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEhG,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAExB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,MAAM,EAEZ,MAAM,cAAc,CAAA;AAMrB,MAAM,WAAW,2BAA2B;IAK1C,WAAW,CAAC,EAAE,MAAM,CAAA;IAMpB,cAAc,CAAC,EAAE,cAAc,CAAA;IAM/B,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAcD,qBAAa,oBAAqB,SAAQ,gBAAgB;;gBAQ5C,OAAO,GAAE,2BAAgC;cAWrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;cAYvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;cAStB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cA8B1D,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cA2B/D,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;cA4C5D,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cA2BhE,kBAAkB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;cA8B3E,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAyBpE,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAe1D,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAO1D,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlF,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAsI3C;AASD,eAAO,MAAM,oBAAoB,GAAI,UAAU,2BAA2B,yBAAsC,CAAA"}
1
+ {"version":3,"file":"opentelemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/opentelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0C,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEhG,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAExB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,MAAM,EAEZ,MAAM,cAAc,CAAA;AAMrB,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAA;IAE/B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAUD;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;;gBAQ5C,OAAO,GAAE,2BAAgC;cAWrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;cAYvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;cAStB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cA8B1D,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cA2B/D,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;cA4C5D,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cA2BhE,kBAAkB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;cA8B3E,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAyBpE,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAe1D,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;cAO1D,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlF,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAsI3C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,UAAU,2BAA2B,yBAAsC,CAAA"}
@@ -1,4 +1,11 @@
1
1
  import { TelemetryAdapter, } from './adapter.js';
2
+ // ============================================================================
3
+ // OpenTelemetry Adapter
4
+ // ============================================================================
5
+ /**
6
+ * OpenTelemetry telemetry adapter.
7
+ * Exports traces to external systems like Jaeger, OTLP, etc.
8
+ */
2
9
  export class OpenTelemetryAdapter extends TelemetryAdapter {
3
10
  #serviceName;
4
11
  #tracerProvider;
@@ -12,8 +19,13 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
12
19
  this.#tracerProvider = options.tracerProvider ?? null;
13
20
  this.#traceDatabaseQueries = options.traceDatabaseQueries ?? false;
14
21
  }
22
+ // ============================================================================
23
+ // Lifecycle Methods
24
+ // ============================================================================
15
25
  async _start() {
26
+ // Dynamically import OpenTelemetry API to make it optional
16
27
  const api = await import('@opentelemetry/api');
28
+ // Get tracer from provider or global
17
29
  if (this.#tracerProvider) {
18
30
  this.#tracer = this.#tracerProvider.getTracer(this.#serviceName);
19
31
  }
@@ -25,6 +37,9 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
25
37
  this.#spanMap.clear();
26
38
  this.#tracer = null;
27
39
  }
40
+ // ============================================================================
41
+ // Span Methods
42
+ // ============================================================================
28
43
  async _startJobSpan(options) {
29
44
  if (!this.#tracer) {
30
45
  throw new Error('OpenTelemetry tracer not initialized');
@@ -80,6 +95,7 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
80
95
  throw new Error('OpenTelemetry tracer not initialized');
81
96
  }
82
97
  const api = await import('@opentelemetry/api');
98
+ // Get parent span context
83
99
  let parentContext = api.context.active();
84
100
  if (options.parentSpan) {
85
101
  const parentExtSpan = options.parentSpan;
@@ -176,7 +192,12 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
176
192
  otelSpan.end();
177
193
  this.#spanMap.delete(span.id);
178
194
  }
195
+ // ============================================================================
196
+ // Metrics Methods
197
+ // ============================================================================
179
198
  async _recordMetric(options) {
199
+ // OpenTelemetry metrics would require MeterProvider
200
+ // For now, we record as span events on the current active span
180
201
  const api = await import('@opentelemetry/api');
181
202
  const activeSpan = api.trace.getActiveSpan();
182
203
  if (activeSpan) {
@@ -199,7 +220,11 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
199
220
  extSpan.otelSpan.setAttribute(options.key, options.value);
200
221
  }
201
222
  }
223
+ // ============================================================================
224
+ // Tracer Methods
225
+ // ============================================================================
202
226
  _getTracer(name) {
227
+ // Return cached tracer if available
203
228
  const cached = this.#tracerCache.get(name);
204
229
  if (cached) {
205
230
  return cached;
@@ -208,11 +233,15 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
208
233
  const tracer = {
209
234
  name,
210
235
  startSpan(spanName, options) {
236
+ // We need to dynamically get the OpenTelemetry API
237
+ // Since _getTracer is synchronous, we need to handle this carefully
211
238
  let otelSpan = null;
212
239
  let api = null;
213
240
  let ended = false;
241
+ // Initialize the span asynchronously but return synchronously
214
242
  const initPromise = (async () => {
215
243
  api = await import('@opentelemetry/api');
244
+ // Get the tracer
216
245
  let otelTracer;
217
246
  if (adapter.#tracerProvider) {
218
247
  otelTracer = adapter.#tracerProvider.getTracer(name);
@@ -220,6 +249,7 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
220
249
  else {
221
250
  otelTracer = api.trace.getTracer(name);
222
251
  }
252
+ // Map kind
223
253
  let spanKind = api.SpanKind.INTERNAL;
224
254
  if (options?.kind === 'client')
225
255
  spanKind = api.SpanKind.CLIENT;
@@ -229,6 +259,7 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
229
259
  spanKind = api.SpanKind.PRODUCER;
230
260
  else if (options?.kind === 'consumer')
231
261
  spanKind = api.SpanKind.CONSUMER;
262
+ // Get parent context
232
263
  let parentContext = api.context.active();
233
264
  if (options?.parentSpan) {
234
265
  const parentOtelSpan = options.parentSpan._otelSpan;
@@ -296,6 +327,7 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
296
327
  return otelSpan?.isRecording() ?? false;
297
328
  },
298
329
  };
330
+ // Store reference for parent context propagation
299
331
  initPromise.then(() => {
300
332
  if (otelSpan) {
301
333
  ;
@@ -309,4 +341,11 @@ export class OpenTelemetryAdapter extends TelemetryAdapter {
309
341
  return tracer;
310
342
  }
311
343
  }
344
+ /**
345
+ * Create an OpenTelemetry telemetry adapter.
346
+ * Exports traces to external systems like Jaeger, OTLP, etc.
347
+ *
348
+ * @param options - Configuration options
349
+ * @returns OpenTelemetryAdapter instance
350
+ */
312
351
  export const openTelemetryAdapter = (options) => new OpenTelemetryAdapter(options);
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @author github.com/sindresorhus
3
+ * @license MIT
4
+ * @description A refactor version of p-retry remove unnecessary code and add the necessary context to the retry function.
5
+ */
1
6
  interface RetryOptions {
2
7
  retries: number;
3
8
  factor: number;
@@ -1 +1 @@
1
- {"version":3,"file":"p-retry.d.ts","sourceRoot":"","sources":["../../src/utils/p-retry.ts"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,WAAW,CAAA;IACnB,eAAe,EAAE,CAAC,OAAO,EAAE;QACzB,KAAK,EAAE,KAAK,CAAA;QACZ,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,MAAM,CAAA;QACvB,UAAU,EAAE,MAAM,CAAA;KACnB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACpB;AA6HD,wBAA8B,MAAM,CAAC,OAAO,EAC1C,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAClD,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CA4DlB"}
1
+ {"version":3,"file":"p-retry.d.ts","sourceRoot":"","sources":["../../src/utils/p-retry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,WAAW,CAAA;IACnB,eAAe,EAAE,CAAC,OAAO,EAAE;QACzB,KAAK,EAAE,KAAK,CAAA;QACZ,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,MAAM,CAAA;QACvB,UAAU,EAAE,MAAM,CAAA;KACnB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACpB;AA6HD,wBAA8B,MAAM,CAAC,OAAO,EAC1C,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAClD,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CA4DlB"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @author github.com/sindresorhus
3
+ * @license MIT
4
+ * @description A refactor version of p-retry remove unnecessary code and add the necessary context to the retry function.
5
+ */
1
6
  function validateRetries(retries) {
2
7
  if (typeof retries === 'number') {
3
8
  if (retries < 0) {
@@ -95,10 +100,12 @@ export default async function pRetry(input, options) {
95
100
  options.maxTimeout ??= Number.POSITIVE_INFINITY;
96
101
  options.maxRetryTime ??= Number.POSITIVE_INFINITY;
97
102
  options.randomize ??= false;
103
+ // Validate numeric options and normalize edge cases
98
104
  validateNumberOption('factor', options.factor, { min: 0, allowInfinity: false });
99
105
  validateNumberOption('minTimeout', options.minTimeout, { min: 0, allowInfinity: false });
100
106
  validateNumberOption('maxTimeout', options.maxTimeout, { min: 0, allowInfinity: true });
101
107
  validateNumberOption('maxRetryTime', options.maxRetryTime, { min: 0, allowInfinity: true });
108
+ // Treat non-positive factor as 1 to avoid zero backoff or negative behavior
102
109
  if (!(options.factor > 0)) {
103
110
  options.factor = 1;
104
111
  }
@@ -125,5 +132,6 @@ export default async function pRetry(input, options) {
125
132
  retriesConsumed++;
126
133
  }
127
134
  }
135
+ // Should not reach here, but in case it does, throw an error
128
136
  throw new Error('Retry attempts exhausted without throwing an error.');
129
137
  }
@@ -1,3 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConfusingVoidType: do not care */
1
2
  export default function waitForAbort(signal: AbortSignal): {
2
3
  promise: Promise<unknown>;
3
4
  release: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for-abort.d.ts","sourceRoot":"","sources":["../../src/utils/wait-for-abort.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAM,EAAE,WAAW;;;EAqCvD"}
1
+ {"version":3,"file":"wait-for-abort.d.ts","sourceRoot":"","sources":["../../src/utils/wait-for-abort.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAM,EAAE,WAAW;;;EAqCvD"}
@@ -1,3 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConfusingVoidType: do not care */
1
2
  export default function waitForAbort(signal) {
2
3
  let done = false;
3
4
  let globalResolve = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "duron",
3
- "version": "0.3.0-beta.10",
3
+ "version": "0.3.0-beta.11",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",