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.
- package/dist/action-job.d.ts +31 -0
- package/dist/action-job.d.ts.map +1 -1
- package/dist/action-job.js +59 -0
- package/dist/action-manager.d.ts +42 -0
- package/dist/action-manager.d.ts.map +1 -1
- package/dist/action-manager.js +61 -0
- package/dist/action.d.ts +143 -0
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +131 -0
- package/dist/adapters/adapter.d.ts +359 -0
- package/dist/adapters/adapter.d.ts.map +1 -1
- package/dist/adapters/adapter.js +208 -0
- package/dist/adapters/postgres/base.d.ts +166 -0
- package/dist/adapters/postgres/base.d.ts.map +1 -1
- package/dist/adapters/postgres/base.js +268 -17
- package/dist/adapters/postgres/pglite.d.ts +37 -0
- package/dist/adapters/postgres/pglite.d.ts.map +1 -1
- package/dist/adapters/postgres/pglite.js +38 -0
- package/dist/adapters/postgres/postgres.d.ts +35 -0
- package/dist/adapters/postgres/postgres.d.ts.map +1 -1
- package/dist/adapters/postgres/postgres.js +42 -0
- package/dist/adapters/postgres/schema.js +11 -1
- package/dist/adapters/schemas.d.ts +9 -0
- package/dist/adapters/schemas.d.ts.map +1 -1
- package/dist/adapters/schemas.js +73 -1
- package/dist/client.d.ts +224 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +311 -1
- package/dist/constants.js +6 -0
- package/dist/errors.d.ts +119 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +111 -0
- package/dist/server.d.ts +44 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +56 -0
- package/dist/step-manager.d.ts +83 -0
- package/dist/step-manager.d.ts.map +1 -1
- package/dist/step-manager.js +237 -5
- package/dist/telemetry/adapter.d.ts +322 -0
- package/dist/telemetry/adapter.d.ts.map +1 -1
- package/dist/telemetry/adapter.js +145 -0
- package/dist/telemetry/index.js +1 -0
- package/dist/telemetry/local.d.ts +48 -0
- package/dist/telemetry/local.d.ts.map +1 -1
- package/dist/telemetry/local.js +102 -0
- package/dist/telemetry/noop.d.ts +10 -0
- package/dist/telemetry/noop.d.ts.map +1 -1
- package/dist/telemetry/noop.js +43 -0
- package/dist/telemetry/opentelemetry.d.ts +23 -0
- package/dist/telemetry/opentelemetry.d.ts.map +1 -1
- package/dist/telemetry/opentelemetry.js +39 -0
- package/dist/utils/p-retry.d.ts +5 -0
- package/dist/utils/p-retry.d.ts.map +1 -1
- package/dist/utils/p-retry.js +8 -0
- package/dist/utils/wait-for-abort.d.ts +1 -0
- package/dist/utils/wait-for-abort.d.ts.map +1 -1
- package/dist/utils/wait-for-abort.js +1 -0
- package/package.json +1 -1
- package/src/adapters/postgres/base.ts +40 -17
- 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;
|
|
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"}
|
package/dist/telemetry/local.js
CHANGED
|
@@ -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);
|
package/dist/telemetry/noop.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/telemetry/noop.js
CHANGED
|
@@ -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;
|
|
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);
|
package/dist/utils/p-retry.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p-retry.d.ts","sourceRoot":"","sources":["../../src/utils/p-retry.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/utils/p-retry.js
CHANGED
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-for-abort.d.ts","sourceRoot":"","sources":["../../src/utils/wait-for-abort.ts"],"names":[],"mappings":"
|
|
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"}
|