@lls/offline 24.28.0-c7eb356e → 24.28.0-cf52ac16
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 +41 -47
- package/lib/assets/offline-worker.js +37 -48
- 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,23 @@ 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
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
offlineWorker.postMessage({ methodName: "sendAppReady" });
|
|
536
|
+
offlineWorker.onmessage = combineHandlers(syncHandler, onHandler);
|
|
537
|
+
offlineWorker.onclose = () => {
|
|
538
|
+
console.error("socket to ow has been closed!");
|
|
539
|
+
};
|
|
540
|
+
await offlineWorkerSync.ensureAppReady();
|
|
523
541
|
};
|
|
524
542
|
var knownLinks = /* @__PURE__ */ new Map();
|
|
525
543
|
var configure = ({
|
|
@@ -536,28 +554,4 @@ var configure = ({
|
|
|
536
554
|
}
|
|
537
555
|
console.info("sw::configure", { STORAGE, CONF_ENV });
|
|
538
556
|
};
|
|
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
|
-
};
|
|
557
|
+
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);
|
|
@@ -441,12 +448,7 @@ var loadBook2 = async ({ id: bookId, forceRefresh }) => {
|
|
|
441
448
|
console.time("loadzip");
|
|
442
449
|
const entryNames = await loadZip(new Uint8Array(buf), bookId);
|
|
443
450
|
console.timeEnd("loadzip");
|
|
444
|
-
|
|
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;
|
|
451
|
+
await fetchWorkerSync.setKnownLinks({ entryNames, bookId });
|
|
450
452
|
if (isOldZip(bookId)) {
|
|
451
453
|
const json = await readZipEntry({
|
|
452
454
|
entryName: `preload/${bookId}.json`,
|
|
@@ -489,43 +491,30 @@ var loadPageContent2 = async ({
|
|
|
489
491
|
});
|
|
490
492
|
return await loadPageContent({ chapterId, json });
|
|
491
493
|
};
|
|
492
|
-
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
|
-
}
|
|
494
|
+
var ensureAppReady = () => {
|
|
500
495
|
};
|
|
496
|
+
var fetchWorker;
|
|
497
|
+
var fetchWorkerSync;
|
|
501
498
|
var initChannel = (__, { ports }) => {
|
|
502
499
|
fetchWorker = ports[0];
|
|
503
|
-
const
|
|
500
|
+
const onHandler = makeSyncHandler({
|
|
504
501
|
readZipEntry,
|
|
505
502
|
loadBook: loadBook2,
|
|
506
503
|
slugToFileMeta: slugToFileMeta2,
|
|
507
504
|
loadPageContent: loadPageContent2,
|
|
508
|
-
searchBooks
|
|
505
|
+
searchBooks,
|
|
506
|
+
ensureAppReady
|
|
509
507
|
});
|
|
510
|
-
const
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
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);
|
|
508
|
+
const { handler: syncHandler, ...sender2 } = makeSyncWorker(
|
|
509
|
+
fetchWorker,
|
|
510
|
+
["setKnownLinks"],
|
|
511
|
+
"offline-worker"
|
|
512
|
+
);
|
|
513
|
+
fetchWorkerSync = sender2;
|
|
514
|
+
fetchWorker.onmessage = combineHandlers(syncHandler, onHandler);
|
|
515
|
+
fetchWorker.onclose = () => {
|
|
516
|
+
console.error("socket to sw has been closed!");
|
|
527
517
|
};
|
|
528
|
-
fetchWorker.onmessage = fn;
|
|
529
518
|
};
|
|
530
519
|
var loadBooks = async ({ primaryOnly = false } = {}) => {
|
|
531
520
|
let entries = [];
|
|
@@ -597,7 +586,7 @@ var reset = async () => {
|
|
|
597
586
|
await (await navigator.storage.getDirectory()).remove({ recursive: true });
|
|
598
587
|
console.info("opfs cleared");
|
|
599
588
|
};
|
|
600
|
-
var mainHandle = makeSyncHandler(
|
|
589
|
+
var mainHandle = makeSyncHandler({
|
|
601
590
|
initChannel,
|
|
602
591
|
loadPreload: loadPreload2,
|
|
603
592
|
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-cf52ac16",
|
|
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-cf52ac16"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"redux-persist": "6.0.0"
|