@cr_docs_t/dts 0.0.4 → 0.0.6-alpha.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/Fugue/FugueList.d.ts +8 -4
- package/dist/Fugue/FugueList.d.ts.map +1 -1
- package/dist/Fugue/FugueList.js +35 -1
- package/dist/Fugue/FugueTest.js +2 -1
- package/dist/TotalOrder/StringTotalOrder.d.ts +9 -0
- package/dist/TotalOrder/StringTotalOrder.d.ts.map +1 -0
- package/dist/TotalOrder/StringTotalOrder.js +35 -0
- package/dist/TotalOrder/UniquelyDenseTotalOrder.d.ts +26 -0
- package/dist/TotalOrder/UniquelyDenseTotalOrder.d.ts.map +1 -0
- package/dist/TotalOrder/UniquelyDenseTotalOrder.js +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/types/Fugue.d.ts +3 -0
- package/dist/types/Fugue.d.ts.map +1 -0
- package/dist/types/Fugue.js +1 -0
- package/dist/types/Message.d.ts +12 -0
- package/dist/types/Message.d.ts.map +1 -0
- package/dist/types/Message.js +5 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/package.json +8 -6
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { FugueState } from "../types/Fugue";
|
|
2
|
+
import UniquelyDenseTotalOrder from "../TotalOrder/UniquelyDenseTotalOrder";
|
|
3
|
+
import { FugueMessage } from "../types/Message";
|
|
3
4
|
/**
|
|
4
5
|
* A Fugue List CRDT, with insert and delete operations
|
|
5
6
|
*/
|
|
6
7
|
declare class FugueList<P> {
|
|
7
|
-
state:
|
|
8
|
+
state: FugueState<P>;
|
|
8
9
|
totalOrder: UniquelyDenseTotalOrder<P>;
|
|
9
10
|
positionCounter: number;
|
|
10
|
-
|
|
11
|
+
ws: WebSocket | null;
|
|
12
|
+
constructor(totalOrder: UniquelyDenseTotalOrder<P>, ws: WebSocket | null);
|
|
13
|
+
private propagate;
|
|
11
14
|
/**
|
|
12
15
|
* Inserts new element with 'value' at 'index' in the list
|
|
13
16
|
* @param index - Index to insert 'value' at
|
|
@@ -20,6 +23,7 @@ declare class FugueList<P> {
|
|
|
20
23
|
*/
|
|
21
24
|
delete(index: number): void;
|
|
22
25
|
observe(): string;
|
|
26
|
+
effect(msg: FugueMessage<P>): void;
|
|
23
27
|
}
|
|
24
28
|
export default FugueList;
|
|
25
29
|
//# sourceMappingURL=FugueList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FugueList.d.ts","sourceRoot":"","sources":["../../src/Fugue/FugueList.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FugueList.d.ts","sourceRoot":"","sources":["../../src/Fugue/FugueList.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,uBAAuB,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAC;AAE3D;;GAEG;AACH,cAAM,SAAS,CAAC,CAAC;IACb,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAM;IAC1B,UAAU,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACvC,eAAe,SAAK;IACpB,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;gBAET,UAAU,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI;IAKxE,OAAO,CAAC,SAAS;IAMjB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAsCnC;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM;IAgBpB,OAAO,IAAI,MAAM;IAgBjB,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;CAc9B;AAED,eAAe,SAAS,CAAC"}
|
package/dist/Fugue/FugueList.js
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import FNode from "./FNode";
|
|
2
|
+
import { Operation } from "../types/Message";
|
|
2
3
|
/**
|
|
3
4
|
* A Fugue List CRDT, with insert and delete operations
|
|
4
5
|
*/
|
|
5
6
|
class FugueList {
|
|
6
|
-
constructor(totalOrder) {
|
|
7
|
+
constructor(totalOrder, ws) {
|
|
7
8
|
this.state = [];
|
|
8
9
|
this.positionCounter = 0;
|
|
9
10
|
this.totalOrder = totalOrder;
|
|
11
|
+
this.ws = ws;
|
|
12
|
+
}
|
|
13
|
+
propagate(msg) {
|
|
14
|
+
if (!this.ws)
|
|
15
|
+
return;
|
|
16
|
+
this.ws.send(JSON.stringify(msg));
|
|
10
17
|
}
|
|
11
18
|
/**
|
|
12
19
|
* Inserts new element with 'value' at 'index' in the list
|
|
@@ -42,6 +49,12 @@ class FugueList {
|
|
|
42
49
|
atIndex.push(new FNode(this.totalOrder.createBetween(a.position), value));
|
|
43
50
|
}
|
|
44
51
|
}
|
|
52
|
+
// Send to replicas
|
|
53
|
+
this.propagate({
|
|
54
|
+
operation: Operation.INSERT,
|
|
55
|
+
position: index,
|
|
56
|
+
data: value,
|
|
57
|
+
});
|
|
45
58
|
}
|
|
46
59
|
/**
|
|
47
60
|
* Delete value in the list at index
|
|
@@ -54,6 +67,12 @@ class FugueList {
|
|
|
54
67
|
i++;
|
|
55
68
|
}
|
|
56
69
|
this.state.pop();
|
|
70
|
+
// Send to replicas
|
|
71
|
+
this.propagate({
|
|
72
|
+
operation: Operation.DELETE,
|
|
73
|
+
position: index,
|
|
74
|
+
data: null,
|
|
75
|
+
});
|
|
57
76
|
}
|
|
58
77
|
observe() {
|
|
59
78
|
let res = new String();
|
|
@@ -70,5 +89,20 @@ class FugueList {
|
|
|
70
89
|
}
|
|
71
90
|
return res.toString();
|
|
72
91
|
}
|
|
92
|
+
effect(msg) {
|
|
93
|
+
// On
|
|
94
|
+
const { operation, data, position } = msg;
|
|
95
|
+
switch (operation) {
|
|
96
|
+
// Operation.INSERT -> insert
|
|
97
|
+
case Operation.INSERT:
|
|
98
|
+
if (!data)
|
|
99
|
+
throw Error("Data is required for Operation.INSERT");
|
|
100
|
+
this.insert(position, data);
|
|
101
|
+
// Operation.DELETE -> delete
|
|
102
|
+
case Operation.DELETE:
|
|
103
|
+
this.delete(position);
|
|
104
|
+
}
|
|
105
|
+
throw Error("Invalid operation");
|
|
106
|
+
}
|
|
73
107
|
}
|
|
74
108
|
export default FugueList;
|
package/dist/Fugue/FugueTest.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import FugueList from "./FugueList";
|
|
2
|
-
import { randomString
|
|
2
|
+
import { randomString } from "../utils/index";
|
|
3
|
+
import StringTotalOrder from "../TotalOrder/StringTotalOrder";
|
|
3
4
|
const test1 = new FugueList(new StringTotalOrder(randomString(5)));
|
|
4
5
|
const test2 = new FugueList(new StringTotalOrder(randomString(5)));
|
|
5
6
|
const word1 = "SHADOW WIZARD MONEY GANG";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import UniquelyDenseTotalOrder from "./UniquelyDenseTotalOrder";
|
|
2
|
+
export default class StringTotalOrder implements UniquelyDenseTotalOrder<string> {
|
|
3
|
+
readonly replicaID: string;
|
|
4
|
+
private counter;
|
|
5
|
+
compare(a: string, b: string): number;
|
|
6
|
+
constructor(replicaID: string);
|
|
7
|
+
createBetween(a?: string, b?: string): string;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=StringTotalOrder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StringTotalOrder.d.ts","sourceRoot":"","sources":["../../src/TotalOrder/StringTotalOrder.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,2BAA2B,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,gBAAiB,YAAW,uBAAuB,CAAC,MAAM,CAAC;IAC5E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,OAAO,CAAK;IAEpB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;gBAIzB,SAAS,EAAE,MAAM;IAI7B,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CA6BhD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export default class StringTotalOrder {
|
|
2
|
+
compare(a, b) {
|
|
3
|
+
return a.localeCompare(b);
|
|
4
|
+
}
|
|
5
|
+
constructor(replicaID) {
|
|
6
|
+
this.counter = 0;
|
|
7
|
+
this.replicaID = replicaID;
|
|
8
|
+
}
|
|
9
|
+
createBetween(a, b) {
|
|
10
|
+
// Create a wholly unique string using a causal dot, i.e. (replicaID, counter)
|
|
11
|
+
const uniqueStr = `${this.replicaID}${this.counter++}`;
|
|
12
|
+
// If node is the first ever position in the document
|
|
13
|
+
if (!a && !b) {
|
|
14
|
+
return uniqueStr + "R";
|
|
15
|
+
}
|
|
16
|
+
// If node is the first position at that index
|
|
17
|
+
if (!a) {
|
|
18
|
+
return b + uniqueStr + "R";
|
|
19
|
+
}
|
|
20
|
+
// If node is the last position at that index
|
|
21
|
+
if (!b) {
|
|
22
|
+
return a + uniqueStr + "R";
|
|
23
|
+
}
|
|
24
|
+
const isAPrefixOfB = b.substring(0, a.length).localeCompare(a);
|
|
25
|
+
// If a is not a prefix of b append a globally unique new string to a and return that +R
|
|
26
|
+
if (!isAPrefixOfB) {
|
|
27
|
+
return a + uniqueStr + "R";
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// If a is a prefix of b replace the R at the end of b with L.
|
|
31
|
+
// Then append a globally unique string to it and return it +R.
|
|
32
|
+
return b.slice(0, -1) + "L" + uniqueStr + "R";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper interface for sorting and creating unique immutable positions,
|
|
3
|
+
* suitable for use in a List CRDT. Taken from mattweidner.com/2022/10/21/basic-list-crdt.html
|
|
4
|
+
*
|
|
5
|
+
* @type P The type of positions. Treated as immutable.
|
|
6
|
+
*/
|
|
7
|
+
export default interface UniquelyDenseTotalOrder<P> {
|
|
8
|
+
/**
|
|
9
|
+
* Usual compare function for sorts: returns negative if a < b in
|
|
10
|
+
* their sort order, positive if a > b.
|
|
11
|
+
*/
|
|
12
|
+
compare(a: P, b: P): number;
|
|
13
|
+
/**
|
|
14
|
+
* Returns a globally unique new position c such that a < c < b.
|
|
15
|
+
*
|
|
16
|
+
* "Globally unique" means that the created position must be distinct
|
|
17
|
+
* from all other created positions, including ones created concurrently
|
|
18
|
+
* by other users.
|
|
19
|
+
*
|
|
20
|
+
* When a is undefined, it is treated as the start of the list, i.e.,
|
|
21
|
+
* this returns c such that c < b. Likewise, undefined b is treated
|
|
22
|
+
* as the end of the list.
|
|
23
|
+
*/
|
|
24
|
+
createBetween(a?: P, b?: P): P;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=UniquelyDenseTotalOrder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UniquelyDenseTotalOrder.d.ts","sourceRoot":"","sources":["../../src/TotalOrder/UniquelyDenseTotalOrder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,WAAW,uBAAuB,CAAC,CAAC;IAC9C;;;OAGG;IACH,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;IAE5B;;;;;;;;;;OAUG;IACH,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import FugueList from "./Fugue/FugueList";
|
|
2
2
|
import CausalTree from "./CausalTree/CausalTree";
|
|
3
|
-
|
|
3
|
+
import UniquelyDenseTotalOrder from "./TotalOrder/UniquelyDenseTotalOrder";
|
|
4
|
+
import StringTotalOrder from "./TotalOrder/StringTotalOrder";
|
|
5
|
+
export { FugueList, CausalTree, UniquelyDenseTotalOrder, StringTotalOrder, };
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,UAAU,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,UAAU,MAAM,yBAAyB,CAAC;AACjD,OAAO,uBAAuB,MAAM,sCAAsC,CAAC;AAC3E,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAEH,SAAS,EACT,UAAU,EAEV,uBAAuB,EACvB,gBAAgB,GAEnB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import FugueList from "./Fugue/FugueList";
|
|
2
2
|
import CausalTree from "./CausalTree/CausalTree";
|
|
3
|
-
|
|
3
|
+
import StringTotalOrder from "./TotalOrder/StringTotalOrder";
|
|
4
|
+
export {
|
|
5
|
+
// Data Types
|
|
6
|
+
FugueList, CausalTree, StringTotalOrder,
|
|
7
|
+
// Utilities
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Fugue.d.ts","sourceRoot":"","sources":["../../src/types/Fugue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAEnC,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare enum Operation {
|
|
2
|
+
INSERT = 0,
|
|
3
|
+
DELETE = 1
|
|
4
|
+
}
|
|
5
|
+
export type Position = number;
|
|
6
|
+
export type Data = string;
|
|
7
|
+
export interface FugueMessage<P> {
|
|
8
|
+
operation: Operation;
|
|
9
|
+
position: number;
|
|
10
|
+
data: Data | null;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=Message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../src/types/Message.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACjB,MAAM,IAAA;IACN,MAAM,IAAA;CACT;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC;AAE1B,MAAM,WAAW,YAAY,CAAC,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAIxD"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cr_docs_t/dts",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6-alpha.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"prepublishOnly": "npm run build"
|
|
10
|
+
},
|
|
7
11
|
"exports": {
|
|
8
12
|
".": {
|
|
9
13
|
"import": "./dist/index.js",
|
|
@@ -16,14 +20,12 @@
|
|
|
16
20
|
"Tanitoluwa Olamiji Adebayo"
|
|
17
21
|
],
|
|
18
22
|
"license": "ISC",
|
|
23
|
+
"packageManager": "pnpm@10.20.0",
|
|
19
24
|
"devDependencies": {
|
|
20
25
|
"@types/node": "^24.10.1",
|
|
21
26
|
"typescript": "^5.9.3"
|
|
22
27
|
},
|
|
23
28
|
"files": [
|
|
24
29
|
"dist"
|
|
25
|
-
]
|
|
26
|
-
|
|
27
|
-
"build": "tsc"
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
+
]
|
|
31
|
+
}
|