@lls/offline 24.28.0-b983633c → 24.28.0-ca96e90a
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 +47 -41
- package/lib/assets/offline-worker.js +48 -37
- package/lib/index.js +29 -30
- 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 = (offlineWorker2, methodNames, dbg) => {
|
|
21
21
|
const dic = {};
|
|
22
22
|
const cbks = {};
|
|
23
|
-
const fn = ({
|
|
23
|
+
const fn = ({ 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 = (offlineWorker, methodNames, dbg) => {
|
|
|
28
28
|
dic[eventId].resolve(results);
|
|
29
29
|
}
|
|
30
30
|
} else {
|
|
31
|
-
if (methodName && !(methodName in cbks)) {
|
|
31
|
+
if (methodName && !methodName.startsWith("async") && !(methodName in cbks)) {
|
|
32
32
|
console.error(`syncWorker: unknown methodName cbk ${dbg}`, eventId, methodName, error);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
methodName && cbks[methodName]?.(
|
|
35
|
+
methodName && cbks[methodName]?.(arg);
|
|
36
36
|
};
|
|
37
37
|
const makeFn = (methodName) => {
|
|
38
38
|
return ({ ports, ...arg } = {}) => {
|
|
@@ -40,7 +40,7 @@ var makeSyncWorker = (offlineWorker, 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);
|
|
44
44
|
}, 3e3);
|
|
45
45
|
const doResolve = (arg2) => {
|
|
46
46
|
if (!resolved) {
|
|
@@ -50,16 +50,11 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
52
|
dic[eventId] = { resolve: doResolve, reject };
|
|
53
|
-
|
|
54
|
-
offlineWorker.postMessage({ eventId, methodName, arg }, ports);
|
|
55
|
-
} else {
|
|
56
|
-
offlineWorker.postMessage({ eventId, methodName, arg });
|
|
57
|
-
}
|
|
53
|
+
offlineWorker2.postMessage({ eventId, methodName, arg }, ports);
|
|
58
54
|
});
|
|
59
55
|
};
|
|
60
56
|
};
|
|
61
|
-
const
|
|
62
|
-
const obj = Object.assign(fns, {
|
|
57
|
+
const obj = Object.assign(Object.fromEntries(methodNames.map((name) => [name, makeFn(name)])), {
|
|
63
58
|
on: (key, fn2) => {
|
|
64
59
|
cbks[key] = fn2;
|
|
65
60
|
}
|
|
@@ -76,38 +71,26 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
|
76
71
|
};
|
|
77
72
|
var a = (a2) => a2;
|
|
78
73
|
var makeSyncHandler = a(
|
|
79
|
-
(services) => ({
|
|
74
|
+
(sender, services) => ({
|
|
80
75
|
canHandle: (methodName) => {
|
|
81
76
|
return methodName in services;
|
|
82
77
|
},
|
|
83
|
-
handle: async ({ data: { eventId, methodName, arg } = {},
|
|
84
|
-
const emitter = source?.postMessage && source || target?.postMessage && target || self;
|
|
78
|
+
handle: async ({ data: { eventId, methodName, arg } = {}, ports }) => {
|
|
85
79
|
try {
|
|
86
80
|
if (typeof methodName === "string" && methodName in services && services[methodName]) {
|
|
87
81
|
const results = await services[methodName](arg, { ports });
|
|
88
|
-
|
|
82
|
+
sender.postMessage({ eventId, methodName, results });
|
|
89
83
|
return;
|
|
90
84
|
}
|
|
91
85
|
throw new Error(`invalid methodName ${Object.keys(services)} |${String(methodName)}`);
|
|
92
86
|
} catch (e) {
|
|
93
87
|
console.debug("failed", e);
|
|
94
|
-
|
|
88
|
+
sender.postMessage({ eventId, methodName, error: e });
|
|
95
89
|
}
|
|
96
90
|
}
|
|
97
91
|
})
|
|
98
92
|
);
|
|
99
93
|
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
|
-
};
|
|
111
94
|
var openCache = async (mode) => caches.open(`LLS_OFFLINE_${mode}`);
|
|
112
95
|
var isStoryZip = (name) => /story-.*?\.zip/.test(name);
|
|
113
96
|
var isValidZipName = (name) => {
|
|
@@ -356,7 +339,7 @@ var fetchAsset = async (ev, { entryId, mimeType, offlineWorkerSync: offlineWorke
|
|
|
356
339
|
try {
|
|
357
340
|
const [buf, maybeRangeHeaders] = await offlineWorkerSync2.readZipEntry(entryId).then((buf2) => {
|
|
358
341
|
const range = ev.request.headers.get("Range");
|
|
359
|
-
if (!
|
|
342
|
+
if (!ev.request.url.endsWith(".mp4") && !ev.request.url.endsWith(".webm")) {
|
|
360
343
|
return [buf2, {}];
|
|
361
344
|
}
|
|
362
345
|
if (!range) {
|
|
@@ -437,7 +420,6 @@ var ACCEPTED_EXTENSIONS = {
|
|
|
437
420
|
".riv": "application/octet-stream",
|
|
438
421
|
".pdf": "application/pdf"
|
|
439
422
|
};
|
|
440
|
-
var hasStreamingExtension = (str) => /\.(mp3|mp4|webm|m4a)$/.test(str);
|
|
441
423
|
var putInCache = async (request, response) => {
|
|
442
424
|
const cache = await openCache(CONF_ENV);
|
|
443
425
|
await cache.put(request, response);
|
|
@@ -521,23 +503,23 @@ swSelf.addEventListener("install", (_event) => {
|
|
|
521
503
|
swSelf.addEventListener("activate", (event) => {
|
|
522
504
|
event.waitUntil(swSelf.clients.claim());
|
|
523
505
|
});
|
|
524
|
-
var
|
|
506
|
+
var offlineWorker;
|
|
525
507
|
var offlineWorkerSync;
|
|
526
508
|
var initChannel = async (__, { ports }) => {
|
|
527
509
|
console.info(`FETCH WORKER innitChannel v${/* @__PURE__ */ new Date()}`);
|
|
528
|
-
|
|
529
|
-
const { handler
|
|
510
|
+
offlineWorker = ports[0];
|
|
511
|
+
const { handler, ...sender } = makeSyncWorker(
|
|
530
512
|
offlineWorker,
|
|
531
|
-
["readZipEntry", "loadBook", "slugToFileMeta", "loadPageContent", "searchBooks"
|
|
513
|
+
["readZipEntry", "loadBook", "slugToFileMeta", "loadPageContent", "searchBooks"],
|
|
532
514
|
"fetchworker"
|
|
533
515
|
);
|
|
534
|
-
const onHandler = makeSyncHandler({ setKnownLinks: setKnownLinks2 });
|
|
535
516
|
offlineWorkerSync = sender;
|
|
536
|
-
offlineWorker.onmessage =
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
517
|
+
offlineWorker.onmessage = handler.handle;
|
|
518
|
+
offlineWorkerSync.on("setKnownLinks", ({ entryNames, bookId, eventId }) => {
|
|
519
|
+
setKnownLinks(knownLinks, { entryNames, bookId });
|
|
520
|
+
offlineWorker.postMessage({ methodName: "setKnownLinks:back", eventId });
|
|
521
|
+
});
|
|
522
|
+
offlineWorker.postMessage({ methodName: "sendAppReady" });
|
|
541
523
|
};
|
|
542
524
|
var knownLinks = /* @__PURE__ */ new Map();
|
|
543
525
|
var configure = ({
|
|
@@ -554,4 +536,28 @@ var configure = ({
|
|
|
554
536
|
}
|
|
555
537
|
console.info("sw::configure", { STORAGE, CONF_ENV });
|
|
556
538
|
};
|
|
557
|
-
swSelf.onmessage =
|
|
539
|
+
swSelf.onmessage = async ({
|
|
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
|
+
};
|
|
@@ -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 = ({
|
|
16
|
+
const fn = ({ 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 && !(methodName in cbks)) {
|
|
24
|
+
if (methodName && !methodName.startsWith("async") && !(methodName in cbks)) {
|
|
25
25
|
console.error(`syncWorker: unknown methodName cbk ${dbg}`, eventId, methodName, error);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
methodName && cbks[methodName]?.(
|
|
28
|
+
methodName && cbks[methodName]?.(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);
|
|
37
37
|
}, 3e3);
|
|
38
38
|
const doResolve = (arg2) => {
|
|
39
39
|
if (!resolved) {
|
|
@@ -43,16 +43,11 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
45
|
dic[eventId] = { resolve: doResolve, reject };
|
|
46
|
-
|
|
47
|
-
offlineWorker.postMessage({ eventId, methodName, arg }, ports);
|
|
48
|
-
} else {
|
|
49
|
-
offlineWorker.postMessage({ eventId, methodName, arg });
|
|
50
|
-
}
|
|
46
|
+
offlineWorker.postMessage({ eventId, methodName, arg }, ports);
|
|
51
47
|
});
|
|
52
48
|
};
|
|
53
49
|
};
|
|
54
|
-
const
|
|
55
|
-
const obj = Object.assign(fns, {
|
|
50
|
+
const obj = Object.assign(Object.fromEntries(methodNames.map((name) => [name, makeFn(name)])), {
|
|
56
51
|
on: (key2, fn2) => {
|
|
57
52
|
cbks[key2] = fn2;
|
|
58
53
|
}
|
|
@@ -69,33 +64,31 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
|
|
|
69
64
|
};
|
|
70
65
|
var a = (a2) => a2;
|
|
71
66
|
var makeSyncHandler = a(
|
|
72
|
-
(services) => ({
|
|
67
|
+
(sender2, services) => ({
|
|
73
68
|
canHandle: (methodName) => {
|
|
74
69
|
return methodName in services;
|
|
75
70
|
},
|
|
76
|
-
handle: async ({ data: { eventId, methodName, arg } = {},
|
|
77
|
-
const emitter = source?.postMessage && source || target?.postMessage && target || self;
|
|
71
|
+
handle: async ({ data: { eventId, methodName, arg } = {}, ports }) => {
|
|
78
72
|
try {
|
|
79
73
|
if (typeof methodName === "string" && methodName in services && services[methodName]) {
|
|
80
74
|
const results = await services[methodName](arg, { ports });
|
|
81
|
-
|
|
75
|
+
sender2.postMessage({ eventId, methodName, results });
|
|
82
76
|
return;
|
|
83
77
|
}
|
|
84
78
|
throw new Error(`invalid methodName ${Object.keys(services)} |${String(methodName)}`);
|
|
85
79
|
} catch (e) {
|
|
86
80
|
console.debug("failed", e);
|
|
87
|
-
|
|
81
|
+
sender2.postMessage({ eventId, methodName, error: e });
|
|
88
82
|
}
|
|
89
83
|
}
|
|
90
84
|
})
|
|
91
85
|
);
|
|
92
86
|
var bufToJson = (buf) => JSON.parse(new TextDecoder("UTF-8").decode(new Uint8Array(buf)));
|
|
93
87
|
var combineHandlers = (...handlers) => {
|
|
94
|
-
return (
|
|
95
|
-
const methodName = String("methodName" in message.data ? message.data.methodName : "");
|
|
88
|
+
return ({ data: { methodName, ...data } = {}, ports }) => {
|
|
96
89
|
for (const h of handlers) {
|
|
97
|
-
if (h.canHandle(methodName)) {
|
|
98
|
-
return h.handle(
|
|
90
|
+
if (h.canHandle(String(methodName))) {
|
|
91
|
+
return h.handle({ data: { methodName, ...data }, ports });
|
|
99
92
|
}
|
|
100
93
|
}
|
|
101
94
|
console.error("no handlers matched", methodName);
|
|
@@ -448,7 +441,12 @@ var loadBook2 = async ({ id: bookId, forceRefresh }) => {
|
|
|
448
441
|
console.time("loadzip");
|
|
449
442
|
const entryNames = await loadZip(new Uint8Array(buf), bookId);
|
|
450
443
|
console.timeEnd("loadzip");
|
|
451
|
-
|
|
444
|
+
const eventId = `setKnownLinks:${Date.now()}-${Math.random().toFixed(5)}`;
|
|
445
|
+
const responseForEventId = new Promise((resolve, reject) => {
|
|
446
|
+
dicFetchWorkerCallback[eventId] = { resolve, reject };
|
|
447
|
+
});
|
|
448
|
+
fetchWorker.postMessage({ methodName: "setKnownLinks", arg: { entryNames, bookId, eventId } });
|
|
449
|
+
await responseForEventId;
|
|
452
450
|
if (isOldZip(bookId)) {
|
|
453
451
|
const json = await readZipEntry({
|
|
454
452
|
entryName: `preload/${bookId}.json`,
|
|
@@ -491,30 +489,43 @@ var loadPageContent2 = async ({
|
|
|
491
489
|
});
|
|
492
490
|
return await loadPageContent({ chapterId, json });
|
|
493
491
|
};
|
|
494
|
-
var ensureAppReady = () => {
|
|
495
|
-
};
|
|
496
492
|
var fetchWorker;
|
|
497
|
-
var
|
|
493
|
+
var dicFetchWorkerCallback = {};
|
|
494
|
+
var handleFetchWorkerCallback = ({ data: { eventId } }) => {
|
|
495
|
+
if (dicFetchWorkerCallback[eventId]) {
|
|
496
|
+
dicFetchWorkerCallback[eventId].resolve();
|
|
497
|
+
} else {
|
|
498
|
+
console.debug("unknown eventId", eventId);
|
|
499
|
+
}
|
|
500
|
+
};
|
|
498
501
|
var initChannel = (__, { ports }) => {
|
|
499
502
|
fetchWorker = ports[0];
|
|
500
|
-
const
|
|
503
|
+
const { canHandle, handle } = makeSyncHandler(fetchWorker, {
|
|
501
504
|
readZipEntry,
|
|
502
505
|
loadBook: loadBook2,
|
|
503
506
|
slugToFileMeta: slugToFileMeta2,
|
|
504
507
|
loadPageContent: loadPageContent2,
|
|
505
|
-
searchBooks
|
|
506
|
-
ensureAppReady
|
|
508
|
+
searchBooks
|
|
507
509
|
});
|
|
508
|
-
const
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
510
|
+
const fn = (dataObj) => {
|
|
511
|
+
if (dataObj.data?.methodName === "sendAppReady") {
|
|
512
|
+
self.postMessage({ methodName: "ready" });
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
if (dataObj.data?.methodName === "setKnownLinks:back") {
|
|
516
|
+
if (typeof dataObj?.data?.eventId !== "string") {
|
|
517
|
+
console.debug("missing eventId to get response back for setKnownLinks:back");
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
handleFetchWorkerCallback(dataObj);
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
if (canHandle(dataObj.data?.methodName || "")) {
|
|
524
|
+
return handle(dataObj);
|
|
525
|
+
}
|
|
526
|
+
console.error("unknown methodName", dataObj.data?.methodName);
|
|
517
527
|
};
|
|
528
|
+
fetchWorker.onmessage = fn;
|
|
518
529
|
};
|
|
519
530
|
var loadBooks = async ({ primaryOnly = false } = {}) => {
|
|
520
531
|
let entries = [];
|
|
@@ -586,7 +597,7 @@ var reset = async () => {
|
|
|
586
597
|
await (await navigator.storage.getDirectory()).remove({ recursive: true });
|
|
587
598
|
console.info("opfs cleared");
|
|
588
599
|
};
|
|
589
|
-
var mainHandle = makeSyncHandler({
|
|
600
|
+
var mainHandle = makeSyncHandler(self, {
|
|
590
601
|
initChannel,
|
|
591
602
|
loadPreload: loadPreload2,
|
|
592
603
|
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 = ({
|
|
16
|
+
const fn = ({ 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 && !(methodName in cbks)) {
|
|
24
|
+
if (methodName && !methodName.startsWith("async") && !(methodName in cbks)) {
|
|
25
25
|
console.error(`syncWorker: unknown methodName cbk ${dbg}`, eventId, methodName, error);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
methodName && cbks[methodName]?.(
|
|
28
|
+
methodName && cbks[methodName]?.(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);
|
|
37
37
|
}, 3e3);
|
|
38
38
|
const doResolve = (arg2) => {
|
|
39
39
|
if (!resolved) {
|
|
@@ -43,16 +43,11 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
45
|
dic[eventId] = { resolve: doResolve, reject };
|
|
46
|
-
|
|
47
|
-
offlineWorker2.postMessage({ eventId, methodName, arg }, ports);
|
|
48
|
-
} else {
|
|
49
|
-
offlineWorker2.postMessage({ eventId, methodName, arg });
|
|
50
|
-
}
|
|
46
|
+
offlineWorker2.postMessage({ eventId, methodName, arg }, ports);
|
|
51
47
|
});
|
|
52
48
|
};
|
|
53
49
|
};
|
|
54
|
-
const
|
|
55
|
-
const obj = Object.assign(fns, {
|
|
50
|
+
const obj = Object.assign(Object.fromEntries(methodNames.map((name) => [name, makeFn(name)])), {
|
|
56
51
|
on: (key, fn2) => {
|
|
57
52
|
cbks[key] = fn2;
|
|
58
53
|
}
|
|
@@ -69,32 +64,30 @@ var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
|
|
|
69
64
|
};
|
|
70
65
|
var a = (a2) => a2;
|
|
71
66
|
var makeSyncHandler = a(
|
|
72
|
-
(services) => ({
|
|
67
|
+
(sender, services) => ({
|
|
73
68
|
canHandle: (methodName) => {
|
|
74
69
|
return methodName in services;
|
|
75
70
|
},
|
|
76
|
-
handle: async ({ data: { eventId, methodName, arg } = {},
|
|
77
|
-
const emitter = source?.postMessage && source || target?.postMessage && target || self;
|
|
71
|
+
handle: async ({ data: { eventId, methodName, arg } = {}, ports }) => {
|
|
78
72
|
try {
|
|
79
73
|
if (typeof methodName === "string" && methodName in services && services[methodName]) {
|
|
80
74
|
const results = await services[methodName](arg, { ports });
|
|
81
|
-
|
|
75
|
+
sender.postMessage({ eventId, methodName, results });
|
|
82
76
|
return;
|
|
83
77
|
}
|
|
84
78
|
throw new Error(`invalid methodName ${Object.keys(services)} |${String(methodName)}`);
|
|
85
79
|
} catch (e) {
|
|
86
80
|
console.debug("failed", e);
|
|
87
|
-
|
|
81
|
+
sender.postMessage({ eventId, methodName, error: e });
|
|
88
82
|
}
|
|
89
83
|
}
|
|
90
84
|
})
|
|
91
85
|
);
|
|
92
86
|
var combineHandlers = (...handlers) => {
|
|
93
|
-
return (
|
|
94
|
-
const methodName = String("methodName" in message.data ? message.data.methodName : "");
|
|
87
|
+
return ({ data: { methodName, ...data } = {}, ports }) => {
|
|
95
88
|
for (const h of handlers) {
|
|
96
|
-
if (h.canHandle(methodName)) {
|
|
97
|
-
return h.handle(
|
|
89
|
+
if (h.canHandle(String(methodName))) {
|
|
90
|
+
return h.handle({ data: { methodName, ...data }, ports });
|
|
98
91
|
}
|
|
99
92
|
}
|
|
100
93
|
console.error("no handlers matched", methodName);
|
|
@@ -131,6 +124,14 @@ var fetchWorkerPromise = new Promise(
|
|
|
131
124
|
return fetchWorker;
|
|
132
125
|
})
|
|
133
126
|
);
|
|
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
|
+
});
|
|
134
135
|
var installWorker = async ({
|
|
135
136
|
skipLoadBooks = false,
|
|
136
137
|
primaryOnly = false,
|
|
@@ -145,7 +146,7 @@ var installWorker = async ({
|
|
|
145
146
|
const fetchWorker = await fetchWorkerPromise;
|
|
146
147
|
const configureOptions = { storage, zipBaseUrl, checkUpdates, confEnv };
|
|
147
148
|
if (nativeReadFile) {
|
|
148
|
-
const wwHandler = makeSyncHandler({ nativeReadFile, nativeWriteFile, nativeListZips });
|
|
149
|
+
const wwHandler = makeSyncHandler(offlineWorker, { nativeReadFile, nativeWriteFile, nativeListZips });
|
|
149
150
|
offlineWorker.onmessage = combineHandlers(handler, wwHandler);
|
|
150
151
|
if (storage !== "native") {
|
|
151
152
|
console.warn("nativeReadFile given, ignoring storage", storage);
|
|
@@ -153,17 +154,13 @@ var installWorker = async ({
|
|
|
153
154
|
offlineWorkerSync.configure({ ...configureOptions, storage: "native" });
|
|
154
155
|
} else {
|
|
155
156
|
offlineWorker.onmessage = handler.handle;
|
|
156
|
-
|
|
157
|
+
offlineWorkerSync.configure(configureOptions);
|
|
157
158
|
}
|
|
159
|
+
offlineWorkerSync.on("ready", setWorkersReady);
|
|
158
160
|
const channel = new MessageChannel();
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
"configure"
|
|
163
|
-
]);
|
|
164
|
-
navigator.serviceWorker.onmessage = combineHandlers(fetchWorkerHandler);
|
|
165
|
-
await fetchWorkerSync.initChannel({ ports: [channel.port2] });
|
|
166
|
-
await fetchWorkerSync.configure({ storage, confEnv });
|
|
161
|
+
offlineWorkerSync.initChannel({ ports: [channel.port1] });
|
|
162
|
+
fetchWorker.postMessage({ methodName: "initChannel" }, [channel.port2]);
|
|
163
|
+
fetchWorker.postMessage({ methodName: "configure", arg: { storage, confEnv } });
|
|
167
164
|
offlineWorkerSync.on("opfsProgress", () => {
|
|
168
165
|
});
|
|
169
166
|
if (!primaryOnly) {
|
|
@@ -172,6 +169,7 @@ var installWorker = async ({
|
|
|
172
169
|
if (!skipLoadBooks) {
|
|
173
170
|
await offlineWorkerSync.loadBooks({ primaryOnly });
|
|
174
171
|
}
|
|
172
|
+
setBooksLoaded();
|
|
175
173
|
};
|
|
176
174
|
var useOfflineWorker_default = ({
|
|
177
175
|
skipLoadBooks,
|
|
@@ -198,6 +196,7 @@ var useOfflineWorker_default = ({
|
|
|
198
196
|
checkUpdates,
|
|
199
197
|
confEnv
|
|
200
198
|
});
|
|
199
|
+
await Promise.all([workersReadyPromise, setBooksLoadedPromise]);
|
|
201
200
|
fetch(window.location.href.replace(window.location.search, ""));
|
|
202
201
|
setReady(true);
|
|
203
202
|
};
|
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-ca96e90a",
|
|
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-ca96e90a"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"redux-persist": "6.0.0"
|