meridian-sdk 1.2.1 → 1.3.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/CHANGELOG.md +10 -0
- package/dist/agents.d.ts +143 -8
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +141 -14
- package/dist/agents.js.map +1 -1
- package/dist/client.d.ts +7 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -4
- package/dist/client.js.map +1 -1
- package/dist/conflict/types.d.ts +54 -0
- package/dist/conflict/types.d.ts.map +1 -0
- package/dist/conflict/types.js +9 -0
- package/dist/conflict/types.js.map +1 -0
- package/dist/crdt/rga.d.ts +20 -4
- package/dist/crdt/rga.d.ts.map +1 -1
- package/dist/crdt/rga.js +42 -6
- package/dist/crdt/rga.js.map +1 -1
- package/dist/crdt/tree.d.ts +45 -0
- package/dist/crdt/tree.d.ts.map +1 -1
- package/dist/crdt/tree.js +135 -10
- package/dist/crdt/tree.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +63 -3
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +18 -1
- package/dist/schema.js.map +1 -1
- package/dist/sync/delta.d.ts +24 -0
- package/dist/sync/delta.d.ts.map +1 -1
- package/dist/sync/delta.js +1 -1
- package/dist/sync/delta.js.map +1 -1
- package/dist/undo/UndoManager.d.ts +74 -0
- package/dist/undo/UndoManager.d.ts.map +1 -0
- package/dist/undo/UndoManager.js +318 -0
- package/dist/undo/UndoManager.js.map +1 -0
- package/dist/undo/types.d.ts +63 -0
- package/dist/undo/types.d.ts.map +1 -0
- package/dist/undo/types.js +9 -0
- package/dist/undo/types.js.map +1 -0
- package/dist/utils/fractional.d.ts +78 -0
- package/dist/utils/fractional.d.ts.map +1 -0
- package/dist/utils/fractional.js +159 -0
- package/dist/utils/fractional.js.map +1 -0
- package/dist/validation/index.d.ts +107 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +123 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +1 -1
- package/src/agents.ts +224 -15
- package/src/client.ts +5 -4
- package/src/conflict/types.ts +60 -0
- package/src/crdt/rga.ts +46 -7
- package/src/crdt/tree.ts +164 -0
- package/src/index.ts +28 -1
- package/src/schema.ts +24 -1
- package/src/sync/delta.ts +15 -2
- package/src/undo/UndoManager.ts +369 -0
- package/src/undo/types.ts +74 -0
- package/src/utils/fractional.ts +166 -0
- package/src/validation/index.ts +137 -0
- package/test/conflict.test.ts +242 -0
- package/test/fractional.test.ts +127 -0
- package/test/undo.test.ts +272 -0
- package/test/validation.test.ts +137 -0
package/dist/schema.d.ts
CHANGED
|
@@ -11,21 +11,81 @@ export type TimestampMs = number;
|
|
|
11
11
|
/** client_id / author — Rust u64, may decode as bigint for large values. Normalise to number. */
|
|
12
12
|
export declare const ClientId: Schema.Union<[typeof Schema.Number, Schema.transform<typeof Schema.BigIntFromSelf, typeof Schema.Number>]>;
|
|
13
13
|
export type ClientId = number;
|
|
14
|
-
|
|
14
|
+
/** V1 permissions — glob-list style (legacy tokens). */
|
|
15
|
+
export declare const PermissionsV1: Schema.Struct<{
|
|
15
16
|
read: Schema.Array$<typeof Schema.String>;
|
|
16
17
|
write: Schema.Array$<typeof Schema.String>;
|
|
17
18
|
admin: typeof Schema.Boolean;
|
|
18
19
|
}>;
|
|
20
|
+
export type PermissionsV1 = typeof PermissionsV1.Type;
|
|
21
|
+
/** A single permission rule in a V2 token. */
|
|
22
|
+
export declare const PermEntry: Schema.Struct<{
|
|
23
|
+
p: typeof Schema.String;
|
|
24
|
+
o: Schema.optional<typeof Schema.Number>;
|
|
25
|
+
e: Schema.optional<typeof Schema.Number>;
|
|
26
|
+
}>;
|
|
27
|
+
export type PermEntry = typeof PermEntry.Type;
|
|
28
|
+
/** V2 fine-grained permissions. */
|
|
29
|
+
export declare const PermissionsV2: Schema.Struct<{
|
|
30
|
+
v: Schema.Literal<[2]>;
|
|
31
|
+
r: Schema.Array$<Schema.Struct<{
|
|
32
|
+
p: typeof Schema.String;
|
|
33
|
+
o: Schema.optional<typeof Schema.Number>;
|
|
34
|
+
e: Schema.optional<typeof Schema.Number>;
|
|
35
|
+
}>>;
|
|
36
|
+
w: Schema.Array$<Schema.Struct<{
|
|
37
|
+
p: typeof Schema.String;
|
|
38
|
+
o: Schema.optional<typeof Schema.Number>;
|
|
39
|
+
e: Schema.optional<typeof Schema.Number>;
|
|
40
|
+
}>>;
|
|
41
|
+
admin: typeof Schema.Boolean;
|
|
42
|
+
rl: Schema.optional<typeof Schema.Number>;
|
|
43
|
+
}>;
|
|
44
|
+
export type PermissionsV2 = typeof PermissionsV2.Type;
|
|
45
|
+
/** Token permissions — V1 or V2. */
|
|
46
|
+
export declare const Permissions: Schema.Union<[Schema.Struct<{
|
|
47
|
+
v: Schema.Literal<[2]>;
|
|
48
|
+
r: Schema.Array$<Schema.Struct<{
|
|
49
|
+
p: typeof Schema.String;
|
|
50
|
+
o: Schema.optional<typeof Schema.Number>;
|
|
51
|
+
e: Schema.optional<typeof Schema.Number>;
|
|
52
|
+
}>>;
|
|
53
|
+
w: Schema.Array$<Schema.Struct<{
|
|
54
|
+
p: typeof Schema.String;
|
|
55
|
+
o: Schema.optional<typeof Schema.Number>;
|
|
56
|
+
e: Schema.optional<typeof Schema.Number>;
|
|
57
|
+
}>>;
|
|
58
|
+
admin: typeof Schema.Boolean;
|
|
59
|
+
rl: Schema.optional<typeof Schema.Number>;
|
|
60
|
+
}>, Schema.Struct<{
|
|
61
|
+
read: Schema.Array$<typeof Schema.String>;
|
|
62
|
+
write: Schema.Array$<typeof Schema.String>;
|
|
63
|
+
admin: typeof Schema.Boolean;
|
|
64
|
+
}>]>;
|
|
19
65
|
export type Permissions = typeof Permissions.Type;
|
|
20
66
|
export declare const TokenClaims: Schema.Struct<{
|
|
21
67
|
namespace: typeof Schema.String;
|
|
22
68
|
client_id: Schema.Union<[typeof Schema.Number, Schema.transform<typeof Schema.BigIntFromSelf, typeof Schema.Number>]>;
|
|
23
69
|
expires_at: Schema.Union<[typeof Schema.Number, Schema.transform<typeof Schema.BigIntFromSelf, typeof Schema.Number>]>;
|
|
24
|
-
permissions: Schema.Struct<{
|
|
70
|
+
permissions: Schema.Union<[Schema.Struct<{
|
|
71
|
+
v: Schema.Literal<[2]>;
|
|
72
|
+
r: Schema.Array$<Schema.Struct<{
|
|
73
|
+
p: typeof Schema.String;
|
|
74
|
+
o: Schema.optional<typeof Schema.Number>;
|
|
75
|
+
e: Schema.optional<typeof Schema.Number>;
|
|
76
|
+
}>>;
|
|
77
|
+
w: Schema.Array$<Schema.Struct<{
|
|
78
|
+
p: typeof Schema.String;
|
|
79
|
+
o: Schema.optional<typeof Schema.Number>;
|
|
80
|
+
e: Schema.optional<typeof Schema.Number>;
|
|
81
|
+
}>>;
|
|
82
|
+
admin: typeof Schema.Boolean;
|
|
83
|
+
rl: Schema.optional<typeof Schema.Number>;
|
|
84
|
+
}>, Schema.Struct<{
|
|
25
85
|
read: Schema.Array$<typeof Schema.String>;
|
|
26
86
|
write: Schema.Array$<typeof Schema.String>;
|
|
27
87
|
admin: typeof Schema.Boolean;
|
|
28
|
-
}>;
|
|
88
|
+
}>]>;
|
|
29
89
|
}>;
|
|
30
90
|
export type TokenClaims = typeof TokenClaims.Type;
|
|
31
91
|
/** BTreeMap<client_id, version> — matches server VectorClock.entries */
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,uHAAuH;AACvH,eAAO,MAAM,WAAW,4GAGrB,CAAC;AACJ,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,iGAAiG;AACjG,eAAO,MAAM,QAAQ,4GAGlB,CAAC;AACJ,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,uHAAuH;AACvH,eAAO,MAAM,WAAW,4GAGrB,CAAC;AACJ,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,iGAAiG;AACjG,eAAO,MAAM,QAAQ,4GAGlB,CAAC;AACJ,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,wDAAwD;AACxD,eAAO,MAAM,aAAa;;;;EAIxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD,8CAA8C;AAC9C,eAAO,MAAM,SAAS;;;;EAIpB,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,mCAAmC;AACnC,eAAO,MAAM,aAAa;;;;;;;;;;;;;;EAMxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD,oCAAoC;AACpC,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;IAA6C,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAC;AAElD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;EAKtB,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAC;AAElD,wEAAwE;AACxE,eAAO,MAAM,WAAW,4DAA8D,CAAC;AACvF,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAC;AAElD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;IAmBrB,CAAC;AACF,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;IAkBrB,CAAC;AACF,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC;AAE9C,eAAO,MAAM,aAAa;;;EAGxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD,eAAO,MAAM,cAAc;;EAEzB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAC;AAExD,eAAO,MAAM,UAAU;;EAErB,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAC;AAEhD,eAAO,MAAM,QAAQ;;;;EAInB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAC;AAE5C,eAAO,MAAM,iBAAiB;;;EAG5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAC;AAE9D,eAAO,MAAM,aAAa;;;;;EAExB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;AAEtD,qFAAqF;AACrF,eAAO,MAAM,eAAe,uBAAiB,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC;AAEtC,0FAA0F;AAC1F,eAAO,MAAM,cAAc,uBAAiB,CAAC;AAC7C,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC;AAErC,eAAO,MAAM,kBAAkB;;EAE7B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC,IAAI,CAAC;AAEhE,eAAO,MAAM,aAAa;;;EAGxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC"}
|
package/dist/schema.js
CHANGED
|
@@ -9,11 +9,28 @@ import { Schema } from "effect";
|
|
|
9
9
|
export const TimestampMs = Schema.Union(Schema.Number, Schema.BigIntFromSelf.pipe(Schema.transform(Schema.Number, { decode: (n) => Number(n), encode: (n) => BigInt(n) })));
|
|
10
10
|
/** client_id / author — Rust u64, may decode as bigint for large values. Normalise to number. */
|
|
11
11
|
export const ClientId = Schema.Union(Schema.Number, Schema.BigIntFromSelf.pipe(Schema.transform(Schema.Number, { decode: (n) => Number(n), encode: (n) => BigInt(n) })));
|
|
12
|
-
|
|
12
|
+
/** V1 permissions — glob-list style (legacy tokens). */
|
|
13
|
+
export const PermissionsV1 = Schema.Struct({
|
|
13
14
|
read: Schema.Array(Schema.String),
|
|
14
15
|
write: Schema.Array(Schema.String),
|
|
15
16
|
admin: Schema.Boolean,
|
|
16
17
|
});
|
|
18
|
+
/** A single permission rule in a V2 token. */
|
|
19
|
+
export const PermEntry = Schema.Struct({
|
|
20
|
+
p: Schema.String,
|
|
21
|
+
o: Schema.optional(Schema.Number),
|
|
22
|
+
e: Schema.optional(Schema.Number),
|
|
23
|
+
});
|
|
24
|
+
/** V2 fine-grained permissions. */
|
|
25
|
+
export const PermissionsV2 = Schema.Struct({
|
|
26
|
+
v: Schema.Literal(2),
|
|
27
|
+
r: Schema.Array(PermEntry),
|
|
28
|
+
w: Schema.Array(PermEntry),
|
|
29
|
+
admin: Schema.Boolean,
|
|
30
|
+
rl: Schema.optional(Schema.Number),
|
|
31
|
+
});
|
|
32
|
+
/** Token permissions — V1 or V2. */
|
|
33
|
+
export const Permissions = Schema.Union(PermissionsV2, PermissionsV1);
|
|
17
34
|
export const TokenClaims = Schema.Struct({
|
|
18
35
|
namespace: Schema.String,
|
|
19
36
|
client_id: ClientId,
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,uHAAuH;AACvH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAChG,MAAM,CAAC,MAAM,EACb,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvD,CAAC,CAAC,CAAC;AAGJ,iGAAiG;AACjG,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAC7F,MAAM,CAAC,MAAM,EACb,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvD,CAAC,CAAC,CAAC;AAGJ,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/delta.d.ts
CHANGED
|
@@ -45,10 +45,34 @@ export declare const decodeRGADelta: (bytes: Uint8Array) => RGADelta;
|
|
|
45
45
|
export interface TreeNodeValue {
|
|
46
46
|
id: string;
|
|
47
47
|
value: string;
|
|
48
|
+
/** Fractional index string for sibling ordering (e.g. "a0", "b0"). */
|
|
49
|
+
position: string;
|
|
48
50
|
children: TreeNodeValue[];
|
|
49
51
|
}
|
|
52
|
+
/** A MoveNode op that was rejected by the server due to cycle prevention. */
|
|
53
|
+
export interface DiscardedMove {
|
|
54
|
+
node_id: {
|
|
55
|
+
wall_ms: number;
|
|
56
|
+
logical: number;
|
|
57
|
+
node_id: number;
|
|
58
|
+
};
|
|
59
|
+
attempted_parent_id: {
|
|
60
|
+
wall_ms: number;
|
|
61
|
+
logical: number;
|
|
62
|
+
node_id: number;
|
|
63
|
+
} | null;
|
|
64
|
+
attempted_position: string;
|
|
65
|
+
actual_parent_id: {
|
|
66
|
+
wall_ms: number;
|
|
67
|
+
logical: number;
|
|
68
|
+
node_id: number;
|
|
69
|
+
} | null;
|
|
70
|
+
actual_position: string;
|
|
71
|
+
}
|
|
50
72
|
export interface TreeDelta {
|
|
51
73
|
roots: TreeNodeValue[];
|
|
74
|
+
/** MoveNode ops discarded due to cycle prevention. Empty in the common case. */
|
|
75
|
+
discarded_moves?: DiscardedMove[];
|
|
52
76
|
}
|
|
53
77
|
export declare const decodeTreeDelta: (bytes: Uint8Array) => TreeDelta;
|
|
54
78
|
export type CrdtValueDelta = {
|
package/dist/sync/delta.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../src/sync/delta.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,mBAAmB,GAAI,OAAO,UAAU,KAAG,aAGvD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,oBAAoB,GAAI,OAAO,UAAU,KAAG,cASxD,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,UAAU,KAAG,UAUpD,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,cAAc,GAAI,OAAO,UAAU,KAAG,QAGlD,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAAC;CACpD;AAED,eAAO,MAAM,mBAAmB,GAAI,OAAO,UAAU,KAAG,aAGvD,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,cAAc,GAAI,OAAO,UAAU,KAAG,QAGlD,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../src/sync/delta.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/delta.js
CHANGED
|
@@ -30,7 +30,7 @@ export const decodeRGADelta = (bytes) => {
|
|
|
30
30
|
};
|
|
31
31
|
export const decodeTreeDelta = (bytes) => {
|
|
32
32
|
const raw = decode(bytes);
|
|
33
|
-
return { roots: raw.roots ?? [] };
|
|
33
|
+
return { roots: raw.roots ?? [], discarded_moves: raw.discarded_moves ?? [] };
|
|
34
34
|
};
|
|
35
35
|
export const decodeCRDTMapDelta = (bytes) => {
|
|
36
36
|
const raw = decode(bytes);
|
package/dist/sync/delta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/sync/delta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAiB,EAAiB,EAAE;IACtE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAA0C,CAAC;IACnE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;AAC1C,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAiB,EAAkB,EAAE;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAGvB,CAAC;IACF,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;QAC1D,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;KAC3D,CAAC;AACJ,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAiB,EAAc,EAAE;IAChE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAGvB,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAc,EAAc,EAAE,CAC7C,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAiB,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,CAAC,GAA+B,EAAE,EAAE,CACpD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AACxE,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAiB,EAAY,EAAE;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAgC,CAAC;IACzD,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;AACtC,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAiB,EAAiB,EAAE;IACtE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAA4D,CAAC;IACrF,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;AACxC,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAiB,EAAY,EAAE;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAsB,CAAC;IAC/C,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAClC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/sync/delta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAiB,EAAiB,EAAE;IACtE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAA0C,CAAC;IACnE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;AAC1C,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAiB,EAAkB,EAAE;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAGvB,CAAC;IACF,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;QAC1D,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;KAC3D,CAAC;AACJ,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAiB,EAAc,EAAE;IAChE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAGvB,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAc,EAAc,EAAE,CAC7C,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAiB,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,CAAC,GAA+B,EAAE,EAAE,CACpD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AACxE,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAiB,EAAY,EAAE;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAgC,CAAC;IACzD,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;AACtC,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAiB,EAAiB,EAAE;IACtE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAA4D,CAAC;IACrF,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;AACxC,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAiB,EAAY,EAAE;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAsB,CAAC;IAC/C,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AAClC,CAAC,CAAC;AAyBF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAa,EAAE;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAmE,CAAC;IAC5F,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;AAChF,CAAC,CAAC;AAeF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAgB,EAAE;IACpE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAyC,CAAC;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAmC,EAAE,CAAC;AAC1E,CAAC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { RGAHandle } from "../crdt/rga.js";
|
|
2
|
+
import { TreeHandle } from "../crdt/tree.js";
|
|
3
|
+
type SupportedHandle = RGAHandle | TreeHandle;
|
|
4
|
+
/**
|
|
5
|
+
* CRDT-aware per-client undo/redo manager.
|
|
6
|
+
*
|
|
7
|
+
* Wraps an RGAHandle or TreeHandle. Intercept mutating methods via the manager
|
|
8
|
+
* instead of the handle directly to record undo history.
|
|
9
|
+
*
|
|
10
|
+
* Rules:
|
|
11
|
+
* - Undo sends a new valid CrdtOp (never a state rollback).
|
|
12
|
+
* - Only the local client's ops are tracked — remote ops are unaffected.
|
|
13
|
+
* - RGA Delete is NOT recorded (tombstones are final).
|
|
14
|
+
* - Stack is capped at 100 batches; oldest entries are dropped silently.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const manager = new UndoManager(client.rga("doc"));
|
|
19
|
+
* manager.insert(0, "hello");
|
|
20
|
+
* manager.undo(); // sends 5 × RgaOp::Delete
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class UndoManager<H extends SupportedHandle> {
|
|
24
|
+
private readonly handle;
|
|
25
|
+
private undoStack;
|
|
26
|
+
private redoStack;
|
|
27
|
+
private readonly stackListeners;
|
|
28
|
+
private openBatch;
|
|
29
|
+
private debounceTimer;
|
|
30
|
+
constructor(handle: H);
|
|
31
|
+
get canUndo(): boolean;
|
|
32
|
+
get canRedo(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Subscribe to stack change notifications (fired after any undo/redo/record).
|
|
35
|
+
* @returns Unsubscribe function.
|
|
36
|
+
*/
|
|
37
|
+
onStackChange(listener: () => void): () => void;
|
|
38
|
+
/** Begin accumulating entries into a single undo step. */
|
|
39
|
+
startBatch(): void;
|
|
40
|
+
/** Commit the open batch as one entry on the undo stack. No-op if no batch is open. */
|
|
41
|
+
commitBatch(): void;
|
|
42
|
+
/** Discard the open batch without recording anything. */
|
|
43
|
+
cancelBatch(): void;
|
|
44
|
+
undo(): void;
|
|
45
|
+
redo(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Insert text at visible position. Records undo entry with HLC node IDs.
|
|
48
|
+
* Uses 250ms debounce — consecutive inserts within the window form one batch.
|
|
49
|
+
*/
|
|
50
|
+
insert(pos: number, text: string, ttlMs?: number): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Delete characters by position. NOT recorded — RGA delete is non-undoable
|
|
53
|
+
* (tombstones are final; content is irrecoverable).
|
|
54
|
+
* clearRedo() is intentional: a destructive untracked op should invalidate
|
|
55
|
+
* any pending redo history, matching ProseMirror/Yjs behaviour.
|
|
56
|
+
*/
|
|
57
|
+
delete(pos: number, length: number, ttlMs?: number): void;
|
|
58
|
+
addNode(parentId: string | null, position: string, value: string, ttlMs?: number): string;
|
|
59
|
+
moveNode(nodeId: string, newParentId: string | null, newPosition: string, ttlMs?: number): void;
|
|
60
|
+
updateNode(nodeId: string, value: string, ttlMs?: number): void;
|
|
61
|
+
deleteNode(nodeId: string, ttlMs?: number): void;
|
|
62
|
+
private applyInverse;
|
|
63
|
+
private record;
|
|
64
|
+
/** Record with 250ms debounce — consecutive calls within window share one batch. */
|
|
65
|
+
private recordWithDebounce;
|
|
66
|
+
private pushUndo;
|
|
67
|
+
private clearRedo;
|
|
68
|
+
private notifyStackChange;
|
|
69
|
+
private asRGA;
|
|
70
|
+
private asTree;
|
|
71
|
+
private getCrdtId;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=UndoManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UndoManager.d.ts","sourceRoot":"","sources":["../../src/undo/UndoManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAc7C,KAAK,eAAe,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,eAAe;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAI;IAC3B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IAGxD,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,aAAa,CAA8C;gBAEvD,MAAM,EAAE,CAAC;IAMrB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAO/C,0DAA0D;IAC1D,UAAU,IAAI,IAAI;IAMlB,uFAAuF;IACvF,WAAW,IAAI,IAAI;IAOnB,yDAAyD;IACzD,WAAW,IAAI,IAAI;IAMnB,IAAI,IAAI,IAAI;IAkBZ,IAAI,IAAI,IAAI;IAsBZ;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAmB3D;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAOzD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBzF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAiB/F,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAgB/D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBhD,OAAO,CAAC,YAAY;IAsEpB,OAAO,CAAC,MAAM;IAQd,oFAAoF;IACpF,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,SAAS;CAGlB"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { RGAHandle } from "../crdt/rga.js";
|
|
2
|
+
import { TreeHandle } from "../crdt/tree.js";
|
|
3
|
+
const MAX_STACK_DEPTH = 100;
|
|
4
|
+
const RGA_DEBOUNCE_MS = 250;
|
|
5
|
+
/**
|
|
6
|
+
* CRDT-aware per-client undo/redo manager.
|
|
7
|
+
*
|
|
8
|
+
* Wraps an RGAHandle or TreeHandle. Intercept mutating methods via the manager
|
|
9
|
+
* instead of the handle directly to record undo history.
|
|
10
|
+
*
|
|
11
|
+
* Rules:
|
|
12
|
+
* - Undo sends a new valid CrdtOp (never a state rollback).
|
|
13
|
+
* - Only the local client's ops are tracked — remote ops are unaffected.
|
|
14
|
+
* - RGA Delete is NOT recorded (tombstones are final).
|
|
15
|
+
* - Stack is capped at 100 batches; oldest entries are dropped silently.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const manager = new UndoManager(client.rga("doc"));
|
|
20
|
+
* manager.insert(0, "hello");
|
|
21
|
+
* manager.undo(); // sends 5 × RgaOp::Delete
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export class UndoManager {
|
|
25
|
+
handle;
|
|
26
|
+
undoStack = [];
|
|
27
|
+
redoStack = [];
|
|
28
|
+
stackListeners = new Set();
|
|
29
|
+
// Batch accumulation
|
|
30
|
+
openBatch = null;
|
|
31
|
+
debounceTimer = null;
|
|
32
|
+
constructor(handle) {
|
|
33
|
+
this.handle = handle;
|
|
34
|
+
}
|
|
35
|
+
// ─── Stack state ────────────────────────────────────────────────────────────
|
|
36
|
+
get canUndo() {
|
|
37
|
+
return this.undoStack.length > 0;
|
|
38
|
+
}
|
|
39
|
+
get canRedo() {
|
|
40
|
+
return this.redoStack.length > 0;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Subscribe to stack change notifications (fired after any undo/redo/record).
|
|
44
|
+
* @returns Unsubscribe function.
|
|
45
|
+
*/
|
|
46
|
+
onStackChange(listener) {
|
|
47
|
+
this.stackListeners.add(listener);
|
|
48
|
+
return () => { this.stackListeners.delete(listener); };
|
|
49
|
+
}
|
|
50
|
+
// ─── Manual batching ────────────────────────────────────────────────────────
|
|
51
|
+
/** Begin accumulating entries into a single undo step. */
|
|
52
|
+
startBatch() {
|
|
53
|
+
if (this.openBatch === null) {
|
|
54
|
+
this.openBatch = [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Commit the open batch as one entry on the undo stack. No-op if no batch is open. */
|
|
58
|
+
commitBatch() {
|
|
59
|
+
if (this.openBatch !== null && this.openBatch.length > 0) {
|
|
60
|
+
this.pushUndo({ entries: this.openBatch });
|
|
61
|
+
}
|
|
62
|
+
this.openBatch = null;
|
|
63
|
+
}
|
|
64
|
+
/** Discard the open batch without recording anything. */
|
|
65
|
+
cancelBatch() {
|
|
66
|
+
this.openBatch = null;
|
|
67
|
+
}
|
|
68
|
+
// ─── Undo / Redo ────────────────────────────────────────────────────────────
|
|
69
|
+
undo() {
|
|
70
|
+
const batch = this.undoStack.pop();
|
|
71
|
+
if (batch === undefined)
|
|
72
|
+
return;
|
|
73
|
+
const inverseEntries = [];
|
|
74
|
+
// Apply inverse ops in reverse entry order.
|
|
75
|
+
for (let i = batch.entries.length - 1; i >= 0; i--) {
|
|
76
|
+
const entry = batch.entries[i];
|
|
77
|
+
const inverse = this.applyInverse(entry);
|
|
78
|
+
if (inverse !== null)
|
|
79
|
+
inverseEntries.unshift(inverse);
|
|
80
|
+
}
|
|
81
|
+
if (inverseEntries.length > 0) {
|
|
82
|
+
this.redoStack.push({ entries: inverseEntries });
|
|
83
|
+
}
|
|
84
|
+
this.notifyStackChange();
|
|
85
|
+
}
|
|
86
|
+
redo() {
|
|
87
|
+
const batch = this.redoStack.pop();
|
|
88
|
+
if (batch === undefined)
|
|
89
|
+
return;
|
|
90
|
+
const inverseEntries = [];
|
|
91
|
+
for (let i = batch.entries.length - 1; i >= 0; i--) {
|
|
92
|
+
const entry = batch.entries[i];
|
|
93
|
+
const inverse = this.applyInverse(entry);
|
|
94
|
+
if (inverse !== null)
|
|
95
|
+
inverseEntries.unshift(inverse);
|
|
96
|
+
}
|
|
97
|
+
if (inverseEntries.length > 0) {
|
|
98
|
+
this.undoStack.push({ entries: inverseEntries });
|
|
99
|
+
if (this.undoStack.length > MAX_STACK_DEPTH) {
|
|
100
|
+
this.undoStack.shift();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
this.notifyStackChange();
|
|
104
|
+
}
|
|
105
|
+
// ─── RGA handle proxy methods ────────────────────────────────────────────────
|
|
106
|
+
/**
|
|
107
|
+
* Insert text at visible position. Records undo entry with HLC node IDs.
|
|
108
|
+
* Uses 250ms debounce — consecutive inserts within the window form one batch.
|
|
109
|
+
*/
|
|
110
|
+
insert(pos, text, ttlMs) {
|
|
111
|
+
const handle = this.asRGA();
|
|
112
|
+
const nodeIds = handle.insert(pos, text, ttlMs);
|
|
113
|
+
for (let i = 0; i < nodeIds.length; i++) {
|
|
114
|
+
const entry = {
|
|
115
|
+
kind: "rga_insert",
|
|
116
|
+
crdtId: handle.id,
|
|
117
|
+
nodeId: nodeIds[i],
|
|
118
|
+
pos: pos + i,
|
|
119
|
+
content: text[i],
|
|
120
|
+
};
|
|
121
|
+
this.recordWithDebounce(entry);
|
|
122
|
+
}
|
|
123
|
+
this.clearRedo();
|
|
124
|
+
return nodeIds;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Delete characters by position. NOT recorded — RGA delete is non-undoable
|
|
128
|
+
* (tombstones are final; content is irrecoverable).
|
|
129
|
+
* clearRedo() is intentional: a destructive untracked op should invalidate
|
|
130
|
+
* any pending redo history, matching ProseMirror/Yjs behaviour.
|
|
131
|
+
*/
|
|
132
|
+
delete(pos, length, ttlMs) {
|
|
133
|
+
this.asRGA().delete(pos, length, ttlMs);
|
|
134
|
+
this.clearRedo();
|
|
135
|
+
}
|
|
136
|
+
// ─── Tree handle proxy methods ───────────────────────────────────────────────
|
|
137
|
+
addNode(parentId, position, value, ttlMs) {
|
|
138
|
+
const handle = this.asTree();
|
|
139
|
+
const nodeId = handle.addNode(parentId, position, value, ttlMs);
|
|
140
|
+
const entry = {
|
|
141
|
+
kind: "tree_add",
|
|
142
|
+
crdtId: this.getCrdtId(),
|
|
143
|
+
nodeId,
|
|
144
|
+
parentId,
|
|
145
|
+
position,
|
|
146
|
+
value,
|
|
147
|
+
};
|
|
148
|
+
this.record(entry);
|
|
149
|
+
this.clearRedo();
|
|
150
|
+
return nodeId;
|
|
151
|
+
}
|
|
152
|
+
moveNode(nodeId, newParentId, newPosition, ttlMs) {
|
|
153
|
+
const handle = this.asTree();
|
|
154
|
+
const meta = handle.getNodeMeta(nodeId);
|
|
155
|
+
handle.moveNode(nodeId, newParentId, newPosition, ttlMs);
|
|
156
|
+
const entry = {
|
|
157
|
+
kind: "tree_move",
|
|
158
|
+
crdtId: this.getCrdtId(),
|
|
159
|
+
nodeId,
|
|
160
|
+
oldParentId: meta?.parentId ?? null,
|
|
161
|
+
oldPosition: meta?.position ?? "a0",
|
|
162
|
+
newParentId,
|
|
163
|
+
newPosition,
|
|
164
|
+
};
|
|
165
|
+
this.record(entry);
|
|
166
|
+
this.clearRedo();
|
|
167
|
+
}
|
|
168
|
+
updateNode(nodeId, value, ttlMs) {
|
|
169
|
+
const handle = this.asTree();
|
|
170
|
+
const meta = handle.getNodeMeta(nodeId);
|
|
171
|
+
handle.updateNode(nodeId, value, ttlMs);
|
|
172
|
+
const entry = {
|
|
173
|
+
kind: "tree_update",
|
|
174
|
+
crdtId: this.getCrdtId(),
|
|
175
|
+
nodeId,
|
|
176
|
+
previousValue: meta?.value ?? "",
|
|
177
|
+
previousUpdatedAt: meta?.updatedAt ?? nodeId,
|
|
178
|
+
newValue: value,
|
|
179
|
+
};
|
|
180
|
+
this.record(entry);
|
|
181
|
+
this.clearRedo();
|
|
182
|
+
}
|
|
183
|
+
deleteNode(nodeId, ttlMs) {
|
|
184
|
+
const handle = this.asTree();
|
|
185
|
+
const meta = handle.getNodeMeta(nodeId);
|
|
186
|
+
handle.deleteNode(nodeId, ttlMs);
|
|
187
|
+
const entry = {
|
|
188
|
+
kind: "tree_delete",
|
|
189
|
+
crdtId: this.getCrdtId(),
|
|
190
|
+
nodeId,
|
|
191
|
+
parentId: meta?.parentId ?? null,
|
|
192
|
+
position: meta?.position ?? "a0",
|
|
193
|
+
value: meta?.value ?? "",
|
|
194
|
+
updatedAt: meta?.updatedAt ?? nodeId,
|
|
195
|
+
};
|
|
196
|
+
this.record(entry);
|
|
197
|
+
this.clearRedo();
|
|
198
|
+
}
|
|
199
|
+
// ─── Internal ────────────────────────────────────────────────────────────────
|
|
200
|
+
applyInverse(entry) {
|
|
201
|
+
switch (entry.kind) {
|
|
202
|
+
case "rga_insert": {
|
|
203
|
+
this.asRGA().deleteById(entry.nodeId);
|
|
204
|
+
// Inverse of an insert is a delete — not re-recordable as an undo entry.
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
case "tree_add": {
|
|
208
|
+
this.asTree().deleteNode(entry.nodeId);
|
|
209
|
+
// Inverse: a delete entry (for redo — re-add the node).
|
|
210
|
+
const inverse = {
|
|
211
|
+
kind: "tree_delete",
|
|
212
|
+
crdtId: entry.crdtId,
|
|
213
|
+
nodeId: entry.nodeId,
|
|
214
|
+
parentId: entry.parentId,
|
|
215
|
+
position: entry.position,
|
|
216
|
+
value: entry.value,
|
|
217
|
+
updatedAt: entry.nodeId,
|
|
218
|
+
};
|
|
219
|
+
return inverse;
|
|
220
|
+
}
|
|
221
|
+
case "tree_delete": {
|
|
222
|
+
// Re-add with original state. Gets a new nodeId (tombstone is permanent).
|
|
223
|
+
const newNodeId = this.asTree().addNode(entry.parentId, entry.position, entry.value);
|
|
224
|
+
const inverse = {
|
|
225
|
+
kind: "tree_add",
|
|
226
|
+
crdtId: entry.crdtId,
|
|
227
|
+
nodeId: newNodeId,
|
|
228
|
+
parentId: entry.parentId,
|
|
229
|
+
position: entry.position,
|
|
230
|
+
value: entry.value,
|
|
231
|
+
};
|
|
232
|
+
return inverse;
|
|
233
|
+
}
|
|
234
|
+
case "tree_move": {
|
|
235
|
+
this.asTree().moveNode(entry.nodeId, entry.oldParentId, entry.oldPosition);
|
|
236
|
+
const inverse = {
|
|
237
|
+
kind: "tree_move",
|
|
238
|
+
crdtId: entry.crdtId,
|
|
239
|
+
nodeId: entry.nodeId,
|
|
240
|
+
oldParentId: entry.newParentId,
|
|
241
|
+
oldPosition: entry.newPosition,
|
|
242
|
+
newParentId: entry.oldParentId,
|
|
243
|
+
newPosition: entry.oldPosition,
|
|
244
|
+
};
|
|
245
|
+
return inverse;
|
|
246
|
+
}
|
|
247
|
+
case "tree_update": {
|
|
248
|
+
this.asTree().updateNode(entry.nodeId, entry.previousValue);
|
|
249
|
+
const inverse = {
|
|
250
|
+
kind: "tree_update",
|
|
251
|
+
crdtId: entry.crdtId,
|
|
252
|
+
nodeId: entry.nodeId,
|
|
253
|
+
previousValue: entry.newValue,
|
|
254
|
+
previousUpdatedAt: entry.previousUpdatedAt,
|
|
255
|
+
newValue: entry.previousValue,
|
|
256
|
+
};
|
|
257
|
+
return inverse;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
record(entry) {
|
|
262
|
+
if (this.openBatch !== null) {
|
|
263
|
+
this.openBatch.push(entry);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
this.pushUndo({ entries: [entry] });
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** Record with 250ms debounce — consecutive calls within window share one batch. */
|
|
270
|
+
recordWithDebounce(entry) {
|
|
271
|
+
if (this.debounceTimer === null) {
|
|
272
|
+
// Start a new debounce batch.
|
|
273
|
+
this.openBatch = [entry];
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
// Extend the current batch.
|
|
277
|
+
clearTimeout(this.debounceTimer);
|
|
278
|
+
this.openBatch?.push(entry);
|
|
279
|
+
}
|
|
280
|
+
this.debounceTimer = setTimeout(() => {
|
|
281
|
+
this.debounceTimer = null;
|
|
282
|
+
this.commitBatch();
|
|
283
|
+
}, RGA_DEBOUNCE_MS);
|
|
284
|
+
}
|
|
285
|
+
pushUndo(batch) {
|
|
286
|
+
this.undoStack.push(batch);
|
|
287
|
+
if (this.undoStack.length > MAX_STACK_DEPTH) {
|
|
288
|
+
this.undoStack.shift();
|
|
289
|
+
}
|
|
290
|
+
this.notifyStackChange();
|
|
291
|
+
}
|
|
292
|
+
clearRedo() {
|
|
293
|
+
if (this.redoStack.length > 0) {
|
|
294
|
+
this.redoStack = [];
|
|
295
|
+
this.notifyStackChange();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
notifyStackChange() {
|
|
299
|
+
for (const listener of this.stackListeners)
|
|
300
|
+
listener();
|
|
301
|
+
}
|
|
302
|
+
asRGA() {
|
|
303
|
+
if (!(this.handle instanceof RGAHandle)) {
|
|
304
|
+
throw new Error("UndoManager: handle is not an RGAHandle");
|
|
305
|
+
}
|
|
306
|
+
return this.handle;
|
|
307
|
+
}
|
|
308
|
+
asTree() {
|
|
309
|
+
if (!(this.handle instanceof TreeHandle)) {
|
|
310
|
+
throw new Error("UndoManager: handle is not a TreeHandle");
|
|
311
|
+
}
|
|
312
|
+
return this.handle;
|
|
313
|
+
}
|
|
314
|
+
getCrdtId() {
|
|
315
|
+
return this.handle.id;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=UndoManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UndoManager.js","sourceRoot":"","sources":["../../src/undo/UndoManager.ts"],"names":[],"mappings":"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"}
|