@laminapdf/viewer 0.2.0-alpha.4 → 0.2.0-alpha.6
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/README.md +79 -10
- package/dist/client.d.ts +60 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +241 -22
- package/dist/client.js.map +1 -1
- package/dist/edit/session.d.ts +91 -0
- package/dist/edit/session.d.ts.map +1 -0
- package/dist/edit/session.js +179 -0
- package/dist/edit/session.js.map +1 -0
- package/dist/edit-log.d.ts +32 -0
- package/dist/edit-log.d.ts.map +1 -0
- package/dist/edit-log.js +74 -0
- package/dist/edit-log.js.map +1 -0
- package/dist/find/controller.d.ts +6 -0
- package/dist/find/controller.d.ts.map +1 -1
- package/dist/find/controller.js +69 -2
- package/dist/find/controller.js.map +1 -1
- package/dist/first-draw.d.ts +10 -0
- package/dist/first-draw.d.ts.map +1 -0
- package/dist/first-draw.js +33 -0
- package/dist/first-draw.js.map +1 -0
- package/dist/history/history.d.ts +74 -0
- package/dist/history/history.d.ts.map +1 -0
- package/dist/history/history.js +135 -0
- package/dist/history/history.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/layers/copy.d.ts +26 -0
- package/dist/layers/copy.d.ts.map +1 -0
- package/dist/layers/copy.js +150 -0
- package/dist/layers/copy.js.map +1 -0
- package/dist/layers/link-layer.d.ts +101 -0
- package/dist/layers/link-layer.d.ts.map +1 -0
- package/dist/layers/link-layer.js +527 -0
- package/dist/layers/link-layer.js.map +1 -0
- package/dist/layers/link-preview.d.ts +77 -0
- package/dist/layers/link-preview.d.ts.map +1 -0
- package/dist/layers/link-preview.js +202 -0
- package/dist/layers/link-preview.js.map +1 -0
- package/dist/layers/link-url.d.ts +19 -0
- package/dist/layers/link-url.d.ts.map +1 -0
- package/dist/layers/link-url.js +47 -0
- package/dist/layers/link-url.js.map +1 -0
- package/dist/layers/spans.d.ts +0 -6
- package/dist/layers/spans.d.ts.map +1 -1
- package/dist/layers/spans.js +2 -20
- package/dist/layers/spans.js.map +1 -1
- package/dist/layers/structure-layer.d.ts.map +1 -1
- package/dist/layers/structure-layer.js +3 -0
- package/dist/layers/structure-layer.js.map +1 -1
- package/dist/layers/text-layer.d.ts +27 -6
- package/dist/layers/text-layer.d.ts.map +1 -1
- package/dist/layers/text-layer.js +310 -28
- package/dist/layers/text-layer.js.map +1 -1
- package/dist/layout/page-layout.d.ts +7 -0
- package/dist/layout/page-layout.d.ts.map +1 -1
- package/dist/layout/page-layout.js +15 -0
- package/dist/layout/page-layout.js.map +1 -1
- package/dist/protocol.d.ts +197 -5
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +33 -6
- package/dist/protocol.js.map +1 -1
- package/dist/source/opfs.d.ts +35 -0
- package/dist/source/opfs.d.ts.map +1 -0
- package/dist/source/opfs.js +178 -0
- package/dist/source/opfs.js.map +1 -0
- package/dist/thumbnails/strip.d.ts +1 -1
- package/dist/thumbnails/strip.d.ts.map +1 -1
- package/dist/thumbnails/strip.js +48 -4
- package/dist/thumbnails/strip.js.map +1 -1
- package/dist/view/previews.d.ts +47 -0
- package/dist/view/previews.d.ts.map +1 -0
- package/dist/view/previews.js +97 -0
- package/dist/view/previews.js.map +1 -0
- package/dist/view/user-select.d.ts +3 -0
- package/dist/view/user-select.d.ts.map +1 -0
- package/dist/view/user-select.js +10 -0
- package/dist/view/user-select.js.map +1 -0
- package/dist/view/viewer.d.ts +143 -5
- package/dist/view/viewer.d.ts.map +1 -1
- package/dist/view/viewer.js +590 -50
- package/dist/view/viewer.js.map +1 -1
- package/dist/worker/document.d.ts +66 -6
- package/dist/worker/document.d.ts.map +1 -1
- package/dist/worker/document.js +139 -23
- package/dist/worker/document.js.map +1 -1
- package/dist/worker/edit.d.ts +35 -0
- package/dist/worker/edit.d.ts.map +1 -0
- package/dist/worker/edit.js +305 -0
- package/dist/worker/edit.js.map +1 -0
- package/dist/worker/find.d.ts +2 -2
- package/dist/worker/find.d.ts.map +1 -1
- package/dist/worker/find.js +8 -21
- package/dist/worker/find.js.map +1 -1
- package/dist/worker/fingerprint.d.ts +10 -0
- package/dist/worker/fingerprint.d.ts.map +1 -0
- package/dist/worker/fingerprint.js +42 -0
- package/dist/worker/fingerprint.js.map +1 -0
- package/dist/worker/methods.d.ts.map +1 -1
- package/dist/worker/methods.js +42 -4
- package/dist/worker/methods.js.map +1 -1
- package/dist/worker/navigation.d.ts +5 -1
- package/dist/worker/navigation.d.ts.map +1 -1
- package/dist/worker/navigation.js +22 -4
- package/dist/worker/navigation.js.map +1 -1
- package/dist/worker/print.d.ts +14 -0
- package/dist/worker/print.d.ts.map +1 -0
- package/dist/worker/print.js +49 -0
- package/dist/worker/print.js.map +1 -0
- package/dist/worker/recent-pages.d.ts +16 -0
- package/dist/worker/recent-pages.d.ts.map +1 -0
- package/dist/worker/recent-pages.js +68 -0
- package/dist/worker/recent-pages.js.map +1 -0
- package/dist/worker/render.d.ts.map +1 -1
- package/dist/worker/render.js +5 -2
- package/dist/worker/render.js.map +1 -1
- package/dist/worker/session.d.ts +59 -0
- package/dist/worker/session.d.ts.map +1 -0
- package/dist/worker/session.js +152 -0
- package/dist/worker/session.js.map +1 -0
- package/dist/worker/text.d.ts +11 -3
- package/dist/worker/text.d.ts.map +1 -1
- package/dist/worker/text.js +33 -25
- package/dist/worker/text.js.map +1 -1
- package/package.json +9 -8
package/dist/worker/document.js
CHANGED
|
@@ -7,13 +7,28 @@
|
|
|
7
7
|
import { bytesSource, isRenderError, RenderError, } from "@laminapdf/render";
|
|
8
8
|
import { initHayro } from "@laminapdf/render-hayro";
|
|
9
9
|
import { initPdfium } from "@laminapdf/render-pdfium";
|
|
10
|
-
import { Document, isLaminaPdfError, loadExtract, wasmMemory } from "@laminapdf/sdk";
|
|
10
|
+
import { Document, isLaminaPdfError, loadExtract, wasmMemory, } from "@laminapdf/sdk";
|
|
11
11
|
import { emit, yieldToMessages } from "@laminapdf/sdk/worker/server";
|
|
12
12
|
import { HttpRangeByteSource } from "../source/http-range.js";
|
|
13
|
+
import { COPY_ABOVE, OpfsByteSource } from "../source/opfs.js";
|
|
13
14
|
import { blobSource, readAll } from "../source.js";
|
|
15
|
+
import { documentFingerprint, HEAD_BYTES } from "./fingerprint.js";
|
|
16
|
+
import { newSession } from "./session.js";
|
|
14
17
|
let backend;
|
|
15
18
|
/** Backends loaded or loading, by name; a failed load is forgotten, so the next call retries. */
|
|
16
19
|
const loading = new Map();
|
|
20
|
+
/** The edit state of a document just opened from `source`. */
|
|
21
|
+
function newEditState(source, renderLimits) {
|
|
22
|
+
return {
|
|
23
|
+
source,
|
|
24
|
+
renderLimits,
|
|
25
|
+
appended: [],
|
|
26
|
+
pending: [],
|
|
27
|
+
diverged: false,
|
|
28
|
+
session: newSession(),
|
|
29
|
+
queue: Promise.resolve(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
17
32
|
/**
|
|
18
33
|
* Rounds of fetching a call may need before it gives up with its last `data-pending`: the SDK's
|
|
19
34
|
* default for the same loop over Lamina PDF's reads (`Document.openRange`'s `maxRounds`).
|
|
@@ -38,12 +53,22 @@ export async function initBackend(init) {
|
|
|
38
53
|
}
|
|
39
54
|
const loaded = await pending;
|
|
40
55
|
backend = loaded;
|
|
41
|
-
|
|
42
|
-
|
|
56
|
+
return { name: loaded.name, version: loaded.version };
|
|
57
|
+
}
|
|
58
|
+
/** Whether a render has started the extract module's load (once per worker). */
|
|
59
|
+
let warmed = false;
|
|
60
|
+
/**
|
|
61
|
+
* Starts the text layer's module once a page has been drawn (render.ts calls it after each
|
|
62
|
+
* render; only the first call starts anything). Before that its download would compete with the
|
|
63
|
+
* document's bytes and the backend for the first page; text asked for earlier loads it at once.
|
|
64
|
+
*/
|
|
65
|
+
export function warmExtract() {
|
|
66
|
+
if (warmed)
|
|
67
|
+
return;
|
|
68
|
+
warmed = true;
|
|
43
69
|
void extractModule().catch(() => {
|
|
44
|
-
// Tried
|
|
70
|
+
// Tried once here; text asked for later tries again, never another render.
|
|
45
71
|
});
|
|
46
|
-
return { name: loaded.name, version: loaded.version };
|
|
47
72
|
}
|
|
48
73
|
/** The extract module's load, started after the backend's. */
|
|
49
74
|
let extract;
|
|
@@ -76,26 +101,71 @@ export async function textModel(signal) {
|
|
|
76
101
|
if (opened.reopen === undefined)
|
|
77
102
|
return opened.model;
|
|
78
103
|
const { bytes, options } = opened.reopen;
|
|
104
|
+
const ranged = opened.remote ?? opened.local;
|
|
105
|
+
if (bytes === undefined && ranged === undefined)
|
|
106
|
+
return opened.model;
|
|
79
107
|
// One copy for every caller, opened with no caller's signal: a page that scrolls away aborts
|
|
80
108
|
// its own wait, never the copy the other pages and the structure tree wait for.
|
|
81
109
|
opened.text = (async () => {
|
|
82
110
|
await extractModule();
|
|
83
111
|
const { model } = bytes !== undefined
|
|
84
112
|
? await openModel((o) => Document.open(bytes, o), options)
|
|
85
|
-
: await openModel((o) => Document.openRange(
|
|
113
|
+
: await openModel((o) => Document.openRange(ranged, o), options);
|
|
86
114
|
if (!model.canExtractText) {
|
|
87
115
|
model.free();
|
|
88
116
|
throw new RenderError("render-failed", "the extract module didn't load");
|
|
89
117
|
}
|
|
90
118
|
// The copy is open: the password and bytes it needed are no longer kept.
|
|
91
119
|
opened.reopen = undefined;
|
|
120
|
+
// It opened from the file as it was: the edits made since then come next.
|
|
121
|
+
await replayEdits(opened, model);
|
|
92
122
|
return model;
|
|
93
123
|
})();
|
|
94
124
|
opened.text.catch(() => {
|
|
95
125
|
opened.text = undefined;
|
|
126
|
+
dropUnfollowable(opened);
|
|
96
127
|
});
|
|
97
128
|
return untilAborted(opened.text, signal);
|
|
98
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* Passes an edit, undo or redo the model committed to the text-capable copy (edit.ts calls it
|
|
132
|
+
* after each). The model reads its text itself when it can, and then nothing is kept. A copy still
|
|
133
|
+
* opening makes them once open; each call waits for the one before, so none is made twice.
|
|
134
|
+
*/
|
|
135
|
+
export function followEdit(opened, action) {
|
|
136
|
+
if (opened.text === undefined && opened.reopen === undefined)
|
|
137
|
+
return;
|
|
138
|
+
opened.edit.pending.push(action);
|
|
139
|
+
const text = opened.text;
|
|
140
|
+
if (text === undefined)
|
|
141
|
+
return;
|
|
142
|
+
const synced = text.then(async (copy) => {
|
|
143
|
+
await replayEdits(opened, copy);
|
|
144
|
+
return copy;
|
|
145
|
+
});
|
|
146
|
+
opened.text = synced;
|
|
147
|
+
synced.catch(() => {
|
|
148
|
+
// A copy that can't follow the edits would show the old text: it goes, and text calls then
|
|
149
|
+
// answer `extract-module-not-loaded` from the model.
|
|
150
|
+
if (opened.text === synced)
|
|
151
|
+
opened.text = undefined;
|
|
152
|
+
dropUnfollowable(opened);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/** With no copy open and none that can open (`reopen` is gone), nothing will apply the pending edits. */
|
|
156
|
+
function dropUnfollowable(opened) {
|
|
157
|
+
if (opened.text === undefined && opened.reopen === undefined)
|
|
158
|
+
opened.edit.pending.length = 0;
|
|
159
|
+
}
|
|
160
|
+
/** Makes in `copy` the edits, undos and redos it hasn't made yet, as the model did. */
|
|
161
|
+
async function replayEdits(opened, copy) {
|
|
162
|
+
const { pending } = opened.edit;
|
|
163
|
+
for (let action = pending[0]; action !== undefined; action = pending[0]) {
|
|
164
|
+
const next = action;
|
|
165
|
+
await copy.ensure(() => (next === "undo" ? copy.undo() : next === "redo" ? copy.redo() : copy.apply(next)));
|
|
166
|
+
pending.shift();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
99
169
|
/**
|
|
100
170
|
* What a text-capable copy of `model` would open from: nothing for a document that can already
|
|
101
171
|
* give its text, since the options hold the password and are kept only while needed.
|
|
@@ -112,7 +182,7 @@ function untilAborted(promise, signal) {
|
|
|
112
182
|
promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", abort));
|
|
113
183
|
});
|
|
114
184
|
}
|
|
115
|
-
function currentBackend() {
|
|
185
|
+
export function currentBackend() {
|
|
116
186
|
// Only a viewer bug gets here (the client loads the backend before anything else), so it stays
|
|
117
187
|
// an Error: the worker reports it as worker-failed, kind internal.
|
|
118
188
|
if (backend === undefined)
|
|
@@ -124,6 +194,7 @@ function closeOpen() {
|
|
|
124
194
|
return;
|
|
125
195
|
open.render.close();
|
|
126
196
|
open.model.free();
|
|
197
|
+
open.local?.close();
|
|
127
198
|
// A text-capable copy goes with it, once opened (a failed one has nothing to free).
|
|
128
199
|
open.text?.then((copy) => copy.free(), () => { });
|
|
129
200
|
open = undefined;
|
|
@@ -183,30 +254,61 @@ async function openModel(open, options) {
|
|
|
183
254
|
return { model: await open({ ...withLimits, password }), needsPassword: true };
|
|
184
255
|
}
|
|
185
256
|
}
|
|
186
|
-
/**
|
|
187
|
-
|
|
188
|
-
const engine = currentBackend();
|
|
189
|
-
let remote;
|
|
190
|
-
let bytes;
|
|
257
|
+
/** Where `init`'s bytes will be read from. */
|
|
258
|
+
async function bytesFor(init, options, signal) {
|
|
191
259
|
if (isRemote(init)) {
|
|
192
|
-
remote = await HttpRangeByteSource.open(init.url, { signal, onProgress: (p) => emit("progress", p) });
|
|
260
|
+
const remote = await HttpRangeByteSource.open(init.url, { signal, onProgress: (p) => emit("progress", p) });
|
|
193
261
|
// A server without range support sent the whole file: read it as a local one.
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
262
|
+
return remote.whole === undefined ? { kind: "remote", source: remote } : { kind: "memory", bytes: remote.whole };
|
|
263
|
+
}
|
|
264
|
+
// A large file is read from its OPFS copy where the browser can keep one, else from memory.
|
|
265
|
+
if (init instanceof File && init.size > (options.copyAbove ?? COPY_ABOVE)) {
|
|
266
|
+
const copy = await OpfsByteSource.open(init, {
|
|
267
|
+
signal,
|
|
268
|
+
onProgress: (loaded, total) => emit("progress", { loaded, total }),
|
|
269
|
+
keep: options.keepCopy ?? true,
|
|
270
|
+
});
|
|
271
|
+
if (copy !== undefined)
|
|
272
|
+
return { kind: "copy", source: copy };
|
|
273
|
+
}
|
|
274
|
+
return { kind: "memory", bytes: await bytesOf(init, signal) };
|
|
275
|
+
}
|
|
276
|
+
/** Opens the worker's document (closing any previous one) and reports its warnings as events. */
|
|
277
|
+
export async function openDocument(init, options, signal, ticket) {
|
|
278
|
+
const engine = currentBackend();
|
|
279
|
+
const from = await bytesFor(init, options, signal);
|
|
280
|
+
try {
|
|
281
|
+
const document = await openFrom(engine, from, options, signal);
|
|
282
|
+
if (open !== undefined)
|
|
283
|
+
open.answer = { document, ticket };
|
|
284
|
+
return document;
|
|
197
285
|
}
|
|
198
|
-
|
|
199
|
-
|
|
286
|
+
catch (e) {
|
|
287
|
+
if (from.kind === "copy")
|
|
288
|
+
from.source.close();
|
|
289
|
+
throw e;
|
|
200
290
|
}
|
|
291
|
+
}
|
|
292
|
+
/** The fingerprint of the file `from` holds, from its first {@link HEAD_BYTES}. */
|
|
293
|
+
async function fingerprintOf(from, signal) {
|
|
294
|
+
if (from.kind === "memory")
|
|
295
|
+
return documentFingerprint(from.bytes.subarray(0, HEAD_BYTES));
|
|
296
|
+
const head = await from.source.read(0, Math.min(from.source.size, HEAD_BYTES), { signal });
|
|
297
|
+
return documentFingerprint(head);
|
|
298
|
+
}
|
|
299
|
+
/** Opens Lamina PDF's document and the backend's over `from`. */
|
|
300
|
+
async function openFrom(engine, from, options, signal) {
|
|
201
301
|
const { password, renderLimits } = options;
|
|
202
|
-
const { model, needsPassword } =
|
|
203
|
-
? await openModel((o) => Document.open(bytes, o), options)
|
|
204
|
-
: await openModel((o) => Document.openRange(
|
|
302
|
+
const { model, needsPassword } = from.kind === "memory"
|
|
303
|
+
? await openModel((o) => Document.open(from.bytes, o), options)
|
|
304
|
+
: await openModel((o) => Document.openRange(from.source, { ...o, signal }), options);
|
|
305
|
+
const remote = from.kind === "remote" ? from.source : undefined;
|
|
205
306
|
let render;
|
|
206
307
|
let pages;
|
|
207
308
|
let title;
|
|
309
|
+
const source = from.kind === "memory" ? bytesSource(from.bytes) : from.source;
|
|
310
|
+
let fingerprint;
|
|
208
311
|
try {
|
|
209
|
-
const source = remote ?? bytesSource(bytes);
|
|
210
312
|
const renderOptions = {
|
|
211
313
|
...(password === undefined ? {} : { password }),
|
|
212
314
|
...(renderLimits === undefined ? {} : { limits: renderLimits }),
|
|
@@ -215,6 +317,9 @@ export async function openDocument(init, options, signal) {
|
|
|
215
317
|
try {
|
|
216
318
|
pages = await model.ensure(() => model.pages, { signal });
|
|
217
319
|
title = (await model.ensure(() => model.info, { signal })).title?.trim();
|
|
320
|
+
// Only reading positions need it: without one (no Web Crypto in an insecure context, a failed
|
|
321
|
+
// read of the head) the document opens all the same, at page 1.
|
|
322
|
+
fingerprint = await fingerprintOf(from, signal).catch(() => undefined);
|
|
218
323
|
}
|
|
219
324
|
catch (e) {
|
|
220
325
|
render.close();
|
|
@@ -240,8 +345,10 @@ export async function openDocument(init, options, signal) {
|
|
|
240
345
|
id: nextDocument++,
|
|
241
346
|
model,
|
|
242
347
|
render,
|
|
348
|
+
edit: newEditState(source, renderLimits),
|
|
243
349
|
remote,
|
|
244
|
-
|
|
350
|
+
local: from.kind === "copy" ? from.source : undefined,
|
|
351
|
+
reopen: reopenFor(model, from.kind === "memory" ? from.bytes : undefined, options),
|
|
245
352
|
};
|
|
246
353
|
// ADR 0003 warnings (a repaired xref, a dropped object) for the UI.
|
|
247
354
|
for (const warning of model.warnings)
|
|
@@ -251,6 +358,8 @@ export async function openDocument(init, options, signal) {
|
|
|
251
358
|
pages,
|
|
252
359
|
id: open.id,
|
|
253
360
|
needsPassword,
|
|
361
|
+
encrypted: model.isEncrypted,
|
|
362
|
+
...(fingerprint === undefined ? {} : { fingerprint }),
|
|
254
363
|
backend: { name: engine.name, version: engine.version },
|
|
255
364
|
...(title === undefined || title === "" ? {} : { title }),
|
|
256
365
|
};
|
|
@@ -260,6 +369,13 @@ export function workerMemory() {
|
|
|
260
369
|
const sdk = Object.values(wasmMemory()).reduce((sum, bytes) => sum + bytes, 0);
|
|
261
370
|
return { backend: backend?.memory() ?? 0, sdk };
|
|
262
371
|
}
|
|
372
|
+
/**
|
|
373
|
+
* The open document's answer and the page's number for the open that made it: after a cancelled
|
|
374
|
+
* open, the page asks, since the cancel can cross an open this worker had already committed.
|
|
375
|
+
*/
|
|
376
|
+
export function currentDocument() {
|
|
377
|
+
return open?.answer;
|
|
378
|
+
}
|
|
263
379
|
export function closeDocument() {
|
|
264
380
|
closeOpen();
|
|
265
381
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/worker/document.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/worker/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Op } from "@laminapdf/sdk";
|
|
2
|
+
import type { EditHistory, EditResult, ReplayedStep } from "../protocol.js";
|
|
3
|
+
/** The edit session's history of document `id`. */
|
|
4
|
+
export declare function editHistory(id: number): EditHistory;
|
|
5
|
+
/**
|
|
6
|
+
* Applies `ops` to document `id`'s model as one transaction; when it touched pages, writes the
|
|
7
|
+
* edit and draws those pages from it from now on. The edit session records it as a step named
|
|
8
|
+
* `label`; an edit that changed nothing records none.
|
|
9
|
+
*
|
|
10
|
+
* @throws the op's error (nothing changed); a save or reopen error, after the transaction is
|
|
11
|
+
* undone, so the model again matches what is drawn; an error saying the document must be opened
|
|
12
|
+
* again when that undo failed too, and for every edit after it; an encrypted document's refusal.
|
|
13
|
+
*/
|
|
14
|
+
export declare function applyEdit(ops: readonly Op[], id: number, signal: AbortSignal, label?: string): Promise<EditResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Undoes or redoes steps of document `id`'s edit session until `position` of them are done, then
|
|
17
|
+
* draws the pages they touched, once. A move that fails half way is taken back, so the document,
|
|
18
|
+
* the history and the pages drawn stay together.
|
|
19
|
+
*/
|
|
20
|
+
export declare function goToStep(position: number, id: number, signal: AbortSignal): Promise<EditResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Undoes (`delta` -1) or redoes (+1) one step of document `id`'s edit session, reading where it
|
|
23
|
+
* stands only once the calls before it are done.
|
|
24
|
+
*/
|
|
25
|
+
export declare function stepEdit(delta: -1 | 1, id: number, signal: AbortSignal): Promise<EditResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Applies `steps` to document `id` again, one transaction each, then undoes the newest `undone`
|
|
28
|
+
* of them, and draws once: a restarted worker's document takes back the edits the old one had.
|
|
29
|
+
* The history keeps their labels and times.
|
|
30
|
+
*
|
|
31
|
+
* @throws an op's error, or a save or reopen error: the document is then marked diverged, since
|
|
32
|
+
* the edits applied so far can't all be taken back (the depth limit may have dropped some).
|
|
33
|
+
*/
|
|
34
|
+
export declare function restoreEdits(steps: readonly ReplayedStep[], undone: number, id: number, signal: AbortSignal): Promise<EditResult>;
|
|
35
|
+
//# sourceMappingURL=edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/worker/edit.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAY,EAAE,EAAsB,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAgB,MAAM,gBAAgB,CAAC;AAuB1F,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAGnD;AAQD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,SAAS,EAAE,EAAE,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,EACnB,KAAK,SAAgB,GACpB,OAAO,CAAC,UAAU,CAAC,CAErB;AAkCD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAE/F;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAG5F;AAgED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC,CAErB"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
// Edits on screen (E1 plan §6). PDFium draws the pages from the bytes it opened, so an edit to
|
|
2
|
+
// Lamina PDF's model reaches the screen as bytes: after a transaction that touched pages, the
|
|
3
|
+
// model saves incrementally into memory (only the appended revision; the model rebases onto the
|
|
4
|
+
// file with it) and the backend opens the file with every revision appended so far. The new render
|
|
5
|
+
// document replaces the old one only once it is open, so a failure leaves the pages drawn as they
|
|
6
|
+
// were. The worker runs one call at a time, so no render runs while the documents are swapped: a
|
|
7
|
+
// render answered before this call drew the old file, one answered after it draws the new one.
|
|
8
|
+
import { current, currentBackend, filling, followEdit } from "./document.js";
|
|
9
|
+
import { forgetSearch } from "./find.js";
|
|
10
|
+
import { forgetLinks } from "./navigation.js";
|
|
11
|
+
import { clearRedo, historyOf, record, removeStep, restore, snapshot, stepBack, walkTo, } from "./session.js";
|
|
12
|
+
import { forgetText } from "./text.js";
|
|
13
|
+
/** Why an edit that failed left the model and the pages drawn apart: the document must be opened again. */
|
|
14
|
+
const DIVERGED = "an edit failed and couldn't be undone: the document and the pages drawn may differ; open it again";
|
|
15
|
+
/** Why an encrypted document takes no edit: its edits can't be written into memory to be drawn. */
|
|
16
|
+
const ENCRYPTED = "an encrypted document can't be edited yet: its edits can't be saved (encrypted-base)";
|
|
17
|
+
/** The edit session's history of document `id`. */
|
|
18
|
+
export function editHistory(id) {
|
|
19
|
+
const { edit } = current(id);
|
|
20
|
+
return historyOf(edit.session, edit.diverged);
|
|
21
|
+
}
|
|
22
|
+
/** Throws why document `opened` can't take an edit, undo or redo now, if it can't. */
|
|
23
|
+
function editable(opened) {
|
|
24
|
+
if (opened.edit.diverged)
|
|
25
|
+
throw new Error(DIVERGED);
|
|
26
|
+
if (opened.model.isEncrypted)
|
|
27
|
+
throw new Error(ENCRYPTED);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Applies `ops` to document `id`'s model as one transaction; when it touched pages, writes the
|
|
31
|
+
* edit and draws those pages from it from now on. The edit session records it as a step named
|
|
32
|
+
* `label`; an edit that changed nothing records none.
|
|
33
|
+
*
|
|
34
|
+
* @throws the op's error (nothing changed); a save or reopen error, after the transaction is
|
|
35
|
+
* undone, so the model again matches what is drawn; an error saying the document must be opened
|
|
36
|
+
* again when that undo failed too, and for every edit after it; an encrypted document's refusal.
|
|
37
|
+
*/
|
|
38
|
+
export function applyEdit(ops, id, signal, label = describe(ops)) {
|
|
39
|
+
return serial(current(id), () => apply(ops, id, signal, label));
|
|
40
|
+
}
|
|
41
|
+
async function apply(ops, id, signal, label) {
|
|
42
|
+
const opened = current(id);
|
|
43
|
+
editable(opened);
|
|
44
|
+
const { model, edit } = opened;
|
|
45
|
+
const count = await model.ensure(() => model.pageCount, { signal });
|
|
46
|
+
const edited = await model.ensure(() => model.apply(ops), { signal });
|
|
47
|
+
if (!edited.changed)
|
|
48
|
+
return { pages: [], history: historyOf(edit.session, false) };
|
|
49
|
+
// The transaction cleared the model's redo stack, whatever happens next.
|
|
50
|
+
clearRedo(edit.session);
|
|
51
|
+
if (edited.touchedPages.length > 0) {
|
|
52
|
+
try {
|
|
53
|
+
await samePages(model, count);
|
|
54
|
+
await redraw(opened);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
// The edit never reached the screen: take it back out of the model, so the model matches
|
|
58
|
+
// what is drawn. The undone transaction is left on the model's redo stack, but the session
|
|
59
|
+
// has no step for it, so nothing redoes it, and the next edit clears it.
|
|
60
|
+
await revert(model, edit, "undo", e);
|
|
61
|
+
throw e;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
followEdit(opened, ops);
|
|
65
|
+
const pages = await touched(opened, edited.touchedPages);
|
|
66
|
+
record(edit.session, label, pages.map((page) => page.index), Date.now());
|
|
67
|
+
return { pages, history: historyOf(edit.session, false) };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Undoes or redoes steps of document `id`'s edit session until `position` of them are done, then
|
|
71
|
+
* draws the pages they touched, once. A move that fails half way is taken back, so the document,
|
|
72
|
+
* the history and the pages drawn stay together.
|
|
73
|
+
*/
|
|
74
|
+
export function goToStep(position, id, signal) {
|
|
75
|
+
return serial(current(id), () => moveTo(() => position, id, signal));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Undoes (`delta` -1) or redoes (+1) one step of document `id`'s edit session, reading where it
|
|
79
|
+
* stands only once the calls before it are done.
|
|
80
|
+
*/
|
|
81
|
+
export function stepEdit(delta, id, signal) {
|
|
82
|
+
const opened = current(id);
|
|
83
|
+
return serial(opened, () => moveTo(() => opened.edit.session.position + delta, id, signal));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Runs `call` after document `opened`'s edit calls before it have settled: the worker serves
|
|
87
|
+
* calls as they come, and an edit's awaits would otherwise let another start against the history
|
|
88
|
+
* it is changing.
|
|
89
|
+
*/
|
|
90
|
+
function serial(opened, call) {
|
|
91
|
+
const run = opened.edit.queue.then(call);
|
|
92
|
+
opened.edit.queue = run.catch(() => undefined);
|
|
93
|
+
return run;
|
|
94
|
+
}
|
|
95
|
+
async function moveTo(position, id, signal) {
|
|
96
|
+
const opened = current(id);
|
|
97
|
+
editable(opened);
|
|
98
|
+
const { model, edit } = opened;
|
|
99
|
+
const { session } = edit;
|
|
100
|
+
const kept = snapshot(session);
|
|
101
|
+
const done = [];
|
|
102
|
+
const ids = new Set();
|
|
103
|
+
try {
|
|
104
|
+
await walkTo(session, position(), async (way) => {
|
|
105
|
+
const reverted = await model.ensure(() => (way === "undo" ? model.undo() : model.redo()), { signal });
|
|
106
|
+
// The model has no entry where the session has a step: they disagree, which only a bug does.
|
|
107
|
+
if (reverted === undefined)
|
|
108
|
+
throw new Error(`the document has nothing to ${way}`);
|
|
109
|
+
for (const page of reverted.touchedPages)
|
|
110
|
+
ids.add(page);
|
|
111
|
+
followEdit(opened, way);
|
|
112
|
+
return reverted.outcome;
|
|
113
|
+
}, done);
|
|
114
|
+
if (ids.size > 0)
|
|
115
|
+
await redraw(opened);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
await takeBack(opened, kept, done, e);
|
|
119
|
+
throw e;
|
|
120
|
+
}
|
|
121
|
+
const pages = await touched(opened, [...ids]);
|
|
122
|
+
return { pages, history: historyOf(session, false), reverted: done };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Takes back the undos and redos in `done`, newest first, and puts the history back as `kept`
|
|
126
|
+
* was, less the steps the model dropped (a skipped undo or redo leaves it no entry).
|
|
127
|
+
*/
|
|
128
|
+
async function takeBack(opened, kept, done, failure) {
|
|
129
|
+
const { model, edit } = opened;
|
|
130
|
+
for (const step of [...done].reverse()) {
|
|
131
|
+
if (step.outcome === "skipped")
|
|
132
|
+
continue;
|
|
133
|
+
await revert(model, edit, step.way === "undo" ? "redo" : "undo", failure);
|
|
134
|
+
followEdit(opened, step.way === "undo" ? "redo" : "undo");
|
|
135
|
+
}
|
|
136
|
+
const { session } = edit;
|
|
137
|
+
restore(session, kept);
|
|
138
|
+
for (const step of done) {
|
|
139
|
+
if (step.outcome !== "skipped")
|
|
140
|
+
continue;
|
|
141
|
+
const index = session.steps.findIndex((s) => s.id === step.step.id);
|
|
142
|
+
if (index >= 0)
|
|
143
|
+
removeStep(session, index, step.way);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Applies `steps` to document `id` again, one transaction each, then undoes the newest `undone`
|
|
148
|
+
* of them, and draws once: a restarted worker's document takes back the edits the old one had.
|
|
149
|
+
* The history keeps their labels and times.
|
|
150
|
+
*
|
|
151
|
+
* @throws an op's error, or a save or reopen error: the document is then marked diverged, since
|
|
152
|
+
* the edits applied so far can't all be taken back (the depth limit may have dropped some).
|
|
153
|
+
*/
|
|
154
|
+
export function restoreEdits(steps, undone, id, signal) {
|
|
155
|
+
return serial(current(id), () => replay(steps, undone, id, signal));
|
|
156
|
+
}
|
|
157
|
+
async function replay(steps, undone, id, signal) {
|
|
158
|
+
const opened = current(id);
|
|
159
|
+
editable(opened);
|
|
160
|
+
const { model, edit } = opened;
|
|
161
|
+
const ids = new Set();
|
|
162
|
+
try {
|
|
163
|
+
const count = await model.ensure(() => model.pageCount, { signal });
|
|
164
|
+
for (const step of steps) {
|
|
165
|
+
const edited = await model.ensure(() => model.apply(step.ops), { signal });
|
|
166
|
+
if (!edited.changed)
|
|
167
|
+
continue;
|
|
168
|
+
for (const page of edited.touchedPages)
|
|
169
|
+
ids.add(page);
|
|
170
|
+
followEdit(opened, step.ops);
|
|
171
|
+
const pages = await model.ensure(() => model.pages);
|
|
172
|
+
const wanted = new Set(edited.touchedPages);
|
|
173
|
+
const indices = pages.filter((page) => wanted.has(page.id)).map((page) => page.index);
|
|
174
|
+
record(edit.session, step.label, indices, step.at);
|
|
175
|
+
}
|
|
176
|
+
for (let i = 0; i < undone && edit.session.position > 0; i++) {
|
|
177
|
+
const reverted = await model.ensure(() => model.undo(), { signal });
|
|
178
|
+
if (reverted === undefined)
|
|
179
|
+
break;
|
|
180
|
+
stepBack(edit.session, reverted.outcome);
|
|
181
|
+
followEdit(opened, "undo");
|
|
182
|
+
}
|
|
183
|
+
await samePages(model, count);
|
|
184
|
+
if (ids.size > 0)
|
|
185
|
+
await redraw(opened);
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
edit.diverged = true;
|
|
189
|
+
throw new Error(DIVERGED, { cause: e });
|
|
190
|
+
}
|
|
191
|
+
// The file reopened as it was: the saved document is the one opened.
|
|
192
|
+
edit.session.saved = 0;
|
|
193
|
+
return { pages: await touched(opened, [...ids]), history: historyOf(edit.session, false) };
|
|
194
|
+
}
|
|
195
|
+
/** A label for an edit whose caller gave none: its ops' names. */
|
|
196
|
+
function describe(ops) {
|
|
197
|
+
return ops.map((op) => op.op).join(", ");
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Refuses an edit that added, removed or moved pages: the view finds pages by index, and
|
|
201
|
+
* `EditResult` names pages by their indices after the edit.
|
|
202
|
+
*/
|
|
203
|
+
async function samePages(model, before) {
|
|
204
|
+
const after = await model.ensure(() => model.pageCount);
|
|
205
|
+
if (after !== before)
|
|
206
|
+
throw new Error(`an edit that changes the page count (${before} → ${after}) can't be shown yet`);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Undoes (or redoes) the transaction just applied (or undone); when that fails too, marks the
|
|
210
|
+
* document diverged.
|
|
211
|
+
*/
|
|
212
|
+
async function revert(model, edit, way, failure) {
|
|
213
|
+
let reverted;
|
|
214
|
+
try {
|
|
215
|
+
reverted = await model.ensure(() => (way === "undo" ? model.undo() : model.redo()));
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
edit.diverged = true;
|
|
219
|
+
throw new Error(DIVERGED, { cause: [failure, e] });
|
|
220
|
+
}
|
|
221
|
+
// A partial outcome still restored what it could; only nothing at all leaves them apart.
|
|
222
|
+
if (reverted === undefined || reverted.outcome === "skipped") {
|
|
223
|
+
edit.diverged = true;
|
|
224
|
+
throw new Error(DIVERGED, { cause: failure });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** The pages with these IDs, as they are now, in index order; what the worker kept of them is forgotten. */
|
|
228
|
+
async function touched(opened, ids) {
|
|
229
|
+
if (ids.length === 0)
|
|
230
|
+
return [];
|
|
231
|
+
const wanted = new Set(ids);
|
|
232
|
+
const { model } = opened;
|
|
233
|
+
const pages = (await model.ensure(() => model.pages)).filter((page) => wanted.has(page.id));
|
|
234
|
+
const indices = pages.map((page) => page.index);
|
|
235
|
+
forgetText(indices);
|
|
236
|
+
forgetSearch(indices);
|
|
237
|
+
forgetLinks(indices);
|
|
238
|
+
return pages;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Saves the model's changes into memory and swaps in a render document opened from the result.
|
|
242
|
+
* The old one keeps drawing until the new one is open, and is closed after.
|
|
243
|
+
*/
|
|
244
|
+
async function redraw(opened) {
|
|
245
|
+
const { model, edit } = opened;
|
|
246
|
+
// Only the appended revision: the model rebases onto the old file with it, copying nothing.
|
|
247
|
+
const { bytes } = await model.ensure(() => model.saveWithReport({ mode: "incremental", output: "appendedOnly" }));
|
|
248
|
+
// Kept even if the reopen below fails: the model's file now ends with this revision, and the
|
|
249
|
+
// next save appends to it. Each edit adds one revision, and one more section to the chain of
|
|
250
|
+
// cross-reference sections PDFium reads on open; compacting them is the edit session's to decide.
|
|
251
|
+
edit.appended.push(bytes);
|
|
252
|
+
const source = joined([edit.source, ...edit.appended.map(bytesSource)]);
|
|
253
|
+
const options = edit.renderLimits === undefined ? {} : { limits: edit.renderLimits };
|
|
254
|
+
// Not the caller's signal: the model is already saved, so the reopen finishes either way.
|
|
255
|
+
const next = await filling(opened.remote, () => currentBackend().open(source, options), new AbortController().signal);
|
|
256
|
+
const old = opened.render;
|
|
257
|
+
opened.render = next;
|
|
258
|
+
old.close();
|
|
259
|
+
}
|
|
260
|
+
function bytesSource(bytes) {
|
|
261
|
+
return { size: bytes.length, readSync: (offset, length) => bytes.subarray(offset, offset + length) };
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* `parts` one after another, read in place: the file and the revisions appended to it, never
|
|
265
|
+
* copied into one buffer. A part that answers `undefined` (a remote file's bytes not fetched yet)
|
|
266
|
+
* makes the read answer `undefined`, which `filling` fetches.
|
|
267
|
+
*/
|
|
268
|
+
function joined(parts) {
|
|
269
|
+
const starts = [];
|
|
270
|
+
let size = 0;
|
|
271
|
+
for (const part of parts) {
|
|
272
|
+
starts.push(size);
|
|
273
|
+
size += part.size;
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
size,
|
|
277
|
+
readSync(offset, length) {
|
|
278
|
+
const end = Math.min(size, offset + length);
|
|
279
|
+
const pieces = [];
|
|
280
|
+
for (let i = 0; i < parts.length; i++) {
|
|
281
|
+
const start = starts[i];
|
|
282
|
+
const part = parts[i];
|
|
283
|
+
const from = Math.max(offset, start);
|
|
284
|
+
const to = Math.min(end, start + part.size);
|
|
285
|
+
if (from >= to)
|
|
286
|
+
continue;
|
|
287
|
+
const piece = part.readSync(from - start, to - from);
|
|
288
|
+
if (piece === undefined)
|
|
289
|
+
return undefined;
|
|
290
|
+
pieces.push(piece);
|
|
291
|
+
}
|
|
292
|
+
return pieces.length === 1 ? pieces[0] : concat(pieces);
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
function concat(pieces) {
|
|
297
|
+
const out = new Uint8Array(pieces.reduce((sum, piece) => sum + piece.length, 0));
|
|
298
|
+
let at = 0;
|
|
299
|
+
for (const piece of pieces) {
|
|
300
|
+
out.set(piece, at);
|
|
301
|
+
at += piece.length;
|
|
302
|
+
}
|
|
303
|
+
return out;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=edit.js.map
|