@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.
Files changed (127) hide show
  1. package/README.md +79 -10
  2. package/dist/client.d.ts +60 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +241 -22
  5. package/dist/client.js.map +1 -1
  6. package/dist/edit/session.d.ts +91 -0
  7. package/dist/edit/session.d.ts.map +1 -0
  8. package/dist/edit/session.js +179 -0
  9. package/dist/edit/session.js.map +1 -0
  10. package/dist/edit-log.d.ts +32 -0
  11. package/dist/edit-log.d.ts.map +1 -0
  12. package/dist/edit-log.js +74 -0
  13. package/dist/edit-log.js.map +1 -0
  14. package/dist/find/controller.d.ts +6 -0
  15. package/dist/find/controller.d.ts.map +1 -1
  16. package/dist/find/controller.js +69 -2
  17. package/dist/find/controller.js.map +1 -1
  18. package/dist/first-draw.d.ts +10 -0
  19. package/dist/first-draw.d.ts.map +1 -0
  20. package/dist/first-draw.js +33 -0
  21. package/dist/first-draw.js.map +1 -0
  22. package/dist/history/history.d.ts +74 -0
  23. package/dist/history/history.d.ts.map +1 -0
  24. package/dist/history/history.js +135 -0
  25. package/dist/history/history.js.map +1 -0
  26. package/dist/index.d.ts +11 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/layers/copy.d.ts +26 -0
  31. package/dist/layers/copy.d.ts.map +1 -0
  32. package/dist/layers/copy.js +150 -0
  33. package/dist/layers/copy.js.map +1 -0
  34. package/dist/layers/link-layer.d.ts +101 -0
  35. package/dist/layers/link-layer.d.ts.map +1 -0
  36. package/dist/layers/link-layer.js +527 -0
  37. package/dist/layers/link-layer.js.map +1 -0
  38. package/dist/layers/link-preview.d.ts +77 -0
  39. package/dist/layers/link-preview.d.ts.map +1 -0
  40. package/dist/layers/link-preview.js +202 -0
  41. package/dist/layers/link-preview.js.map +1 -0
  42. package/dist/layers/link-url.d.ts +19 -0
  43. package/dist/layers/link-url.d.ts.map +1 -0
  44. package/dist/layers/link-url.js +47 -0
  45. package/dist/layers/link-url.js.map +1 -0
  46. package/dist/layers/spans.d.ts +0 -6
  47. package/dist/layers/spans.d.ts.map +1 -1
  48. package/dist/layers/spans.js +2 -20
  49. package/dist/layers/spans.js.map +1 -1
  50. package/dist/layers/structure-layer.d.ts.map +1 -1
  51. package/dist/layers/structure-layer.js +3 -0
  52. package/dist/layers/structure-layer.js.map +1 -1
  53. package/dist/layers/text-layer.d.ts +27 -6
  54. package/dist/layers/text-layer.d.ts.map +1 -1
  55. package/dist/layers/text-layer.js +310 -28
  56. package/dist/layers/text-layer.js.map +1 -1
  57. package/dist/layout/page-layout.d.ts +7 -0
  58. package/dist/layout/page-layout.d.ts.map +1 -1
  59. package/dist/layout/page-layout.js +15 -0
  60. package/dist/layout/page-layout.js.map +1 -1
  61. package/dist/protocol.d.ts +197 -5
  62. package/dist/protocol.d.ts.map +1 -1
  63. package/dist/protocol.js +33 -6
  64. package/dist/protocol.js.map +1 -1
  65. package/dist/source/opfs.d.ts +35 -0
  66. package/dist/source/opfs.d.ts.map +1 -0
  67. package/dist/source/opfs.js +178 -0
  68. package/dist/source/opfs.js.map +1 -0
  69. package/dist/thumbnails/strip.d.ts +1 -1
  70. package/dist/thumbnails/strip.d.ts.map +1 -1
  71. package/dist/thumbnails/strip.js +48 -4
  72. package/dist/thumbnails/strip.js.map +1 -1
  73. package/dist/view/previews.d.ts +47 -0
  74. package/dist/view/previews.d.ts.map +1 -0
  75. package/dist/view/previews.js +97 -0
  76. package/dist/view/previews.js.map +1 -0
  77. package/dist/view/user-select.d.ts +3 -0
  78. package/dist/view/user-select.d.ts.map +1 -0
  79. package/dist/view/user-select.js +10 -0
  80. package/dist/view/user-select.js.map +1 -0
  81. package/dist/view/viewer.d.ts +143 -5
  82. package/dist/view/viewer.d.ts.map +1 -1
  83. package/dist/view/viewer.js +590 -50
  84. package/dist/view/viewer.js.map +1 -1
  85. package/dist/worker/document.d.ts +66 -6
  86. package/dist/worker/document.d.ts.map +1 -1
  87. package/dist/worker/document.js +139 -23
  88. package/dist/worker/document.js.map +1 -1
  89. package/dist/worker/edit.d.ts +35 -0
  90. package/dist/worker/edit.d.ts.map +1 -0
  91. package/dist/worker/edit.js +305 -0
  92. package/dist/worker/edit.js.map +1 -0
  93. package/dist/worker/find.d.ts +2 -2
  94. package/dist/worker/find.d.ts.map +1 -1
  95. package/dist/worker/find.js +8 -21
  96. package/dist/worker/find.js.map +1 -1
  97. package/dist/worker/fingerprint.d.ts +10 -0
  98. package/dist/worker/fingerprint.d.ts.map +1 -0
  99. package/dist/worker/fingerprint.js +42 -0
  100. package/dist/worker/fingerprint.js.map +1 -0
  101. package/dist/worker/methods.d.ts.map +1 -1
  102. package/dist/worker/methods.js +42 -4
  103. package/dist/worker/methods.js.map +1 -1
  104. package/dist/worker/navigation.d.ts +5 -1
  105. package/dist/worker/navigation.d.ts.map +1 -1
  106. package/dist/worker/navigation.js +22 -4
  107. package/dist/worker/navigation.js.map +1 -1
  108. package/dist/worker/print.d.ts +14 -0
  109. package/dist/worker/print.d.ts.map +1 -0
  110. package/dist/worker/print.js +49 -0
  111. package/dist/worker/print.js.map +1 -0
  112. package/dist/worker/recent-pages.d.ts +16 -0
  113. package/dist/worker/recent-pages.d.ts.map +1 -0
  114. package/dist/worker/recent-pages.js +68 -0
  115. package/dist/worker/recent-pages.js.map +1 -0
  116. package/dist/worker/render.d.ts.map +1 -1
  117. package/dist/worker/render.js +5 -2
  118. package/dist/worker/render.js.map +1 -1
  119. package/dist/worker/session.d.ts +59 -0
  120. package/dist/worker/session.d.ts.map +1 -0
  121. package/dist/worker/session.js +152 -0
  122. package/dist/worker/session.js.map +1 -0
  123. package/dist/worker/text.d.ts +11 -3
  124. package/dist/worker/text.d.ts.map +1 -1
  125. package/dist/worker/text.js +33 -25
  126. package/dist/worker/text.js.map +1 -1
  127. package/package.json +9 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/worker/edit.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,6 @@ import type { FindOptions } from "../find/fold.js";
2
2
  import type { FindPageResult } from "../protocol.js";
3
3
  /** The matches of `query` on each of `pages`, in that order. */
4
4
  export declare function find(query: string, options: FindOptions, pages: readonly number[], signal: AbortSignal): Promise<FindPageResult[]>;
5
- /** Forgets every page's searchable text: the document closed. */
6
- export declare function forgetSearch(): void;
5
+ /** Forgets `pages`' searchable text (an edit changed them), or every page's (the document closed). */
6
+ export declare function forgetSearch(pages?: Iterable<number>): void;
7
7
  //# sourceMappingURL=find.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/worker/find.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAgCrD,gEAAgE;AAChE,wBAAsB,IAAI,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CAkB3B;AAED,iEAAiE;AACjE,wBAAgB,YAAY,IAAI,IAAI,CAGnC"}
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/worker/find.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAoBrD,gEAAgE;AAChE,wBAAsB,IAAI,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CAkB3B;AAED,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAE3D"}
@@ -5,31 +5,19 @@
5
5
  // longer query searches pages already read without reading their text again; a page's glyphs are
6
6
  // read again only where it has matches.
7
7
  import { matchRanges, quadsOfMatches, searchText, snippetOf } from "../find/page.js";
8
- import { current } from "./document.js";
8
+ import { RecentPages } from "./recent-pages.js";
9
9
  import { pageGlyphs } from "./text.js";
10
10
  /** The cache's budget, in bytes of UTF-16 text and glyph maps. */
11
11
  const SEARCH_CACHE_BYTES = 32 * 1024 * 1024;
12
- const cache = new Map();
13
- let cacheBytes = 0;
14
12
  const bytesOf = (s) => s.text.length * 2 + s.lo.byteLength + s.hi.byteLength + s.runOf.byteLength;
13
+ const cache = new RecentPages(SEARCH_CACHE_BYTES, bytesOf);
15
14
  /** Page `index`'s searchable text, cached by document and page. */
16
15
  async function searchable(index, signal) {
17
- const key = `${current().id}:${index}`;
18
- const hit = cache.get(key);
19
- if (hit !== undefined) {
20
- cache.delete(key);
21
- cache.set(key, hit);
16
+ const hit = cache.get(index);
17
+ if (hit !== undefined)
22
18
  return hit;
23
- }
24
19
  const search = searchText(await pageGlyphs(index, signal, false));
25
- cache.set(key, search);
26
- cacheBytes += bytesOf(search);
27
- for (const [old, value] of cache) {
28
- if (cacheBytes <= SEARCH_CACHE_BYTES)
29
- break;
30
- cache.delete(old);
31
- cacheBytes -= bytesOf(value);
32
- }
20
+ cache.set(index, search);
33
21
  return search;
34
22
  }
35
23
  /** The matches of `query` on each of `pages`, in that order. */
@@ -51,9 +39,8 @@ export async function find(query, options, pages, signal) {
51
39
  }
52
40
  return out;
53
41
  }
54
- /** Forgets every page's searchable text: the document closed. */
55
- export function forgetSearch() {
56
- cache.clear();
57
- cacheBytes = 0;
42
+ /** Forgets `pages`' searchable text (an edit changed them), or every page's (the document closed). */
43
+ export function forgetSearch(pages) {
44
+ cache.forget(pages);
58
45
  }
59
46
  //# sourceMappingURL=find.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/worker/find.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/worker/find.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,6FAA6F;AAC7F,+FAA+F;AAC/F,+FAA+F;AAC/F,iGAAiG;AACjG,wCAAwC;AAGxC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAmB,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEtG,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,kEAAkE;AAClE,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,OAAO,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;AAE9G,MAAM,KAAK,GAAG,IAAI,WAAW,CAAa,kBAAkB,EAAE,OAAO,CAAC,CAAC;AAEvE,mEAAmE;AACnE,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,MAAmB;IAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAClE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,KAAa,EACb,OAAoB,EACpB,KAAwB,EACxB,MAAmB;IAEnB,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACxC,oFAAoF;QACpF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,KAAK,GACT,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3G,GAAG,CAAC,IAAI,CAAC;YACP,IAAI;YACJ,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACzD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** How much of the file's start is read: the first revision's end is looked for in it. */
2
+ export declare const HEAD_BYTES: number;
3
+ /** The bytes the fingerprint covers: `head` through the end of its first `%%EOF`, else all of it. */
4
+ export declare function fingerprintedBytes(head: Uint8Array): Uint8Array;
5
+ /**
6
+ * The fingerprint of a file whose first bytes are `head` (its first {@link HEAD_BYTES}, or the
7
+ * whole file when it is smaller): `"fp1:"` and a SHA-256 in hex.
8
+ */
9
+ export declare function documentFingerprint(head: Uint8Array): Promise<string>;
10
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/worker/fingerprint.ts"],"names":[],"mappings":"AAMA,0FAA0F;AAC1F,eAAO,MAAM,UAAU,QAAY,CAAC;AAWpC,qGAAqG;AACrG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAG/D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3E"}
@@ -0,0 +1,42 @@
1
+ // A document's fingerprint, the key its reading position is kept under: a hash of the file's head,
2
+ // up to the end of its first revision. An incremental update appends to the file (ISO 32000-2
3
+ // §7.5.6) and leaves the head alone, so a file reopens at its place after someone adds a note or
4
+ // a signature; a full rewrite changes the head, so its output starts without one. `/ID[0]` stays
5
+ // out of it: a file without one gains one on its first save, which would change the key.
6
+ /** How much of the file's start is read: the first revision's end is looked for in it. */
7
+ export const HEAD_BYTES = 64 * 1024;
8
+ /** The fingerprint's version, so a later scheme can live beside this one. */
9
+ const PREFIX = "fp1:";
10
+ /** What the hash starts with: the scheme's name and a zero byte. */
11
+ const TAG = new TextEncoder().encode("laminapdf.fp/1\0");
12
+ /** `%%EOF`, the marker that ends a revision (§7.5.5). */
13
+ const EOF_MARKER = new TextEncoder().encode("%%EOF");
14
+ /** The bytes the fingerprint covers: `head` through the end of its first `%%EOF`, else all of it. */
15
+ export function fingerprintedBytes(head) {
16
+ const at = indexOf(head, EOF_MARKER);
17
+ return at < 0 ? head : head.subarray(0, at + EOF_MARKER.length);
18
+ }
19
+ /**
20
+ * The fingerprint of a file whose first bytes are `head` (its first {@link HEAD_BYTES}, or the
21
+ * whole file when it is smaller): `"fp1:"` and a SHA-256 in hex.
22
+ */
23
+ export async function documentFingerprint(head) {
24
+ const covered = fingerprintedBytes(head.subarray(0, HEAD_BYTES));
25
+ const input = new Uint8Array(TAG.length + covered.length);
26
+ input.set(TAG);
27
+ input.set(covered, TAG.length);
28
+ const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", input));
29
+ return PREFIX + Array.from(digest, (b) => b.toString(16).padStart(2, "0")).join("");
30
+ }
31
+ /** Where `needle` first starts in `bytes`, or −1. */
32
+ function indexOf(bytes, needle) {
33
+ for (let i = 0; i + needle.length <= bytes.length; i++) {
34
+ let j = 0;
35
+ while (j < needle.length && bytes[i + j] === needle[j])
36
+ j++;
37
+ if (j === needle.length)
38
+ return i;
39
+ }
40
+ return -1;
41
+ }
42
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/worker/fingerprint.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,8FAA8F;AAC9F,iGAAiG;AACjG,iGAAiG;AACjG,yFAAyF;AAEzF,0FAA0F;AAC1F,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpC,6EAA6E;AAC7E,MAAM,MAAM,GAAG,MAAM,CAAC;AAEtB,oEAAoE;AACpE,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAEzD,yDAAyD;AACzD,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAErD,qGAAqG;AACrG,MAAM,UAAU,kBAAkB,CAAC,IAAgB;IACjD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAgB;IACxD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5E,OAAO,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,qDAAqD;AACrD,SAAS,OAAO,CAAC,KAAiB,EAAE,MAAkB;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;YAAE,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../../src/worker/methods.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAUpE,2EAA2E;AAC3E,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAmCnE,CAAC"}
1
+ {"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../../src/worker/methods.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAoBpE,2EAA2E;AAC3E,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CA0EnE,CAAC"}
@@ -1,24 +1,46 @@
1
1
  // The viewer's methods on the document worker: the extension `entry.ts` serves, and test
2
2
  // workers too, which add their own hooks on top so none ships.
3
- import { closeDocument, current, initBackend, openDocument, workerMemory } from "./document.js";
3
+ import { closeDocument, current, currentDocument, initBackend, openDocument, textModel, workerMemory, } from "./document.js";
4
+ import { applyEdit, editHistory, goToStep, restoreEdits, stepEdit } from "./edit.js";
4
5
  import { find, forgetSearch } from "./find.js";
5
- import { namedDestination, outline } from "./navigation.js";
6
+ import { forgetLinks, namedDestination, outline, pageLinks } from "./navigation.js";
6
7
  import { networkLog } from "./network.js";
8
+ import { fileBytes, printPage, replyBytes } from "./print.js";
7
9
  import { render, reply } from "./render.js";
8
- import { forgetText, pageText, replyText, structure } from "./text.js";
10
+ import { forgetText, pageText, readingOrder, reflow, replyText, structure } from "./text.js";
9
11
  /** The viewer's worker methods, by name (see `Methods` in protocol.ts). */
10
12
  export const viewerMethods = {
11
13
  initBackend: { run: ([init]) => initBackend(init) },
12
14
  openDocument: {
13
- run: ([source, options], { signal }) => openDocument(source, options, signal),
15
+ run: ([source, options, ticket], { signal }) => openDocument(source, options, signal, ticket),
14
16
  },
17
+ currentDocument: { run: () => currentDocument() },
15
18
  closeDocument: {
16
19
  run: () => {
17
20
  forgetText();
18
21
  forgetSearch();
22
+ forgetLinks();
19
23
  return closeDocument();
20
24
  },
21
25
  },
26
+ applyEdit: {
27
+ run: ([ops, id, label], { signal }) => applyEdit(ops, id, signal, label),
28
+ },
29
+ undoEdit: {
30
+ run: ([id], { signal }) => stepEdit(-1, id, signal),
31
+ },
32
+ redoEdit: {
33
+ run: ([id], { signal }) => stepEdit(1, id, signal),
34
+ },
35
+ goToStep: {
36
+ run: ([position, id], { signal }) => goToStep(position, id, signal),
37
+ },
38
+ editHistory: {
39
+ run: ([id]) => editHistory(id),
40
+ },
41
+ restoreEdits: {
42
+ run: ([steps, undone, id], { signal }) => restoreEdits(steps, undone, id, signal),
43
+ },
22
44
  pageInfo: {
23
45
  run: ([index], { signal }) => {
24
46
  const { model } = current();
@@ -36,10 +58,26 @@ export const viewerMethods = {
36
58
  reply: (text) => replyText(text),
37
59
  },
38
60
  structure: { run: (_params, { signal }) => structure(signal) },
61
+ reflow: { run: (_params, { signal }) => reflow(signal) },
62
+ readingOrder: { run: ([index], { signal }) => readingOrder(index, signal) },
39
63
  find: {
40
64
  run: ([query, options, pages], { signal }) => find(query, options, pages, signal),
41
65
  },
42
66
  outline: { run: (_params, { signal }) => outline(signal) },
43
67
  namedDestination: { run: ([name], { signal }) => namedDestination(name, signal) },
68
+ pageLinks: { run: ([index], { signal }) => pageLinks(index, signal) },
69
+ properties: {
70
+ run: async (_params, { signal }) => {
71
+ const model = await textModel(signal);
72
+ return model.ensure(() => model.properties(), { signal });
73
+ },
74
+ },
75
+ printPage: {
76
+ run: ([index, options], { signal }) => printPage(index, options, signal),
77
+ },
78
+ fileBytes: {
79
+ run: (_params, { signal }) => fileBytes(signal),
80
+ reply: (bytes) => replyBytes(bytes),
81
+ },
44
82
  };
45
83
  //# sourceMappingURL=methods.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"methods.js","sourceRoot":"","sources":["../../src/worker/methods.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"methods.js","sourceRoot":"","sources":["../../src/worker/methods.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
- import type { OutlineNode, Target } from "@laminapdf/sdk";
1
+ import type { OutlineNode, PageLink, Target } from "@laminapdf/sdk";
2
2
  /** The outline's top-level items, each with its children; empty without one. */
3
3
  export declare function outline(signal: AbortSignal): Promise<OutlineNode[]>;
4
4
  /** Where the named destination `name` goes, or `undefined` when the document has no such name. */
5
5
  export declare function namedDestination(name: string, signal: AbortSignal): Promise<Target | undefined>;
6
+ /** Page `index`'s links, in annotation order (cached). */
7
+ export declare function pageLinks(index: number, signal: AbortSignal): Promise<readonly PageLink[]>;
8
+ /** Forgets `pages`' links (an edit changed them), or every page's (the document closed). */
9
+ export declare function forgetLinks(pages?: Iterable<number>): void;
6
10
  //# sourceMappingURL=navigation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/worker/navigation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG1D,gFAAgF;AAChF,wBAAsB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGzE;AAED,kGAAkG;AAClG,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAGrG"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/worker/navigation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAOpE,gFAAgF;AAChF,wBAAsB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGzE;AAED,kGAAkG;AAClG,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAGrG;AAED,0DAA0D;AAC1D,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAOhG;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAE1D"}
@@ -1,8 +1,12 @@
1
- // Moving through the open document: its outline and named destinations, read by Lamina PDF in the
2
- // worker (the extract module, which the text layer loads too), each target a page and a view in
3
- // page space. The outline is read when a reader first asks for it, since it can hold thousands of
4
- // items.
1
+ // Moving through the open document: its outline, named destinations and each page's links, read
2
+ // by Lamina PDF in the worker (the extract module, which the text layer loads too), each target a
3
+ // page and a view in page space. The outline is read when a reader first asks for it, since it can
4
+ // hold thousands of items. The last pages' links are kept, since a page scrolled back into view
5
+ // asks again.
5
6
  import { textModel } from "./document.js";
7
+ import { CACHED_PAGES, RecentPages } from "./recent-pages.js";
8
+ /** The last pages' links. */
9
+ const links = new RecentPages(CACHED_PAGES);
6
10
  /** The outline's top-level items, each with its children; empty without one. */
7
11
  export async function outline(signal) {
8
12
  const model = await textModel(signal);
@@ -13,4 +17,18 @@ export async function namedDestination(name, signal) {
13
17
  const model = await textModel(signal);
14
18
  return model.ensure(() => model.namedDestination(name), { signal });
15
19
  }
20
+ /** Page `index`'s links, in annotation order (cached). */
21
+ export async function pageLinks(index, signal) {
22
+ const cached = links.get(index);
23
+ if (cached !== undefined)
24
+ return cached;
25
+ const model = await textModel(signal);
26
+ const read = await model.ensure(() => model.pageLinks(index), { signal });
27
+ links.set(index, read);
28
+ return read;
29
+ }
30
+ /** Forgets `pages`' links (an edit changed them), or every page's (the document closed). */
31
+ export function forgetLinks(pages) {
32
+ links.forget(pages);
33
+ }
16
34
  //# sourceMappingURL=navigation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/worker/navigation.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,gGAAgG;AAChG,kGAAkG;AAClG,SAAS;AAGT,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAmB;IACtE,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/worker/navigation.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,kGAAkG;AAClG,mGAAmG;AACnG,gGAAgG;AAChG,cAAc;AAGd,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE9D,6BAA6B;AAC7B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAsB,YAAY,CAAC,CAAC;AAEjE,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAmB;IACtE,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,MAAmB;IAChE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1E,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,KAAwB;IAClD,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { PrintedPage, PrintOptions } from "../protocol.js";
2
+ /**
3
+ * Page `index` drawn for printing at `options.dpi` (lowered when the page would pass
4
+ * MAX_PRINT_PIXELS; `dpi` says what it was drawn at), as a PNG.
5
+ */
6
+ export declare function printPage(index: number, options: PrintOptions, signal: AbortSignal): Promise<PrintedPage>;
7
+ /**
8
+ * Every byte of the open file as it was opened: a remote file's from its block cache and its
9
+ * host, unchanged. A local file's bytes stay where the page has them.
10
+ */
11
+ export declare function fileBytes(signal: AbortSignal): Promise<Uint8Array>;
12
+ /** One caller's answer: its own copy of the bytes, transferred. */
13
+ export declare function replyBytes(bytes: Uint8Array): [Uint8Array, Transferable[]];
14
+ //# sourceMappingURL=print.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../../src/worker/print.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOhE;;;GAGG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAmB/G;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAIlE;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAG1E"}
@@ -0,0 +1,49 @@
1
+ // Printing in the document worker (R09): a page drawn at print resolution with the print
2
+ // intent (annotations as their print flags say), encoded as PNG here, so the page that prints
3
+ // it only ever holds one small file per page, never its pixels. One page per call, so the
4
+ // pixels of the page before are released before the next is drawn.
5
+ import { readAll } from "../source.js";
6
+ import { current, filling } from "./document.js";
7
+ /** The most pixels one printed page holds: about 16 million, a 300 dpi page of 11 × 17 inches. */
8
+ const MAX_PRINT_PIXELS = 16_000_000;
9
+ /**
10
+ * Page `index` drawn for printing at `options.dpi` (lowered when the page would pass
11
+ * MAX_PRINT_PIXELS; `dpi` says what it was drawn at), as a PNG.
12
+ */
13
+ export async function printPage(index, options, signal) {
14
+ const doc = current();
15
+ const page = doc.render.page(index);
16
+ const wanted = options.dpi / 72;
17
+ const area = page.width * page.height;
18
+ const scale = Math.min(wanted, Math.sqrt(MAX_PRINT_PIXELS / Math.max(1, area)));
19
+ const request = {
20
+ page: index,
21
+ scale,
22
+ flags: { annotations: options.annotations, formWidgets: options.annotations, print: true, grayscale: false },
23
+ };
24
+ const tile = await filling(doc.remote, () => doc.render.render(request, { signal }), signal);
25
+ signal.throwIfAborted();
26
+ const canvas = new OffscreenCanvas(tile.width, tile.height);
27
+ const context = canvas.getContext("2d");
28
+ if (context === null)
29
+ throw new Error("no 2D context for printing");
30
+ context.putImageData(new ImageData(tile.pixels, tile.width, tile.height), 0, 0);
31
+ const image = await canvas.convertToBlob({ type: "image/png" });
32
+ return { image, width: page.width, height: page.height, dpi: Math.round(scale * 72) };
33
+ }
34
+ /**
35
+ * Every byte of the open file as it was opened: a remote file's from its block cache and its
36
+ * host, unchanged. A local file's bytes stay where the page has them.
37
+ */
38
+ export function fileBytes(signal) {
39
+ const { remote } = current();
40
+ if (remote === undefined)
41
+ return Promise.reject(new Error("the open file isn't remote: read it where it was opened"));
42
+ return remote.whole === undefined ? readAll(remote, signal) : Promise.resolve(remote.whole);
43
+ }
44
+ /** One caller's answer: its own copy of the bytes, transferred. */
45
+ export function replyBytes(bytes) {
46
+ const copy = bytes.slice();
47
+ return [copy, [copy.buffer]];
48
+ }
49
+ //# sourceMappingURL=print.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print.js","sourceRoot":"","sources":["../../src/worker/print.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** How many pages' text and links stay cached (a screenful of pages and the margin, at most zoom). */
2
+ export declare const CACHED_PAGES = 24;
3
+ /** A cache of the pages read last, of the open document and those before it. */
4
+ export declare class RecentPages<T> {
5
+ #private;
6
+ constructor(budget: number, weigh?: (value: T) => number);
7
+ /** Page `index` of the open document, now the newest; `undefined` when it isn't kept. */
8
+ get(index: number): T | undefined;
9
+ /** Keeps `value` for page `index` of the open document, letting the oldest go over the budget. */
10
+ set(index: number, value: T): void;
11
+ /** Forgets `pages` of the open document (an edit changed them), or every page (the document closed). */
12
+ forget(pages?: Iterable<number>): void;
13
+ /** Forgets every page: the document closed. */
14
+ clear(): void;
15
+ }
16
+ //# sourceMappingURL=recent-pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent-pages.d.ts","sourceRoot":"","sources":["../../src/worker/recent-pages.ts"],"names":[],"mappings":"AAOA,sGAAsG;AACtG,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B,gFAAgF;AAChF,qBAAa,WAAW,CAAC,CAAC;;IAMxB,YAAY,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAgB,EAGhE;IAED,yFAAyF;IACzF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQhC;IAED,kGAAkG;IAClG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAYjC;IAED,wGAAwG;IACxG,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAYrC;IAED,+CAA+C;IAC/C,KAAK,IAAI,IAAI,CAGZ;CAKF"}
@@ -0,0 +1,68 @@
1
+ // What the document Web Worker keeps of the pages it read last: a page's text, its searchable
2
+ // text, its links. Entries are keyed by document and page, so another document never reads one's
3
+ // pages; reading one makes it the newest, and the oldest go first once the entries weigh more than
4
+ // the budget (a count of pages, unless `weigh` gives each its size).
5
+ import { current } from "./document.js";
6
+ /** How many pages' text and links stay cached (a screenful of pages and the margin, at most zoom). */
7
+ export const CACHED_PAGES = 24;
8
+ /** A cache of the pages read last, of the open document and those before it. */
9
+ export class RecentPages {
10
+ #entries = new Map();
11
+ #budget;
12
+ #weigh;
13
+ #weight = 0;
14
+ constructor(budget, weigh = () => 1) {
15
+ this.#budget = budget;
16
+ this.#weigh = weigh;
17
+ }
18
+ /** Page `index` of the open document, now the newest; `undefined` when it isn't kept. */
19
+ get(index) {
20
+ const key = this.#key(index);
21
+ const value = this.#entries.get(key);
22
+ if (value !== undefined) {
23
+ this.#entries.delete(key);
24
+ this.#entries.set(key, value);
25
+ }
26
+ return value;
27
+ }
28
+ /** Keeps `value` for page `index` of the open document, letting the oldest go over the budget. */
29
+ set(index, value) {
30
+ const key = this.#key(index);
31
+ const old = this.#entries.get(key);
32
+ if (old !== undefined)
33
+ this.#weight -= this.#weigh(old);
34
+ this.#entries.delete(key);
35
+ this.#entries.set(key, value);
36
+ this.#weight += this.#weigh(value);
37
+ for (const [oldest, kept] of this.#entries) {
38
+ if (this.#weight <= this.#budget)
39
+ break;
40
+ this.#entries.delete(oldest);
41
+ this.#weight -= this.#weigh(kept);
42
+ }
43
+ }
44
+ /** Forgets `pages` of the open document (an edit changed them), or every page (the document closed). */
45
+ forget(pages) {
46
+ if (pages === undefined) {
47
+ this.clear();
48
+ return;
49
+ }
50
+ for (const index of pages) {
51
+ const key = this.#key(index);
52
+ const old = this.#entries.get(key);
53
+ if (old === undefined)
54
+ continue;
55
+ this.#entries.delete(key);
56
+ this.#weight -= this.#weigh(old);
57
+ }
58
+ }
59
+ /** Forgets every page: the document closed. */
60
+ clear() {
61
+ this.#entries.clear();
62
+ this.#weight = 0;
63
+ }
64
+ #key(index) {
65
+ return `${current().id}:${index}`;
66
+ }
67
+ }
68
+ //# sourceMappingURL=recent-pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent-pages.js","sourceRoot":"","sources":["../../src/worker/recent-pages.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/worker/render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,KAAK,cAAc,EAAa,MAAM,gBAAgB,CAAC;AAGhE;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAUrG;AAED,qCAAqC;AACrC,wBAAsB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC,CAKzF"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/worker/render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,KAAK,cAAc,EAAa,MAAM,gBAAgB,CAAC;AAGhE;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAarG;AAED,qCAAqC;AACrC,wBAAsB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC,CAKzF"}
@@ -3,7 +3,7 @@
3
3
  // coalesced render is drawn once; each caller gets its own bitmap of the same pixels.
4
4
  import { emit } from "@laminapdf/sdk/worker/server";
5
5
  import { renderKey } from "../protocol.js";
6
- import { current, filling } from "./document.js";
6
+ import { current, filling, warmExtract } from "./document.js";
7
7
  /**
8
8
  * Renders `request` on document `id` (a render queued for a document since replaced is
9
9
  * `disposed`). A remote document's render fetches the bytes it meets missing and draws again.
@@ -17,7 +17,10 @@ export function render(request, id, signal) {
17
17
  emit("render-start", { page: request.page, scale: request.scale, key });
18
18
  return doc.render.render(request, { signal });
19
19
  };
20
- return filling(doc.remote, draw, signal, () => emit("render-fetching", { key }));
20
+ const tile = filling(doc.remote, draw, signal, () => emit("render-fetching", { key }));
21
+ // A page is on screen: the text layer's module may load now without delaying it.
22
+ void tile.then(warmExtract, () => undefined);
23
+ return tile;
21
24
  }
22
25
  /** One caller's bitmap of `tile`. */
23
26
  export async function reply(tile) {
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/worker/render.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,yFAAyF;AACzF,sFAAsF;AAGtF,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AACpD,OAAO,EAAuB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,OAAsB,EAAE,EAAU,EAAE,MAAmB;IAC5E,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACxB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,kFAAkF;QAClF,yDAAyD;QACzD,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACxE,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAkB;IAC5C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvC,6FAA6F;IAC7F,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/worker/render.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,yFAAyF;AACzF,sFAAsF;AAGtF,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AACpD,OAAO,EAAuB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,OAAsB,EAAE,EAAU,EAAE,MAAmB;IAC5E,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACxB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,kFAAkF;QAClF,yDAAyD;QACzD,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACxE,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACvF,iFAAiF;IACjF,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAkB;IAC5C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvC,6FAA6F;IAC7F,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { type EditHistory, type EditStep, type RevertedStep } from "../protocol.js";
2
+ /** One document's history. */
3
+ export interface Session {
4
+ /** The steps kept, oldest first. */
5
+ readonly steps: EditStep[];
6
+ /** How many of `steps` are done. */
7
+ position: number;
8
+ /** How many of the oldest steps the depth limit dropped. */
9
+ dropped: number;
10
+ /** The absolute position of the last save (0: the file as opened); undefined once it is on no path from here. */
11
+ saved: number | undefined;
12
+ /** The next step's ID. */
13
+ nextId: number;
14
+ /** The most steps kept. */
15
+ readonly depth: number;
16
+ }
17
+ /** An empty history for a document just opened, keeping `depth` steps. */
18
+ export declare function newSession(depth?: number): Session;
19
+ /** What the interface reads of `session`. */
20
+ export declare function historyOf(session: Session, diverged: boolean): EditHistory;
21
+ /**
22
+ * Forgets the steps undone: a new transaction cleared the model's redo stack. A save among them
23
+ * can no longer be reached.
24
+ */
25
+ export declare function clearRedo(session: Session): void;
26
+ /** Records a transaction the model committed: the steps undone go, and the oldest past the depth. */
27
+ export declare function record(session: Session, label: string, pages: readonly number[], time: number): EditStep;
28
+ /** How the model's undo or redo of one step went. */
29
+ export type Outcome = RevertedStep["outcome"];
30
+ /**
31
+ * Moves back over the newest done step, which the model just undid with `outcome`. A skipped
32
+ * undo restored nothing and left no redo entry: the step goes, and the document stays where it
33
+ * was, after it.
34
+ */
35
+ export declare function stepBack(session: Session, outcome: Outcome): RevertedStep;
36
+ /**
37
+ * Moves forward over the oldest undone step, which the model just redid with `outcome`. A skipped
38
+ * redo left no undo entry: the step goes, and the document stays where it was, before it.
39
+ */
40
+ export declare function stepForward(session: Session, outcome: Outcome): RevertedStep;
41
+ /**
42
+ * Takes out step `index`, which the model no longer has. Its two states become one: after it for
43
+ * an undo that restored nothing, before it for such a redo; the other can't be reached.
44
+ */
45
+ export declare function removeStep(session: Session, index: number, way: "undo" | "redo"): void;
46
+ /**
47
+ * Undoes or redoes steps until `target` of them are done, calling `revert` for each move (which
48
+ * makes it in the model and says how it went); `done` collects each move as it is made, so a
49
+ * caller can take them back when one fails. A skipped redo takes its step out without moving the
50
+ * position, so the target, among the steps after it, is one lower.
51
+ */
52
+ export declare function walkTo(session: Session, target: number, revert: (way: "undo" | "redo") => Promise<Outcome>, done: RevertedStep[]): Promise<void>;
53
+ /** Records the document now as the one saved, for a save that writes the file. */
54
+ export declare function markSaved(session: Session): void;
55
+ /** A copy of `session` to go back to when a move fails half way. */
56
+ export declare function snapshot(session: Session): Session;
57
+ /** Puts `session` back as `kept` was. */
58
+ export declare function restore(session: Session, kept: Session): void;
59
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/worker/session.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAiB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnG,8BAA8B;AAC9B,MAAM,WAAW,OAAO;IACtB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3B,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,iHAAiH;IACjH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,KAAK,SAAgB,GAAG,OAAO,CAEzD;AAKD,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,WAAW,CAQ1E;AAWD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAGhD;AAED,qGAAqG;AACrG,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAWxG;AAED,qDAAqD;AACrD,MAAM,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,YAAY,CAWzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,YAAY,CAU5E;AAUD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAStF;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAClD,IAAI,EAAE,YAAY,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEhD;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAElD;AAED,yCAAyC;AACzC,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAO7D"}