@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,176 @@
|
|
|
1
|
+
import debug from 'debug';
|
|
2
|
+
import { downloadTransactionIdWithDedupe } from './download-Cvac_VGu.js';
|
|
3
|
+
import { s as supportsOpfsFileDownloads, I as ImageSize } from './tabEvents-BnBzIdEi.js';
|
|
4
|
+
import { w as BaseFileManager } from './BaseFileManager-DLou1TZS.js';
|
|
5
|
+
import { y as findFileInDir } from './Item-Ld1iPicQ.js';
|
|
6
|
+
import 'drizzle-orm';
|
|
7
|
+
import '@seedprotocol/arweave';
|
|
8
|
+
import 'pluralize';
|
|
9
|
+
import '@seedprotocol/eas';
|
|
10
|
+
import './arweaveContentTags-Bh4wCTal.js';
|
|
11
|
+
import '@noble/hashes/sha256';
|
|
12
|
+
import '@noble/hashes/sha3';
|
|
13
|
+
import '@noble/hashes/utils';
|
|
14
|
+
import 'lodash-es';
|
|
15
|
+
import '@sinclair/typebox';
|
|
16
|
+
import 'nanoid';
|
|
17
|
+
import 'nanoid-dictionary';
|
|
18
|
+
import 'drizzle-orm/sqlite-core';
|
|
19
|
+
import 'xstate';
|
|
20
|
+
import 'rxjs';
|
|
21
|
+
|
|
22
|
+
const logger = debug('seedSdk:helpers:ensureImageLocal');
|
|
23
|
+
/** Arweave transaction ids are 43 chars in the URL-safe base64 alphabet. */
|
|
24
|
+
const ARWEAVE_TX_ID_RE = /^[a-z0-9_-]{43}$/i;
|
|
25
|
+
const IMAGE_SIZES = [
|
|
26
|
+
ImageSize.EXTRA_SMALL,
|
|
27
|
+
ImageSize.SMALL,
|
|
28
|
+
ImageSize.MEDIUM,
|
|
29
|
+
ImageSize.LARGE,
|
|
30
|
+
ImageSize.EXTRA_LARGE,
|
|
31
|
+
];
|
|
32
|
+
const inFlightByKey = new Map();
|
|
33
|
+
const normalizeArweaveTxIdForEnsure = (raw) => {
|
|
34
|
+
if (raw == null || raw === '')
|
|
35
|
+
return undefined;
|
|
36
|
+
const t = String(raw).trim();
|
|
37
|
+
if (ARWEAVE_TX_ID_RE.test(t))
|
|
38
|
+
return t;
|
|
39
|
+
const m = t.match(/^([a-z0-9_-]{43})(?:\.[^/]+)?$/i);
|
|
40
|
+
if (m)
|
|
41
|
+
return m[1];
|
|
42
|
+
const embedded = t.match(/[a-z0-9_-]{43}/gi);
|
|
43
|
+
if (embedded) {
|
|
44
|
+
for (const candidate of embedded) {
|
|
45
|
+
if (ARWEAVE_TX_ID_RE.test(candidate))
|
|
46
|
+
return candidate;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
};
|
|
51
|
+
const closestImageSize = (width) => {
|
|
52
|
+
let best = ImageSize.EXTRA_SMALL;
|
|
53
|
+
let bestDist = Math.abs(best - width);
|
|
54
|
+
for (const size of IMAGE_SIZES) {
|
|
55
|
+
const dist = Math.abs(size - width);
|
|
56
|
+
if (dist < bestDist) {
|
|
57
|
+
best = size;
|
|
58
|
+
bestDist = dist;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return best;
|
|
62
|
+
};
|
|
63
|
+
const mapRequestedWidthsToImageSizes = (widths) => {
|
|
64
|
+
const requested = widths && widths.length > 0 ? widths : [ImageSize.EXTRA_SMALL];
|
|
65
|
+
const unique = new Set();
|
|
66
|
+
for (const w of requested) {
|
|
67
|
+
if (typeof w !== 'number' || !Number.isFinite(w) || w <= 0)
|
|
68
|
+
continue;
|
|
69
|
+
unique.add(closestImageSize(w));
|
|
70
|
+
}
|
|
71
|
+
if (unique.size === 0) {
|
|
72
|
+
unique.add(ImageSize.EXTRA_SMALL);
|
|
73
|
+
}
|
|
74
|
+
return Array.from(unique).sort((a, b) => a - b);
|
|
75
|
+
};
|
|
76
|
+
const getBasename = (filePath) => {
|
|
77
|
+
const path = BaseFileManager.getPathModule();
|
|
78
|
+
return path.basename(filePath);
|
|
79
|
+
};
|
|
80
|
+
const getBasenameWithoutExtension = (fileName) => {
|
|
81
|
+
const match = fileName.match(/^(.*[\/\\])?([^\/\\]+?)(\.[^.\/\\]*)?$/);
|
|
82
|
+
return match?.[2] ?? fileName;
|
|
83
|
+
};
|
|
84
|
+
const sizedVariantPath = (originalFilePath, size) => {
|
|
85
|
+
const path = BaseFileManager.getPathModule();
|
|
86
|
+
const dir = path.dirname(originalFilePath);
|
|
87
|
+
const base = getBasenameWithoutExtension(getBasename(originalFilePath));
|
|
88
|
+
return path.join(dir, String(size), `${base}.webp`);
|
|
89
|
+
};
|
|
90
|
+
const ensureKey = (txId, fileName, sizes) => {
|
|
91
|
+
const idPart = txId ?? fileName ?? '';
|
|
92
|
+
return `${idPart}|${sizes.join(',')}`;
|
|
93
|
+
};
|
|
94
|
+
const runEnsureImageLocal = async (params) => {
|
|
95
|
+
if (!supportsOpfsFileDownloads()) {
|
|
96
|
+
return { status: 'unsupported' };
|
|
97
|
+
}
|
|
98
|
+
const fileName = params.fileName?.trim() || undefined;
|
|
99
|
+
const txId = normalizeArweaveTxIdForEnsure(params.transactionId) ??
|
|
100
|
+
normalizeArweaveTxIdForEnsure(fileName);
|
|
101
|
+
if (!txId && !fileName) {
|
|
102
|
+
return { status: 'missing-id' };
|
|
103
|
+
}
|
|
104
|
+
const targetSizes = mapRequestedWidthsToImageSizes(params.widths);
|
|
105
|
+
const needles = [fileName, txId].filter((n) => typeof n === 'string' && n.length > 0);
|
|
106
|
+
try {
|
|
107
|
+
let filePath = await findFileInDir('images', needles);
|
|
108
|
+
if (!filePath && txId) {
|
|
109
|
+
await downloadTransactionIdWithDedupe(txId);
|
|
110
|
+
filePath = await findFileInDir('images', needles);
|
|
111
|
+
}
|
|
112
|
+
if (!filePath) {
|
|
113
|
+
return { status: 'failed' };
|
|
114
|
+
}
|
|
115
|
+
const createdWidths = [];
|
|
116
|
+
for (const size of targetSizes) {
|
|
117
|
+
const variantPath = sizedVariantPath(filePath, size);
|
|
118
|
+
const exists = await BaseFileManager.pathExists(variantPath);
|
|
119
|
+
if (exists)
|
|
120
|
+
continue;
|
|
121
|
+
await BaseFileManager.resizeImage({
|
|
122
|
+
filePath,
|
|
123
|
+
width: size,
|
|
124
|
+
height: size,
|
|
125
|
+
});
|
|
126
|
+
createdWidths.push(size);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
status: 'ready',
|
|
130
|
+
filePath,
|
|
131
|
+
createdWidths,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
logger('ensureImageLocal failed', error);
|
|
136
|
+
return { status: 'failed' };
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Ensure an image original exists in OPFS (downloading from Arweave if needed)
|
|
141
|
+
* and create only the requested ImageSize variant(s) for that one file.
|
|
142
|
+
*/
|
|
143
|
+
const ensureImageLocal = async (params) => {
|
|
144
|
+
if (!supportsOpfsFileDownloads()) {
|
|
145
|
+
return { status: 'unsupported' };
|
|
146
|
+
}
|
|
147
|
+
const fileName = params.fileName?.trim() || undefined;
|
|
148
|
+
const txId = normalizeArweaveTxIdForEnsure(params.transactionId) ??
|
|
149
|
+
normalizeArweaveTxIdForEnsure(fileName);
|
|
150
|
+
if (!txId && !fileName) {
|
|
151
|
+
return { status: 'missing-id' };
|
|
152
|
+
}
|
|
153
|
+
const targetSizes = mapRequestedWidthsToImageSizes(params.widths);
|
|
154
|
+
const key = ensureKey(txId, fileName, targetSizes);
|
|
155
|
+
const existing = inFlightByKey.get(key);
|
|
156
|
+
if (existing) {
|
|
157
|
+
return existing;
|
|
158
|
+
}
|
|
159
|
+
const inFlight = (async () => {
|
|
160
|
+
try {
|
|
161
|
+
return await runEnsureImageLocal({
|
|
162
|
+
transactionId: txId,
|
|
163
|
+
fileName,
|
|
164
|
+
widths: targetSizes,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
inFlightByKey.delete(key);
|
|
169
|
+
}
|
|
170
|
+
})();
|
|
171
|
+
inFlightByKey.set(key, inFlight);
|
|
172
|
+
return inFlight;
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
export { closestImageSize, ensureImageLocal, normalizeArweaveTxIdForEnsure };
|
|
176
|
+
//# sourceMappingURL=ensureImageLocal-DNM6c2yD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureImageLocal-DNM6c2yD.js","sources":["../../src/helpers/ensureImageLocal.ts"],"sourcesContent":["import debug from 'debug'\nimport { downloadTransactionIdWithDedupe } from '@/events/files/download'\nimport { ImageSize } from '@/helpers/constants'\nimport { supportsOpfsFileDownloads } from '@/helpers/environment'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport { findFileInDir } from '@/storageValue/findFile'\n\nconst logger = debug('seedSdk:helpers:ensureImageLocal')\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 IMAGE_SIZES = [\n ImageSize.EXTRA_SMALL,\n ImageSize.SMALL,\n ImageSize.MEDIUM,\n ImageSize.LARGE,\n ImageSize.EXTRA_LARGE,\n] as const\n\nexport type EnsureImageLocalParams = {\n /** 43-char tx id, or a URL/path containing one */\n transactionId?: string\n /** Local basename / refResolvedValue under images/ */\n fileName?: string\n /** Display widths; each mapped to closest ImageSize. Default: [EXTRA_SMALL] */\n widths?: number[]\n}\n\nexport type EnsureImageLocalResult = {\n status: 'ready' | 'unsupported' | 'failed' | 'missing-id'\n filePath?: string\n createdWidths?: number[]\n}\n\nconst inFlightByKey = new Map<string, Promise<EnsureImageLocalResult>>()\n\nexport const normalizeArweaveTxIdForEnsure = (\n raw: string | null | undefined,\n): 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 const embedded = t.match(/[a-z0-9_-]{43}/gi)\n if (embedded) {\n for (const candidate of embedded) {\n if (ARWEAVE_TX_ID_RE.test(candidate)) return candidate\n }\n }\n return undefined\n}\n\nexport const closestImageSize = (width: number): ImageSize => {\n let best: ImageSize = ImageSize.EXTRA_SMALL\n let bestDist = Math.abs(best - width)\n for (const size of IMAGE_SIZES) {\n const dist = Math.abs(size - width)\n if (dist < bestDist) {\n best = size\n bestDist = dist\n }\n }\n return best\n}\n\nconst mapRequestedWidthsToImageSizes = (widths?: number[]): ImageSize[] => {\n const requested =\n widths && widths.length > 0 ? widths : [ImageSize.EXTRA_SMALL]\n const unique = new Set<ImageSize>()\n for (const w of requested) {\n if (typeof w !== 'number' || !Number.isFinite(w) || w <= 0) continue\n unique.add(closestImageSize(w))\n }\n if (unique.size === 0) {\n unique.add(ImageSize.EXTRA_SMALL)\n }\n return Array.from(unique).sort((a, b) => a - b)\n}\n\nconst getBasename = (filePath: string): string => {\n const path = BaseFileManager.getPathModule()\n return path.basename(filePath)\n}\n\nconst getBasenameWithoutExtension = (fileName: string): string => {\n const match = fileName.match(/^(.*[\\/\\\\])?([^\\/\\\\]+?)(\\.[^.\\/\\\\]*)?$/)\n return match?.[2] ?? fileName\n}\n\nconst sizedVariantPath = (originalFilePath: string, size: ImageSize): string => {\n const path = BaseFileManager.getPathModule()\n const dir = path.dirname(originalFilePath)\n const base = getBasenameWithoutExtension(getBasename(originalFilePath))\n return path.join(dir, String(size), `${base}.webp`)\n}\n\nconst ensureKey = (\n txId: string | undefined,\n fileName: string | undefined,\n sizes: ImageSize[],\n): string => {\n const idPart = txId ?? fileName ?? ''\n return `${idPart}|${sizes.join(',')}`\n}\n\nconst runEnsureImageLocal = async (\n params: EnsureImageLocalParams,\n): Promise<EnsureImageLocalResult> => {\n if (!supportsOpfsFileDownloads()) {\n return { status: 'unsupported' }\n }\n\n const fileName = params.fileName?.trim() || undefined\n const txId =\n normalizeArweaveTxIdForEnsure(params.transactionId) ??\n normalizeArweaveTxIdForEnsure(fileName)\n\n if (!txId && !fileName) {\n return { status: 'missing-id' }\n }\n\n const targetSizes = mapRequestedWidthsToImageSizes(params.widths)\n const needles = [fileName, txId].filter(\n (n): n is string => typeof n === 'string' && n.length > 0,\n )\n\n try {\n let filePath = await findFileInDir('images', needles)\n if (!filePath && txId) {\n await downloadTransactionIdWithDedupe(txId)\n filePath = await findFileInDir('images', needles)\n }\n\n if (!filePath) {\n return { status: 'failed' }\n }\n\n const createdWidths: number[] = []\n for (const size of targetSizes) {\n const variantPath = sizedVariantPath(filePath, size)\n const exists = await BaseFileManager.pathExists(variantPath)\n if (exists) continue\n await BaseFileManager.resizeImage({\n filePath,\n width: size,\n height: size,\n })\n createdWidths.push(size)\n }\n\n return {\n status: 'ready',\n filePath,\n createdWidths,\n }\n } catch (error) {\n logger('ensureImageLocal failed', error)\n return { status: 'failed' }\n }\n}\n\n/**\n * Ensure an image original exists in OPFS (downloading from Arweave if needed)\n * and create only the requested ImageSize variant(s) for that one file.\n */\nexport const ensureImageLocal = async (\n params: EnsureImageLocalParams,\n): Promise<EnsureImageLocalResult> => {\n if (!supportsOpfsFileDownloads()) {\n return { status: 'unsupported' }\n }\n\n const fileName = params.fileName?.trim() || undefined\n const txId =\n normalizeArweaveTxIdForEnsure(params.transactionId) ??\n normalizeArweaveTxIdForEnsure(fileName)\n\n if (!txId && !fileName) {\n return { status: 'missing-id' }\n }\n\n const targetSizes = mapRequestedWidthsToImageSizes(params.widths)\n const key = ensureKey(txId, fileName, targetSizes)\n\n const existing = inFlightByKey.get(key)\n if (existing) {\n return existing\n }\n\n const inFlight = (async () => {\n try {\n return await runEnsureImageLocal({\n transactionId: txId,\n fileName,\n widths: targetSizes,\n })\n } finally {\n inFlightByKey.delete(key)\n }\n })()\n\n inFlightByKey.set(key, inFlight)\n return inFlight\n}\n\n/** Test-only: clear in-flight dedupe map. */\nexport const resetEnsureImageLocalInFlightForTests = (): void => {\n inFlightByKey.clear()\n}\n"],"names":[],"mappings":"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"}
|