@rotorsoft/act 0.19.0 → 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.
- package/README.md +73 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/adapters/InMemoryCache.d.ts +29 -0
- package/dist/@types/adapters/InMemoryCache.d.ts.map +1 -0
- package/dist/@types/adapters/index.d.ts +3 -0
- package/dist/@types/adapters/index.d.ts.map +1 -0
- package/dist/@types/event-sourcing.d.ts +4 -0
- package/dist/@types/event-sourcing.d.ts.map +1 -1
- package/dist/@types/index.d.ts +1 -0
- package/dist/@types/index.d.ts.map +1 -1
- package/dist/@types/ports.d.ts +14 -1
- package/dist/@types/ports.d.ts.map +1 -1
- package/dist/@types/types/ports.d.ts +27 -1
- package/dist/@types/types/ports.d.ts.map +1 -1
- package/dist/index.cjs +79 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +76 -14
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -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 @@
|
|
|
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
|
|
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"}
|
package/dist/@types/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/@types/ports.d.ts
CHANGED
|
@@ -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":"
|
|
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
|
-
|
|
626
|
-
let
|
|
627
|
-
let
|
|
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:
|
|
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
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
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)
|
|
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,
|