@prefactor/core 0.2.0 → 0.2.1
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/agent/instance-manager.d.ts +5 -8
- package/dist/agent/instance-manager.d.ts.map +1 -1
- package/dist/agent/instance-manager.js +34 -55
- package/dist/agent/instance-manager.js.map +1 -1
- package/dist/config.d.ts +15 -63
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -20
- package/dist/config.js.map +1 -1
- package/dist/create-core.d.ts +0 -2
- package/dist/create-core.d.ts.map +1 -1
- package/dist/create-core.js +10 -28
- package/dist/create-core.js.map +1 -1
- package/dist/index.cjs +577 -457
- package/dist/index.cjs.map +17 -15
- package/dist/index.d.ts +2 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +577 -457
- package/dist/index.js.map +17 -15
- package/dist/queue/actions.d.ts +15 -26
- package/dist/queue/actions.d.ts.map +1 -1
- package/dist/queue/base.d.ts +15 -3
- package/dist/queue/base.d.ts.map +1 -1
- package/dist/queue/in-memory-queue.d.ts +11 -0
- package/dist/queue/in-memory-queue.d.ts.map +1 -0
- package/dist/queue/in-memory-queue.js +46 -0
- package/dist/queue/in-memory-queue.js.map +1 -0
- package/dist/queue/task-executor.d.ts +18 -0
- package/dist/queue/task-executor.d.ts.map +1 -0
- package/dist/queue/task-executor.js +77 -0
- package/dist/queue/task-executor.js.map +1 -0
- package/dist/tracing/span.d.ts +7 -14
- package/dist/tracing/span.d.ts.map +1 -1
- package/dist/tracing/span.js +5 -36
- package/dist/tracing/span.js.map +1 -1
- package/dist/tracing/tracer.d.ts +6 -7
- package/dist/tracing/tracer.d.ts.map +1 -1
- package/dist/tracing/tracer.js +27 -12
- package/dist/tracing/tracer.js.map +1 -1
- package/dist/transport/http/agent-instance-client.d.ts +23 -0
- package/dist/transport/http/agent-instance-client.d.ts.map +1 -0
- package/dist/transport/http/agent-instance-client.js +25 -0
- package/dist/transport/http/agent-instance-client.js.map +1 -0
- package/dist/transport/http/agent-span-client.d.ts +25 -0
- package/dist/transport/http/agent-span-client.d.ts.map +1 -0
- package/dist/transport/http/agent-span-client.js +37 -0
- package/dist/transport/http/agent-span-client.js.map +1 -0
- package/dist/transport/http/http-client.d.ts +43 -0
- package/dist/transport/http/http-client.d.ts.map +1 -0
- package/dist/transport/http/http-client.js +127 -0
- package/dist/transport/http/http-client.js.map +1 -0
- package/dist/transport/http/retry-policy.d.ts +4 -0
- package/dist/transport/http/retry-policy.d.ts.map +1 -0
- package/dist/transport/http/retry-policy.js +10 -0
- package/dist/transport/http/retry-policy.js.map +1 -0
- package/dist/transport/http.d.ts +31 -50
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +138 -227
- package/dist/transport/http.js.map +1 -1
- package/dist/utils/logging.d.ts.map +1 -1
- package/dist/utils/logging.js +7 -1
- package/dist/utils/logging.js.map +1 -1
- package/package.json +1 -1
- package/dist/agent/schema-registry.d.ts +0 -9
- package/dist/agent/schema-registry.d.ts.map +0 -1
- package/dist/agent/schema-registry.js +0 -16
- package/dist/agent/schema-registry.js.map +0 -1
- package/dist/queue/in-memory.d.ts +0 -9
- package/dist/queue/in-memory.d.ts.map +0 -1
- package/dist/queue/in-memory.js +0 -18
- package/dist/queue/in-memory.js.map +0 -1
- package/dist/transport/base.d.ts +0 -18
- package/dist/transport/base.d.ts.map +0 -1
- package/dist/transport/base.js +0 -2
- package/dist/transport/base.js.map +0 -1
- package/dist/transport/stdio.d.ts +0 -36
- package/dist/transport/stdio.d.ts.map +0 -1
- package/dist/transport/stdio.js +0 -56
- package/dist/transport/stdio.js.map +0 -1
- package/dist/transport/worker.d.ts +0 -22
- package/dist/transport/worker.d.ts.map +0 -1
- package/dist/transport/worker.js +0 -85
- package/dist/transport/worker.js.map +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const DEFAULT_WORKER_COUNT = 1;
|
|
2
|
+
const DEFAULT_MAX_RETRIES = 0;
|
|
3
|
+
const DEFAULT_RETRY_DELAY_MS = 0;
|
|
4
|
+
export class TaskExecutor {
|
|
5
|
+
queue;
|
|
6
|
+
handler;
|
|
7
|
+
isRunning = false;
|
|
8
|
+
workerPromises = [];
|
|
9
|
+
workerCount;
|
|
10
|
+
maxRetries;
|
|
11
|
+
retryDelayMs;
|
|
12
|
+
onError;
|
|
13
|
+
constructor(queue, handler, options = {}) {
|
|
14
|
+
this.queue = queue;
|
|
15
|
+
this.handler = handler;
|
|
16
|
+
this.workerCount = Math.max(options.workerCount ?? DEFAULT_WORKER_COUNT, 1);
|
|
17
|
+
this.maxRetries = Math.max(options.maxRetries ?? DEFAULT_MAX_RETRIES, 0);
|
|
18
|
+
this.retryDelayMs = Math.max(options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS, 0);
|
|
19
|
+
this.onError = options.onError;
|
|
20
|
+
}
|
|
21
|
+
start() {
|
|
22
|
+
if (this.isRunning) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this.isRunning = true;
|
|
26
|
+
this.workerPromises = Array.from({ length: this.workerCount }, () => this.runWorker());
|
|
27
|
+
}
|
|
28
|
+
async stop() {
|
|
29
|
+
if (!this.isRunning) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
this.isRunning = false;
|
|
33
|
+
this.queue.close();
|
|
34
|
+
await Promise.all(this.workerPromises);
|
|
35
|
+
this.workerPromises = [];
|
|
36
|
+
}
|
|
37
|
+
async runWorker() {
|
|
38
|
+
while (true) {
|
|
39
|
+
const result = await this.queue.get();
|
|
40
|
+
if (result.done) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
await this.executeWithRetry(result.item);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async executeWithRetry(item) {
|
|
47
|
+
let attempt = 0;
|
|
48
|
+
while (attempt <= this.maxRetries) {
|
|
49
|
+
try {
|
|
50
|
+
await this.handler(item);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (attempt >= this.maxRetries) {
|
|
55
|
+
await this.safeOnError(error, item);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (this.retryDelayMs > 0) {
|
|
59
|
+
await new Promise((resolve) => setTimeout(resolve, this.retryDelayMs));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
attempt += 1;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async safeOnError(error, item) {
|
|
66
|
+
if (!this.onError) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
await this.onError(error, item);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=task-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-executor.js","sourceRoot":"","sources":["../../src/queue/task-executor.ts"],"names":[],"mappings":"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"}
|
package/dist/tracing/span.d.ts
CHANGED
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Types of spans that can be traced
|
|
3
3
|
*/
|
|
4
|
-
export declare
|
|
5
|
-
AGENT
|
|
6
|
-
LLM
|
|
7
|
-
TOOL
|
|
8
|
-
CHAIN
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Default agent schema (v1.0.0) with span schemas for all supported types.
|
|
13
|
-
* Used when no custom schema is provided during registration.
|
|
14
|
-
*/
|
|
15
|
-
export declare const DEFAULT_AGENT_SCHEMA: Record<string, unknown>;
|
|
4
|
+
export declare const SpanType: {
|
|
5
|
+
readonly AGENT: "agent";
|
|
6
|
+
readonly LLM: "llm";
|
|
7
|
+
readonly TOOL: "tool";
|
|
8
|
+
readonly CHAIN: "chain";
|
|
9
|
+
};
|
|
10
|
+
export type SpanType = (typeof SpanType)[keyof typeof SpanType] | string;
|
|
16
11
|
/**
|
|
17
12
|
* Status of a span
|
|
18
13
|
*/
|
|
@@ -67,7 +62,5 @@ export interface Span {
|
|
|
67
62
|
error: ErrorInfo | null;
|
|
68
63
|
/** Additional metadata about this span */
|
|
69
64
|
metadata: Record<string, unknown>;
|
|
70
|
-
/** Tags for categorizing and filtering spans */
|
|
71
|
-
tags: string[];
|
|
72
65
|
}
|
|
73
66
|
//# sourceMappingURL=span.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span.d.ts","sourceRoot":"","sources":["../../src/tracing/span.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"span.d.ts","sourceRoot":"","sources":["../../src/tracing/span.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;CAKX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,GAAG,MAAM,CAAC;AAEzE;;GAEG;AACH,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IAEf,4DAA4D;IAC5D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAEhB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IAEb,6CAA6C;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IAEnB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAElB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB,iCAAiC;IACjC,MAAM,EAAE,UAAU,CAAC;IAEnB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhC,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAExC,2DAA2D;IAC3D,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAE9B,kEAAkE;IAClE,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAExB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC"}
|
package/dist/tracing/span.js
CHANGED
|
@@ -1,42 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Types of spans that can be traced
|
|
3
3
|
*/
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
SpanType["CHAIN"] = "chain";
|
|
10
|
-
SpanType["RETRIEVER"] = "retriever";
|
|
11
|
-
})(SpanType || (SpanType = {}));
|
|
12
|
-
/**
|
|
13
|
-
* Default agent schema (v1.0.0) with span schemas for all supported types.
|
|
14
|
-
* Used when no custom schema is provided during registration.
|
|
15
|
-
*/
|
|
16
|
-
export const DEFAULT_AGENT_SCHEMA = {
|
|
17
|
-
external_identifier: '1.0.0',
|
|
18
|
-
span_schemas: {
|
|
19
|
-
agent: {
|
|
20
|
-
type: 'object',
|
|
21
|
-
properties: { type: { type: 'string', const: 'agent' } },
|
|
22
|
-
},
|
|
23
|
-
llm: {
|
|
24
|
-
type: 'object',
|
|
25
|
-
properties: { type: { type: 'string', const: 'llm' } },
|
|
26
|
-
},
|
|
27
|
-
tool: {
|
|
28
|
-
type: 'object',
|
|
29
|
-
properties: { type: { type: 'string', const: 'tool' } },
|
|
30
|
-
},
|
|
31
|
-
chain: {
|
|
32
|
-
type: 'object',
|
|
33
|
-
properties: { type: { type: 'string', const: 'chain' } },
|
|
34
|
-
},
|
|
35
|
-
retriever: {
|
|
36
|
-
type: 'object',
|
|
37
|
-
properties: { type: { type: 'string', const: 'retriever' } },
|
|
38
|
-
},
|
|
39
|
-
},
|
|
4
|
+
export const SpanType = {
|
|
5
|
+
AGENT: 'agent',
|
|
6
|
+
LLM: 'llm',
|
|
7
|
+
TOOL: 'tool',
|
|
8
|
+
CHAIN: 'chain',
|
|
40
9
|
};
|
|
41
10
|
/**
|
|
42
11
|
* Status of a span
|
package/dist/tracing/span.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span.js","sourceRoot":"","sources":["../../src/tracing/span.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"span.js","sourceRoot":"","sources":["../../src/tracing/span.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACN,CAAC;AAIX;;GAEG;AACH,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;IACnB,6BAAe,CAAA;AACjB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB"}
|
package/dist/tracing/tracer.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { type Partition } from '@prefactor/pfid';
|
|
2
|
-
import type {
|
|
3
|
-
import type { Queue } from '../queue/base.js';
|
|
2
|
+
import type { Transport } from '../transport/http.js';
|
|
4
3
|
import type { Span, TokenUsage } from './span.js';
|
|
5
4
|
import { SpanType } from './span.js';
|
|
6
5
|
/**
|
|
@@ -15,8 +14,6 @@ export interface StartSpanOptions {
|
|
|
15
14
|
inputs: Record<string, unknown>;
|
|
16
15
|
/** Additional metadata (optional) */
|
|
17
16
|
metadata?: Record<string, unknown>;
|
|
18
|
-
/** Tags for categorizing the span (optional) */
|
|
19
|
-
tags?: string[];
|
|
20
17
|
}
|
|
21
18
|
/**
|
|
22
19
|
* Options for ending a span
|
|
@@ -57,15 +54,15 @@ export interface EndSpanOptions {
|
|
|
57
54
|
* ```
|
|
58
55
|
*/
|
|
59
56
|
export declare class Tracer {
|
|
60
|
-
private
|
|
57
|
+
private transport;
|
|
61
58
|
private partition;
|
|
62
59
|
/**
|
|
63
60
|
* Initialize the tracer.
|
|
64
61
|
*
|
|
65
|
-
* @param
|
|
62
|
+
* @param transport - The transport to use for emitting spans
|
|
66
63
|
* @param partition - The partition for ID generation. If not provided, a random partition will be generated.
|
|
67
64
|
*/
|
|
68
|
-
constructor(
|
|
65
|
+
constructor(transport: Transport, partition?: Partition);
|
|
69
66
|
/**
|
|
70
67
|
* Start a new span
|
|
71
68
|
*
|
|
@@ -86,5 +83,7 @@ export declare class Tracer {
|
|
|
86
83
|
* @returns Promise that resolves when the tracer is closed
|
|
87
84
|
*/
|
|
88
85
|
close(): Promise<void>;
|
|
86
|
+
startAgentInstance(): void;
|
|
87
|
+
finishAgentInstance(): void;
|
|
89
88
|
}
|
|
90
89
|
//# sourceMappingURL=tracer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracing/tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracing/tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAc,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IAEb,6CAA6C;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IAEnB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhC,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC,mCAAmC;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,8CAA8C;IAC9C,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,MAAM;IAUf,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,SAAS,CAAY;IAE7B;;;;;OAKG;gBAEO,SAAS,EAAE,SAAS,EAC5B,SAAS,CAAC,EAAE,SAAS;IAKvB;;;;;OAKG;IACH,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAkC1C;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI;IA8BnD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,kBAAkB,IAAI,IAAI;IAQ1B,mBAAmB,IAAI,IAAI;CAO5B"}
|
package/dist/tracing/tracer.js
CHANGED
|
@@ -29,16 +29,16 @@ import { SpanStatus, SpanType } from './span.js';
|
|
|
29
29
|
* ```
|
|
30
30
|
*/
|
|
31
31
|
export class Tracer {
|
|
32
|
-
|
|
32
|
+
transport;
|
|
33
33
|
partition;
|
|
34
34
|
/**
|
|
35
35
|
* Initialize the tracer.
|
|
36
36
|
*
|
|
37
|
-
* @param
|
|
37
|
+
* @param transport - The transport to use for emitting spans
|
|
38
38
|
* @param partition - The partition for ID generation. If not provided, a random partition will be generated.
|
|
39
39
|
*/
|
|
40
|
-
constructor(
|
|
41
|
-
this.
|
|
40
|
+
constructor(transport, partition) {
|
|
41
|
+
this.transport = transport;
|
|
42
42
|
this.partition = partition ?? generatePartition();
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
@@ -65,16 +65,15 @@ export class Tracer {
|
|
|
65
65
|
tokenUsage: null,
|
|
66
66
|
error: null,
|
|
67
67
|
metadata: options.metadata ?? {},
|
|
68
|
-
tags: options.tags ?? [],
|
|
69
68
|
};
|
|
70
69
|
// AGENT spans are emitted immediately for real-time tracking
|
|
71
70
|
// They will be finished later with finishSpan()
|
|
72
71
|
if (options.spanType === SpanType.AGENT) {
|
|
73
72
|
try {
|
|
74
|
-
this.
|
|
73
|
+
this.transport.emit(span);
|
|
75
74
|
}
|
|
76
75
|
catch (error) {
|
|
77
|
-
console.error('Failed to
|
|
76
|
+
console.error('Failed to emit agent span:', error);
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
return span;
|
|
@@ -105,14 +104,14 @@ export class Tracer {
|
|
|
105
104
|
// AGENT spans use finishSpan API (they were already emitted on start)
|
|
106
105
|
// Other span types are emitted here
|
|
107
106
|
if (span.spanType === SpanType.AGENT) {
|
|
108
|
-
this.
|
|
107
|
+
this.transport.finishSpan(span.spanId, endTime);
|
|
109
108
|
}
|
|
110
109
|
else {
|
|
111
|
-
this.
|
|
110
|
+
this.transport.emit(span);
|
|
112
111
|
}
|
|
113
112
|
}
|
|
114
113
|
catch (error) {
|
|
115
|
-
console.error('Failed to
|
|
114
|
+
console.error('Failed to emit span action:', error);
|
|
116
115
|
}
|
|
117
116
|
}
|
|
118
117
|
/**
|
|
@@ -122,10 +121,26 @@ export class Tracer {
|
|
|
122
121
|
*/
|
|
123
122
|
async close() {
|
|
124
123
|
try {
|
|
125
|
-
await this.
|
|
124
|
+
await this.transport.close();
|
|
126
125
|
}
|
|
127
126
|
catch (error) {
|
|
128
|
-
console.error('Failed to
|
|
127
|
+
console.error('Failed to close transport:', error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
startAgentInstance() {
|
|
131
|
+
try {
|
|
132
|
+
this.transport.startAgentInstance();
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error('Failed to start agent instance:', error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
finishAgentInstance() {
|
|
139
|
+
try {
|
|
140
|
+
this.transport.finishAgentInstance();
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
console.error('Failed to finish agent instance:', error);
|
|
129
144
|
}
|
|
130
145
|
}
|
|
131
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../src/tracing/tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAkB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../src/tracing/tracer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { HttpRequester } from './http-client.js';
|
|
2
|
+
export type AgentInstanceRegisterPayload = {
|
|
3
|
+
agent_id?: string;
|
|
4
|
+
agent_version?: {
|
|
5
|
+
external_identifier: string;
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
};
|
|
9
|
+
agent_schema_version?: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
export type AgentInstanceResponse = {
|
|
12
|
+
details?: {
|
|
13
|
+
id?: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare class AgentInstanceClient {
|
|
17
|
+
private readonly httpClient;
|
|
18
|
+
constructor(httpClient: HttpRequester);
|
|
19
|
+
register(payload: AgentInstanceRegisterPayload): Promise<AgentInstanceResponse>;
|
|
20
|
+
start(agentInstanceId: string): Promise<void>;
|
|
21
|
+
finish(agentInstanceId: string): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=agent-instance-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-instance-client.d.ts","sourceRoot":"","sources":["../../../src/transport/http/agent-instance-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE;QACd,mBAAmB,EAAE,MAAM,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,CAAC,EAAE;QACR,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACH,CAAC;AAEF,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,aAAa;IAEtD,QAAQ,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAOzE,KAAK,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMrD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class AgentInstanceClient {
|
|
2
|
+
httpClient;
|
|
3
|
+
constructor(httpClient) {
|
|
4
|
+
this.httpClient = httpClient;
|
|
5
|
+
}
|
|
6
|
+
register(payload) {
|
|
7
|
+
return this.httpClient.request('/api/v1/agent_instance/register', {
|
|
8
|
+
method: 'POST',
|
|
9
|
+
body: payload,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
async start(agentInstanceId) {
|
|
13
|
+
await this.httpClient.request(`/api/v1/agent_instance/${agentInstanceId}/start`, {
|
|
14
|
+
method: 'POST',
|
|
15
|
+
body: {},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async finish(agentInstanceId) {
|
|
19
|
+
await this.httpClient.request(`/api/v1/agent_instance/${agentInstanceId}/finish`, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
body: {},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=agent-instance-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-instance-client.js","sourceRoot":"","sources":["../../../src/transport/http/agent-instance-client.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,UAAyB;QAAzB,eAAU,GAAV,UAAU,CAAe;IAAG,CAAC;IAE1D,QAAQ,CAAC,OAAqC;QAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,iCAAiC,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,eAAuB;QACjC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,0BAA0B,eAAe,QAAQ,EAAE;YAC/E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,eAAuB;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,0BAA0B,eAAe,SAAS,EAAE;YAChF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type HttpRequester } from './http-client.js';
|
|
2
|
+
export type AgentSpanStatus = 'active' | 'complete' | 'failed';
|
|
3
|
+
export type AgentSpanCreatePayload = {
|
|
4
|
+
details: {
|
|
5
|
+
agent_instance_id: string | null;
|
|
6
|
+
schema_name: string;
|
|
7
|
+
status: AgentSpanStatus;
|
|
8
|
+
payload: Record<string, unknown>;
|
|
9
|
+
parent_span_id: string | null;
|
|
10
|
+
started_at: string;
|
|
11
|
+
finished_at: string | null;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export type AgentSpanResponse = {
|
|
15
|
+
details?: {
|
|
16
|
+
id?: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export declare class AgentSpanClient {
|
|
20
|
+
private readonly httpClient;
|
|
21
|
+
constructor(httpClient: HttpRequester);
|
|
22
|
+
create(payload: AgentSpanCreatePayload): Promise<AgentSpanResponse>;
|
|
23
|
+
finish(spanId: string, timestamp: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=agent-span-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-span-client.d.ts","sourceRoot":"","sources":["../../../src/transport/http/agent-span-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/D,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE;QACP,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,eAAe,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE;QACR,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACH,CAAC;AAEF,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,aAAa;IAEtD,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAO7D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB/D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { HttpClientError } from './http-client.js';
|
|
2
|
+
export class AgentSpanClient {
|
|
3
|
+
httpClient;
|
|
4
|
+
constructor(httpClient) {
|
|
5
|
+
this.httpClient = httpClient;
|
|
6
|
+
}
|
|
7
|
+
create(payload) {
|
|
8
|
+
return this.httpClient.request('/api/v1/agent_spans', {
|
|
9
|
+
method: 'POST',
|
|
10
|
+
body: payload,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
async finish(spanId, timestamp) {
|
|
14
|
+
try {
|
|
15
|
+
await this.httpClient.request(`/api/v1/agent_spans/${spanId}/finish`, {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
body: { timestamp },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error instanceof HttpClientError &&
|
|
22
|
+
error.status === 409 &&
|
|
23
|
+
isAlreadyFinishedError(error.responseBody)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function isAlreadyFinishedError(responseBody) {
|
|
31
|
+
if (!responseBody || typeof responseBody !== 'object') {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const payload = responseBody;
|
|
35
|
+
return payload.code === 'invalid_action';
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=agent-span-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-span-client.js","sourceRoot":"","sources":["../../../src/transport/http/agent-span-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAsB,MAAM,kBAAkB,CAAC;AAsBvE,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,UAAyB;QAAzB,eAAU,GAAV,UAAU,CAAe;IAAG,CAAC;IAE1D,MAAM,CAAC,OAA+B;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,SAAiB;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,uBAAuB,MAAM,SAAS,EAAE;gBACpE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAE,SAAS,EAAE;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,KAAK,YAAY,eAAe;gBAChC,KAAK,CAAC,MAAM,KAAK,GAAG;gBACpB,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,EAC1C,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,SAAS,sBAAsB,CAAC,YAAqB;IACnD,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,YAAuC,CAAC;IACxD,OAAO,OAAO,CAAC,IAAI,KAAK,gBAAgB,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { HttpTransportConfig } from '../../config.js';
|
|
2
|
+
export type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
export type HttpClientDependencies = {
|
|
4
|
+
fetchFn?: FetchLike;
|
|
5
|
+
sleep?: (delayMs: number) => Promise<void>;
|
|
6
|
+
random?: () => number;
|
|
7
|
+
};
|
|
8
|
+
export type HttpRequestOptions = Omit<RequestInit, 'body' | 'headers' | 'signal'> & {
|
|
9
|
+
body?: unknown;
|
|
10
|
+
headers?: RequestInit['headers'];
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
};
|
|
13
|
+
export interface HttpRequester {
|
|
14
|
+
request<TResponse = unknown>(path: string, options?: HttpRequestOptions): Promise<TResponse>;
|
|
15
|
+
}
|
|
16
|
+
type HttpClientErrorOptions = {
|
|
17
|
+
url: string;
|
|
18
|
+
method: string;
|
|
19
|
+
status?: number;
|
|
20
|
+
statusText?: string;
|
|
21
|
+
responseBody?: unknown;
|
|
22
|
+
retryable: boolean;
|
|
23
|
+
cause?: unknown;
|
|
24
|
+
};
|
|
25
|
+
export declare class HttpClientError extends Error {
|
|
26
|
+
readonly url: string;
|
|
27
|
+
readonly method: string;
|
|
28
|
+
readonly status?: number;
|
|
29
|
+
readonly statusText?: string;
|
|
30
|
+
readonly responseBody?: unknown;
|
|
31
|
+
readonly retryable: boolean;
|
|
32
|
+
constructor(message: string, options: HttpClientErrorOptions);
|
|
33
|
+
}
|
|
34
|
+
export declare class HttpClient {
|
|
35
|
+
private readonly config;
|
|
36
|
+
private readonly fetchFn;
|
|
37
|
+
private readonly sleep;
|
|
38
|
+
private readonly random;
|
|
39
|
+
constructor(config: HttpTransportConfig, dependencies?: HttpClientDependencies);
|
|
40
|
+
request<TResponse = unknown>(path: string, options?: HttpRequestOptions): Promise<TResponse>;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/transport/http/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjG,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC,GAAG;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAC9F;AAED,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB;CAU7D;AAED,qBAAa,UAAU;IAMnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAGnB,MAAM,EAAE,mBAAmB,EAC5C,YAAY,GAAE,sBAA2B;IAQrC,OAAO,CAAC,SAAS,GAAG,OAAO,EAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,SAAS,CAAC;CAoEtB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { calculateRetryDelay, shouldRetryStatusCode } from './retry-policy.js';
|
|
2
|
+
export class HttpClientError extends Error {
|
|
3
|
+
url;
|
|
4
|
+
method;
|
|
5
|
+
status;
|
|
6
|
+
statusText;
|
|
7
|
+
responseBody;
|
|
8
|
+
retryable;
|
|
9
|
+
constructor(message, options) {
|
|
10
|
+
super(message, { cause: options.cause });
|
|
11
|
+
this.name = 'HttpClientError';
|
|
12
|
+
this.url = options.url;
|
|
13
|
+
this.method = options.method;
|
|
14
|
+
this.status = options.status;
|
|
15
|
+
this.statusText = options.statusText;
|
|
16
|
+
this.responseBody = options.responseBody;
|
|
17
|
+
this.retryable = options.retryable;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class HttpClient {
|
|
21
|
+
config;
|
|
22
|
+
fetchFn;
|
|
23
|
+
sleep;
|
|
24
|
+
random;
|
|
25
|
+
constructor(config, dependencies = {}) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.fetchFn = dependencies.fetchFn ?? fetch;
|
|
28
|
+
this.sleep =
|
|
29
|
+
dependencies.sleep ?? ((delayMs) => new Promise((resolve) => setTimeout(resolve, delayMs)));
|
|
30
|
+
this.random = dependencies.random ?? Math.random;
|
|
31
|
+
}
|
|
32
|
+
async request(path, options = {}) {
|
|
33
|
+
const url = new URL(path, this.config.apiUrl).toString();
|
|
34
|
+
const method = options.method ?? 'GET';
|
|
35
|
+
let attempt = 0;
|
|
36
|
+
while (true) {
|
|
37
|
+
const headers = new Headers(options.headers);
|
|
38
|
+
headers.set('Authorization', `Bearer ${this.config.apiToken}`);
|
|
39
|
+
if (options.body !== undefined && !headers.has('Content-Type')) {
|
|
40
|
+
headers.set('Content-Type', 'application/json');
|
|
41
|
+
}
|
|
42
|
+
const requestInit = {
|
|
43
|
+
...options,
|
|
44
|
+
method,
|
|
45
|
+
headers,
|
|
46
|
+
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
|
47
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? this.config.requestTimeout),
|
|
48
|
+
};
|
|
49
|
+
try {
|
|
50
|
+
const response = await this.fetchFn(url, requestInit);
|
|
51
|
+
if (response.ok) {
|
|
52
|
+
return (await parseResponseBody(response));
|
|
53
|
+
}
|
|
54
|
+
const responseBody = await parseResponseBody(response);
|
|
55
|
+
const canRetry = attempt < this.config.maxRetries &&
|
|
56
|
+
shouldRetryStatusCode(response.status, this.config.retryOnStatusCodes);
|
|
57
|
+
if (canRetry) {
|
|
58
|
+
const delayMs = calculateRetryDelay(attempt, this.config, this.random);
|
|
59
|
+
await this.sleep(delayMs);
|
|
60
|
+
attempt += 1;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
throw new HttpClientError(`HTTP request failed with status ${response.status}`, {
|
|
64
|
+
url,
|
|
65
|
+
method,
|
|
66
|
+
status: response.status,
|
|
67
|
+
statusText: response.statusText,
|
|
68
|
+
responseBody,
|
|
69
|
+
retryable: shouldRetryStatusCode(response.status, this.config.retryOnStatusCodes),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error instanceof HttpClientError) {
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
const canRetry = attempt < this.config.maxRetries && isRetryableNetworkError(error);
|
|
77
|
+
if (canRetry) {
|
|
78
|
+
const delayMs = calculateRetryDelay(attempt, this.config, this.random);
|
|
79
|
+
await this.sleep(delayMs);
|
|
80
|
+
attempt += 1;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
throw new HttpClientError('HTTP request failed due to network error', {
|
|
84
|
+
url,
|
|
85
|
+
method,
|
|
86
|
+
retryable: false,
|
|
87
|
+
cause: error,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function isRetryableNetworkError(error) {
|
|
94
|
+
if (error instanceof TypeError) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
if (error instanceof DOMException &&
|
|
98
|
+
(error.name === 'AbortError' || error.name === 'TimeoutError')) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
if (error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
async function parseResponseBody(response) {
|
|
107
|
+
const bodyText = await response.text();
|
|
108
|
+
if (!bodyText) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
112
|
+
if (contentType.includes('application/json')) {
|
|
113
|
+
try {
|
|
114
|
+
return JSON.parse(bodyText);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return bodyText;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
return JSON.parse(bodyText);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return bodyText;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=http-client.js.map
|