@lls/offline 24.28.0-49b8bfbf → 24.28.0-4ea0628e
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/lib/assets/fetch-worker.js +38 -47
- package/lib/assets/offline-worker.js +41 -51
- package/lib/index.js +30 -29
- package/package.json +2 -2
|
@@ -17,10 +17,10 @@ var parseRange = (range, size) => {
|
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
// src/utils/worker.ts
|
|
20
|
-
var makeSyncWorker = (
|
|
20
|
+
var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
21
21
|
const dic = {};
|
|
22
22
|
const cbks = {};
|
|
23
|
-
const fn = ({ data: { eventId, methodName, results, error, arg } = {} }
|
|
23
|
+
const fn = ({ source, data: { eventId, methodName, results, error, arg } = {} }) => {
|
|
24
24
|
if (eventId && eventId in dic) {
|
|
25
25
|
if (error) {
|
|
26
26
|
dic[eventId].reject(error);
|
|
@@ -28,11 +28,11 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
28
28
|
dic[eventId].resolve(results);
|
|
29
29
|
}
|
|
30
30
|
} else {
|
|
31
|
-
if (methodName && !
|
|
31
|
+
if (methodName && !(methodName in cbks)) {
|
|
32
32
|
console.error(`syncWorker: unknown methodName cbk ${dbg}`, eventId, methodName, error);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
methodName && cbks[methodName]?.(arg);
|
|
35
|
+
methodName && cbks[methodName]?.({ source, ...arg });
|
|
36
36
|
};
|
|
37
37
|
const makeFn = (methodName) => {
|
|
38
38
|
return ({ ports, ...arg } = {}) => {
|
|
@@ -40,7 +40,7 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
40
40
|
const eventId = `${methodName}:${Date.now()}-${Math.random().toFixed(5)}`;
|
|
41
41
|
let resolved = false;
|
|
42
42
|
const timeout = setTimeout(() => {
|
|
43
|
-
console.warn("slow request for", methodName, arg);
|
|
43
|
+
console.warn("slow request for", methodName, arg, eventId);
|
|
44
44
|
}, 3e3);
|
|
45
45
|
const doResolve = (arg2) => {
|
|
46
46
|
if (!resolved) {
|
|
@@ -50,11 +50,16 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
52
|
dic[eventId] = { resolve: doResolve, reject };
|
|
53
|
-
|
|
53
|
+
if (ports) {
|
|
54
|
+
offlineWorker.postMessage({ eventId, methodName, arg }, ports);
|
|
55
|
+
} else {
|
|
56
|
+
offlineWorker.postMessage({ eventId, methodName, arg });
|
|
57
|
+
}
|
|
54
58
|
});
|
|
55
59
|
};
|
|
56
60
|
};
|
|
57
|
-
const
|
|
61
|
+
const fns = Object.fromEntries(methodNames.map((name) => [name, makeFn(name)]));
|
|
62
|
+
const obj = Object.assign(fns, {
|
|
58
63
|
on: (key, fn2) => {
|
|
59
64
|
cbks[key] = fn2;
|
|
60
65
|
}
|
|
@@ -71,26 +76,38 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
71
76
|
};
|
|
72
77
|
var a = (a2) => a2;
|
|
73
78
|
var makeSyncHandler = a(
|
|
74
|
-
(
|
|
79
|
+
(services) => ({
|
|
75
80
|
canHandle: (methodName) => {
|
|
76
81
|
return methodName in services;
|
|
77
82
|
},
|
|
78
|
-
handle: async ({ data: { eventId, methodName, arg } = {}, ports }) => {
|
|
83
|
+
handle: async ({ data: { eventId, methodName, arg } = {}, source, ports, target }) => {
|
|
84
|
+
const emitter = source?.postMessage && source || target?.postMessage && target || self;
|
|
79
85
|
try {
|
|
80
86
|
if (typeof methodName === "string" && methodName in services && services[methodName]) {
|
|
81
87
|
const results = await services[methodName](arg, { ports });
|
|
82
|
-
|
|
88
|
+
emitter.postMessage({ eventId, methodName, results });
|
|
83
89
|
return;
|
|
84
90
|
}
|
|
85
91
|
throw new Error(`invalid methodName ${Object.keys(services)} |${String(methodName)}`);
|
|
86
92
|
} catch (e) {
|
|
87
93
|
console.debug("failed", e);
|
|
88
|
-
|
|
94
|
+
emitter.postMessage({ eventId, methodName, error: e });
|
|
89
95
|
}
|
|
90
96
|
}
|
|
91
97
|
})
|
|
92
98
|
);
|
|
93
99
|
var jsonToBuf = (json) => new TextEncoder().encode(JSON.stringify(json));
|
|
100
|
+
var combineHandlers = (...handlers) => {
|
|
101
|
+
return (message) => {
|
|
102
|
+
const methodName = String("methodName" in message.data ? message.data.methodName : "");
|
|
103
|
+
for (const h of handlers) {
|
|
104
|
+
if (h.canHandle(methodName)) {
|
|
105
|
+
return h.handle(message);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
console.error("no handlers matched", methodName);
|
|
109
|
+
};
|
|
110
|
+
};
|
|
94
111
|
var openCache = async (mode) => caches.open(`LLS_OFFLINE_${mode}`);
|
|
95
112
|
var isStoryZip = (name) => /story-.*?\.zip/.test(name);
|
|
96
113
|
var isValidZipName = (name) => {
|
|
@@ -339,7 +356,7 @@ var fetchAsset = async (ev, { entryId, mimeType, offlineWorkerSync: offlineWorke
|
|
|
339
356
|
try {
|
|
340
357
|
const [buf, maybeRangeHeaders] = await offlineWorkerSync2.readZipEntry(entryId).then((buf2) => {
|
|
341
358
|
const range = ev.request.headers.get("Range");
|
|
342
|
-
if (!
|
|
359
|
+
if (!hasStreamingExtension(ev.request.url)) {
|
|
343
360
|
return [buf2, {}];
|
|
344
361
|
}
|
|
345
362
|
if (!range) {
|
|
@@ -420,6 +437,7 @@ var ACCEPTED_EXTENSIONS = {
|
|
|
420
437
|
".riv": "application/octet-stream",
|
|
421
438
|
".pdf": "application/pdf"
|
|
422
439
|
};
|
|
440
|
+
var hasStreamingExtension = (str) => /\.(mp3|mp4|webm|m4a)$/.test(str);
|
|
423
441
|
var putInCache = async (request, response) => {
|
|
424
442
|
const cache = await openCache(CONF_ENV);
|
|
425
443
|
await cache.put(request, response);
|
|
@@ -503,23 +521,20 @@ swSelf.addEventListener("install", (_event) => {
|
|
|
503
521
|
swSelf.addEventListener("activate", (event) => {
|
|
504
522
|
event.waitUntil(swSelf.clients.claim());
|
|
505
523
|
});
|
|
506
|
-
var
|
|
524
|
+
var setKnownLinks2 = (arg) => setKnownLinks(knownLinks, arg);
|
|
507
525
|
var offlineWorkerSync;
|
|
508
526
|
var initChannel = async (__, { ports }) => {
|
|
509
527
|
console.info(`FETCH WORKER innitChannel v${/* @__PURE__ */ new Date()}`);
|
|
510
|
-
offlineWorker = ports[0];
|
|
511
|
-
const { handler, ...sender } = makeSyncWorker(
|
|
528
|
+
const offlineWorker = ports[0];
|
|
529
|
+
const { handler: syncHandler, ...sender } = makeSyncWorker(
|
|
512
530
|
offlineWorker,
|
|
513
|
-
["readZipEntry", "loadBook", "slugToFileMeta", "loadPageContent", "searchBooks"],
|
|
531
|
+
["readZipEntry", "loadBook", "slugToFileMeta", "loadPageContent", "searchBooks", "ensureAppReady"],
|
|
514
532
|
"fetchworker"
|
|
515
533
|
);
|
|
534
|
+
const onHandler = makeSyncHandler({ setKnownLinks: setKnownLinks2 });
|
|
516
535
|
offlineWorkerSync = sender;
|
|
517
|
-
offlineWorker.onmessage =
|
|
518
|
-
offlineWorkerSync.
|
|
519
|
-
setKnownLinks(knownLinks, { entryNames, bookId });
|
|
520
|
-
offlineWorker.postMessage({ methodName: "setKnownLinks:back", eventId });
|
|
521
|
-
});
|
|
522
|
-
offlineWorker.postMessage({ methodName: "sendAppReady" });
|
|
536
|
+
offlineWorker.onmessage = combineHandlers(syncHandler, onHandler);
|
|
537
|
+
await offlineWorkerSync.ensureAppReady();
|
|
523
538
|
};
|
|
524
539
|
var knownLinks = /* @__PURE__ */ new Map();
|
|
525
540
|
var configure = ({
|
|
@@ -536,28 +551,4 @@ var configure = ({
|
|
|
536
551
|
}
|
|
537
552
|
console.info("sw::configure", { STORAGE, CONF_ENV });
|
|
538
553
|
};
|
|
539
|
-
swSelf.onmessage =
|
|
540
|
-
data: { methodName, arg } = {},
|
|
541
|
-
ports
|
|
542
|
-
}) => {
|
|
543
|
-
const services = {
|
|
544
|
-
initChannel,
|
|
545
|
-
configure
|
|
546
|
-
};
|
|
547
|
-
try {
|
|
548
|
-
if (methodName === "configure") {
|
|
549
|
-
await services[methodName](arg);
|
|
550
|
-
return;
|
|
551
|
-
}
|
|
552
|
-
if (methodName === "initChannel") {
|
|
553
|
-
if (!ports.length) {
|
|
554
|
-
throw new Error("fetchworker::missing port!");
|
|
555
|
-
}
|
|
556
|
-
await services[methodName](arg, { ports });
|
|
557
|
-
return;
|
|
558
|
-
}
|
|
559
|
-
throw new Error(`fetchworker:invalid methodName ${Object.keys(services)} ${methodName}`);
|
|
560
|
-
} catch (e) {
|
|
561
|
-
console.error("failed", methodName, arg, e);
|
|
562
|
-
}
|
|
563
|
-
};
|
|
554
|
+
swSelf.onmessage = combineHandlers(makeSyncHandler({ initChannel, configure }));
|
|
@@ -13,7 +13,7 @@ var tryCatch = (fn) => {
|
|
|
13
13
|
var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
14
14
|
const dic = {};
|
|
15
15
|
const cbks = {};
|
|
16
|
-
const fn = ({ data: { eventId, methodName, results, error, arg } = {} }
|
|
16
|
+
const fn = ({ source, data: { eventId, methodName, results, error, arg } = {} }) => {
|
|
17
17
|
if (eventId && eventId in dic) {
|
|
18
18
|
if (error) {
|
|
19
19
|
dic[eventId].reject(error);
|
|
@@ -21,11 +21,11 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
|
21
21
|
dic[eventId].resolve(results);
|
|
22
22
|
}
|
|
23
23
|
} else {
|
|
24
|
-
if (methodName && !
|
|
24
|
+
if (methodName && !(methodName in cbks)) {
|
|
25
25
|
console.error(`syncWorker: unknown methodName cbk ${dbg}`, eventId, methodName, error);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
methodName && cbks[methodName]?.(arg);
|
|
28
|
+
methodName && cbks[methodName]?.({ source, ...arg });
|
|
29
29
|
};
|
|
30
30
|
const makeFn = (methodName) => {
|
|
31
31
|
return ({ ports, ...arg } = {}) => {
|
|
@@ -33,7 +33,7 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
|
33
33
|
const eventId = `${methodName}:${Date.now()}-${Math.random().toFixed(5)}`;
|
|
34
34
|
let resolved = false;
|
|
35
35
|
const timeout = setTimeout(() => {
|
|
36
|
-
console.warn("slow request for", methodName, arg);
|
|
36
|
+
console.warn("slow request for", methodName, arg, eventId);
|
|
37
37
|
}, 3e3);
|
|
38
38
|
const doResolve = (arg2) => {
|
|
39
39
|
if (!resolved) {
|
|
@@ -43,11 +43,16 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
45
|
dic[eventId] = { resolve: doResolve, reject };
|
|
46
|
-
|
|
46
|
+
if (ports) {
|
|
47
|
+
offlineWorker.postMessage({ eventId, methodName, arg }, ports);
|
|
48
|
+
} else {
|
|
49
|
+
offlineWorker.postMessage({ eventId, methodName, arg });
|
|
50
|
+
}
|
|
47
51
|
});
|
|
48
52
|
};
|
|
49
53
|
};
|
|
50
|
-
const
|
|
54
|
+
const fns = Object.fromEntries(methodNames.map((name) => [name, makeFn(name)]));
|
|
55
|
+
const obj = Object.assign(fns, {
|
|
51
56
|
on: (key2, fn2) => {
|
|
52
57
|
cbks[key2] = fn2;
|
|
53
58
|
}
|
|
@@ -64,31 +69,33 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
|
64
69
|
};
|
|
65
70
|
var a = (a2) => a2;
|
|
66
71
|
var makeSyncHandler = a(
|
|
67
|
-
(
|
|
72
|
+
(services) => ({
|
|
68
73
|
canHandle: (methodName) => {
|
|
69
74
|
return methodName in services;
|
|
70
75
|
},
|
|
71
|
-
handle: async ({ data: { eventId, methodName, arg } = {}, ports }) => {
|
|
76
|
+
handle: async ({ data: { eventId, methodName, arg } = {}, source, ports, target }) => {
|
|
77
|
+
const emitter = source?.postMessage && source || target?.postMessage && target || self;
|
|
72
78
|
try {
|
|
73
79
|
if (typeof methodName === "string" && methodName in services && services[methodName]) {
|
|
74
80
|
const results = await services[methodName](arg, { ports });
|
|
75
|
-
|
|
81
|
+
emitter.postMessage({ eventId, methodName, results });
|
|
76
82
|
return;
|
|
77
83
|
}
|
|
78
84
|
throw new Error(`invalid methodName ${Object.keys(services)} |${String(methodName)}`);
|
|
79
85
|
} catch (e) {
|
|
80
86
|
console.debug("failed", e);
|
|
81
|
-
|
|
87
|
+
emitter.postMessage({ eventId, methodName, error: e });
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
90
|
})
|
|
85
91
|
);
|
|
86
92
|
var bufToJson = (buf) => JSON.parse(new TextDecoder("UTF-8").decode(new Uint8Array(buf)));
|
|
87
93
|
var combineHandlers = (...handlers) => {
|
|
88
|
-
return (
|
|
94
|
+
return (message) => {
|
|
95
|
+
const methodName = String("methodName" in message.data ? message.data.methodName : "");
|
|
89
96
|
for (const h of handlers) {
|
|
90
|
-
if (h.canHandle(
|
|
91
|
-
return h.handle(
|
|
97
|
+
if (h.canHandle(methodName)) {
|
|
98
|
+
return h.handle(message);
|
|
92
99
|
}
|
|
93
100
|
}
|
|
94
101
|
console.error("no handlers matched", methodName);
|
|
@@ -401,6 +408,7 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
|
|
|
401
408
|
await accessHandle.close();
|
|
402
409
|
} else {
|
|
403
410
|
const cache = await openCache(CONF_ENV);
|
|
411
|
+
console.time("writing cache");
|
|
404
412
|
const response2 = new Response(arrayBuffer, {
|
|
405
413
|
headers: {
|
|
406
414
|
"Cache-Control": "max-age=600, s-maxage=600, public, proxy-revalidate",
|
|
@@ -413,9 +421,12 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
|
|
|
413
421
|
type: "cors",
|
|
414
422
|
url: zipUrl
|
|
415
423
|
});
|
|
416
|
-
|
|
424
|
+
console.debug("writing to cache asynchronously, because takes 4s");
|
|
425
|
+
cache.put(zipUrl, response2).then(() => {
|
|
426
|
+
console.timeEnd("writing cache");
|
|
427
|
+
});
|
|
417
428
|
}
|
|
418
|
-
return
|
|
429
|
+
return arrayBuffer;
|
|
419
430
|
}
|
|
420
431
|
};
|
|
421
432
|
var slugToFileMeta2 = async ({ slug }) => {
|
|
@@ -437,12 +448,7 @@ var loadBook2 = async ({ id: bookId, forceRefresh }) => {
|
|
|
437
448
|
console.time("loadzip");
|
|
438
449
|
const entryNames = await loadZip(new Uint8Array(buf), bookId);
|
|
439
450
|
console.timeEnd("loadzip");
|
|
440
|
-
|
|
441
|
-
const responseForEventId = new Promise((resolve, reject) => {
|
|
442
|
-
dicFetchWorkerCallback[eventId] = { resolve, reject };
|
|
443
|
-
});
|
|
444
|
-
fetchWorker.postMessage({ methodName: "setKnownLinks", arg: { entryNames, bookId, eventId } });
|
|
445
|
-
await responseForEventId;
|
|
451
|
+
await fetchWorkerSync.setKnownLinks({ entryNames, bookId });
|
|
446
452
|
if (isOldZip(bookId)) {
|
|
447
453
|
const json = await readZipEntry({
|
|
448
454
|
entryName: `preload/${bookId}.json`,
|
|
@@ -485,43 +491,27 @@ var loadPageContent2 = async ({
|
|
|
485
491
|
});
|
|
486
492
|
return await loadPageContent({ chapterId, json });
|
|
487
493
|
};
|
|
488
|
-
var
|
|
489
|
-
var dicFetchWorkerCallback = {};
|
|
490
|
-
var handleFetchWorkerCallback = ({ data: { eventId } }) => {
|
|
491
|
-
if (dicFetchWorkerCallback[eventId]) {
|
|
492
|
-
dicFetchWorkerCallback[eventId].resolve();
|
|
493
|
-
} else {
|
|
494
|
-
console.debug("unknown eventId", eventId);
|
|
495
|
-
}
|
|
494
|
+
var ensureAppReady = () => {
|
|
496
495
|
};
|
|
496
|
+
var fetchWorker;
|
|
497
|
+
var fetchWorkerSync;
|
|
497
498
|
var initChannel = (__, { ports }) => {
|
|
498
499
|
fetchWorker = ports[0];
|
|
499
|
-
const
|
|
500
|
+
const onHandler = makeSyncHandler({
|
|
500
501
|
readZipEntry,
|
|
501
502
|
loadBook: loadBook2,
|
|
502
503
|
slugToFileMeta: slugToFileMeta2,
|
|
503
504
|
loadPageContent: loadPageContent2,
|
|
504
|
-
searchBooks
|
|
505
|
+
searchBooks,
|
|
506
|
+
ensureAppReady
|
|
505
507
|
});
|
|
506
|
-
const
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
console.debug("missing eventId to get response back for setKnownLinks:back");
|
|
514
|
-
return;
|
|
515
|
-
}
|
|
516
|
-
handleFetchWorkerCallback(dataObj);
|
|
517
|
-
return;
|
|
518
|
-
}
|
|
519
|
-
if (canHandle(dataObj.data?.methodName || "")) {
|
|
520
|
-
return handle(dataObj);
|
|
521
|
-
}
|
|
522
|
-
console.error("unknown methodName", dataObj.data?.methodName);
|
|
523
|
-
};
|
|
524
|
-
fetchWorker.onmessage = fn;
|
|
508
|
+
const { handler: syncHandler, ...sender2 } = makeSyncWorker(
|
|
509
|
+
fetchWorker,
|
|
510
|
+
["setKnownLinks"],
|
|
511
|
+
"offline-worker"
|
|
512
|
+
);
|
|
513
|
+
fetchWorkerSync = sender2;
|
|
514
|
+
fetchWorker.onmessage = combineHandlers(syncHandler, onHandler);
|
|
525
515
|
};
|
|
526
516
|
var loadBooks = async ({ primaryOnly = false } = {}) => {
|
|
527
517
|
let entries = [];
|
|
@@ -593,7 +583,7 @@ var reset = async () => {
|
|
|
593
583
|
await (await navigator.storage.getDirectory()).remove({ recursive: true });
|
|
594
584
|
console.info("opfs cleared");
|
|
595
585
|
};
|
|
596
|
-
var mainHandle = makeSyncHandler(
|
|
586
|
+
var mainHandle = makeSyncHandler({
|
|
597
587
|
initChannel,
|
|
598
588
|
loadPreload: loadPreload2,
|
|
599
589
|
readZipEntry,
|
package/lib/index.js
CHANGED
|
@@ -13,7 +13,7 @@ var tryCatch = (fn) => {
|
|
|
13
13
|
var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
14
14
|
const dic = {};
|
|
15
15
|
const cbks = {};
|
|
16
|
-
const fn = ({ data: { eventId, methodName, results, error, arg } = {} }
|
|
16
|
+
const fn = ({ source, data: { eventId, methodName, results, error, arg } = {} }) => {
|
|
17
17
|
if (eventId && eventId in dic) {
|
|
18
18
|
if (error) {
|
|
19
19
|
dic[eventId].reject(error);
|
|
@@ -21,11 +21,11 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
21
21
|
dic[eventId].resolve(results);
|
|
22
22
|
}
|
|
23
23
|
} else {
|
|
24
|
-
if (methodName && !
|
|
24
|
+
if (methodName && !(methodName in cbks)) {
|
|
25
25
|
console.error(`syncWorker: unknown methodName cbk ${dbg}`, eventId, methodName, error);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
methodName && cbks[methodName]?.(arg);
|
|
28
|
+
methodName && cbks[methodName]?.({ source, ...arg });
|
|
29
29
|
};
|
|
30
30
|
const makeFn = (methodName) => {
|
|
31
31
|
return ({ ports, ...arg } = {}) => {
|
|
@@ -33,7 +33,7 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
33
33
|
const eventId = `${methodName}:${Date.now()}-${Math.random().toFixed(5)}`;
|
|
34
34
|
let resolved = false;
|
|
35
35
|
const timeout = setTimeout(() => {
|
|
36
|
-
console.warn("slow request for", methodName, arg);
|
|
36
|
+
console.warn("slow request for", methodName, arg, eventId);
|
|
37
37
|
}, 3e3);
|
|
38
38
|
const doResolve = (arg2) => {
|
|
39
39
|
if (!resolved) {
|
|
@@ -43,11 +43,16 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
45
|
dic[eventId] = { resolve: doResolve, reject };
|
|
46
|
-
|
|
46
|
+
if (ports) {
|
|
47
|
+
offlineWorker2.postMessage({ eventId, methodName, arg }, ports);
|
|
48
|
+
} else {
|
|
49
|
+
offlineWorker2.postMessage({ eventId, methodName, arg });
|
|
50
|
+
}
|
|
47
51
|
});
|
|
48
52
|
};
|
|
49
53
|
};
|
|
50
|
-
const
|
|
54
|
+
const fns = Object.fromEntries(methodNames.map((name) => [name, makeFn(name)]));
|
|
55
|
+
const obj = Object.assign(fns, {
|
|
51
56
|
on: (key, fn2) => {
|
|
52
57
|
cbks[key] = fn2;
|
|
53
58
|
}
|
|
@@ -64,30 +69,32 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
64
69
|
};
|
|
65
70
|
var a = (a2) => a2;
|
|
66
71
|
var makeSyncHandler = a(
|
|
67
|
-
(
|
|
72
|
+
(services) => ({
|
|
68
73
|
canHandle: (methodName) => {
|
|
69
74
|
return methodName in services;
|
|
70
75
|
},
|
|
71
|
-
handle: async ({ data: { eventId, methodName, arg } = {}, ports }) => {
|
|
76
|
+
handle: async ({ data: { eventId, methodName, arg } = {}, source, ports, target }) => {
|
|
77
|
+
const emitter = source?.postMessage && source || target?.postMessage && target || self;
|
|
72
78
|
try {
|
|
73
79
|
if (typeof methodName === "string" && methodName in services && services[methodName]) {
|
|
74
80
|
const results = await services[methodName](arg, { ports });
|
|
75
|
-
|
|
81
|
+
emitter.postMessage({ eventId, methodName, results });
|
|
76
82
|
return;
|
|
77
83
|
}
|
|
78
84
|
throw new Error(`invalid methodName ${Object.keys(services)} |${String(methodName)}`);
|
|
79
85
|
} catch (e) {
|
|
80
86
|
console.debug("failed", e);
|
|
81
|
-
|
|
87
|
+
emitter.postMessage({ eventId, methodName, error: e });
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
90
|
})
|
|
85
91
|
);
|
|
86
92
|
var combineHandlers = (...handlers) => {
|
|
87
|
-
return (
|
|
93
|
+
return (message) => {
|
|
94
|
+
const methodName = String("methodName" in message.data ? message.data.methodName : "");
|
|
88
95
|
for (const h of handlers) {
|
|
89
|
-
if (h.canHandle(
|
|
90
|
-
return h.handle(
|
|
96
|
+
if (h.canHandle(methodName)) {
|
|
97
|
+
return h.handle(message);
|
|
91
98
|
}
|
|
92
99
|
}
|
|
93
100
|
console.error("no handlers matched", methodName);
|
|
@@ -124,14 +131,6 @@ var fetchWorkerPromise = new Promise(
|
|
|
124
131
|
return fetchWorker;
|
|
125
132
|
})
|
|
126
133
|
);
|
|
127
|
-
var setWorkersReady;
|
|
128
|
-
var workersReadyPromise = new Promise((resolve) => {
|
|
129
|
-
setWorkersReady = resolve;
|
|
130
|
-
});
|
|
131
|
-
var setBooksLoaded;
|
|
132
|
-
var setBooksLoadedPromise = new Promise((resolve) => {
|
|
133
|
-
setBooksLoaded = resolve;
|
|
134
|
-
});
|
|
135
134
|
var installWorker = async ({
|
|
136
135
|
skipLoadBooks = false,
|
|
137
136
|
primaryOnly = false,
|
|
@@ -146,7 +145,7 @@ var installWorker = async ({
|
|
|
146
145
|
const fetchWorker = await fetchWorkerPromise;
|
|
147
146
|
const configureOptions = { storage, zipBaseUrl, checkUpdates, confEnv };
|
|
148
147
|
if (nativeReadFile) {
|
|
149
|
-
const wwHandler = makeSyncHandler(
|
|
148
|
+
const wwHandler = makeSyncHandler({ nativeReadFile, nativeWriteFile, nativeListZips });
|
|
150
149
|
offlineWorker.onmessage = combineHandlers(handler, wwHandler);
|
|
151
150
|
if (storage !== "native") {
|
|
152
151
|
console.warn("nativeReadFile given, ignoring storage", storage);
|
|
@@ -154,13 +153,17 @@ var installWorker = async ({
|
|
|
154
153
|
offlineWorkerSync.configure({ ...configureOptions, storage: "native" });
|
|
155
154
|
} else {
|
|
156
155
|
offlineWorker.onmessage = handler.handle;
|
|
157
|
-
offlineWorkerSync.configure(configureOptions);
|
|
156
|
+
await offlineWorkerSync.configure(configureOptions);
|
|
158
157
|
}
|
|
159
|
-
offlineWorkerSync.on("ready", setWorkersReady);
|
|
160
158
|
const channel = new MessageChannel();
|
|
161
|
-
offlineWorkerSync.initChannel({ ports: [channel.port1] });
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
await offlineWorkerSync.initChannel({ ports: [channel.port1] });
|
|
160
|
+
const { handler: fetchWorkerHandler, ...fetchWorkerSync } = makeSyncWorker(fetchWorker, [
|
|
161
|
+
"initChannel",
|
|
162
|
+
"configure"
|
|
163
|
+
]);
|
|
164
|
+
navigator.serviceWorker.onmessage = combineHandlers(fetchWorkerHandler);
|
|
165
|
+
await fetchWorkerSync.initChannel({ ports: [channel.port2] });
|
|
166
|
+
await fetchWorkerSync.configure({ storage, confEnv });
|
|
164
167
|
offlineWorkerSync.on("opfsProgress", () => {
|
|
165
168
|
});
|
|
166
169
|
if (!primaryOnly) {
|
|
@@ -169,7 +172,6 @@ var installWorker = async ({
|
|
|
169
172
|
if (!skipLoadBooks) {
|
|
170
173
|
await offlineWorkerSync.loadBooks({ primaryOnly });
|
|
171
174
|
}
|
|
172
|
-
setBooksLoaded();
|
|
173
175
|
};
|
|
174
176
|
var useOfflineWorker_default = ({
|
|
175
177
|
skipLoadBooks,
|
|
@@ -196,7 +198,6 @@ var useOfflineWorker_default = ({
|
|
|
196
198
|
checkUpdates,
|
|
197
199
|
confEnv
|
|
198
200
|
});
|
|
199
|
-
await Promise.all([workersReadyPromise, setBooksLoadedPromise]);
|
|
200
201
|
fetch(window.location.href.replace(window.location.search, ""));
|
|
201
202
|
setReady(true);
|
|
202
203
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lls/offline",
|
|
3
|
-
"version": "24.28.0-
|
|
3
|
+
"version": "24.28.0-4ea0628e",
|
|
4
4
|
"description": "offline",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"module": "./lib/index.js",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"vite": "7.0.7",
|
|
54
54
|
"vite-tsconfig-paths": "5.1.4",
|
|
55
55
|
"zod": "3.25.50",
|
|
56
|
-
"@lls/vitescripts": "24.28.0-
|
|
56
|
+
"@lls/vitescripts": "24.28.0-4ea0628e"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"redux-persist": "6.0.0"
|