@hyperframes/sdk 0.6.113
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 +190 -0
- package/dist/adapters/fs.d.ts +9 -0
- package/dist/adapters/fs.d.ts.map +1 -0
- package/dist/adapters/fs.js +122 -0
- package/dist/adapters/fs.js.map +1 -0
- package/dist/adapters/headless.d.ts +3 -0
- package/dist/adapters/headless.d.ts.map +1 -0
- package/dist/adapters/headless.js +17 -0
- package/dist/adapters/headless.js.map +1 -0
- package/dist/adapters/iframe.d.ts +102 -0
- package/dist/adapters/iframe.d.ts.map +1 -0
- package/dist/adapters/iframe.js +569 -0
- package/dist/adapters/iframe.js.map +1 -0
- package/dist/adapters/memory.d.ts +5 -0
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/adapters/memory.js +54 -0
- package/dist/adapters/memory.js.map +1 -0
- package/dist/adapters/types.d.ts +65 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/document.d.ts +25 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +238 -0
- package/dist/document.js.map +1 -0
- package/dist/engine/apply-patches.d.ts +20 -0
- package/dist/engine/apply-patches.d.ts.map +1 -0
- package/dist/engine/apply-patches.js +284 -0
- package/dist/engine/apply-patches.js.map +1 -0
- package/dist/engine/cssWriter.d.ts +18 -0
- package/dist/engine/cssWriter.d.ts.map +1 -0
- package/dist/engine/cssWriter.js +139 -0
- package/dist/engine/cssWriter.js.map +1 -0
- package/dist/engine/keyframeBackfill.d.ts +17 -0
- package/dist/engine/keyframeBackfill.d.ts.map +1 -0
- package/dist/engine/keyframeBackfill.js +43 -0
- package/dist/engine/keyframeBackfill.js.map +1 -0
- package/dist/engine/model.d.ts +55 -0
- package/dist/engine/model.d.ts.map +1 -0
- package/dist/engine/model.js +256 -0
- package/dist/engine/model.js.map +1 -0
- package/dist/engine/mutate.d.ts +26 -0
- package/dist/engine/mutate.d.ts.map +1 -0
- package/dist/engine/mutate.js +1243 -0
- package/dist/engine/mutate.js.map +1 -0
- package/dist/engine/patches.d.ts +71 -0
- package/dist/engine/patches.d.ts.map +1 -0
- package/dist/engine/patches.js +197 -0
- package/dist/engine/patches.js.map +1 -0
- package/dist/engine/serialize.d.ts +15 -0
- package/dist/engine/serialize.d.ts.map +1 -0
- package/dist/engine/serialize.js +20 -0
- package/dist/engine/serialize.js.map +1 -0
- package/dist/engine/variableModel.d.ts +29 -0
- package/dist/engine/variableModel.d.ts.map +1 -0
- package/dist/engine/variableModel.js +81 -0
- package/dist/engine/variableModel.js.map +1 -0
- package/dist/history.d.ts +39 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +116 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/persist-queue.d.ts +24 -0
- package/dist/persist-queue.d.ts.map +1 -0
- package/dist/persist-queue.js +62 -0
- package/dist/persist-queue.js.map +1 -0
- package/dist/session.d.ts +38 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +514 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +521 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +55 -0
package/dist/session.js
ADDED
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 3a — real editing session.
|
|
3
|
+
*
|
|
4
|
+
* CompositionImpl: live linkedom document, real dispatch, RFC 6902 patch emission,
|
|
5
|
+
* override-set accumulation, batch, can(), serialize(), applyPatches().
|
|
6
|
+
*
|
|
7
|
+
* openComposition() wires history + persist queue for standalone (T1/T2) mode.
|
|
8
|
+
* T3 (embedded) callers supply overrides; SDK emits patches only — host owns state.
|
|
9
|
+
*/
|
|
10
|
+
import { ORIGIN_APPLY_PATCHES, ORIGIN_LOCAL } from "./types.js";
|
|
11
|
+
import { buildRoots, flatElements } from "./document.js";
|
|
12
|
+
import { parseMutable } from "./engine/model.js";
|
|
13
|
+
import { applyOp, validateOp } from "./engine/mutate.js";
|
|
14
|
+
import { getGsapScript, resolveScoped } from "./engine/model.js";
|
|
15
|
+
import { extractGsapLabels } from "@hyperframes/core/gsap-parser-acorn";
|
|
16
|
+
import { serializeDocument } from "./engine/serialize.js";
|
|
17
|
+
import { applyPatchesToDocument, applyOverrideSet } from "./engine/apply-patches.js";
|
|
18
|
+
import { buildPatchEvent, pathToKey } from "./engine/patches.js";
|
|
19
|
+
import { createHistory } from "./history.js";
|
|
20
|
+
import { createPersistQueue } from "./persist-queue.js";
|
|
21
|
+
// ─── Implementation ───────────────────────────────────────────────────────────
|
|
22
|
+
class CompositionImpl {
|
|
23
|
+
parsed;
|
|
24
|
+
persist;
|
|
25
|
+
preview;
|
|
26
|
+
/** Accumulated override-set — T3 embedded mode fold contract. */
|
|
27
|
+
overrides;
|
|
28
|
+
/** Lazily-built element snapshot, invalidated on every mutation. */
|
|
29
|
+
elementsCache = null;
|
|
30
|
+
currentSelection = [];
|
|
31
|
+
changeHandlers = [];
|
|
32
|
+
selectionHandlers = [];
|
|
33
|
+
patchHandlers = [];
|
|
34
|
+
errorHandlers = [];
|
|
35
|
+
previewSelectionUnsubscribe = null;
|
|
36
|
+
/** Attached by openComposition() for standalone mode. */
|
|
37
|
+
historyModule = null;
|
|
38
|
+
persistQueueModule = null;
|
|
39
|
+
/** Batching state: accumulates patches from multiple dispatches. */
|
|
40
|
+
batchDepth = 0;
|
|
41
|
+
batchForward = [];
|
|
42
|
+
batchInverse = [];
|
|
43
|
+
batchOpTypes = [];
|
|
44
|
+
batchOrigin = ORIGIN_LOCAL;
|
|
45
|
+
/** Override-set state at outermost batch entry — restored if the batch throws. */
|
|
46
|
+
batchOverridesSnapshot = {};
|
|
47
|
+
constructor(parsed, opts) {
|
|
48
|
+
this.parsed = parsed;
|
|
49
|
+
this.persist = opts.persist;
|
|
50
|
+
this.preview = opts.preview;
|
|
51
|
+
this.overrides = { ...(opts.overrides ?? {}) };
|
|
52
|
+
this.previewSelectionUnsubscribe =
|
|
53
|
+
this.preview?.on("selection", (ids) => this.updateSelection(ids)) ?? null;
|
|
54
|
+
}
|
|
55
|
+
attachHistory(module) {
|
|
56
|
+
this.historyModule = module;
|
|
57
|
+
}
|
|
58
|
+
attachPersistQueue(module) {
|
|
59
|
+
this.persistQueueModule = module;
|
|
60
|
+
}
|
|
61
|
+
_fireError(e) {
|
|
62
|
+
this.errorHandlers.forEach((h) => h(e));
|
|
63
|
+
}
|
|
64
|
+
// ── Typed methods (F10 layer 1) ─────────────────────────────────────────────
|
|
65
|
+
setStyle(id, styles) {
|
|
66
|
+
this.dispatch({ type: "setStyle", target: id, styles });
|
|
67
|
+
}
|
|
68
|
+
setText(id, value) {
|
|
69
|
+
this.dispatch({ type: "setText", target: id, value });
|
|
70
|
+
}
|
|
71
|
+
setAttribute(id, name, value) {
|
|
72
|
+
this.dispatch({ type: "setAttribute", target: id, name, value });
|
|
73
|
+
}
|
|
74
|
+
setTiming(id, timing) {
|
|
75
|
+
this.dispatch({ type: "setTiming", target: id, ...timing });
|
|
76
|
+
}
|
|
77
|
+
removeElement(id) {
|
|
78
|
+
this.dispatch({ type: "removeElement", target: id });
|
|
79
|
+
}
|
|
80
|
+
addElement(parent, index, html) {
|
|
81
|
+
const result = this._dispatch({ type: "addElement", parent, index, html }, ORIGIN_LOCAL);
|
|
82
|
+
return result.meta?.newId ?? "";
|
|
83
|
+
}
|
|
84
|
+
setVariableValue(id, value) {
|
|
85
|
+
this.dispatch({ type: "setVariableValue", id, value });
|
|
86
|
+
}
|
|
87
|
+
// ── WS-C: timing accessors + typed setHold ───────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Cache of parsed GSAP labels keyed by EXACT script text. extractGsapLabels does
|
|
90
|
+
* a full acorn parse; caching avoids re-parsing on repeated getElementTimings reads
|
|
91
|
+
* when the script is unchanged. The content (not reference) key means any script
|
|
92
|
+
* edit changes the text and invalidates the cache, so renumbered tweens never yield
|
|
93
|
+
* stale label positions.
|
|
94
|
+
*/
|
|
95
|
+
_gsapLabelCache = null;
|
|
96
|
+
// fallow-ignore-next-line complexity
|
|
97
|
+
getElementTimings() {
|
|
98
|
+
const script = getGsapScript(this.parsed.document);
|
|
99
|
+
// Extract all addLabel("name", position) calls from the GSAP script (see cache note above).
|
|
100
|
+
let allLabels;
|
|
101
|
+
if (script && this._gsapLabelCache?.script === script) {
|
|
102
|
+
allLabels = this._gsapLabelCache.labels;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
allLabels = script ? extractGsapLabels(script) : [];
|
|
106
|
+
this._gsapLabelCache = script ? { script, labels: allLabels } : null;
|
|
107
|
+
}
|
|
108
|
+
const result = {};
|
|
109
|
+
const elements = this.getElements();
|
|
110
|
+
for (const el of elements) {
|
|
111
|
+
const domEl = resolveScoped(this.parsed.document, el.scopedId);
|
|
112
|
+
if (!domEl)
|
|
113
|
+
continue;
|
|
114
|
+
const startStr = domEl.getAttribute("data-start");
|
|
115
|
+
const endStr = domEl.getAttribute("data-end");
|
|
116
|
+
const durationStr = domEl.getAttribute("data-duration");
|
|
117
|
+
// Same preference as handleSetTiming: prefer data-duration, fall back to end - start.
|
|
118
|
+
const start = startStr !== null ? parseFloat(startStr) : 0;
|
|
119
|
+
const durationAttr = durationStr !== null ? parseFloat(durationStr) : null;
|
|
120
|
+
const endAttr = endStr !== null ? parseFloat(endStr) : null;
|
|
121
|
+
let duration;
|
|
122
|
+
if (durationAttr !== null && Number.isFinite(durationAttr)) {
|
|
123
|
+
duration = durationAttr;
|
|
124
|
+
}
|
|
125
|
+
else if (endAttr !== null && Number.isFinite(endAttr)) {
|
|
126
|
+
duration = endAttr - start;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// No timing info — skip non-timed elements.
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const enterAt = Number.isFinite(start) ? start : 0;
|
|
133
|
+
const exitAt = enterAt + (Number.isFinite(duration) ? duration : 0);
|
|
134
|
+
// Labels whose position falls within [enterAt, exitAt] (end-inclusive: a
|
|
135
|
+
// label exactly at exitAt is treated as within the element's window).
|
|
136
|
+
const labels = allLabels
|
|
137
|
+
.filter(({ position }) => position >= enterAt && position <= exitAt)
|
|
138
|
+
.map(({ name }) => name);
|
|
139
|
+
result[el.scopedId] = { enterAt, exitAt, labels };
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
setElementTiming(map) {
|
|
144
|
+
const entries = Object.entries(map);
|
|
145
|
+
if (entries.length === 0)
|
|
146
|
+
return;
|
|
147
|
+
this.batch(() => {
|
|
148
|
+
for (const [id, timing] of entries) {
|
|
149
|
+
this.dispatch({ type: "setTiming", target: id, ...timing });
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
setHold(id, hold) {
|
|
154
|
+
this.dispatch({ type: "setHold", target: id, hold });
|
|
155
|
+
}
|
|
156
|
+
addGsapTween(target, tween) {
|
|
157
|
+
const result = this._dispatch({ type: "addGsapTween", target, tween }, ORIGIN_LOCAL);
|
|
158
|
+
return result.meta?.animationId ?? "";
|
|
159
|
+
}
|
|
160
|
+
setGsapTween(animationId, properties) {
|
|
161
|
+
this.dispatch({ type: "setGsapTween", animationId, properties });
|
|
162
|
+
}
|
|
163
|
+
removeGsapTween(animationId) {
|
|
164
|
+
this.dispatch({ type: "removeGsapTween", animationId });
|
|
165
|
+
}
|
|
166
|
+
addWithKeyframes(targetSelector, position, duration, keyframes, ease) {
|
|
167
|
+
const result = this._dispatch({ type: "addWithKeyframes", targetSelector, position, duration, keyframes, ease }, ORIGIN_LOCAL);
|
|
168
|
+
return result.meta?.animationId ?? "";
|
|
169
|
+
}
|
|
170
|
+
replaceWithKeyframes(animationId, targetSelector, position, duration, keyframes, ease) {
|
|
171
|
+
const result = this._dispatch({
|
|
172
|
+
type: "replaceWithKeyframes",
|
|
173
|
+
animationId,
|
|
174
|
+
targetSelector,
|
|
175
|
+
position,
|
|
176
|
+
duration,
|
|
177
|
+
keyframes,
|
|
178
|
+
ease,
|
|
179
|
+
}, ORIGIN_LOCAL);
|
|
180
|
+
// Position-derived IDs renumber after the remove — this is the NEW id, which
|
|
181
|
+
// may differ from the input animationId.
|
|
182
|
+
return result.meta?.animationId ?? "";
|
|
183
|
+
}
|
|
184
|
+
undo() {
|
|
185
|
+
this.historyModule?.undo();
|
|
186
|
+
}
|
|
187
|
+
redo() {
|
|
188
|
+
this.historyModule?.redo();
|
|
189
|
+
}
|
|
190
|
+
canUndo() {
|
|
191
|
+
return this.historyModule?.canUndo() ?? false;
|
|
192
|
+
}
|
|
193
|
+
canRedo() {
|
|
194
|
+
return this.historyModule?.canRedo() ?? false;
|
|
195
|
+
}
|
|
196
|
+
// ── Query API (F1) ───────────────────────────────────────────────────────────
|
|
197
|
+
getElements() {
|
|
198
|
+
// Walk the live linkedom DOM directly — no serialize/re-parse round trip.
|
|
199
|
+
this.elementsCache ??= flatElements(buildRoots(this.parsed.document));
|
|
200
|
+
return [...this.elementsCache];
|
|
201
|
+
}
|
|
202
|
+
getElement(id) {
|
|
203
|
+
// Accept both bare ids (top-level) and scoped ids (sub-composition elements).
|
|
204
|
+
// Match by scopedId first (canonical); bare-id fallback keeps top-level compat
|
|
205
|
+
// for callers that don't yet use scoped ids.
|
|
206
|
+
return (this.getElements().find((el) => el.scopedId === id) ??
|
|
207
|
+
this.getElements().find((el) => el.id === id && el.scopedId === el.id) ??
|
|
208
|
+
null);
|
|
209
|
+
}
|
|
210
|
+
find(query) {
|
|
211
|
+
return (this.getElements()
|
|
212
|
+
// fallow-ignore-next-line complexity
|
|
213
|
+
.filter((el) => {
|
|
214
|
+
if (query.tag && el.tag !== query.tag)
|
|
215
|
+
return false;
|
|
216
|
+
if (query.text && !el.text?.includes(query.text))
|
|
217
|
+
return false;
|
|
218
|
+
if (query.name && el.attributes["data-name"] !== query.name)
|
|
219
|
+
return false;
|
|
220
|
+
if (query.track !== undefined && el.trackIndex !== query.track)
|
|
221
|
+
return false;
|
|
222
|
+
if (query.composition && !el.scopedId.startsWith(`${query.composition}/`))
|
|
223
|
+
return false;
|
|
224
|
+
return true;
|
|
225
|
+
})
|
|
226
|
+
.map((el) => el.scopedId));
|
|
227
|
+
}
|
|
228
|
+
// ── Selection API ────────────────────────────────────────────────────────────
|
|
229
|
+
selection() {
|
|
230
|
+
const ids = [...this.currentSelection];
|
|
231
|
+
return {
|
|
232
|
+
ids,
|
|
233
|
+
setStyle: (styles) => this.dispatch({ type: "setStyle", target: ids, styles }),
|
|
234
|
+
setText: (value) => this.dispatch({ type: "setText", target: ids, value }),
|
|
235
|
+
setAttribute: (name, value) => this.dispatch({ type: "setAttribute", target: ids, name, value }),
|
|
236
|
+
setTiming: (timing) => this.dispatch({ type: "setTiming", target: ids, ...timing }),
|
|
237
|
+
removeElement: () => this.dispatch({ type: "removeElement", target: ids }),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
element(id) {
|
|
241
|
+
return {
|
|
242
|
+
id,
|
|
243
|
+
setStyle: (styles) => this.dispatch({ type: "setStyle", target: id, styles }),
|
|
244
|
+
setText: (value) => this.dispatch({ type: "setText", target: id, value }),
|
|
245
|
+
setAttribute: (name, value) => this.dispatch({ type: "setAttribute", target: id, name, value }),
|
|
246
|
+
setTiming: (timing) => this.dispatch({ type: "setTiming", target: id, ...timing }),
|
|
247
|
+
removeElement: () => this.dispatch({ type: "removeElement", target: id }),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
getSelection() {
|
|
251
|
+
return [...this.currentSelection];
|
|
252
|
+
}
|
|
253
|
+
setSelection(ids) {
|
|
254
|
+
const deduped = Array.from(new Set(ids));
|
|
255
|
+
if (deduped.length === this.currentSelection.length &&
|
|
256
|
+
deduped.every((id, i) => id === this.currentSelection[i])) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
this.updateSelection(deduped);
|
|
260
|
+
}
|
|
261
|
+
updateSelection(ids) {
|
|
262
|
+
this.currentSelection = [...ids];
|
|
263
|
+
for (const handler of this.selectionHandlers) {
|
|
264
|
+
handler([...this.currentSelection]);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// ── Dispatch / batch ─────────────────────────────────────────────────────────
|
|
268
|
+
// fallow-ignore-next-line complexity
|
|
269
|
+
_dispatch(op, origin) {
|
|
270
|
+
const result = applyOp(this.parsed, op);
|
|
271
|
+
const { forward, inverse } = result;
|
|
272
|
+
if (forward.length === 0 && inverse.length === 0) {
|
|
273
|
+
if (this.batchDepth === 0)
|
|
274
|
+
this.changeHandlers.forEach((h) => h());
|
|
275
|
+
return result;
|
|
276
|
+
}
|
|
277
|
+
this.elementsCache = null;
|
|
278
|
+
// Update override-set from forward patches
|
|
279
|
+
for (const p of forward) {
|
|
280
|
+
const key = pathToKey(p.path);
|
|
281
|
+
if (key !== null) {
|
|
282
|
+
this.overrides[key] =
|
|
283
|
+
p.op === "remove"
|
|
284
|
+
? null
|
|
285
|
+
: p.value;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Purge orphan property keys for removed elements so the override-set stays
|
|
289
|
+
// compact and a future T3 session doesn't replay stale properties onto a
|
|
290
|
+
// non-existent element. Override-set keys use decoded scoped ids ("hf-host/hf-leaf")
|
|
291
|
+
// while path segments use RFC 6902 encoding ("hf-host~1hf-leaf") — decode before compare.
|
|
292
|
+
for (const p of forward) {
|
|
293
|
+
const elemMatch = /^\/elements\/([^/]+)$/.exec(p.path);
|
|
294
|
+
if (p.op === "remove" && elemMatch) {
|
|
295
|
+
// Decode RFC 6902 escaping: ~1 → /, ~0 → ~
|
|
296
|
+
const id = elemMatch[1].replace(/~1/g, "/").replace(/~0/g, "~");
|
|
297
|
+
for (const key of Object.keys(this.overrides)) {
|
|
298
|
+
// Purge property sub-keys (e.g. "hf-x.style.color") but preserve
|
|
299
|
+
// the removal marker itself (key === id, set to null in the loop above).
|
|
300
|
+
if (key.startsWith(`${id}.`) || key.startsWith(`${id}/`)) {
|
|
301
|
+
delete this.overrides[key];
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (this.batchDepth > 0) {
|
|
307
|
+
this.batchForward.push(...forward);
|
|
308
|
+
this.batchInverse.push(...inverse);
|
|
309
|
+
if (!this.batchOpTypes.includes(op.type))
|
|
310
|
+
this.batchOpTypes.push(op.type);
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
// Reverse the inverse list (parity with batch() below): an op that emits
|
|
314
|
+
// multiple patches whose undo order matters — same path (reorderElements
|
|
315
|
+
// with a duplicate target), an aliased multi-target, or a nested
|
|
316
|
+
// parent+child removeElement — must undo in reverse application order, or
|
|
317
|
+
// undo lands on an intermediate value / drops a subtree. Harmless for the
|
|
318
|
+
// common single-patch / independent-path case.
|
|
319
|
+
const event = buildPatchEvent(forward, [...inverse].reverse(), origin, [op.type]);
|
|
320
|
+
this.patchHandlers.forEach((h) => h(event));
|
|
321
|
+
this.changeHandlers.forEach((h) => h());
|
|
322
|
+
}
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
325
|
+
dispatch(op, opts) {
|
|
326
|
+
this._dispatch(op, opts?.origin ?? ORIGIN_LOCAL);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Coalesce multiple dispatches into one undo entry / one patch event.
|
|
330
|
+
*
|
|
331
|
+
* Transactional: if the callback throws, all DOM mutations applied so far
|
|
332
|
+
* are reverted (accumulated inverse patches replayed in reverse) and the
|
|
333
|
+
* override-set is restored — the model is exactly as it was at batch entry.
|
|
334
|
+
*
|
|
335
|
+
* Note: a batch that produces no effective mutations still fires 'change'
|
|
336
|
+
* handlers (parity with no-op dispatch) — subscribers must not assume
|
|
337
|
+
* silence when wrapping speculative operations.
|
|
338
|
+
*/
|
|
339
|
+
// fallow-ignore-next-line complexity
|
|
340
|
+
batch(fn, opts) {
|
|
341
|
+
const origin = opts?.origin ?? ORIGIN_LOCAL;
|
|
342
|
+
this.batchDepth++;
|
|
343
|
+
if (this.batchDepth === 1) {
|
|
344
|
+
this.batchOrigin = origin; // only set on outermost entry
|
|
345
|
+
this.batchOverridesSnapshot = { ...this.overrides };
|
|
346
|
+
}
|
|
347
|
+
let threw = false;
|
|
348
|
+
try {
|
|
349
|
+
fn();
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
threw = true;
|
|
353
|
+
throw err;
|
|
354
|
+
}
|
|
355
|
+
finally {
|
|
356
|
+
this.batchDepth--;
|
|
357
|
+
if (this.batchDepth === 0) {
|
|
358
|
+
if (!threw && this.batchForward.length > 0) {
|
|
359
|
+
const event = buildPatchEvent(this.batchForward, [...this.batchInverse].reverse(), this.batchOrigin, this.batchOpTypes);
|
|
360
|
+
// Fire handlers before resetting batch state so that if a handler
|
|
361
|
+
// throws the patch data (batchForward/batchInverse) is still intact
|
|
362
|
+
// for callers that inspect it on error. The event was already built
|
|
363
|
+
// from a snapshot so handler re-entrancy does not corrupt the event.
|
|
364
|
+
this.patchHandlers.forEach((h) => h(event));
|
|
365
|
+
this.changeHandlers.forEach((h) => h());
|
|
366
|
+
this.resetBatchState();
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
if (threw && this.batchInverse.length > 0) {
|
|
370
|
+
// Roll back: the dispatches inside the batch already mutated the
|
|
371
|
+
// DOM. Without this, a throwing batch would leave the model in a
|
|
372
|
+
// partial state with no patch trail to undo it.
|
|
373
|
+
applyPatchesToDocument(this.parsed, [...this.batchInverse].reverse());
|
|
374
|
+
this.overrides = { ...this.batchOverridesSnapshot };
|
|
375
|
+
this.elementsCache = null;
|
|
376
|
+
}
|
|
377
|
+
this.resetBatchState();
|
|
378
|
+
// Empty no-op batch: fire changeHandlers (parity with dispatch)
|
|
379
|
+
if (!threw)
|
|
380
|
+
this.changeHandlers.forEach((h) => h());
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
resetBatchState() {
|
|
386
|
+
this.batchForward = [];
|
|
387
|
+
this.batchInverse = [];
|
|
388
|
+
this.batchOpTypes = [];
|
|
389
|
+
this.batchOrigin = ORIGIN_LOCAL;
|
|
390
|
+
this.batchOverridesSnapshot = {};
|
|
391
|
+
}
|
|
392
|
+
can(op) {
|
|
393
|
+
return validateOp(this.parsed, op);
|
|
394
|
+
}
|
|
395
|
+
// fallow-ignore-next-line complexity
|
|
396
|
+
on(event, handler) {
|
|
397
|
+
const h = handler;
|
|
398
|
+
if (event === "change") {
|
|
399
|
+
this.changeHandlers.push(h);
|
|
400
|
+
return () => {
|
|
401
|
+
this.changeHandlers = this.changeHandlers.filter((x) => x !== h);
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
if (event === "selectionchange") {
|
|
405
|
+
this.selectionHandlers.push(h);
|
|
406
|
+
return () => {
|
|
407
|
+
this.selectionHandlers = this.selectionHandlers.filter((x) => x !== h);
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
if (event === "patch") {
|
|
411
|
+
this.patchHandlers.push(h);
|
|
412
|
+
return () => {
|
|
413
|
+
this.patchHandlers = this.patchHandlers.filter((x) => x !== h);
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
if (event === "persist:error") {
|
|
417
|
+
const typedH = h;
|
|
418
|
+
this.errorHandlers.push(typedH);
|
|
419
|
+
const offPersist = this.persist?.on("persist:error", typedH);
|
|
420
|
+
return () => {
|
|
421
|
+
this.errorHandlers = this.errorHandlers.filter((x) => x !== typedH);
|
|
422
|
+
offPersist?.();
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
return () => { };
|
|
426
|
+
}
|
|
427
|
+
// ── Serialization ────────────────────────────────────────────────────────────
|
|
428
|
+
serialize() {
|
|
429
|
+
return serializeDocument(this.parsed);
|
|
430
|
+
}
|
|
431
|
+
// ── T3 embedded-mode extras ──────────────────────────────────────────────────
|
|
432
|
+
getOverrides() {
|
|
433
|
+
return { ...this.overrides };
|
|
434
|
+
}
|
|
435
|
+
// fallow-ignore-next-line complexity
|
|
436
|
+
applyPatches(patches, opts) {
|
|
437
|
+
const origin = opts?.origin ?? ORIGIN_APPLY_PATCHES;
|
|
438
|
+
// The emitted PatchEvent carries an EMPTY inversePatches array — hosts
|
|
439
|
+
// maintaining an external inverse log must compute inverses from their own
|
|
440
|
+
// state; applyPatches events never enter history (origin-guarded).
|
|
441
|
+
// Emit a patch event so subscribers stay in sync.
|
|
442
|
+
applyPatchesToDocument(this.parsed, patches);
|
|
443
|
+
this.elementsCache = null;
|
|
444
|
+
// Update override-set
|
|
445
|
+
for (const p of patches) {
|
|
446
|
+
const key = pathToKey(p.path);
|
|
447
|
+
if (key !== null) {
|
|
448
|
+
this.overrides[key] =
|
|
449
|
+
p.op === "remove"
|
|
450
|
+
? null
|
|
451
|
+
: p.value;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
const opTypes = ["applyPatches"];
|
|
455
|
+
const event = buildPatchEvent(patches, [], origin, opTypes);
|
|
456
|
+
this.patchHandlers.forEach((h) => h(event));
|
|
457
|
+
this.changeHandlers.forEach((h) => h());
|
|
458
|
+
}
|
|
459
|
+
// ── Lifecycle ────────────────────────────────────────────────────────────────
|
|
460
|
+
async flush() {
|
|
461
|
+
await this.persistQueueModule?.flush();
|
|
462
|
+
}
|
|
463
|
+
dispose() {
|
|
464
|
+
this.previewSelectionUnsubscribe?.();
|
|
465
|
+
this.previewSelectionUnsubscribe = null;
|
|
466
|
+
this.persistQueueModule?.dispose();
|
|
467
|
+
this.historyModule?.dispose();
|
|
468
|
+
this.changeHandlers = [];
|
|
469
|
+
this.selectionHandlers = [];
|
|
470
|
+
this.patchHandlers = [];
|
|
471
|
+
this.errorHandlers = [];
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// ─── Public factory ───────────────────────────────────────────────────────────
|
|
475
|
+
/**
|
|
476
|
+
* Open a composition for editing.
|
|
477
|
+
*
|
|
478
|
+
* Standalone (T1/T2): supply persist adapter — SDK owns history + auto-save.
|
|
479
|
+
* Embedded (T3): supply overrides — SDK emits patches; host owns history + persistence.
|
|
480
|
+
* Headless (agents): omit both — SDK is a stateless transform + serializer.
|
|
481
|
+
*/
|
|
482
|
+
// fallow-ignore-next-line complexity
|
|
483
|
+
export async function openComposition(html, opts) {
|
|
484
|
+
// Single parse: parseMutable stamps hf-ids + builds the live linkedom DOM;
|
|
485
|
+
// the query API derives element snapshots from it lazily.
|
|
486
|
+
const parsed = parseMutable(html);
|
|
487
|
+
// T3 embedded: replay the stored override-set onto the base in one pass,
|
|
488
|
+
// so the session exposes the user's exact edited state — not the template.
|
|
489
|
+
if (opts?.overrides)
|
|
490
|
+
applyOverrideSet(parsed, opts.overrides);
|
|
491
|
+
const session = new CompositionImpl(parsed, opts ?? {});
|
|
492
|
+
const isEmbedded = opts?.overrides !== undefined;
|
|
493
|
+
if (!isEmbedded) {
|
|
494
|
+
// history:false opts out of the SDK undo stack ONLY. Persist (auto-save) is
|
|
495
|
+
// independent — gating it on the history flag too would silently drop every
|
|
496
|
+
// disk write for a caller that just wanted to disable undo (data loss).
|
|
497
|
+
if (opts?.history !== false) {
|
|
498
|
+
const history = createHistory(session, {
|
|
499
|
+
coalesceMs: opts?.coalesceMs ?? 300,
|
|
500
|
+
trackedOrigins: opts?.trackedOrigins,
|
|
501
|
+
});
|
|
502
|
+
session.attachHistory(history);
|
|
503
|
+
}
|
|
504
|
+
if (opts?.persist) {
|
|
505
|
+
const pq = createPersistQueue(session, opts.persist, {
|
|
506
|
+
path: opts.persistPath,
|
|
507
|
+
onError: (e) => session._fireError(e),
|
|
508
|
+
});
|
|
509
|
+
session.attachPersistQueue(pq);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return session;
|
|
513
|
+
}
|
|
514
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|