@xeonr/upload-pool-sdk 1.2.0 → 1.3.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/dist/pool.d.ts +22 -0
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +45 -1
- package/dist/pool.js.map +1 -1
- package/package.json +1 -1
- package/src/pool.ts +45 -1
package/dist/pool.d.ts
CHANGED
|
@@ -7,7 +7,29 @@ export declare class Pool {
|
|
|
7
7
|
private inFlight;
|
|
8
8
|
private readonly workerId;
|
|
9
9
|
private readonly capabilities;
|
|
10
|
+
private runningPromise;
|
|
11
|
+
private runningResolve;
|
|
12
|
+
private keepAliveInterval;
|
|
10
13
|
constructor(config: PoolConfig);
|
|
14
|
+
/**
|
|
15
|
+
* Start the pool and keep the worker process alive until `stop()` is
|
|
16
|
+
* called.
|
|
17
|
+
*
|
|
18
|
+
* We deliberately return a never-resolving promise (resolved only by
|
|
19
|
+
* stop()) for two reasons:
|
|
20
|
+
*
|
|
21
|
+
* 1. ESM top-level `await pool.start()` is the documented worker
|
|
22
|
+
* entrypoint. If start() resolved as soon as the SSE client was
|
|
23
|
+
* kicked off, the script would end and Node would exit — the
|
|
24
|
+
* EventSource's underlying fetch socket isn't enough to hold the
|
|
25
|
+
* event loop open by itself in Node 20+ (undici unrefs idle
|
|
26
|
+
* connections under some conditions).
|
|
27
|
+
* 2. A keep-alive interval lives next to the unresolved promise so
|
|
28
|
+
* even if every socket is unrefed, the loop stays open.
|
|
29
|
+
*
|
|
30
|
+
* Callers that integrate the pool into a larger app (where some other
|
|
31
|
+
* piece holds the event loop) can ignore the returned promise.
|
|
32
|
+
*/
|
|
11
33
|
start(): Promise<void>;
|
|
12
34
|
stop(): Promise<void>;
|
|
13
35
|
private handleDispatch;
|
package/dist/pool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAGX,UAAU,EACV,MAAM,YAAY,CAAC;AAEpB,qBAAa,IAAI;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAGX,UAAU,EACV,MAAM,YAAY,CAAC;AAEpB,qBAAa,IAAI;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IACxC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,iBAAiB,CAA+B;gBAE5C,MAAM,EAAE,UAAU;IA6C9B;;;;;;;;;;;;;;;;;;OAkBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAcb,cAAc;IA2E5B,OAAO,CAAC,cAAc;YAIR,WAAW;CAwBzB"}
|
package/dist/pool.js
CHANGED
|
@@ -26,6 +26,9 @@ export class Pool {
|
|
|
26
26
|
inFlight = 0;
|
|
27
27
|
workerId;
|
|
28
28
|
capabilities;
|
|
29
|
+
runningPromise = null;
|
|
30
|
+
runningResolve = null;
|
|
31
|
+
keepAliveInterval = null;
|
|
29
32
|
constructor(config) {
|
|
30
33
|
this.config = {
|
|
31
34
|
concurrency: 1,
|
|
@@ -68,13 +71,54 @@ export class Pool {
|
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Start the pool and keep the worker process alive until `stop()` is
|
|
76
|
+
* called.
|
|
77
|
+
*
|
|
78
|
+
* We deliberately return a never-resolving promise (resolved only by
|
|
79
|
+
* stop()) for two reasons:
|
|
80
|
+
*
|
|
81
|
+
* 1. ESM top-level `await pool.start()` is the documented worker
|
|
82
|
+
* entrypoint. If start() resolved as soon as the SSE client was
|
|
83
|
+
* kicked off, the script would end and Node would exit — the
|
|
84
|
+
* EventSource's underlying fetch socket isn't enough to hold the
|
|
85
|
+
* event loop open by itself in Node 20+ (undici unrefs idle
|
|
86
|
+
* connections under some conditions).
|
|
87
|
+
* 2. A keep-alive interval lives next to the unresolved promise so
|
|
88
|
+
* even if every socket is unrefed, the loop stays open.
|
|
89
|
+
*
|
|
90
|
+
* Callers that integrate the pool into a larger app (where some other
|
|
91
|
+
* piece holds the event loop) can ignore the returned promise.
|
|
92
|
+
*/
|
|
71
93
|
async start() {
|
|
94
|
+
if (this.runningPromise) {
|
|
95
|
+
this.logger.warn("sdk.start.already_running");
|
|
96
|
+
return this.runningPromise;
|
|
97
|
+
}
|
|
72
98
|
this.logger.info("sdk.start");
|
|
73
99
|
this.sse.start();
|
|
100
|
+
this.runningPromise = new Promise((resolve) => {
|
|
101
|
+
this.runningResolve = resolve;
|
|
102
|
+
});
|
|
103
|
+
// 60s heartbeat — also doubles as a "still alive" telemetry tick
|
|
104
|
+
// for log-based dashboards.
|
|
105
|
+
this.keepAliveInterval = setInterval(() => {
|
|
106
|
+
this.logger.debug("sdk.heartbeat", { inFlight: this.inFlight });
|
|
107
|
+
}, 60_000);
|
|
108
|
+
return this.runningPromise;
|
|
74
109
|
}
|
|
75
110
|
async stop() {
|
|
76
111
|
this.logger.info("sdk.stop", { inFlight: this.inFlight });
|
|
77
112
|
this.sse.stop();
|
|
113
|
+
if (this.keepAliveInterval) {
|
|
114
|
+
clearInterval(this.keepAliveInterval);
|
|
115
|
+
this.keepAliveInterval = null;
|
|
116
|
+
}
|
|
117
|
+
if (this.runningResolve) {
|
|
118
|
+
this.runningResolve();
|
|
119
|
+
this.runningResolve = null;
|
|
120
|
+
}
|
|
121
|
+
this.runningPromise = null;
|
|
78
122
|
}
|
|
79
123
|
async handleDispatch(envelope) {
|
|
80
124
|
const jobLogger = this.logger.child({
|
|
@@ -159,5 +203,5 @@ export class Pool {
|
|
|
159
203
|
}
|
|
160
204
|
}
|
|
161
205
|
}
|
|
162
|
-
const SDK_VERSION = "1.
|
|
206
|
+
const SDK_VERSION = "1.3.0";
|
|
163
207
|
//# sourceMappingURL=pool.js.map
|
package/dist/pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACN,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACxB,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAmB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAoB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAOtD,MAAM,OAAO,IAAI;IACC,MAAM,CAAa;IACnB,GAAG,CAAa;IAChB,GAAG,CAAY;IACf,MAAM,CAAS;IACxB,QAAQ,GAAG,CAAC,CAAC;IACJ,QAAQ,CAAS;IACjB,YAAY,CAAW;
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACN,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACxB,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAmB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAoB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAOtD,MAAM,OAAO,IAAI;IACC,MAAM,CAAa;IACnB,GAAG,CAAa;IAChB,GAAG,CAAY;IACf,MAAM,CAAS;IACxB,QAAQ,GAAG,CAAC,CAAC;IACJ,QAAQ,CAAS;IACjB,YAAY,CAAW;IAChC,cAAc,GAAyB,IAAI,CAAC;IAC5C,cAAc,GAAwB,IAAI,CAAC;IAC3C,iBAAiB,GAA0B,IAAI,CAAC;IAExD,YAAY,MAAkB;QAC7B,IAAI,CAAC,MAAM,GAAG;YACb,WAAW,EAAE,CAAC;YACd,GAAG,MAAM;SACT,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,QAAQ,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC;YACvD,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,gBAAgB,CAAC;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,MAAM,EAAE,IAAI,CAAC,MAAM;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC;YACxB,QAAQ,EAAE,MAAM,CAAC,gBAAgB;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC/C,WAAW,EAAE,GAAG,EAAE;gBACjB,qEAAqE;YACtE,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACpB,8BAA8B;YAC/B,CAAC;YACD,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAsB,CAAC;SACvE,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE;YAC5B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,OAAO,EAAE,WAAW;SACpB,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBACxC,IAAI,EAAE,2DAA2D;aACjE,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,KAAK;QACV,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,cAAc,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,iEAAiE;QACjE,4BAA4B;QAC5B,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,OAAO,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI;QACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACtC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAqB;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACnC,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG;SACpC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC;YACrD,gEAAgE;YAChE,0DAA0D;YAC1D,0DAA0D;YAC1D,SAAS,CAAC,IAAI,CAAC,oCAAoC,EAAE;gBACpD,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;aACpC,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAChC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACJ,oDAAoD;YACpD,MAAM,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,CACxC,MAAM,CAAC,sBAAsB,EAAE;gBAC9B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;aAC7B,CAAC,CACF,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE;oBAC/B,iBAAiB,EAAE,IAAI,CAAC,YAAY;iBACpC,CAAC,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CACrB,QAAQ,CAAC,KAAK,EACd,GAAG,EACH,SAAS,EACT,IAAI,iBAAiB,CAAC,sBAAsB,QAAQ,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAC9E,CAAC;gBACF,OAAO;YACR,CAAC;YAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YAEnB,MAAM,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAC1C,MAAM,CAAC,wBAAwB,EAAE;gBAChC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;aAC7B,CAAC,CACF,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE;gBAC/B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aAClC,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE;gBAC7B,GAAG;gBACH,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aAClC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAY,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjB,CAAC;IACF,CAAC;IAEO,cAAc,CAAC,GAAW;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IAC7D,CAAC;IAEO,KAAK,CAAC,WAAW,CACxB,KAAa,EACb,GAAe,EACf,SAAiB,EACjB,GAAU;QAEV,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,YAAY,iBAAiB,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAC1C,MAAM,CAAC,wBAAwB,EAAE;gBAChC,KAAK;gBACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBAC7B,KAAK,EAAE,GAAG,CAAC,OAAO;gBAClB,KAAK;aACL,CAAC,CACF,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YACjB,SAAS,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,MAAe,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC;CACD;AAED,MAAM,WAAW,GAAG,OAAO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xeonr/upload-pool-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Self-hosted worker SDK for the upl.im content type pipeline. Implement a handler per content type URN; the SDK handles SSE connection, job acceptance, presigned thumbnail upload, and metadata callbacks.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
package/src/pool.ts
CHANGED
|
@@ -36,6 +36,9 @@ export class Pool {
|
|
|
36
36
|
private inFlight = 0;
|
|
37
37
|
private readonly workerId: string;
|
|
38
38
|
private readonly capabilities: string[];
|
|
39
|
+
private runningPromise: Promise<void> | null = null;
|
|
40
|
+
private runningResolve: (() => void) | null = null;
|
|
41
|
+
private keepAliveInterval: NodeJS.Timeout | null = null;
|
|
39
42
|
|
|
40
43
|
constructor(config: PoolConfig) {
|
|
41
44
|
this.config = {
|
|
@@ -82,14 +85,55 @@ export class Pool {
|
|
|
82
85
|
}
|
|
83
86
|
}
|
|
84
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Start the pool and keep the worker process alive until `stop()` is
|
|
90
|
+
* called.
|
|
91
|
+
*
|
|
92
|
+
* We deliberately return a never-resolving promise (resolved only by
|
|
93
|
+
* stop()) for two reasons:
|
|
94
|
+
*
|
|
95
|
+
* 1. ESM top-level `await pool.start()` is the documented worker
|
|
96
|
+
* entrypoint. If start() resolved as soon as the SSE client was
|
|
97
|
+
* kicked off, the script would end and Node would exit — the
|
|
98
|
+
* EventSource's underlying fetch socket isn't enough to hold the
|
|
99
|
+
* event loop open by itself in Node 20+ (undici unrefs idle
|
|
100
|
+
* connections under some conditions).
|
|
101
|
+
* 2. A keep-alive interval lives next to the unresolved promise so
|
|
102
|
+
* even if every socket is unrefed, the loop stays open.
|
|
103
|
+
*
|
|
104
|
+
* Callers that integrate the pool into a larger app (where some other
|
|
105
|
+
* piece holds the event loop) can ignore the returned promise.
|
|
106
|
+
*/
|
|
85
107
|
async start(): Promise<void> {
|
|
108
|
+
if (this.runningPromise) {
|
|
109
|
+
this.logger.warn("sdk.start.already_running");
|
|
110
|
+
return this.runningPromise;
|
|
111
|
+
}
|
|
86
112
|
this.logger.info("sdk.start");
|
|
87
113
|
this.sse.start();
|
|
114
|
+
this.runningPromise = new Promise<void>((resolve) => {
|
|
115
|
+
this.runningResolve = resolve;
|
|
116
|
+
});
|
|
117
|
+
// 60s heartbeat — also doubles as a "still alive" telemetry tick
|
|
118
|
+
// for log-based dashboards.
|
|
119
|
+
this.keepAliveInterval = setInterval(() => {
|
|
120
|
+
this.logger.debug("sdk.heartbeat", { inFlight: this.inFlight });
|
|
121
|
+
}, 60_000);
|
|
122
|
+
return this.runningPromise;
|
|
88
123
|
}
|
|
89
124
|
|
|
90
125
|
async stop(): Promise<void> {
|
|
91
126
|
this.logger.info("sdk.stop", { inFlight: this.inFlight });
|
|
92
127
|
this.sse.stop();
|
|
128
|
+
if (this.keepAliveInterval) {
|
|
129
|
+
clearInterval(this.keepAliveInterval);
|
|
130
|
+
this.keepAliveInterval = null;
|
|
131
|
+
}
|
|
132
|
+
if (this.runningResolve) {
|
|
133
|
+
this.runningResolve();
|
|
134
|
+
this.runningResolve = null;
|
|
135
|
+
}
|
|
136
|
+
this.runningPromise = null;
|
|
93
137
|
}
|
|
94
138
|
|
|
95
139
|
private async handleDispatch(envelope: JobEnvelope): Promise<void> {
|
|
@@ -197,4 +241,4 @@ export class Pool {
|
|
|
197
241
|
}
|
|
198
242
|
}
|
|
199
243
|
|
|
200
|
-
const SDK_VERSION = "1.
|
|
244
|
+
const SDK_VERSION = "1.3.0";
|