@lls/offline 24.28.0-5c90d7d6 → 24.28.0-635f1b73
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 +48 -39
- package/lib/assets/offline-worker.js +51 -41
- 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);
|
|
@@ -447,7 +429,7 @@ var tryOnline = async (request, event) => {
|
|
|
447
429
|
if (isValidZipName(request.url) && !isValidS3Zip(responseFromNetwork)) {
|
|
448
430
|
throw new Error(`zip is invalid: got ${responseFromNetwork.headers.get("Content-Length")} bytes`);
|
|
449
431
|
}
|
|
450
|
-
const cached = request.method === "
|
|
432
|
+
const cached = request.method === "HEAD" ? Promise.resolve() : putInCache(request, responseFromNetwork.clone());
|
|
451
433
|
if (request.url.endsWith(".zip")) {
|
|
452
434
|
await cached;
|
|
453
435
|
event.waitUntil(Promise.resolve());
|
|
@@ -521,20 +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
|
-
|
|
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" });
|
|
538
523
|
};
|
|
539
524
|
var knownLinks = /* @__PURE__ */ new Map();
|
|
540
525
|
var configure = ({
|
|
@@ -551,4 +536,28 @@ var configure = ({
|
|
|
551
536
|
}
|
|
552
537
|
console.info("sw::configure", { STORAGE, CONF_ENV });
|
|
553
538
|
};
|
|
554
|
-
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);
|
|
@@ -408,7 +401,6 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
|
|
|
408
401
|
await accessHandle.close();
|
|
409
402
|
} else {
|
|
410
403
|
const cache = await openCache(CONF_ENV);
|
|
411
|
-
console.time("writing cache");
|
|
412
404
|
const response2 = new Response(arrayBuffer, {
|
|
413
405
|
headers: {
|
|
414
406
|
"Cache-Control": "max-age=600, s-maxage=600, public, proxy-revalidate",
|
|
@@ -421,12 +413,9 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
|
|
|
421
413
|
type: "cors",
|
|
422
414
|
url: zipUrl
|
|
423
415
|
});
|
|
424
|
-
|
|
425
|
-
cache.put(zipUrl, response2).then(() => {
|
|
426
|
-
console.timeEnd("writing cache");
|
|
427
|
-
});
|
|
416
|
+
await cache.put(zipUrl, response2);
|
|
428
417
|
}
|
|
429
|
-
return
|
|
418
|
+
return await readArrayBuffer();
|
|
430
419
|
}
|
|
431
420
|
};
|
|
432
421
|
var slugToFileMeta2 = async ({ slug }) => {
|
|
@@ -448,7 +437,12 @@ var loadBook2 = async ({ id: bookId, forceRefresh }) => {
|
|
|
448
437
|
console.time("loadzip");
|
|
449
438
|
const entryNames = await loadZip(new Uint8Array(buf), bookId);
|
|
450
439
|
console.timeEnd("loadzip");
|
|
451
|
-
|
|
440
|
+
const eventId = `setKnownLinks:${Date.now()}-${Math.random().toFixed(5)}`;
|
|
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;
|
|
452
446
|
if (isOldZip(bookId)) {
|
|
453
447
|
const json = await readZipEntry({
|
|
454
448
|
entryName: `preload/${bookId}.json`,
|
|
@@ -491,27 +485,43 @@ var loadPageContent2 = async ({
|
|
|
491
485
|
});
|
|
492
486
|
return await loadPageContent({ chapterId, json });
|
|
493
487
|
};
|
|
494
|
-
var ensureAppReady = () => {
|
|
495
|
-
};
|
|
496
488
|
var fetchWorker;
|
|
497
|
-
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
|
+
}
|
|
496
|
+
};
|
|
498
497
|
var initChannel = (__, { ports }) => {
|
|
499
498
|
fetchWorker = ports[0];
|
|
500
|
-
const
|
|
499
|
+
const { canHandle, handle } = makeSyncHandler(fetchWorker, {
|
|
501
500
|
readZipEntry,
|
|
502
501
|
loadBook: loadBook2,
|
|
503
502
|
slugToFileMeta: slugToFileMeta2,
|
|
504
503
|
loadPageContent: loadPageContent2,
|
|
505
|
-
searchBooks
|
|
506
|
-
ensureAppReady
|
|
504
|
+
searchBooks
|
|
507
505
|
});
|
|
508
|
-
const
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
506
|
+
const fn = (dataObj) => {
|
|
507
|
+
if (dataObj.data?.methodName === "sendAppReady") {
|
|
508
|
+
self.postMessage({ methodName: "ready" });
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
if (dataObj.data?.methodName === "setKnownLinks:back") {
|
|
512
|
+
if (typeof dataObj?.data?.eventId !== "string") {
|
|
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;
|
|
515
525
|
};
|
|
516
526
|
var loadBooks = async ({ primaryOnly = false } = {}) => {
|
|
517
527
|
let entries = [];
|
|
@@ -583,7 +593,7 @@ var reset = async () => {
|
|
|
583
593
|
await (await navigator.storage.getDirectory()).remove({ recursive: true });
|
|
584
594
|
console.info("opfs cleared");
|
|
585
595
|
};
|
|
586
|
-
var mainHandle = makeSyncHandler({
|
|
596
|
+
var mainHandle = makeSyncHandler(self, {
|
|
587
597
|
initChannel,
|
|
588
598
|
loadPreload: loadPreload2,
|
|
589
599
|
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-635f1b73",
|
|
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-635f1b73"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"redux-persist": "6.0.0"
|