@buoy-gg/images 7.0.3
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/LICENSE +58 -0
- package/README.md +58 -0
- package/lib/commonjs/capture/actions.js +227 -0
- package/lib/commonjs/capture/actions.js.map +1 -0
- package/lib/commonjs/capture/install.js +41 -0
- package/lib/commonjs/capture/install.js.map +1 -0
- package/lib/commonjs/capture/installExpoImage.js +99 -0
- package/lib/commonjs/capture/installExpoImage.js.map +1 -0
- package/lib/commonjs/capture/installRnImage.js +128 -0
- package/lib/commonjs/capture/installRnImage.js.map +1 -0
- package/lib/commonjs/capture/overrides.js +286 -0
- package/lib/commonjs/capture/overrides.js.map +1 -0
- package/lib/commonjs/capture/savings.js +193 -0
- package/lib/commonjs/capture/savings.js.map +1 -0
- package/lib/commonjs/capture/shared.js +367 -0
- package/lib/commonjs/capture/shared.js.map +1 -0
- package/lib/commonjs/components/ImageDetail.js +444 -0
- package/lib/commonjs/components/ImageDetail.js.map +1 -0
- package/lib/commonjs/components/ImageDetailFooter.js +232 -0
- package/lib/commonjs/components/ImageDetailFooter.js.map +1 -0
- package/lib/commonjs/components/ImageRow.js +164 -0
- package/lib/commonjs/components/ImageRow.js.map +1 -0
- package/lib/commonjs/components/ImagesHeader.js +63 -0
- package/lib/commonjs/components/ImagesHeader.js.map +1 -0
- package/lib/commonjs/components/ImagesIcon.js +59 -0
- package/lib/commonjs/components/ImagesIcon.js.map +1 -0
- package/lib/commonjs/components/ImagesListFooter.js +194 -0
- package/lib/commonjs/components/ImagesListFooter.js.map +1 -0
- package/lib/commonjs/components/ImagesModal.js +173 -0
- package/lib/commonjs/components/ImagesModal.js.map +1 -0
- package/lib/commonjs/components/ImagesRoot.js +24 -0
- package/lib/commonjs/components/ImagesRoot.js.map +1 -0
- package/lib/commonjs/components/InsightsBar.js +59 -0
- package/lib/commonjs/components/InsightsBar.js.map +1 -0
- package/lib/commonjs/export.js +81 -0
- package/lib/commonjs/export.js.map +1 -0
- package/lib/commonjs/format.js +117 -0
- package/lib/commonjs/format.js.map +1 -0
- package/lib/commonjs/hooks/useImageRecords.js +20 -0
- package/lib/commonjs/hooks/useImageRecords.js.map +1 -0
- package/lib/commonjs/index.js +236 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/preset.js +45 -0
- package/lib/commonjs/preset.js.map +1 -0
- package/lib/commonjs/register.js +19 -0
- package/lib/commonjs/register.js.map +1 -0
- package/lib/commonjs/state.js +54 -0
- package/lib/commonjs/state.js.map +1 -0
- package/lib/commonjs/store/imageEventStore.js +160 -0
- package/lib/commonjs/store/imageEventStore.js.map +1 -0
- package/lib/commonjs/store/insights.js +76 -0
- package/lib/commonjs/store/insights.js.map +1 -0
- package/lib/commonjs/sync/imagesSyncAdapter.js +315 -0
- package/lib/commonjs/sync/imagesSyncAdapter.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/capture/actions.js +214 -0
- package/lib/module/capture/actions.js.map +1 -0
- package/lib/module/capture/install.js +36 -0
- package/lib/module/capture/install.js.map +1 -0
- package/lib/module/capture/installExpoImage.js +94 -0
- package/lib/module/capture/installExpoImage.js.map +1 -0
- package/lib/module/capture/installRnImage.js +122 -0
- package/lib/module/capture/installRnImage.js.map +1 -0
- package/lib/module/capture/overrides.js +269 -0
- package/lib/module/capture/overrides.js.map +1 -0
- package/lib/module/capture/savings.js +189 -0
- package/lib/module/capture/savings.js.map +1 -0
- package/lib/module/capture/shared.js +359 -0
- package/lib/module/capture/shared.js.map +1 -0
- package/lib/module/components/ImageDetail.js +440 -0
- package/lib/module/components/ImageDetail.js.map +1 -0
- package/lib/module/components/ImageDetailFooter.js +228 -0
- package/lib/module/components/ImageDetailFooter.js.map +1 -0
- package/lib/module/components/ImageRow.js +160 -0
- package/lib/module/components/ImageRow.js.map +1 -0
- package/lib/module/components/ImagesHeader.js +59 -0
- package/lib/module/components/ImagesHeader.js.map +1 -0
- package/lib/module/components/ImagesIcon.js +55 -0
- package/lib/module/components/ImagesIcon.js.map +1 -0
- package/lib/module/components/ImagesListFooter.js +190 -0
- package/lib/module/components/ImagesListFooter.js.map +1 -0
- package/lib/module/components/ImagesModal.js +169 -0
- package/lib/module/components/ImagesModal.js.map +1 -0
- package/lib/module/components/ImagesRoot.js +20 -0
- package/lib/module/components/ImagesRoot.js.map +1 -0
- package/lib/module/components/InsightsBar.js +55 -0
- package/lib/module/components/InsightsBar.js.map +1 -0
- package/lib/module/export.js +76 -0
- package/lib/module/export.js.map +1 -0
- package/lib/module/format.js +108 -0
- package/lib/module/format.js.map +1 -0
- package/lib/module/hooks/useImageRecords.js +16 -0
- package/lib/module/hooks/useImageRecords.js.map +1 -0
- package/lib/module/index.js +73 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/preset.js +40 -0
- package/lib/module/preset.js.map +1 -0
- package/lib/module/register.js +19 -0
- package/lib/module/register.js.map +1 -0
- package/lib/module/state.js +50 -0
- package/lib/module/state.js.map +1 -0
- package/lib/module/store/imageEventStore.js +146 -0
- package/lib/module/store/imageEventStore.js.map +1 -0
- package/lib/module/store/insights.js +71 -0
- package/lib/module/store/insights.js.map +1 -0
- package/lib/module/sync/imagesSyncAdapter.js +311 -0
- package/lib/module/sync/imagesSyncAdapter.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/capture/actions.d.ts +49 -0
- package/lib/typescript/capture/actions.d.ts.map +1 -0
- package/lib/typescript/capture/install.d.ts +15 -0
- package/lib/typescript/capture/install.d.ts.map +1 -0
- package/lib/typescript/capture/installExpoImage.d.ts +23 -0
- package/lib/typescript/capture/installExpoImage.d.ts.map +1 -0
- package/lib/typescript/capture/installRnImage.d.ts +24 -0
- package/lib/typescript/capture/installRnImage.d.ts.map +1 -0
- package/lib/typescript/capture/overrides.d.ts +83 -0
- package/lib/typescript/capture/overrides.d.ts.map +1 -0
- package/lib/typescript/capture/savings.d.ts +37 -0
- package/lib/typescript/capture/savings.d.ts.map +1 -0
- package/lib/typescript/capture/shared.d.ts +61 -0
- package/lib/typescript/capture/shared.d.ts.map +1 -0
- package/lib/typescript/components/ImageDetail.d.ts +13 -0
- package/lib/typescript/components/ImageDetail.d.ts.map +1 -0
- package/lib/typescript/components/ImageDetailFooter.d.ts +19 -0
- package/lib/typescript/components/ImageDetailFooter.d.ts.map +1 -0
- package/lib/typescript/components/ImageRow.d.ts +15 -0
- package/lib/typescript/components/ImageRow.d.ts.map +1 -0
- package/lib/typescript/components/ImagesHeader.d.ts +25 -0
- package/lib/typescript/components/ImagesHeader.d.ts.map +1 -0
- package/lib/typescript/components/ImagesIcon.d.ts +13 -0
- package/lib/typescript/components/ImagesIcon.d.ts.map +1 -0
- package/lib/typescript/components/ImagesListFooter.d.ts +8 -0
- package/lib/typescript/components/ImagesListFooter.d.ts.map +1 -0
- package/lib/typescript/components/ImagesModal.d.ts +17 -0
- package/lib/typescript/components/ImagesModal.d.ts.map +1 -0
- package/lib/typescript/components/ImagesRoot.d.ts +11 -0
- package/lib/typescript/components/ImagesRoot.d.ts.map +1 -0
- package/lib/typescript/components/InsightsBar.d.ts +13 -0
- package/lib/typescript/components/InsightsBar.d.ts.map +1 -0
- package/lib/typescript/export.d.ts +12 -0
- package/lib/typescript/export.d.ts.map +1 -0
- package/lib/typescript/format.d.ts +26 -0
- package/lib/typescript/format.d.ts.map +1 -0
- package/lib/typescript/hooks/useImageRecords.d.ts +11 -0
- package/lib/typescript/hooks/useImageRecords.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +33 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/preset.d.ts +38 -0
- package/lib/typescript/preset.d.ts.map +1 -0
- package/lib/typescript/register.d.ts +15 -0
- package/lib/typescript/register.d.ts.map +1 -0
- package/lib/typescript/state.d.ts +54 -0
- package/lib/typescript/state.d.ts.map +1 -0
- package/lib/typescript/store/imageEventStore.d.ts +34 -0
- package/lib/typescript/store/imageEventStore.d.ts.map +1 -0
- package/lib/typescript/store/insights.d.ts +11 -0
- package/lib/typescript/store/insights.d.ts.map +1 -0
- package/lib/typescript/sync/imagesSyncAdapter.d.ts +205 -0
- package/lib/typescript/sync/imagesSyncAdapter.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +121 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/package.json +67 -0
- package/register.d.ts +1 -0
- package/register.js +15 -0
- package/src/capture/actions.ts +206 -0
- package/src/capture/install.ts +36 -0
- package/src/capture/installExpoImage.ts +115 -0
- package/src/capture/installRnImage.tsx +133 -0
- package/src/capture/overrides.ts +282 -0
- package/src/capture/savings.ts +193 -0
- package/src/capture/shared.ts +387 -0
- package/src/components/ImageDetail.tsx +456 -0
- package/src/components/ImageDetailFooter.tsx +270 -0
- package/src/components/ImageRow.tsx +148 -0
- package/src/components/ImagesHeader.tsx +77 -0
- package/src/components/ImagesIcon.tsx +66 -0
- package/src/components/ImagesListFooter.tsx +193 -0
- package/src/components/ImagesModal.tsx +195 -0
- package/src/components/ImagesRoot.tsx +18 -0
- package/src/components/InsightsBar.tsx +51 -0
- package/src/export.ts +100 -0
- package/src/format.ts +85 -0
- package/src/hooks/useImageRecords.ts +24 -0
- package/src/index.tsx +108 -0
- package/src/preset.tsx +35 -0
- package/src/register.ts +17 -0
- package/src/state.ts +88 -0
- package/src/store/imageEventStore.ts +162 -0
- package/src/store/insights.ts +66 -0
- package/src/sync/imagesSyncAdapter.ts +261 -0
- package/src/types.ts +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_state","MAX_RECORDS","emit","s","imagesState","emitScheduled","requestAnimationFrame","listener","listeners","invalidate","snapshot","records","createRecord","partial","record","id","nextId","createdAt","Date","now","status","mounted","loadCount","push","byId","set","length","dropped","splice","d","delete","updateRecord","patch","get","undefined","Object","assign","getRecord","getSnapshot","subscribe","add","clearRecords","filter","r","Map","map","neededPixels","layout","width","height","scale","PixelRatio","Math","round","oversizeFactor","needed","intrinsic","neededArea","intrinsicArea","sqrt","estDecodedBytes","estWastedBytes","wasted","max","computeStats","list","stats","total","loading","loaded","errors","networkLoads","progressSeen","cacheVerdict"],"sourceRoot":"../../../src","sources":["store/imageEventStore.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.computeInsights = computeInsights;
|
|
7
|
+
exports.insightChips = insightChips;
|
|
8
|
+
/**
|
|
9
|
+
* Cross-record insights — findings computed purely from data the registry
|
|
10
|
+
* already holds (no extra instrumentation): duplicate simultaneous loads,
|
|
11
|
+
* retry storms, iOS image-queue saturation, missing alt text, and
|
|
12
|
+
* layout-shifting images.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** loadCount at/above this flags render-thrash reload storms. */
|
|
16
|
+
const RETRY_STORM_THRESHOLD = 5;
|
|
17
|
+
/** RCTImageLoader allows 4 concurrent loading tasks on iOS. */
|
|
18
|
+
const IOS_CONCURRENT_LOAD_LIMIT = 4;
|
|
19
|
+
function computeInsights(records) {
|
|
20
|
+
const byUri = new Map();
|
|
21
|
+
const retryStorms = [];
|
|
22
|
+
const layoutShifters = [];
|
|
23
|
+
let missingAlt = 0;
|
|
24
|
+
let rnLoading = 0;
|
|
25
|
+
for (const r of records) {
|
|
26
|
+
if (r.mounted && r.uri) {
|
|
27
|
+
byUri.set(r.uri, (byUri.get(r.uri) ?? 0) + 1);
|
|
28
|
+
}
|
|
29
|
+
if (r.loadCount >= RETRY_STORM_THRESHOLD) {
|
|
30
|
+
retryStorms.push({
|
|
31
|
+
id: r.id,
|
|
32
|
+
uri: r.uri,
|
|
33
|
+
loadCount: r.loadCount
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if ((r.layoutShifts ?? 0) > 0) {
|
|
37
|
+
layoutShifters.push({
|
|
38
|
+
id: r.id,
|
|
39
|
+
uri: r.uri,
|
|
40
|
+
shifts: r.layoutShifts ?? 0
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (r.mounted && r.hasAltText === false) missingAlt++;
|
|
44
|
+
if (r.lib === "rn" && r.mounted && r.status === "loading") rnLoading++;
|
|
45
|
+
}
|
|
46
|
+
const duplicates = [...byUri.entries()].filter(([, count]) => count > 1).map(([uri, count]) => ({
|
|
47
|
+
uri,
|
|
48
|
+
count
|
|
49
|
+
})).sort((a, b) => b.count - a.count);
|
|
50
|
+
return {
|
|
51
|
+
duplicates,
|
|
52
|
+
retryStorms: retryStorms.sort((a, b) => b.loadCount - a.loadCount),
|
|
53
|
+
queueSaturated: rnLoading > IOS_CONCURRENT_LOAD_LIMIT,
|
|
54
|
+
missingAlt,
|
|
55
|
+
layoutShifters
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Compact one-line chips for UI/MCP surfacing. Empty array = all clear. */
|
|
60
|
+
function insightChips(insights) {
|
|
61
|
+
const chips = [];
|
|
62
|
+
if (insights.duplicates.length > 0) {
|
|
63
|
+
const extra = insights.duplicates.reduce((n, d) => n + d.count - 1, 0);
|
|
64
|
+
chips.push(`${insights.duplicates.length} duplicate URL${insights.duplicates.length > 1 ? "s" : ""} (${extra} redundant loads)`);
|
|
65
|
+
}
|
|
66
|
+
if (insights.retryStorms.length > 0) {
|
|
67
|
+
chips.push(`${insights.retryStorms.length} retry storm${insights.retryStorms.length > 1 ? "s" : ""}`);
|
|
68
|
+
}
|
|
69
|
+
if (insights.queueSaturated) chips.push("iOS image queue saturated (>4 loading)");
|
|
70
|
+
if (insights.missingAlt > 0) chips.push(`${insights.missingAlt} missing alt text`);
|
|
71
|
+
if (insights.layoutShifters.length > 0) {
|
|
72
|
+
chips.push(`${insights.layoutShifters.length} layout-shifting image${insights.layoutShifters.length > 1 ? "s" : ""}`);
|
|
73
|
+
}
|
|
74
|
+
return chips;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=insights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RETRY_STORM_THRESHOLD","IOS_CONCURRENT_LOAD_LIMIT","computeInsights","records","byUri","Map","retryStorms","layoutShifters","missingAlt","rnLoading","r","mounted","uri","set","get","loadCount","push","id","layoutShifts","shifts","hasAltText","lib","status","duplicates","entries","filter","count","map","sort","a","b","queueSaturated","insightChips","insights","chips","length","extra","reduce","n","d"],"sourceRoot":"../../../src","sources":["store/insights.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.imagesSyncAdapter = void 0;
|
|
7
|
+
var _actions = require("../capture/actions");
|
|
8
|
+
var _install = require("../capture/install");
|
|
9
|
+
var _overrides = require("../capture/overrides");
|
|
10
|
+
var _savings = require("../capture/savings");
|
|
11
|
+
var _insights = require("../store/insights");
|
|
12
|
+
var _imageEventStore = require("../store/imageEventStore");
|
|
13
|
+
/**
|
|
14
|
+
* Sync adapter for the Images tool, consumed by @buoy-gg/external-sync's
|
|
15
|
+
* `useExternalSync` (structurally matches its ToolSyncAdapter interface so
|
|
16
|
+
* this package doesn't need a dependency on it — same pattern as js-top's
|
|
17
|
+
* adapter). Exposes the live image registry to the desktop dashboard and the
|
|
18
|
+
* MCP server, plus every action the on-device UI has: reload/retry,
|
|
19
|
+
* simulation overrides (force error/loading/blank/URL swap), locate-flash,
|
|
20
|
+
* global modes, and cache clears.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/** Slim wire form of a record (heavy/derived fields precomputed + rounded). */
|
|
24
|
+
function toWire(record) {
|
|
25
|
+
const factor = (0, _imageEventStore.oversizeFactor)(record);
|
|
26
|
+
return {
|
|
27
|
+
id: record.id,
|
|
28
|
+
lib: record.lib,
|
|
29
|
+
uri: record.uri,
|
|
30
|
+
kind: record.sourceKind,
|
|
31
|
+
status: record.status,
|
|
32
|
+
mounted: record.mounted,
|
|
33
|
+
cache: record.cacheVerdict ?? null,
|
|
34
|
+
cacheSource: record.cacheVerdictSource ?? null,
|
|
35
|
+
ms: record.durationMs != null ? Math.round(record.durationMs) : null,
|
|
36
|
+
intrinsic: record.intrinsic ?? null,
|
|
37
|
+
layout: record.layout ? {
|
|
38
|
+
width: Math.round(record.layout.width),
|
|
39
|
+
height: Math.round(record.layout.height)
|
|
40
|
+
} : null,
|
|
41
|
+
neededPx: (0, _imageEventStore.neededPixels)(record),
|
|
42
|
+
oversizeFactor: factor != null ? Math.round(factor * 100) / 100 : null,
|
|
43
|
+
decodedKB: Math.round((0, _imageEventStore.estDecodedBytes)(record) / 1024),
|
|
44
|
+
wastedKB: Math.round((0, _imageEventStore.estWastedBytes)(record) / 1024),
|
|
45
|
+
progressSeen: record.progressSeen === true,
|
|
46
|
+
bytesTotal: record.bytesTotal ?? null,
|
|
47
|
+
error: record.error ?? null,
|
|
48
|
+
errorCode: record.errorCode ?? null,
|
|
49
|
+
loadCount: record.loadCount,
|
|
50
|
+
overrideLabel: record.overrideLabel ?? null,
|
|
51
|
+
hasAltText: record.hasAltText ?? null,
|
|
52
|
+
layoutShifts: record.layoutShifts ?? 0,
|
|
53
|
+
ageMs: Date.now() - record.createdAt
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function requireRecord(params) {
|
|
57
|
+
const id = params?.id;
|
|
58
|
+
if (typeof id !== "number") throw new Error("Missing numeric `id` param");
|
|
59
|
+
const record = (0, _imageEventStore.getRecord)(id);
|
|
60
|
+
if (!record) {
|
|
61
|
+
throw new Error(`Image record ${id} not found (cleared or evicted) — re-run the list action for current ids.`);
|
|
62
|
+
}
|
|
63
|
+
return record;
|
|
64
|
+
}
|
|
65
|
+
function overview() {
|
|
66
|
+
const snapshot = (0, _imageEventStore.getSnapshot)();
|
|
67
|
+
return {
|
|
68
|
+
stats: (0, _imageEventStore.computeStats)(snapshot),
|
|
69
|
+
captureStatus: (0, _install.getCaptureStatus)(),
|
|
70
|
+
globalModes: (0, _overrides.getGlobalModes)(),
|
|
71
|
+
insights: (0, _insights.computeInsights)(snapshot),
|
|
72
|
+
records: [...snapshot].reverse() // newest first
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const imagesSyncAdapter = exports.imagesSyncAdapter = {
|
|
76
|
+
version: 1,
|
|
77
|
+
getSnapshot: () => {
|
|
78
|
+
const {
|
|
79
|
+
records,
|
|
80
|
+
...rest
|
|
81
|
+
} = overview();
|
|
82
|
+
return {
|
|
83
|
+
...rest,
|
|
84
|
+
records: records.slice(0, 100).map(toWire)
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
subscribe: onChange => (0, _imageEventStore.subscribe)(onChange),
|
|
88
|
+
actions: {
|
|
89
|
+
/** List records (newest first). Params: { limit?, status? }. */
|
|
90
|
+
list: params => {
|
|
91
|
+
const p = params ?? {};
|
|
92
|
+
const limit = Math.min(Math.max(p.limit ?? 50, 1), 200);
|
|
93
|
+
const {
|
|
94
|
+
records,
|
|
95
|
+
...rest
|
|
96
|
+
} = overview();
|
|
97
|
+
const filtered = p.status ? records.filter(r => r.status === p.status) : records;
|
|
98
|
+
return {
|
|
99
|
+
...rest,
|
|
100
|
+
total: filtered.length,
|
|
101
|
+
records: filtered.slice(0, limit).map(toWire)
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
/** Full detail for one record. Params: { id }. */
|
|
105
|
+
getDetail: params => {
|
|
106
|
+
const record = requireRecord(params);
|
|
107
|
+
return {
|
|
108
|
+
...toWire(record),
|
|
109
|
+
errorHeaders: record.errorHeaders ?? null
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
/** Bypass-cache reload. Params: { id }. */
|
|
113
|
+
hardReload: params => (0, _actions.hardReloadRecord)(requireRecord(params)),
|
|
114
|
+
/** Re-encode at displayed size as WebP, return real byte savings. Params: { id }. */
|
|
115
|
+
proveSavings: params => (0, _savings.proveSavings)(requireRecord(params)),
|
|
116
|
+
/** Plain fresh load attempt. Params: { id }. */
|
|
117
|
+
retry: params => (0, _actions.retryRecord)(requireRecord(params)),
|
|
118
|
+
/** Evict the expo-image disk entry for this record. Params: { id }. */
|
|
119
|
+
evictDisk: async params => {
|
|
120
|
+
const record = requireRecord(params);
|
|
121
|
+
const evicted = await (0, _actions.evictExpoDiskEntry)(record);
|
|
122
|
+
return {
|
|
123
|
+
ok: evicted,
|
|
124
|
+
message: evicted ? "Disk cache entry deleted" : "No disk entry found (expo-image + expo-file-system required)"
|
|
125
|
+
};
|
|
126
|
+
},
|
|
127
|
+
/** Flash a red border on the on-screen image. Params: { id }. */
|
|
128
|
+
flash: params => {
|
|
129
|
+
(0, _overrides.flashRecord)(requireRecord(params).id);
|
|
130
|
+
return {
|
|
131
|
+
ok: true,
|
|
132
|
+
message: "Flashing for 2.5s"
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
/**
|
|
136
|
+
* Apply a simulation override. Params: { id, kind, uri? } where kind is
|
|
137
|
+
* 'error' | 'hang' | 'blank' | 'url' ('url' requires uri).
|
|
138
|
+
*/
|
|
139
|
+
setOverride: params => {
|
|
140
|
+
const record = requireRecord(params);
|
|
141
|
+
const p = params;
|
|
142
|
+
const kinds = {
|
|
143
|
+
error: {
|
|
144
|
+
source: {
|
|
145
|
+
type: "error"
|
|
146
|
+
},
|
|
147
|
+
label: "Forced error"
|
|
148
|
+
},
|
|
149
|
+
hang: {
|
|
150
|
+
source: {
|
|
151
|
+
type: "hang"
|
|
152
|
+
},
|
|
153
|
+
label: "Forced loading"
|
|
154
|
+
},
|
|
155
|
+
blank: {
|
|
156
|
+
source: {
|
|
157
|
+
type: "blank"
|
|
158
|
+
},
|
|
159
|
+
label: "Blanked"
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
if (p.kind === "url") {
|
|
163
|
+
if (!p.uri) throw new Error("kind 'url' requires a `uri` param");
|
|
164
|
+
(0, _overrides.setOverride)(record.id, {
|
|
165
|
+
source: {
|
|
166
|
+
type: "url",
|
|
167
|
+
uri: p.uri
|
|
168
|
+
},
|
|
169
|
+
label: "URL swapped"
|
|
170
|
+
});
|
|
171
|
+
return {
|
|
172
|
+
ok: true,
|
|
173
|
+
message: `Source overridden to ${p.uri}`
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const entry = p.kind ? kinds[p.kind] : undefined;
|
|
177
|
+
if (!entry) throw new Error(`Unknown override kind: ${String(p.kind)}`);
|
|
178
|
+
if (!record.mounted) {
|
|
179
|
+
return {
|
|
180
|
+
ok: false,
|
|
181
|
+
message: "Instance unmounted — overrides need the image on screen"
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
(0, _overrides.setOverride)(record.id, entry);
|
|
185
|
+
return {
|
|
186
|
+
ok: true,
|
|
187
|
+
message: `${entry.label} applied`
|
|
188
|
+
};
|
|
189
|
+
},
|
|
190
|
+
/** Remove a simulation override. Params: { id }. */
|
|
191
|
+
clearOverride: params => {
|
|
192
|
+
(0, _overrides.clearOverride)(requireRecord(params).id);
|
|
193
|
+
return {
|
|
194
|
+
ok: true,
|
|
195
|
+
message: "Override removed — original source restored"
|
|
196
|
+
};
|
|
197
|
+
},
|
|
198
|
+
/**
|
|
199
|
+
* Mass action on every mounted image. Params: { kind } where kind is
|
|
200
|
+
* 'error' | 'loading' | 'blank' | 'reload' | 'flash' | 'restore'.
|
|
201
|
+
*/
|
|
202
|
+
massAction: async params => {
|
|
203
|
+
const kind = params?.kind;
|
|
204
|
+
switch (kind) {
|
|
205
|
+
case "error":
|
|
206
|
+
{
|
|
207
|
+
const n = (0, _overrides.setOverrideForAllMounted)({
|
|
208
|
+
type: "error"
|
|
209
|
+
}, "Forced error");
|
|
210
|
+
return {
|
|
211
|
+
ok: n > 0,
|
|
212
|
+
message: `Forced error on ${n} images`
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
case "loading":
|
|
216
|
+
{
|
|
217
|
+
const n = (0, _overrides.setOverrideForAllMounted)({
|
|
218
|
+
type: "hang"
|
|
219
|
+
}, "Forced loading");
|
|
220
|
+
return {
|
|
221
|
+
ok: n > 0,
|
|
222
|
+
message: `Forced loading on ${n} images`
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
case "blank":
|
|
226
|
+
{
|
|
227
|
+
const n = (0, _overrides.setOverrideForAllMounted)({
|
|
228
|
+
type: "blank"
|
|
229
|
+
}, "Blanked");
|
|
230
|
+
return {
|
|
231
|
+
ok: n > 0,
|
|
232
|
+
message: `Blanked ${n} images`
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
case "reload":
|
|
236
|
+
return (0, _actions.hardReloadAllMounted)();
|
|
237
|
+
case "flash":
|
|
238
|
+
{
|
|
239
|
+
const n = (0, _overrides.flashAllMounted)();
|
|
240
|
+
return {
|
|
241
|
+
ok: n > 0,
|
|
242
|
+
message: `Flashing ${n} images`
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
case "restore":
|
|
246
|
+
{
|
|
247
|
+
const n = (0, _overrides.clearAllOverrides)();
|
|
248
|
+
return {
|
|
249
|
+
ok: true,
|
|
250
|
+
message: `Restored ${n} images`
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
default:
|
|
254
|
+
throw new Error(`Unknown mass kind: ${String(kind)}`);
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
/** Global network simulation. Params: { mode: 'normal'|'offline'|'cold' }. */
|
|
258
|
+
setNetworkMode: params => {
|
|
259
|
+
const mode = params?.mode;
|
|
260
|
+
if (mode !== "normal" && mode !== "offline" && mode !== "cold") {
|
|
261
|
+
throw new Error("mode must be 'normal' | 'offline' | 'cold'");
|
|
262
|
+
}
|
|
263
|
+
(0, _overrides.setNetworkMode)(mode);
|
|
264
|
+
return {
|
|
265
|
+
ok: true,
|
|
266
|
+
modes: (0, _overrides.getGlobalModes)()
|
|
267
|
+
};
|
|
268
|
+
},
|
|
269
|
+
/** Chrome-style disable-images. Params: { enabled: boolean }. */
|
|
270
|
+
setBlankImages: params => {
|
|
271
|
+
(0, _overrides.setBlankImages)(params?.enabled === true);
|
|
272
|
+
return {
|
|
273
|
+
ok: true,
|
|
274
|
+
modes: (0, _overrides.getGlobalModes)()
|
|
275
|
+
};
|
|
276
|
+
},
|
|
277
|
+
/** Clear the captured registry (keeps in-flight loads). */
|
|
278
|
+
clearRecords: () => {
|
|
279
|
+
(0, _imageEventStore.clearRecords)();
|
|
280
|
+
return {
|
|
281
|
+
ok: true,
|
|
282
|
+
message: "Registry cleared"
|
|
283
|
+
};
|
|
284
|
+
},
|
|
285
|
+
/** Clear expo-image caches. Params: { memory?, disk? } (default both). */
|
|
286
|
+
clearExpoCaches: async params => {
|
|
287
|
+
const p = params ?? {};
|
|
288
|
+
const doMemory = p.memory !== false;
|
|
289
|
+
const doDisk = p.disk !== false;
|
|
290
|
+
try {
|
|
291
|
+
const expo = require("expo-image");
|
|
292
|
+
const results = [];
|
|
293
|
+
if (doMemory) {
|
|
294
|
+
await expo.Image.clearMemoryCache();
|
|
295
|
+
results.push("memory");
|
|
296
|
+
}
|
|
297
|
+
if (doDisk) {
|
|
298
|
+
await expo.Image.clearDiskCache();
|
|
299
|
+
results.push("disk");
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
ok: true,
|
|
303
|
+
message: `Cleared expo-image ${results.join(" + ")} cache`
|
|
304
|
+
};
|
|
305
|
+
} catch {
|
|
306
|
+
return {
|
|
307
|
+
ok: false,
|
|
308
|
+
message: "expo-image not installed"
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
getCaptureStatus: () => (0, _install.getCaptureStatus)()
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
//# sourceMappingURL=imagesSyncAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_actions","require","_install","_overrides","_savings","_insights","_imageEventStore","toWire","record","factor","oversizeFactor","id","lib","uri","kind","sourceKind","status","mounted","cache","cacheVerdict","cacheSource","cacheVerdictSource","ms","durationMs","Math","round","intrinsic","layout","width","height","neededPx","neededPixels","decodedKB","estDecodedBytes","wastedKB","estWastedBytes","progressSeen","bytesTotal","error","errorCode","loadCount","overrideLabel","hasAltText","layoutShifts","ageMs","Date","now","createdAt","requireRecord","params","Error","getRecord","overview","snapshot","getSnapshot","stats","computeStats","captureStatus","getCaptureStatus","globalModes","getGlobalModes","insights","computeInsights","records","reverse","imagesSyncAdapter","exports","version","rest","slice","map","subscribe","onChange","actions","list","p","limit","min","max","filtered","filter","r","total","length","getDetail","errorHeaders","hardReload","hardReloadRecord","proveSavings","retry","retryRecord","evictDisk","evicted","evictExpoDiskEntry","ok","message","flash","flashRecord","setOverride","kinds","source","type","label","hang","blank","entry","undefined","String","clearOverride","massAction","n","setOverrideForAllMounted","hardReloadAllMounted","flashAllMounted","clearAllOverrides","setNetworkMode","mode","modes","setBlankImages","enabled","clearRecords","clearExpoCaches","doMemory","memory","doDisk","disk","expo","results","Image","clearMemoryCache","push","clearDiskCache","join"],"sourceRoot":"../../../src","sources":["sync/imagesSyncAdapter.ts"],"mappings":";;;;;;AAUA,IAAAA,QAAA,GAAAC,OAAA;AAMA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AAWA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AAEA,IAAAK,gBAAA,GAAAL,OAAA;AA/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAoCA;AACA,SAASM,MAAMA,CAACC,MAAmB,EAAE;EACnC,MAAMC,MAAM,GAAG,IAAAC,+BAAc,EAACF,MAAM,CAAC;EACrC,OAAO;IACLG,EAAE,EAAEH,MAAM,CAACG,EAAE;IACbC,GAAG,EAAEJ,MAAM,CAACI,GAAG;IACfC,GAAG,EAAEL,MAAM,CAACK,GAAG;IACfC,IAAI,EAAEN,MAAM,CAACO,UAAU;IACvBC,MAAM,EAAER,MAAM,CAACQ,MAAM;IACrBC,OAAO,EAAET,MAAM,CAACS,OAAO;IACvBC,KAAK,EAAEV,MAAM,CAACW,YAAY,IAAI,IAAI;IAClCC,WAAW,EAAEZ,MAAM,CAACa,kBAAkB,IAAI,IAAI;IAC9CC,EAAE,EAAEd,MAAM,CAACe,UAAU,IAAI,IAAI,GAAGC,IAAI,CAACC,KAAK,CAACjB,MAAM,CAACe,UAAU,CAAC,GAAG,IAAI;IACpEG,SAAS,EAAElB,MAAM,CAACkB,SAAS,IAAI,IAAI;IACnCC,MAAM,EAAEnB,MAAM,CAACmB,MAAM,GACjB;MACEC,KAAK,EAAEJ,IAAI,CAACC,KAAK,CAACjB,MAAM,CAACmB,MAAM,CAACC,KAAK,CAAC;MACtCC,MAAM,EAAEL,IAAI,CAACC,KAAK,CAACjB,MAAM,CAACmB,MAAM,CAACE,MAAM;IACzC,CAAC,GACD,IAAI;IACRC,QAAQ,EAAE,IAAAC,6BAAY,EAACvB,MAAM,CAAC;IAC9BE,cAAc,EAAED,MAAM,IAAI,IAAI,GAAGe,IAAI,CAACC,KAAK,CAAChB,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI;IACtEuB,SAAS,EAAER,IAAI,CAACC,KAAK,CAAC,IAAAQ,gCAAe,EAACzB,MAAM,CAAC,GAAG,IAAI,CAAC;IACrD0B,QAAQ,EAAEV,IAAI,CAACC,KAAK,CAAC,IAAAU,+BAAc,EAAC3B,MAAM,CAAC,GAAG,IAAI,CAAC;IACnD4B,YAAY,EAAE5B,MAAM,CAAC4B,YAAY,KAAK,IAAI;IAC1CC,UAAU,EAAE7B,MAAM,CAAC6B,UAAU,IAAI,IAAI;IACrCC,KAAK,EAAE9B,MAAM,CAAC8B,KAAK,IAAI,IAAI;IAC3BC,SAAS,EAAE/B,MAAM,CAAC+B,SAAS,IAAI,IAAI;IACnCC,SAAS,EAAEhC,MAAM,CAACgC,SAAS;IAC3BC,aAAa,EAAEjC,MAAM,CAACiC,aAAa,IAAI,IAAI;IAC3CC,UAAU,EAAElC,MAAM,CAACkC,UAAU,IAAI,IAAI;IACrCC,YAAY,EAAEnC,MAAM,CAACmC,YAAY,IAAI,CAAC;IACtCC,KAAK,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGtC,MAAM,CAACuC;EAC7B,CAAC;AACH;AAEA,SAASC,aAAaA,CAACC,MAAe,EAAe;EACnD,MAAMtC,EAAE,GAAIsC,MAAM,EAAsBtC,EAAE;EAC1C,IAAI,OAAOA,EAAE,KAAK,QAAQ,EAAE,MAAM,IAAIuC,KAAK,CAAC,4BAA4B,CAAC;EACzE,MAAM1C,MAAM,GAAG,IAAA2C,0BAAS,EAACxC,EAAE,CAAC;EAC5B,IAAI,CAACH,MAAM,EAAE;IACX,MAAM,IAAI0C,KAAK,CACb,gBAAgBvC,EAAE,2EACpB,CAAC;EACH;EACA,OAAOH,MAAM;AACf;AAEA,SAAS4C,QAAQA,CAAA,EAAG;EAClB,MAAMC,QAAQ,GAAG,IAAAC,4BAAW,EAAC,CAAC;EAC9B,OAAO;IACLC,KAAK,EAAE,IAAAC,6BAAY,EAACH,QAAQ,CAAC;IAC7BI,aAAa,EAAE,IAAAC,yBAAgB,EAAC,CAAC;IACjCC,WAAW,EAAE,IAAAC,yBAAc,EAAC,CAAC;IAC7BC,QAAQ,EAAE,IAAAC,yBAAe,EAACT,QAAQ,CAAC;IACnCU,OAAO,EAAE,CAAC,GAAGV,QAAQ,CAAC,CAACW,OAAO,CAAC,CAAC,CAAE;EACpC,CAAC;AACH;AAEO,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAG;EAC/BE,OAAO,EAAE,CAAC;EACVb,WAAW,EAAEA,CAAA,KAAM;IACjB,MAAM;MAAES,OAAO;MAAE,GAAGK;IAAK,CAAC,GAAGhB,QAAQ,CAAC,CAAC;IACvC,OAAO;MAAE,GAAGgB,IAAI;MAAEL,OAAO,EAAEA,OAAO,CAACM,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAACC,GAAG,CAAC/D,MAAM;IAAE,CAAC;EAChE,CAAC;EACDgE,SAAS,EAAGC,QAAoB,IAAK,IAAAD,0BAAS,EAACC,QAAQ,CAAC;EACxDC,OAAO,EAAE;IACP;IACAC,IAAI,EAAGzB,MAAe,IAAK;MACzB,MAAM0B,CAAC,GAAI1B,MAAM,IAAI,CAAC,CAAyC;MAC/D,MAAM2B,KAAK,GAAGpD,IAAI,CAACqD,GAAG,CAACrD,IAAI,CAACsD,GAAG,CAACH,CAAC,CAACC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;MACvD,MAAM;QAAEb,OAAO;QAAE,GAAGK;MAAK,CAAC,GAAGhB,QAAQ,CAAC,CAAC;MACvC,MAAM2B,QAAQ,GAAGJ,CAAC,CAAC3D,MAAM,GACrB+C,OAAO,CAACiB,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAACjE,MAAM,KAAK2D,CAAC,CAAC3D,MAAM,CAAC,GAC5C+C,OAAO;MACX,OAAO;QACL,GAAGK,IAAI;QACPc,KAAK,EAAEH,QAAQ,CAACI,MAAM;QACtBpB,OAAO,EAAEgB,QAAQ,CAACV,KAAK,CAAC,CAAC,EAAEO,KAAK,CAAC,CAACN,GAAG,CAAC/D,MAAM;MAC9C,CAAC;IACH,CAAC;IACD;IACA6E,SAAS,EAAGnC,MAAe,IAAK;MAC9B,MAAMzC,MAAM,GAAGwC,aAAa,CAACC,MAAM,CAAC;MACpC,OAAO;QAAE,GAAG1C,MAAM,CAACC,MAAM,CAAC;QAAE6E,YAAY,EAAE7E,MAAM,CAAC6E,YAAY,IAAI;MAAK,CAAC;IACzE,CAAC;IACD;IACAC,UAAU,EAAGrC,MAAe,IAAK,IAAAsC,yBAAgB,EAACvC,aAAa,CAACC,MAAM,CAAC,CAAC;IACxE;IACAuC,YAAY,EAAGvC,MAAe,IAAK,IAAAuC,qBAAY,EAACxC,aAAa,CAACC,MAAM,CAAC,CAAC;IACtE;IACAwC,KAAK,EAAGxC,MAAe,IAAK,IAAAyC,oBAAW,EAAC1C,aAAa,CAACC,MAAM,CAAC,CAAC;IAC9D;IACA0C,SAAS,EAAE,MAAO1C,MAAe,IAAK;MACpC,MAAMzC,MAAM,GAAGwC,aAAa,CAACC,MAAM,CAAC;MACpC,MAAM2C,OAAO,GAAG,MAAM,IAAAC,2BAAkB,EAACrF,MAAM,CAAC;MAChD,OAAO;QACLsF,EAAE,EAAEF,OAAO;QACXG,OAAO,EAAEH,OAAO,GACZ,0BAA0B,GAC1B;MACN,CAAC;IACH,CAAC;IACD;IACAI,KAAK,EAAG/C,MAAe,IAAK;MAC1B,IAAAgD,sBAAW,EAACjD,aAAa,CAACC,MAAM,CAAC,CAACtC,EAAE,CAAC;MACrC,OAAO;QAAEmF,EAAE,EAAE,IAAI;QAAEC,OAAO,EAAE;MAAoB,CAAC;IACnD,CAAC;IACD;AACJ;AACA;AACA;IACIG,WAAW,EAAGjD,MAAe,IAAK;MAChC,MAAMzC,MAAM,GAAGwC,aAAa,CAACC,MAAM,CAAC;MACpC,MAAM0B,CAAC,GAAG1B,MAAyC;MACnD,MAAMkD,KAAgE,GAAG;QACvE7D,KAAK,EAAE;UAAE8D,MAAM,EAAE;YAAEC,IAAI,EAAE;UAAQ,CAAC;UAAEC,KAAK,EAAE;QAAe,CAAC;QAC3DC,IAAI,EAAE;UAAEH,MAAM,EAAE;YAAEC,IAAI,EAAE;UAAO,CAAC;UAAEC,KAAK,EAAE;QAAiB,CAAC;QAC3DE,KAAK,EAAE;UAAEJ,MAAM,EAAE;YAAEC,IAAI,EAAE;UAAQ,CAAC;UAAEC,KAAK,EAAE;QAAU;MACvD,CAAC;MACD,IAAI3B,CAAC,CAAC7D,IAAI,KAAK,KAAK,EAAE;QACpB,IAAI,CAAC6D,CAAC,CAAC9D,GAAG,EAAE,MAAM,IAAIqC,KAAK,CAAC,mCAAmC,CAAC;QAChE,IAAAgD,sBAAW,EAAC1F,MAAM,CAACG,EAAE,EAAE;UACrByF,MAAM,EAAE;YAAEC,IAAI,EAAE,KAAK;YAAExF,GAAG,EAAE8D,CAAC,CAAC9D;UAAI,CAAC;UACnCyF,KAAK,EAAE;QACT,CAAC,CAAC;QACF,OAAO;UAAER,EAAE,EAAE,IAAI;UAAEC,OAAO,EAAE,wBAAwBpB,CAAC,CAAC9D,GAAG;QAAG,CAAC;MAC/D;MACA,MAAM4F,KAAK,GAAG9B,CAAC,CAAC7D,IAAI,GAAGqF,KAAK,CAACxB,CAAC,CAAC7D,IAAI,CAAC,GAAG4F,SAAS;MAChD,IAAI,CAACD,KAAK,EAAE,MAAM,IAAIvD,KAAK,CAAC,0BAA0ByD,MAAM,CAAChC,CAAC,CAAC7D,IAAI,CAAC,EAAE,CAAC;MACvE,IAAI,CAACN,MAAM,CAACS,OAAO,EAAE;QACnB,OAAO;UAAE6E,EAAE,EAAE,KAAK;UAAEC,OAAO,EAAE;QAA0D,CAAC;MAC1F;MACA,IAAAG,sBAAW,EAAC1F,MAAM,CAACG,EAAE,EAAE8F,KAAK,CAAC;MAC7B,OAAO;QAAEX,EAAE,EAAE,IAAI;QAAEC,OAAO,EAAE,GAAGU,KAAK,CAACH,KAAK;MAAW,CAAC;IACxD,CAAC;IACD;IACAM,aAAa,EAAG3D,MAAe,IAAK;MAClC,IAAA2D,wBAAa,EAAC5D,aAAa,CAACC,MAAM,CAAC,CAACtC,EAAE,CAAC;MACvC,OAAO;QAAEmF,EAAE,EAAE,IAAI;QAAEC,OAAO,EAAE;MAA8C,CAAC;IAC7E,CAAC;IACD;AACJ;AACA;AACA;IACIc,UAAU,EAAE,MAAO5D,MAAe,IAAK;MACrC,MAAMnC,IAAI,GAAImC,MAAM,EAAwBnC,IAAI;MAChD,QAAQA,IAAI;QACV,KAAK,OAAO;UAAE;YACZ,MAAMgG,CAAC,GAAG,IAAAC,mCAAwB,EAAC;cAAEV,IAAI,EAAE;YAAQ,CAAC,EAAE,cAAc,CAAC;YACrE,OAAO;cAAEP,EAAE,EAAEgB,CAAC,GAAG,CAAC;cAAEf,OAAO,EAAE,mBAAmBe,CAAC;YAAU,CAAC;UAC9D;QACA,KAAK,SAAS;UAAE;YACd,MAAMA,CAAC,GAAG,IAAAC,mCAAwB,EAAC;cAAEV,IAAI,EAAE;YAAO,CAAC,EAAE,gBAAgB,CAAC;YACtE,OAAO;cAAEP,EAAE,EAAEgB,CAAC,GAAG,CAAC;cAAEf,OAAO,EAAE,qBAAqBe,CAAC;YAAU,CAAC;UAChE;QACA,KAAK,OAAO;UAAE;YACZ,MAAMA,CAAC,GAAG,IAAAC,mCAAwB,EAAC;cAAEV,IAAI,EAAE;YAAQ,CAAC,EAAE,SAAS,CAAC;YAChE,OAAO;cAAEP,EAAE,EAAEgB,CAAC,GAAG,CAAC;cAAEf,OAAO,EAAE,WAAWe,CAAC;YAAU,CAAC;UACtD;QACA,KAAK,QAAQ;UACX,OAAO,IAAAE,6BAAoB,EAAC,CAAC;QAC/B,KAAK,OAAO;UAAE;YACZ,MAAMF,CAAC,GAAG,IAAAG,0BAAe,EAAC,CAAC;YAC3B,OAAO;cAAEnB,EAAE,EAAEgB,CAAC,GAAG,CAAC;cAAEf,OAAO,EAAE,YAAYe,CAAC;YAAU,CAAC;UACvD;QACA,KAAK,SAAS;UAAE;YACd,MAAMA,CAAC,GAAG,IAAAI,4BAAiB,EAAC,CAAC;YAC7B,OAAO;cAAEpB,EAAE,EAAE,IAAI;cAAEC,OAAO,EAAE,YAAYe,CAAC;YAAU,CAAC;UACtD;QACA;UACE,MAAM,IAAI5D,KAAK,CAAC,sBAAsByD,MAAM,CAAC7F,IAAI,CAAC,EAAE,CAAC;MACzD;IACF,CAAC;IACD;IACAqG,cAAc,EAAGlE,MAAe,IAAK;MACnC,MAAMmE,IAAI,GAAInE,MAAM,EAA6BmE,IAAI;MACrD,IAAIA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,SAAS,IAAIA,IAAI,KAAK,MAAM,EAAE;QAC9D,MAAM,IAAIlE,KAAK,CAAC,4CAA4C,CAAC;MAC/D;MACA,IAAAiE,yBAAc,EAACC,IAAI,CAAC;MACpB,OAAO;QAAEtB,EAAE,EAAE,IAAI;QAAEuB,KAAK,EAAE,IAAAzD,yBAAc,EAAC;MAAE,CAAC;IAC9C,CAAC;IACD;IACA0D,cAAc,EAAGrE,MAAe,IAAK;MACnC,IAAAqE,yBAAc,EAAErE,MAAM,EAA4BsE,OAAO,KAAK,IAAI,CAAC;MACnE,OAAO;QAAEzB,EAAE,EAAE,IAAI;QAAEuB,KAAK,EAAE,IAAAzD,yBAAc,EAAC;MAAE,CAAC;IAC9C,CAAC;IACD;IACA4D,YAAY,EAAEA,CAAA,KAAM;MAClB,IAAAA,6BAAY,EAAC,CAAC;MACd,OAAO;QAAE1B,EAAE,EAAE,IAAI;QAAEC,OAAO,EAAE;MAAmB,CAAC;IAClD,CAAC;IACD;IACA0B,eAAe,EAAE,MAAOxE,MAAe,IAAK;MAC1C,MAAM0B,CAAC,GAAI1B,MAAM,IAAI,CAAC,CAA0C;MAChE,MAAMyE,QAAQ,GAAG/C,CAAC,CAACgD,MAAM,KAAK,KAAK;MACnC,MAAMC,MAAM,GAAGjD,CAAC,CAACkD,IAAI,KAAK,KAAK;MAC/B,IAAI;QACF,MAAMC,IAAI,GAAG7H,OAAO,CAAC,YAAY,CAAC;QAClC,MAAM8H,OAAiB,GAAG,EAAE;QAC5B,IAAIL,QAAQ,EAAE;UACZ,MAAMI,IAAI,CAACE,KAAK,CAACC,gBAAgB,CAAC,CAAC;UACnCF,OAAO,CAACG,IAAI,CAAC,QAAQ,CAAC;QACxB;QACA,IAAIN,MAAM,EAAE;UACV,MAAME,IAAI,CAACE,KAAK,CAACG,cAAc,CAAC,CAAC;UACjCJ,OAAO,CAACG,IAAI,CAAC,MAAM,CAAC;QACtB;QACA,OAAO;UAAEpC,EAAE,EAAE,IAAI;UAAEC,OAAO,EAAE,sBAAsBgC,OAAO,CAACK,IAAI,CAAC,KAAK,CAAC;QAAS,CAAC;MACjF,CAAC,CAAC,MAAM;QACN,OAAO;UAAEtC,EAAE,EAAE,KAAK;UAAEC,OAAO,EAAE;QAA2B,CAAC;MAC3D;IACF,CAAC;IACDrC,gBAAgB,EAAEA,CAAA,KAAM,IAAAA,yBAAgB,EAAC;EAC3C;AACF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Per-image actions: hard reload (bypass cache) and retry.
|
|
5
|
+
*
|
|
6
|
+
* RN core path: the decorator wrapper owns every mounted <Image>'s props, so a
|
|
7
|
+
* reload request re-renders the wrapper with a bumped `key` (native remount →
|
|
8
|
+
* fresh load cycle) and, for cache-busting, `source.cache: 'reload'` injected
|
|
9
|
+
* — VERIFIED supported on BOTH platforms (iOS NSURLRequest policy;
|
|
10
|
+
* Android ReactImageView.kt reads source."cache" → Fresco full-fetch). The
|
|
11
|
+
* override stays applied until the load settles, then reverts lazily on the
|
|
12
|
+
* app's next natural re-render (avoids an extra cache round-trip).
|
|
13
|
+
*
|
|
14
|
+
* expo-image path: the patched class instance exposes the public
|
|
15
|
+
* `reloadAsync()`. Cache-busting first evicts the disk entry (cache path +
|
|
16
|
+
* expo-file-system delete) and clears expo's memory cache (global — no
|
|
17
|
+
* per-entry memory eviction exists), so the reload is a true refetch that
|
|
18
|
+
* rewrites both cache tiers.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { imagesState } from "../state";
|
|
22
|
+
import { touchRecord } from "./overrides";
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// RN reload-request bus (consumed by the decorator wrapper)
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
export function subscribeActions(listener) {
|
|
28
|
+
const s = imagesState();
|
|
29
|
+
s.actionListeners.add(listener);
|
|
30
|
+
return () => imagesState().actionListeners.delete(listener);
|
|
31
|
+
}
|
|
32
|
+
export function getReloadRequest(recordId) {
|
|
33
|
+
if (recordId == null) return undefined;
|
|
34
|
+
return imagesState().reloadRequests.get(recordId);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Reload nonce for a record (0 = never requested). Snapshot for the wrapper. */
|
|
38
|
+
export function getReloadNonce(recordId) {
|
|
39
|
+
return getReloadRequest(recordId)?.nonce ?? 0;
|
|
40
|
+
}
|
|
41
|
+
function requestRnReload(recordId, bust) {
|
|
42
|
+
const s = imagesState();
|
|
43
|
+
const prev = s.reloadRequests.get(recordId);
|
|
44
|
+
s.reloadRequests.set(recordId, {
|
|
45
|
+
nonce: (prev?.nonce ?? 0) + 1,
|
|
46
|
+
bust
|
|
47
|
+
});
|
|
48
|
+
// touchRecord bumps the render version (the wrapper's snapshot) and emits.
|
|
49
|
+
touchRecord(recordId);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Mark a request consumed once its load settles (called from the tracker on
|
|
54
|
+
* load/error). Silent — the wrapper reverts the prop override on the app's
|
|
55
|
+
* next natural re-render instead of forcing an immediate one.
|
|
56
|
+
*/
|
|
57
|
+
export function settleReloadRequest(recordId) {
|
|
58
|
+
const s = imagesState();
|
|
59
|
+
const req = s.reloadRequests.get(recordId);
|
|
60
|
+
if (req?.bust) {
|
|
61
|
+
s.reloadRequests.set(recordId, {
|
|
62
|
+
nonce: req.nonce,
|
|
63
|
+
bust: false
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function dropActionState(recordId) {
|
|
68
|
+
const s = imagesState();
|
|
69
|
+
s.reloadRequests.delete(recordId);
|
|
70
|
+
s.expoInstances.delete(recordId);
|
|
71
|
+
s.overrides.delete(recordId);
|
|
72
|
+
s.flashUntil.delete(recordId);
|
|
73
|
+
s.recordVersions.delete(recordId);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// expo instance registry (populated by the render patch)
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
|
|
80
|
+
export function registerExpoInstance(recordId, instance) {
|
|
81
|
+
if (recordId == null) return;
|
|
82
|
+
imagesState().expoInstances.set(recordId, instance);
|
|
83
|
+
}
|
|
84
|
+
function expoImageStatics() {
|
|
85
|
+
try {
|
|
86
|
+
return require("expo-image").Image ?? null;
|
|
87
|
+
} catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* expo-file-system, legacy path first (v19+/SDK 54+ moved the function API
|
|
93
|
+
* there) then the main import — same pattern as shared-ui's persistentStorage.
|
|
94
|
+
*/
|
|
95
|
+
function loadFileSystem() {
|
|
96
|
+
try {
|
|
97
|
+
const mod = require("expo-file-system/legacy");
|
|
98
|
+
const fs = mod?.default || mod;
|
|
99
|
+
if (fs?.deleteAsync) return fs;
|
|
100
|
+
} catch {
|
|
101
|
+
// try main import
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const mod = require("expo-file-system");
|
|
105
|
+
const fs = mod?.default || mod;
|
|
106
|
+
if (fs?.deleteAsync) return fs;
|
|
107
|
+
} catch {
|
|
108
|
+
// not installed
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Delete an expo-image disk-cache entry (JS-only: cache path + file delete).
|
|
115
|
+
* Returns true if an entry existed and was deleted.
|
|
116
|
+
*/
|
|
117
|
+
export async function evictExpoDiskEntry(record) {
|
|
118
|
+
const statics = expoImageStatics();
|
|
119
|
+
const fileSystem = loadFileSystem();
|
|
120
|
+
if (!statics?.getCachePathAsync || !fileSystem?.deleteAsync || !record.uri) return false;
|
|
121
|
+
try {
|
|
122
|
+
const path = await statics.getCachePathAsync(record.uri);
|
|
123
|
+
if (!path) return false;
|
|
124
|
+
const uri = path.startsWith("file://") ? path : `file://${path}`;
|
|
125
|
+
await fileSystem.deleteAsync(uri, {
|
|
126
|
+
idempotent: true
|
|
127
|
+
});
|
|
128
|
+
return true;
|
|
129
|
+
} catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// High-level dispatchers (used by the detail view)
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
|
|
138
|
+
/** Fresh load attempt for a mounted image (no cache bypass). */
|
|
139
|
+
export async function retryRecord(record) {
|
|
140
|
+
if (!record.mounted) {
|
|
141
|
+
return {
|
|
142
|
+
ok: false,
|
|
143
|
+
message: "Instance unmounted — cannot reload"
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (record.lib === "expo") {
|
|
147
|
+
const instance = imagesState().expoInstances.get(record.id);
|
|
148
|
+
if (!instance?.reloadAsync) {
|
|
149
|
+
return {
|
|
150
|
+
ok: false,
|
|
151
|
+
message: "Live instance not reachable"
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
await instance.reloadAsync();
|
|
155
|
+
return {
|
|
156
|
+
ok: true,
|
|
157
|
+
message: "Reload requested"
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
requestRnReload(record.id, false);
|
|
161
|
+
return {
|
|
162
|
+
ok: true,
|
|
163
|
+
message: "Remounting image"
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Hard-reload every mounted image (mass cache-bust). Returns count started. */
|
|
168
|
+
export async function hardReloadAllMounted() {
|
|
169
|
+
const {
|
|
170
|
+
getSnapshot
|
|
171
|
+
} = require("../store/imageEventStore");
|
|
172
|
+
let count = 0;
|
|
173
|
+
for (const record of getSnapshot()) {
|
|
174
|
+
if (!record.mounted) continue;
|
|
175
|
+
const result = await hardReloadRecord(record);
|
|
176
|
+
if (result.ok) count++;
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
ok: count > 0,
|
|
180
|
+
message: `Hard-reloading ${count} mounted image${count === 1 ? "" : "s"}`
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Bypass-cache reload: refetches from network and rewrites the caches. */
|
|
185
|
+
export async function hardReloadRecord(record) {
|
|
186
|
+
if (!record.mounted) {
|
|
187
|
+
return {
|
|
188
|
+
ok: false,
|
|
189
|
+
message: "Instance unmounted — cannot reload"
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (record.sourceKind !== "network") {
|
|
193
|
+
// Local/asset sources have no HTTP cache to bust — plain remount instead.
|
|
194
|
+
return retryRecord(record);
|
|
195
|
+
}
|
|
196
|
+
if (record.lib === "expo") {
|
|
197
|
+
const evicted = await evictExpoDiskEntry(record);
|
|
198
|
+
const statics = expoImageStatics();
|
|
199
|
+
// No per-entry memory eviction exists — global clear is the honest option.
|
|
200
|
+
await statics?.clearMemoryCache?.().catch?.(() => false);
|
|
201
|
+
const result = await retryRecord(record);
|
|
202
|
+
if (!result.ok) return result;
|
|
203
|
+
return {
|
|
204
|
+
ok: true,
|
|
205
|
+
message: evicted ? "Disk entry evicted, memory cache cleared, refetching" : "Memory cache cleared, refetching (no disk entry found)"
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
requestRnReload(record.id, true);
|
|
209
|
+
return {
|
|
210
|
+
ok: true,
|
|
211
|
+
message: "Refetching with cache bypassed"
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["imagesState","touchRecord","subscribeActions","listener","s","actionListeners","add","delete","getReloadRequest","recordId","undefined","reloadRequests","get","getReloadNonce","nonce","requestRnReload","bust","prev","set","settleReloadRequest","req","dropActionState","expoInstances","overrides","flashUntil","recordVersions","registerExpoInstance","instance","expoImageStatics","require","Image","loadFileSystem","mod","fs","default","deleteAsync","evictExpoDiskEntry","record","statics","fileSystem","getCachePathAsync","uri","path","startsWith","idempotent","retryRecord","mounted","ok","message","lib","id","reloadAsync","hardReloadAllMounted","getSnapshot","count","result","hardReloadRecord","sourceKind","evicted","clearMemoryCache","catch"],"sourceRoot":"../../../src","sources":["capture/actions.ts"],"mappings":"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","ignoreList":[]}
|