@prefactor/core 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -2
- package/dist/agent/instance-manager.d.ts +19 -0
- package/dist/agent/instance-manager.d.ts.map +1 -0
- package/dist/agent/instance-manager.js +71 -0
- package/dist/agent/instance-manager.js.map +1 -0
- package/dist/agent/schema-registry.d.ts +9 -0
- package/dist/agent/schema-registry.d.ts.map +1 -0
- package/dist/agent/schema-registry.js +16 -0
- package/dist/agent/schema-registry.js.map +1 -0
- package/dist/config.d.ts +49 -25
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -7
- package/dist/config.js.map +1 -1
- package/dist/create-core.d.ts +12 -0
- package/dist/create-core.d.ts.map +1 -0
- package/dist/create-core.js +49 -0
- package/dist/create-core.js.map +1 -0
- package/dist/index.cjs +390 -134
- package/dist/index.cjs.map +14 -9
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +391 -135
- package/dist/index.js.map +14 -9
- package/dist/queue/actions.d.ts +35 -0
- package/dist/queue/actions.d.ts.map +1 -0
- package/dist/queue/actions.js +2 -0
- package/dist/queue/actions.js.map +1 -0
- package/dist/queue/base.d.ts +7 -0
- package/dist/queue/base.d.ts.map +1 -0
- package/dist/queue/base.js +2 -0
- package/dist/queue/base.js.map +1 -0
- package/dist/queue/in-memory.d.ts +9 -0
- package/dist/queue/in-memory.d.ts.map +1 -0
- package/dist/queue/in-memory.js +18 -0
- package/dist/queue/in-memory.js.map +1 -0
- package/dist/tracing/context.d.ts +12 -0
- package/dist/tracing/context.d.ts.map +1 -1
- package/dist/tracing/context.js +41 -5
- package/dist/tracing/context.js.map +1 -1
- package/dist/tracing/span.d.ts +5 -0
- package/dist/tracing/span.d.ts.map +1 -1
- package/dist/tracing/span.js +29 -0
- package/dist/tracing/span.js.map +1 -1
- package/dist/tracing/tracer.d.ts +7 -17
- package/dist/tracing/tracer.d.ts.map +1 -1
- package/dist/tracing/tracer.js +20 -39
- package/dist/tracing/tracer.js.map +1 -1
- package/dist/transport/base.d.ts +2 -22
- package/dist/transport/base.d.ts.map +1 -1
- package/dist/transport/http.d.ts +5 -28
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +76 -110
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/stdio.d.ts +4 -16
- package/dist/transport/stdio.d.ts.map +1 -1
- package/dist/transport/stdio.js +14 -29
- package/dist/transport/stdio.js.map +1 -1
- package/dist/transport/worker.d.ts +22 -0
- package/dist/transport/worker.d.ts.map +1 -0
- package/dist/transport/worker.js +85 -0
- package/dist/transport/worker.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { QueueAction } from '../queue/actions.js';
|
|
2
2
|
import type { Transport } from './base.js';
|
|
3
3
|
/**
|
|
4
4
|
* STDIO transport emits spans as newline-delimited JSON to stdout.
|
|
@@ -21,23 +21,11 @@ export declare class StdioTransport implements Transport {
|
|
|
21
21
|
private closed;
|
|
22
22
|
private writeLock;
|
|
23
23
|
/**
|
|
24
|
-
* Emit a
|
|
24
|
+
* Emit a batch of queue actions to stdout as newline-delimited JSON
|
|
25
25
|
*
|
|
26
|
-
* @param
|
|
26
|
+
* @param items - The queue actions to emit
|
|
27
27
|
*/
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* No-op for stdio transport (not applicable)
|
|
31
|
-
*/
|
|
32
|
-
finishSpan(): void;
|
|
33
|
-
/**
|
|
34
|
-
* No-op for stdio transport (not applicable)
|
|
35
|
-
*/
|
|
36
|
-
startAgentInstance(): void;
|
|
37
|
-
/**
|
|
38
|
-
* No-op for stdio transport (not applicable)
|
|
39
|
-
*/
|
|
40
|
-
finishAgentInstance(): void;
|
|
28
|
+
processBatch(items: QueueAction[]): Promise<void>;
|
|
41
29
|
/**
|
|
42
30
|
* Close the transport and wait for pending writes to complete
|
|
43
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/transport/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/transport/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAqB;IAEtC;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBvD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
package/dist/transport/stdio.js
CHANGED
|
@@ -20,43 +20,28 @@ export class StdioTransport {
|
|
|
20
20
|
closed = false;
|
|
21
21
|
writeLock = Promise.resolve();
|
|
22
22
|
/**
|
|
23
|
-
* Emit a
|
|
23
|
+
* Emit a batch of queue actions to stdout as newline-delimited JSON
|
|
24
24
|
*
|
|
25
|
-
* @param
|
|
25
|
+
* @param items - The queue actions to emit
|
|
26
26
|
*/
|
|
27
|
-
|
|
28
|
-
if (this.closed) {
|
|
27
|
+
async processBatch(items) {
|
|
28
|
+
if (this.closed || items.length === 0) {
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
31
|
// Queue write to maintain ordering
|
|
32
32
|
this.writeLock = this.writeLock.then(async () => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
for (const item of items) {
|
|
34
|
+
try {
|
|
35
|
+
const serialized = serializeValue(item);
|
|
36
|
+
const json = JSON.stringify(serialized);
|
|
37
|
+
await Bun.write(Bun.stdout, `${json}\n`);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error('Failed to emit queue action to stdout:', error);
|
|
41
|
+
}
|
|
40
42
|
}
|
|
41
43
|
});
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* No-op for stdio transport (not applicable)
|
|
45
|
-
*/
|
|
46
|
-
finishSpan() {
|
|
47
|
-
// No-op for stdio transport
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* No-op for stdio transport (not applicable)
|
|
51
|
-
*/
|
|
52
|
-
startAgentInstance() {
|
|
53
|
-
// No-op for stdio transport
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* No-op for stdio transport (not applicable)
|
|
57
|
-
*/
|
|
58
|
-
finishAgentInstance() {
|
|
59
|
-
// No-op for stdio transport
|
|
44
|
+
await this.writeLock;
|
|
60
45
|
}
|
|
61
46
|
/**
|
|
62
47
|
* Close the transport and wait for pending writes to complete
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transport/stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,GAAG,KAAK,CAAC;IACf,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtC;;;;OAIG;IACH,
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transport/stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,GAAG,KAAK,CAAC;IACf,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtC;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,KAAoB;QACrC,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;oBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;oBACxC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;gBAC3C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { QueueAction } from '../queue/actions.js';
|
|
2
|
+
import type { Queue } from '../queue/base.js';
|
|
3
|
+
import type { Transport } from './base.js';
|
|
4
|
+
type WorkerConfig = {
|
|
5
|
+
batchSize: number;
|
|
6
|
+
intervalMs: number;
|
|
7
|
+
};
|
|
8
|
+
export declare class TransportWorker {
|
|
9
|
+
private queue;
|
|
10
|
+
private transport;
|
|
11
|
+
private config;
|
|
12
|
+
private closed;
|
|
13
|
+
private inFlightPromise;
|
|
14
|
+
private loopPromise;
|
|
15
|
+
private pendingBatch;
|
|
16
|
+
constructor(queue: Queue<QueueAction>, transport: Transport, config: WorkerConfig);
|
|
17
|
+
private start;
|
|
18
|
+
flush(timeoutMs: number): Promise<void>;
|
|
19
|
+
close(timeoutMs?: number): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/transport/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,KAAK,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,qBAAa,eAAe;IAOxB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,YAAY,CAA8B;gBAGxC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,EACzB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,YAAY;YAKhB,KAAK;IAuBb,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvC,KAAK,CAAC,SAAS,SAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;CAmDpE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export class TransportWorker {
|
|
2
|
+
queue;
|
|
3
|
+
transport;
|
|
4
|
+
config;
|
|
5
|
+
closed = false;
|
|
6
|
+
inFlightPromise = null;
|
|
7
|
+
loopPromise;
|
|
8
|
+
pendingBatch = null;
|
|
9
|
+
constructor(queue, transport, config) {
|
|
10
|
+
this.queue = queue;
|
|
11
|
+
this.transport = transport;
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.loopPromise = this.start();
|
|
14
|
+
}
|
|
15
|
+
async start() {
|
|
16
|
+
while (!this.closed || this.pendingBatch || this.queue.size() > 0 || this.inFlightPromise) {
|
|
17
|
+
const batch = this.pendingBatch ?? this.queue.dequeueBatch(this.config.batchSize);
|
|
18
|
+
if (batch.length === 0) {
|
|
19
|
+
await new Promise((resolve) => setTimeout(resolve, this.config.intervalMs));
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const inFlight = this.transport.processBatch(batch);
|
|
24
|
+
this.inFlightPromise = inFlight;
|
|
25
|
+
await inFlight;
|
|
26
|
+
this.pendingBatch = null;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
this.pendingBatch = batch;
|
|
30
|
+
console.error('TransportWorker.processBatch failed', error);
|
|
31
|
+
await new Promise((resolve) => setTimeout(resolve, this.config.intervalMs));
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
this.inFlightPromise = null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async flush(timeoutMs) {
|
|
39
|
+
const start = Date.now();
|
|
40
|
+
while ((this.queue.size() > 0 || this.pendingBatch || this.inFlightPromise) &&
|
|
41
|
+
Date.now() - start < timeoutMs) {
|
|
42
|
+
await new Promise((resolve) => setTimeout(resolve, this.config.intervalMs));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async close(timeoutMs = this.config.intervalMs * 50) {
|
|
46
|
+
this.closed = true;
|
|
47
|
+
const deadline = Date.now() + timeoutMs;
|
|
48
|
+
const awaitWithTimeout = async (promise, label, timeoutMs, warnOnTimeout = true) => {
|
|
49
|
+
if (timeoutMs <= 0) {
|
|
50
|
+
if (warnOnTimeout) {
|
|
51
|
+
console.warn(`TransportWorker.close timed out waiting for ${label}`);
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
const resolvedPromise = Promise.resolve(promise);
|
|
56
|
+
let timeoutId = null;
|
|
57
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
58
|
+
timeoutId = setTimeout(() => resolve(false), timeoutMs);
|
|
59
|
+
});
|
|
60
|
+
const completed = await Promise.race([resolvedPromise.then(() => true), timeoutPromise]);
|
|
61
|
+
if (timeoutId) {
|
|
62
|
+
clearTimeout(timeoutId);
|
|
63
|
+
}
|
|
64
|
+
if (!completed && warnOnTimeout) {
|
|
65
|
+
console.warn(`TransportWorker.close timed out waiting for ${label}`);
|
|
66
|
+
}
|
|
67
|
+
return completed;
|
|
68
|
+
};
|
|
69
|
+
const remainingTime = () => Math.max(0, deadline - Date.now());
|
|
70
|
+
const loopCompleted = await awaitWithTimeout(this.loopPromise, 'loop to finish', remainingTime(), false);
|
|
71
|
+
if (!loopCompleted) {
|
|
72
|
+
console.warn('TransportWorker.close timed out waiting for loop to finish; closing transport now may cause potential data loss');
|
|
73
|
+
}
|
|
74
|
+
const safeTransportClose = async () => {
|
|
75
|
+
try {
|
|
76
|
+
await this.transport.close();
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error('TransportWorker.close failed', error);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
await awaitWithTimeout(safeTransportClose(), 'transport to close', remainingTime());
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/transport/worker.ts"],"names":[],"mappings":"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"}
|