@ironflow/node 0.1.0-test.2 → 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 +4 -4
- package/dist/client.d.ts +296 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +449 -0
- package/dist/client.js.map +1 -0
- package/dist/config-client.d.ts +43 -0
- package/dist/config-client.d.ts.map +1 -0
- package/dist/config-client.js +90 -0
- package/dist/config-client.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/context.d.ts +2 -2
- package/dist/internal/context.d.ts.map +1 -1
- package/dist/internal/context.js +9 -2
- package/dist/internal/context.js.map +1 -1
- package/dist/kv.d.ts +82 -0
- package/dist/kv.d.ts.map +1 -0
- package/dist/kv.js +212 -0
- package/dist/kv.js.map +1 -0
- package/dist/projection-runner.d.ts +36 -0
- package/dist/projection-runner.d.ts.map +1 -0
- package/dist/projection-runner.js +173 -0
- package/dist/projection-runner.js.map +1 -0
- package/dist/projection.d.ts +36 -0
- package/dist/projection.d.ts.map +1 -0
- package/dist/projection.js +55 -0
- package/dist/projection.js.map +1 -0
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +59 -13
- package/dist/serve.js.map +1 -1
- package/dist/types.d.ts +13 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/worker-streaming.js +2 -2
- package/dist/worker-streaming.js.map +1 -1
- package/dist/worker.d.ts +0 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +88 -11
- package/dist/worker.js.map +1 -1
- package/package.json +23 -10
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAA+B,MAAM,wBAAwB,CAAC;AAC7F,6EAA6E;AAC7E,8EAA8E;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAkHlD,gCAAgC;AAChC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,mBAAmB;AACnB,OAAO,EACL,aAAa,EACb,SAAS,EACT,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,sBAAsB;AACtB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,YAAY,EACZ,gBAAgB,GAGjB,MAAM,gBAAgB,CAAC;AAExB,sBAAsB;AACtB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,QAAQ,EACR,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,uCAAuC;AACvC,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,QAAQ,GACT,MAAM,gBAAgB,CAAC;AAExB,iBAAiB;AACjB,eAAe,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Manages step memoization and resume state during function execution.
|
|
5
5
|
*/
|
|
6
|
-
import type { IronflowEvent, Logger, RunInfo, PushRequest, CompletedStep, StepResult } from "@ironflow/core";
|
|
6
|
+
import type { IronflowEvent, Logger, RunInfo, PushRequest, CompletedStep, StepResult, EventDefinitionRegistry } from "@ironflow/core";
|
|
7
7
|
/**
|
|
8
8
|
* Execution context for a function invocation
|
|
9
9
|
*/
|
|
@@ -30,7 +30,7 @@ export declare class ExecutionContext {
|
|
|
30
30
|
private resumeContext?;
|
|
31
31
|
/** Whether we've processed the resume */
|
|
32
32
|
private resumeProcessed;
|
|
33
|
-
constructor(request: PushRequest, logger?: Logger);
|
|
33
|
+
constructor(request: PushRequest, logger?: Logger, eventDefinitions?: EventDefinitionRegistry);
|
|
34
34
|
/**
|
|
35
35
|
* Generate a unique step ID
|
|
36
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,MAAM,EACN,OAAO,EACP,WAAW,EACX,aAAa,EAEb,UAAU,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,MAAM,EACN,OAAO,EACP,WAAW,EACX,aAAa,EAEb,UAAU,EACV,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,iBAAiB;IACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,mDAAmD;IACnD,OAAO,CAAC,YAAY,CAAkC;IACtD,yDAAyD;IACzD,OAAO,CAAC,cAAc,CAAyC;IAC/D,wCAAwC;IACxC,OAAO,CAAC,aAAa,CAAoB;IACzC,4CAA4C;IAC5C,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,yCAAyC;IACzC,OAAO,CAAC,eAAe,CAAS;gBAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,uBAAuB;IA6C7F;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAMpC;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;IAK7E;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI3D;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKvC;;OAEG;IACH,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAQnD;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,OAAO;IASzE;;OAEG;IACH,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,SAAS;IAIjC;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAI3B;;OAEG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIlC;;OAEG;IACH,gBAAgB,IAAI,UAAU,EAAE;CAGjC;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,YAAY,CAAkC;IAEtD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;gBAEW,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM;IAKzD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAMpC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIvC,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAInD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,OAAO;IAIzE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,SAAS;IAIjC,mBAAmB,IAAI,IAAI;IAI3B,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIlC,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;CAI9E"}
|
package/dist/internal/context.js
CHANGED
|
@@ -29,15 +29,22 @@ export class ExecutionContext {
|
|
|
29
29
|
resumeContext;
|
|
30
30
|
/** Whether we've processed the resume */
|
|
31
31
|
resumeProcessed = false;
|
|
32
|
-
constructor(request, logger) {
|
|
32
|
+
constructor(request, logger, eventDefinitions) {
|
|
33
33
|
this.runId = request.run_id;
|
|
34
34
|
this.functionId = request.function_id;
|
|
35
35
|
this.attempt = request.attempt;
|
|
36
36
|
// Parse event
|
|
37
|
+
const eventVersion = request.event.version ?? 1;
|
|
38
|
+
let eventData = request.event.data;
|
|
39
|
+
// Apply upcasting if registry is provided
|
|
40
|
+
if (eventDefinitions) {
|
|
41
|
+
eventData = eventDefinitions.upcastEvent(request.event.name, eventData, eventVersion);
|
|
42
|
+
}
|
|
37
43
|
this.event = {
|
|
38
44
|
id: request.event.id,
|
|
39
45
|
name: request.event.name,
|
|
40
|
-
|
|
46
|
+
version: eventVersion,
|
|
47
|
+
data: eventData,
|
|
41
48
|
timestamp: new Date(request.event.timestamp),
|
|
42
49
|
idempotencyKey: request.event.idempotency_key,
|
|
43
50
|
source: request.event.source,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/internal/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC3B,iBAAiB;IACR,KAAK,CAAS;IACvB,sBAAsB;IACb,UAAU,CAAS;IAC5B,6BAA6B;IACpB,OAAO,CAAS;IACzB,2BAA2B;IAClB,KAAK,CAAgB;IAC9B,sBAAsB;IACb,OAAO,CAAU;IAC1B,sBAAsB;IACb,MAAM,CAAS;IAExB,mDAAmD;IAC3C,YAAY,GAAwB,IAAI,GAAG,EAAE,CAAC;IACtD,yDAAyD;IACjD,cAAc,GAA+B,IAAI,GAAG,EAAE,CAAC;IAC/D,wCAAwC;IAChC,aAAa,GAAiB,EAAE,CAAC;IACzC,4CAA4C;IACpC,aAAa,CAAiB;IACtC,yCAAyC;IACjC,eAAe,GAAG,KAAK,CAAC;IAEhC,YAAY,OAAoB,EAAE,MAAe,EAAE,gBAA0C;QAC3F,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAE/B,cAAc;QACd,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAChD,IAAI,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAEnC,0CAA0C;QAC1C,IAAI,gBAAgB,EAAE,CAAC;YACrB,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,CAAC,KAAK,GAAG;YACX,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;YACpB,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI;YACxB,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe;YAC7C,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YAC5B,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;SACjC,CAAC;QAEF,iBAAiB;QACjB,IAAI,CAAC,OAAO,GAAG;YACb,EAAE,EAAE,IAAI,CAAC,KAAK;YACd,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QAEF,wCAAwC;QACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;QAEpC,wCAAwC;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAY;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACvC,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,YAAoB,EAAE,WAAmB;QAC3D,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;QACnE,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAc;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,SAAS,EAAE,MAAM,KAAK,WAAW,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAI,MAAc;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,SAAS,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;YACtC,OAAO,SAAS,CAAC,MAAW,CAAC;QAC/B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAc,EAAE,IAAgC;QAC7D,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CACL,IAAI,CAAC,aAAa,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,IAAI,CAC1E,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,aAAa,EAAE,IAAqB,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAgB;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IACP,MAAM,CAAmB;IACzB,WAAW,CAAS;IAC7B,YAAY,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEtD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,YAAY,MAAwB,EAAE,WAAmB;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACvC,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,iBAAiB,CAAI,MAAc;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAI,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,cAAc,CAAC,MAAc,EAAE,IAAgC;QAC7D,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAK,CAAC;IACxC,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,IAAgB;QACzB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,mBAAmB,CAAC,YAAoB,EAAE,WAAmB;QAC3D,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;QAC1E,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;CACF;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,aAAa,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAE/C,OAAO;QACL,KAAK,CAAC,OAAe,EAAE,IAA8B;YACnD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAClC,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAe,EAAE,IAA8B;YAClD,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,OAAe,EAAE,IAA8B;YAClD,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,OAAe,EAAE,IAA8B;YACnD,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/kv.d.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ironflow Node.js KV Client
|
|
3
|
+
*
|
|
4
|
+
* Key-Value store operations for the Ironflow server.
|
|
5
|
+
*/
|
|
6
|
+
import type { KVBucketConfig, KVBucketInfo, KVEntry, KVPutResult } from "@ironflow/core";
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for the KV client (inherited from parent client).
|
|
9
|
+
*/
|
|
10
|
+
export interface KVClientConfig {
|
|
11
|
+
serverUrl: string;
|
|
12
|
+
apiKey?: string;
|
|
13
|
+
timeout: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* KV bucket handle for key-level operations.
|
|
17
|
+
*/
|
|
18
|
+
export declare class KVBucketHandle {
|
|
19
|
+
private readonly bucketName;
|
|
20
|
+
private readonly config;
|
|
21
|
+
constructor(bucketName: string, config: KVClientConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Get a value by key.
|
|
24
|
+
*/
|
|
25
|
+
get(key: string): Promise<KVEntry>;
|
|
26
|
+
/**
|
|
27
|
+
* Put a value unconditionally.
|
|
28
|
+
*/
|
|
29
|
+
put(key: string, value: unknown): Promise<KVPutResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Create a value only if the key doesn't exist (if-not-exists).
|
|
32
|
+
* Throws on conflict (HTTP 412).
|
|
33
|
+
*/
|
|
34
|
+
create(key: string, value: unknown): Promise<KVPutResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Update a value only if the revision matches (compare-and-swap).
|
|
37
|
+
* Throws on mismatch (HTTP 412).
|
|
38
|
+
*/
|
|
39
|
+
update(key: string, value: unknown, revision: number): Promise<KVPutResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Delete a key (soft delete / tombstone).
|
|
42
|
+
*/
|
|
43
|
+
delete(key: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Purge a key and all its history.
|
|
46
|
+
*/
|
|
47
|
+
purge(key: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* List keys with an optional wildcard filter.
|
|
50
|
+
*/
|
|
51
|
+
listKeys(filter?: string): Promise<string[]>;
|
|
52
|
+
private restRequest;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* KV client for bucket management and key operations.
|
|
56
|
+
*/
|
|
57
|
+
export declare class KVClient {
|
|
58
|
+
private readonly config;
|
|
59
|
+
constructor(config: KVClientConfig);
|
|
60
|
+
/**
|
|
61
|
+
* Create a new bucket.
|
|
62
|
+
*/
|
|
63
|
+
createBucket(config: KVBucketConfig): Promise<KVBucketInfo>;
|
|
64
|
+
/**
|
|
65
|
+
* Delete a bucket.
|
|
66
|
+
*/
|
|
67
|
+
deleteBucket(name: string): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* List all buckets.
|
|
70
|
+
*/
|
|
71
|
+
listBuckets(): Promise<KVBucketInfo[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Get bucket info.
|
|
74
|
+
*/
|
|
75
|
+
getBucketInfo(name: string): Promise<KVBucketInfo>;
|
|
76
|
+
/**
|
|
77
|
+
* Get a bucket handle for key-level operations.
|
|
78
|
+
*/
|
|
79
|
+
bucket(name: string): KVBucketHandle;
|
|
80
|
+
private restRequest;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=kv.d.ts.map
|
package/dist/kv.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../src/kv.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,OAAO,EACP,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc;IAGzC;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOxC;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ5D;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAS/D;;;OAGG;IACG,MAAM,CACV,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC;IASvB;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;IACG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YASpC,WAAW;CA6D1B;AAED;;GAEG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEnD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAejE;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAQ5C;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOxD;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;YAItB,WAAW;CAgD1B"}
|
package/dist/kv.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ironflow Node.js KV Client
|
|
3
|
+
*
|
|
4
|
+
* Key-Value store operations for the Ironflow server.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* KV bucket handle for key-level operations.
|
|
8
|
+
*/
|
|
9
|
+
export class KVBucketHandle {
|
|
10
|
+
bucketName;
|
|
11
|
+
config;
|
|
12
|
+
constructor(bucketName, config) {
|
|
13
|
+
this.bucketName = bucketName;
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get a value by key.
|
|
18
|
+
*/
|
|
19
|
+
async get(key) {
|
|
20
|
+
return this.restRequest("GET", `/api/v1/kv/buckets/${enc(this.bucketName)}/keys/${key}`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Put a value unconditionally.
|
|
24
|
+
*/
|
|
25
|
+
async put(key, value) {
|
|
26
|
+
return this.restRequest("PUT", `/api/v1/kv/buckets/${enc(this.bucketName)}/keys/${key}`, value);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a value only if the key doesn't exist (if-not-exists).
|
|
30
|
+
* Throws on conflict (HTTP 412).
|
|
31
|
+
*/
|
|
32
|
+
async create(key, value) {
|
|
33
|
+
return this.restRequest("PUT", `/api/v1/kv/buckets/${enc(this.bucketName)}/keys/${key}`, value, { "If-None-Match": "*" });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Update a value only if the revision matches (compare-and-swap).
|
|
37
|
+
* Throws on mismatch (HTTP 412).
|
|
38
|
+
*/
|
|
39
|
+
async update(key, value, revision) {
|
|
40
|
+
return this.restRequest("PUT", `/api/v1/kv/buckets/${enc(this.bucketName)}/keys/${key}`, value, { "If-Match": String(revision) });
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Delete a key (soft delete / tombstone).
|
|
44
|
+
*/
|
|
45
|
+
async delete(key) {
|
|
46
|
+
await this.restRequest("DELETE", `/api/v1/kv/buckets/${enc(this.bucketName)}/keys/${key}`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Purge a key and all its history.
|
|
50
|
+
*/
|
|
51
|
+
async purge(key) {
|
|
52
|
+
await this.restRequest("DELETE", `/api/v1/kv/buckets/${enc(this.bucketName)}/keys/${key}?purge=true`);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* List keys with an optional wildcard filter.
|
|
56
|
+
*/
|
|
57
|
+
async listKeys(filter) {
|
|
58
|
+
let path = `/api/v1/kv/buckets/${enc(this.bucketName)}/keys`;
|
|
59
|
+
if (filter) {
|
|
60
|
+
path += `?filter=${encodeURIComponent(filter)}`;
|
|
61
|
+
}
|
|
62
|
+
const result = await this.restRequest("GET", path);
|
|
63
|
+
return result.keys;
|
|
64
|
+
}
|
|
65
|
+
async restRequest(method, path, body, extraHeaders) {
|
|
66
|
+
const url = `${this.config.serverUrl}${path}`;
|
|
67
|
+
const headers = {};
|
|
68
|
+
if (body !== undefined) {
|
|
69
|
+
headers["Content-Type"] =
|
|
70
|
+
typeof body === "string" || body instanceof Uint8Array
|
|
71
|
+
? "application/octet-stream"
|
|
72
|
+
: "application/json";
|
|
73
|
+
}
|
|
74
|
+
if (this.config.apiKey) {
|
|
75
|
+
headers["Authorization"] = `Bearer ${this.config.apiKey}`;
|
|
76
|
+
}
|
|
77
|
+
if (extraHeaders) {
|
|
78
|
+
Object.assign(headers, extraHeaders);
|
|
79
|
+
}
|
|
80
|
+
const controller = new AbortController();
|
|
81
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
82
|
+
try {
|
|
83
|
+
const response = await fetch(url, {
|
|
84
|
+
method,
|
|
85
|
+
headers,
|
|
86
|
+
body: body !== undefined
|
|
87
|
+
? typeof body === "string" || body instanceof Uint8Array
|
|
88
|
+
? body
|
|
89
|
+
: JSON.stringify(body)
|
|
90
|
+
: undefined,
|
|
91
|
+
signal: controller.signal,
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
const errorBody = await response.text();
|
|
95
|
+
let errorMessage = `KV request failed with status ${response.status}`;
|
|
96
|
+
try {
|
|
97
|
+
const errorJson = JSON.parse(errorBody);
|
|
98
|
+
if (errorJson.error)
|
|
99
|
+
errorMessage = errorJson.error;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
if (errorBody)
|
|
103
|
+
errorMessage = errorBody;
|
|
104
|
+
}
|
|
105
|
+
throw new Error(errorMessage);
|
|
106
|
+
}
|
|
107
|
+
if (response.status === 204) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
return response.json();
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
clearTimeout(timeoutId);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* KV client for bucket management and key operations.
|
|
119
|
+
*/
|
|
120
|
+
export class KVClient {
|
|
121
|
+
config;
|
|
122
|
+
constructor(config) {
|
|
123
|
+
this.config = config;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Create a new bucket.
|
|
127
|
+
*/
|
|
128
|
+
async createBucket(config) {
|
|
129
|
+
const body = { name: config.name };
|
|
130
|
+
if (config.description)
|
|
131
|
+
body.description = config.description;
|
|
132
|
+
if (config.ttlSeconds)
|
|
133
|
+
body.ttl_seconds = config.ttlSeconds;
|
|
134
|
+
if (config.maxValueSize)
|
|
135
|
+
body.max_value_size = config.maxValueSize;
|
|
136
|
+
if (config.maxBytes)
|
|
137
|
+
body.max_bytes = config.maxBytes;
|
|
138
|
+
if (config.history)
|
|
139
|
+
body.history = config.history;
|
|
140
|
+
return this.restRequest("POST", "/api/v1/kv/buckets", body);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Delete a bucket.
|
|
144
|
+
*/
|
|
145
|
+
async deleteBucket(name) {
|
|
146
|
+
await this.restRequest("DELETE", `/api/v1/kv/buckets/${enc(name)}`);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* List all buckets.
|
|
150
|
+
*/
|
|
151
|
+
async listBuckets() {
|
|
152
|
+
const result = await this.restRequest("GET", "/api/v1/kv/buckets");
|
|
153
|
+
return result.buckets;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get bucket info.
|
|
157
|
+
*/
|
|
158
|
+
async getBucketInfo(name) {
|
|
159
|
+
return this.restRequest("GET", `/api/v1/kv/buckets/${enc(name)}`);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get a bucket handle for key-level operations.
|
|
163
|
+
*/
|
|
164
|
+
bucket(name) {
|
|
165
|
+
return new KVBucketHandle(name, this.config);
|
|
166
|
+
}
|
|
167
|
+
async restRequest(method, path, body) {
|
|
168
|
+
const url = `${this.config.serverUrl}${path}`;
|
|
169
|
+
const headers = {};
|
|
170
|
+
if (body !== undefined) {
|
|
171
|
+
headers["Content-Type"] = "application/json";
|
|
172
|
+
}
|
|
173
|
+
if (this.config.apiKey) {
|
|
174
|
+
headers["Authorization"] = `Bearer ${this.config.apiKey}`;
|
|
175
|
+
}
|
|
176
|
+
const controller = new AbortController();
|
|
177
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
178
|
+
try {
|
|
179
|
+
const response = await fetch(url, {
|
|
180
|
+
method,
|
|
181
|
+
headers,
|
|
182
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
183
|
+
signal: controller.signal,
|
|
184
|
+
});
|
|
185
|
+
if (!response.ok) {
|
|
186
|
+
const errorBody = await response.text();
|
|
187
|
+
let errorMessage = `KV request failed with status ${response.status}`;
|
|
188
|
+
try {
|
|
189
|
+
const errorJson = JSON.parse(errorBody);
|
|
190
|
+
if (errorJson.error)
|
|
191
|
+
errorMessage = errorJson.error;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
if (errorBody)
|
|
195
|
+
errorMessage = errorBody;
|
|
196
|
+
}
|
|
197
|
+
throw new Error(errorMessage);
|
|
198
|
+
}
|
|
199
|
+
if (response.status === 204) {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
return response.json();
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
clearTimeout(timeoutId);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function enc(s) {
|
|
210
|
+
return encodeURIComponent(s);
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=kv.js.map
|
package/dist/kv.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.js","sourceRoot":"","sources":["../src/kv.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH;;GAEG;AACH,MAAM,OAAO,cAAc;IAEN;IACA;IAFnB,YACmB,UAAkB,EAClB,MAAsB;QADtB,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAgB;IACtC,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,WAAW,CACrB,KAAK,EACL,sBAAsB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,CACzD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc;QACnC,OAAO,IAAI,CAAC,WAAW,CACrB,KAAK,EACL,sBAAsB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EACxD,KAAK,CACN,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,KAAc;QACtC,OAAO,IAAI,CAAC,WAAW,CACrB,KAAK,EACL,sBAAsB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EACxD,KAAK,EACL,EAAE,eAAe,EAAE,GAAG,EAAE,CACzB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,GAAW,EACX,KAAc,EACd,QAAgB;QAEhB,OAAO,IAAI,CAAC,WAAW,CACrB,KAAK,EACL,sBAAsB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EACxD,KAAK,EACL,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CACjC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,WAAW,CACpB,QAAQ,EACR,sBAAsB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,CACzD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,IAAI,CAAC,WAAW,CACpB,QAAQ,EACR,sBAAsB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,aAAa,CACpE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAe;QAC5B,IAAI,IAAI,GAAG,sBAAsB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAC7D,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,IAAI,WAAW,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAmB,KAAK,EAAE,IAAI,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,YAAqC;QAErC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,CAAC;QAC9C,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,cAAc,CAAC;gBACrB,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,YAAY,UAAU;oBACpD,CAAC,CAAC,0BAA0B;oBAC5B,CAAC,CAAC,kBAAkB,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5D,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM;gBACN,OAAO;gBACP,IAAI,EACF,IAAI,KAAK,SAAS;oBAChB,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,YAAY,UAAU;wBACtD,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBACxB,CAAC,CAAC,SAAS;gBACf,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,IAAI,YAAY,GAAG,iCAAiC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACtE,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACxC,IAAI,SAAS,CAAC,KAAK;wBAAE,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC;gBACtD,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,SAAS;wBAAE,YAAY,GAAG,SAAS,CAAC;gBAC1C,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,SAAc,CAAC;YACxB,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAEvD;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,MAAsB;QACvC,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,MAAM,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAC9D,IAAI,MAAM,CAAC,UAAU;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QAC5D,IAAI,MAAM,CAAC,YAAY;YAAE,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC;QACnE,IAAI,MAAM,CAAC,QAAQ;YAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QACtD,IAAI,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAElD,OAAO,IAAI,CAAC,WAAW,CACrB,MAAM,EACN,oBAAoB,EACpB,IAAI,CACL,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,MAAM,IAAI,CAAC,WAAW,CACpB,QAAQ,EACR,sBAAsB,GAAG,CAAC,IAAI,CAAC,EAAE,CAClC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,KAAK,EACL,oBAAoB,CACrB,CAAC;QACF,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,WAAW,CACrB,KAAK,EACL,sBAAsB,GAAG,CAAC,IAAI,CAAC,EAAE,CAClC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,CAAC;QAC9C,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM;gBACN,OAAO;gBACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC3D,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,IAAI,YAAY,GAAG,iCAAiC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACtE,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACxC,IAAI,SAAS,CAAC,KAAK;wBAAE,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC;gBACtD,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,SAAS;wBAAE,YAAY,GAAG,SAAS,CAAC;gBAC1C,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,SAAc,CAAC;YACxB,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;CACF;AAED,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projection Runner
|
|
3
|
+
*
|
|
4
|
+
* A poll-loop runner that processes events for a single projection.
|
|
5
|
+
* Follows the same pattern as the worker polling loop in worker.ts.
|
|
6
|
+
*
|
|
7
|
+
* - Registers the projection with the server
|
|
8
|
+
* - Polls for events via ConnectRPC
|
|
9
|
+
* - Runs the handler (managed: reducer + save state, external: side-effect + ack)
|
|
10
|
+
* - Backs off when idle (1s -> 2s -> 4s, max 10s)
|
|
11
|
+
* - Supports graceful shutdown via AbortSignal
|
|
12
|
+
*/
|
|
13
|
+
import type { IronflowProjection, Logger } from "@ironflow/core";
|
|
14
|
+
export interface ProjectionRunnerConfig {
|
|
15
|
+
projection: IronflowProjection<any, any>;
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
headers: Record<string, string>;
|
|
18
|
+
logger: Logger;
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
}
|
|
21
|
+
export declare class ProjectionRunner {
|
|
22
|
+
private config;
|
|
23
|
+
private running;
|
|
24
|
+
private backoffMs;
|
|
25
|
+
constructor(config: ProjectionRunnerConfig);
|
|
26
|
+
register(): Promise<void>;
|
|
27
|
+
start(): Promise<void>;
|
|
28
|
+
stop(): Promise<void>;
|
|
29
|
+
private poll;
|
|
30
|
+
private buildContext;
|
|
31
|
+
private saveState;
|
|
32
|
+
private ackEvents;
|
|
33
|
+
private sleep;
|
|
34
|
+
}
|
|
35
|
+
export declare function createProjectionRunner(config: ProjectionRunnerConfig): ProjectionRunner;
|
|
36
|
+
//# sourceMappingURL=projection-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-runner.d.ts","sourceRoot":"","sources":["../src/projection-runner.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAElB,MAAM,EAGP,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,sBAAsB;IAErC,UAAU,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAkBD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAQ;gBAEb,MAAM,EAAE,sBAAsB;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,IAAI;IA2FlB,OAAO,CAAC,YAAY;YAgBN,SAAS;YA0BT,SAAS;IAoBvB,OAAO,CAAC,KAAK;CAad;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,GAAG,gBAAgB,CAEvF"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// sdk/js/node/src/projection-runner.ts
|
|
2
|
+
export class ProjectionRunner {
|
|
3
|
+
config;
|
|
4
|
+
running = false;
|
|
5
|
+
backoffMs = 1000;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async register() {
|
|
10
|
+
const { projection, baseUrl, headers } = this.config;
|
|
11
|
+
const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/RegisterProjection`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: { ...headers, "Content-Type": "application/json" },
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
name: projection.config.name,
|
|
16
|
+
events: projection.config.events,
|
|
17
|
+
mode: projection.config.mode,
|
|
18
|
+
version: 1,
|
|
19
|
+
partitionKey: projection.config.partitionKey || "",
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
22
|
+
if (!resp.ok) {
|
|
23
|
+
throw new Error(`Failed to register projection: ${resp.status}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async start() {
|
|
27
|
+
this.running = true;
|
|
28
|
+
await this.register();
|
|
29
|
+
this.config.logger.info(`Projection runner started: ${this.config.projection.config.name}`);
|
|
30
|
+
while (this.running && !this.config.signal?.aborted) {
|
|
31
|
+
try {
|
|
32
|
+
const processed = await this.poll();
|
|
33
|
+
if (processed > 0) {
|
|
34
|
+
this.backoffMs = 1000; // Reset backoff
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Backoff on empty poll
|
|
38
|
+
await this.sleep(this.backoffMs);
|
|
39
|
+
this.backoffMs = Math.min(this.backoffMs * 2, 10000);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
this.config.logger.error(`Projection poll error: ${err}`);
|
|
44
|
+
await this.sleep(this.backoffMs);
|
|
45
|
+
this.backoffMs = Math.min(this.backoffMs * 2, 10000);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async stop() {
|
|
50
|
+
this.running = false;
|
|
51
|
+
}
|
|
52
|
+
async poll() {
|
|
53
|
+
const { projection, baseUrl, headers } = this.config;
|
|
54
|
+
const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/PollProjectionEvents`, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers: { ...headers, "Content-Type": "application/json" },
|
|
57
|
+
body: JSON.stringify({
|
|
58
|
+
name: projection.config.name,
|
|
59
|
+
batchSize: projection.config.batchSize || 100,
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
if (!resp.ok)
|
|
63
|
+
throw new Error(`Poll failed: ${resp.status}`);
|
|
64
|
+
const data = (await resp.json());
|
|
65
|
+
const events = data.events || [];
|
|
66
|
+
if (events.length === 0)
|
|
67
|
+
return 0;
|
|
68
|
+
const projConfig = projection.config;
|
|
69
|
+
if (projConfig.mode === "managed") {
|
|
70
|
+
// Managed mode: group events by partition, run reducer per partition, save each.
|
|
71
|
+
const partitions = new Map();
|
|
72
|
+
for (const event of events) {
|
|
73
|
+
const pk = event.metadata?.["__partition"] || "__global__";
|
|
74
|
+
if (!partitions.has(pk)) {
|
|
75
|
+
partitions.set(pk, {
|
|
76
|
+
events: [],
|
|
77
|
+
lastEventId: "",
|
|
78
|
+
lastEventSeq: 0,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
partitions.get(pk).events.push(event);
|
|
82
|
+
}
|
|
83
|
+
for (const [pk, batch] of partitions) {
|
|
84
|
+
// Use currentState from server only for __global__ (non-partitioned).
|
|
85
|
+
let state = pk === "__global__" && data.currentState != null
|
|
86
|
+
? data.currentState
|
|
87
|
+
: projConfig.initialState
|
|
88
|
+
? projConfig.initialState()
|
|
89
|
+
: {};
|
|
90
|
+
for (const event of batch.events) {
|
|
91
|
+
const ctx = this.buildContext(event);
|
|
92
|
+
state = projConfig.handler(state, event, ctx);
|
|
93
|
+
batch.lastEventId = event.id;
|
|
94
|
+
batch.lastEventSeq = event.seq;
|
|
95
|
+
batch.lastEventTime = event.timestamp;
|
|
96
|
+
}
|
|
97
|
+
await this.saveState(state, batch.lastEventId, batch.lastEventSeq, batch.lastEventTime, pk);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// External mode: run handler for each event, then ack
|
|
102
|
+
let lastEventId = "";
|
|
103
|
+
let lastEventSeq = 0;
|
|
104
|
+
for (const event of events) {
|
|
105
|
+
const ctx = this.buildContext(event);
|
|
106
|
+
await projConfig.handler(event, ctx);
|
|
107
|
+
lastEventId = event.id;
|
|
108
|
+
lastEventSeq = event.seq;
|
|
109
|
+
}
|
|
110
|
+
await this.ackEvents(lastEventId, lastEventSeq);
|
|
111
|
+
}
|
|
112
|
+
return events.length;
|
|
113
|
+
}
|
|
114
|
+
buildContext(event) {
|
|
115
|
+
return {
|
|
116
|
+
event: {
|
|
117
|
+
id: event.id,
|
|
118
|
+
name: event.name,
|
|
119
|
+
seq: event.seq || 0,
|
|
120
|
+
timestamp: event.timestamp ? new Date(event.timestamp) : new Date(),
|
|
121
|
+
},
|
|
122
|
+
projection: {
|
|
123
|
+
name: this.config.projection.config.name,
|
|
124
|
+
version: 1,
|
|
125
|
+
},
|
|
126
|
+
logger: this.config.logger,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
async saveState(state, lastEventId, lastEventSeq, lastEventTime, partitionKey) {
|
|
130
|
+
const { baseUrl, headers, projection } = this.config;
|
|
131
|
+
const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/SaveProjectionState`, {
|
|
132
|
+
method: "POST",
|
|
133
|
+
headers: { ...headers, "Content-Type": "application/json" },
|
|
134
|
+
body: JSON.stringify({
|
|
135
|
+
name: projection.config.name,
|
|
136
|
+
partitionKey: partitionKey ?? "",
|
|
137
|
+
state,
|
|
138
|
+
lastEventId,
|
|
139
|
+
lastEventSeq,
|
|
140
|
+
lastEventTime,
|
|
141
|
+
}),
|
|
142
|
+
});
|
|
143
|
+
if (!resp.ok)
|
|
144
|
+
throw new Error(`Save state failed: ${resp.status}`);
|
|
145
|
+
}
|
|
146
|
+
async ackEvents(lastEventId, lastEventSeq) {
|
|
147
|
+
const { baseUrl, headers, projection } = this.config;
|
|
148
|
+
const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/AckProjectionEvents`, {
|
|
149
|
+
method: "POST",
|
|
150
|
+
headers: { ...headers, "Content-Type": "application/json" },
|
|
151
|
+
body: JSON.stringify({
|
|
152
|
+
name: projection.config.name,
|
|
153
|
+
lastEventId,
|
|
154
|
+
lastEventSeq,
|
|
155
|
+
}),
|
|
156
|
+
});
|
|
157
|
+
if (!resp.ok)
|
|
158
|
+
throw new Error(`Ack events failed: ${resp.status}`);
|
|
159
|
+
}
|
|
160
|
+
sleep(ms) {
|
|
161
|
+
return new Promise((resolve) => {
|
|
162
|
+
const timer = setTimeout(resolve, ms);
|
|
163
|
+
this.config.signal?.addEventListener("abort", () => {
|
|
164
|
+
clearTimeout(timer);
|
|
165
|
+
resolve();
|
|
166
|
+
}, { once: true });
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
export function createProjectionRunner(config) {
|
|
171
|
+
return new ProjectionRunner(config);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=projection-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-runner.js","sourceRoot":"","sources":["../src/projection-runner.ts"],"names":[],"mappings":"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"}
|