zip-peek 0.6.6 → 0.7.0
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/README.md +6 -4
- package/dist/index.d.ts +8 -2
- package/dist/index.js +54 -18
- package/dist/types.d.ts +5 -0
- package/dist/zip-utils.js +6 -5
- package/dist/zipServiceWorker.js +1 -1
- package/dist/zipServiceWorker.js.map +1 -1
- package/package.json +10 -2
package/README.md
CHANGED
|
@@ -157,12 +157,14 @@ Defaults to `true`. When a service worker is installed for the first time, the c
|
|
|
157
157
|
Defaults to `'keep-all'`. Controls which zip-peek cache entries are cleared during initialization.
|
|
158
158
|
|
|
159
159
|
- `'keep-all'`: do not clear cached ZIP manifests or extracted assets.
|
|
160
|
-
- `'keep-allowed-urls'`: requires non-empty `allowedZipUrls`; clears cached ZIP data for URLs outside the allow-list.
|
|
160
|
+
- `'keep-allowed-urls'`: requires non-empty `allowedZipUrls`; clears cached ZIP data for URLs outside the **union of live client claims** (every open tab under the same service worker scope that has configured an allow-list). Closed tabs are dropped from the union so their packages can be cleared.
|
|
161
161
|
- `'clear-all'`: clears all zip-peek cached manifests and extracted assets for a fresh start.
|
|
162
162
|
|
|
163
163
|
`allowedZipUrls`
|
|
164
164
|
|
|
165
|
-
Restricts zip-peek to a known set of ZIP package URLs
|
|
165
|
+
Restricts zip-peek to a known set of ZIP package URLs **for this client (tab)**. When omitted, this tab does not add a claim; if no tab has an allow-list claim, zip-peek lazily serves any matching `.zip/...` request inside the service worker scope. When provided, the array must contain at least one ZIP URL.
|
|
166
|
+
|
|
167
|
+
Across tabs that share the same service worker, each tab's allow-list is a **claim**. The worker serves (and `keep-allowed-urls` retains) the **union** of claims from live clients. Requests to ZIP URLs outside that union receive **403**. After a service worker restart, open tabs are asked to re-claim before a destructive clear so sibling tabs are not wiped.
|
|
166
168
|
|
|
167
169
|
The allow-list also acts as a warmup list: zip-peek loads and caches each allowed ZIP manifest during initialization.
|
|
168
170
|
|
|
@@ -458,7 +460,7 @@ The service worker stores:
|
|
|
458
460
|
|
|
459
461
|
- parsed ZIP manifests (in `zip-cache-v1` by default, keyed per ZIP URL)
|
|
460
462
|
- fully extracted and decompressed assets (populated in the background from a tee of the client stream, with `X-ZipSW-Cached-At` TTL metadata)
|
|
461
|
-
- persisted
|
|
463
|
+
- persisted allow-list union (and restricted flag) in a separate config cache (`zip-peek-config-v1`); live allow-list truth is the union of per-tab claims in the service worker
|
|
462
464
|
|
|
463
465
|
The default asset/manifest cache bucket is:
|
|
464
466
|
|
|
@@ -468,7 +470,7 @@ zip-cache-v1
|
|
|
468
470
|
|
|
469
471
|
Extracted assets expire after two hours by default. Set `assetCacheTtlMs` to customize this.
|
|
470
472
|
|
|
471
|
-
Use `cacheClearingStrategy` to control initialization-time cleanup. `keep-all` leaves existing entries untouched, `keep-allowed-urls` removes cached ZIP data outside
|
|
473
|
+
Use `cacheClearingStrategy` to control initialization-time cleanup. `keep-all` leaves existing entries untouched, `keep-allowed-urls` removes cached ZIP data outside the union of live client claims, and `clear-all` removes all zip-peek cached ZIP data before warming any allowed manifests.
|
|
472
474
|
|
|
473
475
|
## Internal Flow
|
|
474
476
|
|
package/dist/index.d.ts
CHANGED
|
@@ -9,8 +9,14 @@ export { getPresignedUrlExpiryMs } from "./zip-utils";
|
|
|
9
9
|
* service worker scope by loading the ZIP manifest on first use. Pass
|
|
10
10
|
* `allowedZipUrls` to restrict serving to a known, non-empty set of ZIP
|
|
11
11
|
* package URLs and warm their manifests during initialization. Use
|
|
12
|
-
* `cacheClearingStrategy` to keep existing cache entries, keep only
|
|
13
|
-
*
|
|
12
|
+
* `cacheClearingStrategy` to keep existing cache entries, keep only URLs
|
|
13
|
+
* claimed by live clients (union across tabs), or clear all zip-peek cache
|
|
14
|
+
* entries before use.
|
|
15
|
+
*
|
|
16
|
+
* Allow-list state is per client (tab): multiple tabs under the same service
|
|
17
|
+
* worker scope each claim their own URLs; serving and `keep-allowed-urls`
|
|
18
|
+
* clearing use the union of live claims. Closed tabs are reaped, and the
|
|
19
|
+
* worker may reclaim claims from open tabs after a service worker restart.
|
|
14
20
|
*
|
|
15
21
|
* When `onUrlExpiry` is provided and an allowed URL is a recognized presigned
|
|
16
22
|
* URL, zip-peek invokes the handler shortly before expiry and re-checks on tab
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,11 @@ let currentOnError;
|
|
|
18
18
|
let currentOnUrlExpiry;
|
|
19
19
|
let clientMessageListenerInstalled = false;
|
|
20
20
|
let expiryWakeListenersInstalled = false;
|
|
21
|
+
/**
|
|
22
|
+
* Last allow-list sent to the service worker from this page.
|
|
23
|
+
* `undefined` = initZipPeek not completed; `null` = unrestricted; `string[]` = claim.
|
|
24
|
+
*/
|
|
25
|
+
let lastConfiguredAllowedZipUrls = undefined;
|
|
21
26
|
/** Timers keyed by normalized zip URL. */
|
|
22
27
|
const urlExpiryTimers = new Map();
|
|
23
28
|
/** Original resolved URLs for expiry parsing, keyed by normalized zip URL. */
|
|
@@ -28,7 +33,7 @@ function zipPackagePathname(zipUrl) {
|
|
|
28
33
|
try {
|
|
29
34
|
return new URL(zipUrl).pathname;
|
|
30
35
|
}
|
|
31
|
-
catch {
|
|
36
|
+
catch (_a) {
|
|
32
37
|
return zipUrl.split("?")[0].split("#")[0];
|
|
33
38
|
}
|
|
34
39
|
}
|
|
@@ -49,21 +54,22 @@ function zipServiceWorkerScriptMatches(scriptURL, expectedWorkerUrl) {
|
|
|
49
54
|
const resolved = new URL(scriptURL, window.location.href).href;
|
|
50
55
|
return resolved === expected;
|
|
51
56
|
}
|
|
52
|
-
catch {
|
|
57
|
+
catch (_a) {
|
|
53
58
|
try {
|
|
54
59
|
return /\/zipServiceWorker(\.[0-9a-f]{8})?\.js(\?|$)/.test(new URL(scriptURL).pathname);
|
|
55
60
|
}
|
|
56
|
-
catch {
|
|
61
|
+
catch (_b) {
|
|
57
62
|
return false;
|
|
58
63
|
}
|
|
59
64
|
}
|
|
60
65
|
}
|
|
61
66
|
async function unregisterMismatchedScopeZipServiceWorkerIfNeeded(expectedWorkerUrl, expectedScopeUrl) {
|
|
67
|
+
var _a, _b, _c, _d, _e;
|
|
62
68
|
const expectedWorkerHref = new URL(expectedWorkerUrl, window.location.href).href;
|
|
63
69
|
const wantScopePath = normalizeScopePath(expectedScopeUrl);
|
|
64
70
|
const registrations = await navigator.serviceWorker.getRegistrations();
|
|
65
71
|
for (const reg of registrations) {
|
|
66
|
-
const scriptURL = reg.installing
|
|
72
|
+
const scriptURL = (_d = (_b = (_a = reg.installing) === null || _a === void 0 ? void 0 : _a.scriptURL) !== null && _b !== void 0 ? _b : (_c = reg.waiting) === null || _c === void 0 ? void 0 : _c.scriptURL) !== null && _d !== void 0 ? _d : (_e = reg.active) === null || _e === void 0 ? void 0 : _e.scriptURL;
|
|
67
73
|
if (!scriptURL) {
|
|
68
74
|
continue;
|
|
69
75
|
}
|
|
@@ -71,7 +77,7 @@ async function unregisterMismatchedScopeZipServiceWorkerIfNeeded(expectedWorkerU
|
|
|
71
77
|
try {
|
|
72
78
|
scriptHref = new URL(scriptURL, window.location.href).href;
|
|
73
79
|
}
|
|
74
|
-
catch {
|
|
80
|
+
catch (_f) {
|
|
75
81
|
continue;
|
|
76
82
|
}
|
|
77
83
|
if (scriptHref !== expectedWorkerHref) {
|
|
@@ -85,15 +91,16 @@ async function unregisterMismatchedScopeZipServiceWorkerIfNeeded(expectedWorkerU
|
|
|
85
91
|
}
|
|
86
92
|
}
|
|
87
93
|
async function ensureZipServiceWorkerRegistered({ workerUrl, scopeUrl, reloadOnFirstInstall = true, }) {
|
|
94
|
+
var _a, _b, _c;
|
|
88
95
|
if (!("serviceWorker" in navigator)) {
|
|
89
96
|
return false;
|
|
90
97
|
}
|
|
91
98
|
await unregisterMismatchedScopeZipServiceWorkerIfNeeded(workerUrl, scopeUrl);
|
|
92
99
|
const existing = await navigator.serviceWorker.getRegistration(scopeUrl);
|
|
93
100
|
const alreadyRegistered = existing &&
|
|
94
|
-
(zipServiceWorkerScriptMatches(existing.active
|
|
95
|
-
zipServiceWorkerScriptMatches(existing.waiting
|
|
96
|
-
zipServiceWorkerScriptMatches(existing.installing
|
|
101
|
+
(zipServiceWorkerScriptMatches((_a = existing.active) === null || _a === void 0 ? void 0 : _a.scriptURL, workerUrl) ||
|
|
102
|
+
zipServiceWorkerScriptMatches((_b = existing.waiting) === null || _b === void 0 ? void 0 : _b.scriptURL, workerUrl) ||
|
|
103
|
+
zipServiceWorkerScriptMatches((_c = existing.installing) === null || _c === void 0 ? void 0 : _c.scriptURL, workerUrl));
|
|
97
104
|
if (!alreadyRegistered) {
|
|
98
105
|
try {
|
|
99
106
|
await navigator.serviceWorker.register(workerUrl, { scope: scopeUrl });
|
|
@@ -117,6 +124,7 @@ async function ensureZipServiceWorkerRegistered({ workerUrl, scopeUrl, reloadOnF
|
|
|
117
124
|
}
|
|
118
125
|
/** Context attached when service worker registration fails. */
|
|
119
126
|
function describeRegistrationFailureContext() {
|
|
127
|
+
var _a;
|
|
120
128
|
const cookieEnabled = typeof navigator !== "undefined" ? navigator.cookieEnabled : false;
|
|
121
129
|
let localStorageAccess = "ok";
|
|
122
130
|
try {
|
|
@@ -130,7 +138,7 @@ function describeRegistrationFailureContext() {
|
|
|
130
138
|
`visibility=${document.visibilityState}`,
|
|
131
139
|
`hidden=${document.hidden}`,
|
|
132
140
|
`online=${navigator.onLine}`,
|
|
133
|
-
`hasController=${Boolean(navigator.serviceWorker
|
|
141
|
+
`hasController=${Boolean((_a = navigator.serviceWorker) === null || _a === void 0 ? void 0 : _a.controller)}`,
|
|
134
142
|
`cookieEnabled=${cookieEnabled}`,
|
|
135
143
|
`localStorage=${localStorageAccess}`,
|
|
136
144
|
].join("; ");
|
|
@@ -144,10 +152,11 @@ function attachZipPeekInfo(error, info) {
|
|
|
144
152
|
}
|
|
145
153
|
function reportZipPeekError(onError, error, info) {
|
|
146
154
|
const err = (0, types_1.toZipPeekError)(error);
|
|
147
|
-
onError
|
|
155
|
+
onError === null || onError === void 0 ? void 0 : onError(err, info !== null && info !== void 0 ? info : err.zipPeekInfo);
|
|
148
156
|
}
|
|
149
157
|
function errorFromWorkerResponse(response) {
|
|
150
|
-
|
|
158
|
+
var _a;
|
|
159
|
+
const error = new Error((_a = response.error) !== null && _a !== void 0 ? _a : (0, types_1.formatZipPeekError)("Service worker did not acknowledge the message."));
|
|
151
160
|
if (response.errorStack) {
|
|
152
161
|
error.stack = response.errorStack;
|
|
153
162
|
}
|
|
@@ -231,13 +240,14 @@ function rearmExpiryIfStillTracked(normalizedZipUrl) {
|
|
|
231
240
|
urlExpiryTimers.set(normalizedZipUrl, timerId);
|
|
232
241
|
}
|
|
233
242
|
async function invokeUrlExpiry(normalizedZipUrl) {
|
|
243
|
+
var _a;
|
|
234
244
|
if (!currentOnUrlExpiry || urlExpiryInFlight.has(normalizedZipUrl)) {
|
|
235
245
|
return;
|
|
236
246
|
}
|
|
237
247
|
urlExpiryInFlight.add(normalizedZipUrl);
|
|
238
248
|
try {
|
|
239
249
|
await currentOnUrlExpiry({
|
|
240
|
-
expiredZipURL: trackedZipUrls.get(normalizedZipUrl)
|
|
250
|
+
expiredZipURL: (_a = trackedZipUrls.get(normalizedZipUrl)) !== null && _a !== void 0 ? _a : "",
|
|
241
251
|
normalizedExpiredZipURL: normalizedZipUrl,
|
|
242
252
|
});
|
|
243
253
|
}
|
|
@@ -255,10 +265,22 @@ function ensureClientMessageListener() {
|
|
|
255
265
|
}
|
|
256
266
|
clientMessageListenerInstalled = true;
|
|
257
267
|
navigator.serviceWorker.addEventListener("message", (event) => {
|
|
268
|
+
var _a, _b, _c;
|
|
258
269
|
const data = event.data;
|
|
259
270
|
if (!data) {
|
|
260
271
|
return;
|
|
261
272
|
}
|
|
273
|
+
if (data.type === "ZIP_SW_CLAIM_REQUEST") {
|
|
274
|
+
const port = event.ports[0];
|
|
275
|
+
if (!port)
|
|
276
|
+
return;
|
|
277
|
+
if (lastConfiguredAllowedZipUrls === undefined) {
|
|
278
|
+
port.postMessage({});
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
port.postMessage({ allowedZipUrls: lastConfiguredAllowedZipUrls });
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
262
284
|
if (data.type === "ZIP_SW_MANIFEST_CREATED" &&
|
|
263
285
|
data.zipUrl &&
|
|
264
286
|
Array.isArray(data.files) &&
|
|
@@ -277,8 +299,8 @@ function ensureClientMessageListener() {
|
|
|
277
299
|
if (data.type !== "ZIP_SW_ERROR" || !currentOnError) {
|
|
278
300
|
return;
|
|
279
301
|
}
|
|
280
|
-
const error = new Error(data.error
|
|
281
|
-
if (data.error
|
|
302
|
+
const error = new Error((_b = (_a = data.error) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : (0, types_1.formatZipPeekError)("Service worker reported an error."));
|
|
303
|
+
if ((_c = data.error) === null || _c === void 0 ? void 0 : _c.stack) {
|
|
282
304
|
error.stack = data.error.stack;
|
|
283
305
|
}
|
|
284
306
|
currentOnError(error, data.info ? (0, types_1.formatZipPeekError)(data.info) : undefined);
|
|
@@ -340,8 +362,14 @@ async function postWorkerMessageOrThrow(message, info) {
|
|
|
340
362
|
* service worker scope by loading the ZIP manifest on first use. Pass
|
|
341
363
|
* `allowedZipUrls` to restrict serving to a known, non-empty set of ZIP
|
|
342
364
|
* package URLs and warm their manifests during initialization. Use
|
|
343
|
-
* `cacheClearingStrategy` to keep existing cache entries, keep only
|
|
344
|
-
*
|
|
365
|
+
* `cacheClearingStrategy` to keep existing cache entries, keep only URLs
|
|
366
|
+
* claimed by live clients (union across tabs), or clear all zip-peek cache
|
|
367
|
+
* entries before use.
|
|
368
|
+
*
|
|
369
|
+
* Allow-list state is per client (tab): multiple tabs under the same service
|
|
370
|
+
* worker scope each claim their own URLs; serving and `keep-allowed-urls`
|
|
371
|
+
* clearing use the union of live claims. Closed tabs are reaped, and the
|
|
372
|
+
* worker may reclaim claims from open tabs after a service worker restart.
|
|
345
373
|
*
|
|
346
374
|
* When `onUrlExpiry` is provided and an allowed URL is a recognized presigned
|
|
347
375
|
* URL, zip-peek invokes the handler shortly before expiry and re-checks on tab
|
|
@@ -388,10 +416,11 @@ async function initZipPeek({ workerUrl, scopeUrl, reloadOnFirstInstall = true, c
|
|
|
388
416
|
zipAssetCacheName,
|
|
389
417
|
assetCacheTtlMs,
|
|
390
418
|
logPrefix,
|
|
391
|
-
allowedZipUrls: normalizedAllowedZipUrls
|
|
419
|
+
allowedZipUrls: normalizedAllowedZipUrls !== null && normalizedAllowedZipUrls !== void 0 ? normalizedAllowedZipUrls : null,
|
|
392
420
|
requireExactManifestPath,
|
|
393
421
|
},
|
|
394
422
|
}, "Failed to configure service worker");
|
|
423
|
+
lastConfiguredAllowedZipUrls = normalizedAllowedZipUrls !== null && normalizedAllowedZipUrls !== void 0 ? normalizedAllowedZipUrls : null;
|
|
395
424
|
if (cacheClearingStrategy === "clear-all") {
|
|
396
425
|
await postWorkerMessageOrThrow({
|
|
397
426
|
type: "CLEAR_ALL_ZIP_ASSETS",
|
|
@@ -402,10 +431,11 @@ async function initZipPeek({ workerUrl, scopeUrl, reloadOnFirstInstall = true, c
|
|
|
402
431
|
zipAssetCacheName,
|
|
403
432
|
assetCacheTtlMs,
|
|
404
433
|
logPrefix,
|
|
405
|
-
allowedZipUrls: normalizedAllowedZipUrls
|
|
434
|
+
allowedZipUrls: normalizedAllowedZipUrls !== null && normalizedAllowedZipUrls !== void 0 ? normalizedAllowedZipUrls : null,
|
|
406
435
|
requireExactManifestPath,
|
|
407
436
|
},
|
|
408
437
|
}, "Failed to reconfigure service worker after cache clear");
|
|
438
|
+
lastConfiguredAllowedZipUrls = normalizedAllowedZipUrls !== null && normalizedAllowedZipUrls !== void 0 ? normalizedAllowedZipUrls : null;
|
|
409
439
|
}
|
|
410
440
|
else if (cacheClearingStrategy === "keep-allowed-urls" && normalizedAllowedZipUrls) {
|
|
411
441
|
await postWorkerMessageOrThrow({
|
|
@@ -463,6 +493,12 @@ async function renewPresignedUrl({ previousUrl, nextUrl }) {
|
|
|
463
493
|
previousUrl: previous,
|
|
464
494
|
nextUrl: next,
|
|
465
495
|
}, "Failed to renew ZIP URL in service worker");
|
|
496
|
+
if (Array.isArray(lastConfiguredAllowedZipUrls)) {
|
|
497
|
+
lastConfiguredAllowedZipUrls = lastConfiguredAllowedZipUrls.map((url) => url === previous ? next : url);
|
|
498
|
+
if (!lastConfiguredAllowedZipUrls.includes(next)) {
|
|
499
|
+
lastConfiguredAllowedZipUrls = [...lastConfiguredAllowedZipUrls, next];
|
|
500
|
+
}
|
|
501
|
+
}
|
|
466
502
|
const files = sessionManifests.get(previous);
|
|
467
503
|
if (files) {
|
|
468
504
|
sessionManifests.set(next, files);
|
package/dist/types.d.ts
CHANGED
|
@@ -4,6 +4,11 @@ export type ZipWorkerConfig = {
|
|
|
4
4
|
logPrefix?: string;
|
|
5
5
|
};
|
|
6
6
|
export type ZipCacheClearingStrategy = "keep-all" | "keep-allowed-urls" | "clear-all";
|
|
7
|
+
/**
|
|
8
|
+
* `keep-allowed-urls` clears cached ZIP data outside the **union of live
|
|
9
|
+
* client claims** (all tabs under the same service worker scope that have
|
|
10
|
+
* configured `allowedZipUrls`), not only the calling tab's list.
|
|
11
|
+
*/
|
|
7
12
|
export type ZipPeekErrorHandler = (error: Error, info?: string) => void;
|
|
8
13
|
/**
|
|
9
14
|
* Invoked shortly before a tracked presigned ZIP URL expires.
|
package/dist/zip-utils.js
CHANGED
|
@@ -13,7 +13,7 @@ function isZipPackage(url) {
|
|
|
13
13
|
const u = new URL(url);
|
|
14
14
|
return u.pathname.endsWith(".zip");
|
|
15
15
|
}
|
|
16
|
-
catch {
|
|
16
|
+
catch (_a) {
|
|
17
17
|
return url.split("?")[0].endsWith(".zip");
|
|
18
18
|
}
|
|
19
19
|
}
|
|
@@ -48,14 +48,15 @@ function normalizeZipUrl(urlString, options = {}) {
|
|
|
48
48
|
}
|
|
49
49
|
/** Basename of the ZIP file from a package URL, without the `.zip` extension. */
|
|
50
50
|
function zipBasenameWithoutExtension(zipUrl) {
|
|
51
|
+
var _a, _b;
|
|
51
52
|
try {
|
|
52
53
|
const pathname = new URL(zipUrl, "http://local").pathname;
|
|
53
|
-
const file = pathname.split("/").pop()
|
|
54
|
+
const file = (_a = pathname.split("/").pop()) !== null && _a !== void 0 ? _a : "";
|
|
54
55
|
return file.endsWith(".zip") ? file.slice(0, -4) : file;
|
|
55
56
|
}
|
|
56
|
-
catch {
|
|
57
|
+
catch (_c) {
|
|
57
58
|
const path = zipUrl.split("?")[0].split("#")[0];
|
|
58
|
-
const file = path.split("/").pop()
|
|
59
|
+
const file = (_b = path.split("/").pop()) !== null && _b !== void 0 ? _b : "";
|
|
59
60
|
return file.endsWith(".zip") ? file.slice(0, -4) : file;
|
|
60
61
|
}
|
|
61
62
|
}
|
|
@@ -70,7 +71,7 @@ function safeDecodeSegment(s) {
|
|
|
70
71
|
try {
|
|
71
72
|
return decodeURIComponent(s);
|
|
72
73
|
}
|
|
73
|
-
catch {
|
|
74
|
+
catch (_a) {
|
|
74
75
|
return s;
|
|
75
76
|
}
|
|
76
77
|
}
|
package/dist/zipServiceWorker.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{"use strict";var e={553(e,t){function n(e){const n=e.trim();return n.startsWith(t.ZIP_PEEK_ERROR_PREFIX)?n:`${t.ZIP_PEEK_ERROR_PREFIX} ${n}`}t.ZIP_PEEK_ERROR_PREFIX=void 0,t.formatZipPeekError=n,t.createZipPeekError=function(e){return new Error(n(e))},t.toZipPeekError=function(e){const r=e instanceof Error?e:new Error(String(e));return r.message.startsWith(t.ZIP_PEEK_ERROR_PREFIX)||(r.message=n(r.message)),r},t.errorMessage=function(e){return e instanceof Error?e.message:String(e)},t.ZIP_PEEK_ERROR_PREFIX="[zip-peek-error]"},314(e,t,n){t.persistAllowedZipUrlsConfig=a,t.ensureAllowedZipUrlsLoaded=async function(){if(s.allowedZipUrlsLoaded)return s.allowedZipUrlsLoaded;const e=(async()=>{try{const e=await caches.open(s.CONFIG_CACHE_NAME),t=await e.match(s.CONFIG_CACHE_KEY);if(!t)return;const n=await t.json();Array.isArray(n.allowedZipUrls)?(0,s.setAllowedZipUrls)(new Set(n.allowedZipUrls.filter(e=>"string"==typeof e).map(e=>(0,r.normalizeZipUrl)(e)))):(0,s.setAllowedZipUrls)(null)}catch(e){(0,i.warn)("failed to load runtime config",e)}})();return(0,s.setAllowedZipUrlsLoaded)(e),e},t.applyRuntimeConfig=async function(e){if(!e)return;let t={...s.runtimeConfig},n=!1;if("string"==typeof e.zipAssetCacheName&&e.zipAssetCacheName.trim()&&(t.zipAssetCacheName=e.zipAssetCacheName,n=!0),"number"==typeof e.assetCacheTtlMs&&Number.isFinite(e.assetCacheTtlMs)&&(t.assetCacheTtlMs=e.assetCacheTtlMs,n=!0),"string"==typeof e.logPrefix&&e.logPrefix.trim()&&(t.logPrefix=e.logPrefix,n=!0),"boolean"==typeof e.requireExactManifestPath&&(t.requireExactManifestPath=e.requireExactManifestPath,n=!0),n&&(0,s.setRuntimeConfig)(t),"allowedZipUrls"in e){const t=Array.isArray(e.allowedZipUrls)?e.allowedZipUrls.map(e=>(0,r.normalizeZipUrl)(e)):null;(0,s.setAllowedZipUrls)(t?new Set(t):null),(0,s.setAllowedZipUrlsLoaded)(Promise.resolve()),await a(t)}},t.isZipUrlAllowed=function(e){return null===s.allowedZipUrls||s.allowedZipUrls.has(e)};const r=n(343),s=n(262),i=n(266);async function a(e){try{const t=await caches.open(s.CONFIG_CACHE_NAME);await t.put(new Request(s.CONFIG_CACHE_KEY),new Response(JSON.stringify({allowedZipUrls:e}),{headers:{"Content-Type":"application/json"}}))}catch(e){(0,i.warn)("failed to persist runtime config",e)}}},800(e,t,n){t.canonicalAssetRequest=function(e,t){return new Request((0,s.canonicalZipAssetRequestUrl)(e,t),{method:"GET"})},t.clearAllZipAssets=async function(){const e=await caches.open(o.runtimeConfig.zipAssetCacheName),t=await e.keys();await Promise.all(t.map(t=>e.delete(t))),await caches.delete(o.CONFIG_CACHE_NAME),o.zipManifests.clear(),o.pendingManifestLoads.clear(),o.inFlightZipAssets.clear(),(0,o.setAllowedZipUrlsLoaded)(Promise.resolve())},t.clearZipAssetsExceptAllowed=async function(e){try{const t=new Set(e),n=await caches.open(o.runtimeConfig.zipAssetCacheName),r=await n.keys();for(const e of r){const r=e.url,i=(0,s.parseZipAssetRequest)(r);i&&!t.has(i.zipUrl)&&await n.delete(e)}for(const e of o.zipManifests.keys())t.has(e)||o.zipManifests.delete(e)}catch(e){throw(0,r.createZipPeekError)(`Failed to clear zip assets except allowed URLs: ${(0,r.errorMessage)(e)}`)}},t.putCachedFullAssetIfAbsent=async function(e,t){try{const n=await caches.open(o.runtimeConfig.zipAssetCacheName),r=await n.match(e);if(r&&!c(r))return void await(t.body?.cancel());const s=new Headers(t.headers);s.set(o.ASSET_CACHED_AT_HEADER,String(Date.now())),s.set("Access-Control-Allow-Origin","*"),await n.put(e,new Response(t.body,{status:t.status,statusText:t.statusText,headers:s}))}catch(e){t.body&&!t.body.locked&&await t.body.cancel(e),(0,l.warn)("asset cache put failed",e)}},t.readCachedZipAssetIfFresh=async function(e){let t=null,n="network";try{const r=await caches.open(o.runtimeConfig.zipAssetCacheName),s=await r.match(e);if(s)if(c(s))try{await r.delete(e)}catch(e){(0,l.warn)("asset cache delete expired failed",e)}else t=s,n="cache-api"}catch(e){(0,l.warn)("asset cache read failed",e)}return{response:t,assetSource:n}},t.renewZipUrl=async function(e,t){const n=(0,s.normalizeZipUrl)(e),l=(0,s.normalizeZipUrl)(t);if(n===l)return;if(o.allowedZipUrls){const e=new Set(o.allowedZipUrls);e.delete(n),e.add(l),(0,o.setAllowedZipUrls)(e),(0,o.setAllowedZipUrlsLoaded)(Promise.resolve()),await(0,i.persistAllowedZipUrlsConfig)(Array.from(e))}const c=o.zipManifests.get(n);c&&(o.zipManifests.set(l,c),o.zipManifests.delete(n));const f=o.pendingManifestLoads.get(n);f&&(o.pendingManifestLoads.set(l,f),o.pendingManifestLoads.delete(n)),(0,a.remapInFlightZipAssetsForRenewal)(n,l);try{const e=await caches.open(o.runtimeConfig.zipAssetCacheName),t=await e.keys();for(const r of t){const t=r.url,i=(0,s.parseZipAssetRequest)(t);i&&(0,s.normalizeZipUrl)(i.zipUrl)===n&&await e.delete(r)}}catch(e){throw(0,r.createZipPeekError)(`Failed to clear cached assets for renewed ZIP URL: ${(0,r.errorMessage)(e)}`)}};const r=n(553),s=n(343),i=n(314),a=n(30),o=n(262),l=n(266);function c(e){const t=e.headers.get(o.ASSET_CACHED_AT_HEADER);if(!t)return!0;const n=parseInt(t,10);return!Number.isFinite(n)||Date.now()-n>o.runtimeConfig.assetCacheTtlMs}},30(e,t,n){t.getOrStartInFlightAsset=function(e,t){const n=e.url,r=s.inFlightZipAssets.get(n);if(r)return r;let i,a;const o=new Promise((e,t)=>{i=e,a=t}),l={resultPromise:t(),cacheFillPromise:o,leaderClaimed:!1,resolveCacheFill:i,rejectCacheFill:a};return o.finally(()=>{s.inFlightZipAssets.delete(n)}),s.inFlightZipAssets.set(n,l),l},t.completeInFlightAssetLoad=function(e,t){const n=s.inFlightZipAssets.get(e);n&&(void 0!==t?n.rejectCacheFill(t):n.resolveCacheFill())},t.remapInFlightZipAssetsForRenewal=function(e,t){const n=(0,r.normalizeZipUrl)(e),i=(0,r.normalizeZipUrl)(t);for(const[e,t]of[...s.inFlightZipAssets]){const a=(0,r.parseZipAssetRequest)(e);if(a&&(0,r.normalizeZipUrl)(a.zipUrl)===n){const n=(0,r.canonicalZipAssetRequestUrl)(i,a.internalPath);s.inFlightZipAssets.delete(e),s.inFlightZipAssets.set(n,t)}}};const r=n(343),s=n(262)},982(e,t,n){t.installFetchHandler=function(){self.addEventListener("fetch",e=>{const t=e.request.method;if("GET"!==t&&"HEAD"!==t)return;if(!(0,s.parseZipAssetRequest)(e.request.url))return;const n=async function(e,t){const n="HEAD"===e.method,u=(0,s.parseZipAssetRequest)(e.url),g=(0,s.normalizeZipUrl)(u.zipUrl),m=u.internalPath,w=(0,s.normalizeZipEntryPath)(m);try{if(await(0,i.ensureAllowedZipUrlsLoaded)(),!(0,i.isZipUrlAllowed)(g))return(0,c.warn)("zip URL not allowed",{requestedZipUrl:g}),{response:(0,p.corsErrorResponse)(`ZIP URL not allowed (not in allowedZipUrls): ${g}`,403)};let s=l.zipManifests.get(g);if(s||(s=await(0,f.ensureManifestAvailable)(g,t)??void 0),!s){const e=Array.from(l.zipManifests.keys());return(0,c.warn)("manifest missing for zipUrl",{requestedZipUrl:g,knownZipUrls:e}),{response:(0,p.corsErrorResponse)(`ZIP manifest not loaded for ${g}. Ensure the ZIP is reachable and supports byte-range requests.`,404)}}const u=(0,f.resolveManifestEntry)(s,w,g,l.runtimeConfig.requireExactManifestPath);if(!u){const e=Array.from(s.keys()).slice(0,50);return(0,c.warn)("file not in manifest",{zipUrl:g,internalPathRaw:m,internalPathNormalized:w,requireExactManifestPath:l.runtimeConfig.requireExactManifestPath,manifestSize:s.size,sampleKeys:e}),{response:(0,p.corsErrorResponse)(`File "${m}" not found in ZIP manifest for ${g}`,404)}}const{key:E,info:A,matchKind:y}=u;if("zipBasenameFallback"===y&&((0,c.log)("resolved via zip-basename folder fallback",{requested:w,manifestKey:E}),(0,c.reportClientError)(new Error((0,r.formatZipPeekError)("Exact manifest path not found; resolved via zip-basename folder fallback")),`Exact manifest key "${w}" not found in ${g}; resolved using "${E}"`)),n)return{response:h(e,E,A)};const U=(0,a.canonicalAssetRequest)(g,E),C=await(0,a.readCachedZipAssetIfFresh)(U),Z=(0,f.entryUncompressedSize)(A),R=(0,p.getMimeType)(E);if(C.response)return{response:d(C.response.body,R,Z,C.assetSource,e.headers.get("range"))};const S=(0,o.getOrStartInFlightAsset)(U,()=>(0,p.fetchUncompressedZipEntryFromNetwork)(g,E,A)),z=await S.resultPromise;if(!z.ok)return(0,o.completeInFlightAssetLoad)(U.url),{response:z.response};const _=!S.leaderClaimed&&(S.leaderClaimed=!0),v=8===A.compression?null:e.headers.get("range");if(!_){await S.cacheFillPromise;const t=await(0,a.readCachedZipAssetIfFresh)(U);return t.response?{response:d(t.response.body,R,Z,t.assetSource,e.headers.get("range"))}:{response:(0,p.corsErrorResponse)(`Failed to serve "${E}" from ${g}: asset cache was not ready after in-flight load`,500)}}const[b,P]=z.stream.tee(),M={"Content-Type":z.contentType};null!==z.contentLength&&(M["Content-Length"]=String(z.contentLength));const I=U.url,T=(0,a.putCachedFullAssetIfAbsent)(U,new Response(P,{status:200,headers:M})).then(()=>{(0,o.completeInFlightAssetLoad)(I)}).catch(e=>{throw(0,o.completeInFlightAssetLoad)(I,e),e});return{response:d(b,z.contentType,z.contentLength,"network",v),background:T}}catch(e){return(0,c.error)("fetch handler failed",{zipUrl:g,internalPath:m,message:(0,r.errorMessage)(e)}),{response:(0,p.corsErrorResponse)(`Failed to serve "${m}" from ${g}: ${(0,r.errorMessage)(e)}`,500)}}}(e.request,e.clientId||void 0);e.respondWith(n.then(({response:e})=>e)),e.waitUntil(n.then(({background:e})=>e).catch(e=>{(0,c.warn)("background asset cache failed",(0,r.errorMessage)(e))}))})};const r=n(553),s=n(343),i=n(314),a=n(800),o=n(30),l=n(262),c=n(266),f=n(346),p=n(254);function u(e){return{"Access-Control-Allow-Origin":"*","Access-Control-Expose-Headers":l.ASSET_SOURCE_HEADER,[l.ASSET_SOURCE_HEADER]:e}}function d(e,t,n,r,s){if(s){if(null===n)return e?.cancel(),new Response(null,{status:416,headers:u(r)});const i=s.replace(/^bytes=/,"");if(i.includes(","))return e?.cancel(),new Response(null,{status:416,headers:{"Content-Range":`bytes */${n}`,...u(r)}});const[a,o]=i.split("-"),l=""!==a?parseInt(a,10):NaN,c=""!==o?parseInt(o,10):n-1;if(isNaN(l)||isNaN(c)||l<0||c<l||l>=n)return e?.cancel(),new Response(null,{status:416,headers:{"Content-Range":`bytes */${n}`,...u(r)}});const f=Math.min(c,n-1),p=f-l+1,d=null===e?null:function(e,t,n){let r=0;return e.pipeThrough(new TransformStream({transform(e,s){const i=r,a=r+e.byteLength-1;if(r+=e.byteLength,a<t)return;if(i>n)return void s.terminate();const o=Math.max(0,t-i),l=Math.min(e.byteLength,n-i+1);l>o&&s.enqueue(e.subarray(o,l)),a>=n&&s.terminate()}}))}(e,l,f);return new Response(d,{status:206,headers:{"Content-Type":t,"Content-Range":`bytes ${l}-${f}/${n}`,"Content-Length":p.toString(),"Accept-Ranges":"bytes",...u(r)}})}const i={"Content-Type":t,...u(r)};return null!==n&&(i["Content-Length"]=n.toString(),i["Accept-Ranges"]="bytes"),new Response(e,{status:200,headers:i})}function h(e,t,n){const r=(0,p.getMimeType)(t),s=(0,f.entryUncompressedSize)(n),i=e.headers.get("range");if(null!==s&&i)return d(null,r,s,"manifest",i);const a={"Content-Type":r,...u("manifest")};return null!==s&&(a["Content-Length"]=s.toString(),a["Accept-Ranges"]="bytes"),new Response(null,{status:200,headers:a})}},262(e,t){t.CONFIG_CACHE_KEY=t.allowedZipUrlsLoaded=t.allowedZipUrls=t.runtimeConfig=t.inFlightZipAssets=t.pendingManifestLoads=t.zipManifests=t.LOCAL_FILE_HEADER_SIG=t.MIME_TYPES=t.ASSET_UPSTREAM_STATUS_HEADER=t.ASSET_ERROR_HEADER=t.ASSET_SOURCE_HEADER=t.ASSET_CACHED_AT_HEADER=t.CONFIG_CACHE_NAME=t.kF=t.o2=void 0,t.setRuntimeConfig=function(e){t.runtimeConfig=e},t.setAllowedZipUrls=function(e){t.allowedZipUrls=e},t.setAllowedZipUrlsLoaded=function(e){t.allowedZipUrlsLoaded=e},t.o2="zip-cache-v1",t.kF=72e5,t.CONFIG_CACHE_NAME="zip-peek-config-v1",t.o2,t.CONFIG_CACHE_NAME,t.ASSET_CACHED_AT_HEADER="X-ZipSW-Cached-At",t.ASSET_SOURCE_HEADER="X-ZipSW-Asset-Source",t.ASSET_ERROR_HEADER="X-ZipSW-Error",t.ASSET_UPSTREAM_STATUS_HEADER="X-ZipSW-Upstream-Status",t.MIME_TYPES={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",json:"application/json",js:"application/javascript",css:"text/css; charset=utf-8",html:"text/html; charset=utf-8",txt:"text/plain; charset=utf-8",mp4:"video/mp4",webm:"video/webm",mp3:"audio/mpeg",wav:"audio/wav",oga:"audio/ogg",ogg:"audio/ogg",xml:"application/xml",wasm:"application/wasm"},t.LOCAL_FILE_HEADER_SIG=67324752,t.zipManifests=new Map,t.pendingManifestLoads=new Map,t.inFlightZipAssets=new Map,t.runtimeConfig={zipAssetCacheName:t.o2,assetCacheTtlMs:t.kF,logPrefix:"[zipSW]",requireExactManifestPath:!1},t.allowedZipUrls=null,t.allowedZipUrlsLoaded=null,t.CONFIG_CACHE_KEY=new URL("__zip_peek_runtime_config__",self.registration.scope).href},266(e,t,n){t.log=function(...e){console.log(s.runtimeConfig.logPrefix,...e)},t.warn=function(...e){console.warn(s.runtimeConfig.logPrefix,...e)},t.error=function(...e){console.error(s.runtimeConfig.logPrefix,r.ZIP_PEEK_ERROR_PREFIX,...e)},t.reportClientError=i,t.installClientErrorReporting=function(){self.addEventListener("error",e=>{i(e.error??e.message,"Service worker uncaught error")}),self.addEventListener("unhandledrejection",e=>{i(e.reason,"Service worker unhandled promise rejection")})};const r=n(553),s=n(262);function i(e,t){const n=(0,r.toZipPeekError)(e);self.clients.matchAll({type:"window",includeUncontrolled:!0}).then(e=>{const s={type:"ZIP_SW_ERROR",error:{message:n.message,stack:n.stack},info:t?(0,r.formatZipPeekError)(t):void 0};for(const t of e)t.postMessage(s)})}},346(e,t,n){t.manifestFilesToMap=a,t.sendManifestToClientId=l,t.ensureManifestAvailable=function(e,t){const n=s.zipManifests.get(e);if(n)return Promise.resolve(n);let c=s.pendingManifestLoads.get(e);return c||(c=(async()=>{const n=await async function(e,t){const n=await o(t);return n?function(e,t){return new Promise(n=>{const r=new MessageChannel,s=setTimeout(()=>{r.port1.close(),n(null)},500);r.port1.onmessage=e=>{clearTimeout(s),r.port1.close();const t=e.data;t?.ok&&Array.isArray(t.files)?n(a(t.files)):n(null)},r.port1.onmessageerror=()=>{clearTimeout(s),r.port1.close(),n(null)};try{e.postMessage({type:"ZIP_SW_MANIFEST_REQUEST",zipUrl:t},[r.port2])}catch(e){clearTimeout(s),r.port1.close(),(0,i.warn)("failed to request manifest from client",e),n(null)}})}(n,e):null}(e,t);if(n)return s.zipManifests.set(e,n),(0,i.log)("restored manifest from client memory",{zipUrl:e,entryCount:n.size}),n;const c=await async function(e){const t=await fetch(e,{headers:{Range:"bytes=-65536"}});if(206!==t.status)return(0,i.error)("range requests not supported for ZIP manifest",{zipUrl:e,status:t.status}),null;const n=await t.arrayBuffer(),s=new DataView(n);let a=-1;for(let e=n.byteLength-22;e>=0;e--)if(101010256===s.getUint32(e,!0)){a=e;break}if(-1===a)return(0,i.error)("EOCD not found in last 64KB of ZIP file",e),null;const o=s.getUint32(a+16,!0),l=s.getUint32(a+12,!0);let c=n,f=-1;const p=t.headers.get("Content-Range");let u=0;if(p){const e=p.match(/\/(\d+)$/);e&&(u=parseInt(e[1],10))}if(u<=0)return(0,i.error)("could not determine ZIP file size from Content-Range header",{zipUrl:e,contentRange:p}),null;const d=u-n.byteLength;if(o>=d)f=o-d;else{const t=await fetch(e,{headers:{Range:`bytes=${o}-${o+l-1}`}});if(206!==t.status)return(0,i.error)("failed to fetch ZIP central directory",{zipUrl:e,status:t.status,cdOffset:o,cdSize:l}),null;c=await t.arrayBuffer(),f=0}return function(e,t,n,s){const a=new DataView(e);let o=t;const l=[];for(;o+46<=e.byteLength&&33639248===a.getUint32(o,!0);){const t=a.getUint16(o+10,!0),n=a.getUint32(o+20,!0),s=a.getUint32(o+24,!0),i=a.getUint16(o+28,!0),c=a.getUint16(o+30,!0),f=a.getUint16(o+32,!0),p=a.getUint32(o+42,!0),u=new TextDecoder;if(o+46+i>e.byteLength)break;const d=new Uint8Array(e,o+46,i),h=u.decode(d),g=(0,r.normalizeZipEntryPath)(h);""!==g&&l.push({filename:g,offset:p,compressedSize:n,uncompressedSize:s,compression:t}),o+=46+i+c+f}if(0===l.length)return(0,i.error)("no files parsed from central directory",s),null;l.sort((e,t)=>e.offset-t.offset);const c=new Map;for(let e=0;e<l.length;e++){const t=l[e],s=(0,r.normalizeZipEntryPath)(t.filename);""!==s&&(c.has(s)&&(0,i.warn)("duplicate manifest key after normalize; overwriting",s),c.set(s,{filename:t.filename,offset:t.offset,compressedSize:t.compressedSize,uncompressedSize:t.uncompressedSize,compression:t.compression,nextOffset:e<l.length-1?l[e+1].offset:n}))}return c.size>0?c:null}(c,f,o,e)}(e);return c&&(s.zipManifests.set(e,c),await l(e,c,t),(0,i.log)("manifest fetched and stored in memory",{zipUrl:e,entryCount:c.size})),c})().finally(()=>{s.pendingManifestLoads.delete(e)}),s.pendingManifestLoads.set(e,c),c)},t.entryUncompressedSize=function(e){return void 0!==e.uncompressedSize?e.uncompressedSize:0===e.compression?e.compressedSize:null},t.resolveManifestEntry=function(e,t,n,s){if(e.has(t))return{key:t,info:e.get(t),matchKind:"exact"};if(s)return null;const i=(0,r.zipBasenameWithoutExtension)(n);if(!i)return null;const a=`${i}/${t}`;return e.has(a)?{key:a,info:e.get(a),matchKind:"zipBasenameFallback"}:null};const r=n(343),s=n(262),i=n(266);function a(e){const t=new Map;for(const n of e){const e=(0,r.normalizeZipEntryPath)(n.filename);""!==e&&(t.has(e)&&(0,i.warn)("duplicate manifest key after normalize; overwriting",e),t.set(e,n))}return t.size>0?t:null}async function o(e){if(!e)return null;const t=await self.clients.get(e);return"window"===t?.type?t:null}async function l(e,t,n){const r=await o(n);if(!r)return;const s=Array.from(t.values());try{r.postMessage({type:"ZIP_SW_MANIFEST_CREATED",zipUrl:e,files:s})}catch(e){(0,i.warn)("failed to send manifest to client",e)}}},993(e,t,n){t.installMessageHandler=function(){self.addEventListener("message",e=>{if(!e.data)return;const{type:t,zipUrl:n,files:u,config:d,allowedZipUrls:h,previousUrl:g,nextUrl:m}=e.data,w=function(e){if(!e||!("id"in e))return;const t=e.id;return"string"==typeof t?t:void 0}(e.source);if("ZIP_SW_CONFIG"===t){const t=(0,i.applyRuntimeConfig)(d).then(()=>p(e,{ok:!0})).catch(t=>p(e,f(t)));return void e.waitUntil(t)}if("ZIP_MANIFEST"===t){if(n&&u){const t=(0,s.normalizeZipUrl)(n),r=(0,c.manifestFilesToMap)(u),i=o.zipManifests.get(t);if(!r)return void(0,l.warn)("rejecting empty manifest; keeping existing",{zipUrl:t,existingSize:i?i.size:0});if(i&&i.size>r.size)return void(0,l.warn)("rejecting smaller manifest; keeping existing",{zipUrl:t,incomingSize:r.size,existingSize:i.size});o.zipManifests.set(t,r),e.waitUntil((0,c.sendManifestToClientId)(t,r,w));const a=Array.from(r.keys()).slice(0,40);(0,l.log)("ZIP_MANIFEST loaded",{zipUrl:t,entryCount:r.size,sampleKeys:a,replacedExistingSize:i?i.size:0})}}else if("CLEAR_ZIP_ASSETS_EXCEPT_ALLOWED"===t&&h){const t=(0,a.clearZipAssetsExceptAllowed)(h).then(()=>p(e,{ok:!0})).catch(t=>p(e,f(t)));e.waitUntil(t)}else if("CLEAR_ALL_ZIP_ASSETS"===t){const t=(0,a.clearAllZipAssets)().then(()=>p(e,{ok:!0})).catch(t=>p(e,f(t)));e.waitUntil(t)}else if("PRELOAD_ZIP_MANIFESTS"===t&&h){const t=async function(e,t){const n=await Promise.all(e.map(async e=>({zipUrl:e,manifest:await(0,c.ensureManifestAvailable)(e,t)}))),s=n.filter(e=>!e.manifest).map(e=>e.zipUrl);if(s.length>0)throw(0,r.createZipPeekError)(`Failed to preload ZIP manifest(s): ${s.join(", ")}`)}(h,w).then(()=>p(e,{ok:!0})).catch(t=>p(e,f(t)));e.waitUntil(t)}else if("RENEW_ZIP_URL"===t&&g&&m){const t=(0,a.renewZipUrl)(g,m).then(()=>p(e,{ok:!0})).catch(t=>p(e,f(t)));e.waitUntil(t)}})};const r=n(553),s=n(343),i=n(314),a=n(800),o=n(262),l=n(266),c=n(346);function f(e){const t=(0,r.toZipPeekError)(e);return{ok:!1,error:t.message,errorStack:t.stack}}function p(e,t){e.ports[0]?.postMessage(t)}},254(e,t,n){t.corsErrorResponse=c,t.getMimeType=f,t.fetchUncompressedZipEntryFromNetwork=async function(e,t,n){const s=n.offset,o=n.nextOffset-1;(0,a.log)("fetching zip chunk from",{zipUrl:e,rangeStart:s,rangeEnd:o});const l=await fetch(e,{headers:{Range:`bytes=${s}-${o}`}});if(206!==l.status){const n=l.status>=400?l.status:502;return{ok:!1,response:c(`ZIP entry fetch for "${t}" expected HTTP 206 Partial Content from ${e}, got ${l.status}`,n,{upstreamStatus:l.status})}}if(!l.body)return{ok:!1,response:c(`ZIP entry fetch for "${t}" in ${e} returned no response body`,502)};const u=l.body.getReader();let d,h;try{({headerAndPayload:d,dataStart:h}=await async function(e){let t=new Uint8Array(0);for(;t.byteLength<30;){const{done:n,value:r}=await e.read();if(n)throw new Error("ZIP entry ended before its local file header was complete");t=p(t,r)}const n=new DataView(t.buffer,t.byteOffset,t.byteLength);if(n.getUint32(0,!0)!==i.LOCAL_FILE_HEADER_SIG)throw new Error("Invalid local file header (expected ZIP signature 0x04034b50)");const r=30+n.getUint16(26,!0)+n.getUint16(28,!0);for(;t.byteLength<r;){const{done:n,value:r}=await e.read();if(n)throw new Error("ZIP entry ended before its local file header fields were complete");t=p(t,r)}return{headerAndPayload:t,dataStart:r}}(u))}catch(n){return await u.cancel(n),{ok:!1,response:c(`Invalid local file header for "${t}" in ${e}: ${n instanceof Error?n.message:String(n)}`,500)}}const g=function(e,t,n){let r=t,s=0;return new ReadableStream({async pull(t){if(s>=n)return await e.cancel(),void t.close();let i;if(r.byteLength>0)i=r,r=new Uint8Array(0);else{const{done:r,value:a}=await e.read();if(r)return void t.error(new Error(`ZIP entry ended after ${s} of ${n} compressed bytes`));i=a}const a=n-s,o=i.byteLength>a?i.subarray(0,a):i;s+=o.byteLength,t.enqueue(o),s>=n&&(await e.cancel(),t.close())},cancel:t=>e.cancel(t)})}(u,d.subarray(h),n.compressedSize),m=n.uncompressedSize??(0===n.compression?n.compressedSize:null);let w;if(8===n.compression)w=function(e,t){let n,s=0;const i=new TransformStream({start(e){n=new r.Inflate(t=>{s+=t.byteLength,e.enqueue(t)})},transform(e){n.push(e)},flush(){if(n.push(new Uint8Array(0),!0),null!==t&&s!==t)throw new Error(`Inflated ZIP entry size mismatch: expected ${t}, received ${s}`)}});return e.pipeThrough(i)}(g,m);else{if(0!==n.compression)return await u.cancel(),{ok:!1,response:c(`Unsupported compression method ${n.compression} for "${t}" in ${e} (only stored/0 and DEFLATE/8 are supported)`,500)};w=g}return{ok:!0,stream:w,contentLength:m,contentType:f(t)}};const r=n(612),s=n(553),i=n(262),a=n(266);function o(e){return e.replace(/[\r\n]+/g," ").trim()}function l(e,t){const n=[i.ASSET_ERROR_HEADER],r={"Access-Control-Allow-Origin":"*",[i.ASSET_ERROR_HEADER]:o(e)},s=t?.upstreamStatus;return void 0!==s&&(r[i.ASSET_UPSTREAM_STATUS_HEADER]=String(s),n.push(i.ASSET_UPSTREAM_STATUS_HEADER)),r["Access-Control-Expose-Headers"]=n.join(", "),r}function c(e,t,n){const r=(0,s.formatZipPeekError)(e);return new Response(r,{status:t,headers:l(r,n)})}function f(e){const t=e.split(".").pop()?.toLowerCase();return t?i.MIME_TYPES[t]??"application/octet-stream":"application/octet-stream"}function p(e,t){const n=new Uint8Array(e.byteLength+t.byteLength);return n.set(e),n.set(t,e.byteLength),n}},343(e,t){function n(e){try{return decodeURIComponent(e)}catch{return e}}t.normalizeZipUrl=function(e,t={}){const{stripCacheBuster:n=!0,stripHash:r=!0}=t,s=e=>r?e.split("#")[0]:e;if(!n)return s(e);const i=e.indexOf("?");if(-1===i)return s(e);const a=e.indexOf("#",i),o=e.substring(0,i),l=-1===a?e.substring(i+1):e.substring(i+1,a),c=r||-1===a?"":e.substring(a),f=l.split("&").filter(e=>{const t=e.indexOf("=");return"t"!==(-1===t?e:e.substring(0,t))});return 0===f.length?o+c:o+"?"+f.join("&")+c},t.zipBasenameWithoutExtension=function(e){try{const t=new URL(e,"http://local").pathname.split("/").pop()??"";return t.endsWith(".zip")?t.slice(0,-4):t}catch{const t=e.split("?")[0].split("#")[0].split("/").pop()??"";return t.endsWith(".zip")?t.slice(0,-4):t}},t.normalizeZipEntryPath=function(e){let t=e.replace(/\\/g,"/");for(;t.startsWith("/");)t=t.slice(1);return t},t.parseZipAssetRequest=function(e){const t=/\.zip([/?])/.exec(e);if(!t)return null;const r=t.index+4,s=t[1],i=e.substring(0,r);if("/"===s){const t=e.substring(r+1),s=t.indexOf("?"),a=-1===s?t:t.substring(0,s);return""===a?null:{zipUrl:i,internalPath:n(a)}}const a=e.substring(r),o=a.indexOf("/");if(-1===o)return null;const l=a.substring(0,o),c=a.substring(o+1),f=c.indexOf("?"),p=-1===f?c:c.substring(0,f);return""===p?null:{zipUrl:i+l,internalPath:n(p)}},t.canonicalZipAssetRequestUrl=function(e,t){return e+"/"+encodeURIComponent(t)}},612(e,t){var n=Uint8Array,r=Uint16Array,s=Int32Array,i=new n([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),a=new n([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),o=new n([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),l=function(e,t){for(var n=new r(31),i=0;i<31;++i)n[i]=t+=1<<e[i-1];var a=new s(n[30]);for(i=1;i<30;++i)for(var o=n[i];o<n[i+1];++o)a[o]=o-n[i]<<5|i;return{b:n,r:a}},c=l(i,2),f=c.b,p=c.r;f[28]=258,p[258]=28;for(var u=l(a,0),d=u.b,h=(u.r,new r(32768)),g=0;g<32768;++g){var m=(43690&g)>>1|(21845&g)<<1;m=(61680&(m=(52428&m)>>2|(13107&m)<<2))>>4|(3855&m)<<4,h[g]=((65280&m)>>8|(255&m)<<8)>>1}var w=function(e,t,n){for(var s=e.length,i=0,a=new r(t);i<s;++i)e[i]&&++a[e[i]-1];var o,l=new r(t);for(i=1;i<t;++i)l[i]=l[i-1]+a[i-1]<<1;if(n){o=new r(1<<t);var c=15-t;for(i=0;i<s;++i)if(e[i])for(var f=i<<4|e[i],p=t-e[i],u=l[e[i]-1]++<<p,d=u|(1<<p)-1;u<=d;++u)o[h[u]>>c]=f}else for(o=new r(s),i=0;i<s;++i)e[i]&&(o[i]=h[l[e[i]-1]++]>>15-e[i]);return o},E=new n(288);for(g=0;g<144;++g)E[g]=8;for(g=144;g<256;++g)E[g]=9;for(g=256;g<280;++g)E[g]=7;for(g=280;g<288;++g)E[g]=8;var A=new n(32);for(g=0;g<32;++g)A[g]=5;var y=w(E,9,1),U=w(A,5,1),C=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},Z=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(7&t)&n},R=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},S=function(e){return(e+7)/8|0},z=function(e,t,r){return(null==t||t<0)&&(t=0),(null==r||r>e.length)&&(r=e.length),new n(e.subarray(t,r))},_=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],v=function(e,t,n){var r=new Error(t||_[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,v),!n)throw r;return r},b=function(e,t,r,s){var l=e.length,c=s?s.length:0;if(!l||t.f&&!t.l)return r||new n(0);var p=!r,u=p||2!=t.i,h=t.i;p&&(r=new n(3*l));var g=function(e){var t=r.length;if(e>t){var s=new n(Math.max(2*t,e));s.set(r),r=s}},m=t.f||0,E=t.p||0,A=t.b||0,_=t.l,b=t.d,P=t.m,M=t.n,I=8*l;do{if(!_){m=Z(e,E,1);var T=Z(e,E+1,3);if(E+=3,!T){var L=e[(j=S(E)+4)-4]|e[j-3]<<8,k=j+L;if(k>l){h&&v(0);break}u&&g(A+L),r.set(e.subarray(j,k),A),t.b=A+=L,t.p=E=8*k,t.f=m;continue}if(1==T)_=y,b=U,P=9,M=5;else if(2==T){var F=Z(e,E,31)+257,x=Z(e,E+10,15)+4,O=F+Z(e,E+5,31)+1;E+=14;for(var N=new n(O),H=new n(19),$=0;$<x;++$)H[o[$]]=Z(e,E+3*$,7);E+=3*x;var D=C(H),q=(1<<D)-1,W=w(H,D,1);for($=0;$<O;){var j,K=W[Z(e,E,q)];if(E+=15&K,(j=K>>4)<16)N[$++]=j;else{var G=0,X=0;for(16==j?(X=3+Z(e,E,3),E+=2,G=N[$-1]):17==j?(X=3+Z(e,E,7),E+=3):18==j&&(X=11+Z(e,E,127),E+=7);X--;)N[$++]=G}}var B=N.subarray(0,F),Y=N.subarray(F);P=C(B),M=C(Y),_=w(B,P,1),b=w(Y,M,1)}else v(1);if(E>I){h&&v(0);break}}u&&g(A+131072);for(var V=(1<<P)-1,J=(1<<M)-1,Q=E;;Q=E){var ee=(G=_[R(e,E)&V])>>4;if((E+=15&G)>I){h&&v(0);break}if(G||v(2),ee<256)r[A++]=ee;else{if(256==ee){Q=E,_=null;break}var te=ee-254;if(ee>264){var ne=i[$=ee-257];te=Z(e,E,(1<<ne)-1)+f[$],E+=ne}var re=b[R(e,E)&J],se=re>>4;if(re||v(3),E+=15&re,Y=d[se],se>3&&(ne=a[se],Y+=R(e,E)&(1<<ne)-1,E+=ne),E>I){h&&v(0);break}u&&g(A+131072);var ie=A+te;if(A<Y){var ae=c-Y,oe=Math.min(Y,ie);for(ae+A<0&&v(3);A<oe;++A)r[A]=s[ae+A]}for(;A<ie;++A)r[A]=r[A-Y]}}t.l=_,t.p=Q,t.b=A,t.f=m,_&&(m=1,t.m=P,t.d=b,t.n=M)}while(!m);return A!=r.length&&p?z(r,0,A):r.subarray(0,A)},P=new n(0);var M=function(){function e(e,t){"function"==typeof e&&(t=e,e={}),this.ondata=t;var r=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:r?r.length:0},this.o=new n(32768),this.p=new n(0),r&&this.o.set(r)}return e.prototype.e=function(e){if(this.ondata||v(5),this.d&&v(4),this.p.length){if(e.length){var t=new n(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,n=b(this.p,this.s,this.o);this.ondata(z(n,t,this.s.b),this.d),this.o=z(n,this.s.b-32768),this.s.b=this.o.length,this.p=z(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}();t.Inflate=M;var I="undefined"!=typeof TextDecoder&&new TextDecoder;try{I.decode(P,{stream:!0})}catch(e){}"function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout&&setTimeout}};const t={};function n(r){const s=t[r];if(void 0!==s)return s.exports;const i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}(()=>{const e=n(266),t=n(982),r=n(993);self.addEventListener("install",()=>{self.skipWaiting()}),self.addEventListener("activate",e=>{e.waitUntil(self.clients.claim())}),(0,e.installClientErrorReporting)(),(0,r.installMessageHandler)(),(0,t.installFetchHandler)()})()})();
|
|
1
|
+
(()=>{"use strict";var e={553(e,t){function n(e){const n=e.trim();return n.startsWith(t.ZIP_PEEK_ERROR_PREFIX)?n:`${t.ZIP_PEEK_ERROR_PREFIX} ${n}`}t.ZIP_PEEK_ERROR_PREFIX=void 0,t.formatZipPeekError=n,t.createZipPeekError=function(e){return new Error(n(e))},t.toZipPeekError=function(e){const s=e instanceof Error?e:new Error(String(e));return s.message.startsWith(t.ZIP_PEEK_ERROR_PREFIX)||(s.message=n(s.message)),s},t.errorMessage=function(e){return e instanceof Error?e.message:String(e)},t.ZIP_PEEK_ERROR_PREFIX="[zip-peek-error]"},314(e,t,n){t.clearAllClientClaims=void 0,t.persistAllowListState=o,t.ensureAllowedZipUrlsLoaded=async function(){if(r.allowedZipUrlsLoaded)return r.allowedZipUrlsLoaded;const e=(async()=>{try{const e=await caches.open(r.CONFIG_CACHE_NAME),t=await e.match(r.CONFIG_CACHE_KEY);if(!t)return;const n=await t.json();if(Array.isArray(n.allowedZipUrls)){const e=new Set(n.allowedZipUrls.filter(e=>"string"==typeof e).map(e=>(0,s.normalizeZipUrl)(e)));(0,r.setAllowListRestricted)(!1!==n.restricted),(0,r.setPersistedAllowUnion)(e)}else(0,r.setAllowListRestricted)(!1),(0,r.setPersistedAllowUnion)(null)}catch(e){(0,i.warn)("failed to load runtime config",e)}})();return(0,r.setAllowedZipUrlsLoaded)(e),e},t.clearZipAssetsExceptLiveClaims=async function(e){if(await l(),!r.allowListRestricted)return;if(await async function(){const e=await self.clients.matchAll({type:"window",includeUncontrolled:!0});await Promise.all(e.map(e=>async function(e){await new Promise(t=>{const n=new MessageChannel,o=setTimeout(()=>{n.port1.onmessage=null,n.port1.close(),t()},400);n.port1.onmessage=i=>{clearTimeout(o);const a=i.data;a&&"allowedZipUrls"in a&&(Array.isArray(a.allowedZipUrls)?(0,r.setClientAllowedZipUrls)(e.id,a.allowedZipUrls.map(e=>(0,s.normalizeZipUrl)(e))):null===a.allowedZipUrls&&r.clientAllowedZipUrls.delete(e.id)),n.port1.onmessage=null,n.port1.close(),t()};try{e.postMessage({type:"ZIP_SW_CLAIM_REQUEST"},[n.port2])}catch(e){clearTimeout(o),n.port1.close(),(0,i.warn)("failed to post ZIP_SW_CLAIM_REQUEST",e),t()}})}(e))),r.clientAllowedZipUrls.size>0?((0,r.setAllowListRestricted)(!0),await o()):e.length>0&&((0,r.setAllowListRestricted)(!1),(0,r.setPersistedAllowUnion)(null),await a(null,!1))}(),await l(),!r.allowListRestricted)return;const t=(0,r.getClaimsUnion)();await e(Array.from(t)),await o()},t.applyRuntimeConfig=async function(e,t){if(!e)return;let n=Object.assign({},r.runtimeConfig),i=!1;if("string"==typeof e.zipAssetCacheName&&e.zipAssetCacheName.trim()&&(n.zipAssetCacheName=e.zipAssetCacheName,i=!0),"number"==typeof e.assetCacheTtlMs&&Number.isFinite(e.assetCacheTtlMs)&&(n.assetCacheTtlMs=e.assetCacheTtlMs,i=!0),"string"==typeof e.logPrefix&&e.logPrefix.trim()&&(n.logPrefix=e.logPrefix,i=!0),"boolean"==typeof e.requireExactManifestPath&&(n.requireExactManifestPath=e.requireExactManifestPath,i=!0),i&&(0,r.setRuntimeConfig)(n),"allowedZipUrls"in e){const n=Array.isArray(e.allowedZipUrls)?e.allowedZipUrls.map(e=>(0,s.normalizeZipUrl)(e)):null;if(!t)return null===n?((0,r.clearAllClientClaims)(),(0,r.setAllowedZipUrlsLoaded)(Promise.resolve()),void await a(null,!1)):((0,r.setAllowListRestricted)(!0),(0,r.setPersistedAllowUnion)(new Set(n)),(0,r.setAllowedZipUrlsLoaded)(Promise.resolve()),void await a(n,!0));if(null===n){if(r.clientAllowedZipUrls.delete(t),await l(),0===r.clientAllowedZipUrls.size)return(0,r.setAllowListRestricted)(!1),(0,r.setPersistedAllowUnion)(null),(0,r.setAllowedZipUrlsLoaded)(Promise.resolve()),void await a(null,!1)}else(0,r.setClientAllowedZipUrls)(t,n);await l(),(0,r.setAllowedZipUrlsLoaded)(Promise.resolve()),await o()}},t.renewAllowedZipUrlClaims=function(e,t){for(const n of r.clientAllowedZipUrls.values())n.has(e)&&(n.delete(e),n.add(t));if(null===r.persistedAllowUnion||void 0===r.persistedAllowUnion?void 0:r.persistedAllowUnion.has(e)){const n=new Set(r.persistedAllowUnion);n.delete(e),n.add(t),(0,r.setPersistedAllowUnion)(n)}},t.isZipUrlAllowed=function(e){const t=(0,r.getAllowedZipUrlsUnion)();return null===t||t.has(e)};const s=n(343),r=n(262);Object.defineProperty(t,"clearAllClientClaims",{enumerable:!0,get:function(){return r.clearAllClientClaims}});const i=n(266);async function o(){const e=r.allowListRestricted?Array.from((0,r.getClaimsUnion)()):null;r.allowListRestricted?(0,r.setPersistedAllowUnion)(new Set(null!=e?e:[])):(0,r.setPersistedAllowUnion)(null),await a(e,r.allowListRestricted)}async function a(e,t=null!==e){try{const n=await caches.open(r.CONFIG_CACHE_NAME);await n.put(new Request(r.CONFIG_CACHE_KEY),new Response(JSON.stringify({allowedZipUrls:e,restricted:t}),{headers:{"Content-Type":"application/json"}}))}catch(e){(0,i.warn)("failed to persist runtime config",e)}}async function l(){const e=await self.clients.matchAll({type:"window",includeUncontrolled:!0}),t=new Set(e.map(e=>e.id));for(const e of[...r.clientAllowedZipUrls.keys()])t.has(e)||r.clientAllowedZipUrls.delete(e);0===r.clientAllowedZipUrls.size&&r.allowListRestricted?((0,r.setPersistedAllowUnion)(null),await a([],!0)):r.clientAllowedZipUrls.size>0&&await o()}},800(e,t,n){t.canonicalAssetRequest=function(e,t){return new Request((0,r.canonicalZipAssetRequestUrl)(e,t),{method:"GET"})},t.clearAllZipAssets=async function(){const e=await caches.open(a.runtimeConfig.zipAssetCacheName),t=await e.keys();await Promise.all(t.map(t=>e.delete(t))),await caches.delete(a.CONFIG_CACHE_NAME),a.zipManifests.clear(),a.pendingManifestLoads.clear(),a.inFlightZipAssets.clear(),(0,i.clearAllClientClaims)(),(0,a.setAllowedZipUrlsLoaded)(Promise.resolve())},t.clearZipAssetsExceptAllowed=async function(e){try{const t=new Set(e),n=await caches.open(a.runtimeConfig.zipAssetCacheName),s=await n.keys();for(const e of s){const s=e.url,i=(0,r.parseZipAssetRequest)(s);i&&!t.has(i.zipUrl)&&await n.delete(e)}for(const e of a.zipManifests.keys())t.has(e)||a.zipManifests.delete(e)}catch(e){throw(0,s.createZipPeekError)(`Failed to clear zip assets except allowed URLs: ${(0,s.errorMessage)(e)}`)}},t.putCachedFullAssetIfAbsent=async function(e,t){var n;try{const s=await caches.open(a.runtimeConfig.zipAssetCacheName),r=await s.match(e);if(r&&!c(r))return void await(null===(n=t.body)||void 0===n?void 0:n.cancel());const i=new Headers(t.headers);i.set(a.ASSET_CACHED_AT_HEADER,String(Date.now())),i.set("Access-Control-Allow-Origin","*"),await s.put(e,new Response(t.body,{status:t.status,statusText:t.statusText,headers:i}))}catch(e){t.body&&!t.body.locked&&await t.body.cancel(e),(0,l.warn)("asset cache put failed",e)}},t.readCachedZipAssetIfFresh=async function(e){let t=null,n="network";try{const s=await caches.open(a.runtimeConfig.zipAssetCacheName),r=await s.match(e);if(r)if(c(r))try{await s.delete(e)}catch(e){(0,l.warn)("asset cache delete expired failed",e)}else t=r,n="cache-api"}catch(e){(0,l.warn)("asset cache read failed",e)}return{response:t,assetSource:n}},t.renewZipUrl=async function(e,t){const n=(0,r.normalizeZipUrl)(e),l=(0,r.normalizeZipUrl)(t);if(n===l)return;a.allowListRestricted&&((0,i.renewAllowedZipUrlClaims)(n,l),(0,a.setAllowedZipUrlsLoaded)(Promise.resolve()),await(0,i.persistAllowListState)());const c=a.zipManifests.get(n);c&&(a.zipManifests.set(l,c),a.zipManifests.delete(n));const f=a.pendingManifestLoads.get(n);f&&(a.pendingManifestLoads.set(l,f),a.pendingManifestLoads.delete(n)),(0,o.remapInFlightZipAssetsForRenewal)(n,l);try{const e=await caches.open(a.runtimeConfig.zipAssetCacheName),t=await e.keys();for(const s of t){const t=s.url,i=(0,r.parseZipAssetRequest)(t);i&&(0,r.normalizeZipUrl)(i.zipUrl)===n&&await e.delete(s)}}catch(e){throw(0,s.createZipPeekError)(`Failed to clear cached assets for renewed ZIP URL: ${(0,s.errorMessage)(e)}`)}};const s=n(553),r=n(343),i=n(314),o=n(30),a=n(262),l=n(266);function c(e){const t=e.headers.get(a.ASSET_CACHED_AT_HEADER);if(!t)return!0;const n=parseInt(t,10);return!Number.isFinite(n)||Date.now()-n>a.runtimeConfig.assetCacheTtlMs}},30(e,t,n){t.getOrStartInFlightAsset=function(e,t){const n=e.url,s=r.inFlightZipAssets.get(n);if(s)return s;let i,o;const a=new Promise((e,t)=>{i=e,o=t}),l={resultPromise:t(),cacheFillPromise:a,leaderClaimed:!1,resolveCacheFill:i,rejectCacheFill:o};return a.finally(()=>{r.inFlightZipAssets.delete(n)}),r.inFlightZipAssets.set(n,l),l},t.completeInFlightAssetLoad=function(e,t){const n=r.inFlightZipAssets.get(e);n&&(void 0!==t?n.rejectCacheFill(t):n.resolveCacheFill())},t.remapInFlightZipAssetsForRenewal=function(e,t){const n=(0,s.normalizeZipUrl)(e),i=(0,s.normalizeZipUrl)(t);for(const[e,t]of[...r.inFlightZipAssets]){const o=(0,s.parseZipAssetRequest)(e);if(o&&(0,s.normalizeZipUrl)(o.zipUrl)===n){const n=(0,s.canonicalZipAssetRequestUrl)(i,o.internalPath);r.inFlightZipAssets.delete(e),r.inFlightZipAssets.set(n,t)}}};const s=n(343),r=n(262)},982(e,t,n){t.installFetchHandler=function(){self.addEventListener("fetch",e=>{const t=e.request.method;if("GET"!==t&&"HEAD"!==t)return;if(!(0,r.parseZipAssetRequest)(e.request.url))return;const n=async function(e,t){var n;const p="HEAD"===e.method,h=(0,r.parseZipAssetRequest)(e.url),g=(0,r.normalizeZipUrl)(h.zipUrl),m=h.internalPath,A=(0,r.normalizeZipEntryPath)(m);try{if(await(0,i.ensureAllowedZipUrlsLoaded)(),!(0,i.isZipUrlAllowed)(g))return(0,c.warn)("zip URL not allowed",{requestedZipUrl:g}),{response:(0,u.corsErrorResponse)(`ZIP URL not allowed (not in allowedZipUrls): ${g}`,403)};let r=l.zipManifests.get(g);if(r||(r=null!==(n=await(0,f.ensureManifestAvailable)(g,t))&&void 0!==n?n:void 0),!r){const e=Array.from(l.zipManifests.keys());return(0,c.warn)("manifest missing for zipUrl",{requestedZipUrl:g,knownZipUrls:e}),{response:(0,u.corsErrorResponse)(`ZIP manifest not loaded for ${g}. Ensure the ZIP is reachable and supports byte-range requests.`,404)}}const h=(0,f.resolveManifestEntry)(r,A,g,l.runtimeConfig.requireExactManifestPath);if(!h){const e=Array.from(r.keys()).slice(0,50);return(0,c.warn)("file not in manifest",{zipUrl:g,internalPathRaw:m,internalPathNormalized:A,requireExactManifestPath:l.runtimeConfig.requireExactManifestPath,manifestSize:r.size,sampleKeys:e}),{response:(0,u.corsErrorResponse)(`File "${m}" not found in ZIP manifest for ${g}`,404)}}const{key:E,info:y,matchKind:U}=h;if("zipBasenameFallback"===U&&((0,c.log)("resolved via zip-basename folder fallback",{requested:A,manifestKey:E}),(0,c.reportClientError)(new Error((0,s.formatZipPeekError)("Exact manifest path not found; resolved via zip-basename folder fallback")),`Exact manifest key "${A}" not found in ${g}; resolved using "${E}"`)),p)return{response:w(e,E,y)};const R=(0,o.canonicalAssetRequest)(g,E),C=await(0,o.readCachedZipAssetIfFresh)(R),Z=(0,f.entryUncompressedSize)(y),v=(0,u.getMimeType)(E);if(C.response)return{response:d(C.response.body,v,Z,C.assetSource,e.headers.get("range"))};const S=(0,a.getOrStartInFlightAsset)(R,()=>(0,u.fetchUncompressedZipEntryFromNetwork)(g,E,y)),z=await S.resultPromise;if(!z.ok)return(0,a.completeInFlightAssetLoad)(R.url),{response:z.response};const P=!S.leaderClaimed&&(S.leaderClaimed=!0),_=8===y.compression?null:e.headers.get("range");if(!P){await S.cacheFillPromise;const t=await(0,o.readCachedZipAssetIfFresh)(R);return t.response?{response:d(t.response.body,v,Z,t.assetSource,e.headers.get("range"))}:{response:(0,u.corsErrorResponse)(`Failed to serve "${E}" from ${g}: asset cache was not ready after in-flight load`,500)}}const[b,L]=z.stream.tee(),M={"Content-Type":z.contentType};null!==z.contentLength&&(M["Content-Length"]=String(z.contentLength));const I=R.url,T=(0,o.putCachedFullAssetIfAbsent)(R,new Response(L,{status:200,headers:M})).then(()=>{(0,a.completeInFlightAssetLoad)(I)}).catch(e=>{throw(0,a.completeInFlightAssetLoad)(I,e),e});return{response:d(b,z.contentType,z.contentLength,"network",_),background:T}}catch(e){return(0,c.error)("fetch handler failed",{zipUrl:g,internalPath:m,message:(0,s.errorMessage)(e)}),{response:(0,u.corsErrorResponse)(`Failed to serve "${m}" from ${g}: ${(0,s.errorMessage)(e)}`,500)}}}(e.request,e.clientId||void 0);e.respondWith(n.then(({response:e})=>e)),e.waitUntil(n.then(({background:e})=>e).catch(e=>{(0,c.warn)("background asset cache failed",(0,s.errorMessage)(e))}))})};const s=n(553),r=n(343),i=n(314),o=n(800),a=n(30),l=n(262),c=n(266),f=n(346),u=n(254);function p(e){return{"Access-Control-Allow-Origin":"*","Access-Control-Expose-Headers":l.ASSET_SOURCE_HEADER,[l.ASSET_SOURCE_HEADER]:e}}function d(e,t,n,s,r){if(r){if(null===n)return null==e||e.cancel(),new Response(null,{status:416,headers:p(s)});const i=r.replace(/^bytes=/,"");if(i.includes(","))return null==e||e.cancel(),new Response(null,{status:416,headers:Object.assign({"Content-Range":`bytes */${n}`},p(s))});const[o,a]=i.split("-"),l=""!==o?parseInt(o,10):NaN,c=""!==a?parseInt(a,10):n-1;if(isNaN(l)||isNaN(c)||l<0||c<l||l>=n)return null==e||e.cancel(),new Response(null,{status:416,headers:Object.assign({"Content-Range":`bytes */${n}`},p(s))});const f=Math.min(c,n-1),u=f-l+1,d=null===e?null:function(e,t,n){const s=e.getReader();let r=0,i=!1;return new ReadableStream({async pull(e){for(;!i;){const{done:o,value:a}=await s.read();if(o)return i=!0,void e.close();const l=a,c=r,f=r+l.byteLength-1;if(r+=l.byteLength,f<t)continue;if(c>n)return i=!0,void e.close();const u=Math.max(0,t-c),p=Math.min(l.byteLength,n-c+1);if(p>u&&e.enqueue(l.subarray(u,p)),f>=n)return i=!0,void e.close()}},cancel:e=>s.cancel(e)})}(e,l,f);return new Response(d,{status:206,headers:Object.assign({"Content-Type":t,"Content-Range":`bytes ${l}-${f}/${n}`,"Content-Length":u.toString(),"Accept-Ranges":"bytes"},p(s))})}const i=Object.assign({"Content-Type":t},p(s));return null!==n&&(i["Content-Length"]=n.toString(),i["Accept-Ranges"]="bytes"),new Response(e,{status:200,headers:i})}function w(e,t,n){const s=(0,u.getMimeType)(t),r=(0,f.entryUncompressedSize)(n),i=e.headers.get("range");if(null!==r&&i)return d(null,s,r,"manifest",i);const o=Object.assign({"Content-Type":s},p("manifest"));return null!==r&&(o["Content-Length"]=r.toString(),o["Accept-Ranges"]="bytes"),new Response(null,{status:200,headers:o})}},262(e,t){function n(){const e=new Set;for(const n of t.clientAllowedZipUrls.values())for(const t of n)e.add(t);return e}t.CONFIG_CACHE_KEY=t.allowedZipUrlsLoaded=t.persistedAllowUnion=t.allowListRestricted=t.clientAllowedZipUrls=t.runtimeConfig=t.inFlightZipAssets=t.pendingManifestLoads=t.zipManifests=t.LOCAL_FILE_HEADER_SIG=t.MIME_TYPES=t.ASSET_UPSTREAM_STATUS_HEADER=t.ASSET_ERROR_HEADER=t.ASSET_SOURCE_HEADER=t.ASSET_CACHED_AT_HEADER=t.CONFIG_CACHE_NAME=t.kF=t.o2=void 0,t.setRuntimeConfig=function(e){t.runtimeConfig=e},t.setAllowListRestricted=function(e){t.allowListRestricted=e},t.setPersistedAllowUnion=function(e){t.persistedAllowUnion=e},t.setAllowedZipUrlsLoaded=function(e){t.allowedZipUrlsLoaded=e},t.getClaimsUnion=n,t.getAllowedZipUrlsUnion=function(){return t.allowListRestricted?t.clientAllowedZipUrls.size>0?n():null!==t.persistedAllowUnion&&void 0!==t.persistedAllowUnion?t.persistedAllowUnion:new Set:null},t.setClientAllowedZipUrls=function(e,n){null!==n?(t.allowListRestricted=!0,t.clientAllowedZipUrls.set(e,new Set(n))):t.clientAllowedZipUrls.delete(e)},t.clearAllClientClaims=function(){t.clientAllowedZipUrls.clear(),t.allowListRestricted=!1,t.persistedAllowUnion=null},t.o2="zip-cache-v1",t.kF=72e5,t.CONFIG_CACHE_NAME="zip-peek-config-v1",t.o2,t.CONFIG_CACHE_NAME,t.ASSET_CACHED_AT_HEADER="X-ZipSW-Cached-At",t.ASSET_SOURCE_HEADER="X-ZipSW-Asset-Source",t.ASSET_ERROR_HEADER="X-ZipSW-Error",t.ASSET_UPSTREAM_STATUS_HEADER="X-ZipSW-Upstream-Status",t.MIME_TYPES={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",json:"application/json",js:"application/javascript",css:"text/css; charset=utf-8",html:"text/html; charset=utf-8",txt:"text/plain; charset=utf-8",mp4:"video/mp4",webm:"video/webm",mp3:"audio/mpeg",wav:"audio/wav",oga:"audio/ogg",ogg:"audio/ogg",xml:"application/xml",wasm:"application/wasm"},t.LOCAL_FILE_HEADER_SIG=67324752,t.zipManifests=new Map,t.pendingManifestLoads=new Map,t.inFlightZipAssets=new Map,t.runtimeConfig={zipAssetCacheName:t.o2,assetCacheTtlMs:t.kF,logPrefix:"[zipSW]",requireExactManifestPath:!1},t.clientAllowedZipUrls=new Map,t.allowListRestricted=!1,t.persistedAllowUnion=null,t.allowedZipUrlsLoaded=null,t.CONFIG_CACHE_KEY=new URL("__zip_peek_runtime_config__",self.registration.scope).href},266(e,t,n){t.log=function(...e){console.log(r.runtimeConfig.logPrefix,...e)},t.warn=function(...e){console.warn(r.runtimeConfig.logPrefix,...e)},t.error=function(...e){console.error(r.runtimeConfig.logPrefix,s.ZIP_PEEK_ERROR_PREFIX,...e)},t.reportClientError=i,t.installClientErrorReporting=function(){self.addEventListener("error",e=>{var t;i(null!==(t=e.error)&&void 0!==t?t:e.message,"Service worker uncaught error")}),self.addEventListener("unhandledrejection",e=>{i(e.reason,"Service worker unhandled promise rejection")})};const s=n(553),r=n(262);function i(e,t){const n=(0,s.toZipPeekError)(e);self.clients.matchAll({type:"window",includeUncontrolled:!0}).then(e=>{const r={type:"ZIP_SW_ERROR",error:{message:n.message,stack:n.stack},info:t?(0,s.formatZipPeekError)(t):void 0};for(const t of e)t.postMessage(r)})}},346(e,t,n){t.manifestFilesToMap=o,t.sendManifestToClientId=l,t.ensureManifestAvailable=function(e,t){const n=r.zipManifests.get(e);if(n)return Promise.resolve(n);let c=r.pendingManifestLoads.get(e);return c||(c=(async()=>{const n=await async function(e,t){const n=await a(t);return n?function(e,t){return new Promise(n=>{const s=new MessageChannel,r=setTimeout(()=>{s.port1.close(),n(null)},500);s.port1.onmessage=e=>{clearTimeout(r),s.port1.close();const t=e.data;(null==t?void 0:t.ok)&&Array.isArray(t.files)?n(o(t.files)):n(null)},s.port1.onmessageerror=()=>{clearTimeout(r),s.port1.close(),n(null)};try{e.postMessage({type:"ZIP_SW_MANIFEST_REQUEST",zipUrl:t},[s.port2])}catch(e){clearTimeout(r),s.port1.close(),(0,i.warn)("failed to request manifest from client",e),n(null)}})}(n,e):null}(e,t);if(n)return r.zipManifests.set(e,n),(0,i.log)("restored manifest from client memory",{zipUrl:e,entryCount:n.size}),n;const c=await async function(e){const t=await fetch(e,{headers:{Range:"bytes=-65536"}});if(206!==t.status)return(0,i.error)("range requests not supported for ZIP manifest",{zipUrl:e,status:t.status}),null;const n=await t.arrayBuffer(),r=new DataView(n);let o=-1;for(let e=n.byteLength-22;e>=0;e--)if(101010256===r.getUint32(e,!0)){o=e;break}if(-1===o)return(0,i.error)("EOCD not found in last 64KB of ZIP file",e),null;const a=r.getUint32(o+16,!0),l=r.getUint32(o+12,!0);let c=n,f=-1;const u=t.headers.get("Content-Range");let p=0;if(u){const e=u.match(/\/(\d+)$/);e&&(p=parseInt(e[1],10))}if(p<=0)return(0,i.error)("could not determine ZIP file size from Content-Range header",{zipUrl:e,contentRange:u}),null;const d=p-n.byteLength;if(a>=d)f=a-d;else{const t=await fetch(e,{headers:{Range:`bytes=${a}-${a+l-1}`}});if(206!==t.status)return(0,i.error)("failed to fetch ZIP central directory",{zipUrl:e,status:t.status,cdOffset:a,cdSize:l}),null;c=await t.arrayBuffer(),f=0}return function(e,t,n,r){const o=new DataView(e);let a=t;const l=[];for(;a+46<=e.byteLength&&33639248===o.getUint32(a,!0);){const t=o.getUint16(a+10,!0),n=o.getUint32(a+20,!0),r=o.getUint32(a+24,!0),i=o.getUint16(a+28,!0),c=o.getUint16(a+30,!0),f=o.getUint16(a+32,!0),u=o.getUint32(a+42,!0),p=new TextDecoder;if(a+46+i>e.byteLength)break;const d=new Uint8Array(e,a+46,i),w=p.decode(d),h=(0,s.normalizeZipEntryPath)(w);""!==h&&l.push({filename:h,offset:u,compressedSize:n,uncompressedSize:r,compression:t}),a+=46+i+c+f}if(0===l.length)return(0,i.error)("no files parsed from central directory",r),null;l.sort((e,t)=>e.offset-t.offset);const c=new Map;for(let e=0;e<l.length;e++){const t=l[e],r=(0,s.normalizeZipEntryPath)(t.filename);""!==r&&(c.has(r)&&(0,i.warn)("duplicate manifest key after normalize; overwriting",r),c.set(r,{filename:t.filename,offset:t.offset,compressedSize:t.compressedSize,uncompressedSize:t.uncompressedSize,compression:t.compression,nextOffset:e<l.length-1?l[e+1].offset:n}))}return c.size>0?c:null}(c,f,a,e)}(e);return c&&(r.zipManifests.set(e,c),await l(e,c,t),(0,i.log)("manifest fetched and stored in memory",{zipUrl:e,entryCount:c.size})),c})().finally(()=>{r.pendingManifestLoads.delete(e)}),r.pendingManifestLoads.set(e,c),c)},t.entryUncompressedSize=function(e){return void 0!==e.uncompressedSize?e.uncompressedSize:0===e.compression?e.compressedSize:null},t.resolveManifestEntry=function(e,t,n,r){if(e.has(t))return{key:t,info:e.get(t),matchKind:"exact"};if(r)return null;const i=(0,s.zipBasenameWithoutExtension)(n);if(!i)return null;const o=`${i}/${t}`;return e.has(o)?{key:o,info:e.get(o),matchKind:"zipBasenameFallback"}:null};const s=n(343),r=n(262),i=n(266);function o(e){const t=new Map;for(const n of e){const e=(0,s.normalizeZipEntryPath)(n.filename);""!==e&&(t.has(e)&&(0,i.warn)("duplicate manifest key after normalize; overwriting",e),t.set(e,n))}return t.size>0?t:null}async function a(e){if(!e)return null;const t=await self.clients.get(e);return"window"===(null==t?void 0:t.type)?t:null}async function l(e,t,n){const s=await a(n);if(!s)return;const r=Array.from(t.values());try{s.postMessage({type:"ZIP_SW_MANIFEST_CREATED",zipUrl:e,files:r})}catch(e){(0,i.warn)("failed to send manifest to client",e)}}},993(e,t,n){t.installMessageHandler=function(){self.addEventListener("message",e=>{if(!e.data)return;const{type:t,zipUrl:n,files:p,config:d,allowedZipUrls:w,previousUrl:h,nextUrl:g}=e.data,m=function(e){if(!e||!("id"in e))return;const t=e.id;return"string"==typeof t?t:void 0}(e.source);if("ZIP_SW_CONFIG"===t){const t=(0,i.applyRuntimeConfig)(d,m).then(()=>u(e,{ok:!0})).catch(t=>u(e,f(t)));return void e.waitUntil(t)}if("ZIP_MANIFEST"===t){if(n&&p){const t=(0,r.normalizeZipUrl)(n),s=(0,c.manifestFilesToMap)(p),i=a.zipManifests.get(t);if(!s)return void(0,l.warn)("rejecting empty manifest; keeping existing",{zipUrl:t,existingSize:i?i.size:0});if(i&&i.size>s.size)return void(0,l.warn)("rejecting smaller manifest; keeping existing",{zipUrl:t,incomingSize:s.size,existingSize:i.size});a.zipManifests.set(t,s),e.waitUntil((0,c.sendManifestToClientId)(t,s,m));const o=Array.from(s.keys()).slice(0,40);(0,l.log)("ZIP_MANIFEST loaded",{zipUrl:t,entryCount:s.size,sampleKeys:o,replacedExistingSize:i?i.size:0})}}else if("CLEAR_ZIP_ASSETS_EXCEPT_ALLOWED"===t){const t=(0,i.clearZipAssetsExceptLiveClaims)(o.clearZipAssetsExceptAllowed).then(()=>u(e,{ok:!0})).catch(t=>u(e,f(t)));e.waitUntil(t)}else if("CLEAR_ALL_ZIP_ASSETS"===t){const t=(0,o.clearAllZipAssets)().then(()=>u(e,{ok:!0})).catch(t=>u(e,f(t)));e.waitUntil(t)}else if("PRELOAD_ZIP_MANIFESTS"===t&&w){const t=async function(e,t){const n=await Promise.all(e.map(async e=>({zipUrl:e,manifest:await(0,c.ensureManifestAvailable)(e,t)}))),r=n.filter(e=>!e.manifest).map(e=>e.zipUrl);if(r.length>0)throw(0,s.createZipPeekError)(`Failed to preload ZIP manifest(s): ${r.join(", ")}`)}(w,m).then(()=>u(e,{ok:!0})).catch(t=>u(e,f(t)));e.waitUntil(t)}else if("RENEW_ZIP_URL"===t&&h&&g){const t=(0,o.renewZipUrl)(h,g).then(()=>u(e,{ok:!0})).catch(t=>u(e,f(t)));e.waitUntil(t)}})};const s=n(553),r=n(343),i=n(314),o=n(800),a=n(262),l=n(266),c=n(346);function f(e){const t=(0,s.toZipPeekError)(e);return{ok:!1,error:t.message,errorStack:t.stack}}function u(e,t){var n;null===(n=e.ports[0])||void 0===n||n.postMessage(t)}},254(e,t,n){t.corsErrorResponse=c,t.getMimeType=f,t.fetchUncompressedZipEntryFromNetwork=async function(e,t,n){var r;const a=n.offset,l=n.nextOffset-1;(0,o.log)("fetching zip chunk from",{zipUrl:e,rangeStart:a,rangeEnd:l});const p=await fetch(e,{headers:{Range:`bytes=${a}-${l}`}});if(206!==p.status){const n=p.status>=400?p.status:502;return{ok:!1,response:c(`ZIP entry fetch for "${t}" expected HTTP 206 Partial Content from ${e}, got ${p.status}`,n,{upstreamStatus:p.status})}}if(!p.body)return{ok:!1,response:c(`ZIP entry fetch for "${t}" in ${e} returned no response body`,502)};const d=p.body.getReader();let w,h;try{({headerAndPayload:w,dataStart:h}=await async function(e){let t=new Uint8Array(0);for(;t.byteLength<30;){const{done:n,value:s}=await e.read();if(n)throw new Error("ZIP entry ended before its local file header was complete");t=u(t,s)}const n=new DataView(t.buffer,t.byteOffset,t.byteLength);if(n.getUint32(0,!0)!==i.LOCAL_FILE_HEADER_SIG)throw new Error("Invalid local file header (expected ZIP signature 0x04034b50)");const s=30+n.getUint16(26,!0)+n.getUint16(28,!0);for(;t.byteLength<s;){const{done:n,value:s}=await e.read();if(n)throw new Error("ZIP entry ended before its local file header fields were complete");t=u(t,s)}return{headerAndPayload:t,dataStart:s}}(d))}catch(n){return await d.cancel(n),{ok:!1,response:c(`Invalid local file header for "${t}" in ${e}: ${n instanceof Error?n.message:String(n)}`,500)}}const g=function(e,t,n){let s=t,r=0;return new ReadableStream({async pull(t){if(r>=n)return await e.cancel(),void t.close();let i;if(s.byteLength>0)i=s,s=new Uint8Array(0);else{const{done:s,value:o}=await e.read();if(s)return void t.error(new Error(`ZIP entry ended after ${r} of ${n} compressed bytes`));i=o}const o=n-r,a=i.byteLength>o?i.subarray(0,o):i;r+=a.byteLength,t.enqueue(a),r>=n&&(await e.cancel(),t.close())},cancel:t=>e.cancel(t)})}(d,w.subarray(h),n.compressedSize),m=null!==(r=n.uncompressedSize)&&void 0!==r?r:0===n.compression?n.compressedSize:null;let A;if(8===n.compression)A=function(e,t){const n=e.getReader();let r,i=0,o=!1;return new ReadableStream({start(e){r=new s.Inflate(t=>{i+=t.byteLength,e.enqueue(t)})},async pull(e){for(;!o;){const{done:s,value:a}=await n.read();if(s)return o=!0,r.push(new Uint8Array(0),!0),null!==t&&i!==t?void e.error(new Error(`Inflated ZIP entry size mismatch: expected ${t}, received ${i}`)):void e.close();r.push(a)}},cancel:e=>n.cancel(e)})}(g,m);else{if(0!==n.compression)return await d.cancel(),{ok:!1,response:c(`Unsupported compression method ${n.compression} for "${t}" in ${e} (only stored/0 and DEFLATE/8 are supported)`,500)};A=g}return{ok:!0,stream:A,contentLength:m,contentType:f(t)}};const s=n(612),r=n(553),i=n(262),o=n(266);function a(e){return e.replace(/[\r\n]+/g," ").trim()}function l(e,t){const n=[i.ASSET_ERROR_HEADER],s={"Access-Control-Allow-Origin":"*",[i.ASSET_ERROR_HEADER]:a(e)},r=null==t?void 0:t.upstreamStatus;return void 0!==r&&(s[i.ASSET_UPSTREAM_STATUS_HEADER]=String(r),n.push(i.ASSET_UPSTREAM_STATUS_HEADER)),s["Access-Control-Expose-Headers"]=n.join(", "),s}function c(e,t,n){const s=(0,r.formatZipPeekError)(e);return new Response(s,{status:t,headers:l(s,n)})}function f(e){var t,n;const s=null===(t=e.split(".").pop())||void 0===t?void 0:t.toLowerCase();return s&&null!==(n=i.MIME_TYPES[s])&&void 0!==n?n:"application/octet-stream"}function u(e,t){const n=new Uint8Array(e.byteLength+t.byteLength);return n.set(e),n.set(t,e.byteLength),n}},343(e,t){function n(e){try{return decodeURIComponent(e)}catch(t){return e}}t.normalizeZipUrl=function(e,t={}){const{stripCacheBuster:n=!0,stripHash:s=!0}=t,r=e=>s?e.split("#")[0]:e;if(!n)return r(e);const i=e.indexOf("?");if(-1===i)return r(e);const o=e.indexOf("#",i),a=e.substring(0,i),l=-1===o?e.substring(i+1):e.substring(i+1,o),c=s||-1===o?"":e.substring(o),f=l.split("&").filter(e=>{const t=e.indexOf("=");return"t"!==(-1===t?e:e.substring(0,t))});return 0===f.length?a+c:a+"?"+f.join("&")+c},t.zipBasenameWithoutExtension=function(e){var t,n;try{const n=null!==(t=new URL(e,"http://local").pathname.split("/").pop())&&void 0!==t?t:"";return n.endsWith(".zip")?n.slice(0,-4):n}catch(t){const s=null!==(n=e.split("?")[0].split("#")[0].split("/").pop())&&void 0!==n?n:"";return s.endsWith(".zip")?s.slice(0,-4):s}},t.normalizeZipEntryPath=function(e){let t=e.replace(/\\/g,"/");for(;t.startsWith("/");)t=t.slice(1);return t},t.parseZipAssetRequest=function(e){const t=/\.zip([/?])/.exec(e);if(!t)return null;const s=t.index+4,r=t[1],i=e.substring(0,s);if("/"===r){const t=e.substring(s+1),r=t.indexOf("?"),o=-1===r?t:t.substring(0,r);return""===o?null:{zipUrl:i,internalPath:n(o)}}const o=e.substring(s),a=o.indexOf("/");if(-1===a)return null;const l=o.substring(0,a),c=o.substring(a+1),f=c.indexOf("?"),u=-1===f?c:c.substring(0,f);return""===u?null:{zipUrl:i+l,internalPath:n(u)}},t.canonicalZipAssetRequestUrl=function(e,t){return e+"/"+encodeURIComponent(t)}},612(e,t){var n=Uint8Array,s=Uint16Array,r=Int32Array,i=new n([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),o=new n([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new n([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),l=function(e,t){for(var n=new s(31),i=0;i<31;++i)n[i]=t+=1<<e[i-1];var o=new r(n[30]);for(i=1;i<30;++i)for(var a=n[i];a<n[i+1];++a)o[a]=a-n[i]<<5|i;return{b:n,r:o}},c=l(i,2),f=c.b,u=c.r;f[28]=258,u[258]=28;for(var p=l(o,0),d=p.b,w=(p.r,new s(32768)),h=0;h<32768;++h){var g=(43690&h)>>1|(21845&h)<<1;g=(61680&(g=(52428&g)>>2|(13107&g)<<2))>>4|(3855&g)<<4,w[h]=((65280&g)>>8|(255&g)<<8)>>1}var m=function(e,t,n){for(var r=e.length,i=0,o=new s(t);i<r;++i)e[i]&&++o[e[i]-1];var a,l=new s(t);for(i=1;i<t;++i)l[i]=l[i-1]+o[i-1]<<1;if(n){a=new s(1<<t);var c=15-t;for(i=0;i<r;++i)if(e[i])for(var f=i<<4|e[i],u=t-e[i],p=l[e[i]-1]++<<u,d=p|(1<<u)-1;p<=d;++p)a[w[p]>>c]=f}else for(a=new s(r),i=0;i<r;++i)e[i]&&(a[i]=w[l[e[i]-1]++]>>15-e[i]);return a},A=new n(288);for(h=0;h<144;++h)A[h]=8;for(h=144;h<256;++h)A[h]=9;for(h=256;h<280;++h)A[h]=7;for(h=280;h<288;++h)A[h]=8;var E=new n(32);for(h=0;h<32;++h)E[h]=5;var y=m(A,9,1),U=m(E,5,1),R=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},C=function(e,t,n){var s=t/8|0;return(e[s]|e[s+1]<<8)>>(7&t)&n},Z=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},v=function(e){return(e+7)/8|0},S=function(e,t,s){return(null==t||t<0)&&(t=0),(null==s||s>e.length)&&(s=e.length),new n(e.subarray(t,s))},z=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],P=function(e,t,n){var s=new Error(t||z[e]);if(s.code=e,Error.captureStackTrace&&Error.captureStackTrace(s,P),!n)throw s;return s},_=function(e,t,s,r){var l=e.length,c=r?r.length:0;if(!l||t.f&&!t.l)return s||new n(0);var u=!s,p=u||2!=t.i,w=t.i;u&&(s=new n(3*l));var h=function(e){var t=s.length;if(e>t){var r=new n(Math.max(2*t,e));r.set(s),s=r}},g=t.f||0,A=t.p||0,E=t.b||0,z=t.l,_=t.d,b=t.m,L=t.n,M=8*l;do{if(!z){g=C(e,A,1);var I=C(e,A+1,3);if(A+=3,!I){var T=e[(W=v(A)+4)-4]|e[W-3]<<8,k=W+T;if(k>l){w&&P(0);break}p&&h(E+T),s.set(e.subarray(W,k),E),t.b=E+=T,t.p=A=8*k,t.f=g;continue}if(1==I)z=y,_=U,b=9,L=5;else if(2==I){var F=C(e,A,31)+257,x=C(e,A+10,15)+4,O=F+C(e,A+5,31)+1;A+=14;for(var N=new n(O),H=new n(19),$=0;$<x;++$)H[a[$]]=C(e,A+3*$,7);A+=3*x;var D=R(H),q=(1<<D)-1,j=m(H,D,1);for($=0;$<O;){var W,K=j[C(e,A,q)];if(A+=15&K,(W=K>>4)<16)N[$++]=W;else{var G=0,X=0;for(16==W?(X=3+C(e,A,3),A+=2,G=N[$-1]):17==W?(X=3+C(e,A,7),A+=3):18==W&&(X=11+C(e,A,127),A+=7);X--;)N[$++]=G}}var B=N.subarray(0,F),Y=N.subarray(F);b=R(B),L=R(Y),z=m(B,b,1),_=m(Y,L,1)}else P(1);if(A>M){w&&P(0);break}}p&&h(E+131072);for(var Q=(1<<b)-1,V=(1<<L)-1,J=A;;J=A){var ee=(G=z[Z(e,A)&Q])>>4;if((A+=15&G)>M){w&&P(0);break}if(G||P(2),ee<256)s[E++]=ee;else{if(256==ee){J=A,z=null;break}var te=ee-254;if(ee>264){var ne=i[$=ee-257];te=C(e,A,(1<<ne)-1)+f[$],A+=ne}var se=_[Z(e,A)&V],re=se>>4;if(se||P(3),A+=15&se,Y=d[re],re>3&&(ne=o[re],Y+=Z(e,A)&(1<<ne)-1,A+=ne),A>M){w&&P(0);break}p&&h(E+131072);var ie=E+te;if(E<Y){var oe=c-Y,ae=Math.min(Y,ie);for(oe+E<0&&P(3);E<ae;++E)s[E]=r[oe+E]}for(;E<ie;++E)s[E]=s[E-Y]}}t.l=z,t.p=J,t.b=E,t.f=g,z&&(g=1,t.m=b,t.d=_,t.n=L)}while(!g);return E!=s.length&&u?S(s,0,E):s.subarray(0,E)},b=new n(0);var L=function(){function e(e,t){"function"==typeof e&&(t=e,e={}),this.ondata=t;var s=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:s?s.length:0},this.o=new n(32768),this.p=new n(0),s&&this.o.set(s)}return e.prototype.e=function(e){if(this.ondata||P(5),this.d&&P(4),this.p.length){if(e.length){var t=new n(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,n=_(this.p,this.s,this.o);this.ondata(S(n,t,this.s.b),this.d),this.o=S(n,this.s.b-32768),this.s.b=this.o.length,this.p=S(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}();t.Inflate=L;var M="undefined"!=typeof TextDecoder&&new TextDecoder;try{M.decode(b,{stream:!0})}catch(e){}"function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout&&setTimeout}};const t={};function n(s){const r=t[s];if(void 0!==r)return r.exports;const i=t[s]={exports:{}};return e[s](i,i.exports,n),i.exports}(()=>{const e=n(266),t=n(982),s=n(993);self.addEventListener("install",()=>{self.skipWaiting()}),self.addEventListener("activate",e=>{e.waitUntil(self.clients.claim())}),(0,e.installClientErrorReporting)(),(0,s.installMessageHandler)(),(0,t.installFetchHandler)()})()})();
|
|
2
2
|
//# sourceMappingURL=zipServiceWorker.js.map
|