@seedprotocol/sdk 0.7.10 → 0.7.11-next.1384.g8b47246
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 +1 -1
- package/dist/{Item-oPnmIehk.js → Item-Ld1iPicQ.js} +2051 -412
- package/dist/Item-Ld1iPicQ.js.map +1 -0
- package/dist/{ModelProperty-D2vJozmW.js → ModelProperty-C8gTx4pO.js} +32 -33
- package/dist/ModelProperty-C8gTx4pO.js.map +1 -0
- package/dist/{Schema-BMXRF4j9.js → Schema-BzeBUZxi.js} +19 -19
- package/dist/{Schema-BMXRF4j9.js.map → Schema-BzeBUZxi.js.map} +1 -1
- package/dist/{SchemaValidationService-CieGrj5c.js → SchemaValidationService-CW0s7V7R.js} +5 -6
- package/dist/{SchemaValidationService-CieGrj5c.js.map → SchemaValidationService-CW0s7V7R.js.map} +1 -1
- package/dist/arweaveContentTags-Bh4wCTal.js +51 -0
- package/dist/arweaveContentTags-Bh4wCTal.js.map +1 -0
- package/dist/dist/{index.node-BfiBriEq.d.ts → index.node-DV1OXCp0.d.ts} +25 -29
- package/dist/dist/{index.node-BfiBriEq.d.ts.map → index.node-DV1OXCp0.d.ts.map} +1 -1
- package/dist/dist/platform.node.d.ts +1 -1
- package/dist/download-Cvac_VGu.js +394 -0
- package/dist/download-Cvac_VGu.js.map +1 -0
- package/dist/{eas-FZPPqxqe.js → eas-CdhfODXL.js} +10 -11
- package/dist/{eas-FZPPqxqe.js.map → eas-CdhfODXL.js.map} +1 -1
- package/dist/ensureImageLocal-DNM6c2yD.js +176 -0
- package/dist/ensureImageLocal-DNM6c2yD.js.map +1 -0
- package/dist/{errors-CnT0fSMK.js → errors-DKxFSvb3.js} +179 -87
- package/dist/errors-DKxFSvb3.js.map +1 -0
- package/dist/{getPublishPayload-DKuEaq96.js → getPublishPayload-CLrAcZwr.js} +7 -7
- package/dist/{getPublishPayload-DKuEaq96.js.map → getPublishPayload-CLrAcZwr.js.map} +1 -1
- package/dist/{getPublishPendingDiff-CH5xLMjU.js → getPublishPendingDiff-DiPff8pS.js} +12 -13
- package/dist/{getPublishPendingDiff-CH5xLMjU.js.map → getPublishPendingDiff-DiPff8pS.js.map} +1 -1
- package/dist/{getPublishUploads-DivYpgNw.js → getPublishUploads-DFcgc27c.js} +6 -5
- package/dist/{getPublishUploads-DivYpgNw.js.map → getPublishUploads-DFcgc27c.js.map} +1 -1
- package/dist/index-9udoYObJ.js +25 -0
- package/dist/index-9udoYObJ.js.map +1 -0
- package/dist/{index-Gh42_47r.js → index-Cdm7Q7el.js} +17 -15
- package/dist/index-Cdm7Q7el.js.map +1 -0
- package/dist/{index-DXRhFg1N.js → index-CghAYA-z.js} +6 -7
- package/dist/index-CghAYA-z.js.map +1 -0
- package/dist/{index.browser-DQstVvRV.js → index.browser-D9oC-KKx.js} +41 -40
- package/dist/index.browser-D9oC-KKx.js.map +1 -0
- package/dist/{index.node-BfiBriEq.js → index.node-DV1OXCp0.js} +7 -31
- package/dist/index.node-DV1OXCp0.js.map +1 -0
- package/dist/main.js +19 -16
- package/dist/main.js.map +1 -1
- package/dist/{modelPropertyRecordSchemas-DEe-lYhn.js → modelPropertyRecordSchemas-se4QMXSi.js} +9 -12
- package/dist/{modelPropertyRecordSchemas-DEe-lYhn.js.map → modelPropertyRecordSchemas-se4QMXSi.js.map} +1 -1
- package/dist/node.js +6 -7
- package/dist/node.js.map +1 -1
- package/dist/platform.browser.js +7 -8
- package/dist/platform.browser.js.map +1 -1
- package/dist/platform.node.js +1 -1
- package/dist/{property-iNW1N3vm.js → property-Broz_CWj.js} +8 -11
- package/dist/property-Broz_CWj.js.map +1 -0
- package/dist/{publishGraph-CRn_N3NT.js → publishGraph-DnWoWZRP.js} +4 -4
- package/dist/{publishGraph-CRn_N3NT.js.map → publishGraph-DnWoWZRP.js.map} +1 -1
- package/dist/{readHtmlBodyForStorageSeed-B7HgPmq6.js → readHtmlBodyForStorageSeed-FvwYPn4m.js} +9 -11
- package/dist/{readHtmlBodyForStorageSeed-B7HgPmq6.js.map → readHtmlBodyForStorageSeed-FvwYPn4m.js.map} +1 -1
- package/dist/src/Item/Item.d.ts.map +1 -1
- package/dist/src/ItemProperty/ItemProperty.d.ts.map +1 -1
- package/dist/src/ItemProperty/service/actors/initialize.d.ts.map +1 -1
- package/dist/src/Model/index.d.ts +0 -2
- package/dist/src/Model/index.d.ts.map +1 -1
- package/dist/src/browser/helpers/FileManager.d.ts +1 -3
- package/dist/src/browser/helpers/FileManager.d.ts.map +1 -1
- package/dist/src/browser/workers/FileDownloader.d.ts +1 -0
- package/dist/src/browser/workers/FileDownloader.d.ts.map +1 -1
- package/dist/src/browser/workers/ImageResizer.d.ts +1 -0
- package/dist/src/browser/workers/ImageResizer.d.ts.map +1 -1
- package/dist/src/client/actors/addModelsToDb.d.ts.map +1 -1
- package/dist/src/client/actors/saveAppState.d.ts.map +1 -1
- package/dist/src/client/actors/saveConfig.d.ts.map +1 -1
- package/dist/src/db/read/metadataProperty.d.ts +1 -1
- package/dist/src/db/read/metadataProperty.d.ts.map +1 -1
- package/dist/src/db/read/resolveModelRecord.d.ts +0 -20
- package/dist/src/db/read/resolveModelRecord.d.ts.map +1 -1
- package/dist/src/db/write/createMetadata.d.ts +1 -8
- package/dist/src/db/write/createMetadata.d.ts.map +1 -1
- package/dist/src/db/write/removeLocalCopiesForAddresses.d.ts +0 -5
- package/dist/src/db/write/removeLocalCopiesForAddresses.d.ts.map +1 -1
- package/dist/src/db/write/updateItemPropertyValue.d.ts.map +1 -1
- package/dist/src/events/files/download.d.ts.map +1 -1
- package/dist/src/events/item/syncDbWithEas.d.ts.map +1 -1
- package/dist/src/helpers/easPropertyCanonical.d.ts +1 -1
- package/dist/src/helpers/easPropertyCanonical.d.ts.map +1 -1
- package/dist/src/helpers/entity/entityLifecycle.d.ts +0 -2
- package/dist/src/helpers/entity/entityLifecycle.d.ts.map +1 -1
- package/dist/src/helpers/environment.d.ts +0 -13
- package/dist/src/helpers/environment.d.ts.map +1 -1
- package/dist/src/helpers/index.d.ts +0 -4
- package/dist/src/helpers/index.d.ts.map +1 -1
- package/dist/src/helpers/itemStorageFile.d.ts +0 -11
- package/dist/src/helpers/itemStorageFile.d.ts.map +1 -1
- package/dist/src/helpers/propertySchemaUid.d.ts +7 -5
- package/dist/src/helpers/propertySchemaUid.d.ts.map +1 -1
- package/dist/src/helpers/storageDir.d.ts +0 -2
- package/dist/src/helpers/storageDir.d.ts.map +1 -1
- package/dist/src/node/db/Db.d.ts +0 -2
- package/dist/src/node/db/Db.d.ts.map +1 -1
- package/dist/src/node/helpers/FileManager.d.ts +0 -2
- package/dist/src/node/helpers/FileManager.d.ts.map +1 -1
- package/dist/src/node/index.d.ts +2 -2
- package/dist/src/node/index.d.ts.map +1 -1
- package/dist/src/outbox/index.d.ts +5 -5
- package/dist/src/outbox/index.d.ts.map +1 -1
- package/dist/{syncDbWithEas-FuyqoEKk.js → syncDbWithEas-Dj_8VqM7.js} +24 -23
- package/dist/syncDbWithEas-Dj_8VqM7.js.map +1 -0
- package/dist/tabEvents-BnBzIdEi.js +1408 -0
- package/dist/tabEvents-BnBzIdEi.js.map +1 -0
- package/dist/{tolerantWebAccess-zEseJ2zT.js → tolerantWebAccess-CNfvmR3m.js} +8 -9
- package/dist/{tolerantWebAccess-zEseJ2zT.js.map → tolerantWebAccess-CNfvmR3m.js.map} +1 -1
- package/dist/{updateSeedRevokedAt-B9JRwr5T.js → updateSeedRevokedAt-D-3SLW-D.js} +3 -2
- package/dist/{updateSeedRevokedAt-B9JRwr5T.js.map → updateSeedRevokedAt-D-3SLW-D.js.map} +1 -1
- package/package.json +7 -12
- package/dist/Item-oPnmIehk.js.map +0 -1
- package/dist/ModelProperty-D2vJozmW.js.map +0 -1
- package/dist/errors-CnT0fSMK.js.map +0 -1
- package/dist/index-CZMWKXLM.js +0 -27
- package/dist/index-CZMWKXLM.js.map +0 -1
- package/dist/index-DXRhFg1N.js.map +0 -1
- package/dist/index-Gh42_47r.js.map +0 -1
- package/dist/index.browser-DQstVvRV.js.map +0 -1
- package/dist/index.node-BfiBriEq.js.map +0 -1
- package/dist/property-iNW1N3vm.js.map +0 -1
- package/dist/src/db/read/getItemProperty.d.ts +0 -6
- package/dist/src/db/read/getItemProperty.d.ts.map +0 -1
- package/dist/src/db/read/isSeedRevoked.d.ts +0 -7
- package/dist/src/db/read/isSeedRevoked.d.ts.map +0 -1
- package/dist/src/db/write/saveMetadata.d.ts +0 -3
- package/dist/src/db/write/saveMetadata.d.ts.map +0 -1
- package/dist/src/db/write/updateMetadata.d.ts +0 -13
- package/dist/src/db/write/updateMetadata.d.ts.map +0 -1
- package/dist/src/types/fileManager.d.ts +0 -13
- package/dist/src/types/fileManager.d.ts.map +0 -1
- package/dist/syncDbWithEas-FuyqoEKk.js.map +0 -1
- package/dist/tabEvents-DT5ez6io.js +0 -3830
- package/dist/tabEvents-DT5ez6io.js.map +0 -1
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import { B as BaseDb, m as metadata, w as BaseFileManager, a as appState } from './BaseFileManager-DLou1TZS.js';
|
|
2
|
+
import { and, isNotNull, inArray, eq, or } from 'drizzle-orm';
|
|
3
|
+
import { U as getItemStorageSubdir, V as getAllAddressesFromDb, W as whenDbReady } from './Item-Ld1iPicQ.js';
|
|
4
|
+
import { ensureReadGatewaySelected, getArweaveReadBaseUrls, BaseArweaveClient, getTransactionTagsByIds } from '@seedprotocol/arweave';
|
|
5
|
+
import 'pluralize';
|
|
6
|
+
import { BaseQueryClient, BaseEasClient, GET_FILES_METADATA } from '@seedprotocol/eas';
|
|
7
|
+
import { s as supportsOpfsFileDownloads } from './tabEvents-BnBzIdEi.js';
|
|
8
|
+
import debug from 'debug';
|
|
9
|
+
import { C as CONTENT_SHA256_TAG } from './arweaveContentTags-Bh4wCTal.js';
|
|
10
|
+
import { throttle } from 'lodash-es';
|
|
11
|
+
import 'drizzle-orm/sqlite-core';
|
|
12
|
+
import 'xstate';
|
|
13
|
+
import 'rxjs';
|
|
14
|
+
import '@sinclair/typebox';
|
|
15
|
+
import 'nanoid';
|
|
16
|
+
import 'nanoid-dictionary';
|
|
17
|
+
import '@noble/hashes/sha256';
|
|
18
|
+
import '@noble/hashes/sha3';
|
|
19
|
+
import '@noble/hashes/utils';
|
|
20
|
+
|
|
21
|
+
/** Rows per query: well under SQLite's bound-parameter limit. */
|
|
22
|
+
const CHUNK_SIZE = 400;
|
|
23
|
+
/**
|
|
24
|
+
* Where the download worker saves each child of a composite upload, by transaction id then child
|
|
25
|
+
* (property) name: a path relative to the files root.
|
|
26
|
+
*
|
|
27
|
+
* The paths come from the ItemStorage rows sync derives from a `storage_transaction_id`
|
|
28
|
+
* attestation (see `createMetadataRecordsForStorageTransactionId`): property value = the
|
|
29
|
+
* transaction id, `refResolvedValue` = `<txId><extension>`, `localStorageDir` = the model's storage
|
|
30
|
+
* directory. Those rows are what hydration reads, so a child saved here is found as that property's
|
|
31
|
+
* file. Transactions with no such rows are left out; the worker then falls back to the legacy
|
|
32
|
+
* html / json layout.
|
|
33
|
+
*/
|
|
34
|
+
const getCompositeChildPaths = async (transactionIds) => {
|
|
35
|
+
const out = {};
|
|
36
|
+
const appDb = BaseDb.getAppDb();
|
|
37
|
+
if (!appDb || transactionIds.length === 0)
|
|
38
|
+
return out;
|
|
39
|
+
for (let i = 0; i < transactionIds.length; i += CHUNK_SIZE) {
|
|
40
|
+
const chunk = transactionIds.slice(i, i + CHUNK_SIZE);
|
|
41
|
+
const rows = await appDb
|
|
42
|
+
.select({
|
|
43
|
+
transactionId: metadata.propertyValue,
|
|
44
|
+
propertyName: metadata.propertyName,
|
|
45
|
+
refResolvedValue: metadata.refResolvedValue,
|
|
46
|
+
localStorageDir: metadata.localStorageDir,
|
|
47
|
+
})
|
|
48
|
+
.from(metadata)
|
|
49
|
+
.where(and(isNotNull(metadata.derivedFromUid), isNotNull(metadata.refResolvedValue), inArray(metadata.propertyValue, chunk)));
|
|
50
|
+
for (const row of rows) {
|
|
51
|
+
const { transactionId, propertyName, refResolvedValue } = row;
|
|
52
|
+
if (!transactionId || !propertyName || !refResolvedValue)
|
|
53
|
+
continue;
|
|
54
|
+
// A file name, never a path: anything else is not where the SDK would look.
|
|
55
|
+
if (refResolvedValue.includes('/') || refResolvedValue.includes('\\'))
|
|
56
|
+
continue;
|
|
57
|
+
const byName = (out[transactionId] ?? (out[transactionId] = {}));
|
|
58
|
+
byName[propertyName] ?? (byName[propertyName] = `${getItemStorageSubdir(row.localStorageDir)}/${refResolvedValue}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const logger = debug('seedSdk:files:download');
|
|
65
|
+
const AUTO_BULK_DOWNLOAD_THROTTLE_MS = 10000;
|
|
66
|
+
/** Avoid refetch-on-every-call: transient empty indexer responses were overwriting good cache (see trailing throttle ~10s after success). */
|
|
67
|
+
const GET_FILES_METADATA_STALE_MS = 120000;
|
|
68
|
+
let bulkDownloadInFlight = null;
|
|
69
|
+
const lazyDownloadInFlightByTransactionId = new Map();
|
|
70
|
+
const getExcludedTransactions = async () => {
|
|
71
|
+
const appDb = await whenDbReady();
|
|
72
|
+
if (!appDb) {
|
|
73
|
+
return new Set();
|
|
74
|
+
}
|
|
75
|
+
const excludedTransactionsQuery = await appDb
|
|
76
|
+
.select()
|
|
77
|
+
.from(appState)
|
|
78
|
+
.where(eq(appState.key, 'excludedTransactions'));
|
|
79
|
+
const excludedTransactions = new Set();
|
|
80
|
+
if (excludedTransactionsQuery && excludedTransactionsQuery.length === 1) {
|
|
81
|
+
const valueString = excludedTransactionsQuery[0].value;
|
|
82
|
+
if (valueString) {
|
|
83
|
+
const excludedTransactionsArray = JSON.parse(valueString);
|
|
84
|
+
for (const txId of excludedTransactionsArray) {
|
|
85
|
+
excludedTransactions.add(txId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return excludedTransactions;
|
|
90
|
+
};
|
|
91
|
+
/** Arweave transaction ids are 43 chars in the URL-safe base64 alphabet. */
|
|
92
|
+
const ARWEAVE_TX_ID_RE = /^[a-z0-9_-]{43}$/i;
|
|
93
|
+
const normalizeArweaveTxId = (raw) => {
|
|
94
|
+
if (raw == null || raw === '')
|
|
95
|
+
return undefined;
|
|
96
|
+
const t = String(raw).trim();
|
|
97
|
+
if (ARWEAVE_TX_ID_RE.test(t))
|
|
98
|
+
return t;
|
|
99
|
+
const m = t.match(/^([a-z0-9_-]{43})(?:\.[^/]+)?$/i);
|
|
100
|
+
if (m)
|
|
101
|
+
return m[1];
|
|
102
|
+
// Values may be full gateway URLs or paths; scan for an embedded tx id. It must be 43 characters
|
|
103
|
+
// on its own, not the start of a longer run: the first 43 of a bytes32 value (`0x0000…0020`,
|
|
104
|
+
// an EAS UID) are in the alphabet too.
|
|
105
|
+
const embedded = t.match(/(?<![a-z0-9_-])[a-z0-9_-]{43}(?![a-z0-9_-])/gi);
|
|
106
|
+
return embedded?.[0];
|
|
107
|
+
};
|
|
108
|
+
const mergeAddressLists = (a, b) => {
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
const out = [];
|
|
111
|
+
for (const addr of [...(a ?? []), ...(b ?? [])]) {
|
|
112
|
+
if (!addr || !addr.trim())
|
|
113
|
+
continue;
|
|
114
|
+
const k = addr.toLowerCase();
|
|
115
|
+
if (seen.has(k))
|
|
116
|
+
continue;
|
|
117
|
+
seen.add(k);
|
|
118
|
+
out.push(addr);
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
};
|
|
122
|
+
const collectTransactionIdsFromLocalMetadata = async () => {
|
|
123
|
+
const appDb = await whenDbReady();
|
|
124
|
+
if (!appDb) {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
const nameOr = or(eq(metadata.propertyName, 'storageTransactionId'), eq(metadata.propertyName, 'storage_transaction_id'), eq(metadata.propertyName, 'transactionId'));
|
|
128
|
+
const propRows = await appDb
|
|
129
|
+
.select({ propertyValue: metadata.propertyValue })
|
|
130
|
+
.from(metadata)
|
|
131
|
+
.where(and(nameOr, isNotNull(metadata.propertyValue)));
|
|
132
|
+
const refRows = await appDb
|
|
133
|
+
.select({ refResolvedValue: metadata.refResolvedValue })
|
|
134
|
+
.from(metadata)
|
|
135
|
+
.where(isNotNull(metadata.refResolvedValue));
|
|
136
|
+
const ids = new Set();
|
|
137
|
+
for (const row of propRows) {
|
|
138
|
+
const id = normalizeArweaveTxId(row.propertyValue ?? undefined);
|
|
139
|
+
if (id)
|
|
140
|
+
ids.add(id);
|
|
141
|
+
}
|
|
142
|
+
for (const row of refRows) {
|
|
143
|
+
const id = normalizeArweaveTxId(row.refResolvedValue ?? undefined);
|
|
144
|
+
if (id)
|
|
145
|
+
ids.add(id);
|
|
146
|
+
}
|
|
147
|
+
return Array.from(ids);
|
|
148
|
+
};
|
|
149
|
+
const parseTransactionIdsFromMetadata = (filesMetadata, excludedTransactions) => {
|
|
150
|
+
const transactionIds = [];
|
|
151
|
+
for (const fileMetadata of filesMetadata) {
|
|
152
|
+
// Validate and parse decodedDataJson
|
|
153
|
+
if (!fileMetadata.decodedDataJson || fileMetadata.decodedDataJson.trim() === '') {
|
|
154
|
+
console.warn('[events/files] [download] empty decodedDataJson for fileMetadata: ', fileMetadata.id);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
let json;
|
|
158
|
+
try {
|
|
159
|
+
json = JSON.parse(fileMetadata.decodedDataJson);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.warn('[events/files] [download] failed to parse decodedDataJson for fileMetadata: ', fileMetadata.id, error);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (!Array.isArray(json) || json.length === 0 || !json[0]?.value?.value) {
|
|
166
|
+
console.warn('[events/files] [download] invalid decodedDataJson structure for fileMetadata: ', fileMetadata.id);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const rawTx = json[0].value.value;
|
|
170
|
+
if (typeof rawTx !== 'string' || rawTx.trim().length === 0) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const transactionId = normalizeArweaveTxId(rawTx.trim());
|
|
174
|
+
if (!transactionId) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (excludedTransactions.has(transactionId) || excludedTransactions.has(rawTx.trim())) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
transactionIds.push(transactionId);
|
|
181
|
+
}
|
|
182
|
+
return transactionIds;
|
|
183
|
+
};
|
|
184
|
+
/** How long looked-up transaction tags stay cached. */
|
|
185
|
+
const TRANSACTION_TAGS_CACHE_MS = 5 * 60 * 1000;
|
|
186
|
+
/** Content-SHA-256 tag values for the transactions that have one, from one batched tag lookup (cached). */
|
|
187
|
+
const getExpectedContentHashes = async (transactionIds) => {
|
|
188
|
+
const queryClient = BaseQueryClient.getQueryClient();
|
|
189
|
+
const tagsById = new Map();
|
|
190
|
+
const toFetch = [];
|
|
191
|
+
for (const transactionId of transactionIds) {
|
|
192
|
+
// Tags never change once a transaction is indexed, so a cached lookup stays good.
|
|
193
|
+
const cached = queryClient.getQueryData?.(['getTransactionTags', transactionId]);
|
|
194
|
+
if (cached)
|
|
195
|
+
tagsById.set(transactionId, cached);
|
|
196
|
+
else
|
|
197
|
+
toFetch.push(transactionId);
|
|
198
|
+
}
|
|
199
|
+
if (toFetch.length > 0) {
|
|
200
|
+
try {
|
|
201
|
+
const fetched = await getTransactionTagsByIds(toFetch, {
|
|
202
|
+
client: BaseArweaveClient.getArweaveClient(),
|
|
203
|
+
onError: (error) => logger('[download] transaction tags lookup failed', error),
|
|
204
|
+
});
|
|
205
|
+
for (const [transactionId, tags] of fetched) {
|
|
206
|
+
tagsById.set(transactionId, tags);
|
|
207
|
+
// Seed the per-transaction cache entry (the client interface has no setQueryData).
|
|
208
|
+
void queryClient
|
|
209
|
+
.fetchQuery({
|
|
210
|
+
queryKey: ['getTransactionTags', transactionId],
|
|
211
|
+
queryFn: async () => tags,
|
|
212
|
+
// The query client keeps a result only as long as the caller's staleTime.
|
|
213
|
+
staleTime: TRANSACTION_TAGS_CACHE_MS,
|
|
214
|
+
})
|
|
215
|
+
.catch(() => { });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
logger('[download] transaction tags lookup failed', error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const out = {};
|
|
223
|
+
for (const [transactionId, tags] of tagsById) {
|
|
224
|
+
const value = tags.find((tag) => tag.name === CONTENT_SHA256_TAG)?.value?.trim();
|
|
225
|
+
if (value)
|
|
226
|
+
out[transactionId] = value;
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
};
|
|
230
|
+
const downloadTransactionIds = async (rawTransactionIds, options) => {
|
|
231
|
+
if (!supportsOpfsFileDownloads()) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
const transactionIds = Array.from(new Set(rawTransactionIds.filter((tx) => !!tx && tx.trim().length > 0)));
|
|
235
|
+
if (transactionIds.length === 0) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
const excludedTransactions = await getExcludedTransactions();
|
|
239
|
+
await ensureReadGatewaySelected();
|
|
240
|
+
// Browser: do not call getTransactionStatus() — many gateways (e.g. g8way.io) redirect or omit
|
|
241
|
+
// CORS headers, so fetch() fails and we would wrongly exclude txs. The OPFS worker fetch decides success.
|
|
242
|
+
const transactionIdsToDownload = transactionIds.filter((id) => !excludedTransactions.has(id));
|
|
243
|
+
if (transactionIdsToDownload.length === 0) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
// One batched lookup for every upload's Content-SHA-256 tag; downloads are verified against it.
|
|
247
|
+
// Missing tags (old uploads, or a just-published one not indexed yet) just mean no verification.
|
|
248
|
+
const expectedContentHashes = await getExpectedContentHashes(transactionIdsToDownload);
|
|
249
|
+
// Preferred gateways first: a just-published item is only on the gateway it was uploaded through.
|
|
250
|
+
const arweaveBaseUrls = getArweaveReadBaseUrls();
|
|
251
|
+
// Where each ItemStorage child of a composite goes (the worker cannot read the DB or the schema).
|
|
252
|
+
const compositeChildPaths = await getCompositeChildPaths(transactionIdsToDownload).catch((error) => {
|
|
253
|
+
logger('[download] composite child paths lookup failed', error);
|
|
254
|
+
return {};
|
|
255
|
+
});
|
|
256
|
+
let result;
|
|
257
|
+
if (transactionIdsToDownload.length === 1) {
|
|
258
|
+
const transactionId = transactionIdsToDownload[0];
|
|
259
|
+
result = await BaseFileManager.downloadFileByTransactionId({
|
|
260
|
+
transactionId,
|
|
261
|
+
arweaveHost: BaseArweaveClient.getBaseUrl(),
|
|
262
|
+
arweaveBaseUrls,
|
|
263
|
+
excludedTransactions,
|
|
264
|
+
expectedContentHash: expectedContentHashes[transactionId],
|
|
265
|
+
compositeChildPaths: compositeChildPaths[transactionId],
|
|
266
|
+
skipExisting: options?.skipExisting,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
result = await BaseFileManager.downloadAllFiles({
|
|
271
|
+
transactionIds: transactionIdsToDownload,
|
|
272
|
+
arweaveHost: BaseArweaveClient.getBaseUrl(),
|
|
273
|
+
arweaveBaseUrls,
|
|
274
|
+
excludedTransactions,
|
|
275
|
+
expectedContentHashes,
|
|
276
|
+
compositeChildPaths,
|
|
277
|
+
skipExisting: options?.skipExisting,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
if (result) {
|
|
281
|
+
for (const transactionId of result.hashMismatchTransactionIds) {
|
|
282
|
+
// Not saved by the worker; left for a later run (a gateway may serve the right bytes then).
|
|
283
|
+
logger(`[download] ${transactionId}: downloaded bytes do not match Content-SHA-256; skipped`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return true;
|
|
287
|
+
};
|
|
288
|
+
const runBulkDownloadWithDedupe = async (transactionIds) => {
|
|
289
|
+
if (bulkDownloadInFlight) {
|
|
290
|
+
return bulkDownloadInFlight;
|
|
291
|
+
}
|
|
292
|
+
bulkDownloadInFlight = (async () => {
|
|
293
|
+
try {
|
|
294
|
+
await downloadTransactionIds(transactionIds, { skipExisting: true });
|
|
295
|
+
}
|
|
296
|
+
finally {
|
|
297
|
+
bulkDownloadInFlight = null;
|
|
298
|
+
}
|
|
299
|
+
})();
|
|
300
|
+
return bulkDownloadInFlight;
|
|
301
|
+
};
|
|
302
|
+
const downloadAllFilesBinaryRequestHandler = async (addressesHint) => {
|
|
303
|
+
if (!supportsOpfsFileDownloads()) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
// Waits for init to open the database, if it hasn't yet
|
|
307
|
+
const fromDb = await getAllAddressesFromDb();
|
|
308
|
+
const addresses = mergeAddressLists(addressesHint, fromDb);
|
|
309
|
+
if (!addresses || addresses.length === 0) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const queryClient = BaseQueryClient.getQueryClient();
|
|
313
|
+
const easClient = BaseEasClient.getEasClient();
|
|
314
|
+
const filesMetadataQueryKey = ['getFilesMetadata', ...addresses];
|
|
315
|
+
const fetchFilesMetadata = () => easClient.request(GET_FILES_METADATA, {
|
|
316
|
+
where: {
|
|
317
|
+
attester: {
|
|
318
|
+
in: addresses,
|
|
319
|
+
},
|
|
320
|
+
schema: {
|
|
321
|
+
is: {
|
|
322
|
+
id: {
|
|
323
|
+
equals: '0x55fdefb36fcbbaebeb7d6b41dc3a1a9666e4e42154267c889de064faa7ede517',
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
let { filesMetadata } = await queryClient.fetchQuery({
|
|
330
|
+
queryKey: filesMetadataQueryKey,
|
|
331
|
+
queryFn: fetchFilesMetadata,
|
|
332
|
+
staleTime: GET_FILES_METADATA_STALE_MS,
|
|
333
|
+
});
|
|
334
|
+
if ((!Array.isArray(filesMetadata) || filesMetadata.length === 0) && addresses.length > 0) {
|
|
335
|
+
await queryClient.removeQueries({ queryKey: filesMetadataQueryKey });
|
|
336
|
+
({ filesMetadata } = await queryClient.fetchQuery({
|
|
337
|
+
queryKey: filesMetadataQueryKey,
|
|
338
|
+
queryFn: fetchFilesMetadata,
|
|
339
|
+
staleTime: GET_FILES_METADATA_STALE_MS,
|
|
340
|
+
}));
|
|
341
|
+
}
|
|
342
|
+
const filesRoot = BaseFileManager.getWorkingDir();
|
|
343
|
+
await BaseFileManager.createDirIfNotExists(filesRoot);
|
|
344
|
+
await BaseFileManager.createDirIfNotExists(BaseFileManager.getFilesPath('html'));
|
|
345
|
+
await BaseFileManager.createDirIfNotExists(BaseFileManager.getFilesPath('json'));
|
|
346
|
+
await BaseFileManager.createDirIfNotExists(BaseFileManager.getFilesPath('images'));
|
|
347
|
+
await BaseFileManager.createDirIfNotExists(BaseFileManager.getFilesPath('files'));
|
|
348
|
+
const excludedTransactions = await getExcludedTransactions();
|
|
349
|
+
const fromEas = parseTransactionIdsFromMetadata(filesMetadata ?? [], excludedTransactions);
|
|
350
|
+
const fromLocal = await collectTransactionIdsFromLocalMetadata();
|
|
351
|
+
const transactionIds = Array.from(new Set([...fromEas, ...fromLocal]));
|
|
352
|
+
await runBulkDownloadWithDedupe(transactionIds);
|
|
353
|
+
};
|
|
354
|
+
const downloadTransactionIdWithDedupe = async (transactionId) => {
|
|
355
|
+
if (!supportsOpfsFileDownloads() || !transactionId || transactionId.trim().length === 0) {
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
const normalizedTxId = normalizeArweaveTxId(transactionId);
|
|
359
|
+
if (!normalizedTxId) {
|
|
360
|
+
logger(`[download] not an Arweave transaction id: ${transactionId}`);
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
const existing = lazyDownloadInFlightByTransactionId.get(normalizedTxId);
|
|
364
|
+
if (existing) {
|
|
365
|
+
return existing;
|
|
366
|
+
}
|
|
367
|
+
const inFlight = (async () => {
|
|
368
|
+
try {
|
|
369
|
+
// No skipExisting: the caller found no local file, so a file on disk it could not see is
|
|
370
|
+
// written again and announced.
|
|
371
|
+
const ok = await downloadTransactionIds([normalizedTxId]);
|
|
372
|
+
return ok;
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
lazyDownloadInFlightByTransactionId.delete(normalizedTxId);
|
|
376
|
+
}
|
|
377
|
+
})();
|
|
378
|
+
lazyDownloadInFlightByTransactionId.set(normalizedTxId, inFlight);
|
|
379
|
+
return inFlight;
|
|
380
|
+
};
|
|
381
|
+
const scheduleBulkFilesDownloadFromEasSyncThrottled = throttle((addressesHint) => {
|
|
382
|
+
void downloadAllFilesBinaryRequestHandler(addressesHint).catch((error) => {
|
|
383
|
+
logger('[scheduleBulkFilesDownloadFromEasSync] failed', error);
|
|
384
|
+
});
|
|
385
|
+
}, AUTO_BULK_DOWNLOAD_THROTTLE_MS, { leading: true, trailing: false });
|
|
386
|
+
const scheduleBulkFilesDownloadFromEasSync = (addressesHint) => {
|
|
387
|
+
if (!supportsOpfsFileDownloads()) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
scheduleBulkFilesDownloadFromEasSyncThrottled(addressesHint);
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
export { downloadAllFilesBinaryRequestHandler, downloadTransactionIdWithDedupe, scheduleBulkFilesDownloadFromEasSync };
|
|
394
|
+
//# sourceMappingURL=download-Cvac_VGu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-Cvac_VGu.js","sources":["../../src/db/read/getCompositeChildPaths.ts","../../src/events/files/download.ts"],"sourcesContent":["import { and, inArray, isNotNull } from 'drizzle-orm'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { metadata } from '@/seedSchema'\nimport { getItemStorageSubdir } from '@/helpers/storageDir'\n\n/** Rows per query: well under SQLite's bound-parameter limit. */\nconst CHUNK_SIZE = 400\n\n/**\n * Where the download worker saves each child of a composite upload, by transaction id then child\n * (property) name: a path relative to the files root.\n *\n * The paths come from the ItemStorage rows sync derives from a `storage_transaction_id`\n * attestation (see `createMetadataRecordsForStorageTransactionId`): property value = the\n * transaction id, `refResolvedValue` = `<txId><extension>`, `localStorageDir` = the model's storage\n * directory. Those rows are what hydration reads, so a child saved here is found as that property's\n * file. Transactions with no such rows are left out; the worker then falls back to the legacy\n * html / json layout.\n */\nexport const getCompositeChildPaths = async (\n transactionIds: string[],\n): Promise<Record<string, Record<string, string>>> => {\n const out: Record<string, Record<string, string>> = {}\n const appDb = BaseDb.getAppDb()\n if (!appDb || transactionIds.length === 0) return out\n\n for (let i = 0; i < transactionIds.length; i += CHUNK_SIZE) {\n const chunk = transactionIds.slice(i, i + CHUNK_SIZE)\n const rows = await appDb\n .select({\n transactionId: metadata.propertyValue,\n propertyName: metadata.propertyName,\n refResolvedValue: metadata.refResolvedValue,\n localStorageDir: metadata.localStorageDir,\n })\n .from(metadata)\n .where(\n and(\n isNotNull(metadata.derivedFromUid),\n isNotNull(metadata.refResolvedValue),\n inArray(metadata.propertyValue, chunk),\n ),\n )\n\n for (const row of rows) {\n const { transactionId, propertyName, refResolvedValue } = row\n if (!transactionId || !propertyName || !refResolvedValue) continue\n // A file name, never a path: anything else is not where the SDK would look.\n if (refResolvedValue.includes('/') || refResolvedValue.includes('\\\\')) continue\n const byName = (out[transactionId] ??= {})\n byName[propertyName] ??= `${getItemStorageSubdir(row.localStorageDir)}/${refResolvedValue}`\n }\n }\n\n return out\n}\n","import { appState } from '@/seedSchema'\nimport { and, eq, isNotNull, or } from 'drizzle-orm'\nimport { getAllAddressesFromDb } from '@/helpers/db'\nimport {\n BaseFileManager,\n} from '@/helpers'\nimport { GET_FILES_METADATA } from '@seedprotocol/eas'\nimport debug from 'debug'\n// Dynamic import to break circular dependency with globalMachine\n// import { getGlobalService } from '@/services/global/globalMachine'\nimport { whenDbReady } from '@/client/readiness'\nimport { metadata } from '@/seedSchema'\nimport { BaseEasClient, BaseQueryClient } from '@seedprotocol/eas'\nimport {\n BaseArweaveClient,\n ensureReadGatewaySelected,\n getArweaveReadBaseUrls,\n getTransactionTagsByIds,\n type TransactionTag,\n} from '@seedprotocol/arweave'\nimport { supportsOpfsFileDownloads } from '@/helpers/environment'\nimport { CONTENT_SHA256_TAG } from '@/helpers/arweaveContentTags'\nimport { getCompositeChildPaths } from '@/db/read/getCompositeChildPaths'\nimport { throttle } from 'lodash-es'\nimport type { DownloadAllFilesResult } from '@/helpers/FileManager/IFileManager'\n\n\nconst logger = debug('seedSdk:files:download')\nconst AUTO_BULK_DOWNLOAD_THROTTLE_MS = 10000\n/** Avoid refetch-on-every-call: transient empty indexer responses were overwriting good cache (see trailing throttle ~10s after success). */\nconst GET_FILES_METADATA_STALE_MS = 120_000\nlet bulkDownloadInFlight: Promise<void> | null = null\nconst lazyDownloadInFlightByTransactionId = new Map<string, Promise<boolean>>()\n\n\nconst getExcludedTransactions = async (): Promise<Set<string>> => {\n const appDb = await whenDbReady()\n if (!appDb) {\n return new Set<string>()\n }\n\n const excludedTransactionsQuery = await appDb\n .select()\n .from(appState)\n .where(eq(appState.key, 'excludedTransactions'))\n\n const excludedTransactions = new Set<string>()\n if (excludedTransactionsQuery && excludedTransactionsQuery.length === 1) {\n const valueString = excludedTransactionsQuery[0].value\n if (valueString) {\n const excludedTransactionsArray = JSON.parse(valueString)\n for (const txId of excludedTransactionsArray) {\n excludedTransactions.add(txId)\n }\n }\n }\n return excludedTransactions\n}\n\n/** Arweave transaction ids are 43 chars in the URL-safe base64 alphabet. */\nconst ARWEAVE_TX_ID_RE = /^[a-z0-9_-]{43}$/i\n\nconst normalizeArweaveTxId = (raw: string | null | undefined): string | undefined => {\n if (raw == null || raw === '') return undefined\n const t = String(raw).trim()\n if (ARWEAVE_TX_ID_RE.test(t)) return t\n const m = t.match(/^([a-z0-9_-]{43})(?:\\.[^/]+)?$/i)\n if (m) return m[1]\n // Values may be full gateway URLs or paths; scan for an embedded tx id. It must be 43 characters\n // on its own, not the start of a longer run: the first 43 of a bytes32 value (`0x0000…0020`,\n // an EAS UID) are in the alphabet too.\n const embedded = t.match(/(?<![a-z0-9_-])[a-z0-9_-]{43}(?![a-z0-9_-])/gi)\n return embedded?.[0]\n}\n\nconst mergeAddressLists = (a: string[] | undefined, b: string[] | undefined): string[] => {\n const seen = new Set<string>()\n const out: string[] = []\n for (const addr of [...(a ?? []), ...(b ?? [])]) {\n if (!addr || !addr.trim()) continue\n const k = addr.toLowerCase()\n if (seen.has(k)) continue\n seen.add(k)\n out.push(addr)\n }\n return out\n}\n\nconst collectTransactionIdsFromLocalMetadata = async (): Promise<string[]> => {\n const appDb = await whenDbReady()\n if (!appDb) {\n return []\n }\n\n const nameOr = or(\n eq(metadata.propertyName, 'storageTransactionId'),\n eq(metadata.propertyName, 'storage_transaction_id'),\n eq(metadata.propertyName, 'transactionId'),\n )\n\n const propRows = await appDb\n .select({ propertyValue: metadata.propertyValue })\n .from(metadata)\n .where(and(nameOr, isNotNull(metadata.propertyValue)))\n\n const refRows = await appDb\n .select({ refResolvedValue: metadata.refResolvedValue })\n .from(metadata)\n .where(isNotNull(metadata.refResolvedValue))\n\n const ids = new Set<string>()\n for (const row of propRows) {\n const id = normalizeArweaveTxId(row.propertyValue ?? undefined)\n if (id) ids.add(id)\n }\n for (const row of refRows) {\n const id = normalizeArweaveTxId(row.refResolvedValue ?? undefined)\n if (id) ids.add(id)\n }\n return Array.from(ids)\n}\n\nconst parseTransactionIdsFromMetadata = (filesMetadata: any[], excludedTransactions: Set<string>): string[] => {\n const transactionIds: string[] = []\n\n for (const fileMetadata of filesMetadata) {\n // Validate and parse decodedDataJson\n if (!fileMetadata.decodedDataJson || fileMetadata.decodedDataJson.trim() === '') {\n console.warn(\n '[events/files] [download] empty decodedDataJson for fileMetadata: ',\n fileMetadata.id,\n )\n continue\n }\n\n let json\n try {\n json = JSON.parse(fileMetadata.decodedDataJson)\n } catch (error) {\n console.warn(\n '[events/files] [download] failed to parse decodedDataJson for fileMetadata: ',\n fileMetadata.id,\n error,\n )\n continue\n }\n\n if (!Array.isArray(json) || json.length === 0 || !json[0]?.value?.value) {\n console.warn(\n '[events/files] [download] invalid decodedDataJson structure for fileMetadata: ',\n fileMetadata.id,\n )\n continue\n }\n\n const rawTx = json[0].value.value\n if (typeof rawTx !== 'string' || rawTx.trim().length === 0) {\n continue\n }\n const transactionId = normalizeArweaveTxId(rawTx.trim())\n if (!transactionId) {\n continue\n }\n if (excludedTransactions.has(transactionId) || excludedTransactions.has(rawTx.trim())) {\n continue\n }\n transactionIds.push(transactionId)\n }\n\n return transactionIds\n}\n\n/** How long looked-up transaction tags stay cached. */\nconst TRANSACTION_TAGS_CACHE_MS = 5 * 60 * 1000\n\n/** Content-SHA-256 tag values for the transactions that have one, from one batched tag lookup (cached). */\nconst getExpectedContentHashes = async (transactionIds: string[]): Promise<Record<string, string>> => {\n const queryClient = BaseQueryClient.getQueryClient()\n const tagsById = new Map<string, TransactionTag[]>()\n const toFetch: string[] = []\n for (const transactionId of transactionIds) {\n // Tags never change once a transaction is indexed, so a cached lookup stays good.\n const cached = queryClient.getQueryData?.(['getTransactionTags', transactionId]) as TransactionTag[] | undefined\n if (cached) tagsById.set(transactionId, cached)\n else toFetch.push(transactionId)\n }\n\n if (toFetch.length > 0) {\n try {\n const fetched = await getTransactionTagsByIds(toFetch, {\n client: BaseArweaveClient.getArweaveClient(),\n onError: (error: unknown) => logger('[download] transaction tags lookup failed', error),\n })\n for (const [transactionId, tags] of fetched) {\n tagsById.set(transactionId, tags)\n // Seed the per-transaction cache entry (the client interface has no setQueryData).\n void queryClient\n .fetchQuery({\n queryKey: ['getTransactionTags', transactionId],\n queryFn: async () => tags,\n // The query client keeps a result only as long as the caller's staleTime.\n staleTime: TRANSACTION_TAGS_CACHE_MS,\n })\n .catch(() => {})\n }\n } catch (error) {\n logger('[download] transaction tags lookup failed', error)\n }\n }\n\n const out: Record<string, string> = {}\n for (const [transactionId, tags] of tagsById) {\n const value = tags.find((tag) => tag.name === CONTENT_SHA256_TAG)?.value?.trim()\n if (value) out[transactionId] = value\n }\n return out\n}\n\nconst downloadTransactionIds = async (\n rawTransactionIds: string[],\n options?: { skipExisting?: boolean },\n): Promise<boolean> => {\n if (!supportsOpfsFileDownloads()) {\n return false\n }\n\n const transactionIds = Array.from(new Set(rawTransactionIds.filter((tx) => !!tx && tx.trim().length > 0)))\n if (transactionIds.length === 0) {\n return false\n }\n\n const excludedTransactions = await getExcludedTransactions()\n\n await ensureReadGatewaySelected()\n\n // Browser: do not call getTransactionStatus() — many gateways (e.g. g8way.io) redirect or omit\n // CORS headers, so fetch() fails and we would wrongly exclude txs. The OPFS worker fetch decides success.\n const transactionIdsToDownload = transactionIds.filter((id) => !excludedTransactions.has(id))\n if (transactionIdsToDownload.length === 0) {\n return false\n }\n\n // One batched lookup for every upload's Content-SHA-256 tag; downloads are verified against it.\n // Missing tags (old uploads, or a just-published one not indexed yet) just mean no verification.\n const expectedContentHashes = await getExpectedContentHashes(transactionIdsToDownload)\n\n // Preferred gateways first: a just-published item is only on the gateway it was uploaded through.\n const arweaveBaseUrls = getArweaveReadBaseUrls()\n\n // Where each ItemStorage child of a composite goes (the worker cannot read the DB or the schema).\n const compositeChildPaths = await getCompositeChildPaths(transactionIdsToDownload).catch((error) => {\n logger('[download] composite child paths lookup failed', error)\n return {} as Record<string, Record<string, string>>\n })\n\n let result: DownloadAllFilesResult | void\n if (transactionIdsToDownload.length === 1) {\n const transactionId = transactionIdsToDownload[0]\n result = await BaseFileManager.downloadFileByTransactionId({\n transactionId,\n arweaveHost: BaseArweaveClient.getBaseUrl(),\n arweaveBaseUrls,\n excludedTransactions,\n expectedContentHash: expectedContentHashes[transactionId],\n compositeChildPaths: compositeChildPaths[transactionId],\n skipExisting: options?.skipExisting,\n })\n } else {\n result = await BaseFileManager.downloadAllFiles({\n transactionIds: transactionIdsToDownload,\n arweaveHost: BaseArweaveClient.getBaseUrl(),\n arweaveBaseUrls,\n excludedTransactions,\n expectedContentHashes,\n compositeChildPaths,\n skipExisting: options?.skipExisting,\n })\n }\n\n if (result) {\n for (const transactionId of result.hashMismatchTransactionIds) {\n // Not saved by the worker; left for a later run (a gateway may serve the right bytes then).\n logger(`[download] ${transactionId}: downloaded bytes do not match Content-SHA-256; skipped`)\n }\n }\n\n return true\n}\n\nconst runBulkDownloadWithDedupe = async (transactionIds: string[]): Promise<void> => {\n if (bulkDownloadInFlight) {\n return bulkDownloadInFlight\n }\n\n bulkDownloadInFlight = (async () => {\n try {\n await downloadTransactionIds(transactionIds, { skipExisting: true })\n } finally {\n bulkDownloadInFlight = null\n }\n })()\n\n return bulkDownloadInFlight\n}\n\n\nexport const downloadAllFilesBinaryRequestHandler = async (addressesHint?: string[]) => {\n if (!supportsOpfsFileDownloads()) {\n return\n }\n\n // Waits for init to open the database, if it hasn't yet\n const fromDb = await getAllAddressesFromDb()\n\n const addresses = mergeAddressLists(addressesHint, fromDb)\n\n if (!addresses || addresses.length === 0) {\n return\n }\n\n const queryClient = BaseQueryClient.getQueryClient()\n const easClient = BaseEasClient.getEasClient()\n\n const filesMetadataQueryKey = ['getFilesMetadata', ...addresses] as const\n const fetchFilesMetadata = () =>\n easClient.request(GET_FILES_METADATA, {\n where: {\n attester: {\n in: addresses,\n },\n schema: {\n is: {\n id: {\n equals:\n '0x55fdefb36fcbbaebeb7d6b41dc3a1a9666e4e42154267c889de064faa7ede517',\n },\n },\n },\n },\n })\n\n let { filesMetadata } = await queryClient.fetchQuery({\n queryKey: filesMetadataQueryKey,\n queryFn: fetchFilesMetadata,\n staleTime: GET_FILES_METADATA_STALE_MS,\n })\n\n if ((!Array.isArray(filesMetadata) || filesMetadata.length === 0) && addresses.length > 0) {\n await queryClient.removeQueries({ queryKey: filesMetadataQueryKey })\n ;({ filesMetadata } = await queryClient.fetchQuery({\n queryKey: filesMetadataQueryKey,\n queryFn: fetchFilesMetadata,\n staleTime: GET_FILES_METADATA_STALE_MS,\n }))\n }\n\n const filesRoot = BaseFileManager.getWorkingDir()\n await BaseFileManager.createDirIfNotExists(filesRoot)\n await BaseFileManager.createDirIfNotExists(BaseFileManager.getFilesPath('html'))\n await BaseFileManager.createDirIfNotExists(BaseFileManager.getFilesPath('json'))\n await BaseFileManager.createDirIfNotExists(BaseFileManager.getFilesPath('images'))\n await BaseFileManager.createDirIfNotExists(BaseFileManager.getFilesPath('files'))\n\n const excludedTransactions = await getExcludedTransactions()\n const fromEas = parseTransactionIdsFromMetadata(filesMetadata ?? [], excludedTransactions)\n const fromLocal = await collectTransactionIdsFromLocalMetadata()\n const transactionIds = Array.from(new Set([...fromEas, ...fromLocal]))\n await runBulkDownloadWithDedupe(transactionIds)\n}\n\nexport const downloadTransactionIdWithDedupe = async (transactionId: string): Promise<boolean> => {\n if (!supportsOpfsFileDownloads() || !transactionId || transactionId.trim().length === 0) {\n return false\n }\n\n const normalizedTxId = normalizeArweaveTxId(transactionId)\n if (!normalizedTxId) {\n logger(`[download] not an Arweave transaction id: ${transactionId}`)\n return false\n }\n\n const existing = lazyDownloadInFlightByTransactionId.get(normalizedTxId)\n if (existing) {\n return existing\n }\n\n const inFlight = (async () => {\n try {\n // No skipExisting: the caller found no local file, so a file on disk it could not see is\n // written again and announced.\n const ok = await downloadTransactionIds([normalizedTxId])\n return ok\n } finally {\n lazyDownloadInFlightByTransactionId.delete(normalizedTxId)\n }\n })()\n\n lazyDownloadInFlightByTransactionId.set(normalizedTxId, inFlight)\n return inFlight\n}\n\nconst scheduleBulkFilesDownloadFromEasSyncThrottled = throttle((addressesHint?: string[]) => {\n void downloadAllFilesBinaryRequestHandler(addressesHint).catch((error) => {\n logger('[scheduleBulkFilesDownloadFromEasSync] failed', error)\n })\n}, AUTO_BULK_DOWNLOAD_THROTTLE_MS, { leading: true, trailing: false })\n\nexport const scheduleBulkFilesDownloadFromEasSync = (addressesHint?: string[]): void => {\n if (!supportsOpfsFileDownloads()) {\n return\n }\n scheduleBulkFilesDownloadFromEasSyncThrottled(addressesHint)\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import { fetchEasModelSchemas } from '@seedprotocol/eas';
|
|
2
2
|
export { getItemPropertiesFromEas, getItemVersionsFromEas, getSeedsFromSchemaUids } from '@seedprotocol/eas';
|
|
3
|
-
import {
|
|
3
|
+
import { e as localModelSchemaLookups } from './errors-DKxFSvb3.js';
|
|
4
4
|
import 'xstate';
|
|
5
|
-
import './Item-
|
|
6
|
-
import './tabEvents-
|
|
5
|
+
import './Item-Ld1iPicQ.js';
|
|
6
|
+
import './tabEvents-BnBzIdEi.js';
|
|
7
|
+
import '@sinclair/typebox';
|
|
7
8
|
import 'debug';
|
|
9
|
+
import 'nanoid';
|
|
10
|
+
import 'nanoid-dictionary';
|
|
8
11
|
import './BaseFileManager-DLou1TZS.js';
|
|
9
12
|
import 'drizzle-orm/sqlite-core';
|
|
10
13
|
import 'drizzle-orm';
|
|
11
|
-
import 'pluralize';
|
|
12
|
-
import '@sinclair/typebox';
|
|
13
14
|
import '@seedprotocol/arweave';
|
|
14
|
-
import '
|
|
15
|
-
import '
|
|
16
|
-
import '
|
|
15
|
+
import 'pluralize';
|
|
16
|
+
import 'rxjs';
|
|
17
|
+
import 'lodash-es';
|
|
17
18
|
import '@noble/hashes/sha3';
|
|
18
19
|
import '@noble/hashes/utils';
|
|
19
|
-
import 'lodash-es';
|
|
20
|
-
import 'rxjs';
|
|
21
20
|
import '@seedprotocol/query';
|
|
22
21
|
|
|
23
22
|
// Sync reads EAS through this module so tests can replace these with one `vi.mock('@/eas')`.
|
|
@@ -29,4 +28,4 @@ import '@seedprotocol/query';
|
|
|
29
28
|
const getModelSchemasFromEas = async (lookups) => fetchEasModelSchemas(lookups ?? (await localModelSchemaLookups()));
|
|
30
29
|
|
|
31
30
|
export { getModelSchemasFromEas };
|
|
32
|
-
//# sourceMappingURL=eas-
|
|
31
|
+
//# sourceMappingURL=eas-CdhfODXL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eas-
|
|
1
|
+
{"version":3,"file":"eas-CdhfODXL.js","sources":["../../src/eas.ts"],"sourcesContent":["// Sync reads EAS through this module so tests can replace these with one `vi.mock('@/eas')`.\nexport {\n getItemVersionsFromEas,\n getItemPropertiesFromEas,\n getSeedsFromSchemaUids,\n} from '@seedprotocol/eas'\n\nimport { fetchEasModelSchemas } from '@seedprotocol/eas'\nimport type { EASSchema, ModelSchemaLookup } from '@seedprotocol/eas'\nimport { localModelSchemaLookups } from '@/db/read/localModelSchemaLookups'\n\n/**\n * The EAS model schemas the local models (or `lookups`) can match; see fetchEasModelSchemas.\n * Init and sync match the result with matchEasModelSchemas and record `model_uids` from it with\n * writeModelUids. Throws when the request fails.\n */\nexport const getModelSchemasFromEas = async (lookups?: readonly ModelSchemaLookup[]): Promise<EASSchema[]> =>\n fetchEasModelSchemas(lookups ?? (await localModelSchemaLookups())) as Promise<EASSchema[]>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAWA;;;;AAIG;MACU,sBAAsB,GAAG,OAAO,OAAsC,KACjF,oBAAoB,CAAC,OAAO,KAAK,MAAM,uBAAuB,EAAE,CAAC;;"}
|