proton-mail-bridge-client 2.16.2 → 2.17.0

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 (245) hide show
  1. package/README.md +149 -12
  2. package/dist/cli.d.ts +16 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +178 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config-env.d.ts +2 -1
  7. package/dist/config-env.d.ts.map +1 -1
  8. package/dist/config-env.js +24 -0
  9. package/dist/config-env.js.map +1 -1
  10. package/dist/index.d.ts +5 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +180 -11
  13. package/dist/index.js.map +1 -1
  14. package/dist/services/account-manager.d.ts +7 -0
  15. package/dist/services/account-manager.d.ts.map +1 -1
  16. package/dist/services/account-manager.js +59 -0
  17. package/dist/services/account-manager.js.map +1 -1
  18. package/dist/services/audit-service.d.ts +20 -0
  19. package/dist/services/audit-service.d.ts.map +1 -1
  20. package/dist/services/audit-service.js +266 -9
  21. package/dist/services/audit-service.js.map +1 -1
  22. package/dist/services/autoresponder-service.d.ts +35 -6
  23. package/dist/services/autoresponder-service.d.ts.map +1 -1
  24. package/dist/services/autoresponder-service.js +223 -108
  25. package/dist/services/autoresponder-service.js.map +1 -1
  26. package/dist/services/brief-service.d.ts +7 -1
  27. package/dist/services/brief-service.d.ts.map +1 -1
  28. package/dist/services/brief-service.js +19 -5
  29. package/dist/services/brief-service.js.map +1 -1
  30. package/dist/services/category-service.d.ts +91 -0
  31. package/dist/services/category-service.d.ts.map +1 -0
  32. package/dist/services/category-service.js +320 -0
  33. package/dist/services/category-service.js.map +1 -0
  34. package/dist/services/commitment-service.d.ts.map +1 -1
  35. package/dist/services/commitment-service.js +9 -3
  36. package/dist/services/commitment-service.js.map +1 -1
  37. package/dist/services/contact-service.d.ts +60 -0
  38. package/dist/services/contact-service.d.ts.map +1 -0
  39. package/dist/services/contact-service.js +248 -0
  40. package/dist/services/contact-service.js.map +1 -0
  41. package/dist/services/delivery-queue-service.d.ts +4 -0
  42. package/dist/services/delivery-queue-service.d.ts.map +1 -1
  43. package/dist/services/delivery-queue-service.js +12 -2
  44. package/dist/services/delivery-queue-service.js.map +1 -1
  45. package/dist/services/draft-store-service.d.ts.map +1 -1
  46. package/dist/services/draft-store-service.js +3 -2
  47. package/dist/services/draft-store-service.js.map +1 -1
  48. package/dist/services/embedding-service.d.ts +68 -0
  49. package/dist/services/embedding-service.d.ts.map +1 -0
  50. package/dist/services/embedding-service.js +465 -0
  51. package/dist/services/embedding-service.js.map +1 -0
  52. package/dist/services/event-log-service.d.ts +67 -0
  53. package/dist/services/event-log-service.d.ts.map +1 -0
  54. package/dist/services/event-log-service.js +280 -0
  55. package/dist/services/event-log-service.js.map +1 -0
  56. package/dist/services/grant-service.d.ts +84 -0
  57. package/dist/services/grant-service.d.ts.map +1 -0
  58. package/dist/services/grant-service.js +214 -0
  59. package/dist/services/grant-service.js.map +1 -0
  60. package/dist/services/local-index-service.d.ts +18 -1
  61. package/dist/services/local-index-service.d.ts.map +1 -1
  62. package/dist/services/local-index-service.js +54 -4
  63. package/dist/services/local-index-service.js.map +1 -1
  64. package/dist/services/reply-reminder-service.d.ts +4 -0
  65. package/dist/services/reply-reminder-service.d.ts.map +1 -1
  66. package/dist/services/reply-reminder-service.js +22 -2
  67. package/dist/services/reply-reminder-service.js.map +1 -1
  68. package/dist/services/rules-service.d.ts +9 -1
  69. package/dist/services/rules-service.d.ts.map +1 -1
  70. package/dist/services/rules-service.js +8 -3
  71. package/dist/services/rules-service.js.map +1 -1
  72. package/dist/services/sieve-export.d.ts +19 -0
  73. package/dist/services/sieve-export.d.ts.map +1 -0
  74. package/dist/services/sieve-export.js +192 -0
  75. package/dist/services/sieve-export.js.map +1 -0
  76. package/dist/services/simple-imap-service.d.ts +13 -0
  77. package/dist/services/simple-imap-service.d.ts.map +1 -1
  78. package/dist/services/simple-imap-service.js +142 -18
  79. package/dist/services/simple-imap-service.js.map +1 -1
  80. package/dist/services/smtp-service.d.ts +1 -0
  81. package/dist/services/smtp-service.d.ts.map +1 -1
  82. package/dist/services/smtp-service.js +20 -0
  83. package/dist/services/smtp-service.js.map +1 -1
  84. package/dist/services/snooze-service.d.ts +4 -0
  85. package/dist/services/snooze-service.d.ts.map +1 -1
  86. package/dist/services/snooze-service.js +12 -3
  87. package/dist/services/snooze-service.js.map +1 -1
  88. package/dist/services/template-service.d.ts.map +1 -1
  89. package/dist/services/template-service.js +3 -2
  90. package/dist/services/template-service.js.map +1 -1
  91. package/dist/services/triage-plan-service.d.ts +10 -2
  92. package/dist/services/triage-plan-service.d.ts.map +1 -1
  93. package/dist/services/triage-plan-service.js +23 -3
  94. package/dist/services/triage-plan-service.js.map +1 -1
  95. package/dist/tools/attachments.js +1 -1
  96. package/dist/tools/attachments.js.map +1 -1
  97. package/dist/tools/brief.d.ts.map +1 -1
  98. package/dist/tools/brief.js +14 -4
  99. package/dist/tools/brief.js.map +1 -1
  100. package/dist/tools/categories.d.ts +4 -0
  101. package/dist/tools/categories.d.ts.map +1 -0
  102. package/dist/tools/categories.js +269 -0
  103. package/dist/tools/categories.js.map +1 -0
  104. package/dist/tools/commitments.d.ts.map +1 -1
  105. package/dist/tools/commitments.js +6 -2
  106. package/dist/tools/commitments.js.map +1 -1
  107. package/dist/tools/contacts.d.ts +6 -0
  108. package/dist/tools/contacts.d.ts.map +1 -0
  109. package/dist/tools/contacts.js +295 -0
  110. package/dist/tools/contacts.js.map +1 -0
  111. package/dist/tools/context.d.ts +4 -0
  112. package/dist/tools/context.d.ts.map +1 -1
  113. package/dist/tools/context.js +3 -0
  114. package/dist/tools/context.js.map +1 -1
  115. package/dist/tools/definitions.d.ts +333 -5
  116. package/dist/tools/definitions.d.ts.map +1 -1
  117. package/dist/tools/definitions.js +169 -5
  118. package/dist/tools/definitions.js.map +1 -1
  119. package/dist/tools/delegation.d.ts +44 -0
  120. package/dist/tools/delegation.d.ts.map +1 -0
  121. package/dist/tools/delegation.js +180 -0
  122. package/dist/tools/delegation.js.map +1 -0
  123. package/dist/tools/diagnostics.d.ts.map +1 -1
  124. package/dist/tools/diagnostics.js +6 -0
  125. package/dist/tools/diagnostics.js.map +1 -1
  126. package/dist/tools/drafts-support.d.ts +2 -1
  127. package/dist/tools/drafts-support.d.ts.map +1 -1
  128. package/dist/tools/drafts-support.js +14 -6
  129. package/dist/tools/drafts-support.js.map +1 -1
  130. package/dist/tools/drafts.d.ts.map +1 -1
  131. package/dist/tools/drafts.js +22 -1
  132. package/dist/tools/drafts.js.map +1 -1
  133. package/dist/tools/events.d.ts +47 -0
  134. package/dist/tools/events.d.ts.map +1 -0
  135. package/dist/tools/events.js +240 -0
  136. package/dist/tools/events.js.map +1 -0
  137. package/dist/tools/reading.d.ts.map +1 -1
  138. package/dist/tools/reading.js +125 -4
  139. package/dist/tools/reading.js.map +1 -1
  140. package/dist/tools/resources.d.ts +4 -0
  141. package/dist/tools/resources.d.ts.map +1 -1
  142. package/dist/tools/resources.js +9 -0
  143. package/dist/tools/resources.js.map +1 -1
  144. package/dist/tools/rules-runner.d.ts.map +1 -1
  145. package/dist/tools/rules-runner.js +1 -0
  146. package/dist/tools/rules-runner.js.map +1 -1
  147. package/dist/tools/rules.d.ts +9 -0
  148. package/dist/tools/rules.d.ts.map +1 -1
  149. package/dist/tools/rules.js +50 -19
  150. package/dist/tools/rules.js.map +1 -1
  151. package/dist/tools/sending.d.ts.map +1 -1
  152. package/dist/tools/sending.js +4 -0
  153. package/dist/tools/sending.js.map +1 -1
  154. package/dist/tools/style.d.ts +2 -0
  155. package/dist/tools/style.d.ts.map +1 -1
  156. package/dist/tools/style.js +3 -3
  157. package/dist/tools/style.js.map +1 -1
  158. package/dist/tools/templates-and-reminders.d.ts +3 -0
  159. package/dist/tools/templates-and-reminders.d.ts.map +1 -1
  160. package/dist/tools/templates-and-reminders.js +31 -17
  161. package/dist/tools/templates-and-reminders.js.map +1 -1
  162. package/dist/tools/triage.d.ts.map +1 -1
  163. package/dist/tools/triage.js +33 -11
  164. package/dist/tools/triage.js.map +1 -1
  165. package/dist/types/index.d.ts +23 -0
  166. package/dist/types/index.d.ts.map +1 -1
  167. package/dist/utils/account-identity.d.ts.map +1 -1
  168. package/dist/utils/account-identity.js +3 -2
  169. package/dist/utils/account-identity.js.map +1 -1
  170. package/dist/utils/approval.d.ts +133 -0
  171. package/dist/utils/approval.d.ts.map +1 -0
  172. package/dist/utils/approval.js +507 -0
  173. package/dist/utils/approval.js.map +1 -0
  174. package/dist/utils/atomic-write.d.ts +1 -1
  175. package/dist/utils/atomic-write.d.ts.map +1 -1
  176. package/dist/utils/atomic-write.js +10 -3
  177. package/dist/utils/atomic-write.js.map +1 -1
  178. package/dist/utils/commitment-phrases.d.ts.map +1 -1
  179. package/dist/utils/commitment-phrases.js +31 -18
  180. package/dist/utils/commitment-phrases.js.map +1 -1
  181. package/dist/utils/contact-text.d.ts +8 -0
  182. package/dist/utils/contact-text.d.ts.map +1 -0
  183. package/dist/utils/contact-text.js +24 -0
  184. package/dist/utils/contact-text.js.map +1 -0
  185. package/dist/utils/delegation.d.ts +17 -0
  186. package/dist/utils/delegation.d.ts.map +1 -0
  187. package/dist/utils/delegation.js +72 -0
  188. package/dist/utils/delegation.js.map +1 -0
  189. package/dist/utils/file-lock.d.ts.map +1 -1
  190. package/dist/utils/file-lock.js +5 -4
  191. package/dist/utils/file-lock.js.map +1 -1
  192. package/dist/utils/mail-security.d.ts +9 -1
  193. package/dist/utils/mail-security.d.ts.map +1 -1
  194. package/dist/utils/mail-security.js +444 -62
  195. package/dist/utils/mail-security.js.map +1 -1
  196. package/dist/utils/ocr.d.ts +24 -0
  197. package/dist/utils/ocr.d.ts.map +1 -0
  198. package/dist/utils/ocr.js +109 -0
  199. package/dist/utils/ocr.js.map +1 -0
  200. package/dist/utils/office-text-worker.d.ts +2 -0
  201. package/dist/utils/office-text-worker.d.ts.map +1 -0
  202. package/dist/utils/office-text-worker.js +17 -0
  203. package/dist/utils/office-text-worker.js.map +1 -0
  204. package/dist/utils/office-text.d.ts +32 -0
  205. package/dist/utils/office-text.d.ts.map +1 -0
  206. package/dist/utils/office-text.js +540 -0
  207. package/dist/utils/office-text.js.map +1 -0
  208. package/dist/utils/pdf-text-worker.js +2 -2
  209. package/dist/utils/pdf-text-worker.js.map +1 -1
  210. package/dist/utils/pdf-text.d.ts +10 -0
  211. package/dist/utils/pdf-text.d.ts.map +1 -1
  212. package/dist/utils/pdf-text.js +49 -9
  213. package/dist/utils/pdf-text.js.map +1 -1
  214. package/dist/utils/png.d.ts +2 -0
  215. package/dist/utils/png.d.ts.map +1 -0
  216. package/dist/utils/png.js +26 -0
  217. package/dist/utils/png.js.map +1 -0
  218. package/dist/utils/regular-file.d.ts +9 -0
  219. package/dist/utils/regular-file.d.ts.map +1 -0
  220. package/dist/utils/regular-file.js +34 -0
  221. package/dist/utils/regular-file.js.map +1 -0
  222. package/dist/utils/runtime-policy.d.ts.map +1 -1
  223. package/dist/utils/runtime-policy.js +2 -0
  224. package/dist/utils/runtime-policy.js.map +1 -1
  225. package/dist/utils/safe-write.d.ts +8 -0
  226. package/dist/utils/safe-write.d.ts.map +1 -0
  227. package/dist/utils/safe-write.js +46 -0
  228. package/dist/utils/safe-write.js.map +1 -0
  229. package/dist/utils/server-state-paths.d.ts +12 -0
  230. package/dist/utils/server-state-paths.d.ts.map +1 -0
  231. package/dist/utils/server-state-paths.js +69 -0
  232. package/dist/utils/server-state-paths.js.map +1 -0
  233. package/dist/utils/style-profile.d.ts +18 -0
  234. package/dist/utils/style-profile.d.ts.map +1 -1
  235. package/dist/utils/style-profile.js +63 -14
  236. package/dist/utils/style-profile.js.map +1 -1
  237. package/dist/utils/vcard.d.ts +27 -0
  238. package/dist/utils/vcard.d.ts.map +1 -0
  239. package/dist/utils/vcard.js +141 -0
  240. package/dist/utils/vcard.js.map +1 -0
  241. package/dist/utils/zip-reader.d.ts +16 -0
  242. package/dist/utils/zip-reader.d.ts.map +1 -0
  243. package/dist/utils/zip-reader.js +108 -0
  244. package/dist/utils/zip-reader.js.map +1 -0
  245. package/package.json +3 -3
@@ -0,0 +1,540 @@
1
+ import { posix } from "node:path";
2
+ import { Worker } from "node:worker_threads";
3
+ import { openZip, ZipError } from "./zip-reader.js";
4
+ export const OFFICE_MAX_INPUT_BYTES = 20 * 1024 * 1024;
5
+ export const OFFICE_MAX_TEXT_CHARS = 500_000;
6
+ export const OFFICE_EXTRACTION_TIMEOUT_MS = 10_000;
7
+ // What Excel itself allows in one cell; a shared string or cell value is cut here so that one string referenced by
8
+ // many cells cannot multiply into a huge row before the output cap applies.
9
+ const CELL_MAX_CHARS = 32_767;
10
+ // Attribute values are names and relationship ids and targets, never long.
11
+ const ATTRIBUTE_MAX_CHARS = 4096;
12
+ const ZIP_LIMITS = { maxEntries: 5_000, maxEntryBytes: 32 * 1024 * 1024, maxTotalBytes: 64 * 1024 * 1024 };
13
+ export class OfficeTextError extends Error {
14
+ reason;
15
+ constructor(reason, message) {
16
+ super(message);
17
+ this.reason = reason;
18
+ this.name = "OfficeTextError";
19
+ }
20
+ }
21
+ const OFFICE_TYPES = {
22
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "docx",
23
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "xlsx",
24
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation": "pptx",
25
+ };
26
+ const GENERIC_TYPES = new Set(["application/octet-stream", "application/zip", "application/x-zip-compressed"]);
27
+ export function officeKind(content, contentType, filename) {
28
+ const declared = contentType ? OFFICE_TYPES[contentType] : undefined;
29
+ if (declared)
30
+ return declared;
31
+ // Sent as a generic type: trust the extension only when the content really is a ZIP.
32
+ const extension = /\.(docx|xlsx|pptx)$/i.exec(filename ?? "")?.[1]?.toLowerCase();
33
+ const isZip = content.length >= 4 && content.readUInt32LE(0) === 0x04034b50;
34
+ return extension && isZip && (!contentType || GENERIC_TYPES.has(contentType)) ? extension : undefined;
35
+ }
36
+ function assertInputSize(content) {
37
+ if (content.length > OFFICE_MAX_INPUT_BYTES) {
38
+ throw new OfficeTextError("too-large", `The file is larger than ${OFFICE_MAX_INPUT_BYTES / (1024 * 1024)} MB, the limit for document text extraction.`);
39
+ }
40
+ }
41
+ // Each worker can expand a document to tens of MB, so a burst of attachments must not mean a burst of threads: at most
42
+ // two run at once, the rest wait in order, and a long queue is refused instead of growing without bound.
43
+ const MAX_WORKERS = 2;
44
+ const MAX_QUEUED = 16;
45
+ const WORKER_LIMITS = { maxOldGenerationSizeMb: 256, maxYoungGenerationSizeMb: 32 };
46
+ let running = 0;
47
+ const waiting = [];
48
+ function runInWorker(content, kind, maxChars, timeoutMs) {
49
+ return new Promise((resolve, reject) => {
50
+ // The worker gets a copy: the caller keeps its buffer.
51
+ const worker = new Worker(new URL("./office-text-worker.js", import.meta.url), {
52
+ workerData: { content: new Uint8Array(content), kind, maxChars },
53
+ resourceLimits: WORKER_LIMITS,
54
+ });
55
+ let settled = false;
56
+ const finish = (action) => {
57
+ if (settled)
58
+ return;
59
+ settled = true;
60
+ clearTimeout(timer);
61
+ void worker.terminate();
62
+ action();
63
+ };
64
+ const timer = setTimeout(() => finish(() => reject(new OfficeTextError("timeout", "Reading the document took too long and was stopped."))), timeoutMs);
65
+ timer.unref?.();
66
+ worker.once("message", (message) => finish(() => (message.ok ? resolve(message.result) : reject(new OfficeTextError(message.reason, message.message)))));
67
+ worker.once("error", () => finish(() => reject(new OfficeTextError("invalid", "The document could not be read; the file looks damaged."))));
68
+ worker.once("exit", (code) => finish(() => reject(new OfficeTextError("invalid", `The document reader stopped unexpectedly (exit code ${code}).`))));
69
+ });
70
+ }
71
+ /**
72
+ * The same extraction in a worker thread, so a heavy file cannot stall the server's event loop, with a hard time limit
73
+ * (the worker is terminated). The parse itself is extractOfficeText; the worker runs it inside office-text-worker.js.
74
+ * The limit counts from the start of the job, not from the wait for a free worker.
75
+ */
76
+ export async function extractOfficeTextAsync(content, kind, options = {}) {
77
+ assertInputSize(content);
78
+ const timeoutMs = options.timeoutMs ?? OFFICE_EXTRACTION_TIMEOUT_MS;
79
+ if (running >= MAX_WORKERS) {
80
+ if (waiting.length >= MAX_QUEUED)
81
+ throw new OfficeTextError("busy", "Too many documents are being read at the moment; try again in a few seconds.");
82
+ // A finishing job hands its slot straight to the next one, so `running` stays at the limit.
83
+ await new Promise((resolve) => waiting.push(resolve));
84
+ }
85
+ else {
86
+ running++;
87
+ }
88
+ try {
89
+ return await runInWorker(content, kind, options.maxChars, timeoutMs);
90
+ }
91
+ finally {
92
+ const next = waiting.shift();
93
+ if (next)
94
+ next();
95
+ else
96
+ running--;
97
+ }
98
+ }
99
+ export function extractOfficeText(content, kind, options = {}) {
100
+ assertInputSize(content);
101
+ const maxChars = options.maxChars ?? OFFICE_MAX_TEXT_CHARS;
102
+ const sink = new TextSink(maxChars);
103
+ try {
104
+ const zip = openZip(content, ZIP_LIMITS);
105
+ if (kind === "docx")
106
+ docxText(zip, sink);
107
+ else if (kind === "xlsx")
108
+ xlsxText(zip, sink);
109
+ else
110
+ pptxText(zip, sink);
111
+ }
112
+ catch (error) {
113
+ if (error instanceof OfficeTextError)
114
+ throw error;
115
+ if (error instanceof ZipError)
116
+ throw new OfficeTextError(error.reason, error.message);
117
+ throw new OfficeTextError("invalid", `The document could not be read; the file looks damaged.`);
118
+ }
119
+ // Line by line, not /[ \t]+\n/: that pattern is quadratic over a long run of spaces.
120
+ const text = sink
121
+ .text()
122
+ .split("\n")
123
+ .map((line) => line.trimEnd())
124
+ .join("\n")
125
+ .replace(/\n{3,}/g, "\n\n")
126
+ .trim();
127
+ if (!text)
128
+ throw new OfficeTextError("empty", "The document contains no text.");
129
+ return { text, format: kind, truncated: sink.truncated };
130
+ }
131
+ class TextSink {
132
+ max;
133
+ parts = [];
134
+ length = 0;
135
+ truncated = false;
136
+ constructor(max) {
137
+ this.max = max;
138
+ }
139
+ add(value) {
140
+ if (this.truncated || !value)
141
+ return;
142
+ const room = this.max - this.length;
143
+ if (value.length > room) {
144
+ this.parts.push(value.slice(0, room));
145
+ this.length = this.max;
146
+ this.truncated = true;
147
+ return;
148
+ }
149
+ this.parts.push(value);
150
+ this.length += value.length;
151
+ }
152
+ /** How many more characters fit; what is decoded or collected from here on needs no more than this. */
153
+ get room() {
154
+ return this.max - this.length;
155
+ }
156
+ text() {
157
+ return this.parts.join("");
158
+ }
159
+ }
160
+ function requirePart(zip, name) {
161
+ const data = zip.read(name);
162
+ if (!data)
163
+ throw new OfficeTextError("invalid", `The document is missing its ${name} part.`);
164
+ return data.toString("utf8");
165
+ }
166
+ function localName(name) {
167
+ return name.slice(name.indexOf(":") + 1);
168
+ }
169
+ /** One linear pass over the document; `stop` ends it early (the text limit was reached). */
170
+ function scanXml(xml, handlers, stop = () => false) {
171
+ let i = 0;
172
+ while (i < xml.length && !stop()) {
173
+ const lt = xml.indexOf("<", i);
174
+ if (lt === -1) {
175
+ handlers.text?.(xml.slice(i));
176
+ return;
177
+ }
178
+ if (lt > i)
179
+ handlers.text?.(xml.slice(i, lt));
180
+ if (xml.startsWith("<!--", lt)) {
181
+ const end = xml.indexOf("-->", lt + 4);
182
+ if (end === -1)
183
+ return;
184
+ i = end + 3;
185
+ continue;
186
+ }
187
+ if (xml.startsWith("<![CDATA[", lt)) {
188
+ const end = xml.indexOf("]]>", lt + 9);
189
+ if (end === -1)
190
+ return;
191
+ // CDATA is literal: escaped so that decoding it later gives back exactly these characters.
192
+ handlers.text?.(xml.slice(lt + 9, end).replace(/&/g, "&amp;"));
193
+ i = end + 3;
194
+ continue;
195
+ }
196
+ if (xml.startsWith("<!", lt)) {
197
+ throw new OfficeTextError("unsupported", "The document contains a DTD declaration, which is not read for safety.");
198
+ }
199
+ if (xml.startsWith("<?", lt)) {
200
+ const end = xml.indexOf("?>", lt + 2);
201
+ if (end === -1)
202
+ return;
203
+ i = end + 2;
204
+ continue;
205
+ }
206
+ // The tag ends at the first '>' outside a quoted attribute value.
207
+ let j = lt + 1;
208
+ let quote = 0;
209
+ for (; j < xml.length; j += 1) {
210
+ const c = xml.charCodeAt(j);
211
+ if (quote) {
212
+ if (c === quote)
213
+ quote = 0;
214
+ }
215
+ else if (c === 34 || c === 39) {
216
+ quote = c;
217
+ }
218
+ else if (c === 62) {
219
+ break;
220
+ }
221
+ }
222
+ if (j >= xml.length)
223
+ return;
224
+ const inner = xml.slice(lt + 1, j);
225
+ i = j + 1;
226
+ if (inner.startsWith("/")) {
227
+ handlers.close?.(localName(inner.slice(1).trim()));
228
+ continue;
229
+ }
230
+ const selfClosing = inner.endsWith("/");
231
+ const body = selfClosing ? inner.slice(0, -1) : inner;
232
+ let nameEnd = 0;
233
+ while (nameEnd < body.length && !isXmlSpace(body.charCodeAt(nameEnd)))
234
+ nameEnd += 1;
235
+ const local = localName(body.slice(0, nameEnd));
236
+ handlers.open?.(local, body.slice(nameEnd));
237
+ if (selfClosing)
238
+ handlers.close?.(local);
239
+ }
240
+ }
241
+ function isXmlSpace(c) {
242
+ return c === 32 || c === 9 || c === 10 || c === 13;
243
+ }
244
+ /** Attributes as name → value, by a single scan. Values are decoded. */
245
+ function parseAttributes(attrs) {
246
+ const out = new Map();
247
+ let i = 0;
248
+ while (i < attrs.length) {
249
+ while (i < attrs.length && isXmlSpace(attrs.charCodeAt(i)))
250
+ i += 1;
251
+ const nameStart = i;
252
+ while (i < attrs.length && attrs[i] !== "=" && !isXmlSpace(attrs.charCodeAt(i)))
253
+ i += 1;
254
+ const name = attrs.slice(nameStart, i);
255
+ while (i < attrs.length && isXmlSpace(attrs.charCodeAt(i)))
256
+ i += 1;
257
+ if (attrs[i] !== "=") {
258
+ i += 1;
259
+ continue;
260
+ }
261
+ i += 1;
262
+ while (i < attrs.length && isXmlSpace(attrs.charCodeAt(i)))
263
+ i += 1;
264
+ const quote = attrs[i];
265
+ if (quote !== '"' && quote !== "'")
266
+ break;
267
+ const end = attrs.indexOf(quote, i + 1);
268
+ if (end === -1)
269
+ break;
270
+ if (name && !out.has(name))
271
+ out.set(name, decodeXmlText(attrs.slice(i + 1, end), ATTRIBUTE_MAX_CHARS));
272
+ i = end + 1;
273
+ }
274
+ return out;
275
+ }
276
+ /** The relationship id of an element: the namespaced `…:id` attribute (r:id), not a plain `id`. */
277
+ function relationshipId(attributes) {
278
+ for (const [name, value] of attributes)
279
+ if (name.endsWith(":id"))
280
+ return value;
281
+ return undefined;
282
+ }
283
+ const ENTITY = /&(?:#x([0-9a-fA-F]{1,6})|#([0-9]{1,7})|(amp|lt|gt|quot|apos));/g;
284
+ const NAMED = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
285
+ // Control characters other than tab and newline, and the C1 range: never part of text a person wrote. Left in, they
286
+ // would only pad the result (a run of &#1; is 4 bytes in the file and 6 in the JSON) or hide words from a reader.
287
+ const CONTROL = /[\u0000-\u0008\u000b-\u001f\u007f-\u009f]/g;
288
+ /**
289
+ * Entities resolved, control characters dropped, and the result cut at `max` characters. The cut is made while
290
+ * decoding, not after: 30 MB of &amp; would otherwise be decoded in full only to be thrown away.
291
+ */
292
+ export function decodeXmlText(raw, max = Number.POSITIVE_INFINITY) {
293
+ const out = [];
294
+ let length = 0;
295
+ const push = (text) => {
296
+ for (let at = 0; at < text.length && length < max;) {
297
+ // Chunked, so that a long run of control characters cannot use up the cap and hide what follows it.
298
+ const step = Math.max(4096, max - length);
299
+ const kept = text.slice(at, at + step).replace(CONTROL, "");
300
+ at += step;
301
+ const piece = kept.length > max - length ? kept.slice(0, max - length) : kept;
302
+ if (piece)
303
+ out.push(piece);
304
+ length += piece.length;
305
+ }
306
+ };
307
+ let last = 0;
308
+ ENTITY.lastIndex = 0;
309
+ for (let match = ENTITY.exec(raw); match && length < max; match = ENTITY.exec(raw)) {
310
+ push(raw.slice(last, match.index));
311
+ last = ENTITY.lastIndex;
312
+ if (match[3]) {
313
+ push(NAMED[match[3]]);
314
+ continue;
315
+ }
316
+ const code = match[1] ? Number.parseInt(match[1], 16) : Number(match[2]);
317
+ push(code > 0x10ffff || (code >= 0xd800 && code <= 0xdfff) || code === 0 ? "�" : String.fromCodePoint(code));
318
+ }
319
+ push(raw.slice(last));
320
+ return out.join("");
321
+ }
322
+ /** Relationship id → part name, resolved against `base` and kept inside the archive. */
323
+ function readRelationships(zip, relsName, base) {
324
+ const map = new Map();
325
+ const data = zip.read(relsName);
326
+ if (!data)
327
+ return map;
328
+ scanXml(data.toString("utf8"), {
329
+ open(local, attrs) {
330
+ if (local !== "Relationship")
331
+ return;
332
+ const attributes = parseAttributes(attrs);
333
+ const id = attributes.get("Id");
334
+ const target = attributes.get("Target");
335
+ if (!id || !target || attributes.get("TargetMode") === "External")
336
+ return;
337
+ const resolved = posix.normalize(target.startsWith("/") ? target.slice(1) : posix.join(base, target));
338
+ if (resolved.startsWith("../") || resolved === ".." || resolved.startsWith("/"))
339
+ return;
340
+ map.set(id, resolved);
341
+ },
342
+ });
343
+ return map;
344
+ }
345
+ // ---- DOCX ------------------------------------------------------------------------------------------------------
346
+ function docxText(zip, sink) {
347
+ let inText = false;
348
+ let runDepth = 0;
349
+ scanXml(requirePart(zip, "word/document.xml"), {
350
+ open(local) {
351
+ if (local === "t")
352
+ inText = true;
353
+ else if (local === "r")
354
+ runDepth += 1;
355
+ else if (runDepth > 0 && local === "tab")
356
+ sink.add("\t");
357
+ else if (runDepth > 0 && (local === "br" || local === "cr"))
358
+ sink.add("\n");
359
+ },
360
+ close(local) {
361
+ if (local === "t")
362
+ inText = false;
363
+ else if (local === "r")
364
+ runDepth = Math.max(0, runDepth - 1);
365
+ else if (local === "p" || local === "tr")
366
+ sink.add("\n");
367
+ else if (local === "tc")
368
+ sink.add("\t");
369
+ },
370
+ text(raw) {
371
+ if (inText)
372
+ sink.add(decodeXmlText(raw, sink.room + 1));
373
+ },
374
+ }, () => sink.truncated);
375
+ }
376
+ // ---- XLSX ------------------------------------------------------------------------------------------------------
377
+ function xlsxText(zip, sink) {
378
+ const sheets = [];
379
+ scanXml(requirePart(zip, "xl/workbook.xml"), {
380
+ open(local, attrs) {
381
+ if (local !== "sheet")
382
+ return;
383
+ const attributes = parseAttributes(attrs);
384
+ sheets.push({ name: attributes.get("name") ?? `Sheet ${sheets.length + 1}`, rel: relationshipId(attributes) });
385
+ },
386
+ });
387
+ const rels = readRelationships(zip, "xl/_rels/workbook.xml.rels", "xl");
388
+ const shared = readSharedStrings(zip);
389
+ for (const sheet of sheets) {
390
+ if (sink.truncated)
391
+ return;
392
+ const part = sheet.rel ? rels.get(sheet.rel) : undefined;
393
+ const data = part ? zip.read(part) : undefined;
394
+ sink.add(`--- Sheet: ${sheet.name} ---\n`);
395
+ if (!data) {
396
+ sink.add("\n");
397
+ continue;
398
+ }
399
+ let cells = [];
400
+ let rowChars = 0;
401
+ let type;
402
+ let value = "";
403
+ let inValue = false;
404
+ let inInline = false;
405
+ let inInlineText = false;
406
+ scanXml(data.toString("utf8"), {
407
+ open(local, attrs) {
408
+ if (local === "row")
409
+ [cells, rowChars] = [[], 0];
410
+ else if (local === "c") {
411
+ type = parseAttributes(attrs).get("t");
412
+ value = "";
413
+ }
414
+ else if (local === "v")
415
+ inValue = true;
416
+ else if (local === "is")
417
+ inInline = true;
418
+ else if (local === "t" && inInline)
419
+ inInlineText = true;
420
+ },
421
+ close(local) {
422
+ if (local === "v")
423
+ inValue = false;
424
+ else if (local === "is")
425
+ inInline = false;
426
+ else if (local === "t")
427
+ inInlineText = false;
428
+ else if (local === "c") {
429
+ const cell = cellValue(type, value, shared);
430
+ // Past the room left in the output nothing more of the row can be used: stop collecting it.
431
+ if (cell && rowChars <= sink.room) {
432
+ cells.push(cell);
433
+ rowChars += cell.length + 1;
434
+ }
435
+ }
436
+ else if (local === "row" && cells.length > 0) {
437
+ sink.add(`${cells.join("\t")}\n`);
438
+ }
439
+ },
440
+ text(raw) {
441
+ if ((inValue || inInlineText) && value.length < CELL_MAX_CHARS)
442
+ value += decodeXmlText(raw, CELL_MAX_CHARS - value.length);
443
+ },
444
+ }, () => sink.truncated);
445
+ sink.add("\n");
446
+ }
447
+ }
448
+ function cellValue(type, value, shared) {
449
+ const trimmed = value.trim();
450
+ if (type === "s") {
451
+ const index = Number(trimmed);
452
+ return Number.isInteger(index) && index >= 0 && index < shared.length ? shared[index] : "";
453
+ }
454
+ if (type === "b")
455
+ return trimmed === "1" ? "TRUE" : trimmed === "0" ? "FALSE" : trimmed;
456
+ return type === "inlineStr" || type === "str" ? value : trimmed;
457
+ }
458
+ function readSharedStrings(zip) {
459
+ const data = zip.read("xl/sharedStrings.xml");
460
+ if (!data)
461
+ return [];
462
+ const strings = [];
463
+ let current = "";
464
+ let inItem = false;
465
+ let inText = false;
466
+ let phoneticDepth = 0;
467
+ scanXml(data.toString("utf8"), {
468
+ open(local) {
469
+ if (local === "si") {
470
+ inItem = true;
471
+ current = "";
472
+ }
473
+ else if (local === "rPh")
474
+ phoneticDepth += 1;
475
+ else if (local === "t" && inItem && phoneticDepth === 0)
476
+ inText = true;
477
+ },
478
+ close(local) {
479
+ if (local === "si") {
480
+ strings.push(current);
481
+ inItem = false;
482
+ }
483
+ else if (local === "rPh")
484
+ phoneticDepth = Math.max(0, phoneticDepth - 1);
485
+ else if (local === "t")
486
+ inText = false;
487
+ },
488
+ text(raw) {
489
+ if (inText && current.length < CELL_MAX_CHARS)
490
+ current += decodeXmlText(raw, CELL_MAX_CHARS - current.length);
491
+ },
492
+ });
493
+ return strings;
494
+ }
495
+ // ---- PPTX ------------------------------------------------------------------------------------------------------
496
+ function pptxText(zip, sink) {
497
+ const slideRels = [];
498
+ scanXml(requirePart(zip, "ppt/presentation.xml"), {
499
+ open(local, attrs) {
500
+ if (local !== "sldId")
501
+ return;
502
+ const rel = relationshipId(parseAttributes(attrs));
503
+ if (rel)
504
+ slideRels.push(rel);
505
+ },
506
+ });
507
+ const rels = readRelationships(zip, "ppt/_rels/presentation.xml.rels", "ppt");
508
+ slideRels.forEach((rel, index) => {
509
+ if (sink.truncated)
510
+ return;
511
+ const part = rels.get(rel);
512
+ const data = part ? zip.read(part) : undefined;
513
+ sink.add(`--- Slide ${index + 1} of ${slideRels.length} ---\n`);
514
+ if (!data) {
515
+ sink.add("\n");
516
+ return;
517
+ }
518
+ let inText = false;
519
+ scanXml(data.toString("utf8"), {
520
+ open(local) {
521
+ if (local === "t")
522
+ inText = true;
523
+ else if (local === "br")
524
+ sink.add("\n");
525
+ },
526
+ close(local) {
527
+ if (local === "t")
528
+ inText = false;
529
+ else if (local === "p")
530
+ sink.add("\n");
531
+ },
532
+ text(raw) {
533
+ if (inText)
534
+ sink.add(decodeXmlText(raw, sink.room + 1));
535
+ },
536
+ }, () => sink.truncated);
537
+ sink.add("\n");
538
+ });
539
+ }
540
+ //# sourceMappingURL=office-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"office-text.js","sourceRoot":"","sources":["../../src/utils/office-text.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { parentPort, workerData } from "node:worker_threads";
2
2
  import { extractPdfTextDirect, PdfTextError } from "./pdf-text.js";
3
3
  // Runs one PDF parse for extractPdfText and reports the outcome as a plain message.
4
- const { content, maxPages, timeoutMs } = workerData;
4
+ const { content, maxPages, timeoutMs, ocrPages } = workerData;
5
5
  try {
6
- const result = await extractPdfTextDirect(Buffer.from(content), { maxPages, timeoutMs });
6
+ const result = await extractPdfTextDirect(Buffer.from(content), { maxPages, timeoutMs, ocrPages });
7
7
  parentPort?.postMessage({ ok: true, result });
8
8
  }
9
9
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-text-worker.js","sourceRoot":"","sources":["../../src/utils/pdf-text-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnE,oFAAoF;AACpF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,UAA0E,CAAC;AAEpH,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IACzF,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAChD,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,KAAK,GAAG,KAAK,YAAY,YAAY,CAAC;IAC5C,UAAU,EAAE,WAAW,CAAC;QACtB,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACxC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAChE,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"pdf-text-worker.js","sourceRoot":"","sources":["../../src/utils/pdf-text-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnE,oFAAoF;AACpF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,UAA4F,CAAC;AAEhJ,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnG,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAChD,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,KAAK,GAAG,KAAK,YAAY,YAAY,CAAC;IAC5C,UAAU,EAAE,WAAW,CAAC;QACtB,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACxC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAChE,CAAC,CAAC;AACL,CAAC"}
@@ -4,6 +4,8 @@ export declare const PDF_EXTRACTION_TIMEOUT_MS = 30000;
4
4
  export interface PdfTextOptions {
5
5
  maxPages?: number;
6
6
  timeoutMs?: number;
7
+ /** For OCR: up to this many pages without text hand back their largest image as a PNG. 0 or unset: none. */
8
+ ocrPages?: number;
7
9
  }
8
10
  export interface PdfTextResult {
9
11
  text: string;
@@ -12,7 +14,15 @@ export interface PdfTextResult {
12
14
  /** Pages past maxPages that were not read. 0 when the whole document was read. */
13
15
  omittedPages: number;
14
16
  truncated: boolean;
17
+ /** Only with ocrPages: the text of each read page, and the images of pages that had none. */
18
+ pageTexts?: string[];
19
+ pageImages?: Array<{
20
+ page: number;
21
+ png: Uint8Array;
22
+ }>;
15
23
  }
24
+ /** The page-by-page text with its markers, and a note when pages past maxPages were left out. */
25
+ export declare function formatPdfPages(pageTexts: string[], totalPages: number, maxPages: number): string;
16
26
  /** A PDF that cannot be read as text, with a message meant for the user, not a stack trace. */
17
27
  export declare class PdfTextError extends Error {
18
28
  readonly reason: "encrypted" | "invalid" | "no-text-layer" | "timeout";
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-text.d.ts","sourceRoot":"","sources":["../../src/utils/pdf-text.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,+FAA+F;AAC/F,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS;IADxE,YACW,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,EACtE,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAK9F;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA0B1G;AAED,sEAAsE;AACtE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyE7H"}
1
+ {"version":3,"file":"pdf-text.d.ts","sourceRoot":"","sources":["../../src/utils/pdf-text.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAKhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4GAA4G;IAC5G,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;CACvD;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAShG;AAED,+FAA+F;AAC/F,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS;IADxE,YACW,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,EACtE,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAK9F;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA0B1G;AAED,sEAAsE;AACtE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkF7H"}