@rotorsoft/act 0.19.1 → 0.20.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.
@@ -0,0 +1,29 @@
1
+ import type { Cache, CacheEntry, Schema } from "../types/index.js";
2
+ /**
3
+ * In-memory LRU cache for stream snapshots.
4
+ *
5
+ * Uses a `Map` (insertion-ordered) for O(1) get/set with LRU eviction.
6
+ * Configurable `maxSize` bounds memory usage.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { cache } from "@rotorsoft/act";
11
+ * import { InMemoryCache } from "@rotorsoft/act";
12
+ *
13
+ * cache(new InMemoryCache({ maxSize: 500 }));
14
+ * ```
15
+ */
16
+ export declare class InMemoryCache implements Cache {
17
+ private readonly _entries;
18
+ private readonly _maxSize;
19
+ constructor(options?: {
20
+ maxSize?: number;
21
+ });
22
+ get<TState extends Schema>(stream: string): Promise<CacheEntry<TState> | undefined>;
23
+ set<TState extends Schema>(stream: string, entry: CacheEntry<TState>): Promise<void>;
24
+ invalidate(stream: string): Promise<void>;
25
+ clear(): Promise<void>;
26
+ dispose(): Promise<void>;
27
+ get size(): number;
28
+ }
29
+ //# sourceMappingURL=InMemoryCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryCache.d.ts","sourceRoot":"","sources":["../../../src/adapters/InMemoryCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;;;;;;;;;;;GAaG;AAEH,qBAAa,aAAc,YAAW,KAAK;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAIpC,GAAG,CAAC,MAAM,SAAS,MAAM,EAC7B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IASpC,GAAG,CAAC,MAAM,SAAS,MAAM,EAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC;IAUV,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,3 @@
1
+ export { InMemoryCache } from "./InMemoryCache.js";
2
+ export { InMemoryStore } from "./InMemoryStore.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -26,6 +26,10 @@ export declare function snap<TState extends Schema, TEvents extends Schemas>(sna
26
26
  /**
27
27
  * Loads a snapshot of the state from the store by replaying events and applying patches.
28
28
  *
29
+ * First checks the cache for a checkpoint, then queries the store for events
30
+ * committed after the cached position. On cache miss, replays from the store
31
+ * (using snapshots if available to avoid full replay).
32
+ *
29
33
  * @template TState The type of state
30
34
  * @template TEvents The type of events
31
35
  * @template TActions The type of actions
@@ -1 +1 @@
1
- {"version":3,"file":"event-sourcing.d.ts","sourceRoot":"","sources":["../../src/event-sourcing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,SAAS,EAGT,MAAM,EACN,OAAO,EACP,QAAQ,EACR,KAAK,EACL,MAAM,EACP,MAAM,kBAAkB,CAAC;AAG1B;;;GAGG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAsB,IAAI,CAAC,MAAM,SAAS,MAAM,EAAE,OAAO,SAAS,OAAO,EACvE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,IAAI,CACxB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EAExB,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsBpC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,MAAM,CAC1B,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EACxB,IAAI,SAAS,MAAM,QAAQ,EAE3B,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EACjC,UAAU,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,EAC9C,cAAc,UAAQ,GACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CA8FtC"}
1
+ {"version":3,"file":"event-sourcing.d.ts","sourceRoot":"","sources":["../../src/event-sourcing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,SAAS,EAGT,MAAM,EACN,OAAO,EACP,QAAQ,EACR,KAAK,EACL,MAAM,EACP,MAAM,kBAAkB,CAAC;AAG1B;;;GAGG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAsB,IAAI,CAAC,MAAM,SAAS,MAAM,EAAE,OAAO,SAAS,OAAO,EACvE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,IAAI,CACxB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EAExB,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4BpC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,MAAM,CAC1B,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,OAAO,EACvB,QAAQ,SAAS,OAAO,EACxB,IAAI,SAAS,MAAM,QAAQ,EAE3B,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpC,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EACjC,UAAU,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,EAC9C,cAAc,UAAQ,GACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAmHtC"}
@@ -6,6 +6,7 @@ import "./signals.js";
6
6
  */
7
7
  export * from "./act-builder.js";
8
8
  export * from "./act.js";
9
+ export * from "./adapters/index.js";
9
10
  export * from "./config.js";
10
11
  export * from "./ports.js";
11
12
  export * from "./projection-builder.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAEtB;;;;GAIG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAEtB;;;;GAIG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Disposable, Disposer, Fetch, Lease, LogLevel, Schemas, Store } from "./types/index.js";
1
+ import type { Cache, Disposable, Disposer, Fetch, Lease, LogLevel, Schemas, Store } from "./types/index.js";
2
2
  /**
3
3
  * Port and adapter utilities for logging, store management, and resource disposal.
4
4
  *
@@ -203,6 +203,19 @@ export declare const SNAP_EVENT = "__snapshot__";
203
203
  * @see {@link PostgresStore} for production use
204
204
  */
205
205
  export declare const store: (adapter?: Store | undefined) => Store;
206
+ /**
207
+ * Gets or injects the singleton cache.
208
+ *
209
+ * By default, Act uses an in-memory LRU cache. For distributed deployments,
210
+ * inject a Redis-backed cache before building your application.
211
+ *
212
+ * Cache unifies snapshotting — `snap()` writes to cache instead of the event store,
213
+ * and `load()` checks cache before querying the store for tail events.
214
+ *
215
+ * @param adapter - Optional cache implementation to inject
216
+ * @returns The singleton cache instance
217
+ */
218
+ export declare const cache: (adapter?: Cache | undefined) => Cache;
206
219
  /**
207
220
  * Tracer builder for logging fetches, leases, etc.
208
221
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/ports.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,KAAK,EACN,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS,4BAA6B,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,uCAajB,CAAC;AAEH;;;;;;;;;GASG;AACH,KAAK,QAAQ,CAAC,IAAI,SAAS,UAAU,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;AAElE,wBAAgB,IAAI,CAAC,IAAI,SAAS,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IACnD,UAAU,IAAI,KAAG,IAAI,CAQvC;AAGD,wBAAsB,cAAc,CAAC,IAAI,GAAE,QAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,wBAAgB,OAAO,CACrB,QAAQ,CAAC,EAAE,QAAQ,GAClB,CAAC,IAAI,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAGpC;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,iBAAiB,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EG;AACH,eAAO,MAAM,KAAK,wCAEhB,CAAC;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG;IAChD,OAAO,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACxD,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;CAC7D,CAkDA"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/ports.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,QAAQ,EACR,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,KAAK,EACN,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS,4BAA6B,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,uCAajB,CAAC;AAEH;;;;;;;;;GASG;AACH,KAAK,QAAQ,CAAC,IAAI,SAAS,UAAU,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;AAElE,wBAAgB,IAAI,CAAC,IAAI,SAAS,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IACnD,UAAU,IAAI,KAAG,IAAI,CAQvC;AAGD,wBAAsB,cAAc,CAAC,IAAI,GAAE,QAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,wBAAgB,OAAO,CACrB,QAAQ,CAAC,EAAE,QAAQ,GAClB,CAAC,IAAI,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAGpC;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,iBAAiB,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EG;AACH,eAAO,MAAM,KAAK,wCAEhB,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK,wCAEhB,CAAC;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG;IAChD,OAAO,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACxD,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;CAC7D,CAkDA"}
@@ -4,8 +4,34 @@
4
4
  * @category Types
5
5
  * Types and interfaces for event store ports and disposables in the Act Framework.
6
6
  */
7
- import type { Committed, EventMeta, Message, Query, Schemas } from "./action.js";
7
+ import type { Committed, EventMeta, Message, Query, Schema, Schemas } from "./action.js";
8
8
  import type { Lease, Poll } from "./reaction.js";
9
+ /**
10
+ * A cached snapshot entry for a stream.
11
+ *
12
+ * @template TState - The state schema type
13
+ */
14
+ export interface CacheEntry<TState extends Schema> {
15
+ readonly state: TState;
16
+ readonly version: number;
17
+ readonly event_id: number;
18
+ readonly patches: number;
19
+ readonly snaps: number;
20
+ }
21
+ /**
22
+ * Cache port for storing stream snapshots in-process.
23
+ *
24
+ * Implementations should provide fast key-value access with bounded memory.
25
+ * The async interface is forward-compatible with external caches (e.g., Redis).
26
+ *
27
+ * @template TState - The state schema type
28
+ */
29
+ export interface Cache extends Disposable {
30
+ get<TState extends Schema>(stream: string): Promise<CacheEntry<TState> | undefined>;
31
+ set<TState extends Schema>(stream: string, entry: CacheEntry<TState>): Promise<void>;
32
+ invalidate(stream: string): Promise<void>;
33
+ clear(): Promise<void>;
34
+ }
9
35
  /**
10
36
  * A function that disposes of a resource asynchronously.
11
37
  * @returns Promise that resolves when disposal is complete.
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,WAAW,KAAM,SAAQ,UAAU;IACvC;;;;;;;;;;;;;OAaG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;;;;;;;;;;;;OAaG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;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;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE7D;;;;;;;;;;;;;;;;;OAiBG;IACH,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;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":"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"}
package/dist/index.cjs CHANGED
@@ -39,6 +39,8 @@ __export(index_exports, {
39
39
  Errors: () => Errors,
40
40
  EventMetaSchema: () => EventMetaSchema,
41
41
  ExitCodes: () => ExitCodes,
42
+ InMemoryCache: () => InMemoryCache,
43
+ InMemoryStore: () => InMemoryStore,
42
44
  InvariantError: () => InvariantError,
43
45
  LogLevels: () => LogLevels,
44
46
  PackageSchema: () => PackageSchema,
@@ -49,6 +51,7 @@ __export(index_exports, {
49
51
  ZodEmpty: () => ZodEmpty,
50
52
  act: () => act,
51
53
  build_tracer: () => build_tracer,
54
+ cache: () => cache,
52
55
  config: () => config,
53
56
  dispose: () => dispose,
54
57
  disposeAndExit: () => disposeAndExit,
@@ -67,6 +70,42 @@ module.exports = __toCommonJS(index_exports);
67
70
  // src/ports.ts
68
71
  var import_pino = require("pino");
69
72
 
73
+ // src/adapters/InMemoryCache.ts
74
+ var InMemoryCache = class {
75
+ _entries = /* @__PURE__ */ new Map();
76
+ _maxSize;
77
+ constructor(options) {
78
+ this._maxSize = options?.maxSize ?? 1e3;
79
+ }
80
+ async get(stream) {
81
+ const entry = this._entries.get(stream);
82
+ if (!entry) return void 0;
83
+ this._entries.delete(stream);
84
+ this._entries.set(stream, entry);
85
+ return entry;
86
+ }
87
+ async set(stream, entry) {
88
+ this._entries.delete(stream);
89
+ if (this._entries.size >= this._maxSize) {
90
+ const first = this._entries.keys().next().value;
91
+ this._entries.delete(first);
92
+ }
93
+ this._entries.set(stream, entry);
94
+ }
95
+ async invalidate(stream) {
96
+ this._entries.delete(stream);
97
+ }
98
+ async clear() {
99
+ this._entries.clear();
100
+ }
101
+ async dispose() {
102
+ this._entries.clear();
103
+ }
104
+ get size() {
105
+ return this._entries.size;
106
+ }
107
+ };
108
+
70
109
  // src/types/errors.ts
71
110
  var Errors = {
72
111
  ValidationError: "ERR_VALIDATION",
@@ -521,6 +560,9 @@ var SNAP_EVENT = "__snapshot__";
521
560
  var store = port(function store2(adapter) {
522
561
  return adapter || new InMemoryStore();
523
562
  });
563
+ var cache = port(function cache2(adapter) {
564
+ return adapter || new InMemoryCache();
565
+ });
524
566
  function build_tracer(logLevel2) {
525
567
  if (logLevel2 === "trace") {
526
568
  return {
@@ -622,11 +664,12 @@ async function snap(snapshot) {
622
664
  }
623
665
  }
624
666
  async function load(me, stream, callback) {
625
- let state2 = me.init ? me.init() : {};
626
- let patches = 0;
627
- let snaps = 0;
667
+ const cached = await cache().get(stream);
668
+ let state2 = cached?.state ?? (me.init ? me.init() : {});
669
+ let patches = cached?.patches ?? 0;
670
+ let snaps = cached?.snaps ?? 0;
628
671
  let event;
629
- await store().query(
672
+ const count = await store().query(
630
673
  (e) => {
631
674
  event = e;
632
675
  if (e.name === SNAP_EVENT) {
@@ -639,9 +682,12 @@ async function load(me, stream, callback) {
639
682
  }
640
683
  callback && callback({ event, state: state2, patches, snaps });
641
684
  },
642
- { stream, with_snaps: true }
685
+ { stream, with_snaps: !cached, after: cached?.event_id }
686
+ );
687
+ logger.trace(
688
+ state2,
689
+ `\u{1F7E2} load ${stream}${cached && count === 0 ? " (cached)" : ""}`
643
690
  );
644
- logger.trace(state2, `\u{1F7E2} load ${stream}`);
645
691
  return { event, state: state2, patches, snaps };
646
692
  }
647
693
  async function action(me, action2, target, payload, reactingTo, skipValidation = false) {
@@ -697,13 +743,21 @@ async function action(me, action2, target, payload, reactingTo, skipValidation =
697
743
  emitted.map((e) => e.data),
698
744
  `\u{1F534} commit ${stream}.${emitted.map((e) => e.name).join(", ")}`
699
745
  );
700
- const committed = await store().commit(
701
- stream,
702
- emitted,
703
- meta,
704
- // TODO: review reactions not enforcing expected version
705
- reactingTo ? void 0 : expected
706
- );
746
+ let committed;
747
+ try {
748
+ committed = await store().commit(
749
+ stream,
750
+ emitted,
751
+ meta,
752
+ // TODO: review reactions not enforcing expected version
753
+ reactingTo ? void 0 : expected
754
+ );
755
+ } catch (error) {
756
+ if (error.name === "ERR_CONCURRENCY") {
757
+ void cache().invalidate(stream);
758
+ }
759
+ throw error;
760
+ }
707
761
  let { state: state2, patches } = snapshot;
708
762
  const snapshots = committed.map((event) => {
709
763
  const p = me.patch[event.name](event, state2);
@@ -712,7 +766,15 @@ async function action(me, action2, target, payload, reactingTo, skipValidation =
712
766
  return { event, state: state2, patches, snaps: snapshot.snaps, patch: p };
713
767
  });
714
768
  const last = snapshots.at(-1);
715
- me.snap && me.snap(last) && void snap(last);
769
+ const snapped = me.snap && me.snap(last);
770
+ void cache().set(stream, {
771
+ state: last.state,
772
+ version: last.event.version,
773
+ event_id: last.event.id,
774
+ patches: snapped ? 0 : last.patches,
775
+ snaps: snapped ? last.snaps + 1 : last.snaps
776
+ });
777
+ if (snapped) void snap(last);
716
778
  return snapshots;
717
779
  }
718
780
 
@@ -1772,6 +1834,8 @@ function action_builder(state2) {
1772
1834
  Errors,
1773
1835
  EventMetaSchema,
1774
1836
  ExitCodes,
1837
+ InMemoryCache,
1838
+ InMemoryStore,
1775
1839
  InvariantError,
1776
1840
  LogLevels,
1777
1841
  PackageSchema,
@@ -1782,6 +1846,7 @@ function action_builder(state2) {
1782
1846
  ZodEmpty,
1783
1847
  act,
1784
1848
  build_tracer,
1849
+ cache,
1785
1850
  config,
1786
1851
  dispose,
1787
1852
  disposeAndExit,