@rotorsoft/act 0.6.1 → 0.6.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryStore.d.ts","sourceRoot":"","sources":["../../../src/adapters/InMemoryStore.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,KAAK,EACL,OAAO,EACP,KAAK,EACL,OAAO,EACP,KAAK,EACN,MAAM,mBAAmB,CAAC;AAmF3B;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,YAAW,KAAK;IAEzC,OAAO,CAAC,OAAO,CAA2C;IAE1D,OAAO,CAAC,QAAQ,CAA0C;IAE1D;;;OAGG;IACG,OAAO;IAKb;;;OAGG;IACG,IAAI;IAIV;;;OAGG;IACG,IAAI;IAMV;;;;;OAKG;IACG,KAAK,CAAC,CAAC,SAAS,OAAO,EAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,EAChD,KAAK,CAAC,EAAE,KAAK;IAgCf;;;;;;;;OAQG;IACG,MAAM,CAAC,CAAC,SAAS,OAAO,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAC3B,IAAI,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM;IAiC1B;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,UAAQ;;;;;IAS5C;;;;;OAKG;IACG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM;IAe3C;;;OAGG;IACG,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE;IAOzB;;;;OAIG;IACG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;eAAT,MAAM;;CAMlD"}
1
+ {"version":3,"file":"InMemoryStore.d.ts","sourceRoot":"","sources":["../../../src/adapters/InMemoryStore.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,KAAK,EACL,OAAO,EACP,KAAK,EACL,OAAO,EACP,KAAK,EACN,MAAM,mBAAmB,CAAC;AAgG3B;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,YAAW,KAAK;IAEzC,OAAO,CAAC,OAAO,CAA2C;IAE1D,OAAO,CAAC,QAAQ,CAA0C;IAE1D;;;OAGG;IACG,OAAO;IAKb;;;OAGG;IACG,IAAI;IAIV;;;OAGG;IACG,IAAI;IAMV,OAAO,CAAC,QAAQ;IAUhB;;;;;OAKG;IACG,KAAK,CAAC,CAAC,SAAS,OAAO,EAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,EAChD,KAAK,CAAC,EAAE,KAAK;IAiCf;;;;;;;;OAQG;IACG,MAAM,CAAC,CAAC,SAAS,OAAO,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAC3B,IAAI,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM;IAiC1B;;;;;OAKG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;;IAe3C;;;;;OAKG;IACG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM;IAa3C;;;OAGG;IACG,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE;;;;;;;IAOzB;;;;OAIG;IACG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;;;;;;;;CAMrD"}
@@ -49,11 +49,11 @@ export interface Store extends Disposable {
49
49
  query: <E extends Schemas>(callback: (event: Committed<E, keyof E>) => void, query?: Query) => Promise<number>;
50
50
  /**
51
51
  * Polls the store for unblocked streams needing processing, ordered by lease watermark.
52
- * @param limit - Maximum number of streams to poll.
53
- * @param descending - Whether to poll streams in descending order (aka poll the most advanced first).
52
+ * @param lagging - Max number of streams to poll in ascending order.
53
+ * @param leading - Max number of streams to poll in descending order.
54
54
  * @returns The polled streams.
55
55
  */
56
- poll: (limit: number, descending?: boolean) => Promise<Poll[]>;
56
+ poll: (lagging: number, leading: number) => Promise<Poll[]>;
57
57
  /**
58
58
  * Lease streams for processing (e.g., for distributed consumers).
59
59
  * @param leases - Lease requests for streams, including end-of-lease watermark, lease holder, and source stream.
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/types/ports.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,KAAK,EACL,OAAO,EACR,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEjD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,KAAM,SAAQ,UAAU;IACvC;;OAEG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;;;;;OAQG;IACH,MAAM,EAAE,CAAC,CAAC,SAAS,OAAO,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAC3B,IAAI,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,KAAK,EAAE,CAAC,CAAC,SAAS,OAAO,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,EAChD,KAAK,CAAC,EAAE,KAAK,KACV,OAAO,CAAC,MAAM,CAAC,CAAC;IAErB;;;;;OAKG;IACH,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/D;;;;;OAKG;IACH,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE7D;;;OAGG;IACH,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE3C;;;;OAIG;IACH,KAAK,EAAE,CACL,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,KACrC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAChD"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/types/ports.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,KAAK,EACL,OAAO,EACR,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEjD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,KAAM,SAAQ,UAAU;IACvC;;OAEG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;;;;;OAQG;IACH,MAAM,EAAE,CAAC,CAAC,SAAS,OAAO,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAC3B,IAAI,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,KAAK,EAAE,CAAC,CAAC,SAAS,OAAO,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,EAChD,KAAK,CAAC,EAAE,KAAK,KACV,OAAO,CAAC,MAAM,CAAC,CAAC;IAErB;;;;;OAKG;IACH,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE5D;;;;;OAKG;IACH,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE7D;;;OAGG;IACH,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE3C;;;;OAIG;IACH,KAAK,EAAE,CACL,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,KACrC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAChD"}
@@ -74,29 +74,18 @@ export type Poll = {
74
74
  readonly source?: string;
75
75
  readonly at: number;
76
76
  };
77
- /**
78
- * Options for draining events from the store.
79
- * @property streamLimit - Maximum number of streams to fetch.
80
- * @property eventLimit - Maximum number of events to fetch per stream.
81
- * @property leaseMillis - Maximum lease duration (in milliseconds).
82
- * @property descending - Whether to fetch streams in descending order (aka fetch the most advanced first).
83
- */
84
- export type DrainOptions = {
85
- readonly streamLimit?: number;
86
- readonly eventLimit?: number;
87
- readonly leaseMillis?: number;
88
- readonly descending?: boolean;
89
- };
90
77
  /**
91
78
  * Result of fetching events from the store for processing.
92
79
  * @template E - Event schemas.
93
80
  * @property stream - The stream name
94
81
  * @property source - The source stream(s) (name or RegExp), or undefined when sourcing from all streams.
82
+ * @property at - The last event sequence number processed by the stream.
95
83
  * @property events - The list of next committed events to be processed by the stream.
96
84
  */
97
85
  export type Fetch<E extends Schemas> = Array<{
98
86
  readonly stream: string;
99
87
  readonly source?: string;
88
+ readonly at: number;
100
89
  readonly events: Committed<E, keyof E>[];
101
90
  }>;
102
91
  /**
@@ -114,4 +103,30 @@ export type Lease = {
114
103
  readonly by: string;
115
104
  readonly retry: number;
116
105
  };
106
+ /**
107
+ * Options for draining events from the store.
108
+ * @property streamLimit - Maximum number of streams to fetch.
109
+ * @property eventLimit - Maximum number of events to fetch per stream.
110
+ * @property leaseMillis - Maximum lease duration (in milliseconds).
111
+ */
112
+ export type DrainOptions = {
113
+ readonly streamLimit?: number;
114
+ readonly eventLimit?: number;
115
+ readonly leaseMillis?: number;
116
+ };
117
+ /**
118
+ * Drain results
119
+ * @property fetched - The fetched events.
120
+ * @property leased - The leased events.
121
+ * @property acked - The acked events.
122
+ * @property blocked - The blocked events.
123
+ */
124
+ export type Drain<E extends Schemas> = {
125
+ readonly fetched: Fetch<E>;
126
+ readonly leased: Lease[];
127
+ readonly acked: Lease[];
128
+ readonly blocked: Array<Lease & {
129
+ error: string;
130
+ }>;
131
+ };
117
132
  //# sourceMappingURL=reaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../../src/types/reaction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExE;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAClE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,IAC7D;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC,CAAC,CACC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC;AAE1D;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI;IACrE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;IAC7D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,OAAO,IAAI,KAAK,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CAC1C,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../../src/types/reaction.ts"],"names":[],"mappings":"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"}
@@ -53,4 +53,13 @@ export type AsCommitted<R, K extends keyof R> = R[K] extends {
53
53
  readonly name: K;
54
54
  readonly data: z.infer<S>;
55
55
  } & CommittedMeta : never;
56
+ /**
57
+ * Utility type to map commited events from zod schema maps.
58
+ * @template E - Event map.
59
+ * @template K - Event name.
60
+ */
61
+ export type CommittedOf<E, K extends keyof E> = E[K] extends z.ZodType ? {
62
+ readonly name: K;
63
+ readonly data: z.infer<E[K]>;
64
+ } & CommittedMeta : never;
56
65
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/types/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI;IACpE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,IAAI;KAC5C,CAAC,IAAI,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM;CAAE,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,CAClB,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,EAC3B,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,OAAO,IACf;IACF,QAAQ,CAAC,OAAO,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAAE,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5E;IACE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CAC3B,GAAG,aAAa,GACjB,KAAK,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/types/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI;IACpE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,IAAI;KAC5C,CAAC,IAAI,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM;CAAE,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,CAClB,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,EAC3B,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,OAAO,IACf;IACF,QAAQ,CAAC,OAAO,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAAE,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5E;IACE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CAC3B,GAAG,aAAa,GACjB,KAAK,CAAC;AAEV;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,GAClE;IACE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9B,GAAG,aAAa,GACjB,KAAK,CAAC"}
package/dist/index.cjs CHANGED
@@ -262,21 +262,21 @@ async function sleep(ms) {
262
262
 
263
263
  // src/adapters/InMemoryStore.ts
264
264
  var InMemoryStream = class {
265
- stream;
266
- source;
267
- at = -1;
268
- retry = -1;
269
- blocked = false;
270
- error = "";
271
- leased_at = void 0;
272
- leased_by = void 0;
273
- leased_until = void 0;
274
265
  constructor(stream, source) {
275
266
  this.stream = stream;
276
267
  this.source = source;
277
268
  }
269
+ _at = -1;
270
+ _retry = -1;
271
+ _blocked = false;
272
+ _error = "";
273
+ _leased_by = void 0;
274
+ _leased_until = void 0;
278
275
  get is_avaliable() {
279
- return !this.blocked && (!this.leased_until || this.leased_until <= /* @__PURE__ */ new Date());
276
+ return !this._blocked && (!this._leased_until || this._leased_until <= /* @__PURE__ */ new Date());
277
+ }
278
+ get at() {
279
+ return this._at;
280
280
  }
281
281
  /**
282
282
  * Attempt to lease this stream for processing.
@@ -286,17 +286,18 @@ var InMemoryStream = class {
286
286
  * @returns The granted lease or undefined if blocked.
287
287
  */
288
288
  lease(at, by, millis) {
289
- if (this.is_avaliable && at > this.at) {
290
- this.leased_at = at;
291
- this.leased_by = by;
292
- this.leased_until = new Date(Date.now() + millis);
293
- millis > 0 && (this.retry = this.retry + 1);
289
+ if (this.is_avaliable) {
290
+ if (millis > 0) {
291
+ this._leased_by = by;
292
+ this._leased_until = new Date(Date.now() + millis);
293
+ this._retry = this._retry + 1;
294
+ }
294
295
  return {
295
296
  stream: this.stream,
296
297
  source: this.source,
297
298
  at,
298
299
  by,
299
- retry: this.retry
300
+ retry: this._retry
300
301
  };
301
302
  }
302
303
  }
@@ -306,27 +307,37 @@ var InMemoryStream = class {
306
307
  * @param by - Lease holder that processed the watermark.
307
308
  */
308
309
  ack(at, by) {
309
- if (this.leased_by === by && at >= this.at) {
310
- this.leased_at = void 0;
311
- this.leased_by = void 0;
312
- this.leased_until = void 0;
313
- this.at = at;
314
- this.retry = -1;
315
- return true;
310
+ if (this._leased_by === by) {
311
+ this._leased_by = void 0;
312
+ this._leased_until = void 0;
313
+ this._at = at;
314
+ this._retry = -1;
315
+ return {
316
+ stream: this.stream,
317
+ source: this.source,
318
+ at: this._at,
319
+ by,
320
+ retry: this._retry
321
+ };
316
322
  }
317
- return false;
318
323
  }
319
324
  /**
320
325
  * Block a stream for processing after failing to process and reaching max retries with blocking enabled.
321
326
  * @param error Blocked error message.
322
327
  */
323
328
  block(by, error) {
324
- if (this.leased_by === by) {
325
- this.blocked = true;
326
- this.error = error;
327
- return true;
329
+ if (this._leased_by === by) {
330
+ this._blocked = true;
331
+ this._error = error;
332
+ return {
333
+ stream: this.stream,
334
+ source: this.source,
335
+ at: this._at,
336
+ by: this._leased_by,
337
+ retry: this._retry,
338
+ error: this._error
339
+ };
328
340
  }
329
- return false;
330
341
  }
331
342
  };
332
343
  var InMemoryStore = class {
@@ -358,6 +369,15 @@ var InMemoryStore = class {
358
369
  this._events.length = 0;
359
370
  this._streams = /* @__PURE__ */ new Map();
360
371
  }
372
+ in_query(query, e) {
373
+ if (query.stream && !RegExp(`^${query.stream}$`).test(e.stream))
374
+ return false;
375
+ if (query.names && !query.names.includes(e.name)) return false;
376
+ if (query.correlation && e.meta?.correlation !== query.correlation)
377
+ return false;
378
+ if (e.name === SNAP_EVENT && !query.with_snaps) return false;
379
+ return true;
380
+ }
361
381
  /**
362
382
  * Query events in the store, optionally filtered by query options.
363
383
  * @param callback - Function to call for each event.
@@ -366,30 +386,32 @@ var InMemoryStore = class {
366
386
  */
367
387
  async query(callback, query) {
368
388
  await sleep();
369
- const {
370
- stream,
371
- names,
372
- before,
373
- after = -1,
374
- limit,
375
- created_before,
376
- created_after,
377
- correlation,
378
- with_snaps = false
379
- } = query || {};
380
- let i = after + 1, count = 0;
381
- while (i < this._events.length) {
382
- const e = this._events[i++];
383
- if (stream && !RegExp(`^${stream}$`).test(e.stream)) continue;
384
- if (names && !names.includes(e.name)) continue;
385
- if (correlation && e.meta?.correlation !== correlation) continue;
386
- if (created_after && e.created <= created_after) continue;
387
- if (e.name === SNAP_EVENT && !with_snaps) continue;
388
- if (before && e.id >= before) break;
389
- if (created_before && e.created >= created_before) break;
390
- callback(e);
391
- count++;
392
- if (limit && count >= limit) break;
389
+ let count = 0;
390
+ if (query?.backward) {
391
+ let i = (query?.before || this._events.length) - 1;
392
+ while (i >= 0) {
393
+ const e = this._events[i--];
394
+ if (query && !this.in_query(query, e)) continue;
395
+ if (query?.created_before && e.created >= query.created_before)
396
+ continue;
397
+ if (query.after && e.id <= query.after) break;
398
+ if (query.created_after && e.created <= query.created_after) break;
399
+ callback(e);
400
+ count++;
401
+ if (query?.limit && count >= query.limit) break;
402
+ }
403
+ } else {
404
+ let i = (query?.after ?? -1) + 1;
405
+ while (i < this._events.length) {
406
+ const e = this._events[i++];
407
+ if (query && !this.in_query(query, e)) continue;
408
+ if (query?.created_after && e.created <= query.created_after) continue;
409
+ if (query?.before && e.id >= query.before) break;
410
+ if (query?.created_before && e.created >= query.created_before) break;
411
+ callback(e);
412
+ count++;
413
+ if (query?.limit && count >= query.limit) break;
414
+ }
393
415
  }
394
416
  return count;
395
417
  }
@@ -431,13 +453,15 @@ var InMemoryStore = class {
431
453
  }
432
454
  /**
433
455
  * Polls the store for unblocked streams needing processing, ordered by lease watermark ascending.
434
- * @param limit - Maximum number of streams to poll.
435
- * @param descending - Whether to poll streams in descending order (aka poll the most advanced first).
456
+ * @param lagging - Max number of streams to poll in ascending order.
457
+ * @param leading - Max number of streams to poll in descending order.
436
458
  * @returns The polled streams.
437
459
  */
438
- async poll(limit, descending = false) {
460
+ async poll(lagging, leading) {
439
461
  await sleep();
440
- return [...this._streams.values()].filter((s) => s.is_avaliable).sort((a, b) => descending ? b.at - a.at : a.at - b.at).slice(0, limit).map(({ stream, source, at }) => ({ stream, source, at }));
462
+ const a = [...this._streams.values()].filter((s) => s.is_avaliable).sort((a2, b2) => a2.at - b2.at).slice(0, lagging).map(({ stream, source, at }) => ({ stream, source, at }));
463
+ const b = [...this._streams.values()].filter((s) => s.is_avaliable).sort((a2, b2) => b2.at - a2.at).slice(0, leading).map(({ stream, source, at }) => ({ stream, source, at }));
464
+ return [...a, ...b];
441
465
  }
442
466
  /**
443
467
  * Lease streams for processing (e.g., for distributed consumers).
@@ -447,10 +471,11 @@ var InMemoryStore = class {
447
471
  */
448
472
  async lease(leases, millis) {
449
473
  await sleep();
450
- return leases.map(({ stream, at, by, source }) => {
451
- const found = this._streams.get(stream) || // store new correlations
452
- this._streams.set(stream, new InMemoryStream(stream, source)).get(stream);
453
- return found.lease(at, by, millis);
474
+ return leases.map((l) => {
475
+ if (!this._streams.has(l.stream)) {
476
+ this._streams.set(l.stream, new InMemoryStream(l.stream, l.source));
477
+ }
478
+ return this._streams.get(l.stream)?.lease(l.at, l.by, millis);
454
479
  }).filter((l) => !!l);
455
480
  }
456
481
  /**
@@ -459,9 +484,7 @@ var InMemoryStore = class {
459
484
  */
460
485
  async ack(leases) {
461
486
  await sleep();
462
- return leases.filter(
463
- (lease) => this._streams.get(lease.stream)?.ack(lease.at, lease.by)
464
- );
487
+ return leases.map((l) => this._streams.get(l.stream)?.ack(l.at, l.by)).filter((l) => !!l);
465
488
  }
466
489
  /**
467
490
  * Block a stream for processing after failing to process and reaching max retries with blocking enabled.
@@ -470,9 +493,7 @@ var InMemoryStore = class {
470
493
  */
471
494
  async block(leases) {
472
495
  await sleep();
473
- return leases.filter(
474
- (lease) => this._streams.get(lease.stream)?.block(lease.by, lease.error)
475
- );
496
+ return leases.map((l) => this._streams.get(l.stream)?.block(l.by, l.error)).filter((l) => !!l);
476
497
  }
477
498
  };
478
499
 
@@ -872,13 +893,14 @@ var Act = class {
872
893
  async drain({
873
894
  streamLimit = 10,
874
895
  eventLimit = 10,
875
- leaseMillis = 1e4,
876
- descending = false
896
+ leaseMillis = 1e4
877
897
  } = {}) {
878
898
  if (!this._drain_locked) {
879
899
  try {
880
900
  this._drain_locked = true;
881
- const polled = await store().poll(streamLimit, descending);
901
+ const lagging = Math.ceil(streamLimit * 2 / 3);
902
+ const leading = streamLimit - lagging;
903
+ const polled = await store().poll(lagging, leading);
882
904
  const fetched = await Promise.all(
883
905
  polled.map(async ({ stream, source, at }) => {
884
906
  const events = await this.query_array({
@@ -886,28 +908,21 @@ var Act = class {
886
908
  after: at,
887
909
  limit: eventLimit
888
910
  });
889
- return { stream, source, events };
911
+ return { stream, source, at, events };
890
912
  })
891
913
  );
892
- fetched.length && tracer.fetched(fetched);
893
- const [last_at, count] = fetched.reduce(
894
- ([last_at2, count2], { events }) => [
895
- Math.max(last_at2, events.at(-1)?.id || 0),
896
- count2 + events.length
897
- ],
898
- [0, 0]
899
- );
900
- if (count > 0) {
914
+ if (fetched.length) {
915
+ tracer.fetched(fetched);
901
916
  const leases = /* @__PURE__ */ new Map();
917
+ const last_window_at = fetched.reduce(
918
+ (max, { at, events }) => Math.max(max, events.at(-1)?.id || at),
919
+ 0
920
+ );
902
921
  fetched.forEach(({ stream, events }) => {
903
922
  const payloads = events.flatMap((event) => {
904
- const register = this.registry.events[event.name];
905
- if (!register) return [];
923
+ const register = this.registry.events[event.name] || [];
906
924
  return [...register.reactions.values()].filter((reaction) => {
907
- const resolved = typeof reaction.resolver === "function" ? (
908
- // @ts-expect-error index by key
909
- reaction.resolver(event)
910
- ) : reaction.resolver;
925
+ const resolved = typeof reaction.resolver === "function" ? reaction.resolver(event) : reaction.resolver;
911
926
  return resolved && resolved.target === stream;
912
927
  }).map((reaction) => ({ ...reaction, event }));
913
928
  });
@@ -915,43 +930,39 @@ var Act = class {
915
930
  lease: {
916
931
  stream,
917
932
  by: (0, import_crypto2.randomUUID)(),
918
- at: events.at(-1)?.id || last_at,
919
- // move the lease watermark forward when no events found in window
933
+ at: events.at(-1)?.id || last_window_at,
934
+ // ff when no matching events
920
935
  retry: 0
921
936
  },
922
937
  // @ts-expect-error indexed by key
923
938
  payloads
924
939
  });
925
940
  });
926
- if (leases.size) {
927
- const leased = await store().lease(
928
- [...leases.values()].map((l) => l.lease),
929
- leaseMillis
930
- );
931
- if (leased.length) {
932
- tracer.leased(leased);
933
- const handled = await Promise.all(
934
- leased.map(
935
- (lease) => this.handle(lease, leases.get(lease.stream).payloads)
936
- )
937
- );
938
- const acked = await store().ack(
939
- handled.filter(({ error }) => !error).map(({ at, lease }) => ({ ...lease, at }))
940
- );
941
- if (acked.length) {
942
- tracer.acked(acked);
943
- this.emit("acked", acked);
944
- }
945
- const blocked = await store().block(
946
- handled.filter(({ block }) => block).map(({ lease, error }) => ({ ...lease, error }))
947
- );
948
- if (blocked.length) {
949
- tracer.blocked(blocked);
950
- this.emit("blocked", blocked);
951
- }
952
- return { leased, acked, blocked };
953
- }
941
+ const leased = await store().lease(
942
+ [...leases.values()].map((l) => l.lease),
943
+ leaseMillis
944
+ );
945
+ tracer.leased(leased);
946
+ const handled = await Promise.all(
947
+ leased.map(
948
+ (lease) => this.handle(lease, leases.get(lease.stream).payloads)
949
+ )
950
+ );
951
+ const acked = await store().ack(
952
+ handled.filter(({ error }) => !error).map(({ at, lease }) => ({ ...lease, at }))
953
+ );
954
+ if (acked.length) {
955
+ tracer.acked(acked);
956
+ this.emit("acked", acked);
957
+ }
958
+ const blocked = await store().block(
959
+ handled.filter(({ block }) => block).map(({ lease, error }) => ({ ...lease, error }))
960
+ );
961
+ if (blocked.length) {
962
+ tracer.blocked(blocked);
963
+ this.emit("blocked", blocked);
954
964
  }
965
+ return { fetched, leased, acked, blocked };
955
966
  }
956
967
  } catch (error) {
957
968
  logger.error(error);
@@ -959,7 +970,7 @@ var Act = class {
959
970
  this._drain_locked = false;
960
971
  }
961
972
  }
962
- return { leased: [], acked: [], blocked: [] };
973
+ return { fetched: [], leased: [], acked: [], blocked: [] };
963
974
  }
964
975
  /**
965
976
  * Correlates streams using reaction resolvers.