@rockhall/electron-offline-content 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +384 -0
- package/LICENSE +21 -0
- package/README.md +794 -0
- package/dist/internal/asset-file-name.cjs +13 -0
- package/dist/internal/asset-file-name.cjs.map +1 -0
- package/dist/internal/asset-file-name.d.cts +6 -0
- package/dist/internal/asset-file-name.d.cts.map +1 -0
- package/dist/internal/asset-file-name.d.ts +6 -0
- package/dist/internal/asset-file-name.d.ts.map +1 -0
- package/dist/internal/asset-file-name.js +12 -0
- package/dist/internal/asset-file-name.js.map +1 -0
- package/dist/internal/asset-key.cjs +30 -0
- package/dist/internal/asset-key.cjs.map +1 -0
- package/dist/internal/asset-key.d.cts +19 -0
- package/dist/internal/asset-key.d.cts.map +1 -0
- package/dist/internal/asset-key.d.ts +19 -0
- package/dist/internal/asset-key.d.ts.map +1 -0
- package/dist/internal/asset-key.js +27 -0
- package/dist/internal/asset-key.js.map +1 -0
- package/dist/internal/log-format.cjs +98 -0
- package/dist/internal/log-format.cjs.map +1 -0
- package/dist/internal/log-format.d.cts +10 -0
- package/dist/internal/log-format.d.cts.map +1 -0
- package/dist/internal/log-format.d.ts +10 -0
- package/dist/internal/log-format.d.ts.map +1 -0
- package/dist/internal/log-format.js +97 -0
- package/dist/internal/log-format.js.map +1 -0
- package/dist/internal/media-kind.cjs +46 -0
- package/dist/internal/media-kind.cjs.map +1 -0
- package/dist/internal/media-kind.d.cts +20 -0
- package/dist/internal/media-kind.d.cts.map +1 -0
- package/dist/internal/media-kind.d.ts +20 -0
- package/dist/internal/media-kind.d.ts.map +1 -0
- package/dist/internal/media-kind.js +45 -0
- package/dist/internal/media-kind.js.map +1 -0
- package/dist/internal/url-warn.cjs +14 -0
- package/dist/internal/url-warn.cjs.map +1 -0
- package/dist/internal/url-warn.d.cts +10 -0
- package/dist/internal/url-warn.d.cts.map +1 -0
- package/dist/internal/url-warn.d.ts +10 -0
- package/dist/internal/url-warn.d.ts.map +1 -0
- package/dist/internal/url-warn.js +13 -0
- package/dist/internal/url-warn.js.map +1 -0
- package/dist/internal/validation.cjs +222 -0
- package/dist/internal/validation.cjs.map +1 -0
- package/dist/internal/validation.d.cts +78 -0
- package/dist/internal/validation.d.cts.map +1 -0
- package/dist/internal/validation.d.ts +78 -0
- package/dist/internal/validation.d.ts.map +1 -0
- package/dist/internal/validation.js +196 -0
- package/dist/internal/validation.js.map +1 -0
- package/dist/main/asset-download.cjs +265 -0
- package/dist/main/asset-download.cjs.map +1 -0
- package/dist/main/asset-download.d.cts +12 -0
- package/dist/main/asset-download.d.cts.map +1 -0
- package/dist/main/asset-download.d.ts +12 -0
- package/dist/main/asset-download.d.ts.map +1 -0
- package/dist/main/asset-download.js +263 -0
- package/dist/main/asset-download.js.map +1 -0
- package/dist/main/database.cjs +473 -0
- package/dist/main/database.cjs.map +1 -0
- package/dist/main/database.d.cts +81 -0
- package/dist/main/database.d.cts.map +1 -0
- package/dist/main/database.d.ts +81 -0
- package/dist/main/database.d.ts.map +1 -0
- package/dist/main/database.js +472 -0
- package/dist/main/database.js.map +1 -0
- package/dist/main/index.cjs +22 -0
- package/dist/main/index.d.cts +7 -0
- package/dist/main/index.d.ts +7 -0
- package/dist/main/index.js +7 -0
- package/dist/main/media-cache.cjs +862 -0
- package/dist/main/media-cache.cjs.map +1 -0
- package/dist/main/media-cache.d.cts +134 -0
- package/dist/main/media-cache.d.cts.map +1 -0
- package/dist/main/media-cache.d.ts +134 -0
- package/dist/main/media-cache.d.ts.map +1 -0
- package/dist/main/media-cache.js +854 -0
- package/dist/main/media-cache.js.map +1 -0
- package/dist/main/storage-root-lock.cjs +124 -0
- package/dist/main/storage-root-lock.cjs.map +1 -0
- package/dist/main/storage-root-lock.d.cts +11 -0
- package/dist/main/storage-root-lock.d.cts.map +1 -0
- package/dist/main/storage-root-lock.d.ts +11 -0
- package/dist/main/storage-root-lock.d.ts.map +1 -0
- package/dist/main/storage-root-lock.js +120 -0
- package/dist/main/storage-root-lock.js.map +1 -0
- package/dist/main/store.cjs +197 -0
- package/dist/main/store.cjs.map +1 -0
- package/dist/main/store.d.cts +83 -0
- package/dist/main/store.d.cts.map +1 -0
- package/dist/main/store.d.ts +83 -0
- package/dist/main/store.d.ts.map +1 -0
- package/dist/main/store.js +195 -0
- package/dist/main/store.js.map +1 -0
- package/dist/preload/index.cjs +36 -0
- package/dist/preload/index.cjs.map +1 -0
- package/dist/preload/index.d.cts +14 -0
- package/dist/preload/index.d.cts.map +1 -0
- package/dist/preload/index.d.ts +14 -0
- package/dist/preload/index.d.ts.map +1 -0
- package/dist/preload/index.js +34 -0
- package/dist/preload/index.js.map +1 -0
- package/dist/react/index.cjs +199 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +50 -0
- package/dist/react/index.d.cts.map +1 -0
- package/dist/react/index.d.ts +50 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +191 -0
- package/dist/react/index.js.map +1 -0
- package/dist/renderer/helpers.cjs +36 -0
- package/dist/renderer/helpers.cjs.map +1 -0
- package/dist/renderer/helpers.d.cts +11 -0
- package/dist/renderer/helpers.d.cts.map +1 -0
- package/dist/renderer/helpers.d.ts +11 -0
- package/dist/renderer/helpers.d.ts.map +1 -0
- package/dist/renderer/helpers.js +35 -0
- package/dist/renderer/helpers.js.map +1 -0
- package/dist/renderer/index.cjs +20 -0
- package/dist/renderer/index.cjs.map +1 -0
- package/dist/renderer/index.d.cts +14 -0
- package/dist/renderer/index.d.cts.map +1 -0
- package/dist/renderer/index.d.ts +14 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +14 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/runtime.cjs +278 -0
- package/dist/renderer/runtime.cjs.map +1 -0
- package/dist/renderer/runtime.d.cts +35 -0
- package/dist/renderer/runtime.d.cts.map +1 -0
- package/dist/renderer/runtime.d.ts +35 -0
- package/dist/renderer/runtime.d.ts.map +1 -0
- package/dist/renderer/runtime.js +273 -0
- package/dist/renderer/runtime.js.map +1 -0
- package/dist/renderer/window-globals.d.cts +9 -0
- package/dist/renderer/window-globals.d.cts.map +1 -0
- package/dist/renderer/window-globals.d.ts +9 -0
- package/dist/renderer/window-globals.d.ts.map +1 -0
- package/dist/shared/errors.cjs +102 -0
- package/dist/shared/errors.cjs.map +1 -0
- package/dist/shared/errors.d.cts +45 -0
- package/dist/shared/errors.d.cts.map +1 -0
- package/dist/shared/errors.d.ts +45 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +93 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/ipc.cjs +14 -0
- package/dist/shared/ipc.cjs.map +1 -0
- package/dist/shared/ipc.d.cts +12 -0
- package/dist/shared/ipc.d.cts.map +1 -0
- package/dist/shared/ipc.d.ts +12 -0
- package/dist/shared/ipc.d.ts.map +1 -0
- package/dist/shared/ipc.js +13 -0
- package/dist/shared/ipc.js.map +1 -0
- package/dist/shared/normalize.cjs +19 -0
- package/dist/shared/normalize.cjs.map +1 -0
- package/dist/shared/normalize.d.cts +11 -0
- package/dist/shared/normalize.d.cts.map +1 -0
- package/dist/shared/normalize.d.ts +11 -0
- package/dist/shared/normalize.d.ts.map +1 -0
- package/dist/shared/normalize.js +18 -0
- package/dist/shared/normalize.js.map +1 -0
- package/dist/shared/pagination.cjs +32 -0
- package/dist/shared/pagination.cjs.map +1 -0
- package/dist/shared/pagination.d.cts +14 -0
- package/dist/shared/pagination.d.cts.map +1 -0
- package/dist/shared/pagination.d.ts +14 -0
- package/dist/shared/pagination.d.ts.map +1 -0
- package/dist/shared/pagination.js +28 -0
- package/dist/shared/pagination.js.map +1 -0
- package/dist/shared/stem.cjs +16 -0
- package/dist/shared/stem.cjs.map +1 -0
- package/dist/shared/stem.d.cts +6 -0
- package/dist/shared/stem.d.cts.map +1 -0
- package/dist/shared/stem.d.ts +6 -0
- package/dist/shared/stem.d.ts.map +1 -0
- package/dist/shared/stem.js +14 -0
- package/dist/shared/stem.js.map +1 -0
- package/dist/shared/types.cjs +15 -0
- package/dist/shared/types.cjs.map +1 -0
- package/dist/shared/types.d.cts +234 -0
- package/dist/shared/types.d.cts.map +1 -0
- package/dist/shared/types.d.ts +234 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +14 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +120 -0
- package/skills/authenticated-downloads/SKILL.md +203 -0
- package/skills/cache-configuration/SKILL.md +357 -0
- package/skills/cache-configuration/references/options.md +356 -0
- package/skills/getting-started/SKILL.md +407 -0
- package/skills/production-checklist/SKILL.md +397 -0
- package/skills/react-rendering/SKILL.md +424 -0
- package/skills/react-rendering/references/hooks.md +443 -0
- package/skills/store-authoring/SKILL.md +369 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_shared_ipc = require("../shared/ipc.cjs");
|
|
3
|
+
let electron = require("electron");
|
|
4
|
+
//#region src/preload/index.ts
|
|
5
|
+
/**
|
|
6
|
+
* Builds a {@link import("../shared/types.js").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.
|
|
7
|
+
*/
|
|
8
|
+
function createMediaCacheBridge() {
|
|
9
|
+
return {
|
|
10
|
+
getStatus: () => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.getStatus),
|
|
11
|
+
syncNow: () => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.syncNow),
|
|
12
|
+
getAsset: (key) => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.getAsset, key),
|
|
13
|
+
listByIndex: (indexName, value, pagination) => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.listByIndex, indexName, value, pagination),
|
|
14
|
+
findByFileStem: (stem, pagination) => electron.ipcRenderer.invoke(require_shared_ipc.MEDIA_CACHE_IPC.findByFileStem, stem, pagination),
|
|
15
|
+
subscribeStatus: (listener) => {
|
|
16
|
+
const wrapped = (_event, status) => listener(status);
|
|
17
|
+
electron.ipcRenderer.on(require_shared_ipc.MEDIA_CACHE_IPC.statusChanged, wrapped);
|
|
18
|
+
return () => {
|
|
19
|
+
electron.ipcRenderer.removeListener(require_shared_ipc.MEDIA_CACHE_IPC.statusChanged, wrapped);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.
|
|
26
|
+
*/
|
|
27
|
+
function exposeMediaCacheBridge(options) {
|
|
28
|
+
const bridge = createMediaCacheBridge();
|
|
29
|
+
electron.contextBridge.exposeInMainWorld(options?.key ?? "mediaCache", bridge);
|
|
30
|
+
return bridge;
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
exports.createMediaCacheBridge = createMediaCacheBridge;
|
|
34
|
+
exports.exposeMediaCacheBridge = exposeMediaCacheBridge;
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["ipcRenderer","MEDIA_CACHE_IPC"],"sources":["../../src/preload/index.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from \"electron\";\nimport { MEDIA_CACHE_IPC } from \"../shared/ipc.js\";\nimport type { MediaCacheBridge, PaginationInput, PreloadExposeOptions } from \"../shared/types.js\";\n\n/**\n * Builds a {@link import(\"../shared/types.js\").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.\n */\nexport function createMediaCacheBridge(): MediaCacheBridge {\n return {\n getStatus: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.getStatus),\n syncNow: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.syncNow),\n getAsset: (key) => ipcRenderer.invoke(MEDIA_CACHE_IPC.getAsset, key),\n listByIndex: (indexName, value, pagination?: PaginationInput) =>\n ipcRenderer.invoke(MEDIA_CACHE_IPC.listByIndex, indexName, value, pagination),\n findByFileStem: (stem, pagination?: PaginationInput) =>\n ipcRenderer.invoke(MEDIA_CACHE_IPC.findByFileStem, stem, pagination),\n subscribeStatus: (listener) => {\n const wrapped = (\n _event: Electron.IpcRendererEvent,\n status: Awaited<ReturnType<MediaCacheBridge[\"getStatus\"]>>,\n ) => listener(status);\n ipcRenderer.on(MEDIA_CACHE_IPC.statusChanged, wrapped);\n return () => {\n ipcRenderer.removeListener(MEDIA_CACHE_IPC.statusChanged, wrapped);\n };\n },\n };\n}\n\n/**\n * Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.\n */\nexport function exposeMediaCacheBridge(options?: PreloadExposeOptions): MediaCacheBridge {\n const bridge = createMediaCacheBridge();\n contextBridge.exposeInMainWorld(options?.key ?? \"mediaCache\", bridge);\n return bridge;\n}\n\nexport type { MediaCacheBridge } from \"../shared/types.js\";\n"],"mappings":";;;;;;;AAOA,SAAgB,yBAA2C;CACzD,OAAO;EACL,iBAAiBA,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,UAAU;EAC9D,eAAeD,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,QAAQ;EAC1D,WAAW,QAAQD,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,UAAU,IAAI;EACpE,cAAc,WAAW,OAAO,eAC9BD,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,aAAa,WAAW,OAAO,WAAW;EAC/E,iBAAiB,MAAM,eACrBD,SAAAA,YAAY,OAAOC,mBAAAA,gBAAgB,gBAAgB,MAAM,WAAW;EACtE,kBAAkB,aAAa;GAC7B,MAAM,WACJ,QACA,WACG,SAAS,OAAO;GACrB,SAAA,YAAY,GAAGA,mBAAAA,gBAAgB,eAAe,QAAQ;GACtD,aAAa;IACX,SAAA,YAAY,eAAeA,mBAAAA,gBAAgB,eAAe,QAAQ;;;EAGvE;;;;;AAMH,SAAgB,uBAAuB,SAAkD;CACvF,MAAM,SAAS,wBAAwB;CACvC,SAAA,cAAc,kBAAkB,SAAS,OAAO,cAAc,OAAO;CACrE,OAAO"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MediaCacheBridge, PreloadExposeOptions } from "../shared/types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/preload/index.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Builds a {@link import("../shared/types.js").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.
|
|
6
|
+
*/
|
|
7
|
+
declare function createMediaCacheBridge(): MediaCacheBridge;
|
|
8
|
+
/**
|
|
9
|
+
* Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.
|
|
10
|
+
*/
|
|
11
|
+
declare function exposeMediaCacheBridge(options?: PreloadExposeOptions): MediaCacheBridge;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { type MediaCacheBridge, createMediaCacheBridge, exposeMediaCacheBridge };
|
|
14
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/preload/index.ts"],"mappings":";;;;;AAOA;iBAAgB,sBAAA,CAAA,GAA0B,gBAAA;;;;iBAyB1B,sBAAA,CAAuB,OAAA,GAAU,oBAAA,GAAuB,gBAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MediaCacheBridge, PreloadExposeOptions } from "../shared/types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/preload/index.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Builds a {@link import("../shared/types.js").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.
|
|
6
|
+
*/
|
|
7
|
+
declare function createMediaCacheBridge(): MediaCacheBridge;
|
|
8
|
+
/**
|
|
9
|
+
* Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.
|
|
10
|
+
*/
|
|
11
|
+
declare function exposeMediaCacheBridge(options?: PreloadExposeOptions): MediaCacheBridge;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { type MediaCacheBridge, createMediaCacheBridge, exposeMediaCacheBridge };
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/preload/index.ts"],"mappings":";;;;;AAOA;iBAAgB,sBAAA,CAAA,GAA0B,gBAAA;;;;iBAyB1B,sBAAA,CAAuB,OAAA,GAAU,oBAAA,GAAuB,gBAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { MEDIA_CACHE_IPC } from "../shared/ipc.js";
|
|
2
|
+
import { contextBridge, ipcRenderer } from "electron";
|
|
3
|
+
//#region src/preload/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* Builds a {@link import("../shared/types.js").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.
|
|
6
|
+
*/
|
|
7
|
+
function createMediaCacheBridge() {
|
|
8
|
+
return {
|
|
9
|
+
getStatus: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.getStatus),
|
|
10
|
+
syncNow: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.syncNow),
|
|
11
|
+
getAsset: (key) => ipcRenderer.invoke(MEDIA_CACHE_IPC.getAsset, key),
|
|
12
|
+
listByIndex: (indexName, value, pagination) => ipcRenderer.invoke(MEDIA_CACHE_IPC.listByIndex, indexName, value, pagination),
|
|
13
|
+
findByFileStem: (stem, pagination) => ipcRenderer.invoke(MEDIA_CACHE_IPC.findByFileStem, stem, pagination),
|
|
14
|
+
subscribeStatus: (listener) => {
|
|
15
|
+
const wrapped = (_event, status) => listener(status);
|
|
16
|
+
ipcRenderer.on(MEDIA_CACHE_IPC.statusChanged, wrapped);
|
|
17
|
+
return () => {
|
|
18
|
+
ipcRenderer.removeListener(MEDIA_CACHE_IPC.statusChanged, wrapped);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.
|
|
25
|
+
*/
|
|
26
|
+
function exposeMediaCacheBridge(options) {
|
|
27
|
+
const bridge = createMediaCacheBridge();
|
|
28
|
+
contextBridge.exposeInMainWorld(options?.key ?? "mediaCache", bridge);
|
|
29
|
+
return bridge;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { createMediaCacheBridge, exposeMediaCacheBridge };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/preload/index.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from \"electron\";\nimport { MEDIA_CACHE_IPC } from \"../shared/ipc.js\";\nimport type { MediaCacheBridge, PaginationInput, PreloadExposeOptions } from \"../shared/types.js\";\n\n/**\n * Builds a {@link import(\"../shared/types.js\").MediaCacheBridge} that invokes main-process handlers via `ipcRenderer`.\n */\nexport function createMediaCacheBridge(): MediaCacheBridge {\n return {\n getStatus: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.getStatus),\n syncNow: () => ipcRenderer.invoke(MEDIA_CACHE_IPC.syncNow),\n getAsset: (key) => ipcRenderer.invoke(MEDIA_CACHE_IPC.getAsset, key),\n listByIndex: (indexName, value, pagination?: PaginationInput) =>\n ipcRenderer.invoke(MEDIA_CACHE_IPC.listByIndex, indexName, value, pagination),\n findByFileStem: (stem, pagination?: PaginationInput) =>\n ipcRenderer.invoke(MEDIA_CACHE_IPC.findByFileStem, stem, pagination),\n subscribeStatus: (listener) => {\n const wrapped = (\n _event: Electron.IpcRendererEvent,\n status: Awaited<ReturnType<MediaCacheBridge[\"getStatus\"]>>,\n ) => listener(status);\n ipcRenderer.on(MEDIA_CACHE_IPC.statusChanged, wrapped);\n return () => {\n ipcRenderer.removeListener(MEDIA_CACHE_IPC.statusChanged, wrapped);\n };\n },\n };\n}\n\n/**\n * Exposes the bridge on the renderer's `window` under `options.key` (default `mediaCache`) using `contextBridge.exposeInMainWorld`.\n */\nexport function exposeMediaCacheBridge(options?: PreloadExposeOptions): MediaCacheBridge {\n const bridge = createMediaCacheBridge();\n contextBridge.exposeInMainWorld(options?.key ?? \"mediaCache\", bridge);\n return bridge;\n}\n\nexport type { MediaCacheBridge } from \"../shared/types.js\";\n"],"mappings":";;;;;;AAOA,SAAgB,yBAA2C;CACzD,OAAO;EACL,iBAAiB,YAAY,OAAO,gBAAgB,UAAU;EAC9D,eAAe,YAAY,OAAO,gBAAgB,QAAQ;EAC1D,WAAW,QAAQ,YAAY,OAAO,gBAAgB,UAAU,IAAI;EACpE,cAAc,WAAW,OAAO,eAC9B,YAAY,OAAO,gBAAgB,aAAa,WAAW,OAAO,WAAW;EAC/E,iBAAiB,MAAM,eACrB,YAAY,OAAO,gBAAgB,gBAAgB,MAAM,WAAW;EACtE,kBAAkB,aAAa;GAC7B,MAAM,WACJ,QACA,WACG,SAAS,OAAO;GACrB,YAAY,GAAG,gBAAgB,eAAe,QAAQ;GACtD,aAAa;IACX,YAAY,eAAe,gBAAgB,eAAe,QAAQ;;;EAGvE;;;;;AAMH,SAAgB,uBAAuB,SAAkD;CACvF,MAAM,SAAS,wBAAwB;CACvC,cAAc,kBAAkB,SAAS,OAAO,cAAc,OAAO;CACrE,OAAO"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_runtime = require("../renderer/runtime.cjs");
|
|
3
|
+
const require_helpers = require("../renderer/helpers.cjs");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
|
+
//#region src/react/index.tsx
|
|
7
|
+
const MediaCacheContext = (0, react.createContext)(null);
|
|
8
|
+
let nextQueryErrorId = 0;
|
|
9
|
+
function MediaCacheProvider({ bridge, children }) {
|
|
10
|
+
const valueBridge = (0, react.useMemo)(() => bridge ?? window.mediaCache ?? null, [bridge]);
|
|
11
|
+
const statusController = (0, react.useMemo)(() => require_runtime.createMediaCacheStatusController(valueBridge, valueBridge !== null), [valueBridge]);
|
|
12
|
+
(0, react.useEffect)(() => () => statusController.dispose(), [statusController]);
|
|
13
|
+
const [queryErrorsById, setQueryErrorsById] = (0, react.useState)(() => /* @__PURE__ */ new Map());
|
|
14
|
+
const reportQueryError = (0, react.useCallback)((id, error) => {
|
|
15
|
+
setQueryErrorsById((previous) => {
|
|
16
|
+
if (error === null) {
|
|
17
|
+
if (!previous.has(id)) return previous;
|
|
18
|
+
const next = new Map(previous);
|
|
19
|
+
next.delete(id);
|
|
20
|
+
return next;
|
|
21
|
+
}
|
|
22
|
+
if (previous.get(id) === error) return previous;
|
|
23
|
+
const next = new Map(previous);
|
|
24
|
+
next.set(id, error);
|
|
25
|
+
return next;
|
|
26
|
+
});
|
|
27
|
+
}, []);
|
|
28
|
+
const queryErrors = (0, react.useMemo)(() => Array.from(queryErrorsById.values()), [queryErrorsById]);
|
|
29
|
+
const value = (0, react.useMemo)(() => ({
|
|
30
|
+
bridge: valueBridge,
|
|
31
|
+
statusController,
|
|
32
|
+
queryErrors,
|
|
33
|
+
reportQueryError
|
|
34
|
+
}), [
|
|
35
|
+
valueBridge,
|
|
36
|
+
statusController,
|
|
37
|
+
queryErrors,
|
|
38
|
+
reportQueryError
|
|
39
|
+
]);
|
|
40
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MediaCacheContext.Provider, {
|
|
41
|
+
value,
|
|
42
|
+
children
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function useMediaBridge() {
|
|
46
|
+
const { bridge, status, queryErrors } = useMediaCacheRuntime();
|
|
47
|
+
const errors = (0, react.useMemo)(() => require_helpers.aggregateMediaCacheErrors(status, queryErrors), [status, queryErrors]);
|
|
48
|
+
return (0, react.useMemo)(() => ({
|
|
49
|
+
...bridge,
|
|
50
|
+
status,
|
|
51
|
+
phase: require_runtime.deriveMediaCachePhase(status),
|
|
52
|
+
errors
|
|
53
|
+
}), [
|
|
54
|
+
bridge,
|
|
55
|
+
status,
|
|
56
|
+
errors
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
function useMediaCacheStatus() {
|
|
60
|
+
const status = useMediaCacheRuntime().status;
|
|
61
|
+
return (0, react.useMemo)(() => ({
|
|
62
|
+
...status,
|
|
63
|
+
phase: require_runtime.deriveMediaCachePhase(status)
|
|
64
|
+
}), [status]);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Fetches a single asset by key.
|
|
68
|
+
*
|
|
69
|
+
* @param key - The asset key to look up. A string or array of string segments.
|
|
70
|
+
* @param options - Optional sync-triggered refetch behavior.
|
|
71
|
+
*/
|
|
72
|
+
function useMediaAsset(key, options) {
|
|
73
|
+
const { bridge, statusController } = useMediaCacheRuntime();
|
|
74
|
+
return useAsyncResource(() => bridge.getAsset(key), [bridge, typeof key === "string" ? key : key.join("\0")], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Lists assets matching a secondary index value.
|
|
78
|
+
*
|
|
79
|
+
* @param indexName - The index to query (e.g. `"mimeType"`, a user-defined index name).
|
|
80
|
+
* @param value - The index value to match.
|
|
81
|
+
* @param options - Optional pagination and sync-triggered refetch behavior.
|
|
82
|
+
*/
|
|
83
|
+
function useMediaByIndex(indexName, value, options) {
|
|
84
|
+
const { bridge, statusController } = useMediaCacheRuntime();
|
|
85
|
+
const cursor = options?.cursor;
|
|
86
|
+
const limit = options?.limit;
|
|
87
|
+
return useAsyncResource(() => bridge.listByIndex(indexName, value, {
|
|
88
|
+
cursor,
|
|
89
|
+
limit
|
|
90
|
+
}), [
|
|
91
|
+
bridge,
|
|
92
|
+
indexName,
|
|
93
|
+
value,
|
|
94
|
+
cursor,
|
|
95
|
+
limit
|
|
96
|
+
], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Searches assets by normalized file stem (file name without extension).
|
|
100
|
+
*
|
|
101
|
+
* @param stem - Normalized file stem to search for.
|
|
102
|
+
* @param options - Optional pagination and sync-triggered refetch behavior.
|
|
103
|
+
*/
|
|
104
|
+
function useFileStemMatch(stem, options) {
|
|
105
|
+
const { bridge, statusController } = useMediaCacheRuntime();
|
|
106
|
+
const cursor = options?.cursor;
|
|
107
|
+
const limit = options?.limit;
|
|
108
|
+
return useAsyncResource(() => bridge.findByFileStem(stem, {
|
|
109
|
+
cursor,
|
|
110
|
+
limit
|
|
111
|
+
}), [
|
|
112
|
+
bridge,
|
|
113
|
+
stem,
|
|
114
|
+
cursor,
|
|
115
|
+
limit
|
|
116
|
+
], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
|
|
117
|
+
}
|
|
118
|
+
function useMediaCacheReady() {
|
|
119
|
+
const status = useMediaCacheStatus();
|
|
120
|
+
return {
|
|
121
|
+
data: require_helpers.mediaCacheReadyFromStatus(status.data ?? void 0),
|
|
122
|
+
loading: status.loading,
|
|
123
|
+
error: status.error,
|
|
124
|
+
refresh: status.refresh
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function useMediaCacheErrors() {
|
|
128
|
+
const { status, queryErrors } = useMediaCacheRuntime();
|
|
129
|
+
return require_helpers.aggregateMediaCacheErrors(status, queryErrors);
|
|
130
|
+
}
|
|
131
|
+
function useAsyncResource(loader, refreshDeps, statusController, options) {
|
|
132
|
+
const latestLoader = (0, react.useRef)(loader);
|
|
133
|
+
latestLoader.current = loader;
|
|
134
|
+
const watcherRef = (0, react.useRef)(null);
|
|
135
|
+
const [, forceRender] = (0, react.useReducer)((count) => count + 1, 0);
|
|
136
|
+
(0, react.useLayoutEffect)(() => {
|
|
137
|
+
const instance = require_runtime.createMediaQueryWatcherInstance({
|
|
138
|
+
status: statusController,
|
|
139
|
+
getLoader: () => latestLoader.current,
|
|
140
|
+
refetchOnSyncComplete: options?.refetchOnSyncComplete ?? true,
|
|
141
|
+
listener: () => forceRender()
|
|
142
|
+
});
|
|
143
|
+
watcherRef.current = instance;
|
|
144
|
+
instance.syncDeps(refreshDeps);
|
|
145
|
+
forceRender();
|
|
146
|
+
return () => {
|
|
147
|
+
instance.dispose();
|
|
148
|
+
watcherRef.current = null;
|
|
149
|
+
};
|
|
150
|
+
}, [statusController, options?.refetchOnSyncComplete]);
|
|
151
|
+
(0, react.useEffect)(() => {
|
|
152
|
+
watcherRef.current?.syncDeps(refreshDeps);
|
|
153
|
+
});
|
|
154
|
+
const snapshot = watcherRef.current?.getSnapshot() ?? {
|
|
155
|
+
data: null,
|
|
156
|
+
loading: true,
|
|
157
|
+
error: null,
|
|
158
|
+
refresh: async () => {
|
|
159
|
+
await watcherRef.current?.refresh();
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
useQueryErrorRegistration(snapshot.error);
|
|
163
|
+
return snapshot;
|
|
164
|
+
}
|
|
165
|
+
function useMediaCacheRuntime() {
|
|
166
|
+
const runtime = (0, react.useContext)(MediaCacheContext);
|
|
167
|
+
const bridge = runtime?.bridge;
|
|
168
|
+
const statusController = runtime?.statusController;
|
|
169
|
+
if (!bridge || !statusController) throw new Error(require_runtime.MISSING_BRIDGE_ERROR);
|
|
170
|
+
return {
|
|
171
|
+
bridge,
|
|
172
|
+
status: (0, react.useSyncExternalStore)(statusController.subscribe, statusController.getSnapshot, statusController.getSnapshot),
|
|
173
|
+
statusController,
|
|
174
|
+
queryErrors: runtime.queryErrors
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function useQueryErrorRegistration(error) {
|
|
178
|
+
const runtime = (0, react.useContext)(MediaCacheContext);
|
|
179
|
+
const queryErrorId = (0, react.useRef)(null);
|
|
180
|
+
if (queryErrorId.current === null) queryErrorId.current = `query-error-${nextQueryErrorId++}`;
|
|
181
|
+
(0, react.useEffect)(() => {
|
|
182
|
+
if (!runtime) return;
|
|
183
|
+
runtime.reportQueryError(queryErrorId.current, error);
|
|
184
|
+
return () => {
|
|
185
|
+
runtime.reportQueryError(queryErrorId.current, null);
|
|
186
|
+
};
|
|
187
|
+
}, [runtime, error]);
|
|
188
|
+
}
|
|
189
|
+
//#endregion
|
|
190
|
+
exports.MediaCacheProvider = MediaCacheProvider;
|
|
191
|
+
exports.useFileStemMatch = useFileStemMatch;
|
|
192
|
+
exports.useMediaAsset = useMediaAsset;
|
|
193
|
+
exports.useMediaBridge = useMediaBridge;
|
|
194
|
+
exports.useMediaByIndex = useMediaByIndex;
|
|
195
|
+
exports.useMediaCacheErrors = useMediaCacheErrors;
|
|
196
|
+
exports.useMediaCacheReady = useMediaCacheReady;
|
|
197
|
+
exports.useMediaCacheStatus = useMediaCacheStatus;
|
|
198
|
+
|
|
199
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createMediaCacheStatusController","aggregateMediaCacheErrors","deriveMediaCachePhase","mediaCacheReadyFromStatus","createMediaQueryWatcherInstance","MISSING_BRIDGE_ERROR"],"sources":["../../src/react/index.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n useSyncExternalStore,\n type PropsWithChildren,\n} from \"react\";\nimport type {\n AssetKeyInput,\n FileStemMatch,\n MediaCacheBridge,\n MediaCacheErrors,\n MediaCachePhase,\n MediaCacheReadyState,\n MediaCacheStatus,\n PaginationInput,\n PaginationResult,\n MediaQuerySyncOptions,\n ResolvedMediaAsset,\n} from \"../shared/types.js\";\nimport \"../renderer/window-globals.js\";\nimport {\n type MediaAsyncState,\n type MediaCacheStatusController,\n MISSING_BRIDGE_ERROR,\n createMediaCacheStatusController,\n createMediaQueryWatcherInstance,\n deriveMediaCachePhase,\n} from \"../renderer/runtime.js\";\nimport { aggregateMediaCacheErrors, mediaCacheReadyFromStatus } from \"../renderer/helpers.js\";\n\ntype AsyncState<T> = MediaAsyncState<T>;\n\ninterface MediaCacheContextValue {\n bridge: MediaCacheBridge | null;\n statusController: MediaCacheStatusController | null;\n queryErrors: Error[];\n reportQueryError: (id: string, error: Error | null) => void;\n}\n\nexport interface UseMediaBridgeResult extends MediaCacheBridge {\n status: AsyncState<MediaCacheStatus>;\n phase: MediaCachePhase;\n errors: MediaCacheErrors;\n}\n\nexport interface UseMediaCacheStatusResult extends AsyncState<MediaCacheStatus> {\n phase: MediaCachePhase;\n}\n\nconst MediaCacheContext = createContext<MediaCacheContextValue | null>(null);\nlet nextQueryErrorId = 0;\n\nexport function MediaCacheProvider({\n bridge,\n children,\n}: PropsWithChildren<{ bridge?: MediaCacheBridge }>) {\n const valueBridge = useMemo(() => bridge ?? window.mediaCache ?? null, [bridge]);\n const statusController = useMemo(\n () => createMediaCacheStatusController(valueBridge, valueBridge !== null),\n [valueBridge],\n );\n\n useEffect(() => () => statusController.dispose(), [statusController]);\n\n const [queryErrorsById, setQueryErrorsById] = useState<Map<string, Error>>(() => new Map());\n\n const reportQueryError = useCallback((id: string, error: Error | null) => {\n setQueryErrorsById((previous: Map<string, Error>) => {\n if (error === null) {\n if (!previous.has(id)) {\n return previous;\n }\n const next = new Map(previous);\n next.delete(id);\n return next;\n }\n\n if (previous.get(id) === error) {\n return previous;\n }\n\n const next = new Map(previous);\n next.set(id, error);\n return next;\n });\n }, []);\n\n const queryErrors = useMemo(() => Array.from(queryErrorsById.values()), [queryErrorsById]);\n const value = useMemo(\n () => ({\n bridge: valueBridge,\n statusController,\n queryErrors,\n reportQueryError,\n }),\n [valueBridge, statusController, queryErrors, reportQueryError],\n );\n\n return <MediaCacheContext.Provider value={value}>{children}</MediaCacheContext.Provider>;\n}\n\nexport function useMediaBridge(): UseMediaBridgeResult {\n const { bridge, status, queryErrors } = useMediaCacheRuntime();\n const errors = useMemo(\n () => aggregateMediaCacheErrors(status, queryErrors),\n [status, queryErrors],\n );\n\n return useMemo(\n () => ({\n ...bridge,\n status,\n phase: deriveMediaCachePhase(status),\n errors,\n }),\n [bridge, status, errors],\n );\n}\n\nexport function useMediaCacheStatus(): UseMediaCacheStatusResult {\n const status = useMediaCacheRuntime().status;\n return useMemo(() => ({ ...status, phase: deriveMediaCachePhase(status) }), [status]);\n}\n\n/**\n * Fetches a single asset by key.\n *\n * @param key - The asset key to look up. A string or array of string segments.\n * @param options - Optional sync-triggered refetch behavior.\n */\nexport function useMediaAsset(\n key: AssetKeyInput,\n options?: MediaQuerySyncOptions,\n): AsyncState<ResolvedMediaAsset | null> {\n const { bridge, statusController } = useMediaCacheRuntime();\n const stableKey = typeof key === \"string\" ? key : key.join(\"\\0\");\n return useAsyncResource(() => bridge.getAsset(key), [bridge, stableKey], statusController, {\n refetchOnSyncComplete: options?.refetchOnSyncComplete,\n });\n}\n\n/**\n * Lists assets matching a secondary index value.\n *\n * @param indexName - The index to query (e.g. `\"mimeType\"`, a user-defined index name).\n * @param value - The index value to match.\n * @param options - Optional pagination and sync-triggered refetch behavior.\n */\nexport function useMediaByIndex(\n indexName: string,\n value: string,\n options?: PaginationInput & MediaQuerySyncOptions,\n): AsyncState<PaginationResult<ResolvedMediaAsset>> {\n const { bridge, statusController } = useMediaCacheRuntime();\n const cursor = options?.cursor;\n const limit = options?.limit;\n return useAsyncResource(\n () => bridge.listByIndex(indexName, value, { cursor, limit }),\n [bridge, indexName, value, cursor, limit],\n statusController,\n { refetchOnSyncComplete: options?.refetchOnSyncComplete },\n );\n}\n\n/**\n * Searches assets by normalized file stem (file name without extension).\n *\n * @param stem - Normalized file stem to search for.\n * @param options - Optional pagination and sync-triggered refetch behavior.\n */\nexport function useFileStemMatch(\n stem: string,\n options?: PaginationInput & MediaQuerySyncOptions,\n): AsyncState<PaginationResult<FileStemMatch>> {\n const { bridge, statusController } = useMediaCacheRuntime();\n const cursor = options?.cursor;\n const limit = options?.limit;\n return useAsyncResource(\n () => bridge.findByFileStem(stem, { cursor, limit }),\n [bridge, stem, cursor, limit],\n statusController,\n { refetchOnSyncComplete: options?.refetchOnSyncComplete },\n );\n}\n\nexport function useMediaCacheReady(): AsyncState<MediaCacheReadyState> {\n const status = useMediaCacheStatus();\n\n return {\n data: mediaCacheReadyFromStatus(status.data ?? undefined),\n loading: status.loading,\n error: status.error,\n refresh: status.refresh,\n };\n}\n\nexport function useMediaCacheErrors(): MediaCacheErrors {\n const { status, queryErrors } = useMediaCacheRuntime();\n return aggregateMediaCacheErrors(status, queryErrors);\n}\n\nfunction useAsyncResource<T>(\n loader: () => Promise<T>,\n refreshDeps: ReadonlyArray<unknown>,\n statusController: MediaCacheStatusController,\n options?: MediaQuerySyncOptions,\n): AsyncState<T> {\n const latestLoader = useRef(loader);\n latestLoader.current = loader;\n\n const watcherRef = useRef<ReturnType<typeof createMediaQueryWatcherInstance<T>> | null>(null);\n const [, forceRender] = useReducer((count: number) => count + 1, 0);\n\n useLayoutEffect(() => {\n const instance = createMediaQueryWatcherInstance({\n status: statusController,\n getLoader: () => latestLoader.current,\n refetchOnSyncComplete: options?.refetchOnSyncComplete ?? true,\n listener: () => forceRender(),\n });\n watcherRef.current = instance;\n instance.syncDeps(refreshDeps);\n forceRender();\n return () => {\n instance.dispose();\n watcherRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- deps compared imperatively via syncDeps\n }, [statusController, options?.refetchOnSyncComplete]);\n\n useEffect(() => {\n watcherRef.current?.syncDeps(refreshDeps);\n });\n\n const snapshot =\n watcherRef.current?.getSnapshot() ??\n ({\n data: null,\n loading: true,\n error: null,\n refresh: async () => {\n await watcherRef.current?.refresh();\n },\n } as AsyncState<T>);\n\n useQueryErrorRegistration(snapshot.error);\n\n return snapshot;\n}\n\nfunction useMediaCacheRuntime(): {\n bridge: MediaCacheBridge;\n status: AsyncState<MediaCacheStatus>;\n statusController: MediaCacheStatusController;\n queryErrors: Error[];\n} {\n const runtime = useContext(MediaCacheContext);\n const bridge = runtime?.bridge;\n const statusController = runtime?.statusController;\n\n if (!bridge || !statusController) {\n throw new Error(MISSING_BRIDGE_ERROR);\n }\n\n const status = useSyncExternalStore(\n statusController.subscribe,\n statusController.getSnapshot,\n statusController.getSnapshot,\n );\n\n return {\n bridge,\n status,\n statusController,\n queryErrors: runtime.queryErrors,\n };\n}\n\nfunction useQueryErrorRegistration(error: Error | null): void {\n const runtime = useContext(MediaCacheContext);\n const queryErrorId = useRef<string | null>(null);\n\n if (queryErrorId.current === null) {\n queryErrorId.current = `query-error-${nextQueryErrorId++}`;\n }\n\n useEffect(() => {\n if (!runtime) {\n return;\n }\n\n runtime.reportQueryError(queryErrorId.current!, error);\n\n return () => {\n runtime.reportQueryError(queryErrorId.current!, null);\n };\n }, [runtime, error]);\n}\n\nexport type {\n AssetKeyInput,\n FileStemMatch,\n MediaCacheBridge,\n MediaCacheErrors,\n MediaCachePhase,\n MediaCacheReadyState,\n MediaCacheStatus,\n MediaQuerySyncOptions,\n ResolvedMediaAsset,\n} from \"../shared/types.js\";\n"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { AssetKeyInput, FileStemMatch, MediaCacheBridge, MediaCacheErrors, MediaCachePhase, MediaCacheReadyState, MediaCacheStatus, MediaQuerySyncOptions, PaginationInput, PaginationResult, ResolvedMediaAsset } from "../shared/types.cjs";
|
|
2
|
+
import { MediaAsyncState } from "../renderer/runtime.cjs";
|
|
3
|
+
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
|
+
import { PropsWithChildren } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/react/index.d.ts
|
|
7
|
+
type AsyncState<T> = MediaAsyncState<T>;
|
|
8
|
+
interface UseMediaBridgeResult extends MediaCacheBridge {
|
|
9
|
+
status: AsyncState<MediaCacheStatus>;
|
|
10
|
+
phase: MediaCachePhase;
|
|
11
|
+
errors: MediaCacheErrors;
|
|
12
|
+
}
|
|
13
|
+
interface UseMediaCacheStatusResult extends AsyncState<MediaCacheStatus> {
|
|
14
|
+
phase: MediaCachePhase;
|
|
15
|
+
}
|
|
16
|
+
declare function MediaCacheProvider({
|
|
17
|
+
bridge,
|
|
18
|
+
children
|
|
19
|
+
}: PropsWithChildren<{
|
|
20
|
+
bridge?: MediaCacheBridge;
|
|
21
|
+
}>): _$react_jsx_runtime0.JSX.Element;
|
|
22
|
+
declare function useMediaBridge(): UseMediaBridgeResult;
|
|
23
|
+
declare function useMediaCacheStatus(): UseMediaCacheStatusResult;
|
|
24
|
+
/**
|
|
25
|
+
* Fetches a single asset by key.
|
|
26
|
+
*
|
|
27
|
+
* @param key - The asset key to look up. A string or array of string segments.
|
|
28
|
+
* @param options - Optional sync-triggered refetch behavior.
|
|
29
|
+
*/
|
|
30
|
+
declare function useMediaAsset(key: AssetKeyInput, options?: MediaQuerySyncOptions): AsyncState<ResolvedMediaAsset | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Lists assets matching a secondary index value.
|
|
33
|
+
*
|
|
34
|
+
* @param indexName - The index to query (e.g. `"mimeType"`, a user-defined index name).
|
|
35
|
+
* @param value - The index value to match.
|
|
36
|
+
* @param options - Optional pagination and sync-triggered refetch behavior.
|
|
37
|
+
*/
|
|
38
|
+
declare function useMediaByIndex(indexName: string, value: string, options?: PaginationInput & MediaQuerySyncOptions): AsyncState<PaginationResult<ResolvedMediaAsset>>;
|
|
39
|
+
/**
|
|
40
|
+
* Searches assets by normalized file stem (file name without extension).
|
|
41
|
+
*
|
|
42
|
+
* @param stem - Normalized file stem to search for.
|
|
43
|
+
* @param options - Optional pagination and sync-triggered refetch behavior.
|
|
44
|
+
*/
|
|
45
|
+
declare function useFileStemMatch(stem: string, options?: PaginationInput & MediaQuerySyncOptions): AsyncState<PaginationResult<FileStemMatch>>;
|
|
46
|
+
declare function useMediaCacheReady(): AsyncState<MediaCacheReadyState>;
|
|
47
|
+
declare function useMediaCacheErrors(): MediaCacheErrors;
|
|
48
|
+
//#endregion
|
|
49
|
+
export { type AssetKeyInput, type FileStemMatch, type MediaCacheBridge, type MediaCacheErrors, type MediaCachePhase, MediaCacheProvider, type MediaCacheReadyState, type MediaCacheStatus, type MediaQuerySyncOptions, type ResolvedMediaAsset, UseMediaBridgeResult, UseMediaCacheStatusResult, useFileStemMatch, useMediaAsset, useMediaBridge, useMediaByIndex, useMediaCacheErrors, useMediaCacheReady, useMediaCacheStatus };
|
|
50
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/react/index.tsx"],"mappings":";;;;;;KAqCK,UAAA,MAAgB,eAAA,CAAgB,CAAA;AAAA,UASpB,oBAAA,SAA6B,gBAAA;EAC5C,MAAA,EAAQ,UAAA,CAAW,gBAAA;EACnB,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,gBAAA;AAAA;AAAA,UAGO,yBAAA,SAAkC,UAAA,CAAW,gBAAA;EAC5D,KAAA,EAAO,eAAA;AAAA;AAAA,iBAMO,kBAAA,CAAA;EACd,MAAA;EACA;AAAA,GACC,iBAAA;EAAoB,MAAA,GAAS,gBAAA;AAAA,KAAmB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA8CnC,cAAA,CAAA,GAAkB,oBAAA;AAAA,iBAkBlB,mBAAA,CAAA,GAAuB,yBAAA;;;;;;;iBAWvB,aAAA,CACd,GAAA,EAAK,aAAA,EACL,OAAA,GAAU,qBAAA,GACT,UAAA,CAAW,kBAAA;;;;;;;;iBAeE,eAAA,CACd,SAAA,UACA,KAAA,UACA,OAAA,GAAU,eAAA,GAAkB,qBAAA,GAC3B,UAAA,CAAW,gBAAA,CAAiB,kBAAA;;;;AA3G/B;;;iBA6HgB,gBAAA,CACd,IAAA,UACA,OAAA,GAAU,eAAA,GAAkB,qBAAA,GAC3B,UAAA,CAAW,gBAAA,CAAiB,aAAA;AAAA,iBAYf,kBAAA,CAAA,GAAsB,UAAA,CAAW,oBAAA;AAAA,iBAWjC,mBAAA,CAAA,GAAuB,gBAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { AssetKeyInput, FileStemMatch, MediaCacheBridge, MediaCacheErrors, MediaCachePhase, MediaCacheReadyState, MediaCacheStatus, MediaQuerySyncOptions, PaginationInput, PaginationResult, ResolvedMediaAsset } from "../shared/types.js";
|
|
2
|
+
import { MediaAsyncState } from "../renderer/runtime.js";
|
|
3
|
+
import { PropsWithChildren } from "react";
|
|
4
|
+
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
5
|
+
|
|
6
|
+
//#region src/react/index.d.ts
|
|
7
|
+
type AsyncState<T> = MediaAsyncState<T>;
|
|
8
|
+
interface UseMediaBridgeResult extends MediaCacheBridge {
|
|
9
|
+
status: AsyncState<MediaCacheStatus>;
|
|
10
|
+
phase: MediaCachePhase;
|
|
11
|
+
errors: MediaCacheErrors;
|
|
12
|
+
}
|
|
13
|
+
interface UseMediaCacheStatusResult extends AsyncState<MediaCacheStatus> {
|
|
14
|
+
phase: MediaCachePhase;
|
|
15
|
+
}
|
|
16
|
+
declare function MediaCacheProvider({
|
|
17
|
+
bridge,
|
|
18
|
+
children
|
|
19
|
+
}: PropsWithChildren<{
|
|
20
|
+
bridge?: MediaCacheBridge;
|
|
21
|
+
}>): _$react_jsx_runtime0.JSX.Element;
|
|
22
|
+
declare function useMediaBridge(): UseMediaBridgeResult;
|
|
23
|
+
declare function useMediaCacheStatus(): UseMediaCacheStatusResult;
|
|
24
|
+
/**
|
|
25
|
+
* Fetches a single asset by key.
|
|
26
|
+
*
|
|
27
|
+
* @param key - The asset key to look up. A string or array of string segments.
|
|
28
|
+
* @param options - Optional sync-triggered refetch behavior.
|
|
29
|
+
*/
|
|
30
|
+
declare function useMediaAsset(key: AssetKeyInput, options?: MediaQuerySyncOptions): AsyncState<ResolvedMediaAsset | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Lists assets matching a secondary index value.
|
|
33
|
+
*
|
|
34
|
+
* @param indexName - The index to query (e.g. `"mimeType"`, a user-defined index name).
|
|
35
|
+
* @param value - The index value to match.
|
|
36
|
+
* @param options - Optional pagination and sync-triggered refetch behavior.
|
|
37
|
+
*/
|
|
38
|
+
declare function useMediaByIndex(indexName: string, value: string, options?: PaginationInput & MediaQuerySyncOptions): AsyncState<PaginationResult<ResolvedMediaAsset>>;
|
|
39
|
+
/**
|
|
40
|
+
* Searches assets by normalized file stem (file name without extension).
|
|
41
|
+
*
|
|
42
|
+
* @param stem - Normalized file stem to search for.
|
|
43
|
+
* @param options - Optional pagination and sync-triggered refetch behavior.
|
|
44
|
+
*/
|
|
45
|
+
declare function useFileStemMatch(stem: string, options?: PaginationInput & MediaQuerySyncOptions): AsyncState<PaginationResult<FileStemMatch>>;
|
|
46
|
+
declare function useMediaCacheReady(): AsyncState<MediaCacheReadyState>;
|
|
47
|
+
declare function useMediaCacheErrors(): MediaCacheErrors;
|
|
48
|
+
//#endregion
|
|
49
|
+
export { type AssetKeyInput, type FileStemMatch, type MediaCacheBridge, type MediaCacheErrors, type MediaCachePhase, MediaCacheProvider, type MediaCacheReadyState, type MediaCacheStatus, type MediaQuerySyncOptions, type ResolvedMediaAsset, UseMediaBridgeResult, UseMediaCacheStatusResult, useFileStemMatch, useMediaAsset, useMediaBridge, useMediaByIndex, useMediaCacheErrors, useMediaCacheReady, useMediaCacheStatus };
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/react/index.tsx"],"mappings":";;;;;;KAqCK,UAAA,MAAgB,eAAA,CAAgB,CAAA;AAAA,UASpB,oBAAA,SAA6B,gBAAA;EAC5C,MAAA,EAAQ,UAAA,CAAW,gBAAA;EACnB,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,gBAAA;AAAA;AAAA,UAGO,yBAAA,SAAkC,UAAA,CAAW,gBAAA;EAC5D,KAAA,EAAO,eAAA;AAAA;AAAA,iBAMO,kBAAA,CAAA;EACd,MAAA;EACA;AAAA,GACC,iBAAA;EAAoB,MAAA,GAAS,gBAAA;AAAA,KAAmB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA8CnC,cAAA,CAAA,GAAkB,oBAAA;AAAA,iBAkBlB,mBAAA,CAAA,GAAuB,yBAAA;;;;;;;iBAWvB,aAAA,CACd,GAAA,EAAK,aAAA,EACL,OAAA,GAAU,qBAAA,GACT,UAAA,CAAW,kBAAA;;;;;;;;iBAeE,eAAA,CACd,SAAA,UACA,KAAA,UACA,OAAA,GAAU,eAAA,GAAkB,qBAAA,GAC3B,UAAA,CAAW,gBAAA,CAAiB,kBAAA;;;;AA3G/B;;;iBA6HgB,gBAAA,CACd,IAAA,UACA,OAAA,GAAU,eAAA,GAAkB,qBAAA,GAC3B,UAAA,CAAW,gBAAA,CAAiB,aAAA;AAAA,iBAYf,kBAAA,CAAA,GAAsB,UAAA,CAAW,oBAAA;AAAA,iBAWjC,mBAAA,CAAA,GAAuB,gBAAA"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { MISSING_BRIDGE_ERROR, createMediaCacheStatusController, createMediaQueryWatcherInstance, deriveMediaCachePhase } from "../renderer/runtime.js";
|
|
2
|
+
import { aggregateMediaCacheErrors, mediaCacheReadyFromStatus } from "../renderer/helpers.js";
|
|
3
|
+
import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/react/index.tsx
|
|
6
|
+
const MediaCacheContext = createContext(null);
|
|
7
|
+
let nextQueryErrorId = 0;
|
|
8
|
+
function MediaCacheProvider({ bridge, children }) {
|
|
9
|
+
const valueBridge = useMemo(() => bridge ?? window.mediaCache ?? null, [bridge]);
|
|
10
|
+
const statusController = useMemo(() => createMediaCacheStatusController(valueBridge, valueBridge !== null), [valueBridge]);
|
|
11
|
+
useEffect(() => () => statusController.dispose(), [statusController]);
|
|
12
|
+
const [queryErrorsById, setQueryErrorsById] = useState(() => /* @__PURE__ */ new Map());
|
|
13
|
+
const reportQueryError = useCallback((id, error) => {
|
|
14
|
+
setQueryErrorsById((previous) => {
|
|
15
|
+
if (error === null) {
|
|
16
|
+
if (!previous.has(id)) return previous;
|
|
17
|
+
const next = new Map(previous);
|
|
18
|
+
next.delete(id);
|
|
19
|
+
return next;
|
|
20
|
+
}
|
|
21
|
+
if (previous.get(id) === error) return previous;
|
|
22
|
+
const next = new Map(previous);
|
|
23
|
+
next.set(id, error);
|
|
24
|
+
return next;
|
|
25
|
+
});
|
|
26
|
+
}, []);
|
|
27
|
+
const queryErrors = useMemo(() => Array.from(queryErrorsById.values()), [queryErrorsById]);
|
|
28
|
+
const value = useMemo(() => ({
|
|
29
|
+
bridge: valueBridge,
|
|
30
|
+
statusController,
|
|
31
|
+
queryErrors,
|
|
32
|
+
reportQueryError
|
|
33
|
+
}), [
|
|
34
|
+
valueBridge,
|
|
35
|
+
statusController,
|
|
36
|
+
queryErrors,
|
|
37
|
+
reportQueryError
|
|
38
|
+
]);
|
|
39
|
+
return /* @__PURE__ */ jsx(MediaCacheContext.Provider, {
|
|
40
|
+
value,
|
|
41
|
+
children
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function useMediaBridge() {
|
|
45
|
+
const { bridge, status, queryErrors } = useMediaCacheRuntime();
|
|
46
|
+
const errors = useMemo(() => aggregateMediaCacheErrors(status, queryErrors), [status, queryErrors]);
|
|
47
|
+
return useMemo(() => ({
|
|
48
|
+
...bridge,
|
|
49
|
+
status,
|
|
50
|
+
phase: deriveMediaCachePhase(status),
|
|
51
|
+
errors
|
|
52
|
+
}), [
|
|
53
|
+
bridge,
|
|
54
|
+
status,
|
|
55
|
+
errors
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
function useMediaCacheStatus() {
|
|
59
|
+
const status = useMediaCacheRuntime().status;
|
|
60
|
+
return useMemo(() => ({
|
|
61
|
+
...status,
|
|
62
|
+
phase: deriveMediaCachePhase(status)
|
|
63
|
+
}), [status]);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Fetches a single asset by key.
|
|
67
|
+
*
|
|
68
|
+
* @param key - The asset key to look up. A string or array of string segments.
|
|
69
|
+
* @param options - Optional sync-triggered refetch behavior.
|
|
70
|
+
*/
|
|
71
|
+
function useMediaAsset(key, options) {
|
|
72
|
+
const { bridge, statusController } = useMediaCacheRuntime();
|
|
73
|
+
return useAsyncResource(() => bridge.getAsset(key), [bridge, typeof key === "string" ? key : key.join("\0")], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Lists assets matching a secondary index value.
|
|
77
|
+
*
|
|
78
|
+
* @param indexName - The index to query (e.g. `"mimeType"`, a user-defined index name).
|
|
79
|
+
* @param value - The index value to match.
|
|
80
|
+
* @param options - Optional pagination and sync-triggered refetch behavior.
|
|
81
|
+
*/
|
|
82
|
+
function useMediaByIndex(indexName, value, options) {
|
|
83
|
+
const { bridge, statusController } = useMediaCacheRuntime();
|
|
84
|
+
const cursor = options?.cursor;
|
|
85
|
+
const limit = options?.limit;
|
|
86
|
+
return useAsyncResource(() => bridge.listByIndex(indexName, value, {
|
|
87
|
+
cursor,
|
|
88
|
+
limit
|
|
89
|
+
}), [
|
|
90
|
+
bridge,
|
|
91
|
+
indexName,
|
|
92
|
+
value,
|
|
93
|
+
cursor,
|
|
94
|
+
limit
|
|
95
|
+
], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Searches assets by normalized file stem (file name without extension).
|
|
99
|
+
*
|
|
100
|
+
* @param stem - Normalized file stem to search for.
|
|
101
|
+
* @param options - Optional pagination and sync-triggered refetch behavior.
|
|
102
|
+
*/
|
|
103
|
+
function useFileStemMatch(stem, options) {
|
|
104
|
+
const { bridge, statusController } = useMediaCacheRuntime();
|
|
105
|
+
const cursor = options?.cursor;
|
|
106
|
+
const limit = options?.limit;
|
|
107
|
+
return useAsyncResource(() => bridge.findByFileStem(stem, {
|
|
108
|
+
cursor,
|
|
109
|
+
limit
|
|
110
|
+
}), [
|
|
111
|
+
bridge,
|
|
112
|
+
stem,
|
|
113
|
+
cursor,
|
|
114
|
+
limit
|
|
115
|
+
], statusController, { refetchOnSyncComplete: options?.refetchOnSyncComplete });
|
|
116
|
+
}
|
|
117
|
+
function useMediaCacheReady() {
|
|
118
|
+
const status = useMediaCacheStatus();
|
|
119
|
+
return {
|
|
120
|
+
data: mediaCacheReadyFromStatus(status.data ?? void 0),
|
|
121
|
+
loading: status.loading,
|
|
122
|
+
error: status.error,
|
|
123
|
+
refresh: status.refresh
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function useMediaCacheErrors() {
|
|
127
|
+
const { status, queryErrors } = useMediaCacheRuntime();
|
|
128
|
+
return aggregateMediaCacheErrors(status, queryErrors);
|
|
129
|
+
}
|
|
130
|
+
function useAsyncResource(loader, refreshDeps, statusController, options) {
|
|
131
|
+
const latestLoader = useRef(loader);
|
|
132
|
+
latestLoader.current = loader;
|
|
133
|
+
const watcherRef = useRef(null);
|
|
134
|
+
const [, forceRender] = useReducer((count) => count + 1, 0);
|
|
135
|
+
useLayoutEffect(() => {
|
|
136
|
+
const instance = createMediaQueryWatcherInstance({
|
|
137
|
+
status: statusController,
|
|
138
|
+
getLoader: () => latestLoader.current,
|
|
139
|
+
refetchOnSyncComplete: options?.refetchOnSyncComplete ?? true,
|
|
140
|
+
listener: () => forceRender()
|
|
141
|
+
});
|
|
142
|
+
watcherRef.current = instance;
|
|
143
|
+
instance.syncDeps(refreshDeps);
|
|
144
|
+
forceRender();
|
|
145
|
+
return () => {
|
|
146
|
+
instance.dispose();
|
|
147
|
+
watcherRef.current = null;
|
|
148
|
+
};
|
|
149
|
+
}, [statusController, options?.refetchOnSyncComplete]);
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
watcherRef.current?.syncDeps(refreshDeps);
|
|
152
|
+
});
|
|
153
|
+
const snapshot = watcherRef.current?.getSnapshot() ?? {
|
|
154
|
+
data: null,
|
|
155
|
+
loading: true,
|
|
156
|
+
error: null,
|
|
157
|
+
refresh: async () => {
|
|
158
|
+
await watcherRef.current?.refresh();
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
useQueryErrorRegistration(snapshot.error);
|
|
162
|
+
return snapshot;
|
|
163
|
+
}
|
|
164
|
+
function useMediaCacheRuntime() {
|
|
165
|
+
const runtime = useContext(MediaCacheContext);
|
|
166
|
+
const bridge = runtime?.bridge;
|
|
167
|
+
const statusController = runtime?.statusController;
|
|
168
|
+
if (!bridge || !statusController) throw new Error(MISSING_BRIDGE_ERROR);
|
|
169
|
+
return {
|
|
170
|
+
bridge,
|
|
171
|
+
status: useSyncExternalStore(statusController.subscribe, statusController.getSnapshot, statusController.getSnapshot),
|
|
172
|
+
statusController,
|
|
173
|
+
queryErrors: runtime.queryErrors
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function useQueryErrorRegistration(error) {
|
|
177
|
+
const runtime = useContext(MediaCacheContext);
|
|
178
|
+
const queryErrorId = useRef(null);
|
|
179
|
+
if (queryErrorId.current === null) queryErrorId.current = `query-error-${nextQueryErrorId++}`;
|
|
180
|
+
useEffect(() => {
|
|
181
|
+
if (!runtime) return;
|
|
182
|
+
runtime.reportQueryError(queryErrorId.current, error);
|
|
183
|
+
return () => {
|
|
184
|
+
runtime.reportQueryError(queryErrorId.current, null);
|
|
185
|
+
};
|
|
186
|
+
}, [runtime, error]);
|
|
187
|
+
}
|
|
188
|
+
//#endregion
|
|
189
|
+
export { MediaCacheProvider, useFileStemMatch, useMediaAsset, useMediaBridge, useMediaByIndex, useMediaCacheErrors, useMediaCacheReady, useMediaCacheStatus };
|
|
190
|
+
|
|
191
|
+
//# sourceMappingURL=index.js.map
|