@x12i/memorix-service 3.4.0 → 3.6.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.
Files changed (57) hide show
  1. package/README.md +1 -1
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +6 -0
  4. package/dist/app.js.map +1 -1
  5. package/dist/connector-ops/checkpoint-store.d.ts +7 -0
  6. package/dist/connector-ops/checkpoint-store.d.ts.map +1 -0
  7. package/dist/connector-ops/checkpoint-store.js +135 -0
  8. package/dist/connector-ops/checkpoint-store.js.map +1 -0
  9. package/dist/connector-ops/checkpoint-types.d.ts +46 -0
  10. package/dist/connector-ops/checkpoint-types.d.ts.map +1 -0
  11. package/dist/connector-ops/checkpoint-types.js +14 -0
  12. package/dist/connector-ops/checkpoint-types.js.map +1 -0
  13. package/dist/connector-ops/continuous-types.d.ts +141 -0
  14. package/dist/connector-ops/continuous-types.d.ts.map +1 -0
  15. package/dist/connector-ops/continuous-types.js +13 -0
  16. package/dist/connector-ops/continuous-types.js.map +1 -0
  17. package/dist/connector-ops/coordinator.d.ts +88 -0
  18. package/dist/connector-ops/coordinator.d.ts.map +1 -0
  19. package/dist/connector-ops/coordinator.js +174 -0
  20. package/dist/connector-ops/coordinator.js.map +1 -0
  21. package/dist/connector-ops/index.d.ts +6 -0
  22. package/dist/connector-ops/index.d.ts.map +1 -1
  23. package/dist/connector-ops/index.js +6 -0
  24. package/dist/connector-ops/index.js.map +1 -1
  25. package/dist/connector-ops/run-store.d.ts +16 -0
  26. package/dist/connector-ops/run-store.d.ts.map +1 -0
  27. package/dist/connector-ops/run-store.js +249 -0
  28. package/dist/connector-ops/run-store.js.map +1 -0
  29. package/dist/connector-ops/schedule-lease-store.d.ts +8 -0
  30. package/dist/connector-ops/schedule-lease-store.d.ts.map +1 -0
  31. package/dist/connector-ops/schedule-lease-store.js +318 -0
  32. package/dist/connector-ops/schedule-lease-store.js.map +1 -0
  33. package/dist/incremental-state/index.d.ts +3 -0
  34. package/dist/incremental-state/index.d.ts.map +1 -0
  35. package/dist/incremental-state/index.js +3 -0
  36. package/dist/incremental-state/index.js.map +1 -0
  37. package/dist/incremental-state/state-store.d.ts +7 -0
  38. package/dist/incremental-state/state-store.d.ts.map +1 -0
  39. package/dist/incremental-state/state-store.js +183 -0
  40. package/dist/incremental-state/state-store.js.map +1 -0
  41. package/dist/incremental-state/types.d.ts +104 -0
  42. package/dist/incremental-state/types.d.ts.map +1 -0
  43. package/dist/incremental-state/types.js +8 -0
  44. package/dist/incremental-state/types.js.map +1 -0
  45. package/dist/platform.d.ts +26 -1
  46. package/dist/platform.d.ts.map +1 -1
  47. package/dist/platform.js +111 -1
  48. package/dist/platform.js.map +1 -1
  49. package/dist/routes/continuous-acquisition.d.ts +5 -0
  50. package/dist/routes/continuous-acquisition.d.ts.map +1 -0
  51. package/dist/routes/continuous-acquisition.js +259 -0
  52. package/dist/routes/continuous-acquisition.js.map +1 -0
  53. package/dist/routes/incremental-state.d.ts +5 -0
  54. package/dist/routes/incremental-state.d.ts.map +1 -0
  55. package/dist/routes/incremental-state.js +173 -0
  56. package/dist/routes/incremental-state.js.map +1 -0
  57. package/package.json +1 -1
@@ -0,0 +1,318 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { ServiceError } from "../errors.js";
3
+ import { hasSecretPayload } from "./sanitize.js";
4
+ import { CONT_COLLECTIONS, DEFAULT_LEASE_TTL_MS, } from "./continuous-types.js";
5
+ function operationalDbName(orgId) {
6
+ return `${orgId}_operational`;
7
+ }
8
+ function stripMongo(doc) {
9
+ const { _id: _drop, ...rest } = doc;
10
+ return rest;
11
+ }
12
+ function streamKey(connectorId, instanceId, streamId) {
13
+ return `${connectorId}\0${instanceId}\0${streamId}`;
14
+ }
15
+ export function validatePutSchedule(body) {
16
+ if (hasSecretPayload(body)) {
17
+ throw new Error("schedule payload must not contain secrets");
18
+ }
19
+ const c = body.cadence;
20
+ if (!c || typeof c !== "object") {
21
+ throw new Error("cadence required");
22
+ }
23
+ if (c.kind === "interval") {
24
+ if (typeof c.intervalSeconds !== "number" ||
25
+ !Number.isFinite(c.intervalSeconds) ||
26
+ c.intervalSeconds < 1) {
27
+ throw new Error("cadence.intervalSeconds must be >= 1");
28
+ }
29
+ }
30
+ else if (c.kind === "cron") {
31
+ if (typeof c.expression !== "string" || !c.expression.trim()) {
32
+ throw new Error("cadence.expression required for cron");
33
+ }
34
+ }
35
+ else {
36
+ throw new Error("cadence.kind must be interval|cron");
37
+ }
38
+ }
39
+ export function createInMemoryStreamScheduleStore(orgId) {
40
+ const byKey = new Map();
41
+ return {
42
+ async get(connectorId, instanceId, streamId) {
43
+ const doc = byKey.get(streamKey(connectorId, instanceId, streamId));
44
+ return doc ? { ...doc } : null;
45
+ },
46
+ async put(connectorId, instanceId, streamId, body) {
47
+ validatePutSchedule(body);
48
+ const now = new Date().toISOString();
49
+ const doc = {
50
+ orgId,
51
+ connectorId,
52
+ instanceId,
53
+ streamId,
54
+ enabled: body.enabled !== false,
55
+ cadence: body.cadence,
56
+ ...(body.bounds != null ? { bounds: body.bounds } : {}),
57
+ updatedAt: now,
58
+ ...(body.updatedBy != null ? { updatedBy: body.updatedBy } : {}),
59
+ };
60
+ byKey.set(streamKey(connectorId, instanceId, streamId), doc);
61
+ return { ...doc };
62
+ },
63
+ async clear(connectorId, instanceId, streamId) {
64
+ return byKey.delete(streamKey(connectorId, instanceId, streamId));
65
+ },
66
+ async listEnabled(opts) {
67
+ return [...byKey.values()]
68
+ .filter((s) => s.enabled)
69
+ .filter((s) => opts?.connectorId ? s.connectorId === opts.connectorId : true)
70
+ .filter((s) => opts?.instanceId ? s.instanceId === opts.instanceId : true)
71
+ .map((s) => ({ ...s }));
72
+ },
73
+ };
74
+ }
75
+ export function createMongoStreamScheduleStore(client, orgId) {
76
+ const db = client.db(operationalDbName(orgId));
77
+ const col = () => db.collection(CONT_COLLECTIONS.schedules);
78
+ let indexesReady = null;
79
+ const ensureIndexes = async () => {
80
+ if (!indexesReady) {
81
+ indexesReady = (async () => {
82
+ await col().createIndex({ connectorId: 1, instanceId: 1, streamId: 1 }, { unique: true, name: "mco_stream_schedule_unique" });
83
+ await col().createIndex({ enabled: 1 }, { name: "mco_stream_schedule_enabled" });
84
+ })();
85
+ }
86
+ await indexesReady;
87
+ };
88
+ return {
89
+ async get(connectorId, instanceId, streamId) {
90
+ await ensureIndexes();
91
+ const doc = await col().findOne({ connectorId, instanceId, streamId });
92
+ return doc ? stripMongo(doc) : null;
93
+ },
94
+ async put(connectorId, instanceId, streamId, body) {
95
+ await ensureIndexes();
96
+ validatePutSchedule(body);
97
+ const now = new Date().toISOString();
98
+ const doc = {
99
+ orgId,
100
+ connectorId,
101
+ instanceId,
102
+ streamId,
103
+ enabled: body.enabled !== false,
104
+ cadence: body.cadence,
105
+ ...(body.bounds != null ? { bounds: body.bounds } : {}),
106
+ updatedAt: now,
107
+ ...(body.updatedBy != null ? { updatedBy: body.updatedBy } : {}),
108
+ };
109
+ await col().replaceOne({ connectorId, instanceId, streamId }, doc, { upsert: true });
110
+ return { ...doc };
111
+ },
112
+ async clear(connectorId, instanceId, streamId) {
113
+ await ensureIndexes();
114
+ const res = await col().deleteOne({ connectorId, instanceId, streamId });
115
+ return res.deletedCount > 0;
116
+ },
117
+ async listEnabled(opts) {
118
+ await ensureIndexes();
119
+ const filter = { enabled: true };
120
+ if (opts?.connectorId)
121
+ filter.connectorId = opts.connectorId;
122
+ if (opts?.instanceId)
123
+ filter.instanceId = opts.instanceId;
124
+ const rows = await col().find(filter).toArray();
125
+ return rows.map(stripMongo);
126
+ },
127
+ };
128
+ }
129
+ function isLeaseActive(lease, nowIso = new Date().toISOString()) {
130
+ return lease.expiresAt > nowIso;
131
+ }
132
+ export function createInMemoryStreamLeaseStore(orgId) {
133
+ const byKey = new Map();
134
+ return {
135
+ async get(connectorId, instanceId, streamId) {
136
+ const doc = byKey.get(streamKey(connectorId, instanceId, streamId));
137
+ if (!doc || !isLeaseActive(doc)) {
138
+ if (doc && !isLeaseActive(doc)) {
139
+ byKey.delete(streamKey(connectorId, instanceId, streamId));
140
+ }
141
+ return null;
142
+ }
143
+ return { ...doc };
144
+ },
145
+ async acquire(connectorId, instanceId, streamId, input) {
146
+ const k = streamKey(connectorId, instanceId, streamId);
147
+ const existing = byKey.get(k);
148
+ const now = Date.now();
149
+ const nowIso = new Date(now).toISOString();
150
+ if (existing && isLeaseActive(existing, nowIso)) {
151
+ if (existing.ownerId === input.ownerId) {
152
+ return renewInMemory(byKey, orgId, connectorId, instanceId, streamId, {
153
+ ownerId: input.ownerId,
154
+ leaseId: existing.leaseId,
155
+ ttlMs: input.ttlMs,
156
+ });
157
+ }
158
+ throw new ServiceError("LEASE_HELD", `stream lease held by ${existing.ownerId} until ${existing.expiresAt}`, 409, { lease: existing });
159
+ }
160
+ const ttl = input.ttlMs ?? DEFAULT_LEASE_TTL_MS;
161
+ const doc = {
162
+ orgId,
163
+ connectorId,
164
+ instanceId,
165
+ streamId,
166
+ ownerId: input.ownerId,
167
+ leaseId: randomUUID(),
168
+ acquiredAt: nowIso,
169
+ expiresAt: new Date(now + ttl).toISOString(),
170
+ renewCount: 0,
171
+ };
172
+ byKey.set(k, doc);
173
+ return { ...doc };
174
+ },
175
+ async renew(connectorId, instanceId, streamId, input) {
176
+ return renewInMemory(byKey, orgId, connectorId, instanceId, streamId, input);
177
+ },
178
+ async release(connectorId, instanceId, streamId, input) {
179
+ const k = streamKey(connectorId, instanceId, streamId);
180
+ const existing = byKey.get(k);
181
+ if (!existing)
182
+ return false;
183
+ if (existing.ownerId !== input.ownerId ||
184
+ existing.leaseId !== input.leaseId) {
185
+ throw new ServiceError("LEASE_OWNER_MISMATCH", "lease release requires matching ownerId and leaseId", 403);
186
+ }
187
+ return byKey.delete(k);
188
+ },
189
+ };
190
+ }
191
+ function renewInMemory(byKey, orgId, connectorId, instanceId, streamId, input) {
192
+ const k = streamKey(connectorId, instanceId, streamId);
193
+ const existing = byKey.get(k);
194
+ const now = Date.now();
195
+ const nowIso = new Date(now).toISOString();
196
+ if (!existing || !isLeaseActive(existing, nowIso)) {
197
+ throw new ServiceError("LEASE_NOT_FOUND", "no active lease to renew", 404);
198
+ }
199
+ if (existing.ownerId !== input.ownerId ||
200
+ existing.leaseId !== input.leaseId) {
201
+ throw new ServiceError("LEASE_OWNER_MISMATCH", "lease renew requires matching ownerId and leaseId", 403);
202
+ }
203
+ const ttl = input.ttlMs ?? DEFAULT_LEASE_TTL_MS;
204
+ const doc = {
205
+ ...existing,
206
+ orgId,
207
+ expiresAt: new Date(now + ttl).toISOString(),
208
+ renewCount: existing.renewCount + 1,
209
+ };
210
+ byKey.set(k, doc);
211
+ return { ...doc };
212
+ }
213
+ export function createMongoStreamLeaseStore(client, orgId) {
214
+ const db = client.db(operationalDbName(orgId));
215
+ const col = () => db.collection(CONT_COLLECTIONS.leases);
216
+ let indexesReady = null;
217
+ const ensureIndexes = async () => {
218
+ if (!indexesReady) {
219
+ indexesReady = (async () => {
220
+ await col().createIndex({ connectorId: 1, instanceId: 1, streamId: 1 }, { unique: true, name: "mco_stream_lease_unique" });
221
+ })();
222
+ }
223
+ await indexesReady;
224
+ };
225
+ return {
226
+ async get(connectorId, instanceId, streamId) {
227
+ await ensureIndexes();
228
+ const doc = await col().findOne({ connectorId, instanceId, streamId });
229
+ if (!doc)
230
+ return null;
231
+ if (!isLeaseActive(doc)) {
232
+ await col().deleteOne({ connectorId, instanceId, streamId });
233
+ return null;
234
+ }
235
+ return stripMongo(doc);
236
+ },
237
+ async acquire(connectorId, instanceId, streamId, input) {
238
+ await ensureIndexes();
239
+ const existing = await col().findOne({
240
+ connectorId,
241
+ instanceId,
242
+ streamId,
243
+ });
244
+ const now = Date.now();
245
+ const nowIso = new Date(now).toISOString();
246
+ if (existing && isLeaseActive(existing, nowIso)) {
247
+ if (existing.ownerId === input.ownerId) {
248
+ return this.renew(connectorId, instanceId, streamId, {
249
+ ownerId: input.ownerId,
250
+ leaseId: existing.leaseId,
251
+ ttlMs: input.ttlMs,
252
+ });
253
+ }
254
+ throw new ServiceError("LEASE_HELD", `stream lease held by ${existing.ownerId} until ${existing.expiresAt}`, 409, { lease: stripMongo(existing) });
255
+ }
256
+ const ttl = input.ttlMs ?? DEFAULT_LEASE_TTL_MS;
257
+ const doc = {
258
+ orgId,
259
+ connectorId,
260
+ instanceId,
261
+ streamId,
262
+ ownerId: input.ownerId,
263
+ leaseId: randomUUID(),
264
+ acquiredAt: nowIso,
265
+ expiresAt: new Date(now + ttl).toISOString(),
266
+ renewCount: 0,
267
+ };
268
+ await col().replaceOne({ connectorId, instanceId, streamId }, doc, { upsert: true });
269
+ return { ...doc };
270
+ },
271
+ async renew(connectorId, instanceId, streamId, input) {
272
+ await ensureIndexes();
273
+ const existing = await col().findOne({
274
+ connectorId,
275
+ instanceId,
276
+ streamId,
277
+ });
278
+ const now = Date.now();
279
+ const nowIso = new Date(now).toISOString();
280
+ if (!existing || !isLeaseActive(existing, nowIso)) {
281
+ throw new ServiceError("LEASE_NOT_FOUND", "no active lease to renew", 404);
282
+ }
283
+ if (existing.ownerId !== input.ownerId ||
284
+ existing.leaseId !== input.leaseId) {
285
+ throw new ServiceError("LEASE_OWNER_MISMATCH", "lease renew requires matching ownerId and leaseId", 403);
286
+ }
287
+ const ttl = input.ttlMs ?? DEFAULT_LEASE_TTL_MS;
288
+ const doc = {
289
+ ...stripMongo(existing),
290
+ expiresAt: new Date(now + ttl).toISOString(),
291
+ renewCount: existing.renewCount + 1,
292
+ };
293
+ await col().replaceOne({ connectorId, instanceId, streamId }, doc);
294
+ return { ...doc };
295
+ },
296
+ async release(connectorId, instanceId, streamId, input) {
297
+ await ensureIndexes();
298
+ const existing = await col().findOne({
299
+ connectorId,
300
+ instanceId,
301
+ streamId,
302
+ });
303
+ if (!existing)
304
+ return false;
305
+ if (existing.ownerId !== input.ownerId ||
306
+ existing.leaseId !== input.leaseId) {
307
+ throw new ServiceError("LEASE_OWNER_MISMATCH", "lease release requires matching ownerId and leaseId", 403);
308
+ }
309
+ const res = await col().deleteOne({
310
+ connectorId,
311
+ instanceId,
312
+ streamId,
313
+ });
314
+ return res.deletedCount > 0;
315
+ },
316
+ };
317
+ }
318
+ //# sourceMappingURL=schedule-lease-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-lease-store.js","sourceRoot":"","sources":["../../src/connector-ops/schedule-lease-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export { createInMemoryIncrementalStateStore, createMongoIncrementalStateStore, } from "./state-store.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/incremental-state/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,mCAAmC,EACnC,gCAAgC,GACjC,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export { createInMemoryIncrementalStateStore, createMongoIncrementalStateStore, } from "./state-store.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/incremental-state/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,mCAAmC,EACnC,gCAAgC,GACjC,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { MongoClient } from "mongodb";
2
+ import type { BlobObjectStore } from "../blob-store/types.js";
3
+ import { type IncrementalStateStore } from "./types.js";
4
+ export declare function createInMemoryIncrementalStateStore(orgId: string, blobs: BlobObjectStore): IncrementalStateStore;
5
+ export declare function createMongoIncrementalStateStore(client: MongoClient, orgId: string, blobs: BlobObjectStore): IncrementalStateStore;
6
+ export * from "./types.js";
7
+ //# sourceMappingURL=state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/incremental-state/state-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;AAiIpB,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,GACrB,qBAAqB,CAiCvB;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,GACrB,qBAAqB,CAyEvB;AAED,cAAc,YAAY,CAAC"}
@@ -0,0 +1,183 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { ServiceError } from "../errors.js";
3
+ import { INC_COLLECTIONS, } from "./types.js";
4
+ function operationalDbName(orgId) {
5
+ return `${orgId}_operational`;
6
+ }
7
+ function sha256Hex(buf) {
8
+ return createHash("sha256").update(buf).digest("hex");
9
+ }
10
+ function nextEtag(version) {
11
+ return `W/"inc-${version}-${randomUUID().slice(0, 8)}"`;
12
+ }
13
+ function stripMongo(doc) {
14
+ const { _id: _drop, ...rest } = doc;
15
+ return rest;
16
+ }
17
+ function createCore(orgId, blobs, meta) {
18
+ return {
19
+ async get(instanceId, scopeKey) {
20
+ return meta.get(instanceId, scopeKey);
21
+ },
22
+ async getContent(instanceId, scopeKey) {
23
+ const m = await meta.get(instanceId, scopeKey);
24
+ if (!m?.blobKey)
25
+ return null;
26
+ const body = await blobs.get(orgId, m.blobKey);
27
+ if (!body)
28
+ return null;
29
+ return { meta: m, body };
30
+ },
31
+ async casPublish(instanceId, scopeKey, input) {
32
+ if (!input.bodyBase64?.trim()) {
33
+ throw new ServiceError("VALIDATION_ERROR", "bodyBase64 required", 400);
34
+ }
35
+ let plain;
36
+ try {
37
+ plain = Buffer.from(input.bodyBase64, "base64");
38
+ }
39
+ catch {
40
+ throw new ServiceError("VALIDATION_ERROR", "bodyBase64 invalid", 400);
41
+ }
42
+ if (plain.byteLength === 0) {
43
+ throw new ServiceError("VALIDATION_ERROR", "body empty", 400);
44
+ }
45
+ const current = await meta.get(instanceId, scopeKey);
46
+ const currentVersion = current?.baseVersion ?? 0;
47
+ if (currentVersion !== input.expectedBaseVersion) {
48
+ throw new ServiceError("BASE_VERSION_CONFLICT", `stale baseVersion: expected ${input.expectedBaseVersion}, got ${currentVersion}`, 409, { currentVersion, etag: current?.etag });
49
+ }
50
+ if (input.incomplete === true || input.shrinkGuardFailed === true) {
51
+ // Persist flags but still allow publish of snapshot; removals are
52
+ // worker-side. Memorix records the incomplete/shrink markers.
53
+ }
54
+ const contentHash = input.contentHash?.trim() || sha256Hex(plain);
55
+ const artifactRef = current?.artifactRef ??
56
+ `inc_${randomUUID().replace(/-/g, "").slice(0, 24)}`;
57
+ const blobKey = `incremental/${instanceId}/${scopeKey}/${artifactRef}`;
58
+ await blobs.put(orgId, blobKey, plain, {
59
+ contentType: input.contentType ?? "application/json",
60
+ });
61
+ const nextVersion = currentVersion + 1;
62
+ const now = new Date().toISOString();
63
+ const doc = {
64
+ orgId,
65
+ instanceId,
66
+ scopeKey,
67
+ baseVersion: nextVersion,
68
+ etag: nextEtag(nextVersion),
69
+ artifactRef,
70
+ contentHash,
71
+ updatedAt: now,
72
+ producerRunId: input.producerRunId,
73
+ incomplete: input.incomplete === true,
74
+ shrinkGuardFailed: input.shrinkGuardFailed === true,
75
+ tombstones: input.tombstones ?? [],
76
+ contentType: input.contentType ?? "application/json",
77
+ sizeBytes: plain.byteLength,
78
+ blobKey,
79
+ blobBackend: blobs.backend,
80
+ };
81
+ await meta.upsert(doc);
82
+ return doc;
83
+ },
84
+ async listApplyLedger(instanceId, scopeKey, opts) {
85
+ return meta.listLedger(instanceId, scopeKey, opts?.limit ?? 50);
86
+ },
87
+ async getApplyByRunId(instanceId, scopeKey, runId) {
88
+ return meta.getLedgerByRun(instanceId, scopeKey, runId);
89
+ },
90
+ async recordApply(entry) {
91
+ await meta.insertLedger(entry);
92
+ return entry;
93
+ },
94
+ };
95
+ }
96
+ export function createInMemoryIncrementalStateStore(orgId, blobs) {
97
+ const refs = new Map();
98
+ const ledger = [];
99
+ const key = (instanceId, scopeKey) => `${instanceId}\0${scopeKey}`;
100
+ return createCore(orgId, blobs, {
101
+ async get(instanceId, scopeKey) {
102
+ const doc = refs.get(key(instanceId, scopeKey));
103
+ return doc ? { ...doc } : null;
104
+ },
105
+ async upsert(doc) {
106
+ refs.set(key(doc.instanceId, doc.scopeKey), { ...doc });
107
+ },
108
+ async insertLedger(entry) {
109
+ ledger.unshift({ ...entry });
110
+ },
111
+ async listLedger(instanceId, scopeKey, limit) {
112
+ return ledger
113
+ .filter((e) => e.instanceId === instanceId && e.scopeKey === scopeKey)
114
+ .slice(0, limit)
115
+ .map((e) => ({ ...e }));
116
+ },
117
+ async getLedgerByRun(instanceId, scopeKey, runId) {
118
+ const e = ledger.find((x) => x.instanceId === instanceId &&
119
+ x.scopeKey === scopeKey &&
120
+ x.runId === runId);
121
+ return e ? { ...e } : null;
122
+ },
123
+ });
124
+ }
125
+ export function createMongoIncrementalStateStore(client, orgId, blobs) {
126
+ const db = client.db(operationalDbName(orgId));
127
+ const stateCol = () => db.collection(INC_COLLECTIONS.state);
128
+ const ledgerCol = () => db.collection(INC_COLLECTIONS.applyLedger);
129
+ let indexesReady = null;
130
+ const ensureIndexes = async () => {
131
+ if (!indexesReady) {
132
+ indexesReady = (async () => {
133
+ await stateCol().createIndex({ instanceId: 1, scopeKey: 1 }, { unique: true, name: "inc_state_unique" });
134
+ await ledgerCol().createIndex({ instanceId: 1, scopeKey: 1, runId: 1 }, { unique: true, name: "inc_apply_run_unique" });
135
+ await ledgerCol().createIndex({ instanceId: 1, scopeKey: 1, at: -1 }, { name: "inc_apply_at" });
136
+ })();
137
+ }
138
+ await indexesReady;
139
+ };
140
+ return createCore(orgId, blobs, {
141
+ async get(instanceId, scopeKey) {
142
+ await ensureIndexes();
143
+ const doc = await stateCol().findOne({ instanceId, scopeKey });
144
+ return doc ? stripMongo(doc) : null;
145
+ },
146
+ async upsert(doc) {
147
+ await ensureIndexes();
148
+ await stateCol().replaceOne({ instanceId: doc.instanceId, scopeKey: doc.scopeKey }, doc, { upsert: true });
149
+ },
150
+ async insertLedger(entry) {
151
+ await ensureIndexes();
152
+ try {
153
+ await ledgerCol().insertOne(entry);
154
+ }
155
+ catch (err) {
156
+ const code = err && typeof err === "object" && "code" in err
157
+ ? err.code
158
+ : undefined;
159
+ if (code === 11000) {
160
+ // idempotent replay
161
+ return;
162
+ }
163
+ throw err;
164
+ }
165
+ },
166
+ async listLedger(instanceId, scopeKey, limit) {
167
+ await ensureIndexes();
168
+ const rows = await ledgerCol()
169
+ .find({ instanceId, scopeKey })
170
+ .sort({ at: -1 })
171
+ .limit(limit)
172
+ .toArray();
173
+ return rows.map(stripMongo);
174
+ },
175
+ async getLedgerByRun(instanceId, scopeKey, runId) {
176
+ await ensureIndexes();
177
+ const doc = await ledgerCol().findOne({ instanceId, scopeKey, runId });
178
+ return doc ? stripMongo(doc) : null;
179
+ },
180
+ });
181
+ }
182
+ export * from "./types.js";
183
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/incremental-state/state-store.ts"],"names":[],"mappings":"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"}