@lls/offline 24.28.0-e2104606 → 24.28.0-ea980470

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.
@@ -17,10 +17,10 @@ var parseRange = (range, size) => {
17
17
  };
18
18
 
19
19
  // src/utils/worker.ts
20
- var makeSyncWorker = (offlineWorker2, methodNames, dbg) => {
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 && !methodName.startsWith("async") && !(methodName in cbks)) {
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
- offlineWorker2.postMessage({ eventId, methodName, arg }, ports);
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 obj = Object.assign(Object.fromEntries(methodNames.map((name) => [name, makeFn(name)])), {
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
- (sender, services) => ({
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
- sender.postMessage({ eventId, methodName, results });
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
- sender.postMessage({ eventId, methodName, error: e });
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 (!ev.request.url.endsWith(".mp4") && !ev.request.url.endsWith(".webm")) {
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);
@@ -429,7 +447,7 @@ var tryOnline = async (request, event) => {
429
447
  if (isValidZipName(request.url) && !isValidS3Zip(responseFromNetwork)) {
430
448
  throw new Error(`zip is invalid: got ${responseFromNetwork.headers.get("Content-Length")} bytes`);
431
449
  }
432
- const cached = request.method === "HEAD" ? Promise.resolve() : putInCache(request, responseFromNetwork.clone());
450
+ const cached = request.method === "GET" || request.method === "OPTIONS" ? putInCache(request, responseFromNetwork.clone()) : Promise.resolve();
433
451
  if (request.url.endsWith(".zip")) {
434
452
  await cached;
435
453
  event.waitUntil(Promise.resolve());
@@ -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 offlineWorker;
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 = 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" });
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 = 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
- };
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 && !methodName.startsWith("async") && !(methodName in cbks)) {
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
- offlineWorker.postMessage({ eventId, methodName, arg }, ports);
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 obj = Object.assign(Object.fromEntries(methodNames.map((name) => [name, makeFn(name)])), {
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
- (sender2, services) => ({
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
- sender2.postMessage({ eventId, methodName, results });
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
- sender2.postMessage({ eventId, methodName, error: e });
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 ({ data: { methodName, ...data } = {}, ports }) => {
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(String(methodName))) {
91
- return h.handle({ data: { methodName, ...data }, ports });
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
- await cache.put(zipUrl, response2);
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 await readArrayBuffer();
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
- 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;
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,30 @@ var loadPageContent2 = async ({
485
491
  });
486
492
  return await loadPageContent({ chapterId, json });
487
493
  };
488
- var fetchWorker;
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 { canHandle, handle } = makeSyncHandler(fetchWorker, {
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 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);
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!");
523
517
  };
524
- fetchWorker.onmessage = fn;
525
518
  };
526
519
  var loadBooks = async ({ primaryOnly = false } = {}) => {
527
520
  let entries = [];
@@ -593,7 +586,7 @@ var reset = async () => {
593
586
  await (await navigator.storage.getDirectory()).remove({ recursive: true });
594
587
  console.info("opfs cleared");
595
588
  };
596
- var mainHandle = makeSyncHandler(self, {
589
+ var mainHandle = makeSyncHandler({
597
590
  initChannel,
598
591
  loadPreload: loadPreload2,
599
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 && !methodName.startsWith("async") && !(methodName in cbks)) {
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
- offlineWorker2.postMessage({ eventId, methodName, arg }, ports);
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 obj = Object.assign(Object.fromEntries(methodNames.map((name) => [name, makeFn(name)])), {
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
- (sender, services) => ({
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
- sender.postMessage({ eventId, methodName, results });
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
- sender.postMessage({ eventId, methodName, error: e });
87
+ emitter.postMessage({ eventId, methodName, error: e });
82
88
  }
83
89
  }
84
90
  })
85
91
  );
86
92
  var combineHandlers = (...handlers) => {
87
- return ({ data: { methodName, ...data } = {}, ports }) => {
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(String(methodName))) {
90
- return h.handle({ data: { methodName, ...data }, ports });
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(offlineWorker, { nativeReadFile, nativeWriteFile, nativeListZips });
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
- fetchWorker.postMessage({ methodName: "initChannel" }, [channel.port2]);
163
- fetchWorker.postMessage({ methodName: "configure", arg: { storage, confEnv } });
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-e2104606",
3
+ "version": "24.28.0-ea980470",
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-e2104606"
56
+ "@lls/vitescripts": "24.28.0-ea980470"
57
57
  },
58
58
  "dependencies": {
59
59
  "redux-persist": "6.0.0"