@lls/offline 24.27.0 → 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.
- package/lib/assets/fetch-worker.js +200 -71
- package/lib/assets/offline-worker.js +141 -670
- package/lib/index.js +100 -35
- package/package.json +4 -3
|
@@ -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 && !
|
|
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
|
-
|
|
35
|
-
|
|
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
|
|
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
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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(
|
|
80
|
-
return h.handle(
|
|
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
|
-
//
|
|
174
|
-
var
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
191
|
}
|
|
465
192
|
}
|
|
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
|
-
}
|
|
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
193
|
}
|
|
548
|
-
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
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
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
};
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
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
|
-
|
|
217
|
+
socdIdx += 46 + n + m + k;
|
|
650
218
|
}
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
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, [
|
|
781
|
-
|
|
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
|
-
|
|
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, "
|
|
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
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
if (!
|
|
827
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
console.error("
|
|
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 = [];
|
|
@@ -1116,13 +582,18 @@ var loadPreload2 = async () => {
|
|
|
1116
582
|
console.error("failed to load preload", e);
|
|
1117
583
|
}
|
|
1118
584
|
};
|
|
1119
|
-
var
|
|
585
|
+
var reset = async () => {
|
|
586
|
+
await (await navigator.storage.getDirectory()).remove({ recursive: true });
|
|
587
|
+
console.info("opfs cleared");
|
|
588
|
+
};
|
|
589
|
+
var mainHandle = makeSyncHandler({
|
|
1120
590
|
initChannel,
|
|
1121
591
|
loadPreload: loadPreload2,
|
|
1122
592
|
readZipEntry,
|
|
1123
593
|
loadBooks,
|
|
1124
594
|
loadBook: loadBook2,
|
|
1125
|
-
configure
|
|
595
|
+
configure,
|
|
596
|
+
reset
|
|
1126
597
|
});
|
|
1127
598
|
var { handler, ...sender } = makeSyncWorker(self, ["nativeWriteFile", "nativeReadFile", "nativeListZips"]);
|
|
1128
599
|
self.onmessage = combineHandlers(mainHandle, handler);
|