albex 0.6.0 → 0.7.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.
- package/CHANGELOG.md +223 -0
- package/README.md +84 -30
- package/dist/_generated/inline-wasm.d.ts +2 -0
- package/dist/_generated/inline-wasm.d.ts.map +1 -0
- package/dist/_generated/inline-wasm.js +9 -0
- package/dist/_generated/inline-wasm.js.map +1 -0
- package/dist/albex-worker.d.ts +65 -2
- package/dist/albex-worker.d.ts.map +1 -1
- package/dist/albex-worker.js +98 -21
- package/dist/albex-worker.js.map +1 -1
- package/dist/albex.d.ts +250 -42
- package/dist/albex.d.ts.map +1 -1
- package/dist/albex.js +492 -120
- package/dist/albex.js.map +1 -1
- package/dist/errors.d.ts +35 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +38 -3
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/inline.d.ts +10 -0
- package/dist/inline.d.ts.map +1 -0
- package/dist/inline.js +17 -0
- package/dist/inline.js.map +1 -0
- package/dist/persistence.js +2 -2
- package/dist/pool/coordinator.d.ts +14 -6
- package/dist/pool/coordinator.d.ts.map +1 -1
- package/dist/pool/coordinator.js +65 -28
- package/dist/pool/coordinator.js.map +1 -1
- package/dist/profile.js +2 -2
- package/dist/resource-manager.js +2 -2
- package/dist/tiered-store.js +2 -2
- package/dist/wasm-bindings.d.ts +50 -1
- package/dist/wasm-bindings.d.ts.map +1 -1
- package/dist/wasm-bindings.js +20 -12
- package/dist/wasm-bindings.js.map +1 -1
- package/dist/worker-protocol.d.ts +23 -2
- package/dist/worker-protocol.d.ts.map +1 -1
- package/dist/worker-protocol.js +2 -2
- package/dist/worker-runtime.js +17 -2
- package/dist/worker-runtime.js.map +1 -1
- package/package.json +14 -9
- package/src/_generated/inline-wasm.ts +9 -0
- package/src/albex-worker.ts +103 -18
- package/src/albex.ts +3053 -2524
- package/src/errors.ts +49 -4
- package/src/index.ts +81 -0
- package/src/inline.ts +9 -0
- package/src/pool/coordinator.ts +61 -34
- package/src/wasm-bindings.ts +78 -12
- package/src/worker-protocol.ts +12 -2
- package/src/worker-runtime.ts +16 -1
- package/wasm/pkg/albex_pdf.wasm +0 -0
- package/wasm/pkg/albex_wasm.wasm +0 -0
- package/wasm/pkg/albex_wasm_bg.wasm +0 -0
- package/wasm/pkg/albex_wasm_simd.wasm +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-protocol.d.ts","sourceRoot":"","sources":["../src/worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-protocol.d.ts","sourceRoot":"","sources":["../src/worker-protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/worker-protocol.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* albex v0.
|
|
3
|
-
*
|
|
2
|
+
* albex v0.7.0
|
|
3
|
+
* Local full-text search for documents — runs entirely in the browser, no server, no upload. Zero-config: the WASM core is embedded (~19 KB gzipped), so `npm install albex` then `new AlbexEngine()` works in any bundler, esbuild/Angular included.
|
|
4
4
|
* (c) 2026 RafaCalRob
|
|
5
5
|
* @license MIT
|
|
6
6
|
* https://github.com/RafaCalRob/Albex#readme
|
package/dist/worker-runtime.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* albex v0.
|
|
3
|
-
*
|
|
2
|
+
* albex v0.7.0
|
|
3
|
+
* Local full-text search for documents — runs entirely in the browser, no server, no upload. Zero-config: the WASM core is embedded (~19 KB gzipped), so `npm install albex` then `new AlbexEngine()` works in any bundler, esbuild/Angular included.
|
|
4
4
|
* (c) 2026 RafaCalRob
|
|
5
5
|
* @license MIT
|
|
6
6
|
* https://github.com/RafaCalRob/Albex#readme
|
|
@@ -39,8 +39,18 @@ async function dispatch(op) {
|
|
|
39
39
|
}
|
|
40
40
|
case 'search':
|
|
41
41
|
return ensureEngine().search(op.query, op.options);
|
|
42
|
+
case 'listChunks':
|
|
43
|
+
return ensureEngine().listChunks(op.docId);
|
|
42
44
|
case 'removeDocument':
|
|
43
45
|
return ensureEngine().removeDocument(op.id);
|
|
46
|
+
case 'replaceDocument': {
|
|
47
|
+
// Same File-like wrapping as indexFile; the engine's replaceDocument
|
|
48
|
+
// handles remove + re-index + auto-compact under its own lock.
|
|
49
|
+
const file = new File([op.buffer], op.fileName);
|
|
50
|
+
return ensureEngine().replaceDocument(op.name, file);
|
|
51
|
+
}
|
|
52
|
+
case 'takeDiagnostics':
|
|
53
|
+
return ensureEngine().takeDiagnostics();
|
|
44
54
|
case 'compact':
|
|
45
55
|
ensureEngine().compact();
|
|
46
56
|
return undefined;
|
|
@@ -92,6 +102,11 @@ async function handle(req) {
|
|
|
92
102
|
name: e.name ?? 'Error',
|
|
93
103
|
kind: err instanceof AlbexError ? err.kind : undefined,
|
|
94
104
|
message: e.message ?? String(err),
|
|
105
|
+
// Capacity metadata (which pool + its runtime limit) — plain data,
|
|
106
|
+
// survives structuredClone, lets the main side rehydrate a full
|
|
107
|
+
// AlbexCapacityError.
|
|
108
|
+
limit: typeof e.limit === 'string' ? e.limit : undefined,
|
|
109
|
+
max: typeof e.max === 'number' ? e.max : undefined,
|
|
95
110
|
},
|
|
96
111
|
};
|
|
97
112
|
self.postMessage(res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-runtime.js","sourceRoot":"","sources":["../src/worker-runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"worker-runtime.js","sourceRoot":"","sources":["../src/worker-runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "albex",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Local full-text search for documents — runs entirely in the browser, no server, no upload. Zero-config: the WASM core is embedded (~19 KB gzipped), so `npm install albex` then `new AlbexEngine()` works in any bundler, esbuild/Angular included.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/
|
|
7
|
-
"module": "./dist/
|
|
8
|
-
"types": "./dist/
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"import": "./dist/
|
|
12
|
-
"types": "./dist/
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./inline": {
|
|
15
|
+
"import": "./dist/inline.js",
|
|
16
|
+
"types": "./dist/inline.d.ts"
|
|
13
17
|
},
|
|
14
18
|
"./worker": {
|
|
15
19
|
"import": "./dist/albex-worker.js",
|
|
@@ -30,7 +34,8 @@
|
|
|
30
34
|
"./tiered": {
|
|
31
35
|
"import": "./dist/tiered-store.js",
|
|
32
36
|
"types": "./dist/tiered-store.d.ts"
|
|
33
|
-
}
|
|
37
|
+
},
|
|
38
|
+
"./wasm/pkg/*.wasm": "./wasm/pkg/*.wasm"
|
|
34
39
|
},
|
|
35
40
|
"files": [
|
|
36
41
|
"dist/",
|
|
@@ -41,7 +46,7 @@
|
|
|
41
46
|
"LICENSE"
|
|
42
47
|
],
|
|
43
48
|
"scripts": {
|
|
44
|
-
"build": "tsc && node scripts/banner.mjs",
|
|
49
|
+
"build": "node scripts/gen-inline.mjs && tsc && node scripts/banner.mjs",
|
|
45
50
|
"prepublishOnly": "npm run build:all && npm test",
|
|
46
51
|
"build:wasm": "node scripts/build-wasm.mjs && node scripts/wasm-banner.mjs",
|
|
47
52
|
"build:wasm:baseline": "node scripts/build-wasm.mjs --no-simd && node scripts/wasm-banner.mjs",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/gen-inline.mjs — DO NOT EDIT.
|
|
2
|
+
// Source: wasm/pkg/albex_wasm_bg.wasm (baseline core, no SIMD).
|
|
3
|
+
// Regenerated on every `npm run build`. 47205 raw bytes →
|
|
4
|
+
// 62940 base64 chars (~61 KB text, ~46 KB raw).
|
|
5
|
+
/* eslint-disable */
|
|
6
|
+
// Typed as `string` (not the literal) so the emitted .d.ts stays a few bytes
|
|
7
|
+
// instead of inlining the whole base64 blob as a literal type.
|
|
8
|
+
export const ALBEX_WASM_BASE64: string =
|
|
9
|
+
'AGFzbQEAAAABRwxgBX9/f39/AGACf38AYAR/f39/AGADf39/AGACf38Bf2ABfwF/YAF/AGAAAGADf39/AX9gAAF/YAR/f39/AX9gA35/fwF+A60BqwEAAQIDBAECBAMDAwMCAwMDAQMDAgQFAQMBAQEBBgYBAQEBBgcFBQcDAQgDBQEDBwYGBgYGBgYGBQkECAUJCQkFBQUHCgcHBgcGBgkGBgUBBQUBBwkJBgYBBQMGBwcHBgYGBgkJCgQDCQkFBgIBBQkJCQkJCQkJBQUFBQUFBQQEBQUJCAkJCQkJCQkJCQkGBwUFBQUEBAQIBQkFBQcJBAsBAQkBBQYJBgYGBwgFAwEAEgYZA38BQYCAwAALfwBBgMTFAAt/AEH6w8UACwfJC1YGbWVtb3J5AgALX19oZWFwX2Jhc2UDAQlnZXRCdWZmZXIANwphYmlWZXJzaW9uADgMcHJlcGFyZVF1ZXJ5ADsMZ2V0UXVlcnlLaW5kADwTZ2V0UXVlcnlCcmFuY2hDb3VudAA9F2dldFF1ZXJ5VHJ1bmNhdGlvbkZsYWdzAD4VZ2V0UXVlcnlCcmFuY2hQYXR0ZXJuAD8Rc2VsZWN0UXVlcnlCcmFuY2gAQApzZXRQYXR0ZXJuAEEQaW5pdFdpdGhDYXBhY2l0eQBDBGluaXQARAloYXNoQmVnaW4ARQhoYXNoRmVlZABGCmhhc2hGaW5pc2gARw9zZXREb2N1bWVudE5hbWUASBZzZXREb2N1bWVudENvbnRlbnRIYXNoAEkNYmVnaW5Eb2N1bWVudABKDGZlZWRYbWxCeXRlcwBLC2VuZERvY3VtZW50AFMJYmVnaW5YbHN4AFQNZmVlZFhsc3hCeXRlcwBVCGZlZWRUZXh0AFoOZmx1c2hQYXJhZ3JhcGgAWwxzZXRNYXhFcnJvcnMAXgxzZXRUaHJlc2hvbGQAXw1zZXRNYXhSZXN1bHRzAGALc2V0TGFuZ3VhZ2UAYRFnZXRQYXR0ZXJuQmxvb21MbwBiEWdldFBhdHRlcm5CbG9vbUhpAGMGc2VhcmNoAGcLc2VhcmNoQmVnaW4AaAtzZWFyY2hTbGljZQBpD2dldFNlYXJjaEN1cnNvcgBuDmdldFNlYXJjaFRvdGFsAG8SZ2V0U3RhdEJsb29tVGVzdGVkAHASZ2V0U3RhdEJsb29tUGFzc2VkAHETZ2V0U3RhdEJpdGFwTWF0Y2hlZAByDWdldFJlc3VsdHNQdHIAcw9nZXRSZXN1bHRTdHJpZGUAdA5nZXRSZXN1bHRDb3VudAB1DmdldFJlc3VsdERvY0lkAHYRZ2V0UmVzdWx0TG9jYXRpb24Adw5nZXRSZXN1bHRTY29yZQB4DmdldFJlc3VsdFN0YXJ0AHkMZ2V0UmVzdWx0RW5kAHoRZ2V0UmVzdWx0Q2h1bmtJZHgAexNnZXRSZXN1bHRNYXRjaENvdW50AHwVZ2V0UmVzdWx0TWF0Y2hTdGFydEF0AH0TZ2V0UmVzdWx0TWF0Y2hFbmRBdAB+EGdldFJlc3VsdERvY05hbWUAfwpnZXRTbmlwcGV0AIABFmdldFNuaXBwZXRXaW5kb3dPZmZzZXQAgQEQZ2V0U25pcHBldFdpbmRvdwCCAQ1nZXRDaHVua0NvdW50AIMBC2dldERvY0NvdW50AIQBC2dldFRleHRVc2VkAIUBD2dldFRleHRDYXBhY2l0eQCGARRnZXRMYXN0SW5kZXhPdmVyZmxvdwCHAQxnZXRNYXhDaHVua3MAiAEKZ2V0TWF4RG9jcwCJAQ9nZXROYW1lQ2FwYWNpdHkAigEMZ2V0Q2h1bmtzUHRyAIsBEmdldENodW5rU3RydWN0U2l6ZQCMARBzZXRDYW5kaWRhdGVNYXNrAI0BEmNsZWFyQ2FuZGlkYXRlTWFzawCOAQhnZXREb2NJZACPARBnZXREb2NDaHVua0NvdW50AJABCmdldERvY05hbWUAkQEPZ2V0RG9jQ2h1bmtCYXNlAJIBEmdldENodW5rTG9jYXRpb25BdACTARFnZXRDaHVua0J5dGVMZW5BdACUAQ5nZXRDaHVua1RleHRBdACVAQ9saXN0Q2h1bmtzQmF0Y2gAlgEUZ2V0RG9jQ29udGVudEhhc2hQdHIAlwEUZ2V0RG9jQ29udGVudEhhc2hMZW4AmAEMaXNEb2NEZWxldGVkAJkBDnJlbW92ZURvY3VtZW50AJoBB2NvbXBhY3QAmwEMc25hcHNob3RTaXplAJwBDXNuYXBzaG90Q2h1bmsAnQEMcmVzdG9yZUJlZ2luAKEBC3Jlc3RvcmVGZWVkAKMBDXJlc3RvcmVDb21taXQApQEKX19kYXRhX2VuZAMCCtDMAqsBQAACQAJAIAIgAUkNACACIARNDQEgAiAEEIGAgIAAAAsgASACEIGAgIAAAAsgACACIAFrNgIEIAAgAyABajYCAAsJABCpgYCAAAALSwEBfyOAgICAAEEQayIEJICAgIAAIARBCGpBACABIAIgAxCAgICAACAEKAIMIQMgACAEKAIINgIAIAAgAzYCBCAEQRBqJICAgIAAC7AEAQJ/AkAgAg0AIABBADYCBCAAQQA6AAAPCwJAAkACQAJAAkAgAS0AACIDwCIEQX9KDQBB+IHAgAAgBBCEgICAAA0DQfuBwIAAIAQQhICAgAANAkH+gcCAACAEEISAgIAADQEgAEEBNgIEIABBADoAAA8LIABBATYCBCAAQQE6AAAgACAEQb9/akH/AXFBGklBBXQgBHI6AAEPCyAAQQA6AAACQCACQQNLDQAgAEEBNgIEDwsgAEEENgIEDwsgAkECTQ0BIAEsAAFBv39KDQEgASwAAkG/f0oNASAAQQM2AgQgAEEAOgAADwsCQCACQQFGDQACQEGBgsCAACABLQABIgIQhICAgAANACAAQQE2AgQgAEEAOgAADwsCQAJAAkACQCADQb1+ag4DAAEDAgsCQCACQYABc0H/AXEiAkE/Sw0AIABBAjYCBCAAIAJBuIDAgABqLQAAIgI6AAEgACACQQBHOgAADwsgAkHAABCFgICAAAALAkAgAkGAAXNB/wFxIgJBP0sNACAAQQI2AgQgACACQfiAwIAAai0AACICOgABIAAgAkEARzoAAA8LIAJBwAAQhYCAgAAACyAAQQI2AgQgAEEAOgAADwsCQCACQYABc0H/AXEiAkHAAEkNACACQcAAEIWAgIAAAAsgAEECNgIEIAAgAkG4gcCAAGotAAAiAjoAASAAIAJBAEc6AAAPCyAAQQE2AgQgAEEAOgAADwsgAEEBNgIEIABBADoAAAtJAQF/QQAhAgJAIAAtAAEgAUH/AXFLDQAgAC0AAiECAkAgAC0AAA0AIAFB/wFxIAJB/wFxTQ8LIAFB/wFxIAJB/wFxSSECCyACCwkAEKmBgIAAAAsrAAJAIAMgAU8NACABIAMQgYCAgAAACyAAIAMgAWs2AgQgACACIAFqNgIACzUBAX9BACECAkAgACgCACABSw0AIAAoAgQhAgJAIAAtAAgNACABIAJNDwsgASACSSECCyACCycAAkAgAkGBAkkNACACQYACEIGAgIAAAAsgACACNgIEIAAgATYCAAsnAAJAIAJBwQBJDQAgAkHAABCBgICAAAALIAAgAjYCBCAAIAE2AgALKQACQCACQYHAAEkNACACQYDAABCBgICAAAALIAAgAjYCBCAAIAE2AgALSQACQAJAIAIgAUkNACACQYCABEsNASAAIAIgAWs2AgQgACABQZCVwIAAajYCAA8LIAEgAhCBgICAAAALIAJBgIAEEIGAgIAAAAtMAQF/I4CAgIAAQRBrIgQkgICAgAAgBEEIaiACIAMgAUHAABCAgICAACAEKAIMIQEgACAEKAIINgIAIAAgATYCBCAEQRBqJICAgIAAC0oBAX8jgICAgABBEGsiAySAgICAACADQQhqIAIgAUGABBCCgICAACADKAIMIQEgACADKAIINgIAIAAgATYCBCADQRBqJICAgIAAC0oBAX8jgICAgABBEGsiAySAgICAACADQQhqIAIgAUHAABCCgICAACADKAIMIQEgACADKAIINgIAIAAgATYCBCADQRBqJICAgIAAC0oBAX8jgICAgABBEGsiAySAgICAACADQQhqIAIgAUGAAhCCgICAACADKAIMIQEgACADKAIINgIAIAAgATYCBCADQRBqJICAgIAAC08BAX8jgICAgABBEGsiAiSAgICAACACQQhqIAFBkJXAgABBgIAEEIKAgIAAIAIoAgwhASAAIAIoAgg2AgAgACABNgIEIAJBEGokgICAgAALUQEBfyOAgICAAEEQayIDJICAgIAAIANBCGogASACQZCVwIAAQYCABBCAgICAACADKAIMIQIgACADKAIINgIAIAAgAjYCBCADQRBqJICAgIAAC0sBAX8jgICAgABBEGsiAySAgICAACADQQhqIAIgAUGAwAAQgoCAgAAgAygCDCEBIAAgAygCCDYCACAAIAE2AgQgA0EQaiSAgICAAAsqAAJAIAEgA0cNAAJAIAFFDQAgACACIAH8CgAACw8LIAEgAxCBgICAAAALPAEBf0EALQD4w8WAABoCQCABEJWAgIAAIgJFDQAgAkF8ai0AAEEDcUUNACABRQ0AIAJBACAB/AsACyACC/YTAgh/AX4CQAJAAkACQAJAAkAgAEH1AUkNAEEAIQEgAEFQQQAoAoiVwIAAa0F3cUF9aiICQUAgAkFASRtPDQUgAEELakF4cSEDQQAoAuCUwIAAIgRFDQNBACADayEAAkAgAxClgICAACIFQQJ0QcSRwIAAaigCACICRQ0AQQAhASADQQBBGSAFQQF2ayAFQR9GG3QhBkEAIQcDQAJAIAIiAigCBEF4cSIIIANJDQAgCCADayIIIABPDQAgCCEAIAIhByAIDQBBACEAIAIhBwwFCyABIAIoAhQiCCAIIAIgBkEddkEEcWooAhAiAkYbIAEgCBshASAGQQF0IQYgAg0ACwJAIAFFDQAgASECDAQLIAcNAgtBACEHIARBAiAFdCIBQQAgAWtycSIBRQ0BIAFoQQJ0QcSRwIAAaigCACECDAILAkBBACgC3JTAgABBECAAQQtqQfgDcSAAQQtJGyIDQQN2IgF2IgBBA3FFDQAgAEF/c0EBcSABaiICQQN0IgFB1JLAgABqIAFB3JLAgABqKAIAIgBBCGooAgAgAhCngICAACAAIAFBA3I2AgQgACABaiIBIAEoAgRBAXI2AgQMBAsgA0EAKALklMCAAE0NAgJAIAANAEEAKALglMCAACIARQ0DIABoQQJ0QcSRwIAAaigCACICKAIEQXhxIANrIQEgAiEHAkADQAJAIAIoAhAiAA0AIAIoAhQiAEUNAgsgACgCBEF4cSADayICIAEgAiABSSICGyEBIAAgByACGyEHIAAhAgwACwsgBxCigICAAAJAAkAgAUEQSQ0AIAcgA0EDcjYCBCAHIANqIgAgAUEBcjYCBCAAIAFqIAE2AgAgACABEJ6AgIAADAELIAcgASADaiIAQQNyNgIEIAcgAGoiACAAKAIEQQFyNgIECyAHQQhqIgFFDQMMBQtBAiABdCICQQAgAmtyIAAgAXRxaCICQQN0IgFB1JLAgABqIAFB3JLAgABqKAIAIgBBCGooAgAgAhCngICAACAAIANBA3I2AgQgACADaiIHIAEgA2siAkEBcjYCBCAAIAFqIAI2AgAgByACEJ6AgIAADAMLQQAhAgsCQANAIAIiAUUNASAHIAEgByABKAIEQXhxIgIgA2siBiAASSIIGyACIANJIgIbIQcgACAGIAAgCBsgAhshACABKAIQIgINACABKAIUIQIMAAsLIAdFDQACQEEAKALklMCAACIBIANJDQAgACABIANrTw0BCyAHEKKAgIAAAkACQCAAQRBJDQAgByADQQNyNgIEIAcgA2oiASAAQQFyNgIEIAEgAGog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AEEAKAL8lMCAAE0NAEEAQX82AvyUwIAACw8LIAEgABCfgICAAA8LQQAgATYC7JTAgABBAEEAKALklMCAACAAaiIANgLklMCAACABIABBAXI2AgQgASAAaiAANgIADwsQo4CAgAAAC4wBAQJ/I4CAgIAAQSBrIQFBACECAkADQCACQSBGDQEgASACakIANwIAIAJBCGohAgwACwsgAEIANwIAIABCADcCECAAIAEpAgA3AhggAEEANgI4IABBBmpCADcBACAAQSBqIAFBCGopAgA3AgAgAEEoaiABQRBqKQIANwIAIABBMGogAUEYaikCADcCAAs8AQF/AkBBACgC5JTAgAAiAkUNAEEAKALslMCAACACEJ+AgIAAC0EAIAA2AuyUwIAAQQAgATYC5JTAgAALfAECfwJAAkBBACgC3JTAgAAiAkEBIAFBA3Z0IgNxDQBBACACIANyNgLclMCAACABQXhxQdSSwIAAaiIBIQIMAQsgAUF4cSICQdSSwIAAaiEBIAJB3JLAgABqKAIAIQILIAEgADYCCCACIAA2AgwgACABNgIMIAAgAjYCCAsiAAJAIAFBgAJJDQAgACABEKGAgIAADwsgACABEJ+AgIAAC4gCAQR/IABCADcCECAAIAEQpYCAgAAiAjYCHCACQQJ0QcSRwIAAaiEDAkBBACgC4JTAgABBASACdCIEcQ0AIAMgADYCACAAIAM2AhggACAANgIMIAAgADYCCEEAQQAoAuCUwIAAIARyNgLglMCAAA8LIAFBAEEZIAJBAXZrIAJBH0YbdCECIAMoAgAhBANAAkAgBCIDKAIEQXhxIAFHDQAgAygCCCICIAA2AgwgAyAANgIIIABBADYCGCAAIAM2AgwgACACNgIIDwsgAkEddiEEIAJBAXQhAiADIARBBHFqIgUoAhAiBA0ACyAFQRBqIAA2AgAgACADNgIYIAAgADYCDCAAIAA2AggLyAIBBX8gACgCGCEBAkACQAJAIABBDGooAgAiAiAARw0AIABBFEEQIAAoAhQiAhtqKAIAIgMNAUEAIQIMAgsgAEEIaigCACIDIAI2AgwgAiADNgIIDAELIABBFGogAEEQaiACGyEEA0AgBCEFIAMiAkEUaiEEIAIoAhQiAw0AIAJBEGohBCACKAIQIgMNAAsgBUEANgIACwJAAkAgAUUNAAJAAkAgACAA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CyADIQQgAUEQaiADai0AAEH8AEcNAQsCQAJAAkAgBkEISQ0AIAQgB0kNASABQRBqIAdqIAQgB2sQuYCAgABFDQJBAEEAKAKks8WAAEEBcjYCpLPFgAAMAgsgBCAHSQ0AIAFBEGogB2ogBCAHayAGQQh0QaizxYAAahC6gICAACIDRQ0BIAZBAXRBqMPFgABqIAM7AQAgBkEBaiEGDAELIAcgBBCBgICAAAALIARBAWohBwwACwtBACAGOgChs8WAAAwBC0F/IQQLIAFBkAhqJICAgIAAIAQLCwBBAC0AoLPFgAALCwBBAC0AobPFgAALCwBBACgCpLPFgAALoQEBBH8jgICAgABBEGsiASSAgICAAEEAIQICQAJAIABBAC0AobPFgABPDQAgAEEHSw0BIAFBCGogAEEBdEGow8WAAGovAQAiAhCQgICAACABKAIMIQMgASgCCCEEIAEgAEEIdEGos8WAAGogAhCIgICAACAEIAMgASgCACABKAIEEJOAgIAACyABQRBqJICAgIAAIAIPCyAAQQgQhYCAgAAAC64BAQV/I4CAgIAAQRBrIgEkgICAgABBACECAkACQCAAQQAtAKGzxYAATw0AIABBB0sNAUEBIQIgAUEIaiAAQQF0QajDxYAAai8BACIDEJCAgIAAIAEoAgwhBCABKAIIIQUgASAAQQh0QaizxYAAaiADEIiAgIAAIAUgBCABKAIAIAEoAgQQk4CAgAAgAxDBgICAABoLIAFBEGokgICAgAAgAg8LIABBCBCFgICAAAALigQDA38BfgN/I4CAgIAAQcAUayIBJICAgIAAAkACQAJAIAANAEEAIQIMAQtBACECQQAgAEGAgAQgAEGAgARJGzYC0IjAgABBAC0A6IrAgAAhAwJAQYACRQ0AIAFBIGpBAEGAAvwLAAsgAUEYaiABQSBqIABBgAIgAEGAAkkbIgAQj4CAgAAgASgCGCABKAIcQZCVwIAAIAAQk4CAgAACQANAIAJBgAJGDQECQEHAAEUNACABQaACaiACakEAQcAA/AsACyACQcAAaiECDAALC0IAIQQgAUGoBGpCADcDACABQgA3A6AEIAFBEGogAUEgaiAAEIiAgIAAQQAhAiABQaAEaiEAIAFBoAJqIQUgASgCECABKAIUIAFBoAJqIAFBoARqEOSAgIAAIQYgA0H/AXFBAUch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IAEgBGshAyABIARJDQEgACADaiACQbiHwIAAaigCACAEEKqBgIAARQ0DCyACQQhqIQIMAQsLIAMgARCBgICAAAALIANBASADQQFLGyEBCyABC4kCAwJ/An4CfyOAgICAAEGQEGsiAySAgICAAEEAIQQCQEGAEEUNACADQQhqQQBBgBD8CwALQgAhBUIAIQYDQAJAAkAgBCACTw0AIAVCwABUDQELAkBBgBBFDQAgACADQQhqQYAQ/AoAAAsgACAGNwOAECAAIAU+AogQIAAgBCACSSAFQsAAUXE6AIwQIANBkBBqJICAgIAADwsgAyAEIAEgAhDrgICAACADQYgQaiADKAIAIAMoAgQQg4CAgAAgAygCjBAgBGohBCADLQCIEEEBRw0AIANBCGogAy0AiRAiB0EDdGoiCCAIKQMAQgEgBYaENwMAIAVCAXwhBUIBIAethiAGhCEGDAALCycAAkAQ6ICAgAANAEEADwsDQEF/EOmAgIAARQ0AC0EAKALch8CAAAuRCgMFfwF+DH8jgICAgABB4BhrIgAkgICAgABBACEBQQBCADcC1IjAgABBAEEAOgD0isCAAEEAQQA2AuyKwIAAQQBBADYC3IjAgABBAEEANgLch8CAAAJAQQAoAtCIwIAAIgJFDQBBACgCyIfAgABFDQBBACEBAkBBgAJFDQAgAEEoakEAQYAC/AsACyAAQSBqIABBKGogAkGAAiACQYACSRsiAhCPgICAACAAKAIgIAAoAiRBkJXAgAAgAhCTgICAAAJAA0AgAUGAAkYNAQJAQcAARQ0AIABBqAJqIAFqQQBBwAD8CwALIAFBwABqIQEMAAsLIABBsARqQgA3AwAgAEIANwOoBCAAQRhqIABBKGogAhCIgICAAAJAIAAoAhggACgCHCAAQagCaiAAQagEahDkgICAACIDDQBBACEBDAELAkBBAC0A6IrAgABBAUcNAEEAIQEgAEGoAmohBCAAQagEaiECA0AgAyABRg0BAkAgAUEERg0AIABBEGogBCACKAIAEI6AgIAAIAIgACgCECAAKAIUEOWAgIAANgIAIAJBBGohAiAEQcAAaiEEIAFBAWohAQwBCwtBBEEEEIWAgIAAAAtBACEBAkADQCABQfADRg0BAkBB/ABFDQAgAEG4BGogAWpBAEH8APwLAAsgAUH8AGohAQwACwtCACEFIABBqAhqQQhqQgA3AwAgAEG4CGpBCGpCADcDACAAQgA3A6gIIABCADcDuAhBACECAkADQAJAAkACQCACIANGDQAgAkEERg0EIABBCGogAEGoAmogAkEGdGogAEGoBGogAkECdCIGaigCABCJgICAACAAQcgIaiAAKAIIIgcgACgCDCIIEOaAgIAAQQAhAUEAIQQgACgC0BgiCUEGSQ0CQQAoAsSIwIAAIQQgCUEJSQ0BIARBAyAEQQNJGyEEDAILAkBB8ANFDQBBpI3AgAAgAEG4BGpB8AP8CgAAC0EAIABBqAhqQQhqKQMANwKckcCAAEEAIAApA6gINwKUkcCAAEEAIAApA7gINwKkkcCAAEEAIABBuAhqQQhqKQMANwKskcCAAAJAQYACRQ0AQfWKwIAAIABBqAJqQYAC/AoAAAtBACADNgKIjcCAAEEAIAU3A5iNwIAAQQEhAUEAQQE6APSKwIAAQQAgAEGoBGpBCGopAwA3A4CNwIAAQQAgACkDqAQ3A/iMwIAAQQBBAC8ByIjAgAA7AYyNwIAAQQBBACgCxIjAgAA2ApCNwIAAQQBBACgCyIfAgAAiAjYC8IrAgABBACACNgLUiMCAAAwECyAEQQBHIQQLIAJBAWohCiAAKQPIGCAFhCEFIABBuAhqIAZqIAQ2AgAgAEG4BGogAkH8AGxqIQtBACEJQQAhDANAIAxBPUshDSAJIQQCQANAIAQhDiAQIQ8gCSERIAIhECABIAhPDQEgDQ0BIAAgASAHIAgQhoCAgAAgAEHYGGogACgCACAAKAIEEIOAgIAAIAAoAtwYIAFqIQFBACEJQQAhBCAALQDYGEEBRw0AAkAgAC0A2RgiAkFQakH/AXFBCkkNAEEAIQQgAkFfcUG/f2pB/wFxQRlLDQELQQEhCSARIQQgESAOcUEBcUUNAAtBASEJIAsgDEEBdGogDyAQIAIQqYCAgAA7AQAgDEEBaiEMDAELCyAAQagIaiAGaiAMNgIAIAohAgwACwtBBEEEEIWAgIAAAAsgAEHgGGokgICAgAAgAQvfKQoGfwF+An8BfgF/AX4WfwN+An8CfiOAgICAAEGg+QBrIgEkgICAgAACQAJAQQAtAPSKwIAARQ0AAkBBgAJFDQAgAUGYAWpB9YrAgABBgAL8CgAAC0EAIQIgAUGIB2pBCGoiA0EAKQOAjcCAADcDACABQQApA/iMwIAANwOIB0EAKAKIjcCAACEEQQAvAYyNwIAAIQVBACgCkI3AgAAhBkEAKQOYjcCAACEHAkBB8ANFDQAgAUGYA2pBpI3AgABB8AP8CgAACyABQZgHakEIakEAKQKckcCAADcDACABQagHakEIakEAKQKskcCAADcDACABQQApApSRwIAANwOYByABQQApAqSRwIAANwOoByABQZABaiABQZgBaiABKAKIByIIEImAgIAAIAFB+McAaiABKAKQASABKAKUARDmgICAACABQYgBaiABQdgBaiABKAKMBxCJgICAACABQYjYAGogASgCiAEgASgCjAEQ5oCAgAAgAUGAAWogAUGYAmogAygCABCJgICAACABQZjoAGogASgCgAEgASgChAEQ5oCAgAAgAUH4AGogAUHYAmogASgClAcQiYCAgAAgAUHoN2ogASgCeCABKAJ8EOaAgIAAAkBBkBBFIgMNACABQbgHaiABQfjHAGpBkBD8CgAACwJAIAMNACABQbgHakGQEGogAUGI2ABqQZAQ/AoAAAsCQCADDQAgAUHYJ2ogAUGY6ABqQZAQ/AoAAAtBACgC8IrAgAAiCa0iCkEAKALsisCAACILrSAArXwiDCAKIAxUG6chDUIAIQwDQCABQagHaiACQQJ0aiEAAkADQAJAIAQgAiIDRw0AIAZBAyAGQQNJGyEOIAsgDSALIA1LGyEPIARBAWohECAGQQBHIREgCEF/cyESIARBf2pB/////wNxIRMgAUGo+ABqQQRqIRQgBUH//wNxIRVCACEKQX8hBkF/IRYDQEEAKALQh8CAACEXQQAoAriHwIAAIRhBAC0AxMPFgABBAXEhGUEAIQMgFiEaAkACQAJAAkACQANAIAMhGyALQQV0IRwgDSALayEdIAshHgJAA0ACQAJAAkACQAJAIB4gD0cNAEEAIQNBACAPNgLsisCAACAPIAlJDRNBAEEAOgDEw8WAAEEAQQA6APSKwIAAQQAoAtyHwIAAIgNBPGxBhNXEgABqIQAgA0HIAUshHwNAIANBAkkNEwJAQTxFIgINACABQdj4AGpBwNXEgABBPPwKAAALIANBf2ohAyAfDQICQCACDQBBwNXEgAAgAEE8/AoAAAsCQCACDQAgACABQdj4AGpBPPwKAAALIAMQ6oCAgAAgAEFEaiEADAALCyAe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AyAbSxshAgJAAkACQAJAAkBBACgC3IfAgAAiA0UNACADQQAoAsyIwIAASQ0CQQAvAczVxIAAIQAMAQtBACEAQQAoAsyIwIAADQILIABB//8DcSAcQf//A3FPDQNBACAbNgLU1cSAAEEAIAI2AtDVxIAAQQAgHDsBzNXEgABBACAiNgLI1cSAAEEAIB42AsTVxIAAQQAgFjYCwNXEgABBACABKQK4eDcC2NXEgABBACAENgL41cSAAEEAIAFBuPgAakEIaikCADcC4NXEgABBACABQbj4AGpBEGopAgA3AujVxIAAQQAgAUG4+ABqQRhqKQIANwLw1cSAACADEOqAgIAADAMLIANByAFPDQELQQAgA0EBajYC3IfAgAAgA0E8bCIAQdTVxIAAaiAbNgIAIABB0NXEgABqIAI2AgAgAEHM1cSAAGogHDsBACAAQcjVxIAAaiAiNgIAIABBxNXEgABqIB42AgAgAEHA1cSAAGogFjYCACAAQdjVxIAAaiABKQK4eDcCACAAQeDVxIAAaiABQbj4AGpBCGopAgA3AgAgAEHo1cSAAGogAUG4+ABqQRBqKQIANwIAIABB8NXEgABqIAFBuPgAakEYaikCADcCACAAQfjVxIAAaiAENgIAA0AgA0UNAiADQTxsIgBBzNXEgABqLwEAIANBf2pBAXYiA0E8bCICQczVxIAAai8BAE8NAiAAQcDVxIAAaiEfAkBBPEUiAA0AIAFBiNgAaiAfQTz8CgAACyACQcDVxIAAaiECAkAgAA0AIB8gAkE8/AoAAAsgAA0AIAIgAUGI2ABqQTz8CgAADAALCwsgA0HIARCFgICAAAALIANBBEYNASADQQFqIQIgACgCACEfIABBBGohACAfDQALIAFBuAdqIANBkBBsaikDgBAgDIQhDAwBCwsgBEEEIARBBEkbQQQQhYCAgAAAC0EBIQMLIAFBoPkAaiSAgICAACADC+MCAQV/I4CAgIAAQcAAayIBJICAgIAAQQAhAgJAAkACQANAIAIhAwJAIAJBAXQiBEEBciIFIABPDQACQCACQeMASw0AIAUgAiAFQTxsQczVxIAAai8BACACQTxsQczVxIAAai8BAEkbIQMMAQsgBUHIARCFgICAAAALAkAgBEECaiIEIABPDQAgAkHiAEsNAiADQcgBTw0DIAQgAyAEQTxsQczVxIAA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IAFBJGogAEE8bEHA1cSAAGpBPPwKAAALIAEoAiQhAkEAIQNBACgC0IfAgAAhBEEAIQVBACEGAkADQCAEIAYiAEYNASABQRhqELGAgIAAIAAgASgCHCIGTw0DIABBAWohBiABKAIYIgcgBWohCCAFQRRqIQUgCCgCACACRw0ACyAHIABBFGxqIgUoAgQhACABQRBqIAUvAQgiAxCQgICAACABKAIUIQYgASgCECEIIAFBCGoQs4CAgAAgACADaiIFIABJDQMgBSABKAIMIgRLDQQgCCAGIAEoAgggAGogAxCTgICAAAsgAUHgAGokgICAgAAgAw8LIABByAEQhYCAgAAACyAAIAYQhYCAgAAACyAAIAUQgYCAgAAACyAFIAQQgYCAgAAAC8sCAQZ/I4CAgIAAQeAAayIBJICAgIAAAkACQAJAAkACQAJAIABBACgC3IfAgABJDQAgAUEkahCdgICAAAwBCyAAQccBSw0BQTxFDQAgAUEkaiAAQTxsQcDVxIAAakE8/AoAAAtBACEAAkAgASgCKCICQQAoAsiHwIAATw0AIAFBGGoQr4CAgAAgAiABKAIcIgBPDQIgASgCGCACQQV0aiIAKAIQIQIgAUEQaiAAKAIUIgBBgIAEIABBgIAESRsiABCQgICAACABKAIUIQMgASgCECEEIAFBCGoQsICAgAAgACACaiIFIABJDQMgBSABKAIMIgZLDQQgBCADIAEoAgggAmogABCTgICAAAsgAUHgAGokgICAgAAgAA8LIABByAEQhYCAgAAACyACIAAQhYCAgAAACyACIAUQgYCAgAAACyAFIAYQgYCAgAAACwsAQQAoAsDDxYAAC4oJAQt/I4CAgIAAQYABayIDJICAgIAAQQBBADYCwMPFgAACQAJAAkACQAJAAkACQAJAAkACQCAAQQAoAtyHwIAASQ0AIANBxABqEJ2AgIAADAELIABBxwFLDQFBPEUNACADQcQAaiAAQTxsQcDVxIAAakE8/AoAAAtBACEEIAMoAkgiAEEAKALIh8CAAE8NBCADQThqEK+AgIAAIAAgAygCPCIETw0BQQAhBSADKAJYIQYgAygCOCAAQQV0aiIAKAIUIQcgACgCECEIIAMoAlQiACABTQ0DQQAgACABayIEIAQgAEsbIgUgCGohBEEAIQADQCAAQRNLDQQgBSAAaiIJIAdPDQQgA0EwahCwgICAACAEIABqIgEgAygCNCIKTw0DAkACQCADKAIwIARqIABqLQAAIgFBCkYNACABQSBHDQELIAlBAWohBQwFCyAAQQFqIQAMAAsLIABByAEQhYCAgAAACyAAIAQQhYCAgAAACyABIAoQhYCAgAAACyAHIAYgAmoiACAHIABJGyEBAkACQAJAIAAgB08NACAHIAFrIgBBFCAAQRRJGyEKIAEgCGohBEEAIQADQCAKIABGDQEgA0EoahCwgICAACAEIABqIgkgAygCLCICTw0CAkAgAygCKCAEaiAAai0AACIJQQpGDQAgCUEgRg0AIABBAWohAAwBCwsgACABaiEBCyAFIQQCQANAIAQiAEEARyEEIABFDQMgBSAHTw0DIANBIGoQsICAgAAgCCAAaiIEIAMoAiQiCU8NASAAQX9qIQQgAygCICAIaiAAaiwAAEFASA0AC0EBIQQMAgsgBCAJEIWAgIAAAAsgCSACEIWAgIAAAAsCQCABIAdPDQAgASAAIAEgAEkbIQoDQAJAIAEgAEsNACAKIQEMAgsgA0EYahCwgICAAAJAIAggAWoiBSADKAIcIglPDQAgAygCGCAIaiABaiwAAEFATg0CIAFBf2ohAQwBCwsgBSAJEIWAgIAAAAsgASAAIAEgAEsbIQkCQAJAIAQNAEEAIQUMAQtBfCEEA0ACQCAEDQBBBCEFDAILIARBlJXAgABqIARBnIDAgABqLQAAOgAAIARBAWohBAwACwsgA0EQaiAFQfz/A0GAgAQgCSAHSRsgBWsiAiAJIABrIgQgAiAESRsiCiAFaiIEEJGAgIAAIAMoAhQhCyADKAIQIQwgA0EIahCwgICAACAKIAAgCGoiBmoiCCAKSQ0CIAggAygCDCINSw0DIAwgCyADKAIIIAZqIAoQk4CAgAACQCAJIAdPDQAgBEH8/wNLDQBBACEEIAVBACABIABrIgcgByABSyIJGyIIIAIgCCACSRtqIQECQANAIARBBEYNASABIARqIghBgIAETw0EIAhBkJXAgABqIARBnIDAgABqLQAAOgAAIARBAWohBAwACwsgBUEAIAcgCRsiCCACIAggAkkbaiAEaiEEC0EAIAA2AsDDxYAACyADQYABaiSAgICAACAEDwsgCEGAgAQQhYCAgAAACyAGIAgQgYCAgAAACyAIIA0QgYCAgAAACwsAQQAoAsiHwIAACwsAQQAoAtCHwIAACwsAQQAoAsyHwIAACwsAQQAoAsCHwIAACwsAQQAoAqCNwIAACwsAQQAoAryHwIAACwsAQQAoAriHwIAACwsAQQAoAsSHwIAACzQBAn8jgICAgABBEGsiACSAgICAACAAQQhqEK+AgIAAIAAoAgghASAAQRBqJICAgIAAIAELBABBIAusAQEEfyOAgICAAEEQayIBJICAgIAAIAFBCGoQtoCAgAAgASgCCCECAkAgASgCDCIDIABBgIAEIABBgIAESRtBAnYiBCADIARJG0ECdCIERQ0AIAJBkJXAgAAgBPwKAAALIANBAnQgBGshAyACIARqIQQCQANAIANFDQEgBEEANgIAIANBfGohAyAEQQRqIQQMAAsLQQAgAEEDSzoAxMPFgAAgAUEQaiSAgICAAAsNAEEAQQA6AMTDxYAAC20BAn8jgICAgABBEGsiASSAgICAAEF/IQICQAJAIABBACgC0IfAgABPDQAgAUEIahCxgICAACAAIAEoAgwiAk8NASABKAIIIABBFGxqKAIAIQILIAFBEGokgICAgAAgAg8LIAAgAhCFgICAAAALbQECfyOAgICAAEEQayIBJICAgIAAQQAhAgJAAkAgAEEAKALQh8CAAE8NACABQQhqELGAgIAAIAAgASgCDCICTw0BIAEoAgggAEEUbGooAhAhAgsgAUEQaiSAgICAACACDwsgACACEIWAgIAAAAviAQEGfyOAgICAAEEgayIBJICAgIAAQQAhAgJAAkACQAJAIABBACgC0IfAgABPDQAgAUEYahCxgICAACAAIAEoAhwiAk8NASABKAIYIABBFGxqIgIoAgQhACABQRBqIAIvAQgiAhCQgICAACABKAIUIQMgASgCECEEIAFBCGoQs4CAgAAgACACaiIFIABJDQIgBSABKAIMIgZLDQMgBCADIAEoAgggAGogAhCTgICAAAsgAUEgaiSAgICAACACDwsgACACEIWAgIAAAAsgACAFEIGAgIAAAAsgBSAGEIGAgIAAAAttAQJ/I4CAgIAAQRBrIgEkgICAgABBACECAkACQCAAQQAoAtCHwIAATw0AIAFBCGoQsYCAgAAgACABKAIMIgJPDQEgASgCCCAAQRRsaigCDCECCyABQRBqJICAgIAAIAIPCyAAIAIQhYCAgAAAC6wBAQN/I4CAgIAAQRBrIgIkgICAgABBfyEDAkACQAJAIABBACgC0IfAgABPDQAgAkEIahCxgICAACAAIAIoAgwiBE8NASABIAIoAgggAEEUbGoiACgCEE8NACACEK+AgIAAIAAoAgwgAWoiACACKAIEIgNPDQIgAigCACAAQQV0aigCDCEDCyACQRBqJICAgIAAIAMPCyAAIAQQhYCAgAAACyAAIAMQhYCAgAAAC6wBAQN/I4CAgIAAQRBrIgIkgICAgABBACEDAkACQAJAIABBACgC0IfAgABPDQAgAkEIahCxgICAACAAIAIoAgwiBE8NASABIAIoAgggAEEUbGoiACgCEE8NACACEK+AgIAAIAAoAgwgAWoiACACKAIEIgNPDQIgAigCACAAQQV0aigCFCEDCyACQRBqJICAgIAAIAMPCyAAIAQQhYCAgAAACyAAIAMQhYCAgAAAC68CAQV/I4CAgIAAQSBrIgIkgICAgABBACEDAkACQAJAAkACQCAAQQAoAtCHwIAATw0AIAJBGGoQsYCAgAAgACACKAIcIgRPDQEgASACKAIYIABBFGxqIgAoAhBPDQAgAkEQahCvgICAACAAKAIMIAFqIgAgAigCFCIDTw0EIAIoAhAgAEEFdGoiAygCECEAIAJBCGogAygCFCIDQYCABCADQYCABEkbIgMQkICAgAAgAigCDCEEIAIoAgghBSACELCAgIAAIAMgAGoiASADSQ0CIAEgAigCBCIGSw0DIAUgBCACKAIAIABqIAMQk4CAgAALIAJBIGokgICAgAAgAw8LIAAgBBCFgICAAAALIAAgARCBgICAAAALIAEgBhCBgICAAAALIAAgAxCFgICAAAALnQQBCn8jgICAgABBwABrIgMkgICAgABBACEEAkAgAEEAKALQh8CAAE8NACADQTBqELGAgIAAAkACQAJAIAAgAygCNCIFTw0AIAEgAygCMCAAQRRsaiIGKAIQIgVPDQNBACEAQQBBfyABIAJqIgIgAiABSRsiAiAFIAIgBUkbIgIgAWsiBSAFIAJLGyEEIAYoAgwgAWoiB0EFdEEUciEGQQAhAQNAIAQgAEYNBCADQShqEK+AgIAAAkACQCAHIABqIgIgAygCLCIFTw0AIAMoAiggBmoiCCgCACICIAFBCGoiCWoiCkGAgARNDQEgACEEDAYLIAIgBRCFgICAAAALIAhBfGooAgAhBSAIQXhqKAIAIQggA0EgaiABIAFBBGoiCxCRgICAACADKAIkIQEgAygCICEMIAMgAjYCPCAMIAEgA0E8akEEEJOAgIAAIANBGGogCyAJEJGAgIAAIAMoAhwhASADKAIYIQsgAyAINgI8IAsgASADQTxqQQQQk4CAgAAgA0EQaiAJIAoQkYCAgAAgAygCFCEIIAMoAhAhCSADQQhqELCAgIAAIAUgAmoiASAFSQ0CIAEgAygCDCILSw0DIAkgCCADKAIIIAVqIAIQk4CAgAAgBkEgaiEGIABBAWohACAKIQEMAAsLIAAgBRCFgICAAAALIAUgARCBgICAAAALIAEgCxCBgICAAAALIANBwABqJICAgIAAIAQLagECfyOAgICAAEEQayIBJICAgIAAQQAhAgJAAkAgAEEAKALQh8CAAE8NACABQQhqELKAgIAAIAAgASgCDCICTw0BIAEoAgggAEEDdGohAgsgAUEQaiSAgICAACACDwsgACACEIWAgIAAAAsEAEEIC3ABAn8jgICAgABBEGsiASSAgICAAEEAIQICQAJAIABBACgC0IfAgABPDQAgAUEIahCxgICAACAAIAEoAgwiAk8NASABKAIIIABBFGxqLwEKQQFxIQILIAFBEGokgICAgAAgAg8LIAAgAhCFgICAAAAL/wEBCH8jgICAgABBEGsiASSAgICAAEEAIQJBACgC0IfAgAAhA0EAIQRBACEFAkACQAJAA0AgAyAFIgZGDQEgAUEIahCxgICAACAGIAEoAgwiBU8NAyAGQQFqIQUgASgCCCIHIARqIQggBEEUaiEEIAgoAgAgAEcNAAtBASECIAcgBkEUbGoiBiAGLwEKQQFyOwEKIABBACgCuIfAgABPDQAgARC1gICAACAAQQZ2IgYgASgCBCIETw0BIAEoAgAgBkEDdGoiBiAGKQMAQgEgAEE/ca2GhDcDAAsgAUEQaiSAgICAACACDwsgBiAEEIWAgIAAAAsgBiAFEIWAgIAAAAv+BwIVfwJ+I4CAgIAAQdAAayIAJICAgIAAQQAoAtCHwIAAIQEgAEE4ahC1gICAACAAKAI8QQN0IQIgACgCOCEDAkADQAJAIAINAEEAIQRBACEFQQAhBkEAIQNBACEHDAILIANCADcDACACQXhqIQIgA0EIaiED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IAJBACgCzIfAgAA2AvABIAggBCACQfABakEEEJOAgIAAIAJBmAFqIAJBsAJqQRRBGBCMgICAACACKAKcASEEIAIoApgBIQggAkEAKALUh8CAADYC8AEgCCAEIAJB8AFqQQQQk4CAgAAgAkGQAWogAkGwAmpBGEEcEIyAgIAAIAIoApQBIQQgAigCkAEhCCACIA82AvABIAggBCACQfABakEEEJOAgIAAIAJBiAFqIAJBsAJqQRxBIBCMgICAACACKAKMASEEIAIoAogBIQggAkEAKALYh8CAADYC8AEgCCAEIAJB8AFqQQQQk4CAgAAgAkGAAWogAkGwAmpBIEEoEIyAgIAAIAIoAoQBIQQgAigCgAEhCCACIBA3A/ABIAggBCACQfABakEIEJOAgIAAIAJB+ABqIAJBsAJqQShBLBCMgICAACACKAJ8IQQgAigCeCEIIAJBACgCuIfAgAA2AvABIAggBCACQfABakEEEJOAgIAAIAJB8ABqIAJBsAJqQSxBMBCMgICAACACKAJ0IQQgAigCcCEIIAJBACgCvIfAgAA2AvABIAggBCACQfABakEEEJOAgIAAIAJB6ABqIAJBsAJqQTBBNBCMgICAACACKAJsIQQgAigCaCEIIAJBACgCwIfAgAA2AvABIAggBCACQfABakEEEJOAgIAAIAJB4ABqIAJBsAJqQTRBOBCMgICAACACKAJkIQQgAigCYCEIIAJBACgCxIfAgAA2AvABIAggBCACQfABakEEEJOAgIAAIAENBSACQfABaiACQbACakHAAPwKAAAMBQsgAyABEIGAgIAAAAsgAigC4AEgBGogAkGwAmoQn4GAgAAgBEEUaiEEIAFBAWohASAQIAJBsAJqQRQQnoGAgAAhEAwACwsgEUIANwMAIBJCADcDACACQgA3A7ACIAJB6AFqEK+AgIAAAkAgASACKALsASITSQ0AIAEgExCFgICAAAALIAIoAugBIARqIAJBsAJqEKCBgIAAIARBIGohBCABQQFqIQEgECACQbACakEYEJ6BgIAAIRAMAAsLIAVBgIAEIAVBgIAESRsiAyAAaiEIIAJBwAJqIRIgAkG4AmohE0EAIQQDQCAIIABNDQECQAJAAkACQAJAAkACQAJAAkACQCAAQcAASQ0AAkAgACAHSQ0AAkAgACAJSQ0AAkACQAJAIAAgC0kNACAAIAxJDQEgDiAASw0CDBALIAJBOGoQsoCAgAAgAigCOCERIAJBMGogBCAIIABrIgEgCyAAayIGIAEgBkkbIgEgBGoiBRCRgICAACABIAAgCWsiBmoiBCABSQ0FIAQgCksNBiACKAIwIAIoAjQgESAGaiABEJOAgIAAIAUhBAwNCyACQcgAaiAEIAggAGsiASAMIABrIgYgASAGSRsiASAEaiIREJGAgIAAIAIoAkwhBSACKAJIIQ0gAkHAAGoQs4CAgAAgASAAIAtrIgZqIgQgAUkNBiAEIAIoAkQiD0sNByANIAUgAigCQCAGaiABEJOAgIAAIBEhBAwMCyACQdgAaiAEIAggAGsiASAOIABrIgYgASAGSRsiASAEaiIREJGAgIAAIAIoAlwhBSACKAJYIQ0gAkHQAGoQsICAgAAgASAAIAxrIgZqIgQgAUkNByAEIAIoAlQiD0sNCCANIAUgAigCUCAGaiABEJOAgIAAIBEhBAwLCyASQQA2AgAgE0IANwMAIAJCADcDsAIgAkEoahCxgICAACAAIAdrIgZBFG4iASACKAIsIhFJDQkgASAREIWAgIAAAAsgEkIANwMAIBNCADcDACACQgA3A7ACIAJBGGoQr4CAgAAgAEFAaiIGQRhuIgEgAigCHCIRSQ0HIAEgERCFgICAAAALIAJBCGogBCAIIABrIgFBwAAgAGsiBiABIAZJGyIBIARqIgYQkYCAgAAgAigCCCACKAIMIAJB8AFqIABqIAEQk4CAgAAgBiEEDAgLIAYgBBCBgICAAAALIAQgChCBgICAAAALIAYgBBCBgICAAAALIAQgDxCBgICAAAALIAYgBBCBgICAAAALIAQgDxCBgICAAAALIAIoAhggAUEFdGogAkGwAmoQoIGAgAAgAkEQaiAEIAggAGsiEUEYIAFBaGwgBmoiBmsiASARIAFJGyIBIARqIhEQkYCAgAAgAigCECACKAIUIAJBsAJqIAZqIAEQk4CAgAAgESEEDAELIAIoAiggAUEUbGogAkGwAmoQn4GAgAAgAkEgaiAEIAggAGsiEUEUIAFBbGwgBmoiBmsiASARIAFJGyIBIARqIhEQkYCAgAAgAigCICACKAIkIAJBsAJqIAZqIAEQk4CAgAAgESEECyABIABqIQAMAAsLIAJB8AJqJICAgIAAIAMLMQACQANAIAJFDQEgAkF/aiECIAAgATEAAIVCs4OAgIAgfiEAIAFBAWohAQwACwsgAAsgACABIAAoAgA2AAAgASAAKQIENwAEIAEgACkCDDcADAsgACABIAApAwA3AAAgASAAKQMINwAIIAEgACkDEDcAEAu1BgEMfyOAgICAAEEgayIAJICAgIAAQQAhAQJAQQAoApCVwIAAQcGYicIFRw0AQQAhAUEALQCVlcCAAEEIdEEALQCUlcCAACICckEALQCWlcCAAEEQdHJBAC0Al5XAgABBGHRyIgNBf2pBA0sNAEEAIQFBACgCmJXAgAAiBEEAKAK8h8CAAEsNAEEALQCdlcCAAEEIdCIFQQAtAJyVwIAAIgZyQQAtAJ6VwIAAQRB0IgdyQQAtAJ+VwIAAQRh0IghyIglBACgCuIfAgABLDQBBACgCoJXAgAAiCkEAKALAh8CAAEsNAEEAKAKklcCAACILQQAoAsSHwIAASw0AQQAhAUEAIAI6AMzDxYAAQQBBADYCyMPFgAACQCADQQJLDQBBACgCqJXAgABBIEcNAUEAKAKslcCAAEEURw0BEMKAgIAAQQAhAkEAIAk2AtCHwIAAQQAgBDYCyIfAgABBACALNgLUh8CAAEEAIAo2AsyHwIAAIAggB3IgBXIgBnIhBEEBIQFBACEDA0AgBCADRg0CIAAQsoCAgAACQCADIAAoAgQiCU8NACAAKAIAIAJqQgA3AAAgAkEIaiECIANBAWohAwwBCwsgAyAJEIWAgIAAAAtBACEBQQAvAaiVwIAAQQAtAKqVwIAAQRB0ckEALQCrlcCAAEEYdCIFciICIAlBHGwgBEEYbGogCmogC2pHDQBBACEGQQAgCTYC4MPFgABBACAENgLcw8WAAEEAIAo2AuTDxYAAQQAgCzYC6MPFgABBACACNgLYw8WAAEEAQQBBACgCrJXAgAAgA0EDRiIDGzYC7MPFgABBAEIAQQApArCVwIAAIAMbNwPww8WAAEEAQQA2AtTDxYAAQQEhASACQQAoAtDDxYAAIgNNDQACQAJAIAVBAEgNAEEAIQECQCADRQ0AIAAgAzYCHCAAQQAoAsCRwIAANgIUQQEhAQsgACABNgIYIABBCGogAiAAQRRqEJeAgIAAQQEhASAAKAIIQQFHDQEgACgCECEBIAAoAgwhBgsgBiABEKKBgIAAAAtBACAAKAIMNgLAkcCAAEEAIAI2AtDDxYAACyAAQSBqJICAgIAAIAELGgACQCAARQ0AIAEQqIGAgAAACxCjgICAAAAL2AkBD38jgICAgABBkAFrIgEkgICAgAAgAEGAgAQgAEGAgARJGyECQQAhAwJAAkACQEEALQDMw8WAACIEQQJLDQBBACgCyMPFgAAiACACaiIFQQAoAtCHwIAAIgJBFGwiBkEAKALIh8CAAEEFdCIHaiIIIAJBA3QiCUEAIARBAkYbaiIKQQAoAtSHwIAAaiILQQAoAsyHwIAAaiIMSw0CQQAhAiAEQQJHIQ0DQCAFIABNDQICQAJAAkAgACAHSQ0AIAAgCEkNAQJAIA0NACAAIApJDQMLIAUgAGshAwJAIAAgC0kNACABQfAAahCwgICAACABQegAaiAAIAtrIgQgBCADIAwgAGsiDiADIA5JGyIDaiABKAJwIAEoAnQQgICAgAAgASgCbCEEIAEoAmghDiABQeAAaiACIAMgAmoiDxCLgICAACAOIAQgASgCYCABKAJkEJOAgIAAIAMgAGohACAPIQIMBAsgAUHYAGoQs4CAgAAgAUHQAGogACAKayIEIAQgAyALIABrIg4gAyAOSRsiA2ogASgCWCABKAJcEICAgIAAIAEoAlQhBCABKAJQIQ4gAUHIAGogAiADIAJqIg8Qi4CAgAAgDiAEIAEoAkggASgCTBCTgICAACADIABqIQAgDyECDAMLIAFBEGoQr4CAgAAgAUEIaiAAIAUgAGsiAyAHIABrIgQgAyAESRsiAyAAaiIEIAEoAhAgBxCAgICAACABKAIMIQAgASgCCCEOIAEgAiADIAJqIgMQi4CAgAAgDiAAIAEoAgAgASgCBBCTgICAACADIQIgBCEADAILIAFBKGoQsYCAgAAgAUEgaiAAIAdrIgQgBCAFIABrIgMgCCAAayIOIAMgDkkbIgNqIAEoAiggBhCAgICAACABKAIkIQQgASgCICEOIAFBGGogAiADIAJqIg8Qi4CAgAAgDiAEIAEoAhggASgCHBCTgICAACADIABqIQAgDyECDAELIAFBwABqELKAgIAAIAFBOGogACAIayIEIAQgBSAAayIDIAogAGsiDiADIA5JGyIDaiABKAJAIAkQgICAgAAgASgCPCEEIAEoAjghDiABQTBqIAIgAyACaiIPEIuAgIAAIA4gBCABKAIwIAEoAjQQk4CAgAAgAyAAaiEAIA8hAgwACwtBACEDQQAoAsjDxYAAIAJqQQAoAtjDxYAASw0BQQAhBQJAAkACQAJAIAJBACgC0MPFgAAiB0EAKALUw8WAACIAa0sNAEEAKALAkcCAACEHDAELIAAgAmoiAyAASQ0BQQAhBSADIAdBAXQiACADIABLGyIAQQggAEEISxsiAEEASA0BQQAhBQJAIAdFDQAgASAHNgKMASABQQAoAsCRwIAANgKEAUEBIQULIAEgBTYCiAEgAUH4AGogACABQYQBahCXgICAAAJAIAEoAnhBAUcNACABKAKAASEAIAEoAnwhBQwDC0EAIAEoAnwiBzYCwJHAgABBACAANgLQw8WAAEEAKALUw8WAACEACwJAIAJFDQAgByAAakGQlcCAACAC/AoAAAtBAEEAKALUw8WAACACajYC1MPFgABBACgCyMPFgAAgAmohAAwCCwsgBSAAEKKBgIAAAAtBACAANgLIw8WAAEEBIQMLIAFBkAFqJICAgIAAIAMLxAMBB38jgICAgABBIGsiASSAgICAAEEAIQJBACgC0IfAgAAhA0EAIQRBACEFAkACQANAIAMgBEYNASABQRhqELGAgIAAIAQgASgCHCIGTw0CIAEoAhggAmooAgBBAWoiBkF/IAYbIgYgBSAGIAVLGyEFIAJBFGohAiAEQQFqIQQMAAsLQQAgBSAAIAUgAEsbNgLYh8CAACABQRBqELWAgIAAIAEoAhRBA3QhBCABKAIQIQUCQANAIARFDQEgBUIANwMAIARBeGohBCAFQQhqIQUMAAsLQQAhBEEAKALQh8CAACEGQQAoAriHwIAAIQBBCiEFA0ACQAJAIAYgBEYNACABQQhqELGAgIAAAkACQCAEIAEoAgwiAk8NACABKAIIIAVqIgItAABBAXFFDQMgAkF2aigCACICIABJDQEMAwsgBCACEIWAgIAAAAsgARC1gICAAAJAIAJBBnYiAyABKAIEIgdPDQAgASgCACADQQN0aiIDIAMpAwBCASACQT9xrYaENwMADAILIAMgBxCFgICAAAALEN2AgIAAIAFBIGokgICAgAAPCyAEQQFqIQQgBUEUaiEFDAALCyAEIAYQhYCAgAAAC8EPBg9/AX4BfwF+BH8BfiOAgICAAEHQAGsiACSAgICAAAJAAkACQEEALQDMw8WAACIBDQAQ3YCAgAAMAQsCQCABQQNJDQBBACECAkBBACgCyMPFgABBACgC2MPFgABHDQBBACECQQAoAuDDxYAAIgNBFGxBACgC3MPFgAAiBEEYbCIFaiIGIANBA3RqIgdBACgC6MPFgAAiCGoiCUEAKALkw8WAACIKakEAKALUw8WAACILRw0AQQAoAsCRwIAAIQwCQCABQQNGDQBBACECQqXGiKHInKf5SyAMIAsQnoGAgABBACkD8MPFgABSDQELIAxBFGohAiALQRhuIg1BAWohDiAKrSEPQQAhAQJAAkACQANAAkAgBCABRw0AIAVBKGohECAErSEPIAitIRFBACESIAMhEwwCCyAOIAFBAWoiAUYNAiACNQAAIhFCgARWDQMgAkF8aiEUIAJBGGohAiAUNQAAIBF8IA9YDQAMAwsLA0ACQAJAAkACQAJAIBIgA0YNACASQRRsIAVqIgJBFGohASACQWtLDQMgASALSw0CIAwgAmoiAjMACCACNQAEfCARVg0HIAI1ABAgAjUADHwgD1YNByACLwAKQQFxDQQgAigAACEVIBAhAiATIRQDQCAUQX9qIhRFDQUgAiALSw0CIAwgAmohASACQRRqIg4hAiABQXZqLQAAQQFxDQAgDiECIAFBbGooAAAgFUYNCAwACwsQwoCAgABBACEBQQAgAzYC0IfAgABBACAENgLIh8CAAEEAIAg2AtSHwIAAQQAgCjYCzIfAgAAgDUEYbCEVQRghDkEAIQICQANAAkAgBCACRw0AIAwgBWohFUEAIQJBACEBAkACQAJAAkACQAJAAkACQAJAA0ACQCADIAFHDQAgDCAGaiEOQQAhAkEAIQEDQCADIAFGDQMgBiACaiIUQQhqIQQgFEF3Sw0IIAQgC0sNCSAAQThqELKAgIAAIAEgACgCPCIUTw0EIAAoAjggAmogDiACaikAADcAACABQQFqIQEgAkEIaiECDAALCyAFIAJqIhRBFGohBCAUQWtLDQQgBCALSw0FIABBwABqELGAgIAAIAEgACgCRCIUTw0DIBUgAmoiFEEIaigAACEOIBQpAAAhESAAKAJAIAJqIgRBDGogFEEMaikAADcCACAEIBE3AgAgBEEIaiAONgIAIAFBAWohASACQRRqIQIMAAsLIABBMGoQs4CAgAAgAEEoaiAIIAAoAjAgACgCNBCCgICA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';
|
package/src/albex-worker.ts
CHANGED
|
@@ -20,10 +20,28 @@
|
|
|
20
20
|
* call is in flight at a time. This matches the actual `static mut` model
|
|
21
21
|
* inside the .wasm and is fine for an interactive search UI (each keystroke
|
|
22
22
|
* replaces the previous query).
|
|
23
|
+
*
|
|
24
|
+
* ## OCR is NOT available in the worker
|
|
25
|
+
*
|
|
26
|
+
* `AlbexEngineWorker` has no `attachOcr`: an OCR adapter is an object with
|
|
27
|
+
* functions, and functions cannot cross the `postMessage` boundary (the
|
|
28
|
+
* structured-clone algorithm rejects them). Consequences:
|
|
29
|
+
*
|
|
30
|
+
* - **Scanned (image-only) PDFs index with 0 chunks, silently.** The
|
|
31
|
+
* engine records a diagnostic explaining why — read it with
|
|
32
|
+
* {@link takeDiagnostics} after `indexFile`.
|
|
33
|
+
* - If your corpus contains scanned PDFs and you need their text, index
|
|
34
|
+
* them with the synchronous main-thread `AlbexEngine` plus the OCR
|
|
35
|
+
* adapter (`engine.attachOcr(...)` / `@albex/ocr`'s `enableOcr`), then
|
|
36
|
+
* `save()` the snapshot and `load()` it from the worker engine.
|
|
37
|
+
* - A future protocol iteration could proxy OCR over a dedicated
|
|
38
|
+
* `MessagePort`; until then the main-thread engine is the OCR path.
|
|
23
39
|
*/
|
|
24
40
|
|
|
25
41
|
import type {
|
|
42
|
+
AlbexDiagnostic,
|
|
26
43
|
AlbexOptions,
|
|
44
|
+
AuthoritativeChunk,
|
|
27
45
|
IndexedDocument,
|
|
28
46
|
SearchOptions,
|
|
29
47
|
SearchResult,
|
|
@@ -41,6 +59,7 @@ import {
|
|
|
41
59
|
AlbexUnsupportedFormatError,
|
|
42
60
|
AlbexParseError,
|
|
43
61
|
AlbexCapacityError,
|
|
62
|
+
assertFileSizeWithinLimit,
|
|
44
63
|
} from './errors.js';
|
|
45
64
|
|
|
46
65
|
export interface AlbexWorkerOptions extends AlbexOptions {
|
|
@@ -60,12 +79,32 @@ export class AlbexEngineWorker {
|
|
|
60
79
|
private _worker!: Worker;
|
|
61
80
|
private _nextId = 1;
|
|
62
81
|
private _pending = new Map<number, Pending>();
|
|
63
|
-
private _docsCache: IndexedDocument[] = [];
|
|
64
82
|
|
|
65
83
|
constructor(opts: AlbexWorkerOptions) {
|
|
66
84
|
this._opts = opts;
|
|
67
85
|
}
|
|
68
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Spawn the worker and initialise the engine inside it.
|
|
89
|
+
*
|
|
90
|
+
* Every serializable engine option is forwarded across the worker
|
|
91
|
+
* boundary (`wasmUrl`, `wasmBaseUrl`, `pdfWasmUrl`, `capacity`, `simd`,
|
|
92
|
+
* `gpu`, `gpuThreshold`, `maxFileBytes`) — only `workerUrl`, which is
|
|
93
|
+
* consumed on this side, is stripped. Notes on what applies in a worker:
|
|
94
|
+
*
|
|
95
|
+
* - `capacity`: fully honoured — both the `'std'`/`'large'` presets
|
|
96
|
+
* (plain strings) and a custom object are structured-clone-safe, so
|
|
97
|
+
* the worker-side engine sizes its pools exactly like a main-thread
|
|
98
|
+
* engine would. Mind the memory cost (`'large'` ≈ 180 MB) lives in
|
|
99
|
+
* the worker's heap.
|
|
100
|
+
* - `wasmBaseUrl` + `simd`: fully honoured — the worker-side engine can
|
|
101
|
+
* load the `_simd.wasm` variant.
|
|
102
|
+
* - `gpu` / `gpuThreshold`: honoured where the worker runtime exposes
|
|
103
|
+
* WebGPU. `navigator.gpu` is available in dedicated workers in
|
|
104
|
+
* Chromium-based browsers (compute needs no canvas); elsewhere the
|
|
105
|
+
* engine's GPU probe fails gracefully and searches use the CPU
|
|
106
|
+
* pre-filter, exactly as on the main thread.
|
|
107
|
+
*/
|
|
69
108
|
async init(): Promise<void> {
|
|
70
109
|
this._worker = new Worker(this._opts.workerUrl, { type: 'module' });
|
|
71
110
|
this._worker.onmessage = (ev: MessageEvent<WorkerResponse>) => {
|
|
@@ -82,10 +121,16 @@ export class AlbexEngineWorker {
|
|
|
82
121
|
for (const [, p] of this._pending) p.reject(err);
|
|
83
122
|
this._pending.clear();
|
|
84
123
|
};
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
124
|
+
// Forward every serializable engine option. AlbexOptions is data-only
|
|
125
|
+
// (strings/numbers/booleans), but filter defensively so a future
|
|
126
|
+
// non-clonable option (function, DOM handle) cannot break postMessage.
|
|
127
|
+
const opts: AlbexOptions = {};
|
|
128
|
+
for (const [k, v] of Object.entries(this._opts)) {
|
|
129
|
+
if (k === 'workerUrl') continue; // consumed on this side
|
|
130
|
+
if (v === undefined || typeof v === 'function') continue;
|
|
131
|
+
(opts as Record<string, unknown>)[k] = v;
|
|
132
|
+
}
|
|
133
|
+
await this._send({ kind: 'init', opts });
|
|
89
134
|
}
|
|
90
135
|
|
|
91
136
|
private _send<T = unknown>(op: WorkerOp, transfer: Transferable[] = []): Promise<T> {
|
|
@@ -98,20 +143,31 @@ export class AlbexEngineWorker {
|
|
|
98
143
|
}
|
|
99
144
|
|
|
100
145
|
async indexFile(file: File): Promise<IndexedDocument> {
|
|
146
|
+
// Size guard BEFORE reading: the worker-side engine enforces the same
|
|
147
|
+
// limit, but checking here avoids buffering an oversized file on the
|
|
148
|
+
// main thread just to have the worker reject it.
|
|
149
|
+
assertFileSizeWithinLimit(file, this._opts.maxFileBytes);
|
|
101
150
|
const buffer = await file.arrayBuffer();
|
|
102
151
|
// Transfer the buffer to avoid a copy.
|
|
103
|
-
|
|
152
|
+
return this._send<IndexedDocument>(
|
|
104
153
|
{ kind: 'indexFile', name: file.name, buffer },
|
|
105
154
|
[buffer],
|
|
106
155
|
);
|
|
107
|
-
this._docsCache.push(doc);
|
|
108
|
-
return doc;
|
|
109
156
|
}
|
|
110
157
|
|
|
111
158
|
search(query: string, opts: SearchOptions = {}): Promise<SearchResult[]> {
|
|
112
159
|
return this._send<SearchResult[]>({ kind: 'search', query, options: opts });
|
|
113
160
|
}
|
|
114
161
|
|
|
162
|
+
/**
|
|
163
|
+
* Enumerate the authoritative chunks Albex indexed for `docId`
|
|
164
|
+
* (`IndexedDocument.docId` from {@link indexFile}). Mirrors
|
|
165
|
+
* `AlbexEngine.listChunks` across the worker boundary.
|
|
166
|
+
*/
|
|
167
|
+
listChunks(docId: number): Promise<AuthoritativeChunk[]> {
|
|
168
|
+
return this._send<AuthoritativeChunk[]>({ kind: 'listChunks', docId });
|
|
169
|
+
}
|
|
170
|
+
|
|
115
171
|
/**
|
|
116
172
|
* Cooperative variant of `search`. Today the wire still sends a single
|
|
117
173
|
* batch — the result array is fetched in one round-trip from the worker
|
|
@@ -137,17 +193,44 @@ export class AlbexEngineWorker {
|
|
|
137
193
|
}
|
|
138
194
|
|
|
139
195
|
async removeDocument(id: string): Promise<boolean> {
|
|
140
|
-
|
|
141
|
-
if (ok) this._docsCache = this._docsCache.filter(d => d.name !== id && d.contentHash !== id);
|
|
142
|
-
return ok;
|
|
196
|
+
return this._send<boolean>({ kind: 'removeDocument', id });
|
|
143
197
|
}
|
|
144
198
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
199
|
+
/**
|
|
200
|
+
* Replace a previously indexed document with new content. Mirrors
|
|
201
|
+
* `AlbexEngine.replaceDocument`: equivalent to `removeDocument(name)` +
|
|
202
|
+
* `indexFile(newFile)` without tripping the idempotency check, plus an
|
|
203
|
+
* opportunistic compact under text-pool pressure — all inside the
|
|
204
|
+
* worker-side engine's lock. The file bytes are transferred (zero-copy),
|
|
205
|
+
* like `indexFile`.
|
|
206
|
+
*/
|
|
207
|
+
async replaceDocument(name: string, newFile: File): Promise<IndexedDocument> {
|
|
208
|
+
assertFileSizeWithinLimit(newFile, this._opts.maxFileBytes);
|
|
209
|
+
const buffer = await newFile.arrayBuffer();
|
|
210
|
+
return this._send<IndexedDocument>(
|
|
211
|
+
{ kind: 'replaceDocument', name, fileName: newFile.name, buffer },
|
|
212
|
+
[buffer],
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Drain and return the diagnostics collected by the worker-side engine
|
|
218
|
+
* since the last call. Mirrors `AlbexEngine.takeDiagnostics` — consult it
|
|
219
|
+
* after `indexFile`/`load` to surface recoverable issues (PDF fallbacks,
|
|
220
|
+
* skipped content, persistence warnings). The worker-side buffer is
|
|
221
|
+
* cleared on each call.
|
|
222
|
+
*
|
|
223
|
+
* Particularly important in a worker: scanned PDFs index with **0 chunks**
|
|
224
|
+
* (no OCR available — see the note on OCR below), and the diagnostic
|
|
225
|
+
* explaining why is only visible through this method.
|
|
226
|
+
*/
|
|
227
|
+
takeDiagnostics(): Promise<AlbexDiagnostic[]> {
|
|
228
|
+
return this._send<AlbexDiagnostic[]>({ kind: 'takeDiagnostics' });
|
|
149
229
|
}
|
|
150
230
|
|
|
231
|
+
async compact(): Promise<void> { await this._send({ kind: 'compact' }); }
|
|
232
|
+
async reset(): Promise<void> { await this._send({ kind: 'reset' }); }
|
|
233
|
+
|
|
151
234
|
getStats(): Promise<EngineStats> { return this._send({ kind: 'getStats' }); }
|
|
152
235
|
getLastSearchStats(): Promise<SearchStats | null> { return this._send({ kind: 'getLastSearchStats' }); }
|
|
153
236
|
getDocuments(): Promise<readonly IndexedDocument[]> { return this._send({ kind: 'getDocuments' }); }
|
|
@@ -168,16 +251,18 @@ export class AlbexEngineWorker {
|
|
|
168
251
|
for (const [, p] of this._pending) p.reject(new AlbexError('disposed', 'Engine disposed'));
|
|
169
252
|
this._pending.clear();
|
|
170
253
|
this._worker?.terminate();
|
|
171
|
-
this._docsCache = [];
|
|
172
254
|
}
|
|
173
255
|
}
|
|
174
256
|
|
|
175
|
-
function rehydrateError(e: { name: string; kind?: string; message: string }): Error {
|
|
257
|
+
function rehydrateError(e: { name: string; kind?: string; message: string; limit?: string; max?: number }): Error {
|
|
176
258
|
switch (e.kind) {
|
|
177
259
|
case 'init': return new AlbexInitError(e.message);
|
|
178
260
|
case 'unsupported_format': return new AlbexUnsupportedFormatError(e.message.replace(/^Unsupported format: \./, ''));
|
|
179
261
|
case 'parse': return new AlbexParseError('unknown', e.message);
|
|
180
|
-
|
|
262
|
+
// `limit`/`max` survive the wire (worker-runtime serialises them) so
|
|
263
|
+
// the rehydrated error still reports the runtime capacity that
|
|
264
|
+
// overflowed inside the worker-side engine.
|
|
265
|
+
case 'capacity': return new AlbexCapacityError(e.message, e.limit as never, e.max);
|
|
181
266
|
default: {
|
|
182
267
|
const err = new Error(e.message);
|
|
183
268
|
err.name = e.name;
|