@laminapdf/sdk 0.0.0-stage → 0.2.0-alpha.2

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 (139) hide show
  1. package/README.md +208 -2
  2. package/dist/api.d.ts +23 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +11 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/builder.d.ts +319 -0
  7. package/dist/builder.d.ts.map +1 -0
  8. package/dist/builder.js +540 -0
  9. package/dist/builder.js.map +1 -0
  10. package/dist/defined.d.ts +5 -0
  11. package/dist/defined.d.ts.map +1 -0
  12. package/dist/defined.js +7 -0
  13. package/dist/defined.js.map +1 -0
  14. package/dist/document.d.ts +241 -0
  15. package/dist/document.d.ts.map +1 -0
  16. package/dist/document.js +427 -0
  17. package/dist/document.js.map +1 -0
  18. package/dist/entry/node.d.ts +30 -0
  19. package/dist/entry/node.d.ts.map +1 -0
  20. package/dist/entry/node.js +37 -0
  21. package/dist/entry/node.js.map +1 -0
  22. package/dist/entry/workerd.d.ts +30 -0
  23. package/dist/entry/workerd.d.ts.map +1 -0
  24. package/dist/entry/workerd.js +37 -0
  25. package/dist/entry/workerd.js.map +1 -0
  26. package/dist/errors.d.ts +102 -0
  27. package/dist/errors.d.ts.map +1 -0
  28. package/dist/errors.js +137 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/explain.d.ts +20 -0
  31. package/dist/explain.d.ts.map +1 -0
  32. package/dist/explain.js +14 -0
  33. package/dist/explain.js.map +1 -0
  34. package/dist/font.d.ts +66 -0
  35. package/dist/font.d.ts.map +1 -0
  36. package/dist/font.js +103 -0
  37. package/dist/font.js.map +1 -0
  38. package/dist/generated/builder-enums.d.ts +29 -0
  39. package/dist/generated/builder-enums.d.ts.map +1 -0
  40. package/dist/generated/builder-enums.js +80 -0
  41. package/dist/generated/builder-enums.js.map +1 -0
  42. package/dist/generated/codes.d.ts +97 -0
  43. package/dist/generated/codes.d.ts.map +1 -0
  44. package/dist/generated/codes.js +453 -0
  45. package/dist/generated/codes.js.map +1 -0
  46. package/dist/generated/explain.d.ts +6 -0
  47. package/dist/generated/explain.d.ts.map +1 -0
  48. package/dist/generated/explain.js +138 -0
  49. package/dist/generated/explain.js.map +1 -0
  50. package/dist/index.d.ts +30 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +37 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/init.d.ts +80 -0
  55. package/dist/init.d.ts.map +1 -0
  56. package/dist/init.js +127 -0
  57. package/dist/init.js.map +1 -0
  58. package/dist/loader/fetch.d.ts +3 -0
  59. package/dist/loader/fetch.d.ts.map +1 -0
  60. package/dist/loader/fetch.js +2 -0
  61. package/dist/loader/fetch.js.map +1 -0
  62. package/dist/loader/node.d.ts +3 -0
  63. package/dist/loader/node.d.ts.map +1 -0
  64. package/dist/loader/node.js +9 -0
  65. package/dist/loader/node.js.map +1 -0
  66. package/dist/loader/workerd.d.ts +3 -0
  67. package/dist/loader/workerd.d.ts.map +1 -0
  68. package/dist/loader/workerd.js +15 -0
  69. package/dist/loader/workerd.js.map +1 -0
  70. package/dist/matrix.d.ts +16 -0
  71. package/dist/matrix.d.ts.map +1 -0
  72. package/dist/matrix.js +36 -0
  73. package/dist/matrix.js.map +1 -0
  74. package/dist/path.d.ts +34 -0
  75. package/dist/path.d.ts.map +1 -0
  76. package/dist/path.js +49 -0
  77. package/dist/path.js.map +1 -0
  78. package/dist/source/http.d.ts +36 -0
  79. package/dist/source/http.d.ts.map +1 -0
  80. package/dist/source/http.js +211 -0
  81. package/dist/source/http.js.map +1 -0
  82. package/dist/source/range.d.ts +70 -0
  83. package/dist/source/range.d.ts.map +1 -0
  84. package/dist/source/range.js +96 -0
  85. package/dist/source/range.js.map +1 -0
  86. package/dist/text.d.ts +90 -0
  87. package/dist/text.d.ts.map +1 -0
  88. package/dist/text.js +127 -0
  89. package/dist/text.js.map +1 -0
  90. package/dist/transaction.d.ts +36 -0
  91. package/dist/transaction.d.ts.map +1 -0
  92. package/dist/transaction.js +47 -0
  93. package/dist/transaction.js.map +1 -0
  94. package/dist/types.d.ts +79 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +2 -0
  97. package/dist/types.js.map +1 -0
  98. package/dist/version.d.ts +3 -0
  99. package/dist/version.d.ts.map +1 -0
  100. package/dist/version.js +6 -0
  101. package/dist/version.js.map +1 -0
  102. package/dist/worker/client.d.ts +87 -0
  103. package/dist/worker/client.d.ts.map +1 -0
  104. package/dist/worker/client.js +405 -0
  105. package/dist/worker/client.js.map +1 -0
  106. package/dist/worker/emitter.d.ts +12 -0
  107. package/dist/worker/emitter.d.ts.map +1 -0
  108. package/dist/worker/emitter.js +34 -0
  109. package/dist/worker/emitter.js.map +1 -0
  110. package/dist/worker/entry.d.ts +2 -0
  111. package/dist/worker/entry.d.ts.map +1 -0
  112. package/dist/worker/entry.js +4 -0
  113. package/dist/worker/entry.js.map +1 -0
  114. package/dist/worker/index.d.ts +7 -0
  115. package/dist/worker/index.d.ts.map +1 -0
  116. package/dist/worker/index.js +4 -0
  117. package/dist/worker/index.js.map +1 -0
  118. package/dist/worker/protocol.d.ts +82 -0
  119. package/dist/worker/protocol.d.ts.map +1 -0
  120. package/dist/worker/protocol.js +11 -0
  121. package/dist/worker/protocol.js.map +1 -0
  122. package/dist/worker/server.d.ts +51 -0
  123. package/dist/worker/server.d.ts.map +1 -0
  124. package/dist/worker/server.js +460 -0
  125. package/dist/worker/server.js.map +1 -0
  126. package/dist/worker/support.d.ts +39 -0
  127. package/dist/worker/support.d.ts.map +1 -0
  128. package/dist/worker/support.js +25 -0
  129. package/dist/worker/support.js.map +1 -0
  130. package/dist/worker/transfer.d.ts +3 -0
  131. package/dist/worker/transfer.d.ts.map +1 -0
  132. package/dist/worker/transfer.js +13 -0
  133. package/dist/worker/transfer.js.map +1 -0
  134. package/dist/worker/types.d.ts +43 -0
  135. package/dist/worker/types.d.ts.map +1 -0
  136. package/dist/worker/types.js +2 -0
  137. package/dist/worker/types.js.map +1 -0
  138. package/package.json +91 -3
  139. package/schemas/error.schema.json +288 -0
package/dist/init.js ADDED
@@ -0,0 +1,127 @@
1
+ // Loading the WebAssembly modules (ADR 0016 §2, §3): `init()` compiles and instantiates the base
2
+ // module once; the text module is loaded by `init({ text: true })` or `loadText()`, the extract
3
+ // module (base + text extraction, B9c) by `init({ extract: true })` or `loadExtract()`. After
4
+ // that, every call is synchronous. Each export condition supplies its own `Locate` (src/loader/), so
5
+ // this file has no environment detection and no runtime-specific API.
6
+ import * as baseGlue from "@laminapdf/wasm/base";
7
+ import { packageError } from "./errors.js";
8
+ const base = {};
9
+ const text = {};
10
+ const extract = {};
11
+ function isOptions(input) {
12
+ if (typeof input !== "object" || input === null || "then" in input)
13
+ return false;
14
+ const proto = Object.getPrototypeOf(input);
15
+ return proto === Object.prototype || proto === null;
16
+ }
17
+ /**
18
+ * Loads `slot`'s module once with `glue` (a failed load can be retried). A later call naming a
19
+ * different source than the first throws `already-initialized` instead of being ignored.
20
+ */
21
+ function load(slot, name, glue, locate, source) {
22
+ if (slot.pending !== undefined) {
23
+ if (source !== undefined && source !== slot.requested) {
24
+ return Promise.reject(packageError("already-initialized", `the ${name} module is already loaded or loading from another source; the new source is ignored`));
25
+ }
26
+ return slot.pending;
27
+ }
28
+ slot.requested = source;
29
+ slot.pending = (async () => {
30
+ const g = await glue();
31
+ const from = source ?? (await locate(name));
32
+ const exports = (await g.default(from === undefined ? undefined : { module_or_path: from }));
33
+ slot.loaded = { glue: g, exports };
34
+ })().catch((e) => {
35
+ slot.pending = undefined;
36
+ slot.requested = undefined;
37
+ throw e;
38
+ });
39
+ return slot.pending;
40
+ }
41
+ /** Loads the text module (once; a failed load can be retried). */
42
+ export function loadTextWith(locate, source) {
43
+ return load(text, "text", () => import("@laminapdf/wasm/text"), locate, source);
44
+ }
45
+ /**
46
+ * Loads the extract module (once; a failed load can be retried). Not when the text module is
47
+ * loaded or loading: it extracts too, and documents open in it first, so the extract module
48
+ * would never be used.
49
+ */
50
+ export function loadExtractWith(locate, source) {
51
+ const loadIt = () => load(extract, "extract", () => import("@laminapdf/wasm/extract"), locate, source);
52
+ // A source given is honoured as for any module; without one, a text module loaded or loading
53
+ // makes the extract module unnecessary, unless that load fails.
54
+ if (source !== undefined || text.pending === undefined)
55
+ return loadIt();
56
+ return text.pending.catch(loadIt);
57
+ }
58
+ /** `init` for an export condition's `locate`. */
59
+ export async function initWith(locate, input) {
60
+ const options = input === undefined ? {} : isOptions(input) ? input : { module: input };
61
+ const loads = [load(base, "base", async () => baseGlue, locate, options.module)];
62
+ if (options.text !== undefined && options.text !== false) {
63
+ loads.push(loadTextWith(locate, options.text === true ? undefined : options.text));
64
+ }
65
+ // The text module extracts too: with it, the extract module would never be used.
66
+ if (options.extract !== undefined &&
67
+ options.extract !== false &&
68
+ (options.text === undefined || options.text === false)) {
69
+ loads.push(loadExtractWith(locate, options.extract === true ? undefined : options.extract));
70
+ }
71
+ await Promise.all(loads);
72
+ }
73
+ /** The base module's glue. @throws {@link LaminaPdfError} `not-initialized` before `init()`. */
74
+ export function baseModule() {
75
+ if (base.loaded === undefined) {
76
+ throw packageError("not-initialized", "init() has not finished loading the WebAssembly module");
77
+ }
78
+ return base.loaded.glue;
79
+ }
80
+ /**
81
+ * The module documents are opened in: the text module when loaded, else the extract module, else
82
+ * the base one (each a superset of the base module's reading API; the first two extract text).
83
+ * @throws {@link LaminaPdfError} `not-initialized` before `init()`.
84
+ */
85
+ export function readingModule() {
86
+ const base = baseModule();
87
+ return (text.loaded?.glue ?? extract.loaded?.glue ?? base);
88
+ }
89
+ /**
90
+ * Whether documents opened or built from now on can extract text: the extract or the text module
91
+ * is loaded. A document opened earlier stays in the module it was opened in; ask it with
92
+ * {@link Document.canExtractText}.
93
+ */
94
+ export function isExtractLoaded() {
95
+ return extract.loaded !== undefined || text.loaded !== undefined;
96
+ }
97
+ /** Whether `doc` lives in a module that extracts text (the extract or the text module). */
98
+ export function extractsText(doc) {
99
+ return ((text.loaded !== undefined && doc instanceof text.loaded.glue.WasmDocument) ||
100
+ (extract.loaded !== undefined && doc instanceof extract.loaded.glue.WasmDocument));
101
+ }
102
+ /** The text module's glue, when loaded. */
103
+ export function textModule() {
104
+ return text.loaded?.glue;
105
+ }
106
+ /** Whether `init()` has finished. */
107
+ export function isInitialized() {
108
+ return base.loaded !== undefined;
109
+ }
110
+ /** Whether the text module is loaded (builders created now can draw text). */
111
+ export function isTextLoaded() {
112
+ return text.loaded !== undefined;
113
+ }
114
+ /**
115
+ * The size of each loaded module's WebAssembly memory. Memory grows and never shrinks; freed
116
+ * documents and builders leave room that later ones reuse.
117
+ *
118
+ * @returns the byte length of each loaded module's memory.
119
+ */
120
+ export function wasmMemory() {
121
+ return {
122
+ ...(base.loaded === undefined ? {} : { base: base.loaded.exports.memory.buffer.byteLength }),
123
+ ...(text.loaded === undefined ? {} : { text: text.loaded.exports.memory.buffer.byteLength }),
124
+ ...(extract.loaded === undefined ? {} : { extract: extract.loaded.exports.memory.buffer.byteLength }),
125
+ };
126
+ }
127
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Locate } from "../init.js";
2
+ export declare const locate: Locate;
3
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/loader/fetch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,MAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const locate = () => undefined;
2
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/loader/fetch.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,MAAM,GAAW,GAAG,EAAE,CAAC,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Locate } from "../init.js";
2
+ export declare const locate: Locate;
3
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/loader/node.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,eAAO,MAAM,MAAM,EAAE,MASlB,CAAC"}
@@ -0,0 +1,9 @@
1
+ // The `node` condition (Node, Bun): the `.wasm` file of @laminapdf/wasm, read as bytes (Node's
2
+ // fetch can't read file: URLs). The one file in src/ allowed a Node API (biome.json override).
3
+ import { readFile } from "node:fs/promises";
4
+ export const locate = (module) => readFile(new URL(module === "base"
5
+ ? import.meta.resolve("@laminapdf/wasm/lamina_pdf_base.wasm")
6
+ : module === "text"
7
+ ? import.meta.resolve("@laminapdf/wasm/lamina_pdf_text.wasm")
8
+ : import.meta.resolve("@laminapdf/wasm/lamina_pdf_extract.wasm")));
9
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/loader/node.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,+FAA+F;AAC/F,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,MAAM,CAAC,MAAM,MAAM,GAAW,CAAC,MAAM,EAAE,EAAE,CACvC,QAAQ,CACN,IAAI,GAAG,CACL,MAAM,KAAK,MAAM;IACf,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,sCAAsC,CAAC;IAC7D,CAAC,CAAC,MAAM,KAAK,MAAM;QACjB,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,sCAAsC,CAAC;QAC7D,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,yCAAyC,CAAC,CACrE,CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Locate } from "../init.js";
2
+ export declare const locate: Locate;
3
+ //# sourceMappingURL=workerd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerd.d.ts","sourceRoot":"","sources":["../../src/loader/workerd.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzC,eAAO,MAAM,MAAM,EAAE,MAQpB,CAAC"}
@@ -0,0 +1,15 @@
1
+ // The `workerd` condition (Cloudflare Workers): Workers can't compile WebAssembly at run time,
2
+ // so the modules are imported statically; wrangler turns a `.wasm` import into a
3
+ // `WebAssembly.Module` (ADR 0016 §2). Both modules are part of the Worker's bundle.
4
+ import base from "@laminapdf/wasm/lamina_pdf_base.wasm";
5
+ import text from "@laminapdf/wasm/lamina_pdf_text.wasm";
6
+ import { packageError } from "../errors.js";
7
+ // The extract module isn't imported here: a static import would put it in every Worker's bundle
8
+ // (about 526 KB gzip) whether or not it extracts text. A Worker that does passes it itself.
9
+ export const locate = (module) => {
10
+ if (module === "extract") {
11
+ throw packageError("extract-module-not-loaded", 'in workerd, pass the extract module: import extract from "@laminapdf/wasm/lamina_pdf_extract.wasm"; await loadExtract(extract)');
12
+ }
13
+ return module === "base" ? base : text;
14
+ };
15
+ //# sourceMappingURL=workerd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerd.js","sourceRoot":"","sources":["../../src/loader/workerd.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,iFAAiF;AACjF,oFAAoF;AACpF,OAAO,IAAI,MAAM,sCAAsC,CAAC;AACxD,OAAO,IAAI,MAAM,sCAAsC,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,gGAAgG;AAChG,4FAA4F;AAC5F,MAAM,CAAC,MAAM,MAAM,GAAW,CAAC,MAAM,EAAE,EAAE;IACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,YAAY,CAChB,2BAA2B,EAC3B,gIAAgI,CACjI,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** A transformation matrix `[a, b, c, d, e, f]` (ISO 32000-2 §8.3.4), in page space. */
2
+ export type Transform = readonly [a: number, b: number, c: number, d: number, e: number, f: number];
3
+ /** Building transformation matrices. */
4
+ export declare const Matrix: {
5
+ /** The identity. */
6
+ readonly identity: Transform;
7
+ /** A translation by (x, y) points. */
8
+ readonly translate: (x: number, y: number) => Transform;
9
+ /** A scaling by `sx` horizontally and `sy` vertically. */
10
+ readonly scale: (sx: number, sy: number) => Transform;
11
+ /** A rotation by `degrees` about the origin, clockwise as displayed. */
12
+ readonly rotate: (degrees: number) => Transform;
13
+ /** `outer` applied after `inner`: maps p to outer(inner(p)). */
14
+ readonly after: (outer: Transform, inner: Transform) => Transform;
15
+ };
16
+ //# sourceMappingURL=matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"AAGA,wFAAwF;AACxF,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAEpG,wCAAwC;AACxC,eAAO,MAAM,MAAM;IACjB,oBAAoB;aACpB,QAAQ,EAAwB,SAAS;IACzC,sCAAsC;aACtC,SAAS,MAAI,MAAM,KAAK,MAAM,KAAG,SAAS;IAG1C,0DAA0D;aAC1D,KAAK,OAAK,MAAM,MAAM,MAAM,KAAG,SAAS;IAGxC,wEAAwE;aACxE,MAAM,YAAU,MAAM,KAAG,SAAS;IAMlC,gEAAgE;aAChE,KAAK,UAAQ,SAAS,SAAS,SAAS,KAAG,SAAS;CAY5C,CAAC"}
package/dist/matrix.js ADDED
@@ -0,0 +1,36 @@
1
+ // Transformation matrices `[a b c d e f]` in page space, computed as the Rust `Matrix` does so
2
+ // that the same drawing gives the same bytes.
3
+ /** Building transformation matrices. */
4
+ export const Matrix = {
5
+ /** The identity. */
6
+ identity: [1, 0, 0, 1, 0, 0],
7
+ /** A translation by (x, y) points. */
8
+ translate(x, y) {
9
+ return [1, 0, 0, 1, x, y];
10
+ },
11
+ /** A scaling by `sx` horizontally and `sy` vertically. */
12
+ scale(sx, sy) {
13
+ return [sx, 0, 0, sy, 0, 0];
14
+ },
15
+ /** A rotation by `degrees` about the origin, clockwise as displayed. */
16
+ rotate(degrees) {
17
+ const radians = degrees * (Math.PI / 180);
18
+ const s = Math.sin(radians);
19
+ const c = Math.cos(radians);
20
+ return [c, s, -s, c, 0, 0];
21
+ },
22
+ /** `outer` applied after `inner`: maps p to outer(inner(p)). */
23
+ after(outer, inner) {
24
+ const [a, b, c, d, e, f] = outer;
25
+ const [ia, ib, ic, id, ie, iff] = inner;
26
+ return [
27
+ a * ia + c * ib,
28
+ b * ia + d * ib,
29
+ a * ic + c * id,
30
+ b * ic + d * id,
31
+ a * ie + c * iff + e,
32
+ b * ie + d * iff + f,
33
+ ];
34
+ },
35
+ };
36
+ //# sourceMappingURL=matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../src/matrix.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,8CAA8C;AAK9C,wCAAwC;AACxC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,oBAAoB;IACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAc;IACzC,sCAAsC;IACtC,SAAS,CAAC,CAAS,EAAE,CAAS;QAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,0DAA0D;IAC1D,KAAK,CAAC,EAAU,EAAE,EAAU;QAC1B,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,wEAAwE;IACxE,MAAM,CAAC,OAAe;QACpB,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,gEAAgE;IAChE,KAAK,CAAC,KAAgB,EAAE,KAAgB;QACtC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;QACjC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QACxC,OAAO;YACL,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;YACf,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;YACf,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;YACf,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;YACf,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;YACpB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;SACrB,CAAC;IACJ,CAAC;CACO,CAAC"}
package/dist/path.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ import type { Point, Rect } from "./types.js";
2
+ /** Builds a path in page space; every method returns the builder, so calls chain. */
3
+ export interface PathBuilder {
4
+ /** Starts a subpath at (x, y). */
5
+ moveTo(x: number, y: number): PathBuilder;
6
+ /** A straight line to (x, y). */
7
+ lineTo(x: number, y: number): PathBuilder;
8
+ /** A cubic Bézier curve through two control points to (x, y). */
9
+ cubicTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): PathBuilder;
10
+ /** A quadratic Bézier curve through one control point to (x, y). */
11
+ quadTo(x1: number, y1: number, x: number, y: number): PathBuilder;
12
+ /** Closes the subpath. */
13
+ close(): PathBuilder;
14
+ /** A rectangle: left, top, width, height. */
15
+ rect(rect: Rect): PathBuilder;
16
+ /** The ellipse inscribed in a rectangle. */
17
+ ellipse(rect: Rect): PathBuilder;
18
+ /** A circle around `center`. */
19
+ circle(center: Point, radius: number): PathBuilder;
20
+ }
21
+ /** @internal Collects a path's verbs and numbers. */
22
+ export declare class PathEncoder implements PathBuilder {
23
+ #private;
24
+ moveTo(x: number, y: number): this;
25
+ lineTo(x: number, y: number): this;
26
+ cubicTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this;
27
+ quadTo(x1: number, y1: number, x: number, y: number): this;
28
+ close(): this;
29
+ rect(rect: Rect): this;
30
+ ellipse(rect: Rect): this;
31
+ circle(center: Point, radius: number): this;
32
+ finish(): Float64Array;
33
+ }
34
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9C,qFAAqF;AACrF,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC1C,iCAAiC;IACjC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC1C,iEAAiE;IACjE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3F,oEAAoE;IACpE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAClE,0BAA0B;IAC1B,KAAK,IAAI,WAAW,CAAC;IACrB,6CAA6C;IAC7C,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC;IAC9B,4CAA4C;IAC5C,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC;IACjC,gCAAgC;IAChC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;CACpD;AAYD,qDAAqD;AACrD,qBAAa,WAAY,YAAW,WAAW;;IAG7C,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAGjC;IAED,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAGjC;IAED,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAGlF;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAGzD;IAED,KAAK,IAAI,IAAI,CAGZ;IAED,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAGrB;IAED,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAGxB;IAED,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAG1C;IAED,MAAM,IAAI,YAAY,CAErB;CACF"}
package/dist/path.js ADDED
@@ -0,0 +1,49 @@
1
+ /** The verbs of the flat encoding. */
2
+ const MOVE = 0;
3
+ const LINE = 1;
4
+ const CUBIC = 2;
5
+ const QUAD = 3;
6
+ const CLOSE = 4;
7
+ const RECT = 5;
8
+ const ELLIPSE = 6;
9
+ const CIRCLE = 7;
10
+ /** @internal Collects a path's verbs and numbers. */
11
+ export class PathEncoder {
12
+ #data = [];
13
+ moveTo(x, y) {
14
+ this.#data.push(MOVE, x, y);
15
+ return this;
16
+ }
17
+ lineTo(x, y) {
18
+ this.#data.push(LINE, x, y);
19
+ return this;
20
+ }
21
+ cubicTo(x1, y1, x2, y2, x, y) {
22
+ this.#data.push(CUBIC, x1, y1, x2, y2, x, y);
23
+ return this;
24
+ }
25
+ quadTo(x1, y1, x, y) {
26
+ this.#data.push(QUAD, x1, y1, x, y);
27
+ return this;
28
+ }
29
+ close() {
30
+ this.#data.push(CLOSE);
31
+ return this;
32
+ }
33
+ rect(rect) {
34
+ this.#data.push(RECT, ...rect);
35
+ return this;
36
+ }
37
+ ellipse(rect) {
38
+ this.#data.push(ELLIPSE, ...rect);
39
+ return this;
40
+ }
41
+ circle(center, radius) {
42
+ this.#data.push(CIRCLE, center[0], center[1], radius);
43
+ return this;
44
+ }
45
+ finish() {
46
+ return new Float64Array(this.#data);
47
+ }
48
+ }
49
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAuBA,sCAAsC;AACtC,MAAM,IAAI,GAAG,CAAC,CAAC;AACf,MAAM,IAAI,GAAG,CAAC,CAAC;AACf,MAAM,KAAK,GAAG,CAAC,CAAC;AAChB,MAAM,IAAI,GAAG,CAAC,CAAC;AACf,MAAM,KAAK,GAAG,CAAC,CAAC;AAChB,MAAM,IAAI,GAAG,CAAC,CAAC;AACf,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,MAAM,GAAG,CAAC,CAAC;AAEjB,qDAAqD;AACrD,MAAM,OAAO,WAAW;IACb,KAAK,GAAa,EAAE,CAAC;IAE9B,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,CAAS;QAC1E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,CAAS;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAU;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,IAAU;QAChB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,MAAa,EAAE,MAAc;QAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import { type RangeSource } from "./range.js";
2
+ /** Options for {@link httpRangeSource}. */
3
+ export interface HttpRangeOptions {
4
+ /** Extra request headers (authorisation, …). `Range` and `If-Range` are Lamina PDF's. */
5
+ readonly headers?: Readonly<Record<string, string>>;
6
+ /** `fetch`'s credentials mode. */
7
+ readonly credentials?: RequestCredentials;
8
+ /** Aborts the probe; reads take their own signal. */
9
+ readonly signal?: AbortSignal;
10
+ /** Fetches are aligned to blocks of this many bytes (default 16 384: each object a reader
11
+ * checks costs one block, so larger blocks fetch more of the file). */
12
+ readonly blockSize?: number;
13
+ /** The first request asks for this many bytes at the end of the file (default 65 536). */
14
+ readonly tail?: number;
15
+ /** The `fetch` to use (default: the global one). */
16
+ readonly fetch?: typeof fetch;
17
+ }
18
+ /**
19
+ * A {@link RangeSource} over a URL, for `Document.openRange`. The first request asks for the
20
+ * last `tail` bytes, which gives the size and the part of the file a reader needs first (the
21
+ * xref is at the end). Every later request sends `If-Range` with the first strong `ETag` (else
22
+ * its `Last-Modified`); a response whose `ETag`, `Last-Modified` or total size differs fails
23
+ * with `source-changed`. A server that ignores
24
+ * `Range` (it answers `200`) is read with that one full download.
25
+ *
26
+ * The server must allow `Range` (across origins: `Access-Control-Allow-Headers: Range` and
27
+ * `Access-Control-Expose-Headers: Content-Range, Content-Length, ETag`) and must not compress
28
+ * the response.
29
+ *
30
+ * @param url - the file.
31
+ * @param options - headers, credentials, signal, block size.
32
+ * @returns the source, once the first request has answered.
33
+ * @throws {@link LaminaPdfError} `fetch-failed` (with `data.status`), `source-changed`.
34
+ */
35
+ export declare function httpRangeSource(url: string | URL, options?: HttpRangeOptions): Promise<RangeSource>;
36
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/source/http.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAS,MAAM,YAAY,CAAC;AAErD,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,kCAAkC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAC1C,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;2EACuE;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAqBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CA0B7G"}
@@ -0,0 +1,211 @@
1
+ // httpRangeSource (L2c): a remote PDF read with HTTP Range requests. Errors never carry the URL
2
+ // (ADR 0026 §4): it may hold tokens.
3
+ import { packageError } from "../errors.js";
4
+ import { WHOLE } from "./range.js";
5
+ /** `bytes start-end/size` → its numbers. */
6
+ function contentRange(header) {
7
+ const m = /^bytes (\d+)-(\d+)\/(\d+)$/.exec(header?.trim() ?? "");
8
+ if (m === null)
9
+ return undefined;
10
+ return { start: Number(m[1]), end: Number(m[2]), size: Number(m[3]) };
11
+ }
12
+ function failed(reason, status, cause) {
13
+ const e = packageError("fetch-failed", "fetching a range of the remote file failed", {
14
+ data: status === undefined ? { reason } : { reason, status },
15
+ });
16
+ if (cause !== undefined)
17
+ Object.defineProperty(e, "cause", { value: cause });
18
+ return e;
19
+ }
20
+ function changed() {
21
+ return packageError("source-changed", "the remote file changed while it was being read");
22
+ }
23
+ /**
24
+ * A {@link RangeSource} over a URL, for `Document.openRange`. The first request asks for the
25
+ * last `tail` bytes, which gives the size and the part of the file a reader needs first (the
26
+ * xref is at the end). Every later request sends `If-Range` with the first strong `ETag` (else
27
+ * its `Last-Modified`); a response whose `ETag`, `Last-Modified` or total size differs fails
28
+ * with `source-changed`. A server that ignores
29
+ * `Range` (it answers `200`) is read with that one full download.
30
+ *
31
+ * The server must allow `Range` (across origins: `Access-Control-Allow-Headers: Range` and
32
+ * `Access-Control-Expose-Headers: Content-Range, Content-Length, ETag`) and must not compress
33
+ * the response.
34
+ *
35
+ * @param url - the file.
36
+ * @param options - headers, credentials, signal, block size.
37
+ * @returns the source, once the first request has answered.
38
+ * @throws {@link LaminaPdfError} `fetch-failed` (with `data.status`), `source-changed`.
39
+ */
40
+ export async function httpRangeSource(url, options = {}) {
41
+ // A whole number of bytes, at least 1 (a fraction would make a malformed Range header).
42
+ const tail = Number.isFinite(options.tail) ? Math.max(1, Math.floor(options.tail ?? 0)) : 65_536;
43
+ const request = rangeRequester(url, options);
44
+ const first = await request(`bytes=-${tail}`, options.signal);
45
+ if (first.status === 200) {
46
+ // No range support: this response is the whole file.
47
+ const whole = new Uint8Array(await first.arrayBuffer());
48
+ // Tagged, so Document.openRange opens these bytes directly instead of copying them again.
49
+ return {
50
+ size: whole.length,
51
+ read: async (offset, length) => whole.slice(offset, offset + length),
52
+ [WHOLE]: whole,
53
+ };
54
+ }
55
+ if (first.status === 416 && /^bytes \*\/0$/.test(first.headers.get("Content-Range")?.trim() ?? "")) {
56
+ // An empty file has no last bytes to send: open it as empty (Lamina PDF then says what it is).
57
+ await first.body?.cancel();
58
+ return { size: 0, read: async () => new Uint8Array() };
59
+ }
60
+ const file = new RangedFile(request, await readProbe(first));
61
+ return {
62
+ size: file.size,
63
+ read: (offset, length, opts) => file.read(offset, length, opts?.signal),
64
+ blockSize: options.blockSize ?? 16_384,
65
+ };
66
+ }
67
+ /** Cancels `res`'s body (nothing will read it) and rejects with `error`. */
68
+ async function discard(res, error) {
69
+ await res.body?.cancel();
70
+ throw error;
71
+ }
72
+ function rangeRequester(url, options) {
73
+ const doFetch = options.fetch ?? fetch;
74
+ return async (range, signal, ifRange) => {
75
+ const headers = new Headers(options.headers);
76
+ headers.set("Range", range);
77
+ if (ifRange !== undefined)
78
+ headers.set("If-Range", ifRange);
79
+ try {
80
+ return await doFetch(url, {
81
+ headers,
82
+ ...(options.credentials === undefined ? {} : { credentials: options.credentials }),
83
+ ...(signal === undefined ? {} : { signal }),
84
+ });
85
+ }
86
+ catch (e) {
87
+ if (signal?.aborted)
88
+ throw signal.reason;
89
+ throw failed("network", undefined, e);
90
+ }
91
+ };
92
+ }
93
+ /** Checks the first answer is a `206` with the file's last bytes, and reads them. */
94
+ async function readProbe(first) {
95
+ if (first.status !== 206) {
96
+ return discard(first, failed("status", first.status));
97
+ }
98
+ const range = contentRange(first.headers.get("Content-Range"));
99
+ if (range === undefined || range.end !== range.size - 1) {
100
+ return discard(first, failed("content-range", 206));
101
+ }
102
+ const tailBytes = new Uint8Array(await first.arrayBuffer());
103
+ if (tailBytes.length !== range.size - range.start)
104
+ throw failed("content-range", 206);
105
+ return {
106
+ size: range.size,
107
+ tailStart: range.start,
108
+ tailBytes,
109
+ etag: first.headers.get("ETag") ?? undefined,
110
+ lastModified: first.headers.get("Last-Modified") ?? undefined,
111
+ };
112
+ }
113
+ /** The reads after the probe: from its tail, by ranged requests, or from one whole download. */
114
+ class RangedFile {
115
+ #request;
116
+ #probe;
117
+ // If-Range needs a strong ETag, else a Last-Modified date; a weak ETag is only compared.
118
+ #ifRange;
119
+ // Set once a ranged request is answered 200: the whole file, downloaded once and shared by
120
+ // every read (reads already in flight cancel their own bodies and wait for it).
121
+ #whole;
122
+ constructor(request, probe) {
123
+ this.#request = request;
124
+ this.#probe = probe;
125
+ const { etag, lastModified } = probe;
126
+ this.#ifRange = etag !== undefined && !etag.startsWith("W/") ? etag : lastModified;
127
+ }
128
+ get size() {
129
+ return this.#probe.size;
130
+ }
131
+ async read(offset, length, signal) {
132
+ const { tailStart, tailBytes } = this.#probe;
133
+ const end = offset + length;
134
+ if (offset >= tailStart)
135
+ return tailBytes.slice(offset - tailStart, end - tailStart);
136
+ if (end <= tailStart)
137
+ return this.#fetchRange(offset, end, signal);
138
+ // Straddles the tail the probe brought: fetch only the part before it.
139
+ const out = new Uint8Array(length);
140
+ out.set(await this.#fetchRange(offset, tailStart, signal));
141
+ out.set(tailBytes.subarray(0, end - tailStart), tailStart - offset);
142
+ return out;
143
+ }
144
+ /** Whether `res` shows a different version than the first response (ETag, then Last-Modified). */
145
+ #differs(res) {
146
+ const { etag, lastModified } = this.#probe;
147
+ const tag = res.headers.get("ETag") ?? undefined;
148
+ if (etag !== undefined && tag !== undefined)
149
+ return tag !== etag;
150
+ const modified = res.headers.get("Last-Modified") ?? undefined;
151
+ return lastModified !== undefined && modified !== undefined && modified !== lastModified;
152
+ }
153
+ /** The bytes `offset..end` from the network (or from the whole file, once there is one). */
154
+ async #fetchRange(offset, end, signal) {
155
+ if (this.#whole !== undefined)
156
+ return (await this.#whole).slice(offset, end);
157
+ const res = await this.#request(`bytes=${offset}-${end - 1}`, signal, this.#ifRange);
158
+ if (this.#differs(res)) {
159
+ return discard(res, changed());
160
+ }
161
+ if (res.status === 200)
162
+ return this.#fromWhole(res, offset, end);
163
+ return this.#fromPartial(res, offset, end);
164
+ }
165
+ /** The server ignored Range (or If-Range found the file changed and sent it whole). */
166
+ async #fromWhole(res, offset, end) {
167
+ if (this.#probe.etag !== undefined && res.headers.get("ETag") === null) {
168
+ return discard(res, changed());
169
+ }
170
+ let whole = this.#whole;
171
+ if (whole === undefined)
172
+ whole = this.#download(res);
173
+ else
174
+ await res.body?.cancel();
175
+ return (await whole).slice(offset, end);
176
+ }
177
+ #download(res) {
178
+ const download = res.arrayBuffer().then((buffer) => {
179
+ const bytes = new Uint8Array(buffer);
180
+ if (bytes.length !== this.#probe.size)
181
+ throw changed();
182
+ return bytes;
183
+ });
184
+ this.#whole = download;
185
+ // A failed or aborted download (its read's signal) must not stick: the next read that
186
+ // gets a 200 starts a new one.
187
+ download.catch(() => {
188
+ if (this.#whole === download)
189
+ this.#whole = undefined;
190
+ });
191
+ return download;
192
+ }
193
+ /** A `206` with exactly the bytes asked for, from the same file. */
194
+ async #fromPartial(res, offset, end) {
195
+ if (res.status !== 206) {
196
+ return discard(res, failed("status", res.status));
197
+ }
198
+ const got = contentRange(res.headers.get("Content-Range"));
199
+ if (got !== undefined && got.size !== this.#probe.size) {
200
+ return discard(res, changed());
201
+ }
202
+ if (got === undefined || got.start !== offset || got.end !== end - 1) {
203
+ return discard(res, failed("content-range", 206));
204
+ }
205
+ const bytes = new Uint8Array(await res.arrayBuffer());
206
+ if (bytes.length !== end - offset)
207
+ throw failed("content-range", 206);
208
+ return bytes;
209
+ }
210
+ }
211
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/source/http.ts"],"names":[],"mappings":"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"}