@sovereignbase/convergent-replicated-list 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 +201 -0
- package/README.md +326 -0
- package/dist/index.cjs +859 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +380 -0
- package/dist/index.d.ts +380 -0
- package/dist/index.js +859 -0
- package/dist/index.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\jorts\\convergent-replicated-list\\dist\\index.cjs"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAAuE;AACvE;AACA;AACA,SAAS,iBAAiB,CAAC,aAAa,EAAE;AAC1C,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM;AACnC,EAAE,IAAI,MAAM,EAAE,aAAa,CAAC,IAAI;AAChC,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI;AAClC,IAAI,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI;AACpD,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,IAAI,KAAK,EAAE;AACX,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK;AACtC,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK;AACnD,IAAI,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI;AACpD,EAAE;AACF;AACA;AACA;AACA,IAAI,YAAY,EAAE,MAAM,QAAQ,MAAM;AACtC;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE;AAC7B,IAAI,MAAM,OAAO,mBAAE,OAAQ,UAAG,MAAI;AAClC,IAAI,KAAK,CAAC,CAAC,4CAA4C,EAAE,MAAM,CAAC,CAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,kBAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,wBAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,uBAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\jorts\\convergent-replicated-list\\dist\\index.cjs","sourcesContent":[null]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A live CRList entry stored as a doubly-linked list node.
|
|
3
|
+
*
|
|
4
|
+
* The `predecessor` field is the stable ordering anchor used for convergence;
|
|
5
|
+
* `prev` and `next` are local projection links for indexed reads and mutations.
|
|
6
|
+
*/
|
|
7
|
+
type DoublyLinkedListEntry<T> = {
|
|
8
|
+
/** Stable UUIDv7 identity for this entry. */
|
|
9
|
+
uuidv7: string;
|
|
10
|
+
/** User payload stored in the list. */
|
|
11
|
+
value: T;
|
|
12
|
+
/** Stable predecessor UUIDv7, or `'\0'` for root-level entries. */
|
|
13
|
+
predecessor: string;
|
|
14
|
+
/** Current zero-based index in the local live view. */
|
|
15
|
+
index: number;
|
|
16
|
+
/** Previous live entry in the local projection. */
|
|
17
|
+
prev: DoublyLinkedListEntry<T> | undefined;
|
|
18
|
+
/** Next live entry in the local projection. */
|
|
19
|
+
next: DoublyLinkedListEntry<T> | undefined;
|
|
20
|
+
} | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Mutable CRList replica state.
|
|
23
|
+
*
|
|
24
|
+
* `parentMap` indexes live entries by UUIDv7. `childrenMap` indexes entries by
|
|
25
|
+
* predecessor to support deterministic flattening. `tombstones` records deleted
|
|
26
|
+
* UUIDv7 entries until they are garbage collected through acknowledgement
|
|
27
|
+
* frontiers.
|
|
28
|
+
*/
|
|
29
|
+
type CRListReplica<T> = {
|
|
30
|
+
/** Number of live entries in the local projection. */
|
|
31
|
+
size: number;
|
|
32
|
+
/** Current live entry used as the walking cursor. */
|
|
33
|
+
cursor: DoublyLinkedListEntry<T>;
|
|
34
|
+
/** Deleted UUIDv7 entries retained for gossip and convergence. */
|
|
35
|
+
tombstones: Set<string>;
|
|
36
|
+
/** Live entries by UUIDv7. */
|
|
37
|
+
parentMap: Map<string, DoublyLinkedListEntry<T>>;
|
|
38
|
+
/** Live entries grouped by stable predecessor identifier. */
|
|
39
|
+
childrenMap: Map<string, Array<NonNullable<DoublyLinkedListEntry<T>>>>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Serializable value entry used by snapshots and deltas.
|
|
43
|
+
*/
|
|
44
|
+
type CRListSnapshotValueEntry<T> = {
|
|
45
|
+
/** Stable UUIDv7 identity for this entry. */
|
|
46
|
+
uuidv7: string;
|
|
47
|
+
/** User payload for this entry. */
|
|
48
|
+
value: T;
|
|
49
|
+
/** Stable predecessor UUIDv7, or `'\0'` for root-level entries. */
|
|
50
|
+
predecessor: string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Full serializable CRList state.
|
|
54
|
+
*/
|
|
55
|
+
type CRListSnapshot<T> = {
|
|
56
|
+
/** Serializable live values. */
|
|
57
|
+
values: Array<CRListSnapshotValueEntry<T>>;
|
|
58
|
+
/** Retained deleted UUIDv7 entries. */
|
|
59
|
+
tombstones: Array<string>;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Partial CRList state gossiped between replicas.
|
|
63
|
+
*/
|
|
64
|
+
type CRListDelta<T> = Partial<CRListSnapshot<T>>;
|
|
65
|
+
/**
|
|
66
|
+
* Minimal local live-view patch keyed by list index.
|
|
67
|
+
*
|
|
68
|
+
* `undefined` means an entry was removed at the index. Any other value means a
|
|
69
|
+
* value was inserted or replaced at the index.
|
|
70
|
+
*/
|
|
71
|
+
type CRListChange<T> = Record<number, T | undefined>;
|
|
72
|
+
/**
|
|
73
|
+
* Tombstone acknowledgement frontier.
|
|
74
|
+
*/
|
|
75
|
+
type CRListAck = string;
|
|
76
|
+
/**
|
|
77
|
+
* Maps CRList event names to their event payload shapes.
|
|
78
|
+
*/
|
|
79
|
+
type CRListEventMap<T> = {
|
|
80
|
+
/** STATE / PROJECTION */
|
|
81
|
+
snapshot: CRListSnapshot<T>;
|
|
82
|
+
change: CRListChange<T>;
|
|
83
|
+
/** GOSSIP / PROTOCOL */
|
|
84
|
+
delta: CRListDelta<T>;
|
|
85
|
+
ack: CRListAck;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Represents a strongly typed CRList event listener.
|
|
89
|
+
*/
|
|
90
|
+
type CRListEventListener<T, K extends keyof CRListEventMap<T>> = ((event: CustomEvent<CRListEventMap<T>[K]>) => void) | {
|
|
91
|
+
handleEvent(event: CustomEvent<CRListEventMap<T>[K]>): void;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Resolves an event name to its corresponding listener type.
|
|
95
|
+
*/
|
|
96
|
+
type CRListEventListenerFor<T, K extends string> = K extends keyof CRListEventMap<T> ? CRListEventListener<T, K> : EventListenerOrEventListenerObject;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Creates a local CRList replica from an optional snapshot.
|
|
100
|
+
*
|
|
101
|
+
* Invalid snapshot records are ignored. Accepted values are cloned, indexed by
|
|
102
|
+
* UUIDv7, linked through their predecessor buckets, and exposed as a live
|
|
103
|
+
* doubly-linked list.
|
|
104
|
+
*
|
|
105
|
+
* @param snapshot Optional serializable CRList state.
|
|
106
|
+
* @returns A hydrated CRList replica.
|
|
107
|
+
*
|
|
108
|
+
* Time complexity: O(n log n + t + c), worst case O(n^2 + t + c)
|
|
109
|
+
* - n = snapshot value entry count
|
|
110
|
+
* - t = snapshot tombstone count
|
|
111
|
+
* - c = cloned value payload
|
|
112
|
+
*
|
|
113
|
+
* Space complexity: O(n + t + c)
|
|
114
|
+
*/
|
|
115
|
+
declare function __create<T>(snapshot?: CRListSnapshot<T>): CRListReplica<T>;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Reads the value at an index in the replica live view.
|
|
119
|
+
*
|
|
120
|
+
* The replica cursor is moved as part of the lookup. Out-of-bounds and empty
|
|
121
|
+
* list reads resolve to `undefined` instead of throwing.
|
|
122
|
+
*
|
|
123
|
+
* @param targetIndex Index in the live list.
|
|
124
|
+
* @param crListReplica Replica to read from.
|
|
125
|
+
* @returns The value at `targetIndex`, or `undefined` when no value is present.
|
|
126
|
+
*
|
|
127
|
+
* Time complexity: O(d), worst case O(n)
|
|
128
|
+
* - d = distance from cursor to target index
|
|
129
|
+
* - n = list size
|
|
130
|
+
*
|
|
131
|
+
* Space complexity: O(1)
|
|
132
|
+
*/
|
|
133
|
+
declare function __read<T>(targetIndex: number, crListReplica: CRListReplica<T>): T | undefined;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Applies a local value mutation to the replica live view.
|
|
137
|
+
*
|
|
138
|
+
* The update can replace a range starting at the target entry, insert values
|
|
139
|
+
* before it, or insert values after it. The returned delta is suitable for
|
|
140
|
+
* gossip and the returned change describes the local live-view patch.
|
|
141
|
+
*
|
|
142
|
+
* @param listIndex Target index in the live list.
|
|
143
|
+
* @param listValues Values to insert or overwrite.
|
|
144
|
+
* @param crListReplica Replica to mutate.
|
|
145
|
+
* @param mode Mutation mode relative to `listIndex`.
|
|
146
|
+
* @returns A local change and gossip delta, or `false` if no mutation occurred.
|
|
147
|
+
*
|
|
148
|
+
* Time complexity: O(d + v + r + vk + c), worst case O(vn + c)
|
|
149
|
+
* - d = distance from cursor to target index
|
|
150
|
+
* - v = amount of input values
|
|
151
|
+
* - r = amount of nodes after inserted values whose indexes must be shifted
|
|
152
|
+
* - k = sibling bucket size when predecessor bucket is updated
|
|
153
|
+
* - c = cloned value payload size across all input values
|
|
154
|
+
*
|
|
155
|
+
* Space complexity: O(v + c)
|
|
156
|
+
*/
|
|
157
|
+
declare function __update<T>(listIndex: number, listValues: Array<T>, crListReplica: CRListReplica<T>, mode: 'overwrite' | 'before' | 'after'): {
|
|
158
|
+
change: CRListChange<T>;
|
|
159
|
+
delta: CRListDelta<T>;
|
|
160
|
+
} | false;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Deletes a range from the replica live view.
|
|
164
|
+
*
|
|
165
|
+
* With no indexes, the full list is deleted. With only `startIndex`, all entries
|
|
166
|
+
* from `startIndex` onward are deleted. With both indexes, the deleted range is
|
|
167
|
+
* `[startIndex, endIndex)`.
|
|
168
|
+
*
|
|
169
|
+
* @param crListReplica Replica to mutate.
|
|
170
|
+
* @param startIndex Inclusive start index. Defaults to `0`.
|
|
171
|
+
* @param endIndex Exclusive end index. Defaults to the current list size.
|
|
172
|
+
* @returns A local change and gossip delta, or `false` if nothing was deleted.
|
|
173
|
+
*
|
|
174
|
+
* Time complexity: O(d + qk + r), worst case O(n^2)
|
|
175
|
+
* - d = distance from cursor to target index
|
|
176
|
+
* - q = amount of deleted nodes
|
|
177
|
+
* - r = amount of nodes after the deleted range whose indexes must be shifted
|
|
178
|
+
* - k = sibling bucket size when deleted entries are removed from buckets
|
|
179
|
+
*
|
|
180
|
+
* Space complexity: O(q)
|
|
181
|
+
*/
|
|
182
|
+
declare function __delete<T>(crListReplica: CRListReplica<T>, startIndex?: number, endIndex?: number): {
|
|
183
|
+
change: CRListChange<T>;
|
|
184
|
+
delta: CRListDelta<T>;
|
|
185
|
+
} | false;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Merges a remote CRList delta into the local replica.
|
|
189
|
+
*
|
|
190
|
+
* Accepted tombstones update the local live view and accepted values are attached
|
|
191
|
+
* to the predecessor tree. Tail-append deltas are linked incrementally; deltas
|
|
192
|
+
* that can affect ordering fall back to deterministic relinking.
|
|
193
|
+
*
|
|
194
|
+
* @param crListReplica Replica to mutate.
|
|
195
|
+
* @param crListDelta Remote gossip delta.
|
|
196
|
+
* @returns A minimal local change patch, or `false` when the delta is ignored.
|
|
197
|
+
*
|
|
198
|
+
* Time complexity: O(v + t + c) for tail-append deltas; O(n + t + qk) for tombstone-only deletes; otherwise O(n log n + v + t + m*k + c)
|
|
199
|
+
* Worst case: O(n^2 + (v + t)n + c)
|
|
200
|
+
* - n = replica value entry count after merge
|
|
201
|
+
* - v = delta value entry count
|
|
202
|
+
* - t = delta tombstone count
|
|
203
|
+
* - q = amount of live entries deleted by tombstones
|
|
204
|
+
* - m = entries moved between predecessor buckets
|
|
205
|
+
* - k = sibling bucket size when entries are removed from buckets
|
|
206
|
+
* - c = cloned delta value payload size
|
|
207
|
+
*
|
|
208
|
+
* Space complexity: O(n + v + t + c)
|
|
209
|
+
*/
|
|
210
|
+
declare function __merge<T>(crListReplica: CRListReplica<T>, crListDelta: CRListDelta<T>): CRListChange<T> | false;
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Returns the replica tombstone acknowledgement frontier.
|
|
214
|
+
*
|
|
215
|
+
* The frontier is the greatest tombstone identifier currently retained by the
|
|
216
|
+
* replica. Peers can use it as input for tombstone garbage collection.
|
|
217
|
+
*
|
|
218
|
+
* @param crListReplica Replica to acknowledge.
|
|
219
|
+
* @returns The acknowledgement frontier, or `false` when there are no tombstones.
|
|
220
|
+
*
|
|
221
|
+
* Time complexity: O(t)
|
|
222
|
+
* - t = replica tombstone count
|
|
223
|
+
*
|
|
224
|
+
* Space complexity: O(1)
|
|
225
|
+
*/
|
|
226
|
+
declare function __acknowledge<T>(crListReplica: CRListReplica<T>): CRListAck | false;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Removes tombstones acknowledged by all supplied frontiers.
|
|
230
|
+
*
|
|
231
|
+
* The minimum frontier is used as the safe collection boundary. Tombstones less
|
|
232
|
+
* than or equal to that boundary are removed from the local replica.
|
|
233
|
+
*
|
|
234
|
+
* @param frontiers Acknowledgement frontiers received from peers.
|
|
235
|
+
* @param crListReplica Replica whose tombstones will be collected.
|
|
236
|
+
*
|
|
237
|
+
* Time complexity: O(f log f + t)
|
|
238
|
+
* - f = frontier count
|
|
239
|
+
* - t = replica tombstone count
|
|
240
|
+
*
|
|
241
|
+
* Space complexity: O(1)
|
|
242
|
+
*/
|
|
243
|
+
declare function __garbageCollect<T>(frontiers: Array<CRListAck>, crListReplica: CRListReplica<T>): void;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Creates a full serializable CRList snapshot from the current replica state.
|
|
247
|
+
*
|
|
248
|
+
* The snapshot contains every live value entry and all retained tombstones. Value
|
|
249
|
+
* payloads are cloned so callers cannot mutate the replica through the snapshot.
|
|
250
|
+
*
|
|
251
|
+
* @param crListReplica Replica to snapshot.
|
|
252
|
+
* @returns A full snapshot suitable for hydration or transport.
|
|
253
|
+
*
|
|
254
|
+
* Time complexity: O(n + t + c)
|
|
255
|
+
* - n = replica value entry count
|
|
256
|
+
* - t = replica tombstone count
|
|
257
|
+
* - c = cloned value payload size
|
|
258
|
+
*
|
|
259
|
+
* Space complexity: O(n + t + c)
|
|
260
|
+
*/
|
|
261
|
+
declare function __snapshot<T>(crListReplica: CRListReplica<T>): CRListSnapshot<T>;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Error codes thrown by {@link CRList}.
|
|
265
|
+
*/
|
|
266
|
+
type CRListErrorCode = 'VALUE_NOT_CLONEABLE' | 'INDEX_OUT_OF_BOUNDS' | 'LIST_EMPTY' | 'LIST_INTEGRITY_VIOLATION' | 'UPDATE_EXPECTED_AN_ARRAY';
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* A convergent replicated list.
|
|
270
|
+
*
|
|
271
|
+
* Numeric property access reads and mutates the live list projection:
|
|
272
|
+
* `list[0]` reads an entry, `list[0] = value` writes an entry, and `delete
|
|
273
|
+
* list[0]` removes one entry. Local mutations emit `delta` and `change` events;
|
|
274
|
+
* remote merges emit `change` events.
|
|
275
|
+
*
|
|
276
|
+
* @typeParam T - The value type stored in the list.
|
|
277
|
+
*/
|
|
278
|
+
declare class CRList<T> {
|
|
279
|
+
/**
|
|
280
|
+
* Reads or overwrites an entry in the live list projection by index.
|
|
281
|
+
*/
|
|
282
|
+
[index: number]: T;
|
|
283
|
+
private readonly state;
|
|
284
|
+
private readonly eventTarget;
|
|
285
|
+
/**
|
|
286
|
+
* Creates a replicated list from an optional serializable snapshot.
|
|
287
|
+
*
|
|
288
|
+
* @param snapshot - A previously emitted CRList snapshot.
|
|
289
|
+
*/
|
|
290
|
+
constructor(snapshot?: CRListSnapshot<T>);
|
|
291
|
+
/**
|
|
292
|
+
* The current number of live entries.
|
|
293
|
+
*/
|
|
294
|
+
get size(): number;
|
|
295
|
+
/**
|
|
296
|
+
* Inserts a value before an index.
|
|
297
|
+
*
|
|
298
|
+
* If `beforeIndex` is omitted, the value is inserted at the start of the list.
|
|
299
|
+
*
|
|
300
|
+
* @param value - The value to insert.
|
|
301
|
+
* @param beforeIndex - The index to insert before.
|
|
302
|
+
*/
|
|
303
|
+
prepend(value: T, beforeIndex?: number): void;
|
|
304
|
+
/**
|
|
305
|
+
* Inserts a value after an index.
|
|
306
|
+
*
|
|
307
|
+
* If `afterIndex` is omitted, the value is appended at the end of the list.
|
|
308
|
+
*
|
|
309
|
+
* @param value - The value to insert.
|
|
310
|
+
* @param afterIndex - The index to insert after.
|
|
311
|
+
*/
|
|
312
|
+
append(value: T, afterIndex?: number): void;
|
|
313
|
+
/**
|
|
314
|
+
* Removes the entry at an index.
|
|
315
|
+
*
|
|
316
|
+
* @param index - The index to remove.
|
|
317
|
+
*/
|
|
318
|
+
remove(index: number): void;
|
|
319
|
+
/**
|
|
320
|
+
* Applies a remote gossip delta to this list.
|
|
321
|
+
*
|
|
322
|
+
* Emits a `change` event when the merge changes the live projection.
|
|
323
|
+
*
|
|
324
|
+
* @param delta - The remote CRList delta to merge.
|
|
325
|
+
*/
|
|
326
|
+
merge(delta: CRListDelta<T>): void;
|
|
327
|
+
/**
|
|
328
|
+
* Emits an acknowledgement frontier for currently retained tombstones.
|
|
329
|
+
*/
|
|
330
|
+
acknowledge(): void;
|
|
331
|
+
/**
|
|
332
|
+
* Garbage-collects tombstones that are covered by acknowledgement frontiers.
|
|
333
|
+
*
|
|
334
|
+
* @param frontiers - Replica acknowledgement frontiers.
|
|
335
|
+
*/
|
|
336
|
+
garbageCollect(frontiers: Array<CRListAck>): void;
|
|
337
|
+
/**
|
|
338
|
+
* Emits the current serializable list snapshot.
|
|
339
|
+
*/
|
|
340
|
+
snapshot(): void;
|
|
341
|
+
/**
|
|
342
|
+
* Registers an event listener.
|
|
343
|
+
*
|
|
344
|
+
* @param type - The event type to listen for.
|
|
345
|
+
* @param listener - The listener to register.
|
|
346
|
+
* @param options - Listener registration options.
|
|
347
|
+
*/
|
|
348
|
+
addEventListener<K extends keyof CRListEventMap<T>>(type: K, listener: CRListEventListenerFor<T, K> | null, options?: boolean | AddEventListenerOptions): void;
|
|
349
|
+
/**
|
|
350
|
+
* Removes an event listener.
|
|
351
|
+
*
|
|
352
|
+
* @param type - The event type to stop listening for.
|
|
353
|
+
* @param listener - The listener to remove.
|
|
354
|
+
* @param options - Listener removal options.
|
|
355
|
+
*/
|
|
356
|
+
removeEventListener<K extends keyof CRListEventMap<T>>(type: K, listener: CRListEventListenerFor<T, K> | null, options?: boolean | EventListenerOptions): void;
|
|
357
|
+
/**
|
|
358
|
+
* Returns a serializable snapshot representation of this list.
|
|
359
|
+
*
|
|
360
|
+
* Called automatically by `JSON.stringify`.
|
|
361
|
+
*/
|
|
362
|
+
toJSON(): CRListSnapshot<T>;
|
|
363
|
+
/**
|
|
364
|
+
* Returns this list as a JSON string.
|
|
365
|
+
*/
|
|
366
|
+
toString(): string;
|
|
367
|
+
/**
|
|
368
|
+
* Iterates over the current live values in index order.
|
|
369
|
+
*/
|
|
370
|
+
[Symbol.iterator](): IterableIterator<T>;
|
|
371
|
+
/**
|
|
372
|
+
* Calls a function once for each live value in index order.
|
|
373
|
+
*
|
|
374
|
+
* @param callback - Function to call for each value.
|
|
375
|
+
* @param thisArg - Optional `this` value for the callback.
|
|
376
|
+
*/
|
|
377
|
+
forEach(callback: (value: T, index: number, list: this) => void, thisArg?: unknown): void;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export { CRList, type CRListAck, type CRListChange, type CRListDelta, type CRListErrorCode, type CRListReplica, type CRListSnapshot, __acknowledge, __create, __delete, __garbageCollect, __merge, __read, __snapshot, __update };
|