local-serverless-stack 0.6.0 → 0.8.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/CHANGELOG.md +54 -0
- package/README.md +99 -11
- package/bin/cli.js +31 -3
- package/dist/server/engine/backends/localstack-backend.d.ts +25 -0
- package/dist/server/engine/backends/localstack-backend.d.ts.map +1 -0
- package/dist/server/engine/backends/localstack-backend.js +199 -0
- package/dist/server/engine/backends/localstack-backend.js.map +1 -0
- package/dist/server/engine/backends/self-backend.d.ts +32 -0
- package/dist/server/engine/backends/self-backend.d.ts.map +1 -0
- package/dist/server/engine/backends/self-backend.js +205 -0
- package/dist/server/engine/backends/self-backend.js.map +1 -0
- package/dist/server/engine/bus.d.ts +10 -0
- package/dist/server/engine/bus.d.ts.map +1 -0
- package/dist/server/engine/bus.js +24 -0
- package/dist/server/engine/bus.js.map +1 -0
- package/dist/server/engine/dispatch/dispatcher.d.ts +46 -0
- package/dist/server/engine/dispatch/dispatcher.d.ts.map +1 -0
- package/dist/server/engine/dispatch/dispatcher.js +312 -0
- package/dist/server/engine/dispatch/dispatcher.js.map +1 -0
- package/dist/server/engine/dispatch/scheduler.d.ts +47 -0
- package/dist/server/engine/dispatch/scheduler.d.ts.map +1 -0
- package/dist/server/engine/dispatch/scheduler.js +328 -0
- package/dist/server/engine/dispatch/scheduler.js.map +1 -0
- package/dist/server/engine/dispatch/sqs-poller.d.ts +25 -0
- package/dist/server/engine/dispatch/sqs-poller.d.ts.map +1 -0
- package/dist/server/engine/dispatch/sqs-poller.js +242 -0
- package/dist/server/engine/dispatch/sqs-poller.js.map +1 -0
- package/dist/server/engine/dispatch/stream-tailer.d.ts +22 -0
- package/dist/server/engine/dispatch/stream-tailer.d.ts.map +1 -0
- package/dist/server/engine/dispatch/stream-tailer.js +205 -0
- package/dist/server/engine/dispatch/stream-tailer.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts +5 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.js +91 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts +24 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js +183 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts +29 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js +12 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts +13 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.js +244 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts +11 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.js +109 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts +23 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js +541 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts +46 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/index.js +572 -0
- package/dist/server/engine/emulators/dynamodb/index.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/query.d.ts +12 -0
- package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/query.js +237 -0
- package/dist/server/engine/emulators/dynamodb/query.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/schema.d.ts +58 -0
- package/dist/server/engine/emulators/dynamodb/schema.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/schema.js +284 -0
- package/dist/server/engine/emulators/dynamodb/schema.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/streams.d.ts +28 -0
- package/dist/server/engine/emulators/dynamodb/streams.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/streams.js +100 -0
- package/dist/server/engine/emulators/dynamodb/streams.js.map +1 -0
- package/dist/server/engine/emulators/events/index.d.ts +53 -0
- package/dist/server/engine/emulators/events/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/events/index.js +417 -0
- package/dist/server/engine/emulators/events/index.js.map +1 -0
- package/dist/server/engine/emulators/events/pattern.d.ts +3 -0
- package/dist/server/engine/emulators/events/pattern.d.ts.map +1 -0
- package/dist/server/engine/emulators/events/pattern.js +125 -0
- package/dist/server/engine/emulators/events/pattern.js.map +1 -0
- package/dist/server/engine/emulators/lambda-ctl/index.d.ts +55 -0
- package/dist/server/engine/emulators/lambda-ctl/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/lambda-ctl/index.js +461 -0
- package/dist/server/engine/emulators/lambda-ctl/index.js.map +1 -0
- package/dist/server/engine/emulators/s3/index.d.ts +45 -0
- package/dist/server/engine/emulators/s3/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/s3/index.js +591 -0
- package/dist/server/engine/emulators/s3/index.js.map +1 -0
- package/dist/server/engine/emulators/sns/index.d.ts +22 -0
- package/dist/server/engine/emulators/sns/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/sns/index.js +135 -0
- package/dist/server/engine/emulators/sns/index.js.map +1 -0
- package/dist/server/engine/emulators/sqs/index.d.ts +66 -0
- package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/index.js +552 -0
- package/dist/server/engine/emulators/sqs/index.js.map +1 -0
- package/dist/server/engine/emulators/sqs/md5.d.ts +8 -0
- package/dist/server/engine/emulators/sqs/md5.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/md5.js +36 -0
- package/dist/server/engine/emulators/sqs/md5.js.map +1 -0
- package/dist/server/engine/emulators/sqs/queue.d.ts +105 -0
- package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/queue.js +371 -0
- package/dist/server/engine/emulators/sqs/queue.js.map +1 -0
- package/dist/server/engine/emulators/sts.d.ts +8 -0
- package/dist/server/engine/emulators/sts.d.ts.map +1 -0
- package/dist/server/engine/emulators/sts.js +23 -0
- package/dist/server/engine/emulators/sts.js.map +1 -0
- package/dist/server/engine/engine-backend.d.ts +17 -0
- package/dist/server/engine/engine-backend.d.ts.map +1 -0
- package/dist/server/engine/engine-backend.js +7 -0
- package/dist/server/engine/engine-backend.js.map +1 -0
- package/dist/server/engine/engine-manager.d.ts +22 -0
- package/dist/server/engine/engine-manager.d.ts.map +1 -0
- package/dist/server/engine/engine-manager.js +74 -0
- package/dist/server/engine/engine-manager.js.map +1 -0
- package/dist/server/engine/http/aws-chunked.d.ts +3 -0
- package/dist/server/engine/http/aws-chunked.d.ts.map +1 -0
- package/dist/server/engine/http/aws-chunked.js +50 -0
- package/dist/server/engine/http/aws-chunked.js.map +1 -0
- package/dist/server/engine/http/errors.d.ts +20 -0
- package/dist/server/engine/http/errors.d.ts.map +1 -0
- package/dist/server/engine/http/errors.js +43 -0
- package/dist/server/engine/http/errors.js.map +1 -0
- package/dist/server/engine/http/protocols/aws-json.d.ts +8 -0
- package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -0
- package/dist/server/engine/http/protocols/aws-json.js +42 -0
- package/dist/server/engine/http/protocols/aws-json.js.map +1 -0
- package/dist/server/engine/http/protocols/query-xml.d.ts +7 -0
- package/dist/server/engine/http/protocols/query-xml.d.ts.map +1 -0
- package/dist/server/engine/http/protocols/query-xml.js +35 -0
- package/dist/server/engine/http/protocols/query-xml.js.map +1 -0
- package/dist/server/engine/http/router.d.ts +8 -0
- package/dist/server/engine/http/router.d.ts.map +1 -0
- package/dist/server/engine/http/router.js +391 -0
- package/dist/server/engine/http/router.js.map +1 -0
- package/dist/server/engine/http/sigv4.d.ts +9 -0
- package/dist/server/engine/http/sigv4.d.ts.map +1 -0
- package/dist/server/engine/http/sigv4.js +33 -0
- package/dist/server/engine/http/sigv4.js.map +1 -0
- package/dist/server/engine/http/xml.d.ts +16 -0
- package/dist/server/engine/http/xml.d.ts.map +1 -0
- package/dist/server/engine/http/xml.js +92 -0
- package/dist/server/engine/http/xml.js.map +1 -0
- package/dist/server/engine/store/atomic.d.ts +4 -0
- package/dist/server/engine/store/atomic.d.ts.map +1 -0
- package/dist/server/engine/store/atomic.js +35 -0
- package/dist/server/engine/store/atomic.js.map +1 -0
- package/dist/server/engine/store/engine-store.d.ts +9 -0
- package/dist/server/engine/store/engine-store.d.ts.map +1 -0
- package/dist/server/engine/store/engine-store.js +218 -0
- package/dist/server/engine/store/engine-store.js.map +1 -0
- package/dist/server/engine/store/store-types.d.ts +37 -0
- package/dist/server/engine/store/store-types.d.ts.map +1 -0
- package/dist/server/engine/store/store-types.js +17 -0
- package/dist/server/engine/store/store-types.js.map +1 -0
- package/dist/server/engine/store/wal.d.ts +49 -0
- package/dist/server/engine/store/wal.d.ts.map +1 -0
- package/dist/server/engine/store/wal.js +328 -0
- package/dist/server/engine/store/wal.js.map +1 -0
- package/dist/server/engine/types.d.ts +137 -0
- package/dist/server/engine/types.d.ts.map +1 -0
- package/dist/server/engine/types.js +8 -0
- package/dist/server/engine/types.js.map +1 -0
- package/dist/server/index.js +12 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/services.d.ts.map +1 -1
- package/dist/server/routes/services.js +2 -0
- package/dist/server/routes/services.js.map +1 -1
- package/dist/server/services/cloudformation-parser.d.ts +26 -2
- package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
- package/dist/server/services/cloudformation-parser.js +60 -3
- package/dist/server/services/cloudformation-parser.js.map +1 -1
- package/dist/server/services/config-manager.d.ts +27 -0
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +67 -7
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/localstack-manager.d.ts +0 -7
- package/dist/server/services/localstack-manager.d.ts.map +1 -1
- package/dist/server/services/localstack-manager.js +11 -173
- package/dist/server/services/localstack-manager.js.map +1 -1
- package/dist/server/services/resource-provisioner.d.ts +6 -0
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +171 -7
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/service-registrar.js +2 -2
- package/dist/server/services/service-registrar.js.map +1 -1
- package/dist/ui/assets/ApisPage-a9i2qD0Z.js +1 -0
- package/dist/ui/assets/BucketDetailPage-Cz27N0KV.js +1 -0
- package/dist/ui/assets/BucketsPage-CZ7wGmUN.js +1 -0
- package/dist/ui/assets/{DynamoPage-B1__Rjr2.js → DynamoPage-BZMs1iW8.js} +1 -1
- package/dist/ui/assets/DynamoTablePage-BQsGkhtO.js +3 -0
- package/dist/ui/assets/LambdaDetailPage-DJb7xqRB.js +4 -0
- package/dist/ui/assets/LambdasPage-Ctg1l-Lg.js +1 -0
- package/dist/ui/assets/OverviewPage-DiijblCA.js +1 -0
- package/dist/ui/assets/QueueDetailPage-DRpSqost.js +1 -0
- package/dist/ui/assets/QueuesPage-CY0bDGwV.js +1 -0
- package/dist/ui/assets/ServiceDetailPage-CYTEdtts.js +2 -0
- package/dist/ui/assets/ServicesPage-OlV_rr-q.js +2 -0
- package/dist/ui/assets/index-C1KdKPDS.css +1 -0
- package/dist/ui/assets/index-DA_C1HOg.js +36 -0
- package/dist/ui/index.html +2 -2
- package/package.json +2 -1
- package/dist/ui/assets/ApisPage-DdgKjEdS.js +0 -1
- package/dist/ui/assets/BucketDetailPage-DZQGxm0y.js +0 -1
- package/dist/ui/assets/BucketsPage-xYXzxCvd.js +0 -1
- package/dist/ui/assets/DynamoTablePage-BCoxPdXW.js +0 -3
- package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +0 -4
- package/dist/ui/assets/LambdasPage-_TtxQMT_.js +0 -1
- package/dist/ui/assets/OverviewPage-CqTKTY64.js +0 -1
- package/dist/ui/assets/QueueDetailPage-BOr_sImA.js +0 -1
- package/dist/ui/assets/QueuesPage-DpByfcM5.js +0 -1
- package/dist/ui/assets/ServiceDetailPage-DsWgV-ad.js +0 -2
- package/dist/ui/assets/ServicesPage-CGlpsj98.js +0 -2
- package/dist/ui/assets/index-BWlB542w.js +0 -36
- package/dist/ui/assets/index-EYnsoJOq.css +0 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EngineStore } from './store-types.js';
|
|
2
|
+
export interface EngineStoreOptions {
|
|
3
|
+
dataDir: string;
|
|
4
|
+
idleUnloadMs: number;
|
|
5
|
+
memoryBudgetMb: number;
|
|
6
|
+
fsync: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function createEngineStore(options: EngineStoreOptions): EngineStore;
|
|
9
|
+
//# sourceMappingURL=engine-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-store.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/store/engine-store.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAgB,WAAW,EAAa,MAAM,kBAAkB,CAAC;AAO7E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAE1E"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// EngineStore: the persistence layer of the self engine.
|
|
2
|
+
//
|
|
3
|
+
// catalogs — one JSON file each, atomically rewritten on a 20 ms debounce
|
|
4
|
+
// tables — JSONL snapshot + WAL (see wal.ts), hydrated on demand
|
|
5
|
+
// blobs — sha256 content-addressed files (S3 bodies), never in the heap
|
|
6
|
+
//
|
|
7
|
+
// Residency governance lives here: after any hydrate the summed approxBytes
|
|
8
|
+
// of hydrated tables is forced under memoryBudgetMb by dehydrating the
|
|
9
|
+
// least-recently-touched tables, and a single unref'd 60 s sweep dehydrates
|
|
10
|
+
// tables idle past idleUnloadMs. See docs/PRD_SELF_ENGINE.md §RF7.
|
|
11
|
+
import crypto from 'crypto';
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
import fsp from 'fs/promises';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { atomicWriteFile } from './atomic.js';
|
|
16
|
+
import { JsonlItemTable } from './wal.js';
|
|
17
|
+
const CATALOG_FLUSH_DEBOUNCE_MS = 20;
|
|
18
|
+
const SWEEP_INTERVAL_MS = 60_000;
|
|
19
|
+
export function createEngineStore(options) {
|
|
20
|
+
return new FileEngineStore(options);
|
|
21
|
+
}
|
|
22
|
+
class JsonCatalog {
|
|
23
|
+
filePath;
|
|
24
|
+
fsync;
|
|
25
|
+
map = new Map();
|
|
26
|
+
loadPromise = null;
|
|
27
|
+
dirty = false;
|
|
28
|
+
timer = null;
|
|
29
|
+
// Serializes rewrites; kept always-resolved (failures are logged) so a bad
|
|
30
|
+
// write never wedges later flushes.
|
|
31
|
+
writeChain = Promise.resolve();
|
|
32
|
+
constructor(filePath, fsync) {
|
|
33
|
+
this.filePath = filePath;
|
|
34
|
+
this.fsync = fsync;
|
|
35
|
+
}
|
|
36
|
+
load() {
|
|
37
|
+
this.loadPromise ??= this.doLoad();
|
|
38
|
+
return this.loadPromise;
|
|
39
|
+
}
|
|
40
|
+
get(key) {
|
|
41
|
+
return this.map.get(key);
|
|
42
|
+
}
|
|
43
|
+
set(key, value) {
|
|
44
|
+
this.map.set(key, value);
|
|
45
|
+
this.markDirty();
|
|
46
|
+
}
|
|
47
|
+
delete(key) {
|
|
48
|
+
const existed = this.map.delete(key);
|
|
49
|
+
if (existed)
|
|
50
|
+
this.markDirty();
|
|
51
|
+
return existed;
|
|
52
|
+
}
|
|
53
|
+
keys() {
|
|
54
|
+
return [...this.map.keys()];
|
|
55
|
+
}
|
|
56
|
+
values() {
|
|
57
|
+
return [...this.map.values()];
|
|
58
|
+
}
|
|
59
|
+
async flush() {
|
|
60
|
+
if (this.timer) {
|
|
61
|
+
clearTimeout(this.timer);
|
|
62
|
+
this.timer = null;
|
|
63
|
+
}
|
|
64
|
+
await this.queueWrite();
|
|
65
|
+
}
|
|
66
|
+
async doLoad() {
|
|
67
|
+
let raw;
|
|
68
|
+
try {
|
|
69
|
+
raw = await fsp.readFile(this.filePath, 'utf8');
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err.code === 'ENOENT')
|
|
73
|
+
return; // first boot
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const parsed = JSON.parse(raw);
|
|
78
|
+
this.map = new Map(Object.entries(parsed));
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
// Ground truth (CFN + seeds) is regenerable; a corrupt catalog should
|
|
82
|
+
// not brick the engine.
|
|
83
|
+
console.warn(`[engine-store] ignoring unreadable catalog ${this.filePath}:`, err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
markDirty() {
|
|
87
|
+
this.dirty = true;
|
|
88
|
+
if (this.timer)
|
|
89
|
+
return;
|
|
90
|
+
this.timer = setTimeout(() => {
|
|
91
|
+
this.timer = null;
|
|
92
|
+
void this.queueWrite().catch(() => undefined); // logged via writeChain
|
|
93
|
+
}, CATALOG_FLUSH_DEBOUNCE_MS);
|
|
94
|
+
this.timer.unref();
|
|
95
|
+
}
|
|
96
|
+
queueWrite() {
|
|
97
|
+
if (!this.dirty)
|
|
98
|
+
return this.writeChain;
|
|
99
|
+
this.dirty = false;
|
|
100
|
+
const data = JSON.stringify(Object.fromEntries(this.map), null, 2) + '\n';
|
|
101
|
+
const next = this.writeChain.then(() => atomicWriteFile(this.filePath, data, this.fsync));
|
|
102
|
+
this.writeChain = next.catch((err) => {
|
|
103
|
+
console.warn(`[engine-store] catalog write failed for ${this.filePath}:`, err);
|
|
104
|
+
});
|
|
105
|
+
return next;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
class FileEngineStore {
|
|
109
|
+
dataDir;
|
|
110
|
+
idleUnloadMs;
|
|
111
|
+
budgetBytes;
|
|
112
|
+
fsync;
|
|
113
|
+
catalogs = new Map();
|
|
114
|
+
tables = new Map();
|
|
115
|
+
sweepTimer = null;
|
|
116
|
+
constructor(options) {
|
|
117
|
+
this.dataDir = path.resolve(options.dataDir);
|
|
118
|
+
this.idleUnloadMs = options.idleUnloadMs;
|
|
119
|
+
this.budgetBytes = options.memoryBudgetMb * 1024 * 1024;
|
|
120
|
+
this.fsync = options.fsync;
|
|
121
|
+
fs.mkdirSync(this.dataDir, { recursive: true });
|
|
122
|
+
}
|
|
123
|
+
dir(...segments) {
|
|
124
|
+
const full = path.join(this.dataDir, ...segments);
|
|
125
|
+
fs.mkdirSync(full, { recursive: true });
|
|
126
|
+
return full;
|
|
127
|
+
}
|
|
128
|
+
catalog(relPath) {
|
|
129
|
+
let catalog = this.catalogs.get(relPath);
|
|
130
|
+
if (!catalog) {
|
|
131
|
+
const rel = relPath.endsWith('.json') ? relPath : `${relPath}.json`;
|
|
132
|
+
catalog = new JsonCatalog(path.join(this.dataDir, rel), this.fsync);
|
|
133
|
+
this.catalogs.set(relPath, catalog);
|
|
134
|
+
}
|
|
135
|
+
return catalog;
|
|
136
|
+
}
|
|
137
|
+
table(relPath) {
|
|
138
|
+
let table = this.tables.get(relPath);
|
|
139
|
+
if (!table) {
|
|
140
|
+
const base = path.join(this.dataDir, relPath);
|
|
141
|
+
table = new JsonlItemTable({
|
|
142
|
+
snapshotPath: `${base}.snapshot.jsonl`,
|
|
143
|
+
walPath: `${base}.wal.jsonl`,
|
|
144
|
+
fsync: this.fsync,
|
|
145
|
+
hooks: {
|
|
146
|
+
afterHydrate: (hydrated) => this.enforceBudget(hydrated),
|
|
147
|
+
forget: () => {
|
|
148
|
+
this.tables.delete(relPath);
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
this.tables.set(relPath, table);
|
|
153
|
+
}
|
|
154
|
+
return table;
|
|
155
|
+
}
|
|
156
|
+
async writeBlob(relDir, data) {
|
|
157
|
+
const hash = crypto.createHash('sha256').update(data).digest('hex');
|
|
158
|
+
const blobPath = path.join(this.dataDir, relDir, hash.slice(0, 2), hash);
|
|
159
|
+
// Content-addressed: an existing file already holds these exact bytes.
|
|
160
|
+
if (!fs.existsSync(blobPath)) {
|
|
161
|
+
await atomicWriteFile(blobPath, data, this.fsync);
|
|
162
|
+
}
|
|
163
|
+
return blobPath;
|
|
164
|
+
}
|
|
165
|
+
readBlob(blobPath) {
|
|
166
|
+
return fsp.readFile(blobPath);
|
|
167
|
+
}
|
|
168
|
+
async deleteBlob(blobPath) {
|
|
169
|
+
await fsp.rm(blobPath, { force: true });
|
|
170
|
+
}
|
|
171
|
+
startSweeper() {
|
|
172
|
+
if (this.sweepTimer)
|
|
173
|
+
return;
|
|
174
|
+
this.sweepTimer = setInterval(() => {
|
|
175
|
+
void this.sweepIdle().catch((err) => {
|
|
176
|
+
console.warn('[engine-store] idle sweep failed:', err);
|
|
177
|
+
});
|
|
178
|
+
}, SWEEP_INTERVAL_MS);
|
|
179
|
+
this.sweepTimer.unref();
|
|
180
|
+
}
|
|
181
|
+
stopSweeper() {
|
|
182
|
+
if (this.sweepTimer) {
|
|
183
|
+
clearInterval(this.sweepTimer);
|
|
184
|
+
this.sweepTimer = null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async flushAll() {
|
|
188
|
+
await Promise.all([
|
|
189
|
+
...[...this.catalogs.values()].map((catalog) => catalog.flush()),
|
|
190
|
+
...[...this.tables.values()].map((table) => table.flush()),
|
|
191
|
+
]);
|
|
192
|
+
}
|
|
193
|
+
// Called by tables after every hydrate: dehydrate least-recently-touched
|
|
194
|
+
// hydrated tables (never the one just hydrated) until under the budget.
|
|
195
|
+
async enforceBudget(justHydrated) {
|
|
196
|
+
for (;;) {
|
|
197
|
+
const hydrated = [...this.tables.values()].filter((table) => table.isHydrated());
|
|
198
|
+
const total = hydrated.reduce((sum, table) => sum + table.approxBytes(), 0);
|
|
199
|
+
if (total <= this.budgetBytes)
|
|
200
|
+
return;
|
|
201
|
+
const victim = hydrated
|
|
202
|
+
.filter((table) => table !== justHydrated)
|
|
203
|
+
.sort((a, b) => a.lastTouchedAt() - b.lastTouchedAt())[0];
|
|
204
|
+
if (!victim)
|
|
205
|
+
return;
|
|
206
|
+
await victim.dehydrate();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async sweepIdle() {
|
|
210
|
+
const cutoff = Date.now() - this.idleUnloadMs;
|
|
211
|
+
for (const table of [...this.tables.values()]) {
|
|
212
|
+
if (table.isHydrated() && table.lastTouchedAt() <= cutoff) {
|
|
213
|
+
await table.dehydrate();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=engine-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-store.js","sourceRoot":"","sources":["../../../../src/server/engine/store/engine-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface CatalogStore<T> {
|
|
2
|
+
load(): Promise<void>;
|
|
3
|
+
get(key: string): T | undefined;
|
|
4
|
+
set(key: string, value: T): void;
|
|
5
|
+
delete(key: string): boolean;
|
|
6
|
+
keys(): string[];
|
|
7
|
+
values(): T[];
|
|
8
|
+
flush(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export interface ItemTable {
|
|
11
|
+
hydrate(): Promise<void>;
|
|
12
|
+
isHydrated(): boolean;
|
|
13
|
+
get(key: string): unknown;
|
|
14
|
+
put(key: string, value: unknown): void;
|
|
15
|
+
delete(key: string): boolean;
|
|
16
|
+
has(key: string): boolean;
|
|
17
|
+
entries(): IterableIterator<[string, unknown]>;
|
|
18
|
+
size(): number;
|
|
19
|
+
approxBytes(): number;
|
|
20
|
+
lastTouchedAt(): number;
|
|
21
|
+
flush(): Promise<void>;
|
|
22
|
+
compact(): Promise<void>;
|
|
23
|
+
dehydrate(): Promise<void>;
|
|
24
|
+
destroy(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export interface EngineStore {
|
|
27
|
+
dir(...segments: string[]): string;
|
|
28
|
+
catalog<T>(relPath: string): CatalogStore<T>;
|
|
29
|
+
table(relPath: string): ItemTable;
|
|
30
|
+
writeBlob(relDir: string, data: Buffer): Promise<string>;
|
|
31
|
+
readBlob(blobPath: string): Promise<Buffer>;
|
|
32
|
+
deleteBlob(blobPath: string): Promise<void>;
|
|
33
|
+
startSweeper(): void;
|
|
34
|
+
stopSweeper(): void;
|
|
35
|
+
flushAll(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=store-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-types.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/store/store-types.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,YAAY,CAAC,CAAC;IAE7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAChC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,IAAI,IAAI,MAAM,EAAE,CAAC;IACjB,MAAM,IAAI,CAAC,EAAE,CAAC;IAEd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IAGxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE1B,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,IAAI,IAAI,MAAM,CAAC;IAEf,WAAW,IAAI,MAAM,CAAC;IACtB,aAAa,IAAI,MAAM,CAAC;IAExB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAE1B,GAAG,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAGnC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAI5C,YAAY,IAAI,IAAI,CAAC;IACrB,WAAW,IAAI,IAAI,CAAC;IAEpB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Storage contracts for the self engine. Two shapes cover every emulator:
|
|
2
|
+
//
|
|
3
|
+
// CatalogStore — small metadata catalogs (queue attributes, buses/rules,
|
|
4
|
+
// function records). One JSON file, atomically rewritten (tmp + rename) on
|
|
5
|
+
// a debounced flush. Loaded eagerly and kept resident: catalogs are the
|
|
6
|
+
// "always resident" residency tier and stay in the low hundreds of KB.
|
|
7
|
+
//
|
|
8
|
+
// ItemTable — keyed row data (DynamoDB items, S3 object index). JSONL
|
|
9
|
+
// snapshot + append-only WAL, hydrated into a Map on first touch, streamed
|
|
10
|
+
// line-by-line (never a whole-file readFileSync), dehydrated after idle or
|
|
11
|
+
// under memory-budget pressure. Values are stored exactly as given (for
|
|
12
|
+
// DynamoDB that means wire-format AttributeValue JSON — lossless N/B).
|
|
13
|
+
//
|
|
14
|
+
// Crash-safety bar (dev tool): a crash may lose the last flush window of
|
|
15
|
+
// writes; ground truth (CloudFormation + seeds) is regenerable.
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=store-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-types.js","sourceRoot":"","sources":["../../../../src/server/engine/store/store-types.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,0EAA0E;AAC1E,yEAAyE;AACzE,EAAE;AACF,wEAAwE;AACxE,6EAA6E;AAC7E,6EAA6E;AAC7E,0EAA0E;AAC1E,yEAAyE;AACzE,EAAE;AACF,yEAAyE;AACzE,gEAAgE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ItemTable } from './store-types.js';
|
|
2
|
+
export interface ItemTableHooks {
|
|
3
|
+
afterHydrate(table: ItemTable): Promise<void>;
|
|
4
|
+
forget(): void;
|
|
5
|
+
}
|
|
6
|
+
export interface ItemTableOptions {
|
|
7
|
+
snapshotPath: string;
|
|
8
|
+
walPath: string;
|
|
9
|
+
fsync: boolean;
|
|
10
|
+
hooks: ItemTableHooks;
|
|
11
|
+
}
|
|
12
|
+
export declare class JsonlItemTable implements ItemTable {
|
|
13
|
+
private readonly snapshotPath;
|
|
14
|
+
private readonly walPath;
|
|
15
|
+
private readonly fsync;
|
|
16
|
+
private readonly hooks;
|
|
17
|
+
private entriesMap;
|
|
18
|
+
private hydrating;
|
|
19
|
+
private seq;
|
|
20
|
+
private approx;
|
|
21
|
+
private touchedAt;
|
|
22
|
+
private walBuffer;
|
|
23
|
+
private walBufferBytes;
|
|
24
|
+
private walTimer;
|
|
25
|
+
private walChain;
|
|
26
|
+
constructor(options: ItemTableOptions);
|
|
27
|
+
hydrate(): Promise<void>;
|
|
28
|
+
isHydrated(): boolean;
|
|
29
|
+
get(key: string): unknown;
|
|
30
|
+
put(key: string, value: unknown): void;
|
|
31
|
+
delete(key: string): boolean;
|
|
32
|
+
has(key: string): boolean;
|
|
33
|
+
entries(): IterableIterator<[string, unknown]>;
|
|
34
|
+
size(): number;
|
|
35
|
+
approxBytes(): number;
|
|
36
|
+
lastTouchedAt(): number;
|
|
37
|
+
flush(): Promise<void>;
|
|
38
|
+
compact(): Promise<void>;
|
|
39
|
+
dehydrate(): Promise<void>;
|
|
40
|
+
destroy(): Promise<void>;
|
|
41
|
+
private requireHydrated;
|
|
42
|
+
private touch;
|
|
43
|
+
private doHydrate;
|
|
44
|
+
private appendWal;
|
|
45
|
+
private queueWalFlush;
|
|
46
|
+
private dropBufferedWal;
|
|
47
|
+
private writeSnapshot;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=wal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wal.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/store/wal.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAoBlD,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,cAAc,CAAC;CACvB;AAwBD,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IAEvC,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAA+B;IAG/C,OAAO,CAAC,QAAQ,CAAoC;gBAExC,OAAO,EAAE,gBAAgB;IAO/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,UAAU,IAAI,OAAO;IAIrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAMzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAWtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAW5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAMzB,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAQ9C,IAAI,IAAI,MAAM;IAId,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;IAIjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,KAAK;YAIC,SAAS;IA2FvB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,eAAe;YAST,aAAa;CAmB5B"}
|