@genora/memory 0.0.3 → 0.1.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/dist/event-store.d.ts.map +1 -1
- package/dist/event-store.js +14 -2
- package/dist/event-store.js.map +1 -1
- package/package.json +20 -2
- package/src/event-store.ts +13 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMvD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AACnD,MAAM,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,yDAAyD;IACzD,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,mDAAmD;IACnD,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAAC;IAC1D,kCAAkC;IAClC,IAAI,IAAI,MAAM,CAAC;IACf,4EAA4E;IAC5E,MAAM,IAAI,OAAO,GAAG,IAAI,CAAC;CAC1B;AAED,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAuB;IAElC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAcrC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC;IAWpD,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,qBAAqB;IAOzD,IAAI,IAAI,MAAM;IAId,MAAM,IAAI,OAAO,GAAG,IAAI;CAGzB;AAED,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAKD,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAAoC;gBAE1C,OAAO,EAAE,qBAAqB;IAQ1C,OAAO,CAAC,QAAQ;IAiBV,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMvD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AACnD,MAAM,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,yDAAyD;IACzD,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,mDAAmD;IACnD,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAAC;IAC1D,kCAAkC;IAClC,IAAI,IAAI,MAAM,CAAC;IACf,4EAA4E;IAC5E,MAAM,IAAI,OAAO,GAAG,IAAI,CAAC;CAC1B;AAED,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAuB;IAElC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAcrC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC;IAWpD,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,qBAAqB;IAOzD,IAAI,IAAI,MAAM;IAId,MAAM,IAAI,OAAO,GAAG,IAAI;CAGzB;AAED,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAKD,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAAoC;gBAE1C,OAAO,EAAE,qBAAqB;IAQ1C,OAAO,CAAC,QAAQ;IAiBV,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BrC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC;IAWpD,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,qBAAqB;IAOzD,IAAI,IAAI,MAAM;IAId,MAAM,IAAI,OAAO,GAAG,IAAI;CAGzB"}
|
package/dist/event-store.js
CHANGED
|
@@ -78,8 +78,20 @@ export class FileEventStore {
|
|
|
78
78
|
async append(event) {
|
|
79
79
|
this.events = [...this.events, event];
|
|
80
80
|
const line = `${JSON.stringify(event)}\n`;
|
|
81
|
-
// Serialize writes — fs.appendFile
|
|
82
|
-
|
|
81
|
+
// Serialize writes AND fsync — fs.appendFile alone returns once the kernel
|
|
82
|
+
// accepted the bytes, not when they hit the disk. open+append+sync+close
|
|
83
|
+
// gives append-only durability per event. Single-process only: there's no
|
|
84
|
+
// advisory lock, so a second runtime writing the same file will interleave.
|
|
85
|
+
this.writeQueue = this.writeQueue.then(async () => {
|
|
86
|
+
const fh = await fs.open(this.filePath, 'a');
|
|
87
|
+
try {
|
|
88
|
+
await fh.appendFile(line, 'utf-8');
|
|
89
|
+
await fh.sync();
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
await fh.close();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
83
95
|
await this.writeQueue;
|
|
84
96
|
const snapshot = this.listeners.slice();
|
|
85
97
|
for (const l of snapshot) {
|
package/dist/event-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAuBlC,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAY,EAAE,CAAC;IACrB,SAAS,GAAoB,EAAE,CAAC;IAExC,KAAK,CAAC,MAAM,CAAC,KAAY;QACvB,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,CAAC,CAAC,KAAK,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,KAAe;QAC3B,IAAI,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,CAAC;YACV,CAAC;iBAAM,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC1B,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAuB;QAC/B,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC;IACnF,CAAC;CACF;AASD,qDAAqD;AACrD,uFAAuF;AACvF,2DAA2D;AAC3D,MAAM,OAAO,cAAc;IACjB,MAAM,GAAY,EAAE,CAAC;IACrB,SAAS,GAAoB,EAAE,CAAC;IACvB,QAAQ,CAAS;IAC1B,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtD,YAAY,OAA8B;QACxC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,IAAI,cAAc,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO;QACvC,4DAA4D;QAC5D,mEAAmE;QACnE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAY;QACvB,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1C,
|
|
1
|
+
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genora/memory",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Event-sourced memory — append-only EventStore + projections + super-step snapshots for time-travel resume.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"yjs": "^13.6.0",
|
|
17
|
-
"@genora/protocol": "0.0
|
|
17
|
+
"@genora/protocol": "0.1.0"
|
|
18
18
|
},
|
|
19
19
|
"files": [
|
|
20
20
|
"dist",
|
|
@@ -25,6 +25,24 @@
|
|
|
25
25
|
"publishConfig": {
|
|
26
26
|
"access": "public"
|
|
27
27
|
},
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/wanikua/loom.git",
|
|
31
|
+
"directory": "packages/memory"
|
|
32
|
+
},
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/wanikua/loom/issues"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/wanikua/loom#readme",
|
|
37
|
+
"keywords": [
|
|
38
|
+
"multi-agent",
|
|
39
|
+
"ai-agents",
|
|
40
|
+
"a2a",
|
|
41
|
+
"event-sourcing",
|
|
42
|
+
"orchestration",
|
|
43
|
+
"loom",
|
|
44
|
+
"genora"
|
|
45
|
+
],
|
|
28
46
|
"scripts": {
|
|
29
47
|
"typecheck": "tsc --noEmit",
|
|
30
48
|
"build": "tsc",
|
package/src/event-store.ts
CHANGED
|
@@ -112,8 +112,19 @@ export class FileEventStore implements EventStore {
|
|
|
112
112
|
async append(event: Event): Promise<EventId> {
|
|
113
113
|
this.events = [...this.events, event];
|
|
114
114
|
const line = `${JSON.stringify(event)}\n`;
|
|
115
|
-
// Serialize writes — fs.appendFile
|
|
116
|
-
|
|
115
|
+
// Serialize writes AND fsync — fs.appendFile alone returns once the kernel
|
|
116
|
+
// accepted the bytes, not when they hit the disk. open+append+sync+close
|
|
117
|
+
// gives append-only durability per event. Single-process only: there's no
|
|
118
|
+
// advisory lock, so a second runtime writing the same file will interleave.
|
|
119
|
+
this.writeQueue = this.writeQueue.then(async () => {
|
|
120
|
+
const fh = await fs.open(this.filePath, 'a');
|
|
121
|
+
try {
|
|
122
|
+
await fh.appendFile(line, 'utf-8');
|
|
123
|
+
await fh.sync();
|
|
124
|
+
} finally {
|
|
125
|
+
await fh.close();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
117
128
|
await this.writeQueue;
|
|
118
129
|
const snapshot = this.listeners.slice();
|
|
119
130
|
for (const l of snapshot) {
|