@the_library/public 1.0.0 → 2.0.1
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 +201 -28
- package/assets/branding/pond-enterprise-logo.svg +1 -1
- package/dist/Book-CYyj_y_4.d.ts +621 -0
- package/dist/bookSearchService-YQskauJS.d.ts +300 -0
- package/dist/branding/index.js +1 -66
- package/dist/branding/index.js.map +1 -1
- package/dist/chunk-3XUKOVEF.js +2 -0
- package/dist/chunk-3XUKOVEF.js.map +1 -0
- package/dist/chunk-46FQHZNM.js +2 -0
- package/dist/chunk-46FQHZNM.js.map +1 -0
- package/dist/chunk-7G3BMGV2.js +2 -0
- package/dist/chunk-7G3BMGV2.js.map +1 -0
- package/dist/chunk-D4DXGA2W.js +2 -0
- package/dist/chunk-D4DXGA2W.js.map +1 -0
- package/dist/chunk-EMA2QJTW.js +2 -0
- package/dist/chunk-EMA2QJTW.js.map +1 -0
- package/dist/chunk-FN52YV7L.js +2 -0
- package/dist/chunk-FN52YV7L.js.map +1 -0
- package/dist/chunk-GWQNULP4.js +2 -0
- package/dist/chunk-GWQNULP4.js.map +1 -0
- package/dist/chunk-OELHBR4F.js +2 -0
- package/dist/chunk-OELHBR4F.js.map +1 -0
- package/dist/chunk-PV3X54EU.js +2 -0
- package/dist/chunk-PV3X54EU.js.map +1 -0
- package/dist/chunk-SD3INWZF.js +2 -0
- package/dist/chunk-SD3INWZF.js.map +1 -0
- package/dist/downloader/dl2-sw.js +1 -198
- package/dist/downloader/dl2-sw.js.map +1 -1
- package/dist/downloader/file-worker-v2.js +1 -257
- package/dist/downloader/file-worker-v2.js.map +1 -1
- package/dist/downloader/index.d.ts +30 -2
- package/dist/downloader/index.js +1 -537
- package/dist/downloader/index.js.map +1 -1
- package/dist/downloader/mu-worker-v2.js +1 -196
- package/dist/downloader/mu-worker-v2.js.map +1 -1
- package/dist/downloader/react.d.ts +1 -1
- package/dist/downloader/react.js +1 -31
- package/dist/downloader/react.js.map +1 -1
- package/dist/downloader/solid.d.ts +1 -1
- package/dist/downloader/solid.js +1 -18
- package/dist/downloader/solid.js.map +1 -1
- package/dist/downloader/sw.js +1 -118
- package/dist/downloader/sw.js.map +1 -1
- package/dist/downloader/vue.d.ts +1 -1
- package/dist/downloader/vue.js +1 -18
- package/dist/downloader/vue.js.map +1 -1
- package/dist/enriched-index-T0sDG7JR.d.ts +209 -0
- package/dist/global/public.global.js +68 -0
- package/dist/global/public.manifest.json +484 -0
- package/dist/level-state-DXqglpAX.d.ts +27 -0
- package/dist/models/astro.d.ts +4 -3
- package/dist/models/astro.js +1 -43
- package/dist/models/astro.js.map +1 -1
- package/dist/models/index.d.ts +449 -23
- package/dist/models/index.js +1 -339
- package/dist/models/index.js.map +1 -1
- package/dist/models/models.d.ts +195 -441
- package/dist/models/models.js +1 -45
- package/dist/models/patch-worker.js +1 -542
- package/dist/models/patch-worker.js.map +1 -1
- package/dist/models/react.d.ts +6 -5
- package/dist/models/react.js +1 -72
- package/dist/models/react.js.map +1 -1
- package/dist/models/solid.d.ts +16 -6
- package/dist/models/solid.js +1 -94
- package/dist/models/solid.js.map +1 -1
- package/dist/models/vue.d.ts +89 -7
- package/dist/models/vue.js +1 -97
- package/dist/models/vue.js.map +1 -1
- package/dist/orm-MJTHCG9E.d.ts +1003 -0
- package/dist/{session-vqOnyxga.d.ts → session-JudUKAV7.d.ts} +76 -74
- package/dist/{state-BTsp-E4v.d.ts → state-CkYavOSt.d.ts} +16 -0
- package/dist/{types-Dn0EFMO_.d.ts → types-B-IX3HBn.d.ts} +94 -21
- package/dist/{types-Xb8Ta9tZ.d.ts → types-Blyx2A7F.d.ts} +10 -36
- package/dist/web3/auth.d.ts +89 -0
- package/dist/web3/auth.js +13 -0
- package/dist/web3/auth.js.map +1 -0
- package/dist/web3/index.d.ts +1913 -126
- package/dist/web3/index.js +1 -1019
- package/dist/web3/index.js.map +1 -1
- package/dist/web3/network.d.ts +6 -0
- package/dist/web3/network.js +2 -0
- package/dist/web3/network.js.map +1 -0
- package/dist/web3/registry.d.ts +34 -9
- package/dist/web3/registry.js +1 -22
- package/dist/web3/vue.d.ts +31 -14
- package/dist/web3/vue.js +1 -390
- package/dist/web3/vue.js.map +1 -1
- package/package.json +36 -15
- package/dist/chunk-2HFOWE5R.js +0 -296
- package/dist/chunk-2HFOWE5R.js.map +0 -1
- package/dist/chunk-3L6LH2XK.js +0 -465
- package/dist/chunk-3L6LH2XK.js.map +0 -1
- package/dist/chunk-4CWVFPBN.js +0 -28
- package/dist/chunk-4CWVFPBN.js.map +0 -1
- package/dist/chunk-AGHPATVL.js +0 -65
- package/dist/chunk-AGHPATVL.js.map +0 -1
- package/dist/chunk-JDUYLUDJ.js +0 -4835
- package/dist/chunk-JDUYLUDJ.js.map +0 -1
- package/dist/chunk-OEZK7IX7.js +0 -77
- package/dist/chunk-OEZK7IX7.js.map +0 -1
- package/dist/chunk-PUYDAUCI.js +0 -2873
- package/dist/chunk-PUYDAUCI.js.map +0 -1
- package/dist/chunk-WHWMTS7D.js +0 -99
- package/dist/chunk-WHWMTS7D.js.map +0 -1
- package/dist/chunk-Y7RS6RTM.js +0 -342
- package/dist/chunk-Y7RS6RTM.js.map +0 -1
- package/dist/chunk-ZEZGI2TP.js +0 -197
- package/dist/chunk-ZEZGI2TP.js.map +0 -1
- package/dist/core-dao-core-logo-VDT2I5IW.svg +0 -33
- package/dist/level-state-J3pj64Tr.d.ts +0 -15
- package/dist/models/models_v2.global.js +0 -1
- package/dist/orm-BvkX0aBT.d.ts +0 -507
|
@@ -1,258 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
var DEFAULT_GATEWAYS = [
|
|
3
|
-
"https://arweave.net",
|
|
4
|
-
"https://permagate.io",
|
|
5
|
-
"https://ar-io.dev"
|
|
6
|
-
];
|
|
7
|
-
function trackProgress(response, onProgress) {
|
|
8
|
-
const reader = response.body.getReader();
|
|
9
|
-
const total = response.headers.get("content-length") ? parseInt(response.headers.get("content-length"), 10) : void 0;
|
|
10
|
-
let loaded = 0;
|
|
11
|
-
const stream = new ReadableStream({
|
|
12
|
-
async pull(controller) {
|
|
13
|
-
const { done, value } = await reader.read();
|
|
14
|
-
if (done) {
|
|
15
|
-
controller.close();
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
loaded += value.byteLength;
|
|
19
|
-
onProgress(loaded, total);
|
|
20
|
-
controller.enqueue(value);
|
|
21
|
-
},
|
|
22
|
-
cancel(reason) {
|
|
23
|
-
return reader.cancel(reason);
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
return new Response(stream, response);
|
|
27
|
-
}
|
|
28
|
-
async function fetchFromGateways(txId, gateways2, onProgress) {
|
|
29
|
-
let lastError;
|
|
30
|
-
for (const gw of gateways2) {
|
|
31
|
-
try {
|
|
32
|
-
const url = `${gw}/${txId}`;
|
|
33
|
-
const resp = await fetch(url, { mode: "cors" });
|
|
34
|
-
if (resp.type === "opaque") {
|
|
35
|
-
throw new Error(`[downloader_v2] opaque response for ${txId} \u2014 CORS not granted`);
|
|
36
|
-
}
|
|
37
|
-
if (!resp.ok) {
|
|
38
|
-
throw new Error(`[downloader_v2] HTTP ${resp.status} from ${gw}`);
|
|
39
|
-
}
|
|
40
|
-
const tracked = trackProgress(resp, onProgress);
|
|
41
|
-
const reader = tracked.body.getReader();
|
|
42
|
-
const { done, value } = await reader.read();
|
|
43
|
-
let finalStream;
|
|
44
|
-
if (!value) {
|
|
45
|
-
finalStream = new ReadableStream({
|
|
46
|
-
start(controller) {
|
|
47
|
-
controller.close();
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
} else {
|
|
51
|
-
const isGzip = value.length >= 2 && value[0] === 31 && value[1] === 139;
|
|
52
|
-
const combinedStream = new ReadableStream({
|
|
53
|
-
start(controller) {
|
|
54
|
-
controller.enqueue(value);
|
|
55
|
-
},
|
|
56
|
-
async pull(controller) {
|
|
57
|
-
const { done: done2, value: chunk } = await reader.read();
|
|
58
|
-
if (done2) {
|
|
59
|
-
controller.close();
|
|
60
|
-
} else {
|
|
61
|
-
controller.enqueue(chunk);
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
cancel(reason) {
|
|
65
|
-
return reader.cancel(reason);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
finalStream = isGzip ? combinedStream.pipeThrough(new DecompressionStream("gzip")) : combinedStream;
|
|
69
|
-
}
|
|
70
|
-
const headers = new Headers(tracked.headers);
|
|
71
|
-
headers.set("X-DL2-Stored", (/* @__PURE__ */ new Date()).toISOString());
|
|
72
|
-
headers.delete("content-length");
|
|
73
|
-
headers.delete("content-encoding");
|
|
74
|
-
return new Response(finalStream, { status: tracked.status, statusText: tracked.statusText, headers });
|
|
75
|
-
} catch (err) {
|
|
76
|
-
lastError = err;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
throw lastError ?? new Error(`[downloader_v2] all gateways failed for ${txId}`);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// src/downloader/keys.ts
|
|
83
|
-
var CACHE_VERSION = 1;
|
|
84
|
-
var CACHES = {
|
|
85
|
-
pdf: `dl2-pdf-v${CACHE_VERSION}`,
|
|
86
|
-
preview: `dl2-preview-v${CACHE_VERSION}`,
|
|
87
|
-
pages: `dl2-pages-v${CACHE_VERSION}`
|
|
88
|
-
};
|
|
89
|
-
var arKey = (txId) => `/ar/${txId}`;
|
|
90
|
-
var pdfKey = arKey;
|
|
91
|
-
var previewKey = arKey;
|
|
92
|
-
|
|
93
|
-
// src/downloader/cache-store.ts
|
|
94
|
-
var openPdfCache = () => caches.open(CACHES.pdf);
|
|
95
|
-
var openPreviewCache = () => caches.open(CACHES.preview);
|
|
96
|
-
var putPdf = async (txId, response) => {
|
|
97
|
-
const c = await openPdfCache();
|
|
98
|
-
await c.put(pdfKey(txId), response);
|
|
99
|
-
};
|
|
100
|
-
var putPreview = async (txId, response) => {
|
|
101
|
-
const c = await openPreviewCache();
|
|
102
|
-
await c.put(previewKey(txId), response);
|
|
103
|
-
};
|
|
104
|
-
var deletePdf = async (txId) => {
|
|
105
|
-
const c = await openPdfCache();
|
|
106
|
-
return c.delete(pdfKey(txId));
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
// src/downloader/meta-db.ts
|
|
110
|
-
var DB_NAME = "dl2_meta";
|
|
111
|
-
var DB_VERSION = 1;
|
|
112
|
-
var _db = null;
|
|
113
|
-
var openMetaDb = () => {
|
|
114
|
-
if (_db) return Promise.resolve(_db);
|
|
115
|
-
return new Promise((resolve, reject) => {
|
|
116
|
-
const req = indexedDB.open(DB_NAME, DB_VERSION);
|
|
117
|
-
req.onupgradeneeded = (e) => {
|
|
118
|
-
const db = e.target.result;
|
|
119
|
-
if (!db.objectStoreNames.contains("book_data")) {
|
|
120
|
-
db.createObjectStore("book_data", { keyPath: "txId" });
|
|
121
|
-
}
|
|
122
|
-
if (!db.objectStoreNames.contains("downloads")) {
|
|
123
|
-
db.createObjectStore("downloads", { keyPath: "txId" });
|
|
124
|
-
}
|
|
125
|
-
if (!db.objectStoreNames.contains("migration_checkpoints")) {
|
|
126
|
-
db.createObjectStore("migration_checkpoints", { keyPath: "cacheName" });
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
req.onsuccess = (e) => {
|
|
130
|
-
_db = e.target.result;
|
|
131
|
-
resolve(_db);
|
|
132
|
-
};
|
|
133
|
-
req.onerror = () => reject(req.error);
|
|
134
|
-
});
|
|
135
|
-
};
|
|
136
|
-
var idbPut = (store, value) => openMetaDb().then((db) => new Promise((resolve, reject) => {
|
|
137
|
-
const tx = db.transaction(store, "readwrite");
|
|
138
|
-
const req = tx.objectStore(store).put(value);
|
|
139
|
-
req.onsuccess = () => resolve();
|
|
140
|
-
req.onerror = () => reject(req.error);
|
|
141
|
-
}));
|
|
142
|
-
var idbDelete = (store, key) => openMetaDb().then((db) => new Promise((resolve, reject) => {
|
|
143
|
-
const tx = db.transaction(store, "readwrite");
|
|
144
|
-
const req = tx.objectStore(store).delete(key);
|
|
145
|
-
req.onsuccess = () => resolve();
|
|
146
|
-
req.onerror = () => reject(req.error);
|
|
147
|
-
}));
|
|
148
|
-
var idbGetAll = (store) => openMetaDb().then((db) => new Promise((resolve, reject) => {
|
|
149
|
-
const tx = db.transaction(store, "readonly");
|
|
150
|
-
const req = tx.objectStore(store).getAll();
|
|
151
|
-
req.onsuccess = () => resolve(req.result);
|
|
152
|
-
req.onerror = () => reject(req.error);
|
|
153
|
-
}));
|
|
154
|
-
var deleteBookData = (txId) => idbDelete("book_data", txId);
|
|
155
|
-
var putDownloadRecord = (record) => idbPut("downloads", record);
|
|
156
|
-
var getAllDownloadRecords = () => idbGetAll("downloads");
|
|
157
|
-
var deleteDownloadRecord = (txId) => idbDelete("downloads", txId);
|
|
158
|
-
|
|
159
|
-
// src/downloader/lru.ts
|
|
160
|
-
var PRUNE_THRESHOLD = 0.8;
|
|
161
|
-
var PRUNE_TARGET = 0.65;
|
|
162
|
-
async function runLruPrune(onStart) {
|
|
163
|
-
const estimate = await navigator.storage.estimate();
|
|
164
|
-
const usage = estimate.usage ?? 0;
|
|
165
|
-
const quota = estimate.quota ?? Infinity;
|
|
166
|
-
if (usage / quota <= PRUNE_THRESHOLD) return null;
|
|
167
|
-
const targetFree = usage - quota * PRUNE_TARGET;
|
|
168
|
-
onStart?.(targetFree);
|
|
169
|
-
const records = await getAllDownloadRecords();
|
|
170
|
-
const pdfs = records.filter((r) => r.fileType === "pdf").sort((a, b) => a.lastAccessedAt - b.lastAccessedAt);
|
|
171
|
-
let freedBytes = 0;
|
|
172
|
-
let removed = 0;
|
|
173
|
-
const prunedTxIds = [];
|
|
174
|
-
for (const record of pdfs) {
|
|
175
|
-
if (freedBytes >= targetFree) break;
|
|
176
|
-
await deletePdf(record.txId);
|
|
177
|
-
await deleteDownloadRecord(record.txId);
|
|
178
|
-
await deleteBookData(record.txId);
|
|
179
|
-
await prunePagesByTxId(record.txId);
|
|
180
|
-
freedBytes += record.sizeBytes;
|
|
181
|
-
removed++;
|
|
182
|
-
prunedTxIds.push(record.txId);
|
|
183
|
-
}
|
|
184
|
-
return { removed, freedBytes, prunedTxIds };
|
|
185
|
-
}
|
|
186
|
-
async function runLruPruneAndEmit(postMsg) {
|
|
187
|
-
const estimate = await navigator.storage.estimate();
|
|
188
|
-
const usage = estimate.usage ?? 0;
|
|
189
|
-
const quota = estimate.quota ?? Infinity;
|
|
190
|
-
if (usage / quota <= PRUNE_THRESHOLD) return;
|
|
191
|
-
const targetFree = usage - quota * PRUNE_TARGET;
|
|
192
|
-
postMsg({ type: "StoragePruneStarted", targetFreeBytes: targetFree });
|
|
193
|
-
const result = await runLruPrune();
|
|
194
|
-
if (result) {
|
|
195
|
-
postMsg({
|
|
196
|
-
type: "StoragePruned",
|
|
197
|
-
removed: result.removed,
|
|
198
|
-
freedBytes: result.freedBytes,
|
|
199
|
-
prunedTxIds: result.prunedTxIds
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
async function prunePagesByTxId(txId) {
|
|
204
|
-
const cache = await caches.open(CACHES.pages);
|
|
205
|
-
const keys = await cache.keys();
|
|
206
|
-
const prefix = `/pages/${encodeURIComponent(txId)}/`;
|
|
207
|
-
await Promise.all(
|
|
208
|
-
keys.filter((r) => r.url.includes(prefix)).map((r) => cache.delete(r))
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// src/downloader/worker/file-worker.ts
|
|
213
|
-
var gateways = DEFAULT_GATEWAYS;
|
|
214
|
-
function post(msg) {
|
|
215
|
-
self.postMessage(msg);
|
|
216
|
-
}
|
|
217
|
-
async function handleGetFile(txId, mime) {
|
|
218
|
-
try {
|
|
219
|
-
const response = await fetchFromGateways(txId, gateways, (loaded, total) => {
|
|
220
|
-
post({ type: "DownloadProgress", txId, loaded, total });
|
|
221
|
-
});
|
|
222
|
-
const ct = mime === "pdf" ? "application/pdf" : response.headers.get("content-type") || "application/octet-stream";
|
|
223
|
-
const buffer = await response.arrayBuffer();
|
|
224
|
-
const sizeBytes = buffer.byteLength;
|
|
225
|
-
const headers = new Headers(response.headers);
|
|
226
|
-
headers.set("Content-Type", ct);
|
|
227
|
-
headers.set("Content-Length", String(sizeBytes));
|
|
228
|
-
headers.set("X-DL2-Stored", (/* @__PURE__ */ new Date()).toISOString());
|
|
229
|
-
const cloned = new Response(buffer, { status: response.status, headers });
|
|
230
|
-
if (mime === "pdf") {
|
|
231
|
-
await putPdf(txId, cloned);
|
|
232
|
-
} else {
|
|
233
|
-
await putPreview(txId, cloned);
|
|
234
|
-
}
|
|
235
|
-
await putDownloadRecord({
|
|
236
|
-
txId,
|
|
237
|
-
fileType: mime,
|
|
238
|
-
sizeBytes,
|
|
239
|
-
downloadedAt: Date.now(),
|
|
240
|
-
lastAccessedAt: Date.now()
|
|
241
|
-
});
|
|
242
|
-
post({ type: "DownloadFinished", txId, key: txId, mime });
|
|
243
|
-
post({ type: "FileRpcResponse", ok: true, key: `${txId}:${mime}` });
|
|
244
|
-
await runLruPruneAndEmit(post);
|
|
245
|
-
} catch (err) {
|
|
246
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
247
|
-
post({ type: "DownloadError", txId, error: msg, retryable: true });
|
|
248
|
-
post({ type: "FileRpcResponse", ok: false, key: `${txId}:${mime}`, error: msg });
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
self.onmessage = (e) => {
|
|
252
|
-
const cmd = e.data;
|
|
253
|
-
if (cmd.type === "GetFile") {
|
|
254
|
-
handleGetFile(cmd.txId, cmd.mime);
|
|
255
|
-
} else if (cmd.type === "CancelDownload") {
|
|
256
|
-
}
|
|
257
|
-
};
|
|
1
|
+
var b=["https://arweave.net","https://permagate.io","https://ar-io.dev"];function M(e,t){let o=e.body.getReader(),n=e.headers.get("content-length")?parseInt(e.headers.get("content-length"),10):void 0,r=0,c=new ReadableStream({async pull(s){let{done:i,value:d}=await o.read();if(i){s.close();return}r+=d.byteLength,t(r,n),s.enqueue(d)},cancel(s){return o.cancel(s)}});return new Response(c,e)}async function k(e,t,o){let n;for(let r of t)try{let c=`${r}/${e}`,s=await fetch(c,{mode:"cors"});if(s.type==="opaque")throw new Error(`[downloader_v2] opaque response for ${e} \u2014 CORS not granted`);if(!s.ok)throw new Error(`[downloader_v2] HTTP ${s.status} from ${r}`);let i=M(s,o),d=i.body.getReader(),{done:u,value:a}=await d.read(),m;if(!a)m=new ReadableStream({start(y){y.close()}});else{let y=a.length>=2&&a[0]===31&&a[1]===139,P=new ReadableStream({start(p){p.enqueue(a)},async pull(p){let{done:F,value:L}=await d.read();F?p.close():p.enqueue(L)},cancel(p){return d.cancel(p)}});m=y?P.pipeThrough(new DecompressionStream("gzip")):P}let w=new Headers(i.headers);return w.set("X-DL2-Stored",new Date().toISOString()),w.delete("content-length"),w.delete("content-encoding"),new Response(m,{status:i.status,statusText:i.statusText,headers:w})}catch(c){n=c}throw n??new Error(`[downloader_v2] all gateways failed for ${e}`)}var g={pdf:"dl2-pdf-v1",preview:"dl2-preview-v1",pages:"dl2-pages-v1"};var R=e=>`/ar/${e}`,x=R,D=R;var v=()=>caches.open(g.pdf),H=()=>caches.open(g.preview);var S=async(e,t)=>{await(await v()).put(x(e),t)},E=async(e,t)=>{await(await H()).put(D(e),t)};var _=async e=>(await v()).delete(x(e));var W="dl2_meta";var f=null,h=()=>f?Promise.resolve(f):new Promise((e,t)=>{let o=indexedDB.open(W,1);o.onupgradeneeded=n=>{let r=n.target.result;r.objectStoreNames.contains("book_data")||r.createObjectStore("book_data",{keyPath:"txId"}),r.objectStoreNames.contains("downloads")||r.createObjectStore("downloads",{keyPath:"txId"}),r.objectStoreNames.contains("migration_checkpoints")||r.createObjectStore("migration_checkpoints",{keyPath:"cacheName"})},o.onsuccess=n=>{f=n.target.result,e(f)},o.onerror=()=>t(o.error)});var K=(e,t)=>h().then(o=>new Promise((n,r)=>{let s=o.transaction(e,"readwrite").objectStore(e).put(t);s.onsuccess=()=>n(),s.onerror=()=>r(s.error)})),A=(e,t)=>h().then(o=>new Promise((n,r)=>{let s=o.transaction(e,"readwrite").objectStore(e).delete(t);s.onsuccess=()=>n(),s.onerror=()=>r(s.error)})),j=e=>h().then(t=>new Promise((o,n)=>{let c=t.transaction(e,"readonly").objectStore(e).getAll();c.onsuccess=()=>o(c.result),c.onerror=()=>n(c.error)}));var I=e=>A("book_data",e);var B=e=>K("downloads",e),T=()=>j("downloads"),C=e=>A("downloads",e);var G=.8,U=.65,q=new Set;function N(e){q=new Set(e)}async function V(e){let t=await navigator.storage.estimate(),o=t.usage??0,n=t.quota??1/0;if(o/n<=G)return null;let r=o-n*U;e?.(r);let s=(await T()).filter(a=>a.fileType==="pdf"&&!q.has(a.txId)).sort((a,m)=>a.lastAccessedAt-m.lastAccessedAt),i=0,d=0,u=[];for(let a of s){if(i>=r)break;await _(a.txId),await C(a.txId),await I(a.txId),await z(a.txId),i+=a.sizeBytes,d++,u.push(a.txId)}return{removed:d,freedBytes:i,prunedTxIds:u}}async function O(e){let t=await V(o=>{e({type:"StoragePruneStarted",targetFreeBytes:o})});t&&e({type:"StoragePruned",removed:t.removed,freedBytes:t.freedBytes,prunedTxIds:t.prunedTxIds})}async function z(e){let t=await caches.open(g.pages),o=await t.keys(),n=`/pages/${encodeURIComponent(e)}/`;await Promise.all(o.filter(r=>r.url.includes(n)).map(r=>t.delete(r)))}var $=b;function l(e){self.postMessage(e)}async function X(e,t){try{let o=await k(e,$,(d,u)=>{l({type:"DownloadProgress",txId:e,loaded:d,total:u})}),n=t==="pdf"?"application/pdf":o.headers.get("content-type")||"application/octet-stream",r=await o.arrayBuffer(),c=r.byteLength,s=new Headers(o.headers);s.set("Content-Type",n),s.set("Content-Length",String(c)),s.set("X-DL2-Stored",new Date().toISOString());let i=new Response(r,{status:o.status,headers:s});t==="pdf"?await S(e,i):await E(e,i),await B({txId:e,fileType:t,sizeBytes:c,downloadedAt:Date.now(),lastAccessedAt:Date.now()}),l({type:"DownloadFinished",txId:e,key:e,mime:t}),l({type:"FileRpcResponse",ok:!0,key:`${e}:${t}`}),await O(l)}catch(o){let n=o instanceof Error?o.message:String(o),r=o instanceof DOMException&&o.name==="QuotaExceededError";l({type:"DownloadError",txId:e,error:n,retryable:!r,quotaExceeded:r}),l({type:"FileRpcResponse",ok:!1,key:`${e}:${t}`,error:n,quotaExceeded:r})}}self.onmessage=e=>{let t=e.data;t.type==="FileInit"?t.gateways.length>0&&($=t.gateways):t.type==="PinTxIds"?N(t.txIds):t.type==="GetFile"?X(t.txId,t.mime):t.type};
|
|
258
2
|
//# sourceMappingURL=file-worker-v2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/downloader/fetcher.ts","../../src/downloader/keys.ts","../../src/downloader/cache-store.ts","../../src/downloader/meta-db.ts","../../src/downloader/lru.ts","../../src/downloader/worker/file-worker.ts"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/downloader/fetcher.ts","../../src/downloader/keys.ts","../../src/downloader/cache-store.ts","../../src/downloader/meta-db.ts","../../src/downloader/lru.ts","../../src/downloader/worker/file-worker.ts"],"mappings":"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","names":["DEFAULT_GATEWAYS","trackProgress","response","onProgress","reader","total","loaded","stream","controller","done","value","reason","fetchFromGateways","txId","gateways","lastError","gw","url","resp","tracked","finalStream","isGzip","combinedStream","chunk","headers","err","CACHES","arKey","txId","pdfKey","previewKey","openPdfCache","CACHES","openPreviewCache","putPdf","txId","response","openPdfCache","pdfKey","putPreview","openPreviewCache","previewKey","deletePdf","txId","openPdfCache","pdfKey","DB_NAME","_db","openMetaDb","resolve","reject","req","DB_NAME","e","db","idbPut","store","value","openMetaDb","db","resolve","reject","req","idbDelete","key","idbGetAll","deleteBookData","txId","idbDelete","putDownloadRecord","record","idbPut","getAllDownloadRecords","idbGetAll","deleteDownloadRecord","txId","idbDelete","PRUNE_THRESHOLD","PRUNE_TARGET","_pinnedTxIds","setPinnedTxIds","txIds","runLruPrune","onStart","estimate","usage","quota","targetFree","pdfs","getAllDownloadRecords","r","b","freedBytes","removed","prunedTxIds","record","deletePdf","deleteDownloadRecord","deleteBookData","prunePagesByTxId","runLruPruneAndEmit","postMsg","result","txId","cache","CACHES","keys","prefix","gateways","DEFAULT_GATEWAYS","post","msg","handleGetFile","txId","mime","response","fetchFromGateways","loaded","total","ct","buffer","sizeBytes","headers","cloned","putPdf","putPreview","putDownloadRecord","runLruPruneAndEmit","err","quotaExceeded","cmd","setPinnedTxIds"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { B as BookData, a as FilePhase, F as FileState, H as HydratePayload, P as PruningState, R as RenderState, W as WorkerCommand, b as WorkerMessage, d as downloadState } from '../state-
|
|
1
|
+
export { B as BookData, a as FilePhase, F as FileState, H as HydratePayload, P as PruningState, R as RenderState, W as WorkerCommand, b as WorkerMessage, d as downloadState } from '../state-CkYavOSt.js';
|
|
2
2
|
|
|
3
3
|
interface InitOptions {
|
|
4
4
|
gateways?: string[];
|
|
@@ -12,10 +12,13 @@ interface InitOptions {
|
|
|
12
12
|
}
|
|
13
13
|
declare function preloadWorkersV2(): void;
|
|
14
14
|
declare const InitDownloaderV2: (opts?: InitOptions) => Promise<void>;
|
|
15
|
+
/** Replace the app-controlled pin set (the auto-pinned open book is kept in addition). */
|
|
16
|
+
declare const SetPinnedPdfs: (txIds: string[]) => void;
|
|
15
17
|
declare const GetPdf: (txId: string) => Promise<Response>;
|
|
16
18
|
declare const GetImage: (txId: string) => Promise<Response>;
|
|
17
19
|
declare const EnsurePageImage: (txId: string, page: number) => Promise<Response>;
|
|
18
20
|
declare const EnsurePdf: (txId: string) => Promise<void>;
|
|
21
|
+
declare const EnsurePageCount: (txId: string) => Promise<number>;
|
|
19
22
|
declare const DownloadPdfToDisk: (txId: string, filename: string) => Promise<void>;
|
|
20
23
|
declare const GetObjectUrl: (resp: Response) => Promise<string>;
|
|
21
24
|
declare const revokeObjectUrl: (url: string) => void;
|
|
@@ -31,6 +34,31 @@ interface BookData {
|
|
|
31
34
|
}
|
|
32
35
|
declare const getBookData: (txId: string) => Promise<BookData | undefined>;
|
|
33
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Thrown by EnsurePdf()/EnsureGetPdf() (via the orchestrator) when a download
|
|
39
|
+
* failed because Cache Storage rejected the write with QuotaExceededError.
|
|
40
|
+
* Distinguishes "disk is full" from any other download failure (network,
|
|
41
|
+
* decrypt, gateway 404) so callers can react differently — e.g. stop
|
|
42
|
+
* retrying and prompt the user to free space, instead of treating it as a
|
|
43
|
+
* one-off per-book fetch error.
|
|
44
|
+
*/
|
|
45
|
+
declare class DownloadQuotaExceededError extends Error {
|
|
46
|
+
readonly txId: string;
|
|
47
|
+
constructor(txId: string, message?: string);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** `detail` of the window `ARWEAVE_DOWNLOAD_PROGRESS` event — listeners type their handler with it. */
|
|
51
|
+
interface DownloadProgressDetail {
|
|
52
|
+
txId: string;
|
|
53
|
+
loaded: number;
|
|
54
|
+
total?: number;
|
|
55
|
+
}
|
|
56
|
+
/** `detail` of the window `ARWEAVE_DOWNLOAD_DONE` event. */
|
|
57
|
+
interface DownloadDoneDetail {
|
|
58
|
+
txId: string;
|
|
59
|
+
mime: 'pdf' | 'preview';
|
|
60
|
+
}
|
|
61
|
+
|
|
34
62
|
declare const CACHE_VERSION = 1;
|
|
35
63
|
declare const CACHES: {
|
|
36
64
|
readonly pdf: "dl2-pdf-v1";
|
|
@@ -42,4 +70,4 @@ declare const pdfKey: (txId: string) => string;
|
|
|
42
70
|
declare const previewKey: (txId: string) => string;
|
|
43
71
|
declare const pageKey: (txId: string, n: number) => string;
|
|
44
72
|
|
|
45
|
-
export { CACHES, CACHE_VERSION, DL2_SW_VERSION, DownloadPdfToDisk, EnsurePageImage, EnsurePdf, GetImage, GetObjectUrl, GetPdf, InitDownloaderV2, type InitOptions, getBookData, pageKey, pdfKey, preloadWorkersV2, previewKey, revokeObjectUrl, storageEstimate };
|
|
73
|
+
export { CACHES, CACHE_VERSION, DL2_SW_VERSION, type DownloadDoneDetail, DownloadPdfToDisk, type DownloadProgressDetail, DownloadQuotaExceededError, EnsurePageCount, EnsurePageImage, EnsurePdf, GetImage, GetObjectUrl, GetPdf, InitDownloaderV2, type InitOptions, SetPinnedPdfs, getBookData, pageKey, pdfKey, preloadWorkersV2, previewKey, revokeObjectUrl, storageEstimate };
|