@vuer-ai/vuer-rtc 0.0.1
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/client/EditBuffer.d.ts +43 -0
- package/dist/client/EditBuffer.d.ts.map +1 -0
- package/dist/client/EditBuffer.js +96 -0
- package/dist/client/EditBuffer.js.map +1 -0
- package/dist/client/actions.d.ts +66 -0
- package/dist/client/actions.d.ts.map +1 -0
- package/dist/client/actions.js +345 -0
- package/dist/client/actions.js.map +1 -0
- package/dist/client/createGraph.d.ts +30 -0
- package/dist/client/createGraph.d.ts.map +1 -0
- package/dist/client/createGraph.js +91 -0
- package/dist/client/createGraph.js.map +1 -0
- package/dist/client/hooks.d.ts +81 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/hooks.js +161 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +10 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +74 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +11 -0
- package/dist/client/types.js.map +1 -0
- package/dist/hooks.d.ts +8 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +7 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/OperationTypes.d.ts +239 -0
- package/dist/operations/OperationTypes.d.ts.map +1 -0
- package/dist/operations/OperationTypes.js +10 -0
- package/dist/operations/OperationTypes.js.map +1 -0
- package/dist/operations/OperationValidator.d.ts +32 -0
- package/dist/operations/OperationValidator.d.ts.map +1 -0
- package/dist/operations/OperationValidator.js +208 -0
- package/dist/operations/OperationValidator.js.map +1 -0
- package/dist/operations/apply/array.d.ts +22 -0
- package/dist/operations/apply/array.d.ts.map +1 -0
- package/dist/operations/apply/array.js +64 -0
- package/dist/operations/apply/array.js.map +1 -0
- package/dist/operations/apply/boolean.d.ts +18 -0
- package/dist/operations/apply/boolean.d.ts.map +1 -0
- package/dist/operations/apply/boolean.js +34 -0
- package/dist/operations/apply/boolean.js.map +1 -0
- package/dist/operations/apply/color.d.ts +14 -0
- package/dist/operations/apply/color.d.ts.map +1 -0
- package/dist/operations/apply/color.js +46 -0
- package/dist/operations/apply/color.js.map +1 -0
- package/dist/operations/apply/index.d.ts +18 -0
- package/dist/operations/apply/index.d.ts.map +1 -0
- package/dist/operations/apply/index.js +26 -0
- package/dist/operations/apply/index.js.map +1 -0
- package/dist/operations/apply/node.d.ts +24 -0
- package/dist/operations/apply/node.d.ts.map +1 -0
- package/dist/operations/apply/node.js +77 -0
- package/dist/operations/apply/node.js.map +1 -0
- package/dist/operations/apply/number.d.ts +26 -0
- package/dist/operations/apply/number.d.ts.map +1 -0
- package/dist/operations/apply/number.js +54 -0
- package/dist/operations/apply/number.js.map +1 -0
- package/dist/operations/apply/object.d.ts +14 -0
- package/dist/operations/apply/object.d.ts.map +1 -0
- package/dist/operations/apply/object.js +47 -0
- package/dist/operations/apply/object.js.map +1 -0
- package/dist/operations/apply/quaternion.d.ts +15 -0
- package/dist/operations/apply/quaternion.d.ts.map +1 -0
- package/dist/operations/apply/quaternion.js +33 -0
- package/dist/operations/apply/quaternion.js.map +1 -0
- package/dist/operations/apply/string.d.ts +14 -0
- package/dist/operations/apply/string.d.ts.map +1 -0
- package/dist/operations/apply/string.js +26 -0
- package/dist/operations/apply/string.js.map +1 -0
- package/dist/operations/apply/types.d.ts +34 -0
- package/dist/operations/apply/types.d.ts.map +1 -0
- package/dist/operations/apply/types.js +32 -0
- package/dist/operations/apply/types.js.map +1 -0
- package/dist/operations/apply/vector3.d.ts +18 -0
- package/dist/operations/apply/vector3.d.ts.map +1 -0
- package/dist/operations/apply/vector3.js +44 -0
- package/dist/operations/apply/vector3.js.map +1 -0
- package/dist/operations/dispatcher.d.ts +35 -0
- package/dist/operations/dispatcher.d.ts.map +1 -0
- package/dist/operations/dispatcher.js +107 -0
- package/dist/operations/dispatcher.js.map +1 -0
- package/dist/operations/index.d.ts +10 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +17 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/state/ConflictResolver.d.ts +36 -0
- package/dist/state/ConflictResolver.d.ts.map +1 -0
- package/dist/state/ConflictResolver.js +167 -0
- package/dist/state/ConflictResolver.js.map +1 -0
- package/dist/state/DType.d.ts +160 -0
- package/dist/state/DType.d.ts.map +1 -0
- package/dist/state/DType.js +282 -0
- package/dist/state/DType.js.map +1 -0
- package/dist/state/Schema.d.ts +32 -0
- package/dist/state/Schema.d.ts.map +1 -0
- package/dist/state/Schema.js +175 -0
- package/dist/state/Schema.js.map +1 -0
- package/dist/state/VectorClock.d.ts +42 -0
- package/dist/state/VectorClock.d.ts.map +1 -0
- package/dist/state/VectorClock.js +84 -0
- package/dist/state/VectorClock.js.map +1 -0
- package/dist/state/index.d.ts +11 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +13 -0
- package/dist/state/index.js.map +1 -0
- package/docs/OPERATION_HINTS.md +222 -0
- package/docs/SCENE_GRAPH.md +373 -0
- package/docs/TYPE_BEHAVIORS.md +348 -0
- package/examples/01-basic-usage.ts +139 -0
- package/examples/02-concurrent-edits.ts +208 -0
- package/examples/03-scene-building.ts +258 -0
- package/examples/04-conflict-resolution.ts +339 -0
- package/examples/README.md +86 -0
- package/jest.config.js +19 -0
- package/package.json +57 -0
- package/src/client/EditBuffer.ts +105 -0
- package/src/client/actions.ts +397 -0
- package/src/client/createGraph.ts +132 -0
- package/src/client/hooks.tsx +249 -0
- package/src/client/index.ts +35 -0
- package/src/client/types.ts +94 -0
- package/src/hooks.ts +20 -0
- package/src/index.ts +14 -0
- package/src/operations/OperationTypes.ts +340 -0
- package/src/operations/OperationValidator.ts +260 -0
- package/src/operations/apply/array.ts +84 -0
- package/src/operations/apply/boolean.ts +48 -0
- package/src/operations/apply/color.ts +65 -0
- package/src/operations/apply/index.ts +37 -0
- package/src/operations/apply/node.ts +98 -0
- package/src/operations/apply/number.ts +76 -0
- package/src/operations/apply/object.ts +63 -0
- package/src/operations/apply/quaternion.ts +47 -0
- package/src/operations/apply/string.ts +36 -0
- package/src/operations/apply/types.ts +66 -0
- package/src/operations/apply/vector3.ts +60 -0
- package/src/operations/dispatcher.ts +127 -0
- package/src/operations/index.ts +80 -0
- package/src/state/ConflictResolver.ts +205 -0
- package/src/state/DType.ts +333 -0
- package/src/state/Schema.ts +236 -0
- package/src/state/VectorClock.ts +98 -0
- package/src/state/index.ts +14 -0
- package/tests/client/actions.test.ts +371 -0
- package/tests/client/edit-buffer.test.ts +117 -0
- package/tests/fixtures/array-ops.jsonl +6 -0
- package/tests/fixtures/boolean-ops.jsonl +6 -0
- package/tests/fixtures/color-ops.jsonl +4 -0
- package/tests/fixtures/edit-buffer.jsonl +3 -0
- package/tests/fixtures/node-ops.jsonl +6 -0
- package/tests/fixtures/number-ops.jsonl +7 -0
- package/tests/fixtures/object-ops.jsonl +4 -0
- package/tests/fixtures/operations.jsonl +7 -0
- package/tests/fixtures/string-ops.jsonl +4 -0
- package/tests/fixtures/undo-redo.jsonl +3 -0
- package/tests/fixtures/vector-ops.jsonl +9 -0
- package/tests/operations/collections.test.ts +193 -0
- package/tests/operations/nodes.test.ts +228 -0
- package/tests/operations/primitives.test.ts +222 -0
- package/tests/operations/vectors.test.ts +150 -0
- package/tsconfig.json +21 -0
- package/tsconfig.test.json +9 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector3 operations: set, add, multiply
|
|
3
|
+
*/
|
|
4
|
+
import type { SceneGraph, Vector3SetOp, Vector3AddOp, Vector3MultiplyOp } from '../OperationTypes.js';
|
|
5
|
+
import type { OpMeta } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* vector3.set - Last-Write-Wins
|
|
8
|
+
*/
|
|
9
|
+
export declare function Vector3Set(draft: SceneGraph, op: Vector3SetOp, meta: OpMeta): void;
|
|
10
|
+
/**
|
|
11
|
+
* vector3.add - Component-wise addition (additive deltas)
|
|
12
|
+
*/
|
|
13
|
+
export declare function Vector3Add(draft: SceneGraph, op: Vector3AddOp, meta: OpMeta): void;
|
|
14
|
+
/**
|
|
15
|
+
* vector3.multiply - Component-wise multiplication (scale)
|
|
16
|
+
*/
|
|
17
|
+
export declare function Vector3Multiply(draft: SceneGraph, op: Vector3MultiplyOp, meta: OpMeta): void;
|
|
18
|
+
//# sourceMappingURL=vector3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector3.d.ts","sourceRoot":"","sources":["../../../src/operations/apply/vector3.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKzC;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,GACX,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,GACX,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,iBAAiB,EACrB,IAAI,EAAE,MAAM,GACX,IAAI,CAUN"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector3 operations: set, add, multiply
|
|
3
|
+
*/
|
|
4
|
+
import { getNodeProperty, setNodeProperty, setNodePropertyLWW } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* vector3.set - Last-Write-Wins
|
|
7
|
+
*/
|
|
8
|
+
export function Vector3Set(draft, op, meta) {
|
|
9
|
+
const node = draft.nodes[op.key];
|
|
10
|
+
if (!node || node.deletedAt)
|
|
11
|
+
return;
|
|
12
|
+
setNodePropertyLWW(node, op.path, [...op.value], meta);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* vector3.add - Component-wise addition (additive deltas)
|
|
16
|
+
*/
|
|
17
|
+
export function Vector3Add(draft, op, meta) {
|
|
18
|
+
const node = draft.nodes[op.key];
|
|
19
|
+
if (!node || node.deletedAt)
|
|
20
|
+
return;
|
|
21
|
+
const current = getNodeProperty(node, op.path, [0, 0, 0]);
|
|
22
|
+
const result = [
|
|
23
|
+
current[0] + op.value[0],
|
|
24
|
+
current[1] + op.value[1],
|
|
25
|
+
current[2] + op.value[2],
|
|
26
|
+
];
|
|
27
|
+
setNodeProperty(node, op.path, result, meta);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* vector3.multiply - Component-wise multiplication (scale)
|
|
31
|
+
*/
|
|
32
|
+
export function Vector3Multiply(draft, op, meta) {
|
|
33
|
+
const node = draft.nodes[op.key];
|
|
34
|
+
if (!node || node.deletedAt)
|
|
35
|
+
return;
|
|
36
|
+
const current = getNodeProperty(node, op.path, [1, 1, 1]);
|
|
37
|
+
const result = [
|
|
38
|
+
current[0] * op.value[0],
|
|
39
|
+
current[1] * op.value[1],
|
|
40
|
+
current[2] * op.value[2],
|
|
41
|
+
];
|
|
42
|
+
setNodeProperty(node, op.path, result, meta);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=vector3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector3.js","sourceRoot":"","sources":["../../../src/operations/apply/vector3.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIlF;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAY,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAiB,EACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAU,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAY;QACtB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;KACzB,CAAC;IACF,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,EAAqB,EACrB,IAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,eAAe,CAAU,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAY;QACtB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;KACzB,CAAC;IACF,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operation Dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Applies CRDTMessage operations to a SceneGraph using immer.
|
|
5
|
+
* Each operation is dispatched to its corresponding "apply" function.
|
|
6
|
+
*/
|
|
7
|
+
import type { SceneGraph, CRDTMessage, Operation } from './OperationTypes.js';
|
|
8
|
+
import type { OpMeta } from './apply/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Apply a single operation to a SceneGraph draft
|
|
11
|
+
*/
|
|
12
|
+
export declare function applyOperation(draft: SceneGraph, op: Operation, meta: OpMeta): void;
|
|
13
|
+
/**
|
|
14
|
+
* Apply a CRDTMessage to a SceneGraph (immutable)
|
|
15
|
+
*
|
|
16
|
+
* Uses immer to produce a new state without mutating the original.
|
|
17
|
+
*
|
|
18
|
+
* @param graph - Current scene graph state
|
|
19
|
+
* @param msg - CRDT message containing operations
|
|
20
|
+
* @returns New scene graph state with operations applied
|
|
21
|
+
*/
|
|
22
|
+
export declare function applyMessage(graph: SceneGraph, msg: CRDTMessage): SceneGraph;
|
|
23
|
+
/**
|
|
24
|
+
* Apply multiple CRDTMessages to a SceneGraph (immutable)
|
|
25
|
+
*
|
|
26
|
+
* @param graph - Current scene graph state
|
|
27
|
+
* @param messages - Array of CRDT messages to apply
|
|
28
|
+
* @returns New scene graph state with all operations applied
|
|
29
|
+
*/
|
|
30
|
+
export declare function applyMessages(graph: SceneGraph, messages: CRDTMessage[]): SceneGraph;
|
|
31
|
+
/**
|
|
32
|
+
* Create an empty scene graph
|
|
33
|
+
*/
|
|
34
|
+
export declare function createEmptyGraph(): SceneGraph;
|
|
35
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/operations/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAsD/C;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,MAAM,GACX,IAAI,CAON;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,UAAU,CAa5E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,UAAU,CAMpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAK7C"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operation Dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Applies CRDTMessage operations to a SceneGraph using immer.
|
|
5
|
+
* Each operation is dispatched to its corresponding "apply" function.
|
|
6
|
+
*/
|
|
7
|
+
import { produce, enableMapSet } from 'immer';
|
|
8
|
+
import * as registry from './apply/index.js';
|
|
9
|
+
// Enable immer support for Map and Set
|
|
10
|
+
enableMapSet();
|
|
11
|
+
/**
|
|
12
|
+
* Handler map: otype -> apply function
|
|
13
|
+
*/
|
|
14
|
+
const handlers = {
|
|
15
|
+
// Number operations
|
|
16
|
+
'number.set': registry.NumberSet,
|
|
17
|
+
'number.add': registry.NumberAdd,
|
|
18
|
+
'number.multiply': registry.NumberMultiply,
|
|
19
|
+
'number.min': registry.NumberMin,
|
|
20
|
+
'number.max': registry.NumberMax,
|
|
21
|
+
// String operations
|
|
22
|
+
'string.set': registry.StringSet,
|
|
23
|
+
'string.concat': registry.StringConcat,
|
|
24
|
+
// Boolean operations
|
|
25
|
+
'boolean.set': registry.BooleanSet,
|
|
26
|
+
'boolean.or': registry.BooleanOr,
|
|
27
|
+
'boolean.and': registry.BooleanAnd,
|
|
28
|
+
// Vector3 operations
|
|
29
|
+
'vector3.set': registry.Vector3Set,
|
|
30
|
+
'vector3.add': registry.Vector3Add,
|
|
31
|
+
'vector3.multiply': registry.Vector3Multiply,
|
|
32
|
+
// Quaternion operations
|
|
33
|
+
'quaternion.set': registry.QuaternionSet,
|
|
34
|
+
'quaternion.multiply': registry.QuaternionMultiply,
|
|
35
|
+
// Color operations
|
|
36
|
+
'color.set': registry.ColorSet,
|
|
37
|
+
'color.blend': registry.ColorBlend,
|
|
38
|
+
// Array operations
|
|
39
|
+
'array.set': registry.ArraySet,
|
|
40
|
+
'array.push': registry.ArrayPush,
|
|
41
|
+
'array.remove': registry.ArrayRemove,
|
|
42
|
+
'array.union': registry.ArrayUnion,
|
|
43
|
+
// Object operations
|
|
44
|
+
'object.set': registry.ObjectSet,
|
|
45
|
+
'object.merge': registry.ObjectMerge,
|
|
46
|
+
// Node operations
|
|
47
|
+
'node.insert': registry.NodeInsert,
|
|
48
|
+
'node.remove': registry.NodeRemove,
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Apply a single operation to a SceneGraph draft
|
|
52
|
+
*/
|
|
53
|
+
export function applyOperation(draft, op, meta) {
|
|
54
|
+
const handler = handlers[op.otype];
|
|
55
|
+
if (handler) {
|
|
56
|
+
handler(draft, op, meta);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.warn(`Unknown otype: ${op.otype}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Apply a CRDTMessage to a SceneGraph (immutable)
|
|
64
|
+
*
|
|
65
|
+
* Uses immer to produce a new state without mutating the original.
|
|
66
|
+
*
|
|
67
|
+
* @param graph - Current scene graph state
|
|
68
|
+
* @param msg - CRDT message containing operations
|
|
69
|
+
* @returns New scene graph state with operations applied
|
|
70
|
+
*/
|
|
71
|
+
export function applyMessage(graph, msg) {
|
|
72
|
+
return produce(graph, (draft) => {
|
|
73
|
+
const meta = {
|
|
74
|
+
sessionId: msg.sessionId,
|
|
75
|
+
clock: msg.clock,
|
|
76
|
+
lamportTime: msg.lamportTime,
|
|
77
|
+
timestamp: msg.timestamp,
|
|
78
|
+
};
|
|
79
|
+
for (const op of msg.ops) {
|
|
80
|
+
applyOperation(draft, op, meta);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Apply multiple CRDTMessages to a SceneGraph (immutable)
|
|
86
|
+
*
|
|
87
|
+
* @param graph - Current scene graph state
|
|
88
|
+
* @param messages - Array of CRDT messages to apply
|
|
89
|
+
* @returns New scene graph state with all operations applied
|
|
90
|
+
*/
|
|
91
|
+
export function applyMessages(graph, messages) {
|
|
92
|
+
let current = graph;
|
|
93
|
+
for (const msg of messages) {
|
|
94
|
+
current = applyMessage(current, msg);
|
|
95
|
+
}
|
|
96
|
+
return current;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create an empty scene graph
|
|
100
|
+
*/
|
|
101
|
+
export function createEmptyGraph() {
|
|
102
|
+
return {
|
|
103
|
+
nodes: {},
|
|
104
|
+
rootKey: '',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/operations/dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations module exports
|
|
3
|
+
*/
|
|
4
|
+
export type { CRDTMessage, BaseOp, NumberSetOp, NumberAddOp, NumberMultiplyOp, NumberMinOp, NumberMaxOp, StringSetOp, StringConcatOp, BooleanSetOp, BooleanOrOp, BooleanAndOp, Vector3SetOp, Vector3AddOp, Vector3MultiplyOp, QuaternionSetOp, QuaternionMultiplyOp, ColorSetOp, ColorBlendOp, ArraySetOp, ArrayPushOp, ArrayUnionOp, ArrayRemoveOp, ObjectSetOp, ObjectMergeOp, NodeInsertOp, NodeRemoveOp, MetaUndoOp, MetaRedoOp, Operation, SceneNode, SceneGraph, } from './OperationTypes.js';
|
|
5
|
+
export { OperationValidator, type ValidationResult } from './OperationValidator.js';
|
|
6
|
+
import * as registry from './apply/index.js';
|
|
7
|
+
export { registry };
|
|
8
|
+
export type { OpMeta, ApplyFn } from './apply/types.js';
|
|
9
|
+
export { applyMessage, applyMessages, applyOperation, createEmptyGraph, } from './dispatcher.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,YAAY,EACV,WAAW,EACX,MAAM,EAEN,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,WAAW,EAEX,WAAW,EACX,cAAc,EAEd,YAAY,EACZ,WAAW,EACX,YAAY,EAEZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAEjB,eAAe,EACf,oBAAoB,EAEpB,UAAU,EACV,YAAY,EAEZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EAEb,WAAW,EACX,aAAa,EAEb,YAAY,EACZ,YAAY,EAEZ,UAAU,EACV,UAAU,EAEV,SAAS,EAET,SAAS,EACT,UAAU,GACX,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMpF,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMxD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations module exports
|
|
3
|
+
*/
|
|
4
|
+
// ============================================
|
|
5
|
+
// Validation
|
|
6
|
+
// ============================================
|
|
7
|
+
export { OperationValidator } from './OperationValidator.js';
|
|
8
|
+
// ============================================
|
|
9
|
+
// Apply Registry (individual apply functions)
|
|
10
|
+
// ============================================
|
|
11
|
+
import * as registry from './apply/index.js';
|
|
12
|
+
export { registry };
|
|
13
|
+
// ============================================
|
|
14
|
+
// Dispatcher (high-level API)
|
|
15
|
+
// ============================================
|
|
16
|
+
export { applyMessage, applyMessages, applyOperation, createEmptyGraph, } from './dispatcher.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqDH,+CAA+C;AAC/C,aAAa;AACb,+CAA+C;AAE/C,OAAO,EAAE,kBAAkB,EAAyB,MAAM,yBAAyB,CAAC;AAEpF,+CAA+C;AAC/C,8CAA8C;AAC9C,+CAA+C;AAE/C,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,CAAC;AAIpB,+CAA+C;AAC/C,8BAA8B;AAC9B,+CAA+C;AAE/C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConflictResolver - Schema-based property conflict resolution
|
|
3
|
+
*
|
|
4
|
+
* Merges concurrent property updates based on:
|
|
5
|
+
* - Property schema (dtype + operation)
|
|
6
|
+
* - DType merge functions
|
|
7
|
+
*/
|
|
8
|
+
import { type ValueWithMeta } from './DType.js';
|
|
9
|
+
export declare class ConflictResolver {
|
|
10
|
+
/**
|
|
11
|
+
* Merge a single property from multiple concurrent updates
|
|
12
|
+
*
|
|
13
|
+
* @param propertyName - Name of the property being merged
|
|
14
|
+
* @param values - Array of values with metadata
|
|
15
|
+
* @param operationHint - Optional operation override from UPDATE operation
|
|
16
|
+
* @returns Merged value
|
|
17
|
+
*/
|
|
18
|
+
mergeProperty<T = any>(propertyName: string, values: ValueWithMeta<T>[], operationHint?: string): T;
|
|
19
|
+
/**
|
|
20
|
+
* Merge multiple properties from concurrent updates
|
|
21
|
+
*
|
|
22
|
+
* @param updates - Array of property updates with metadata and operation hints
|
|
23
|
+
* @returns Merged properties
|
|
24
|
+
*/
|
|
25
|
+
mergeProperties(updates: Array<{
|
|
26
|
+
properties: Record<string, any>;
|
|
27
|
+
operations?: Record<string, string>;
|
|
28
|
+
lamportTime: number;
|
|
29
|
+
sessionId: string;
|
|
30
|
+
}>): Record<string, any>;
|
|
31
|
+
/**
|
|
32
|
+
* Get merge function for dtype and operation
|
|
33
|
+
*/
|
|
34
|
+
private getMergeFunction;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ConflictResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictResolver.d.ts","sourceRoot":"","sources":["../../src/state/ConflictResolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAS,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAGvD,qBAAa,gBAAgB;IAC3B;;;;;;;OAOG;IACH,aAAa,CAAC,CAAC,GAAG,GAAG,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAC1B,aAAa,CAAC,EAAE,MAAM,GACrB,CAAC;IAkCJ;;;;;OAKG;IACH,eAAe,CACb,OAAO,EAAE,KAAK,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,GACD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAqCtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA6FzB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConflictResolver - Schema-based property conflict resolution
|
|
3
|
+
*
|
|
4
|
+
* Merges concurrent property updates based on:
|
|
5
|
+
* - Property schema (dtype + operation)
|
|
6
|
+
* - DType merge functions
|
|
7
|
+
*/
|
|
8
|
+
import { DType } from './DType.js';
|
|
9
|
+
import { getPropertySchema, isImmutable } from './Schema.js';
|
|
10
|
+
export class ConflictResolver {
|
|
11
|
+
/**
|
|
12
|
+
* Merge a single property from multiple concurrent updates
|
|
13
|
+
*
|
|
14
|
+
* @param propertyName - Name of the property being merged
|
|
15
|
+
* @param values - Array of values with metadata
|
|
16
|
+
* @param operationHint - Optional operation override from UPDATE operation
|
|
17
|
+
* @returns Merged value
|
|
18
|
+
*/
|
|
19
|
+
mergeProperty(propertyName, values, operationHint) {
|
|
20
|
+
if (values.length === 0) {
|
|
21
|
+
throw new Error(`Cannot merge empty values for property: ${propertyName}`);
|
|
22
|
+
}
|
|
23
|
+
if (values.length === 1) {
|
|
24
|
+
return values[0].value;
|
|
25
|
+
}
|
|
26
|
+
// Get schema for this property
|
|
27
|
+
const schema = getPropertySchema(propertyName);
|
|
28
|
+
// Immutable properties: return earliest value
|
|
29
|
+
if (isImmutable(propertyName)) {
|
|
30
|
+
const sorted = [...values].sort((a, b) => a.lamportTime - b.lamportTime);
|
|
31
|
+
return sorted[0].value;
|
|
32
|
+
}
|
|
33
|
+
// Use operation hint if provided, otherwise use schema
|
|
34
|
+
const operation = operationHint || schema.operation;
|
|
35
|
+
// Get merge function based on dtype and operation
|
|
36
|
+
const mergeFn = this.getMergeFunction(schema.dtype, operation);
|
|
37
|
+
if (!mergeFn) {
|
|
38
|
+
console.warn(`No merge function for dtype=${schema.dtype} operation=${operation}, defaulting to LWW`);
|
|
39
|
+
return DType.string.set(values);
|
|
40
|
+
}
|
|
41
|
+
return mergeFn(values);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Merge multiple properties from concurrent updates
|
|
45
|
+
*
|
|
46
|
+
* @param updates - Array of property updates with metadata and operation hints
|
|
47
|
+
* @returns Merged properties
|
|
48
|
+
*/
|
|
49
|
+
mergeProperties(updates) {
|
|
50
|
+
// Group values by property name
|
|
51
|
+
const valuesByProperty = new Map();
|
|
52
|
+
const operationHints = new Map();
|
|
53
|
+
for (const update of updates) {
|
|
54
|
+
for (const [key, value] of Object.entries(update.properties)) {
|
|
55
|
+
if (key === 'operations')
|
|
56
|
+
continue; // Skip operations field
|
|
57
|
+
if (!valuesByProperty.has(key)) {
|
|
58
|
+
valuesByProperty.set(key, []);
|
|
59
|
+
}
|
|
60
|
+
valuesByProperty.get(key).push({
|
|
61
|
+
value,
|
|
62
|
+
lamportTime: update.lamportTime,
|
|
63
|
+
sessionId: update.sessionId,
|
|
64
|
+
});
|
|
65
|
+
// Store operation hint if provided
|
|
66
|
+
if (update.operations?.[key]) {
|
|
67
|
+
operationHints.set(key, update.operations[key]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Merge each property
|
|
72
|
+
const result = {};
|
|
73
|
+
for (const [propertyName, values] of valuesByProperty.entries()) {
|
|
74
|
+
const operationHint = operationHints.get(propertyName);
|
|
75
|
+
result[propertyName] = this.mergeProperty(propertyName, values, operationHint);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get merge function for dtype and operation
|
|
81
|
+
*/
|
|
82
|
+
getMergeFunction(dtype, operation) {
|
|
83
|
+
switch (dtype) {
|
|
84
|
+
case 'number':
|
|
85
|
+
switch (operation) {
|
|
86
|
+
case 'set':
|
|
87
|
+
return DType.number.set;
|
|
88
|
+
case 'add':
|
|
89
|
+
return DType.number.add;
|
|
90
|
+
case 'multiply':
|
|
91
|
+
return DType.number.multiply;
|
|
92
|
+
case 'min':
|
|
93
|
+
return DType.number.min;
|
|
94
|
+
case 'max':
|
|
95
|
+
return DType.number.max;
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
case 'string':
|
|
99
|
+
switch (operation) {
|
|
100
|
+
case 'set':
|
|
101
|
+
return DType.string.set;
|
|
102
|
+
case 'concat':
|
|
103
|
+
return DType.string.concat;
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
case 'boolean':
|
|
107
|
+
switch (operation) {
|
|
108
|
+
case 'set':
|
|
109
|
+
return DType.boolean.set;
|
|
110
|
+
case 'or':
|
|
111
|
+
return DType.boolean.or;
|
|
112
|
+
case 'and':
|
|
113
|
+
return DType.boolean.and;
|
|
114
|
+
}
|
|
115
|
+
break;
|
|
116
|
+
case 'vector3':
|
|
117
|
+
switch (operation) {
|
|
118
|
+
case 'set':
|
|
119
|
+
return DType.vector3.set;
|
|
120
|
+
case 'add':
|
|
121
|
+
return DType.vector3.add;
|
|
122
|
+
case 'multiply':
|
|
123
|
+
return DType.vector3.multiply;
|
|
124
|
+
}
|
|
125
|
+
break;
|
|
126
|
+
case 'quaternion':
|
|
127
|
+
switch (operation) {
|
|
128
|
+
case 'set':
|
|
129
|
+
return DType.quaternion.set;
|
|
130
|
+
case 'multiply':
|
|
131
|
+
return DType.quaternion.multiply;
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
case 'color':
|
|
135
|
+
switch (operation) {
|
|
136
|
+
case 'set':
|
|
137
|
+
return DType.color.set;
|
|
138
|
+
case 'blend':
|
|
139
|
+
return DType.color.blend;
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
case 'array':
|
|
143
|
+
switch (operation) {
|
|
144
|
+
case 'set':
|
|
145
|
+
return DType.array.set;
|
|
146
|
+
case 'union':
|
|
147
|
+
return DType.array.union;
|
|
148
|
+
case 'append':
|
|
149
|
+
return DType.array.append;
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case 'object':
|
|
153
|
+
switch (operation) {
|
|
154
|
+
case 'set':
|
|
155
|
+
return DType.object.set;
|
|
156
|
+
case 'lww-per-key':
|
|
157
|
+
return DType.object.lwwPerKey;
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
case 'any':
|
|
161
|
+
// Default to LWW for 'any' type
|
|
162
|
+
return DType.string.set;
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=ConflictResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictResolver.js","sourceRoot":"","sources":["../../src/state/ConflictResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DType - Data type system with merge operations
|
|
3
|
+
*
|
|
4
|
+
* Based on test-data/datatypes.ts
|
|
5
|
+
*
|
|
6
|
+
* Each dtype has supported operations that define merge behavior
|
|
7
|
+
* for concurrent updates.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* PropertyValue with metadata
|
|
11
|
+
*/
|
|
12
|
+
export interface ValueWithMeta<T = any> {
|
|
13
|
+
value: T;
|
|
14
|
+
lamportTime: number;
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Merge function signature
|
|
19
|
+
*/
|
|
20
|
+
export type MergeFn<T = any> = (values: ValueWithMeta<T>[]) => T;
|
|
21
|
+
/**
|
|
22
|
+
* DType definitions
|
|
23
|
+
*/
|
|
24
|
+
export declare const DType: {
|
|
25
|
+
/**
|
|
26
|
+
* Number operations
|
|
27
|
+
*/
|
|
28
|
+
number: {
|
|
29
|
+
/**
|
|
30
|
+
* SET - Last-Write-Wins
|
|
31
|
+
*/
|
|
32
|
+
set: MergeFn<number>;
|
|
33
|
+
/**
|
|
34
|
+
* ADD - Sum all values
|
|
35
|
+
*/
|
|
36
|
+
add: MergeFn<number>;
|
|
37
|
+
/**
|
|
38
|
+
* MULTIPLY - Multiply all values
|
|
39
|
+
*/
|
|
40
|
+
multiply: MergeFn<number>;
|
|
41
|
+
/**
|
|
42
|
+
* MIN - Take minimum
|
|
43
|
+
*/
|
|
44
|
+
min: MergeFn<number>;
|
|
45
|
+
/**
|
|
46
|
+
* MAX - Take maximum
|
|
47
|
+
*/
|
|
48
|
+
max: MergeFn<number>;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* String operations
|
|
52
|
+
*/
|
|
53
|
+
string: {
|
|
54
|
+
/**
|
|
55
|
+
* SET - Last-Write-Wins
|
|
56
|
+
*/
|
|
57
|
+
set: MergeFn<string>;
|
|
58
|
+
/**
|
|
59
|
+
* CONCAT - Concatenate (ordered by lamport)
|
|
60
|
+
*/
|
|
61
|
+
concat: MergeFn<string>;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Boolean operations
|
|
65
|
+
*/
|
|
66
|
+
boolean: {
|
|
67
|
+
/**
|
|
68
|
+
* SET - Last-Write-Wins
|
|
69
|
+
*/
|
|
70
|
+
set: MergeFn<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* OR - Logical OR (enable wins)
|
|
73
|
+
*/
|
|
74
|
+
or: MergeFn<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* AND - Logical AND (disable wins)
|
|
77
|
+
*/
|
|
78
|
+
and: MergeFn<boolean>;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Vector3 operations - [x, y, z]
|
|
82
|
+
*/
|
|
83
|
+
vector3: {
|
|
84
|
+
/**
|
|
85
|
+
* SET - Replace entire vector (preserves user intent)
|
|
86
|
+
*/
|
|
87
|
+
set: MergeFn<[number, number, number]>;
|
|
88
|
+
/**
|
|
89
|
+
* ADD - Component-wise addition
|
|
90
|
+
*/
|
|
91
|
+
add: MergeFn<[number, number, number]>;
|
|
92
|
+
/**
|
|
93
|
+
* MULTIPLY - Component-wise multiplication
|
|
94
|
+
*/
|
|
95
|
+
multiply: MergeFn<[number, number, number]>;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Quaternion operations - [x, y, z, w]
|
|
99
|
+
*/
|
|
100
|
+
quaternion: {
|
|
101
|
+
/**
|
|
102
|
+
* SET - Replace entire quaternion
|
|
103
|
+
*/
|
|
104
|
+
set: MergeFn<[number, number, number, number]>;
|
|
105
|
+
/**
|
|
106
|
+
* MULTIPLY - Quaternion multiplication (composition)
|
|
107
|
+
*/
|
|
108
|
+
multiply: MergeFn<[number, number, number, number]>;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Color operations
|
|
112
|
+
*/
|
|
113
|
+
color: {
|
|
114
|
+
/**
|
|
115
|
+
* SET - Replace color
|
|
116
|
+
*/
|
|
117
|
+
set: MergeFn<string>;
|
|
118
|
+
/**
|
|
119
|
+
* BLEND - Average colors
|
|
120
|
+
*/
|
|
121
|
+
blend: MergeFn<string>;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Array operations
|
|
125
|
+
*/
|
|
126
|
+
array: {
|
|
127
|
+
/**
|
|
128
|
+
* SET - Replace entire array
|
|
129
|
+
*/
|
|
130
|
+
set: MergeFn<any[]>;
|
|
131
|
+
/**
|
|
132
|
+
* UNION - Merge unique elements
|
|
133
|
+
*/
|
|
134
|
+
union: MergeFn<any[]>;
|
|
135
|
+
/**
|
|
136
|
+
* APPEND - Append all (ordered by lamport)
|
|
137
|
+
*/
|
|
138
|
+
append: MergeFn<any[]>;
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Object operations
|
|
142
|
+
*/
|
|
143
|
+
object: {
|
|
144
|
+
/**
|
|
145
|
+
* SET - Replace entire object
|
|
146
|
+
*/
|
|
147
|
+
set: MergeFn<Record<string, any>>;
|
|
148
|
+
/**
|
|
149
|
+
* LWW_PER_KEY - Last-Write-Wins per key
|
|
150
|
+
*/
|
|
151
|
+
lwwPerKey: MergeFn<Record<string, any>>;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Immutable - Cannot be changed
|
|
155
|
+
*/
|
|
156
|
+
immutable: {
|
|
157
|
+
set: MergeFn;
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=DType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DType.d.ts","sourceRoot":"","sources":["../../src/state/DType.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG;IACpC,KAAK,EAAE,CAAC,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,KAAK;IAKhB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;aAGG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;kBAGG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;aAGG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;aAGG,OAAO,CAAC,MAAM,CAAC;;IAGvB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;gBAIG,OAAO,CAAC,MAAM,CAAC;;IAGvB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,OAAO,CAAC;QAEtB;;WAEG;YAGG,OAAO,CAAC,OAAO,CAAC;QAEtB;;WAEG;aAGG,OAAO,CAAC,OAAO,CAAC;;IAOxB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEvC;;WAEG;aASG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEvC;;WAEG;kBASG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;;IAGzC;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE/C;;WAEG;kBAUG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;;IAGjD;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,MAAM,CAAC;QAErB;;WAEG;eAOG,OAAO,CAAC,MAAM,CAAC;;IAOvB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEpB;;WAEG;eAIG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEpB;;WAEG;gBAIG,OAAO,CAAC,GAAG,EAAE,CAAC;;IAGtB;;OAEG;;QAED;;WAEG;aAIG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAElC;;WAEG;mBAeG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;IAOpC;;OAEG;;aAMK,OAAO;;CAEhB,CAAC"}
|