@laminapdf/viewer 0.2.0-alpha.2 → 0.2.0-alpha.4

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 (113) hide show
  1. package/README.md +107 -7
  2. package/dist/client.d.ts +51 -3
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +94 -30
  5. package/dist/client.js.map +1 -1
  6. package/dist/find/controller.d.ts +73 -0
  7. package/dist/find/controller.d.ts.map +1 -0
  8. package/dist/find/controller.js +227 -0
  9. package/dist/find/controller.js.map +1 -0
  10. package/dist/find/fold.d.ts +23 -0
  11. package/dist/find/fold.d.ts.map +1 -0
  12. package/dist/find/fold.js +99 -0
  13. package/dist/find/fold.js.map +1 -0
  14. package/dist/find/page.d.ts +44 -0
  15. package/dist/find/page.d.ts.map +1 -0
  16. package/dist/find/page.js +173 -0
  17. package/dist/find/page.js.map +1 -0
  18. package/dist/index.d.ts +7 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +2 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/layers/box.d.ts +10 -0
  23. package/dist/layers/box.d.ts.map +1 -0
  24. package/dist/layers/box.js +19 -0
  25. package/dist/layers/box.js.map +1 -0
  26. package/dist/layers/highlight-layer.d.ts +31 -0
  27. package/dist/layers/highlight-layer.d.ts.map +1 -0
  28. package/dist/layers/highlight-layer.js +95 -0
  29. package/dist/layers/highlight-layer.js.map +1 -0
  30. package/dist/layers/spans.d.ts +42 -0
  31. package/dist/layers/spans.d.ts.map +1 -0
  32. package/dist/layers/spans.js +121 -0
  33. package/dist/layers/spans.js.map +1 -0
  34. package/dist/layers/structure-layer.d.ts +15 -0
  35. package/dist/layers/structure-layer.d.ts.map +1 -0
  36. package/dist/layers/structure-layer.js +152 -0
  37. package/dist/layers/structure-layer.js.map +1 -0
  38. package/dist/layers/text-layer.d.ts +53 -0
  39. package/dist/layers/text-layer.d.ts.map +1 -0
  40. package/dist/layers/text-layer.js +292 -0
  41. package/dist/layers/text-layer.js.map +1 -0
  42. package/dist/layout/range.d.ts +3 -0
  43. package/dist/layout/range.d.ts.map +1 -0
  44. package/dist/layout/range.js +5 -0
  45. package/dist/layout/range.js.map +1 -0
  46. package/dist/network/watch.d.ts +30 -0
  47. package/dist/network/watch.d.ts.map +1 -0
  48. package/dist/network/watch.js +181 -0
  49. package/dist/network/watch.js.map +1 -0
  50. package/dist/protocol.d.ts +127 -2
  51. package/dist/protocol.d.ts.map +1 -1
  52. package/dist/protocol.js +2 -2
  53. package/dist/protocol.js.map +1 -1
  54. package/dist/render/tiles.d.ts +43 -3
  55. package/dist/render/tiles.d.ts.map +1 -1
  56. package/dist/render/tiles.js +62 -10
  57. package/dist/render/tiles.js.map +1 -1
  58. package/dist/source/http-range.d.ts +59 -0
  59. package/dist/source/http-range.d.ts.map +1 -0
  60. package/dist/source/http-range.js +284 -0
  61. package/dist/source/http-range.js.map +1 -0
  62. package/dist/thumbnails/strip.d.ts +37 -0
  63. package/dist/thumbnails/strip.d.ts.map +1 -0
  64. package/dist/thumbnails/strip.js +313 -0
  65. package/dist/thumbnails/strip.js.map +1 -0
  66. package/dist/view/budgets.d.ts +29 -0
  67. package/dist/view/budgets.d.ts.map +1 -0
  68. package/dist/view/budgets.js +63 -0
  69. package/dist/view/budgets.js.map +1 -0
  70. package/dist/view/touch.d.ts +71 -0
  71. package/dist/view/touch.d.ts.map +1 -0
  72. package/dist/view/touch.js +220 -0
  73. package/dist/view/touch.js.map +1 -0
  74. package/dist/view/viewer.d.ts +42 -1
  75. package/dist/view/viewer.d.ts.map +1 -1
  76. package/dist/view/viewer.js +433 -69
  77. package/dist/view/viewer.js.map +1 -1
  78. package/dist/worker/document.d.ts +33 -1
  79. package/dist/worker/document.d.ts.map +1 -1
  80. package/dist/worker/document.js +181 -24
  81. package/dist/worker/document.js.map +1 -1
  82. package/dist/worker/entry.d.ts +1 -1
  83. package/dist/worker/entry.d.ts.map +1 -1
  84. package/dist/worker/entry.js +3 -1
  85. package/dist/worker/entry.js.map +1 -1
  86. package/dist/worker/find.d.ts +7 -0
  87. package/dist/worker/find.d.ts.map +1 -0
  88. package/dist/worker/find.js +59 -0
  89. package/dist/worker/find.js.map +1 -0
  90. package/dist/worker/methods.d.ts.map +1 -1
  91. package/dist/worker/methods.js +31 -4
  92. package/dist/worker/methods.js.map +1 -1
  93. package/dist/worker/navigation.d.ts +6 -0
  94. package/dist/worker/navigation.d.ts.map +1 -0
  95. package/dist/worker/navigation.js +16 -0
  96. package/dist/worker/navigation.js.map +1 -0
  97. package/dist/worker/network.d.ts +4 -0
  98. package/dist/worker/network.d.ts.map +1 -0
  99. package/dist/worker/network.js +24 -0
  100. package/dist/worker/network.js.map +1 -0
  101. package/dist/worker/render.d.ts +5 -2
  102. package/dist/worker/render.d.ts.map +1 -1
  103. package/dist/worker/render.js +14 -7
  104. package/dist/worker/render.js.map +1 -1
  105. package/dist/worker/text.d.ts +17 -0
  106. package/dist/worker/text.d.ts.map +1 -0
  107. package/dist/worker/text.js +75 -0
  108. package/dist/worker/text.js.map +1 -0
  109. package/dist/zoom/destination.d.ts +18 -0
  110. package/dist/zoom/destination.d.ts.map +1 -0
  111. package/dist/zoom/destination.js +56 -0
  112. package/dist/zoom/destination.js.map +1 -0
  113. package/package.json +6 -5
@@ -1,5 +1,7 @@
1
1
  import { type CloneableWasmSource, type RenderLimits, type RenderRequest } from "@laminapdf/render";
2
- import type { Limits, PageInfo } from "@laminapdf/sdk";
2
+ import type { Limits, OutlineNode, PageInfo, StructureNode, Target } from "@laminapdf/sdk";
3
+ import type { FindOptions } from "./find/fold.js";
4
+ import type { FindSnippet } from "./find/page.js";
3
5
  /** Which engine draws the pages (ADR 0004: PDFium by default, hayro the CI oracle). */
4
6
  export type BackendName = "pdfium" | "hayro";
5
7
  /** What the worker loads a backend from. */
@@ -8,8 +10,15 @@ export interface BackendInit {
8
10
  /** The engine's `.wasm`: required for PDFium (its URL from your bundler); hayro finds its own. */
9
11
  readonly wasm?: CloneableWasmSource;
10
12
  }
13
+ /**
14
+ * A remote file the worker fetches itself, with HTTP Range requests (`HttpRangeByteSource`): its
15
+ * bytes never pass through the page.
16
+ */
17
+ export interface RemoteSource {
18
+ readonly url: string;
19
+ }
11
20
  /** What a document is opened from: sent to the worker, which reads it there. */
12
- export type SourceInit = Blob | ArrayBuffer | Uint8Array;
21
+ export type SourceInit = Blob | ArrayBuffer | Uint8Array | RemoteSource;
13
22
  /** `open`'s options. The password crosses to the worker once and is kept only there. */
14
23
  export interface ViewerOpenOptions {
15
24
  readonly password?: string;
@@ -31,6 +40,8 @@ export interface OpenedDocument {
31
40
  readonly name: BackendName;
32
41
  readonly version: string;
33
42
  };
43
+ /** The title in the file's metadata, for the window's title; absent when the file has none. */
44
+ readonly title?: string;
34
45
  }
35
46
  /** A rendered tile on the page: an ImageBitmap transferred from the worker. Close it when done. */
36
47
  export interface RenderedBitmap {
@@ -38,6 +49,14 @@ export interface RenderedBitmap {
38
49
  readonly width: number;
39
50
  readonly height: number;
40
51
  }
52
+ /**
53
+ * The bytes of the worker's WebAssembly memories: the render backend's and Lamina PDF's (every
54
+ * module loaded). Memories only grow, so this is also their peak.
55
+ */
56
+ export interface WorkerMemory {
57
+ readonly backend: number;
58
+ readonly sdk: number;
59
+ }
41
60
  /** The viewer's methods: params and result per method. `client.call` is typed by it. */
42
61
  export interface Methods {
43
62
  initBackend: {
@@ -63,6 +82,112 @@ export interface Methods {
63
82
  params: [request: RenderRequest, document: number];
64
83
  result: RenderedBitmap;
65
84
  };
85
+ memory: {
86
+ params: [];
87
+ result: WorkerMemory;
88
+ };
89
+ pageText: {
90
+ params: [index: number];
91
+ result: PageTextData;
92
+ };
93
+ structure: {
94
+ params: [];
95
+ result: StructureData;
96
+ };
97
+ networkLog: {
98
+ params: [];
99
+ result: WorkerNetworkLog;
100
+ };
101
+ outline: {
102
+ params: [];
103
+ result: OutlineNode[];
104
+ };
105
+ namedDestination: {
106
+ params: [name: string];
107
+ result: Target | undefined;
108
+ };
109
+ find: {
110
+ params: [query: string, options: FindOptions, pages: readonly number[]];
111
+ result: FindPageResult[];
112
+ };
113
+ }
114
+ /** One page's find results: each match as its quads (8 numbers per run it touches), in page space. */
115
+ export interface FindPageResult {
116
+ readonly page: number;
117
+ readonly matches: readonly (readonly number[])[];
118
+ /** Each match in its line, in the same order. */
119
+ readonly snippets: readonly FindSnippet[];
120
+ /** The page has no text to search (a scan without an OCR layer). */
121
+ readonly noText?: true;
122
+ }
123
+ /** One text run of a page: glyphs of one font, size and direction on one baseline, in logical order. */
124
+ export interface TextRunData {
125
+ /** Its text in logical order (document text; an `/ActualText` replacement when `actualText`). */
126
+ readonly text: string;
127
+ /** Font size in points, the text matrix applied. */
128
+ readonly size: number;
129
+ /** Vertical writing. */
130
+ readonly vertical: boolean;
131
+ /** The text replaces its glyphs (`/ActualText`). */
132
+ readonly actualText: boolean;
133
+ /** Drawn invisibly (`Tr` 3 or 7: an OCR layer, hidden text); selectable all the same. */
134
+ readonly invisible: boolean;
135
+ /** Its glyphs: `[start, end)` into `quads` (8 numbers each), as the SDK's `PageTextRun.glyphRange`. */
136
+ readonly glyphRange: readonly [number, number];
137
+ /** The marked-content ID it is in, which links it to the structure tree. */
138
+ readonly mcid?: number;
139
+ }
140
+ /**
141
+ * A page's text: its runs, and every glyph's quad as 8 numbers (bottom-left, bottom-right,
142
+ * top-right, top-left, each `x, y`) in page space (ADR 0027: points from the displayed page's
143
+ * top-left, y down).
144
+ */
145
+ export interface PageTextData {
146
+ readonly runs: readonly TextRunData[];
147
+ readonly quads: Float32Array;
148
+ }
149
+ /** Whether the document says it is tagged, and its structure tree when it has one. */
150
+ export interface StructureData {
151
+ readonly tagged: boolean;
152
+ readonly tree?: readonly StructureNode[];
153
+ }
154
+ /** Which JavaScript context made a request: the page, or the document worker. */
155
+ export type NetworkSource = "page" | "worker";
156
+ /** One network request a context made, as `watchNetwork` reports it. */
157
+ export interface NetworkRecord {
158
+ readonly url: string;
159
+ readonly method: string;
160
+ /**
161
+ * What made it: `fetch`, `xmlhttprequest`, `websocket` and `beacon` for wrapped calls, else the
162
+ * Resource Timing `initiatorType` (`script`, `link`, `css`, `img`, `navigation` …).
163
+ */
164
+ readonly initiator: string;
165
+ /** Bytes received, when known (0 otherwise). */
166
+ readonly bytes: number;
167
+ /** The call failed or was refused (a CORS refusal, a network error, a beacon not queued). */
168
+ readonly failed: boolean;
169
+ readonly source: NetworkSource;
170
+ /** `Date.now()` when it was reported. */
171
+ readonly at: number;
172
+ }
173
+ /** A request the Content Security Policy blocked: nothing was sent. */
174
+ export interface PolicyViolation {
175
+ readonly directive: string;
176
+ readonly blockedUri: string;
177
+ readonly source: NetworkSource;
178
+ readonly at: number;
179
+ }
180
+ /** The document worker's network log: every request and blocked request since it started. */
181
+ export interface WorkerNetworkLog {
182
+ /** Different for each worker the client starts, so a restarted worker's records stay apart. */
183
+ readonly worker: string;
184
+ readonly requests: readonly NetworkRecord[];
185
+ readonly violations: readonly PolicyViolation[];
186
+ }
187
+ /** How much of a remote file the worker has read: the `progress` event. */
188
+ export interface LoadProgress {
189
+ readonly loaded: number;
190
+ readonly total: number;
66
191
  }
67
192
  /** A viewer method's name. */
68
193
  export type MethodName = keyof Methods;
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,mBAAmB,EAAW,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7G,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,uFAAuF;AACvF,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE7C,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,kGAAkG;IAClG,QAAQ,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,gFAAgF;AAChF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;AAExE,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/C;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,qGAAqG;IACrG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,mGAAmG;IACnG,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,+FAA+F;IAC/F,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wFAAwF;AACxF,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE;QAAE,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;QAAC,MAAM,EAAE;YAAE,IAAI,EAAE,WAAW,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACvF,YAAY,EAAE;QAAE,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC;IACnG,aAAa,EAAE;QAAE,MAAM,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC;IACjD,QAAQ,EAAE;QAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,QAAQ,CAAA;KAAE,CAAC;IACxD,MAAM,EAAE;QAAE,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC;IACvF,MAAM,EAAE;QAAE,MAAM,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC;IAC7C,QAAQ,EAAE;QAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC;IAC5D,SAAS,EAAE;QAAE,MAAM,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC;IACjD,UAAU,EAAE;QAAE,MAAM,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACrD,OAAO,EAAE;QAAE,MAAM,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IAC/C,gBAAgB,EAAE;QAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACzE,IAAI,EAAE;QAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;CAC7G;AAED,sGAAsG;AACtG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IACjD,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,oEAAoE;IACpE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;CACxB;AAED,wGAAwG;AACxG,MAAM,WAAW,WAAW;IAC1B,iGAAiG;IACjG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,uGAAuG;IACvG,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAC1C;AAED,iFAAiF;AACjF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE9C,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,6FAA6F;AAC7F,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;CACjD;AAED,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,8BAA8B;AAC9B,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;AACvC,+BAA+B;AAC/B,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAChE,2BAA2B;AAC3B,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;AAE7D,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE;IAAE,QAAQ,EAAE,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,MAAM;CAKpE,CAAC;AAEH,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAG5D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAWpE"}
package/dist/protocol.js CHANGED
@@ -1,5 +1,5 @@
1
- // The viewer's methods on the document worker (C3a, ADR 0009 §3). They extend `@laminapdf/sdk/worker`
2
- // (L2a): one protocol, one queue and one cancellation path for both, with the viewer's methods
1
+ // The viewer's methods on the document worker (ADR 0009 §3). They extend `@laminapdf/sdk/worker`:
2
+ // one protocol, one queue and one cancellation path for both, with the viewer's methods
3
3
  // added through `serve({ methods })` in the worker and `client.request` on the page. This module
4
4
  // holds what both sides agree on: the method map (params and results), the priorities and the
5
5
  // coalescing key.
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,+FAA+F;AAC/F,iGAAiG;AACjG,8FAA8F;AAC9F,kBAAkB;AAElB,OAAO,EAA4B,OAAO,EAAyC,MAAM,mBAAmB,CAAC;AAkE7G,mEAAmE;AACnE,MAAM,CAAC,MAAM,QAAQ,GAAsD,MAAM,CAAC,MAAM,CAAC;IACvF,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,CAAC;CACd,CAAC,CAAC;AAQH,kEAAkE;AAClE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAW,EAAE,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,OAAsB,EAAE,EAAU;IAC1D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACvE,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,EAAE;QACF,IAAI;QACJ,KAAK;QACL,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QACrE,QAAQ;QACR,OAAO,CAAC,KAAK,CAAC;QACd,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;KAChD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,wFAAwF;AACxF,iGAAiG;AACjG,8FAA8F;AAC9F,kBAAkB;AAElB,OAAO,EAA4B,OAAO,EAAyC,MAAM,mBAAmB,CAAC;AAqL7G,mEAAmE;AACnE,MAAM,CAAC,MAAM,QAAQ,GAAsD,MAAM,CAAC,MAAM,CAAC;IACvF,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,CAAC;CACd,CAAC,CAAC;AAQH,kEAAkE;AAClE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAW,EAAE,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,OAAsB,EAAE,EAAU;IAC1D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACvE,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,EAAE;QACF,IAAI;QACJ,KAAK;QACL,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QACrE,QAAQ;QACR,OAAO,CAAC,KAAK,CAAC;QACd,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;KAChD,CAAC,CAAC;AACL,CAAC"}
@@ -1,17 +1,57 @@
1
1
  import type { PixelRect } from "@laminapdf/render";
2
+ /**
3
+ * The most device pixels a page's backdrop canvas holds: well below Safari's 16.7 MP per canvas,
4
+ * and small enough that the mounted pages share the pool. A page larger than this at the full
5
+ * pixel ratio keeps its backdrop at a lower one and gets a detail canvas over the part in view.
6
+ */
7
+ export declare const BACKDROP_MAX_PIXELS: number;
8
+ /**
9
+ * Device px per CSS px of the backdrop of a page `css` CSS px in size: `dpr`, or less so that the
10
+ * whole page fits `maxPixels` ({@link BACKDROP_MAX_PIXELS} by default; less on touch devices).
11
+ */
12
+ export declare function backdropRatio(dpr: number, css: {
13
+ readonly width: number;
14
+ readonly height: number;
15
+ }, maxPixels?: number): number;
16
+ /** The smallest rectangle covering every one of `rects`; undefined when there are none. */
17
+ export declare function bounds(rects: readonly PixelRect[]): PixelRect | undefined;
18
+ /** Whether `outer` contains all of `inner`. */
19
+ export declare function contains(outer: PixelRect, inner: PixelRect): boolean;
2
20
  /** The render scale (output px per pt) of the low-resolution pass for a page `widthPt` wide. */
3
21
  export declare function lowScale(sharpScale: number, widthPt: number): number;
22
+ /**
23
+ * The sharp scale (device px per pt) of a page `css` CSS px in size at layout scale `layoutScale`:
24
+ * `layoutScale × dpr`, unless the canvas pool could only `fit` fewer pixels than `wanted`, the page
25
+ * in whole pixels at that scale (`pagePixels`); then lowered to what fits. The canvas is then
26
+ * `pagePixels` at this scale, which never exceeds `fitted` on either side.
27
+ *
28
+ * `wanted` is in whole pixels, as the pool fits them: comparing `fitted` with the fractional CSS
29
+ * size instead takes the pool's rounding (79.33 px to 79) for a cap, which lowers the scale a
30
+ * hair below the full one and sends every page asking for a detail canvas it doesn't need.
31
+ */
32
+ export declare function sharpScale(layoutScale: number, dpr: number, css: {
33
+ readonly width: number;
34
+ readonly height: number;
35
+ }, fitted: {
36
+ readonly width: number;
37
+ readonly height: number;
38
+ }, wanted: {
39
+ readonly width: number;
40
+ readonly height: number;
41
+ }): number;
4
42
  /**
5
43
  * The tiles (device px, in the page's pixel space at the sharp scale) covering `visible`, the
6
- * part of the page in view in CSS px (x, y from the page's top-left), clamped to the page.
44
+ * part of the page in view in CSS px (x, y from the page's top-left), clamped to `page`: the
45
+ * whole page in device px, as the renderer sizes it (`pagePixels` of `@laminapdf/render`), so no
46
+ * tile reaches past it. `ratio` is device px per CSS px.
7
47
  */
8
48
  export declare function tilesFor(visible: {
9
49
  readonly x: number;
10
50
  readonly y: number;
11
51
  readonly width: number;
12
52
  readonly height: number;
13
- }, pageCss: {
53
+ }, page: {
14
54
  readonly width: number;
15
55
  readonly height: number;
16
- }, dpr: number): PixelRect[];
56
+ }, ratio: number): PixelRect[];
17
57
  //# sourceMappingURL=tiles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tiles.d.ts","sourceRoot":"","sources":["../../src/render/tiles.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAOnD,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE;IAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACpG,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC5D,GAAG,EAAE,MAAM,GACV,SAAS,EAAE,CAeb"}
1
+ {"version":3,"file":"tiles.d.ts","sourceRoot":"","sources":["../../src/render/tiles.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAOnD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAkB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACxD,SAAS,SAAsB,GAC9B,MAAM,CAGR;AAED,2FAA2F;AAC3F,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,GAAG,SAAS,CAWzE;AAED,+CAA+C;AAC/C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAOpE;AAED,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACxD,MAAM,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3D,MAAM,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1D,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE;IAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACpG,IAAI,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACzD,KAAK,EAAE,MAAM,GACZ,SAAS,EAAE,CAcb"}
@@ -2,26 +2,78 @@
2
2
  const TILE_CSS = 512;
3
3
  /** The low-resolution pass: at most this many device px wide, and at most half the sharp scale. */
4
4
  const LOW_MAX_WIDTH = 256;
5
+ /**
6
+ * The most device pixels a page's backdrop canvas holds: well below Safari's 16.7 MP per canvas,
7
+ * and small enough that the mounted pages share the pool. A page larger than this at the full
8
+ * pixel ratio keeps its backdrop at a lower one and gets a detail canvas over the part in view.
9
+ */
10
+ export const BACKDROP_MAX_PIXELS = 8 * 1024 * 1024;
11
+ /**
12
+ * Device px per CSS px of the backdrop of a page `css` CSS px in size: `dpr`, or less so that the
13
+ * whole page fits `maxPixels` ({@link BACKDROP_MAX_PIXELS} by default; less on touch devices).
14
+ */
15
+ export function backdropRatio(dpr, css, maxPixels = BACKDROP_MAX_PIXELS) {
16
+ const pixels = css.width * dpr * css.height * dpr;
17
+ return pixels <= maxPixels ? dpr : dpr * Math.sqrt(maxPixels / pixels);
18
+ }
19
+ /** The smallest rectangle covering every one of `rects`; undefined when there are none. */
20
+ export function bounds(rects) {
21
+ const [first] = rects;
22
+ if (first === undefined)
23
+ return undefined;
24
+ let [x0, y0, x1, y1] = [first.x, first.y, first.x + first.width, first.y + first.height];
25
+ for (const r of rects) {
26
+ x0 = Math.min(x0, r.x);
27
+ y0 = Math.min(y0, r.y);
28
+ x1 = Math.max(x1, r.x + r.width);
29
+ y1 = Math.max(y1, r.y + r.height);
30
+ }
31
+ return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
32
+ }
33
+ /** Whether `outer` contains all of `inner`. */
34
+ export function contains(outer, inner) {
35
+ return (inner.x >= outer.x &&
36
+ inner.y >= outer.y &&
37
+ inner.x + inner.width <= outer.x + outer.width &&
38
+ inner.y + inner.height <= outer.y + outer.height);
39
+ }
5
40
  /** The render scale (output px per pt) of the low-resolution pass for a page `widthPt` wide. */
6
41
  export function lowScale(sharpScale, widthPt) {
7
42
  return Math.min(sharpScale * 0.5, LOW_MAX_WIDTH / Math.max(1, widthPt));
8
43
  }
44
+ /**
45
+ * The sharp scale (device px per pt) of a page `css` CSS px in size at layout scale `layoutScale`:
46
+ * `layoutScale × dpr`, unless the canvas pool could only `fit` fewer pixels than `wanted`, the page
47
+ * in whole pixels at that scale (`pagePixels`); then lowered to what fits. The canvas is then
48
+ * `pagePixels` at this scale, which never exceeds `fitted` on either side.
49
+ *
50
+ * `wanted` is in whole pixels, as the pool fits them: comparing `fitted` with the fractional CSS
51
+ * size instead takes the pool's rounding (79.33 px to 79) for a cap, which lowers the scale a
52
+ * hair below the full one and sends every page asking for a detail canvas it doesn't need.
53
+ */
54
+ export function sharpScale(layoutScale, dpr, css, fitted, wanted) {
55
+ if (fitted.width >= wanted.width && fitted.height >= wanted.height)
56
+ return layoutScale * dpr;
57
+ return layoutScale * Math.min(dpr, fitted.width / css.width, fitted.height / css.height);
58
+ }
9
59
  /**
10
60
  * The tiles (device px, in the page's pixel space at the sharp scale) covering `visible`, the
11
- * part of the page in view in CSS px (x, y from the page's top-left), clamped to the page.
61
+ * part of the page in view in CSS px (x, y from the page's top-left), clamped to `page`: the
62
+ * whole page in device px, as the renderer sizes it (`pagePixels` of `@laminapdf/render`), so no
63
+ * tile reaches past it. `ratio` is device px per CSS px.
12
64
  */
13
- export function tilesFor(visible, pageCss, dpr) {
14
- const pageW = Math.max(1, Math.floor(pageCss.width * dpr));
15
- const pageH = Math.max(1, Math.floor(pageCss.height * dpr));
16
- const side = Math.max(1, Math.round(TILE_CSS * dpr));
17
- const x0 = Math.max(0, Math.floor((visible.x * dpr) / side) * side);
18
- const y0 = Math.max(0, Math.floor((visible.y * dpr) / side) * side);
19
- const x1 = Math.min(pageW, Math.ceil(((visible.x + visible.width) * dpr) / side) * side);
20
- const y1 = Math.min(pageH, Math.ceil(((visible.y + visible.height) * dpr) / side) * side);
65
+ export function tilesFor(visible, page, ratio) {
66
+ if (visible.width <= 0 || visible.height <= 0)
67
+ return [];
68
+ const side = Math.max(1, Math.round(TILE_CSS * ratio));
69
+ const x0 = Math.max(0, Math.floor((visible.x * ratio) / side) * side);
70
+ const y0 = Math.max(0, Math.floor((visible.y * ratio) / side) * side);
71
+ const x1 = Math.min(page.width, Math.ceil(((visible.x + visible.width) * ratio) / side) * side);
72
+ const y1 = Math.min(page.height, Math.ceil(((visible.y + visible.height) * ratio) / side) * side);
21
73
  const tiles = [];
22
74
  for (let y = y0; y < y1; y += side) {
23
75
  for (let x = x0; x < x1; x += side) {
24
- tiles.push({ x, y, width: Math.min(side, pageW - x), height: Math.min(side, pageH - y) });
76
+ tiles.push({ x, y, width: Math.min(side, page.width - x), height: Math.min(side, page.height - y) });
25
77
  }
26
78
  }
27
79
  return tiles;
@@ -1 +1 @@
1
- {"version":3,"file":"tiles.js","sourceRoot":"","sources":["../../src/render/tiles.ts"],"names":[],"mappings":"AAKA,+EAA+E;AAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,mGAAmG;AACnG,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,gGAAgG;AAChG,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,OAAe;IAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAoG,EACpG,OAA4D,EAC5D,GAAW;IAEX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACzF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"tiles.js","sourceRoot":"","sources":["../../src/render/tiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { ByteRange, RenderSource } from "@laminapdf/render";
2
+ import { type RangeSource } from "@laminapdf/sdk";
3
+ /** Options for {@link HttpRangeByteSource.open}. */
4
+ export interface HttpRangeByteSourceOptions {
5
+ /** Requests are aligned to blocks of this many bytes (default 65 536). */
6
+ readonly blockSize?: number;
7
+ /** Whole blocks fetched after each range asked for (default 1). */
8
+ readonly readahead?: number;
9
+ /** The most bytes the cache keeps; the least recently used blocks go first (default 64 MiB). */
10
+ readonly cacheBytes?: number;
11
+ /**
12
+ * The largest file downloaded whole when the server ignores `Range` (default 256 MiB); above
13
+ * it the open fails with `source-budget-exceeded`.
14
+ */
15
+ readonly maxWholeBytes?: number;
16
+ /** Skip the browser's HTTP cache (default true). */
17
+ readonly noStore?: boolean;
18
+ /** Called after each fetch with the bytes received so far and the file's size. */
19
+ readonly onProgress?: (progress: {
20
+ readonly loaded: number;
21
+ readonly total: number;
22
+ }) => void;
23
+ /** Aborts the probe. */
24
+ readonly signal?: AbortSignal;
25
+ /** The `fetch` to use (default: the global one). */
26
+ readonly fetch?: typeof fetch;
27
+ }
28
+ /** A remote file as a `RangeSource` (for Lamina PDF) and a `RenderSource` (for the render backend). */
29
+ export declare class HttpRangeByteSource implements RangeSource, RenderSource {
30
+ #private;
31
+ readonly size: number;
32
+ readonly blockSize: number;
33
+ private constructor();
34
+ /**
35
+ * Probes `url` (its last 64 KiB: the size, and the part a reader reads first) and returns the
36
+ * source. A server that ignores `Range` sends the whole file, which is kept.
37
+ *
38
+ * @throws LaminaPdfError `fetch-failed` (`data.reason` `network` covers a refused CORS check,
39
+ * which the browser doesn't tell apart from being offline), `source-changed`,
40
+ * `source-budget-exceeded`, or the signal's reason.
41
+ */
42
+ static open(url: string, options?: HttpRangeByteSourceOptions): Promise<HttpRangeByteSource>;
43
+ /** The whole file, when the server sent it whole (then every read is answered from it). */
44
+ get whole(): Uint8Array | undefined;
45
+ /** Bytes received from the network so far (the probe's included), re-fetches of evicted blocks too. */
46
+ get loaded(): number;
47
+ /** The `length` bytes at `offset` if every block is cached, else undefined (`RenderSource`). */
48
+ readSync(offset: number, length: number): Uint8Array | undefined;
49
+ /**
50
+ * Fetches the blocks `ranges` touch (and the readahead after each) that aren't cached: the
51
+ * ranges of a render backend's `data-pending`.
52
+ */
53
+ fill(ranges: readonly ByteRange[], signal?: AbortSignal): Promise<void>;
54
+ /** `RangeSource.read`: fills, then reads from the cache. */
55
+ read(offset: number, length: number, options?: {
56
+ readonly signal?: AbortSignal;
57
+ }): Promise<Uint8Array>;
58
+ }
59
+ //# sourceMappingURL=http-range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-range.d.ts","sourceRoot":"","sources":["../../src/source/http-range.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAqD,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIrG,oDAAoD;AACpD,MAAM,WAAW,0BAA0B;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,gGAAgG;IAChG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,oDAAoD;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9F,wBAAwB;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAqED,uGAAuG;AACvG,qBAAa,mBAAoB,YAAW,WAAW,EAAE,YAAY;;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAc3B,OAAO,eAON;IAED;;;;;;;OAOG;IACH,OAAa,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+BrG;IAED,2FAA2F;IAC3F,IAAI,KAAK,IAAI,UAAU,GAAG,SAAS,CAElC;IAED,uGAAuG;IACvG,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,gGAAgG;IAChG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAuB/D;IAED;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5E;IAeD,4DAA4D;IACtD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAO3G;CA0DF"}