@graphrefly/ts 0.0.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/LICENSE +21 -0
- package/dist/adapters/index.cjs +9015 -0
- package/dist/adapters/index.cjs.map +1 -0
- package/dist/adapters/index.d.cts +678 -0
- package/dist/adapters/index.d.ts +678 -0
- package/dist/adapters/index.js +2894 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/observe-storage.cjs +260 -0
- package/dist/adapters/observe-storage.cjs.map +1 -0
- package/dist/adapters/observe-storage.d.cts +77 -0
- package/dist/adapters/observe-storage.d.ts +77 -0
- package/dist/adapters/observe-storage.js +161 -0
- package/dist/adapters/observe-storage.js.map +1 -0
- package/dist/append-log-DisvEReb.d.cts +189 -0
- package/dist/append-log-DzKMmjxx.d.ts +189 -0
- package/dist/chunk-2ILL7HQI.js +1189 -0
- package/dist/chunk-2ILL7HQI.js.map +1 -0
- package/dist/chunk-4VLAQHZI.js +330 -0
- package/dist/chunk-4VLAQHZI.js.map +1 -0
- package/dist/chunk-6PHB5CJS.js +229 -0
- package/dist/chunk-6PHB5CJS.js.map +1 -0
- package/dist/chunk-COHO25CZ.js +2449 -0
- package/dist/chunk-COHO25CZ.js.map +1 -0
- package/dist/chunk-D6BG7U6A.js +161 -0
- package/dist/chunk-D6BG7U6A.js.map +1 -0
- package/dist/chunk-DJC4CHLQ.js +818 -0
- package/dist/chunk-DJC4CHLQ.js.map +1 -0
- package/dist/chunk-DK554R7P.js +67 -0
- package/dist/chunk-DK554R7P.js.map +1 -0
- package/dist/chunk-DKP56CSW.js +322 -0
- package/dist/chunk-DKP56CSW.js.map +1 -0
- package/dist/chunk-G4M3NHRJ.js +688 -0
- package/dist/chunk-G4M3NHRJ.js.map +1 -0
- package/dist/chunk-GAJW5I5P.js +1 -0
- package/dist/chunk-GAJW5I5P.js.map +1 -0
- package/dist/chunk-GDL26N2T.js +282 -0
- package/dist/chunk-GDL26N2T.js.map +1 -0
- package/dist/chunk-GTPCOEOZ.js +741 -0
- package/dist/chunk-GTPCOEOZ.js.map +1 -0
- package/dist/chunk-H2HTHFVN.js +1 -0
- package/dist/chunk-H2HTHFVN.js.map +1 -0
- package/dist/chunk-HDRL4VQQ.js +218 -0
- package/dist/chunk-HDRL4VQQ.js.map +1 -0
- package/dist/chunk-I3IHOHCJ.js +2267 -0
- package/dist/chunk-I3IHOHCJ.js.map +1 -0
- package/dist/chunk-JIMUDQN3.js +965 -0
- package/dist/chunk-JIMUDQN3.js.map +1 -0
- package/dist/chunk-JR4IKCR2.js +462 -0
- package/dist/chunk-JR4IKCR2.js.map +1 -0
- package/dist/chunk-K3FXTC3I.js +165 -0
- package/dist/chunk-K3FXTC3I.js.map +1 -0
- package/dist/chunk-OOEN33FB.js +65 -0
- package/dist/chunk-OOEN33FB.js.map +1 -0
- package/dist/chunk-PKVBHGBM.js +554 -0
- package/dist/chunk-PKVBHGBM.js.map +1 -0
- package/dist/chunk-RIIOUTGM.js +1857 -0
- package/dist/chunk-RIIOUTGM.js.map +1 -0
- package/dist/chunk-SCRFRCGR.js +33 -0
- package/dist/chunk-SCRFRCGR.js.map +1 -0
- package/dist/chunk-SWTLEQL6.js +53 -0
- package/dist/chunk-SWTLEQL6.js.map +1 -0
- package/dist/chunk-SZAETNNA.js +1 -0
- package/dist/chunk-SZAETNNA.js.map +1 -0
- package/dist/chunk-TEW47IVR.js +49 -0
- package/dist/chunk-TEW47IVR.js.map +1 -0
- package/dist/chunk-Y3ZLRGHC.js +1482 -0
- package/dist/chunk-Y3ZLRGHC.js.map +1 -0
- package/dist/chunk-Z2ANQ6JW.js +149 -0
- package/dist/chunk-Z2ANQ6JW.js.map +1 -0
- package/dist/codec-BB7p8fJc.d.cts +38 -0
- package/dist/codec-BB7p8fJc.d.ts +38 -0
- package/dist/composition/index.cjs +2505 -0
- package/dist/composition/index.cjs.map +1 -0
- package/dist/composition/index.d.cts +95 -0
- package/dist/composition/index.d.ts +95 -0
- package/dist/composition/index.js +19 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/core/index.cjs +2475 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +25 -0
- package/dist/core/index.d.ts +25 -0
- package/dist/core/index.js +74 -0
- package/dist/core/index.js.map +1 -0
- package/dist/cqrs/index.cjs +595 -0
- package/dist/cqrs/index.cjs.map +1 -0
- package/dist/cqrs/index.d.cts +200 -0
- package/dist/cqrs/index.d.ts +200 -0
- package/dist/cqrs/index.js +557 -0
- package/dist/cqrs/index.js.map +1 -0
- package/dist/data-structures/index.cjs +4277 -0
- package/dist/data-structures/index.cjs.map +1 -0
- package/dist/data-structures/index.d.cts +22 -0
- package/dist/data-structures/index.d.ts +22 -0
- package/dist/data-structures/index.js +31 -0
- package/dist/data-structures/index.js.map +1 -0
- package/dist/describe-BZb7AS2y.d.ts +57 -0
- package/dist/describe-Ciu8SUnN.d.cts +57 -0
- package/dist/graph/index.cjs +7832 -0
- package/dist/graph/index.cjs.map +1 -0
- package/dist/graph/index.d.cts +251 -0
- package/dist/graph/index.d.ts +251 -0
- package/dist/graph/index.js +131 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph-DfdF9zy4.d.ts +666 -0
- package/dist/graph-s23RbbFO.d.cts +666 -0
- package/dist/index-CAEmLCYF.d.cts +166 -0
- package/dist/index-SnzZu3x7.d.ts +166 -0
- package/dist/index.cjs +15409 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +23 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +582 -0
- package/dist/index.js.map +1 -0
- package/dist/messages-BZqrGGm1.d.cts +55 -0
- package/dist/messages-BZqrGGm1.d.ts +55 -0
- package/dist/messaging/index.cjs +818 -0
- package/dist/messaging/index.cjs.map +1 -0
- package/dist/messaging/index.d.cts +235 -0
- package/dist/messaging/index.d.ts +235 -0
- package/dist/messaging/index.js +767 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/observe-event-log-0SVsx7JG.d.cts +88 -0
- package/dist/observe-event-log-Dnm76owp.d.ts +88 -0
- package/dist/operators/index.cjs +3774 -0
- package/dist/operators/index.cjs.map +1 -0
- package/dist/operators/index.d.cts +308 -0
- package/dist/operators/index.d.ts +308 -0
- package/dist/operators/index.js +112 -0
- package/dist/operators/index.js.map +1 -0
- package/dist/orchestration/index.cjs +3541 -0
- package/dist/orchestration/index.cjs.map +1 -0
- package/dist/orchestration/index.d.cts +302 -0
- package/dist/orchestration/index.d.ts +302 -0
- package/dist/orchestration/index.js +1004 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/patterns/index.cjs +1045 -0
- package/dist/patterns/index.cjs.map +1 -0
- package/dist/patterns/index.d.cts +39 -0
- package/dist/patterns/index.d.ts +39 -0
- package/dist/patterns/index.js +33 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/reactive-collection-BxBqtIOE.d.cts +344 -0
- package/dist/reactive-collection-Cb1II1Fi.d.ts +344 -0
- package/dist/reactive-collection-storage-BNiEc-Gd.d.ts +217 -0
- package/dist/reactive-collection-storage-D-KmjE0J.d.cts +217 -0
- package/dist/reactive-map-BcB4KsQR.d.ts +256 -0
- package/dist/reactive-map-D-g3dv8I.d.cts +256 -0
- package/dist/read-through-B1CYPfq_.d.cts +82 -0
- package/dist/read-through-DwyJhGs1.d.ts +82 -0
- package/dist/render/index.cjs +250 -0
- package/dist/render/index.cjs.map +1 -0
- package/dist/render/index.d.cts +58 -0
- package/dist/render/index.d.ts +58 -0
- package/dist/render/index.js +20 -0
- package/dist/render/index.js.map +1 -0
- package/dist/resilience-Dig3Q7n0.d.cts +45 -0
- package/dist/resilience-Dig3Q7n0.d.ts +45 -0
- package/dist/semantic-memory-graph-BYoIlP35.d.cts +356 -0
- package/dist/semantic-memory-graph-CxyXLms3.d.ts +356 -0
- package/dist/solutions/index.cjs +3249 -0
- package/dist/solutions/index.cjs.map +1 -0
- package/dist/solutions/index.d.cts +520 -0
- package/dist/solutions/index.d.ts +520 -0
- package/dist/solutions/index.js +31 -0
- package/dist/solutions/index.js.map +1 -0
- package/dist/sources/browser.cjs +3095 -0
- package/dist/sources/browser.cjs.map +1 -0
- package/dist/sources/browser.d.cts +39 -0
- package/dist/sources/browser.d.ts +39 -0
- package/dist/sources/browser.js +137 -0
- package/dist/sources/browser.js.map +1 -0
- package/dist/sources/index.cjs +3021 -0
- package/dist/sources/index.cjs.map +1 -0
- package/dist/sources/index.d.cts +7 -0
- package/dist/sources/index.d.ts +7 -0
- package/dist/sources/index.js +63 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/node.cjs +675 -0
- package/dist/sources/node.cjs.map +1 -0
- package/dist/sources/node.d.cts +109 -0
- package/dist/sources/node.d.ts +109 -0
- package/dist/sources/node.js +639 -0
- package/dist/sources/node.js.map +1 -0
- package/dist/storage/browser.cjs +777 -0
- package/dist/storage/browser.cjs.map +1 -0
- package/dist/storage/browser.d.cts +40 -0
- package/dist/storage/browser.d.ts +40 -0
- package/dist/storage/browser.js +275 -0
- package/dist/storage/browser.js.map +1 -0
- package/dist/storage/index.cjs +1989 -0
- package/dist/storage/index.cjs.map +1 -0
- package/dist/storage/index.d.cts +92 -0
- package/dist/storage/index.d.ts +92 -0
- package/dist/storage/index.js +161 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/node.cjs +898 -0
- package/dist/storage/node.cjs.map +1 -0
- package/dist/storage/node.d.cts +66 -0
- package/dist/storage/node.d.ts +66 -0
- package/dist/storage/node.js +402 -0
- package/dist/storage/node.js.map +1 -0
- package/dist/testing/index.cjs +95 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +20 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.js +8 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types-bNMSWKqF.d.cts +732 -0
- package/dist/types-h12mNYbq.d.ts +732 -0
- package/package.json +250 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import {
|
|
2
|
+
memoryKv,
|
|
3
|
+
requireKvPutIfAbsent
|
|
4
|
+
} from "./chunk-DKP56CSW.js";
|
|
5
|
+
|
|
6
|
+
// src/storage/append-log.ts
|
|
7
|
+
var APPEND_LOG_SEQ_PAD = 20;
|
|
8
|
+
function appendLogKey(prefix, seq) {
|
|
9
|
+
if (!Number.isSafeInteger(seq) || seq < 0) {
|
|
10
|
+
throw new RangeError(`appendLogKey: seq must be a non-negative safe integer, got ${seq}`);
|
|
11
|
+
}
|
|
12
|
+
return `${prefix}/${seq.toString().padStart(APPEND_LOG_SEQ_PAD, "0")}`;
|
|
13
|
+
}
|
|
14
|
+
function seqFromKey(prefix, key) {
|
|
15
|
+
const head = `${prefix}/`;
|
|
16
|
+
if (!key.startsWith(head)) throw new Error(`append log key outside prefix: ${key}`);
|
|
17
|
+
const raw = key.slice(head.length);
|
|
18
|
+
if (!/^\d+$/.test(raw)) {
|
|
19
|
+
throw new Error(`append log key has a non-numeric sequence: ${key}`);
|
|
20
|
+
}
|
|
21
|
+
if (raw.length !== APPEND_LOG_SEQ_PAD) {
|
|
22
|
+
throw new Error(`append log key sequence must be ${APPEND_LOG_SEQ_PAD} padded digits: ${key}`);
|
|
23
|
+
}
|
|
24
|
+
const seq = Number(raw);
|
|
25
|
+
if (!Number.isSafeInteger(seq)) {
|
|
26
|
+
throw new Error(`append log key sequence is outside the safe integer range: ${key}`);
|
|
27
|
+
}
|
|
28
|
+
return seq;
|
|
29
|
+
}
|
|
30
|
+
function nextSeqFromKeys(prefix, keys) {
|
|
31
|
+
if (keys.length === 0) return 0;
|
|
32
|
+
const next = Math.max(...keys.map((key) => seqFromKey(prefix, key))) + 1;
|
|
33
|
+
if (!Number.isSafeInteger(next)) {
|
|
34
|
+
throw new RangeError(`append log next sequence is outside the safe integer range: ${prefix}`);
|
|
35
|
+
}
|
|
36
|
+
return next;
|
|
37
|
+
}
|
|
38
|
+
function sizeFromKeys(prefix, keys) {
|
|
39
|
+
for (const key of keys) seqFromKey(prefix, key);
|
|
40
|
+
return keys.length;
|
|
41
|
+
}
|
|
42
|
+
function validateReadOptions(opts) {
|
|
43
|
+
const after = opts.after ?? -1;
|
|
44
|
+
const limit = opts.limit ?? Number.POSITIVE_INFINITY;
|
|
45
|
+
if (!Number.isSafeInteger(after) || after < -1) {
|
|
46
|
+
throw new RangeError(
|
|
47
|
+
`appendLogStorage.read: after must be an integer cursor >= -1, got ${after}`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
if (limit !== Number.POSITIVE_INFINITY && (!Number.isSafeInteger(limit) || limit < 0)) {
|
|
51
|
+
throw new RangeError(
|
|
52
|
+
`appendLogStorage.read: limit must be a non-negative safe integer or Infinity, got ${limit}`
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
return { after, limit };
|
|
56
|
+
}
|
|
57
|
+
function validatePageLimit(limit) {
|
|
58
|
+
if (!Number.isSafeInteger(limit) || limit < 1) {
|
|
59
|
+
throw new RangeError(`readAppendLogPage: limit must be a positive safe integer, got ${limit}`);
|
|
60
|
+
}
|
|
61
|
+
if (limit >= Number.MAX_SAFE_INTEGER) {
|
|
62
|
+
throw new RangeError("readAppendLogPage: limit must leave room for one lookahead entry");
|
|
63
|
+
}
|
|
64
|
+
return limit;
|
|
65
|
+
}
|
|
66
|
+
function readAppendLogEntries(kv, prefix, opts) {
|
|
67
|
+
const { after, limit } = validateReadOptions(opts);
|
|
68
|
+
return kv.list(`${prefix}/`).then((listed) => {
|
|
69
|
+
const keys = listed.map((key) => ({ key, seq: seqFromKey(prefix, key) })).filter(({ seq }) => seq > after).sort((a, b) => a.seq - b.seq).slice(0, limit);
|
|
70
|
+
return Promise.all(
|
|
71
|
+
keys.map(
|
|
72
|
+
({ key, seq }) => kv.get(key).then((value) => {
|
|
73
|
+
if (value === void 0) {
|
|
74
|
+
throw new Error(`append log listed key is missing: ${key}`);
|
|
75
|
+
}
|
|
76
|
+
return { key, seq, value };
|
|
77
|
+
})
|
|
78
|
+
)
|
|
79
|
+
).then((entries) => {
|
|
80
|
+
const out = [];
|
|
81
|
+
for (const entry of entries) if (entry !== void 0) out.push(entry);
|
|
82
|
+
return out;
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function readAppendLogPage(log, opts = {}) {
|
|
87
|
+
const { after, limit } = validateReadOptions({ after: opts.after, limit: opts.limit ?? 100 });
|
|
88
|
+
const pageLimit = validatePageLimit(limit);
|
|
89
|
+
return log.read({ after, limit: pageLimit + 1 }).then((entries) => {
|
|
90
|
+
const visible = entries.slice(0, pageLimit);
|
|
91
|
+
const last = visible[visible.length - 1];
|
|
92
|
+
return {
|
|
93
|
+
entries: visible,
|
|
94
|
+
nextAfter: last?.seq ?? after,
|
|
95
|
+
done: entries.length <= pageLimit
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function deleteAppendLogEntriesAfter(kv, prefix, seq) {
|
|
100
|
+
return kv.list(`${prefix}/`).then(
|
|
101
|
+
(keys) => Promise.all(keys.filter((key) => seqFromKey(prefix, key) > seq).map((key) => kv.delete(key)))
|
|
102
|
+
).then(() => kv.list(`${prefix}/`)).then(() => void 0);
|
|
103
|
+
}
|
|
104
|
+
function appendLogStorage(opts) {
|
|
105
|
+
const { kv, prefix = "event-log" } = opts;
|
|
106
|
+
let tail = Promise.resolve();
|
|
107
|
+
function initNextSeq() {
|
|
108
|
+
return kv.list(`${prefix}/`).then((keys) => {
|
|
109
|
+
return nextSeqFromKeys(prefix, keys);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function enqueue(task) {
|
|
113
|
+
const run = tail.then(task, task);
|
|
114
|
+
tail = run.then(
|
|
115
|
+
() => void 0,
|
|
116
|
+
() => void 0
|
|
117
|
+
);
|
|
118
|
+
return run;
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
append(value) {
|
|
122
|
+
return enqueue(
|
|
123
|
+
() => initNextSeq().then((seq) => {
|
|
124
|
+
const key = appendLogKey(prefix, seq);
|
|
125
|
+
return kv.set(key, value).then(() => {
|
|
126
|
+
return { key, seq, value };
|
|
127
|
+
});
|
|
128
|
+
})
|
|
129
|
+
);
|
|
130
|
+
},
|
|
131
|
+
read(opts2 = {}) {
|
|
132
|
+
return enqueue(() => readAppendLogEntries(kv, prefix, opts2));
|
|
133
|
+
},
|
|
134
|
+
truncateAfter(seq) {
|
|
135
|
+
return enqueue(() => deleteAppendLogEntriesAfter(kv, prefix, seq));
|
|
136
|
+
},
|
|
137
|
+
size() {
|
|
138
|
+
return enqueue(() => kv.list(`${prefix}/`).then((keys) => sizeFromKeys(prefix, keys)));
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function multiWriterAppendLogStorage(opts) {
|
|
143
|
+
const { kv, prefix = "event-log", maxAttempts = 1024 } = opts;
|
|
144
|
+
const capableKv = requireKvPutIfAbsent(kv, "multiWriterAppendLogStorage");
|
|
145
|
+
let tail = Promise.resolve();
|
|
146
|
+
if (!Number.isSafeInteger(maxAttempts) || maxAttempts < 1) {
|
|
147
|
+
throw new RangeError(
|
|
148
|
+
`multiWriterAppendLogStorage: maxAttempts must be a positive safe integer, got ${maxAttempts}`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
function initNextSeq() {
|
|
152
|
+
return kv.list(`${prefix}/`).then((keys) => nextSeqFromKeys(prefix, keys));
|
|
153
|
+
}
|
|
154
|
+
function enqueue(task) {
|
|
155
|
+
const run = tail.then(task, task);
|
|
156
|
+
tail = run.then(
|
|
157
|
+
() => void 0,
|
|
158
|
+
() => void 0
|
|
159
|
+
);
|
|
160
|
+
return run;
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
append(value) {
|
|
164
|
+
return enqueue(
|
|
165
|
+
() => initNextSeq().then((startSeq) => {
|
|
166
|
+
let seq = startSeq;
|
|
167
|
+
let attempt = 0;
|
|
168
|
+
const tryNext = () => {
|
|
169
|
+
if (attempt >= maxAttempts) {
|
|
170
|
+
return initNextSeq().then((refreshedSeq) => {
|
|
171
|
+
seq = Math.max(seq, refreshedSeq);
|
|
172
|
+
attempt = 0;
|
|
173
|
+
return tryNext();
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
attempt += 1;
|
|
177
|
+
const key = appendLogKey(prefix, seq);
|
|
178
|
+
return capableKv.putIfAbsent(key, value).then((created) => {
|
|
179
|
+
if (created) return { key, seq, value };
|
|
180
|
+
seq += 1;
|
|
181
|
+
if (!Number.isSafeInteger(seq)) {
|
|
182
|
+
throw new RangeError(
|
|
183
|
+
`append log next sequence is outside the safe integer range: ${prefix}`
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
return tryNext();
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
return tryNext();
|
|
190
|
+
})
|
|
191
|
+
);
|
|
192
|
+
},
|
|
193
|
+
read(opts2 = {}) {
|
|
194
|
+
return enqueue(() => readAppendLogEntries(kv, prefix, opts2));
|
|
195
|
+
},
|
|
196
|
+
truncateAfter(seq) {
|
|
197
|
+
return enqueue(() => {
|
|
198
|
+
if (!Number.isSafeInteger(seq) || seq < -1) {
|
|
199
|
+
throw new RangeError(
|
|
200
|
+
`multiWriterAppendLogStorage.truncateAfter: seq must be an integer cursor >= -1, got ${seq}`
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
throw new Error(
|
|
204
|
+
"multiWriterAppendLogStorage.truncateAfter: unsupported without a stronger compaction capability"
|
|
205
|
+
);
|
|
206
|
+
});
|
|
207
|
+
},
|
|
208
|
+
size() {
|
|
209
|
+
return enqueue(() => kv.list(`${prefix}/`).then((keys) => sizeFromKeys(prefix, keys)));
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function memoryAppendLog(prefix) {
|
|
214
|
+
return appendLogStorage({ kv: memoryKv(), prefix });
|
|
215
|
+
}
|
|
216
|
+
function memoryMultiWriterAppendLog(prefix) {
|
|
217
|
+
return multiWriterAppendLogStorage({ kv: memoryKv(), prefix });
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export {
|
|
221
|
+
APPEND_LOG_SEQ_PAD,
|
|
222
|
+
appendLogKey,
|
|
223
|
+
readAppendLogPage,
|
|
224
|
+
appendLogStorage,
|
|
225
|
+
multiWriterAppendLogStorage,
|
|
226
|
+
memoryAppendLog,
|
|
227
|
+
memoryMultiWriterAppendLog
|
|
228
|
+
};
|
|
229
|
+
//# sourceMappingURL=chunk-6PHB5CJS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/append-log.ts"],"sourcesContent":["import type { KvStorageTier } from \"./kv.js\";\nimport { memoryKv, requireKvPutIfAbsent } from \"./kv.js\";\n\nexport const APPEND_LOG_SEQ_PAD = 20;\n\n/** One append-log record with its storage key and monotonic sequence. */\nexport interface AppendLogEntry<T> {\n\treadonly key: string;\n\treadonly seq: number;\n\treadonly value: T;\n}\n\n/** Cursor and page-size options for append-log reads. */\nexport interface AppendLogReadOptions {\n\t/** Return entries with seq > after. */\n\tafter?: number;\n\tlimit?: number;\n}\n\n/** One bounded append-log page with the cursor for the next read. */\nexport interface AppendLogPage<T> {\n\treadonly entries: readonly AppendLogEntry<T>[];\n\treadonly nextAfter: number;\n\treadonly done: boolean;\n}\n\n/**\n * Append-only tier for durable event/change logs (D82), not graph restore replay.\n *\n * This first-cut helper serializes operations within one handle. Concurrent writers sharing the\n * same KV prefix need an external single-writer discipline or a future CAS-capable backend.\n */\nexport interface AppendLogStorageTier<T = unknown> {\n\tappend(value: T): Promise<AppendLogEntry<T>>;\n\tread(opts?: AppendLogReadOptions): Promise<readonly AppendLogEntry<T>[]>;\n\ttruncateAfter(seq: number): Promise<void>;\n\tsize(): Promise<number>;\n}\n\n/** D85 multi-writer append log; requires a passive conditional-create KV capability. */\nexport type MultiWriterAppendLogStorageTier<T = unknown> = AppendLogStorageTier<T>;\n\n/** Build the deterministic storage key for an append-log sequence number. */\nexport function appendLogKey(prefix: string, seq: number): string {\n\tif (!Number.isSafeInteger(seq) || seq < 0) {\n\t\tthrow new RangeError(`appendLogKey: seq must be a non-negative safe integer, got ${seq}`);\n\t}\n\treturn `${prefix}/${seq.toString().padStart(APPEND_LOG_SEQ_PAD, \"0\")}`;\n}\n\nfunction seqFromKey(prefix: string, key: string): number {\n\tconst head = `${prefix}/`;\n\tif (!key.startsWith(head)) throw new Error(`append log key outside prefix: ${key}`);\n\tconst raw = key.slice(head.length);\n\tif (!/^\\d+$/.test(raw)) {\n\t\tthrow new Error(`append log key has a non-numeric sequence: ${key}`);\n\t}\n\tif (raw.length !== APPEND_LOG_SEQ_PAD) {\n\t\tthrow new Error(`append log key sequence must be ${APPEND_LOG_SEQ_PAD} padded digits: ${key}`);\n\t}\n\tconst seq = Number(raw);\n\tif (!Number.isSafeInteger(seq)) {\n\t\tthrow new Error(`append log key sequence is outside the safe integer range: ${key}`);\n\t}\n\treturn seq;\n}\n\nfunction nextSeqFromKeys(prefix: string, keys: readonly string[]): number {\n\tif (keys.length === 0) return 0;\n\tconst next = Math.max(...keys.map((key) => seqFromKey(prefix, key))) + 1;\n\tif (!Number.isSafeInteger(next)) {\n\t\tthrow new RangeError(`append log next sequence is outside the safe integer range: ${prefix}`);\n\t}\n\treturn next;\n}\n\nfunction sizeFromKeys(prefix: string, keys: readonly string[]): number {\n\tfor (const key of keys) seqFromKey(prefix, key);\n\treturn keys.length;\n}\n\nfunction validateReadOptions(opts: AppendLogReadOptions): {\n\tafter: number;\n\tlimit: number;\n} {\n\tconst after = opts.after ?? -1;\n\tconst limit = opts.limit ?? Number.POSITIVE_INFINITY;\n\tif (!Number.isSafeInteger(after) || after < -1) {\n\t\tthrow new RangeError(\n\t\t\t`appendLogStorage.read: after must be an integer cursor >= -1, got ${after}`,\n\t\t);\n\t}\n\tif (limit !== Number.POSITIVE_INFINITY && (!Number.isSafeInteger(limit) || limit < 0)) {\n\t\tthrow new RangeError(\n\t\t\t`appendLogStorage.read: limit must be a non-negative safe integer or Infinity, got ${limit}`,\n\t\t);\n\t}\n\treturn { after, limit };\n}\n\nfunction validatePageLimit(limit: number): number {\n\tif (!Number.isSafeInteger(limit) || limit < 1) {\n\t\tthrow new RangeError(`readAppendLogPage: limit must be a positive safe integer, got ${limit}`);\n\t}\n\tif (limit >= Number.MAX_SAFE_INTEGER) {\n\t\tthrow new RangeError(\"readAppendLogPage: limit must leave room for one lookahead entry\");\n\t}\n\treturn limit;\n}\n\nfunction readAppendLogEntries<T>(\n\tkv: KvStorageTier<T>,\n\tprefix: string,\n\topts: AppendLogReadOptions,\n): Promise<readonly AppendLogEntry<T>[]> {\n\tconst { after, limit } = validateReadOptions(opts);\n\treturn kv.list(`${prefix}/`).then((listed) => {\n\t\tconst keys = listed\n\t\t\t.map((key) => ({ key, seq: seqFromKey(prefix, key) }))\n\t\t\t.filter(({ seq }) => seq > after)\n\t\t\t.sort((a, b) => a.seq - b.seq)\n\t\t\t.slice(0, limit);\n\t\treturn Promise.all(\n\t\t\tkeys.map(\n\t\t\t\t({ key, seq }): Promise<AppendLogEntry<T> | undefined> =>\n\t\t\t\t\tkv.get(key).then((value) => {\n\t\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\t\tthrow new Error(`append log listed key is missing: ${key}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { key, seq, value };\n\t\t\t\t\t}),\n\t\t\t),\n\t\t).then((entries) => {\n\t\t\tconst out: AppendLogEntry<T>[] = [];\n\t\t\tfor (const entry of entries) if (entry !== undefined) out.push(entry);\n\t\t\treturn out;\n\t\t});\n\t});\n}\n\n/** Read one ordered append-log page without assigning replay or restore semantics. */\nexport function readAppendLogPage<T>(\n\tlog: AppendLogStorageTier<T>,\n\topts: AppendLogReadOptions = {},\n): Promise<AppendLogPage<T>> {\n\tconst { after, limit } = validateReadOptions({ after: opts.after, limit: opts.limit ?? 100 });\n\tconst pageLimit = validatePageLimit(limit);\n\treturn log.read({ after, limit: pageLimit + 1 }).then((entries) => {\n\t\tconst visible = entries.slice(0, pageLimit);\n\t\tconst last = visible[visible.length - 1];\n\t\treturn {\n\t\t\tentries: visible,\n\t\t\tnextAfter: last?.seq ?? after,\n\t\t\tdone: entries.length <= pageLimit,\n\t\t};\n\t});\n}\n\nfunction deleteAppendLogEntriesAfter<T>(\n\tkv: KvStorageTier<T>,\n\tprefix: string,\n\tseq: number,\n): Promise<void> {\n\treturn kv\n\t\t.list(`${prefix}/`)\n\t\t.then((keys) =>\n\t\t\tPromise.all(keys.filter((key) => seqFromKey(prefix, key) > seq).map((key) => kv.delete(key))),\n\t\t)\n\t\t.then(() => kv.list(`${prefix}/`))\n\t\t.then(() => undefined);\n}\n\n/** Options for a typed append log over a KV tier. */\nexport interface AppendLogOptions<T> {\n\tkv: KvStorageTier<T>;\n\tprefix?: string;\n}\n\n/** Options for D85 multi-writer append logs over conditional-create capable KV. */\nexport interface MultiWriterAppendLogOptions<T> extends AppendLogOptions<T> {\n\t/** Bound retry work before refreshing the listed tail after another writer wins slots. */\n\tmaxAttempts?: number;\n}\n\n/**\n * Build a single-writer append-only log over a KV tier, serializing all operations in call order\n * for this handle. D85 multi-handle concurrent appends require multiWriterAppendLogStorage.\n */\nexport function appendLogStorage<T = unknown>(opts: AppendLogOptions<T>): AppendLogStorageTier<T> {\n\tconst { kv, prefix = \"event-log\" } = opts;\n\tlet tail: Promise<unknown> = Promise.resolve();\n\n\tfunction initNextSeq(): Promise<number> {\n\t\treturn kv.list(`${prefix}/`).then((keys) => {\n\t\t\treturn nextSeqFromKeys(prefix, keys);\n\t\t});\n\t}\n\n\tfunction enqueue<R>(task: () => Promise<R>): Promise<R> {\n\t\tconst run = tail.then(task, task);\n\t\ttail = run.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn run;\n\t}\n\n\treturn {\n\t\tappend(value) {\n\t\t\treturn enqueue(() =>\n\t\t\t\tinitNextSeq().then((seq) => {\n\t\t\t\t\tconst key = appendLogKey(prefix, seq);\n\t\t\t\t\treturn kv.set(key, value).then(() => {\n\t\t\t\t\t\treturn { key, seq, value };\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tread(opts = {}) {\n\t\t\treturn enqueue(() => readAppendLogEntries(kv, prefix, opts));\n\t\t},\n\t\ttruncateAfter(seq) {\n\t\t\treturn enqueue(() => deleteAppendLogEntriesAfter(kv, prefix, seq));\n\t\t},\n\t\tsize() {\n\t\t\treturn enqueue(() => kv.list(`${prefix}/`).then((keys) => sizeFromKeys(prefix, keys)));\n\t\t},\n\t};\n}\n\n/**\n * Build a D85 multi-writer append log over a conditional-create capable KV tier.\n *\n * Sequence allocation is passive storage work: each writer proposes a padded key and retries the\n * next key when another writer already created that slot. This does not provide general CAS,\n * locks, leases, transactions, unsafe truncation, WAL replay, or graph restore semantics.\n */\nexport function multiWriterAppendLogStorage<T = unknown>(\n\topts: MultiWriterAppendLogOptions<T>,\n): MultiWriterAppendLogStorageTier<T> {\n\tconst { kv, prefix = \"event-log\", maxAttempts = 1024 } = opts;\n\tconst capableKv = requireKvPutIfAbsent(kv, \"multiWriterAppendLogStorage\");\n\tlet tail: Promise<unknown> = Promise.resolve();\n\n\tif (!Number.isSafeInteger(maxAttempts) || maxAttempts < 1) {\n\t\tthrow new RangeError(\n\t\t\t`multiWriterAppendLogStorage: maxAttempts must be a positive safe integer, got ${maxAttempts}`,\n\t\t);\n\t}\n\n\tfunction initNextSeq(): Promise<number> {\n\t\treturn kv.list(`${prefix}/`).then((keys) => nextSeqFromKeys(prefix, keys));\n\t}\n\n\tfunction enqueue<R>(task: () => Promise<R>): Promise<R> {\n\t\tconst run = tail.then(task, task);\n\t\ttail = run.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn run;\n\t}\n\n\treturn {\n\t\tappend(value) {\n\t\t\treturn enqueue(() =>\n\t\t\t\tinitNextSeq().then((startSeq) => {\n\t\t\t\t\tlet seq = startSeq;\n\t\t\t\t\tlet attempt = 0;\n\t\t\t\t\tconst tryNext = (): Promise<AppendLogEntry<T>> => {\n\t\t\t\t\t\tif (attempt >= maxAttempts) {\n\t\t\t\t\t\t\treturn initNextSeq().then((refreshedSeq) => {\n\t\t\t\t\t\t\t\tseq = Math.max(seq, refreshedSeq);\n\t\t\t\t\t\t\t\tattempt = 0;\n\t\t\t\t\t\t\t\treturn tryNext();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattempt += 1;\n\t\t\t\t\t\tconst key = appendLogKey(prefix, seq);\n\t\t\t\t\t\treturn capableKv.putIfAbsent(key, value).then((created) => {\n\t\t\t\t\t\t\tif (created) return { key, seq, value };\n\t\t\t\t\t\t\tseq += 1;\n\t\t\t\t\t\t\tif (!Number.isSafeInteger(seq)) {\n\t\t\t\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t\t\t\t`append log next sequence is outside the safe integer range: ${prefix}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn tryNext();\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\treturn tryNext();\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tread(opts = {}) {\n\t\t\treturn enqueue(() => readAppendLogEntries(kv, prefix, opts));\n\t\t},\n\t\ttruncateAfter(seq) {\n\t\t\treturn enqueue(() => {\n\t\t\t\tif (!Number.isSafeInteger(seq) || seq < -1) {\n\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t`multiWriterAppendLogStorage.truncateAfter: seq must be an integer cursor >= -1, got ${seq}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"multiWriterAppendLogStorage.truncateAfter: unsupported without a stronger compaction capability\",\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\tsize() {\n\t\t\treturn enqueue(() => kv.list(`${prefix}/`).then((keys) => sizeFromKeys(prefix, keys)));\n\t\t},\n\t};\n}\n\n/** Create an in-memory append log. */\nexport function memoryAppendLog<T = unknown>(prefix?: string): AppendLogStorageTier<T> {\n\treturn appendLogStorage({ kv: memoryKv<T>(), prefix });\n}\n\n/** Create an in-memory D85 multi-writer append log. */\nexport function memoryMultiWriterAppendLog<T = unknown>(\n\tprefix?: string,\n): MultiWriterAppendLogStorageTier<T> {\n\treturn multiWriterAppendLogStorage({ kv: memoryKv<T>(), prefix });\n}\n"],"mappings":"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","names":["opts"]}
|