@lls/offline 24.27.0-ff4d6c28 → 24.28.0-0854ed80

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.
@@ -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,22 +21,38 @@ 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 } = {}) => {
32
32
  return new Promise((resolve, reject) => {
33
33
  const eventId = `${methodName}:${Date.now()}-${Math.random().toFixed(5)}`;
34
- dic[eventId] = { resolve, reject };
35
- offlineWorker.postMessage({ eventId, methodName, arg }, ports);
34
+ let resolved = false;
35
+ const timeout = setTimeout(() => {
36
+ console.warn("slow request for", methodName, arg, eventId);
37
+ }, 3e3);
38
+ const doResolve = (arg2) => {
39
+ if (!resolved) {
40
+ resolved = true;
41
+ clearTimeout(timeout);
42
+ resolve(arg2);
43
+ }
44
+ };
45
+ dic[eventId] = { resolve: doResolve, reject };
46
+ if (ports) {
47
+ offlineWorker.postMessage({ eventId, methodName, arg }, ports);
48
+ } else {
49
+ offlineWorker.postMessage({ eventId, methodName, arg });
50
+ }
36
51
  });
37
52
  };
38
53
  };
39
- 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, {
40
56
  on: (key2, fn2) => {
41
57
  cbks[key2] = fn2;
42
58
  }
@@ -53,47 +69,39 @@ var makeSyncWorker = (offlineWorker, methodNames, dbg) => {
53
69
  };
54
70
  var a = (a2) => a2;
55
71
  var makeSyncHandler = a(
56
- (sender2, services) => ({
72
+ (services) => ({
57
73
  canHandle: (methodName) => {
58
74
  return methodName in services;
59
75
  },
60
- 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;
61
78
  try {
62
79
  if (typeof methodName === "string" && methodName in services && services[methodName]) {
63
80
  const results = await services[methodName](arg, { ports });
64
- sender2.postMessage({ eventId, methodName, results });
81
+ emitter.postMessage({ eventId, methodName, results });
65
82
  return;
66
83
  }
67
84
  throw new Error(`invalid methodName ${Object.keys(services)} |${String(methodName)}`);
68
85
  } catch (e) {
69
86
  console.debug("failed", e);
70
- sender2.postMessage({ eventId, methodName, error: e });
87
+ emitter.postMessage({ eventId, methodName, error: e });
71
88
  }
72
89
  }
73
90
  })
74
91
  );
75
92
  var bufToJson = (buf) => JSON.parse(new TextDecoder("UTF-8").decode(new Uint8Array(buf)));
76
93
  var combineHandlers = (...handlers) => {
77
- return ({ data: { methodName, ...data } = {}, ports }) => {
94
+ return (message) => {
95
+ const methodName = String("methodName" in message.data ? message.data.methodName : "");
78
96
  for (const h of handlers) {
79
- if (h.canHandle(String(methodName))) {
80
- return h.handle({ data: { methodName, ...data }, ports });
97
+ if (h.canHandle(methodName)) {
98
+ return h.handle(message);
81
99
  }
82
100
  }
83
101
  console.error("no handlers matched", methodName);
84
102
  };
85
103
  };
86
104
  var openCache = async (mode) => caches.open(`LLS_OFFLINE_${mode}`);
87
- var concatArrayBuffers = (buffers) => {
88
- const totalLength = buffers.reduce((sum, buf) => sum + buf.byteLength, 0);
89
- const concatenated = new Uint8Array(totalLength);
90
- let offset = 0;
91
- for (const buffer of buffers) {
92
- concatenated.set(new Uint8Array(buffer), offset);
93
- offset += buffer.byteLength;
94
- }
95
- return concatenated.buffer;
96
- };
97
105
  var isStoryZip = (name) => /story-.*?\.zip/.test(name);
98
106
  var isValidZipName = (name) => {
99
107
  return /lecture-cp\.zip/.test(name) || isStoryZip(name);
@@ -170,615 +178,72 @@ var loadPreload = (json) => {
170
178
  });
171
179
  };
172
180
 
173
- // ../../node_modules/.pnpm/fflate@0.8.2/node_modules/fflate/esm/browser.js
174
- var u8 = Uint8Array;
175
- var u16 = Uint16Array;
176
- var i32 = Int32Array;
177
- var fleb = new u8([
178
- 0,
179
- 0,
180
- 0,
181
- 0,
182
- 0,
183
- 0,
184
- 0,
185
- 0,
186
- 1,
187
- 1,
188
- 1,
189
- 1,
190
- 2,
191
- 2,
192
- 2,
193
- 2,
194
- 3,
195
- 3,
196
- 3,
197
- 3,
198
- 4,
199
- 4,
200
- 4,
201
- 4,
202
- 5,
203
- 5,
204
- 5,
205
- 5,
206
- 0,
207
- /* unused */
208
- 0,
209
- 0,
210
- /* impossible */
211
- 0
212
- ]);
213
- var fdeb = new u8([
214
- 0,
215
- 0,
216
- 0,
217
- 0,
218
- 1,
219
- 1,
220
- 2,
221
- 2,
222
- 3,
223
- 3,
224
- 4,
225
- 4,
226
- 5,
227
- 5,
228
- 6,
229
- 6,
230
- 7,
231
- 7,
232
- 8,
233
- 8,
234
- 9,
235
- 9,
236
- 10,
237
- 10,
238
- 11,
239
- 11,
240
- 12,
241
- 12,
242
- 13,
243
- 13,
244
- /* unused */
245
- 0,
246
- 0
247
- ]);
248
- var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
249
- var freb = function(eb, start) {
250
- var b = new u16(31);
251
- for (var i = 0; i < 31; ++i) {
252
- b[i] = start += 1 << eb[i - 1];
253
- }
254
- var r = new i32(b[30]);
255
- for (var i = 1; i < 30; ++i) {
256
- for (var j = b[i]; j < b[i + 1]; ++j) {
257
- r[j] = j - b[i] << 5 | i;
258
- }
259
- }
260
- return { b, r };
261
- };
262
- var _a = freb(fleb, 2);
263
- var fl = _a.b;
264
- var revfl = _a.r;
265
- fl[28] = 258, revfl[258] = 28;
266
- var _b = freb(fdeb, 0);
267
- var fd = _b.b;
268
- var revfd = _b.r;
269
- var rev = new u16(32768);
270
- for (i = 0; i < 32768; ++i) {
271
- x = (i & 43690) >> 1 | (i & 21845) << 1;
272
- x = (x & 52428) >> 2 | (x & 13107) << 2;
273
- x = (x & 61680) >> 4 | (x & 3855) << 4;
274
- rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
275
- }
276
- var x;
277
- var i;
278
- var hMap = function(cd, mb, r) {
279
- var s = cd.length;
280
- var i = 0;
281
- var l = new u16(mb);
282
- for (; i < s; ++i) {
283
- if (cd[i])
284
- ++l[cd[i] - 1];
285
- }
286
- var le = new u16(mb);
287
- for (i = 1; i < mb; ++i) {
288
- le[i] = le[i - 1] + l[i - 1] << 1;
289
- }
290
- var co;
291
- if (r) {
292
- co = new u16(1 << mb);
293
- var rvb = 15 - mb;
294
- for (i = 0; i < s; ++i) {
295
- if (cd[i]) {
296
- var sv = i << 4 | cd[i];
297
- var r_1 = mb - cd[i];
298
- var v = le[cd[i] - 1]++ << r_1;
299
- for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
300
- co[rev[v] >> rvb] = sv;
301
- }
302
- }
303
- }
304
- } else {
305
- co = new u16(s);
306
- for (i = 0; i < s; ++i) {
307
- if (cd[i]) {
308
- co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
309
- }
310
- }
311
- }
312
- return co;
313
- };
314
- var flt = new u8(288);
315
- for (i = 0; i < 144; ++i)
316
- flt[i] = 8;
317
- var i;
318
- for (i = 144; i < 256; ++i)
319
- flt[i] = 9;
320
- var i;
321
- for (i = 256; i < 280; ++i)
322
- flt[i] = 7;
323
- var i;
324
- for (i = 280; i < 288; ++i)
325
- flt[i] = 8;
326
- var i;
327
- var fdt = new u8(32);
328
- for (i = 0; i < 32; ++i)
329
- fdt[i] = 5;
330
- var i;
331
- var flrm = /* @__PURE__ */ hMap(flt, 9, 1);
332
- var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
333
- var max = function(a2) {
334
- var m = a2[0];
335
- for (var i = 1; i < a2.length; ++i) {
336
- if (a2[i] > m)
337
- m = a2[i];
338
- }
339
- return m;
340
- };
341
- var bits = function(d, p, m) {
342
- var o = p / 8 | 0;
343
- return (d[o] | d[o + 1] << 8) >> (p & 7) & m;
344
- };
345
- var bits16 = function(d, p) {
346
- var o = p / 8 | 0;
347
- return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
348
- };
349
- var shft = function(p) {
350
- return (p + 7) / 8 | 0;
351
- };
352
- var slc = function(v, s, e) {
353
- if (s == null || s < 0)
354
- s = 0;
355
- if (e == null || e > v.length)
356
- e = v.length;
357
- return new u8(v.subarray(s, e));
358
- };
359
- var ec = [
360
- "unexpected EOF",
361
- "invalid block type",
362
- "invalid length/literal",
363
- "invalid distance",
364
- "stream finished",
365
- "no stream handler",
366
- ,
367
- "no callback",
368
- "invalid UTF-8 data",
369
- "extra field too long",
370
- "date not in range 1980-2099",
371
- "filename too long",
372
- "stream finishing",
373
- "invalid zip data"
374
- // determined by unknown compression method
375
- ];
376
- var err = function(ind, msg, nt) {
377
- var e = new Error(msg || ec[ind]);
378
- e.code = ind;
379
- if (Error.captureStackTrace)
380
- Error.captureStackTrace(e, err);
381
- if (!nt)
382
- throw e;
383
- return e;
384
- };
385
- var inflt = function(dat, st, buf, dict) {
386
- var sl = dat.length, dl = dict ? dict.length : 0;
387
- if (!sl || st.f && !st.l)
388
- return buf || new u8(0);
389
- var noBuf = !buf;
390
- var resize = noBuf || st.i != 2;
391
- var noSt = st.i;
392
- if (noBuf)
393
- buf = new u8(sl * 3);
394
- var cbuf = function(l2) {
395
- var bl = buf.length;
396
- if (l2 > bl) {
397
- var nbuf = new u8(Math.max(bl * 2, l2));
398
- nbuf.set(buf);
399
- buf = nbuf;
400
- }
401
- };
402
- var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
403
- var tbts = sl * 8;
404
- do {
405
- if (!lm) {
406
- final = bits(dat, pos, 1);
407
- var type = bits(dat, pos + 1, 3);
408
- pos += 3;
409
- if (!type) {
410
- var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;
411
- if (t > sl) {
412
- if (noSt)
413
- err(0);
414
- break;
415
- }
416
- if (resize)
417
- cbuf(bt + l);
418
- buf.set(dat.subarray(s, t), bt);
419
- st.b = bt += l, st.p = pos = t * 8, st.f = final;
420
- continue;
421
- } else if (type == 1)
422
- lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
423
- else if (type == 2) {
424
- var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
425
- var tl = hLit + bits(dat, pos + 5, 31) + 1;
426
- pos += 14;
427
- var ldt = new u8(tl);
428
- var clt = new u8(19);
429
- for (var i = 0; i < hcLen; ++i) {
430
- clt[clim[i]] = bits(dat, pos + i * 3, 7);
431
- }
432
- pos += hcLen * 3;
433
- var clb = max(clt), clbmsk = (1 << clb) - 1;
434
- var clm = hMap(clt, clb, 1);
435
- for (var i = 0; i < tl; ) {
436
- var r = clm[bits(dat, pos, clbmsk)];
437
- pos += r & 15;
438
- var s = r >> 4;
439
- if (s < 16) {
440
- ldt[i++] = s;
441
- } else {
442
- var c = 0, n = 0;
443
- if (s == 16)
444
- n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
445
- else if (s == 17)
446
- n = 3 + bits(dat, pos, 7), pos += 3;
447
- else if (s == 18)
448
- n = 11 + bits(dat, pos, 127), pos += 7;
449
- while (n--)
450
- ldt[i++] = c;
181
+ // src/utils/zipDecoder.ts
182
+ var getEOCDStart = (buf) => {
183
+ for (let i = buf.length - 1; i > 0; --i) {
184
+ if (buf[i] === 6) {
185
+ if (buf[i - 1] === 5) {
186
+ if (buf[i - 2] === 75) {
187
+ if (buf[i - 3] === 80) {
188
+ return i - 3;
451
189
  }
452
190
  }
453
- var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
454
- lbt = max(lt);
455
- dbt = max(dt);
456
- lm = hMap(lt, lbt, 1);
457
- dm = hMap(dt, dbt, 1);
458
- } else
459
- err(1);
460
- if (pos > tbts) {
461
- if (noSt)
462
- err(0);
463
- break;
464
- }
465
- }
466
- if (resize)
467
- cbuf(bt + 131072);
468
- var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
469
- var lpos = pos;
470
- for (; ; lpos = pos) {
471
- var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
472
- pos += c & 15;
473
- if (pos > tbts) {
474
- if (noSt)
475
- err(0);
476
- break;
477
191
  }
478
- if (!c)
479
- err(2);
480
- if (sym < 256)
481
- buf[bt++] = sym;
482
- else if (sym == 256) {
483
- lpos = pos, lm = null;
484
- break;
485
- } else {
486
- var add = sym - 254;
487
- if (sym > 264) {
488
- var i = sym - 257, b = fleb[i];
489
- add = bits(dat, pos, (1 << b) - 1) + fl[i];
490
- pos += b;
491
- }
492
- var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
493
- if (!d)
494
- err(3);
495
- pos += d & 15;
496
- var dt = fd[dsym];
497
- if (dsym > 3) {
498
- var b = fdeb[dsym];
499
- dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
500
- }
501
- if (pos > tbts) {
502
- if (noSt)
503
- err(0);
504
- break;
505
- }
506
- if (resize)
507
- cbuf(bt + 131072);
508
- var end = bt + add;
509
- if (bt < dt) {
510
- var shift = dl - dt, dend = Math.min(dt, end);
511
- if (shift + bt < 0)
512
- err(3);
513
- for (; bt < dend; ++bt)
514
- buf[bt] = dict[shift + bt];
515
- }
516
- for (; bt < end; ++bt)
517
- buf[bt] = buf[bt - dt];
518
- }
519
- }
520
- st.l = lm, st.p = lpos, st.b = bt, st.f = final;
521
- if (lm)
522
- final = 1, st.m = lbt, st.d = dm, st.n = dbt;
523
- } while (!final);
524
- return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
525
- };
526
- var et = /* @__PURE__ */ new u8(0);
527
- var b2 = function(d, b) {
528
- return d[b] | d[b + 1] << 8;
529
- };
530
- var b4 = function(d, b) {
531
- return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0;
532
- };
533
- var b8 = function(d, b) {
534
- return b4(d, b) + b4(d, b + 4) * 4294967296;
535
- };
536
- var Inflate = /* @__PURE__ */ function() {
537
- function Inflate2(opts, cb) {
538
- if (typeof opts == "function")
539
- cb = opts, opts = {};
540
- this.ondata = cb;
541
- var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);
542
- this.s = { i: 0, b: dict ? dict.length : 0 };
543
- this.o = new u8(32768);
544
- this.p = new u8(0);
545
- if (dict)
546
- this.o.set(dict);
547
- }
548
- Inflate2.prototype.e = function(c) {
549
- if (!this.ondata)
550
- err(5);
551
- if (this.d)
552
- err(4);
553
- if (!this.p.length)
554
- this.p = c;
555
- else if (c.length) {
556
- var n = new u8(this.p.length + c.length);
557
- n.set(this.p), n.set(c, this.p.length), this.p = n;
558
192
  }
559
- };
560
- Inflate2.prototype.c = function(final) {
561
- this.s.i = +(this.d = final || false);
562
- var bts = this.s.b;
563
- var dt = inflt(this.p, this.s, this.o);
564
- this.ondata(slc(dt, bts, this.s.b), this.d);
565
- this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;
566
- this.p = slc(this.p, this.s.p / 8 | 0), this.s.p &= 7;
567
- };
568
- Inflate2.prototype.push = function(chunk, final) {
569
- this.e(chunk), this.c(final);
570
- };
571
- return Inflate2;
572
- }();
573
- var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
574
- var tds = 0;
575
- try {
576
- td.decode(et, { stream: true });
577
- tds = 1;
578
- } catch (e) {
579
- }
580
- var dutf8 = function(d) {
581
- for (var r = "", i = 0; ; ) {
582
- var c = d[i++];
583
- var eb = (c > 127) + (c > 223) + (c > 239);
584
- if (i + eb > d.length)
585
- return { s: r, r: slc(d, i - 1) };
586
- if (!eb)
587
- r += String.fromCharCode(c);
588
- else if (eb == 3) {
589
- c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | d[i++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023);
590
- } else if (eb & 1)
591
- r += String.fromCharCode((c & 31) << 6 | d[i++] & 63);
592
- else
593
- r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | d[i++] & 63);
594
- }
595
- };
596
- function strFromU8(dat, latin1) {
597
- if (latin1) {
598
- var r = "";
599
- for (var i = 0; i < dat.length; i += 16384)
600
- r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));
601
- return r;
602
- } else if (td) {
603
- return td.decode(dat);
604
- } else {
605
- var _a2 = dutf8(dat), s = _a2.s, r = _a2.r;
606
- if (r.length)
607
- err(8);
608
- return s;
609
193
  }
610
- }
611
- var z64e = function(d, b) {
612
- for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))
613
- ;
614
- return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];
194
+ throw new Error("failed to read EOCDstart");
615
195
  };
616
- var UnzipPassThrough = /* @__PURE__ */ function() {
617
- function UnzipPassThrough2() {
618
- }
619
- UnzipPassThrough2.prototype.push = function(data, final) {
620
- this.ondata(null, data, final);
621
- };
622
- UnzipPassThrough2.compression = 0;
623
- return UnzipPassThrough2;
624
- }();
625
- var UnzipInflate = /* @__PURE__ */ function() {
626
- function UnzipInflate2() {
627
- var _this = this;
628
- this.i = new Inflate(function(dat, final) {
629
- _this.ondata(null, dat, final);
630
- });
196
+ var readIndex = (buf, offset, nBytes) => {
197
+ let idx = 0;
198
+ for (let i = 0; i < nBytes; ++i) {
199
+ const next = buf[offset + i] * 256 ** i;
200
+ idx += next;
631
201
  }
632
- UnzipInflate2.prototype.push = function(data, final) {
633
- try {
634
- this.i.push(data, final);
635
- } catch (e) {
636
- this.ondata(e, null, final);
637
- }
638
- };
639
- UnzipInflate2.compression = 8;
640
- return UnzipInflate2;
641
- }();
642
- var Unzip = /* @__PURE__ */ function() {
643
- function Unzip2(cb) {
644
- this.onfile = cb;
645
- this.k = [];
646
- this.o = {
647
- 0: UnzipPassThrough
202
+ return idx;
203
+ };
204
+ var getSOCDStart = (buf, eocdIdx) => {
205
+ return readIndex(buf, eocdIdx + 16, 4);
206
+ };
207
+ var readEntryNames = (buf, socdIdx, nRecords) => {
208
+ const records = Array.from({ length: nRecords });
209
+ for (let i = 0; i < nRecords; ++i) {
210
+ const n = readIndex(buf, socdIdx + 28, 2);
211
+ const m = readIndex(buf, socdIdx + 30, 2);
212
+ const k = readIndex(buf, socdIdx + 32, 2);
213
+ records[i] = {
214
+ sofh: readIndex(buf, socdIdx + 42, 4),
215
+ name: buf.slice(socdIdx + 46, socdIdx + 46 + n)
648
216
  };
649
- this.p = et;
217
+ socdIdx += 46 + n + m + k;
650
218
  }
651
- Unzip2.prototype.push = function(chunk, final) {
652
- var _this = this;
653
- if (!this.onfile)
654
- err(5);
655
- if (!this.p)
656
- err(4);
657
- if (this.c > 0) {
658
- var len = Math.min(this.c, chunk.length);
659
- var toAdd = chunk.subarray(0, len);
660
- this.c -= len;
661
- if (this.d)
662
- this.d.push(toAdd, !this.c);
663
- else
664
- this.k[0].push(toAdd);
665
- chunk = chunk.subarray(len);
666
- if (chunk.length)
667
- return this.push(chunk, final);
668
- } else {
669
- var f = 0, i = 0, is = void 0, buf = void 0;
670
- if (!this.p.length)
671
- buf = chunk;
672
- else if (!chunk.length)
673
- buf = this.p;
674
- else {
675
- buf = new u8(this.p.length + chunk.length);
676
- buf.set(this.p), buf.set(chunk, this.p.length);
677
- }
678
- var l = buf.length, oc = this.c, add = oc && this.d;
679
- var _loop_2 = function() {
680
- var _a2;
681
- var sig = b4(buf, i);
682
- if (sig == 67324752) {
683
- f = 1, is = i;
684
- this_1.d = null;
685
- this_1.c = 0;
686
- var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);
687
- if (l > i + 30 + fnl + es) {
688
- var chks_3 = [];
689
- this_1.k.unshift(chks_3);
690
- f = 2;
691
- var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);
692
- var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);
693
- if (sc_1 == 4294967295) {
694
- _a2 = dd ? [-2] : z64e(buf, i), sc_1 = _a2[0], su_1 = _a2[1];
695
- } else if (dd)
696
- sc_1 = -1;
697
- i += es;
698
- this_1.c = sc_1;
699
- var d_1;
700
- var file_1 = {
701
- name: fn_1,
702
- compression: cmp_1,
703
- start: function() {
704
- if (!file_1.ondata)
705
- err(5);
706
- if (!sc_1)
707
- file_1.ondata(null, et, true);
708
- else {
709
- var ctr = _this.o[cmp_1];
710
- if (!ctr)
711
- file_1.ondata(err(14, "unknown compression type " + cmp_1, 1), null, false);
712
- d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);
713
- d_1.ondata = function(err2, dat3, final2) {
714
- file_1.ondata(err2, dat3, final2);
715
- };
716
- for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {
717
- var dat2 = chks_4[_i];
718
- d_1.push(dat2, false);
719
- }
720
- if (_this.k[0] == chks_3 && _this.c)
721
- _this.d = d_1;
722
- else
723
- d_1.push(et, true);
724
- }
725
- },
726
- terminate: function() {
727
- if (d_1 && d_1.terminate)
728
- d_1.terminate();
729
- }
730
- };
731
- if (sc_1 >= 0)
732
- file_1.size = sc_1, file_1.originalSize = su_1;
733
- this_1.onfile(file_1);
734
- }
735
- return "break";
736
- } else if (oc) {
737
- if (sig == 134695760) {
738
- is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;
739
- return "break";
740
- } else if (sig == 33639248) {
741
- is = i -= 4, f = 3, this_1.c = 0;
742
- return "break";
743
- }
744
- }
745
- };
746
- var this_1 = this;
747
- for (; i < l - 4; ++i) {
748
- var state_1 = _loop_2();
749
- if (state_1 === "break")
750
- break;
751
- }
752
- this.p = et;
753
- if (oc < 0) {
754
- var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 134695760 && 4)) : buf.subarray(0, i);
755
- if (add)
756
- add.push(dat, !!f);
757
- else
758
- this.k[+(f == 2)].push(dat);
759
- }
760
- if (f & 2)
761
- return this.push(buf.subarray(i), final);
762
- this.p = buf.subarray(i);
763
- }
764
- if (final) {
765
- if (this.c)
766
- err(13);
767
- this.p = null;
768
- }
769
- };
770
- Unzip2.prototype.register = function(decoder) {
771
- this.o[decoder.compression] = decoder;
772
- };
773
- return Unzip2;
774
- }();
219
+ return records;
220
+ };
221
+ var readRecordData = (buf, { sofh }) => {
222
+ const dataSize = readIndex(buf, sofh + 22, 4);
223
+ const n = readIndex(buf, sofh + 26, 2);
224
+ const m = readIndex(buf, sofh + 28, 2);
225
+ return buf.slice(sofh + 30 + n + m, sofh + 30 + n + m + dataSize);
226
+ };
227
+ var getHeaders = (buf) => {
228
+ const eocdIdx = getEOCDStart(buf);
229
+ const nbRecords = readIndex(buf, eocdIdx + 10, 2);
230
+ const socdIdx = getSOCDStart(buf, eocdIdx);
231
+ const records = readEntryNames(buf, socdIdx, nbRecords);
232
+ return records;
233
+ };
775
234
 
776
235
  // src/worker/wwZip.ts
777
236
  var key = new Uint8Array([..."4c6520636f6e74656e7520646573206c".matchAll(/../g)].map(([c]) => Number(`0x${c}`)));
778
237
  var iv = new Uint8Array(16).fill(0);
779
238
  async function decryptData(encryptedData, key2, iv2) {
780
- const cryptoKey = await crypto.subtle.importKey("raw", key2.buffer, { name: "AES-CBC" }, false, ["decrypt"]);
781
- const decryptedData = await crypto.subtle.decrypt({ name: "AES-CBC", iv: iv2.buffer }, cryptoKey, encryptedData);
239
+ const cryptoKey = await crypto.subtle.importKey("raw", key2.buffer, { name: "AES-CBC" }, false, [
240
+ "decrypt"
241
+ ]);
242
+ const decryptedData = await crypto.subtle.decrypt(
243
+ { name: "AES-CBC", iv: iv2.buffer },
244
+ cryptoKey,
245
+ encryptedData
246
+ );
782
247
  return decryptedData;
783
248
  }
784
249
  var BOOKS = {};
@@ -802,12 +267,14 @@ var readZipEntry = async ({
802
267
  const originalName = manifest.medias[zipName];
803
268
  overridenName = `medias/${originalName}`;
804
269
  } else {
805
- console.error("any media should exist in manifest", zipName, entryName, bookId);
270
+ if (entryName !== "manifest.json") {
271
+ console.error("any media should exist in manifest", zipName, entryName, bookId);
272
+ }
806
273
  }
807
274
  }
808
275
  const bookEntry = BOOKS[bookId].map.get(overridenName);
809
276
  if (!bookEntry) {
810
- console.info("no bookEntry", entryName, "found", overridenName);
277
+ console.info("no bookEntry", entryName, "overridingName:", overridenName, "for book", bookId);
811
278
  return null;
812
279
  }
813
280
  if (!bookEntry.decoded) {
@@ -820,43 +287,19 @@ var hasZip = (bookId) => {
820
287
  };
821
288
  var loadZip = async (buf, bookId) => {
822
289
  const m = /* @__PURE__ */ new Map();
823
- const unzipper = new Unzip();
824
- unzipper.register(UnzipInflate);
825
- unzipper.onfile = (file) => {
826
- if (!file.name.includes(".")) {
827
- return;
290
+ const headers = getHeaders(buf);
291
+ for (const header of headers) {
292
+ const name = new TextDecoder().decode(header.name);
293
+ if (!name.includes(".")) {
294
+ continue;
828
295
  }
829
- m.set(file.name, {
296
+ m.set(name, {
830
297
  decoded: null,
831
298
  zipEntry: {
832
- getData: () => {
833
- return new Promise((resolve) => {
834
- const buffers = [];
835
- file.ondata = (err2, data, final) => {
836
- if (err2) {
837
- console.error("failed to read zip data", file.name, err2);
838
- }
839
- if (data.byteLength) {
840
- buffers.push(data);
841
- }
842
- if (final) {
843
- return resolve(concatArrayBuffers(buffers));
844
- }
845
- };
846
- file.start();
847
- });
848
- }
299
+ getData: async () => readRecordData(buf, header).buffer
849
300
  }
850
301
  });
851
- };
852
- const chunkSize = 32 * 1024 * 1024;
853
- const nChunks = Math.max(1, Math.floor(buf.byteLength / chunkSize));
854
- const sleep = new Promise((resolve) => setTimeout(resolve, 0));
855
- for (let i = 0; i < nChunks - 1; ++i) {
856
- unzipper.push(buf.slice(i * chunkSize, (i + 1) * chunkSize));
857
- await sleep;
858
302
  }
859
- unzipper.push(buf.slice((nChunks - 1) * chunkSize, buf.byteLength), true);
860
303
  BOOKS[bookId] = {
861
304
  map: m,
862
305
  manifest: null
@@ -886,7 +329,8 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
886
329
  return back;
887
330
  }
888
331
  if (STORAGE === "cache") {
889
- const response = await caches.match(zipUrl);
332
+ const cache = await openCache(CONF_ENV);
333
+ const response = await cache.match(zipUrl);
890
334
  if (!response) {
891
335
  throw new Error(`missing zip ${zipUrl}`);
892
336
  }
@@ -910,7 +354,11 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
910
354
  const buf = await readArrayBuffer();
911
355
  if (CHECK_UPDATES) {
912
356
  const response = await fetch(zipUrl, { method: "HEAD" });
913
- const remoteSize = Number.parseInt(response.headers.get("content-length") || "0", 10);
357
+ let remoteSize = Number.parseInt(response.headers.get("content-length") ?? "");
358
+ if (!remoteSize) {
359
+ console.info("remoteSize not found. will skip update. Is the server up at", zipUrl);
360
+ remoteSize = buf.byteLength;
361
+ }
914
362
  if (remoteSize !== buf.byteLength) {
915
363
  const error = `new ${fileName} available, refetching (opfs:${buf.byteLength} vs remote:${remoteSize})`;
916
364
  console.debug(error);
@@ -918,6 +366,7 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
918
366
  throw new Error(`new ${fileName} available, refetching`);
919
367
  }
920
368
  }
369
+ self.postMessage({ methodName: "opfsProgress", arg: { total: buf.byteLength, bytes: buf.byteLength } });
921
370
  return buf;
922
371
  } catch (e) {
923
372
  if (e instanceof Error && e.message !== "forceRefresh" && !e.message.includes("refetching")) {
@@ -947,6 +396,7 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
947
396
  self.postMessage({ methodName: "opfsProgress", arg: { total: contentLength, bytes: position } });
948
397
  }
949
398
  }
399
+ console.debug("zip loaded:", arrayBuffer.byteLength);
950
400
  if (STORAGE === "native") {
951
401
  await sender.nativeWriteFile({ fname: fileName, buffer: arrayBuffer });
952
402
  } else if (STORAGE === "opfs") {
@@ -958,6 +408,7 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
958
408
  await accessHandle.close();
959
409
  } else {
960
410
  const cache = await openCache(CONF_ENV);
411
+ console.time("writing cache");
961
412
  const response2 = new Response(arrayBuffer, {
962
413
  headers: {
963
414
  "Cache-Control": "max-age=600, s-maxage=600, public, proxy-revalidate",
@@ -970,9 +421,12 @@ var fetchZipFile = async (zipUrl, { forceRefresh } = {}) => {
970
421
  type: "cors",
971
422
  url: zipUrl
972
423
  });
973
- 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
+ });
974
428
  }
975
- return await readArrayBuffer();
429
+ return arrayBuffer;
976
430
  }
977
431
  };
978
432
  var slugToFileMeta2 = async ({ slug }) => {
@@ -991,8 +445,10 @@ var loadBook2 = async ({ id: bookId, forceRefresh }) => {
991
445
  tryCatch(async () => {
992
446
  const buf = await fetchZipFile(`${ZIP_BASE_URL}/${bookId}.zip`, { forceRefresh });
993
447
  try {
448
+ console.time("loadzip");
994
449
  const entryNames = await loadZip(new Uint8Array(buf), bookId);
995
- fetchWorker.postMessage({ methodName: "setKnownLinks", arg: { entryNames, bookId } });
450
+ console.timeEnd("loadzip");
451
+ await fetchWorkerSync.setKnownLinks({ entryNames, bookId });
996
452
  if (isOldZip(bookId)) {
997
453
  const json = await readZipEntry({
998
454
  entryName: `preload/${bookId}.json`,
@@ -1000,6 +456,13 @@ var loadBook2 = async ({ id: bookId, forceRefresh }) => {
1000
456
  asJson: true
1001
457
  });
1002
458
  loadBook(json);
459
+ } else {
460
+ try {
461
+ const { createdAt } = await readZipEntry({ bookId, entryName: "manifest.json", asJson: true });
462
+ console.debug("zipversion", createdAt);
463
+ } catch (e) {
464
+ console.debug("failed to read manifest.json", e);
465
+ }
1003
466
  }
1004
467
  return true;
1005
468
  } catch (e) {
@@ -1028,27 +491,30 @@ var loadPageContent2 = async ({
1028
491
  });
1029
492
  return await loadPageContent({ chapterId, json });
1030
493
  };
494
+ var ensureAppReady = () => {
495
+ };
1031
496
  var fetchWorker;
497
+ var fetchWorkerSync;
1032
498
  var initChannel = (__, { ports }) => {
1033
499
  fetchWorker = ports[0];
1034
- const { canHandle, handle } = makeSyncHandler(fetchWorker, {
500
+ const onHandler = makeSyncHandler({
1035
501
  readZipEntry,
1036
502
  loadBook: loadBook2,
1037
503
  slugToFileMeta: slugToFileMeta2,
1038
504
  loadPageContent: loadPageContent2,
1039
- searchBooks
505
+ searchBooks,
506
+ ensureAppReady
1040
507
  });
1041
- const fn = (dataObj) => {
1042
- if (dataObj.data?.methodName === "sendAppReady") {
1043
- self.postMessage({ methodName: "ready" });
1044
- return;
1045
- }
1046
- if (canHandle(dataObj.data?.methodName || "")) {
1047
- return handle(dataObj);
1048
- }
1049
- 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!");
1050
517
  };
1051
- fetchWorker.onmessage = fn;
1052
518
  };
1053
519
  var loadBooks = async ({ primaryOnly = false } = {}) => {
1054
520
  let entries = [];
@@ -1120,7 +586,7 @@ var reset = async () => {
1120
586
  await (await navigator.storage.getDirectory()).remove({ recursive: true });
1121
587
  console.info("opfs cleared");
1122
588
  };
1123
- var mainHandle = makeSyncHandler(self, {
589
+ var mainHandle = makeSyncHandler({
1124
590
  initChannel,
1125
591
  loadPreload: loadPreload2,
1126
592
  readZipEntry,