@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.
Files changed (196) hide show
  1. package/CHANGELOG.md +384 -0
  2. package/LICENSE +21 -0
  3. package/README.md +794 -0
  4. package/dist/internal/asset-file-name.cjs +13 -0
  5. package/dist/internal/asset-file-name.cjs.map +1 -0
  6. package/dist/internal/asset-file-name.d.cts +6 -0
  7. package/dist/internal/asset-file-name.d.cts.map +1 -0
  8. package/dist/internal/asset-file-name.d.ts +6 -0
  9. package/dist/internal/asset-file-name.d.ts.map +1 -0
  10. package/dist/internal/asset-file-name.js +12 -0
  11. package/dist/internal/asset-file-name.js.map +1 -0
  12. package/dist/internal/asset-key.cjs +30 -0
  13. package/dist/internal/asset-key.cjs.map +1 -0
  14. package/dist/internal/asset-key.d.cts +19 -0
  15. package/dist/internal/asset-key.d.cts.map +1 -0
  16. package/dist/internal/asset-key.d.ts +19 -0
  17. package/dist/internal/asset-key.d.ts.map +1 -0
  18. package/dist/internal/asset-key.js +27 -0
  19. package/dist/internal/asset-key.js.map +1 -0
  20. package/dist/internal/log-format.cjs +98 -0
  21. package/dist/internal/log-format.cjs.map +1 -0
  22. package/dist/internal/log-format.d.cts +10 -0
  23. package/dist/internal/log-format.d.cts.map +1 -0
  24. package/dist/internal/log-format.d.ts +10 -0
  25. package/dist/internal/log-format.d.ts.map +1 -0
  26. package/dist/internal/log-format.js +97 -0
  27. package/dist/internal/log-format.js.map +1 -0
  28. package/dist/internal/media-kind.cjs +46 -0
  29. package/dist/internal/media-kind.cjs.map +1 -0
  30. package/dist/internal/media-kind.d.cts +20 -0
  31. package/dist/internal/media-kind.d.cts.map +1 -0
  32. package/dist/internal/media-kind.d.ts +20 -0
  33. package/dist/internal/media-kind.d.ts.map +1 -0
  34. package/dist/internal/media-kind.js +45 -0
  35. package/dist/internal/media-kind.js.map +1 -0
  36. package/dist/internal/url-warn.cjs +14 -0
  37. package/dist/internal/url-warn.cjs.map +1 -0
  38. package/dist/internal/url-warn.d.cts +10 -0
  39. package/dist/internal/url-warn.d.cts.map +1 -0
  40. package/dist/internal/url-warn.d.ts +10 -0
  41. package/dist/internal/url-warn.d.ts.map +1 -0
  42. package/dist/internal/url-warn.js +13 -0
  43. package/dist/internal/url-warn.js.map +1 -0
  44. package/dist/internal/validation.cjs +222 -0
  45. package/dist/internal/validation.cjs.map +1 -0
  46. package/dist/internal/validation.d.cts +78 -0
  47. package/dist/internal/validation.d.cts.map +1 -0
  48. package/dist/internal/validation.d.ts +78 -0
  49. package/dist/internal/validation.d.ts.map +1 -0
  50. package/dist/internal/validation.js +196 -0
  51. package/dist/internal/validation.js.map +1 -0
  52. package/dist/main/asset-download.cjs +265 -0
  53. package/dist/main/asset-download.cjs.map +1 -0
  54. package/dist/main/asset-download.d.cts +12 -0
  55. package/dist/main/asset-download.d.cts.map +1 -0
  56. package/dist/main/asset-download.d.ts +12 -0
  57. package/dist/main/asset-download.d.ts.map +1 -0
  58. package/dist/main/asset-download.js +263 -0
  59. package/dist/main/asset-download.js.map +1 -0
  60. package/dist/main/database.cjs +473 -0
  61. package/dist/main/database.cjs.map +1 -0
  62. package/dist/main/database.d.cts +81 -0
  63. package/dist/main/database.d.cts.map +1 -0
  64. package/dist/main/database.d.ts +81 -0
  65. package/dist/main/database.d.ts.map +1 -0
  66. package/dist/main/database.js +472 -0
  67. package/dist/main/database.js.map +1 -0
  68. package/dist/main/index.cjs +22 -0
  69. package/dist/main/index.d.cts +7 -0
  70. package/dist/main/index.d.ts +7 -0
  71. package/dist/main/index.js +7 -0
  72. package/dist/main/media-cache.cjs +862 -0
  73. package/dist/main/media-cache.cjs.map +1 -0
  74. package/dist/main/media-cache.d.cts +134 -0
  75. package/dist/main/media-cache.d.cts.map +1 -0
  76. package/dist/main/media-cache.d.ts +134 -0
  77. package/dist/main/media-cache.d.ts.map +1 -0
  78. package/dist/main/media-cache.js +854 -0
  79. package/dist/main/media-cache.js.map +1 -0
  80. package/dist/main/storage-root-lock.cjs +124 -0
  81. package/dist/main/storage-root-lock.cjs.map +1 -0
  82. package/dist/main/storage-root-lock.d.cts +11 -0
  83. package/dist/main/storage-root-lock.d.cts.map +1 -0
  84. package/dist/main/storage-root-lock.d.ts +11 -0
  85. package/dist/main/storage-root-lock.d.ts.map +1 -0
  86. package/dist/main/storage-root-lock.js +120 -0
  87. package/dist/main/storage-root-lock.js.map +1 -0
  88. package/dist/main/store.cjs +197 -0
  89. package/dist/main/store.cjs.map +1 -0
  90. package/dist/main/store.d.cts +83 -0
  91. package/dist/main/store.d.cts.map +1 -0
  92. package/dist/main/store.d.ts +83 -0
  93. package/dist/main/store.d.ts.map +1 -0
  94. package/dist/main/store.js +195 -0
  95. package/dist/main/store.js.map +1 -0
  96. package/dist/preload/index.cjs +36 -0
  97. package/dist/preload/index.cjs.map +1 -0
  98. package/dist/preload/index.d.cts +14 -0
  99. package/dist/preload/index.d.cts.map +1 -0
  100. package/dist/preload/index.d.ts +14 -0
  101. package/dist/preload/index.d.ts.map +1 -0
  102. package/dist/preload/index.js +34 -0
  103. package/dist/preload/index.js.map +1 -0
  104. package/dist/react/index.cjs +199 -0
  105. package/dist/react/index.cjs.map +1 -0
  106. package/dist/react/index.d.cts +50 -0
  107. package/dist/react/index.d.cts.map +1 -0
  108. package/dist/react/index.d.ts +50 -0
  109. package/dist/react/index.d.ts.map +1 -0
  110. package/dist/react/index.js +191 -0
  111. package/dist/react/index.js.map +1 -0
  112. package/dist/renderer/helpers.cjs +36 -0
  113. package/dist/renderer/helpers.cjs.map +1 -0
  114. package/dist/renderer/helpers.d.cts +11 -0
  115. package/dist/renderer/helpers.d.cts.map +1 -0
  116. package/dist/renderer/helpers.d.ts +11 -0
  117. package/dist/renderer/helpers.d.ts.map +1 -0
  118. package/dist/renderer/helpers.js +35 -0
  119. package/dist/renderer/helpers.js.map +1 -0
  120. package/dist/renderer/index.cjs +20 -0
  121. package/dist/renderer/index.cjs.map +1 -0
  122. package/dist/renderer/index.d.cts +14 -0
  123. package/dist/renderer/index.d.cts.map +1 -0
  124. package/dist/renderer/index.d.ts +14 -0
  125. package/dist/renderer/index.d.ts.map +1 -0
  126. package/dist/renderer/index.js +14 -0
  127. package/dist/renderer/index.js.map +1 -0
  128. package/dist/renderer/runtime.cjs +278 -0
  129. package/dist/renderer/runtime.cjs.map +1 -0
  130. package/dist/renderer/runtime.d.cts +35 -0
  131. package/dist/renderer/runtime.d.cts.map +1 -0
  132. package/dist/renderer/runtime.d.ts +35 -0
  133. package/dist/renderer/runtime.d.ts.map +1 -0
  134. package/dist/renderer/runtime.js +273 -0
  135. package/dist/renderer/runtime.js.map +1 -0
  136. package/dist/renderer/window-globals.d.cts +9 -0
  137. package/dist/renderer/window-globals.d.cts.map +1 -0
  138. package/dist/renderer/window-globals.d.ts +9 -0
  139. package/dist/renderer/window-globals.d.ts.map +1 -0
  140. package/dist/shared/errors.cjs +102 -0
  141. package/dist/shared/errors.cjs.map +1 -0
  142. package/dist/shared/errors.d.cts +45 -0
  143. package/dist/shared/errors.d.cts.map +1 -0
  144. package/dist/shared/errors.d.ts +45 -0
  145. package/dist/shared/errors.d.ts.map +1 -0
  146. package/dist/shared/errors.js +93 -0
  147. package/dist/shared/errors.js.map +1 -0
  148. package/dist/shared/ipc.cjs +14 -0
  149. package/dist/shared/ipc.cjs.map +1 -0
  150. package/dist/shared/ipc.d.cts +12 -0
  151. package/dist/shared/ipc.d.cts.map +1 -0
  152. package/dist/shared/ipc.d.ts +12 -0
  153. package/dist/shared/ipc.d.ts.map +1 -0
  154. package/dist/shared/ipc.js +13 -0
  155. package/dist/shared/ipc.js.map +1 -0
  156. package/dist/shared/normalize.cjs +19 -0
  157. package/dist/shared/normalize.cjs.map +1 -0
  158. package/dist/shared/normalize.d.cts +11 -0
  159. package/dist/shared/normalize.d.cts.map +1 -0
  160. package/dist/shared/normalize.d.ts +11 -0
  161. package/dist/shared/normalize.d.ts.map +1 -0
  162. package/dist/shared/normalize.js +18 -0
  163. package/dist/shared/normalize.js.map +1 -0
  164. package/dist/shared/pagination.cjs +32 -0
  165. package/dist/shared/pagination.cjs.map +1 -0
  166. package/dist/shared/pagination.d.cts +14 -0
  167. package/dist/shared/pagination.d.cts.map +1 -0
  168. package/dist/shared/pagination.d.ts +14 -0
  169. package/dist/shared/pagination.d.ts.map +1 -0
  170. package/dist/shared/pagination.js +28 -0
  171. package/dist/shared/pagination.js.map +1 -0
  172. package/dist/shared/stem.cjs +16 -0
  173. package/dist/shared/stem.cjs.map +1 -0
  174. package/dist/shared/stem.d.cts +6 -0
  175. package/dist/shared/stem.d.cts.map +1 -0
  176. package/dist/shared/stem.d.ts +6 -0
  177. package/dist/shared/stem.d.ts.map +1 -0
  178. package/dist/shared/stem.js +14 -0
  179. package/dist/shared/stem.js.map +1 -0
  180. package/dist/shared/types.cjs +15 -0
  181. package/dist/shared/types.cjs.map +1 -0
  182. package/dist/shared/types.d.cts +234 -0
  183. package/dist/shared/types.d.cts.map +1 -0
  184. package/dist/shared/types.d.ts +234 -0
  185. package/dist/shared/types.d.ts.map +1 -0
  186. package/dist/shared/types.js +14 -0
  187. package/dist/shared/types.js.map +1 -0
  188. package/package.json +120 -0
  189. package/skills/authenticated-downloads/SKILL.md +203 -0
  190. package/skills/cache-configuration/SKILL.md +357 -0
  191. package/skills/cache-configuration/references/options.md +356 -0
  192. package/skills/getting-started/SKILL.md +407 -0
  193. package/skills/production-checklist/SKILL.md +397 -0
  194. package/skills/react-rendering/SKILL.md +424 -0
  195. package/skills/react-rendering/references/hooks.md +443 -0
  196. package/skills/store-authoring/SKILL.md +369 -0
@@ -0,0 +1,14 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/shared/ipc.ts
3
+ const MEDIA_CACHE_IPC = {
4
+ getStatus: "rockhallweb:media-cache:get-status",
5
+ syncNow: "rockhallweb:media-cache:sync-now",
6
+ getAsset: "rockhallweb:media-cache:get-asset",
7
+ listByIndex: "rockhallweb:media-cache:list-by-index",
8
+ findByFileStem: "rockhallweb:media-cache:find-by-file-stem",
9
+ statusChanged: "rockhallweb:media-cache:status-changed"
10
+ };
11
+ //#endregion
12
+ exports.MEDIA_CACHE_IPC = MEDIA_CACHE_IPC;
13
+
14
+ //# sourceMappingURL=ipc.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.cjs","names":[],"sources":["../../src/shared/ipc.ts"],"sourcesContent":["export const MEDIA_CACHE_IPC = {\n getStatus: \"rockhallweb:media-cache:get-status\",\n syncNow: \"rockhallweb:media-cache:sync-now\",\n getAsset: \"rockhallweb:media-cache:get-asset\",\n listByIndex: \"rockhallweb:media-cache:list-by-index\",\n findByFileStem: \"rockhallweb:media-cache:find-by-file-stem\",\n statusChanged: \"rockhallweb:media-cache:status-changed\",\n} as const;\n"],"mappings":";;AAAA,MAAa,kBAAkB;CAC7B,WAAW;CACX,SAAS;CACT,UAAU;CACV,aAAa;CACb,gBAAgB;CAChB,eAAe;CAChB"}
@@ -0,0 +1,12 @@
1
+ //#region src/shared/ipc.d.ts
2
+ declare const MEDIA_CACHE_IPC: {
3
+ readonly getStatus: "rockhallweb:media-cache:get-status";
4
+ readonly syncNow: "rockhallweb:media-cache:sync-now";
5
+ readonly getAsset: "rockhallweb:media-cache:get-asset";
6
+ readonly listByIndex: "rockhallweb:media-cache:list-by-index";
7
+ readonly findByFileStem: "rockhallweb:media-cache:find-by-file-stem";
8
+ readonly statusChanged: "rockhallweb:media-cache:status-changed";
9
+ };
10
+ //#endregion
11
+ export { MEDIA_CACHE_IPC };
12
+ //# sourceMappingURL=ipc.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.d.cts","names":[],"sources":["../../src/shared/ipc.ts"],"mappings":";cAAa,eAAA;EAAA"}
@@ -0,0 +1,12 @@
1
+ //#region src/shared/ipc.d.ts
2
+ declare const MEDIA_CACHE_IPC: {
3
+ readonly getStatus: "rockhallweb:media-cache:get-status";
4
+ readonly syncNow: "rockhallweb:media-cache:sync-now";
5
+ readonly getAsset: "rockhallweb:media-cache:get-asset";
6
+ readonly listByIndex: "rockhallweb:media-cache:list-by-index";
7
+ readonly findByFileStem: "rockhallweb:media-cache:find-by-file-stem";
8
+ readonly statusChanged: "rockhallweb:media-cache:status-changed";
9
+ };
10
+ //#endregion
11
+ export { MEDIA_CACHE_IPC };
12
+ //# sourceMappingURL=ipc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.d.ts","names":[],"sources":["../../src/shared/ipc.ts"],"mappings":";cAAa,eAAA;EAAA"}
@@ -0,0 +1,13 @@
1
+ //#region src/shared/ipc.ts
2
+ const MEDIA_CACHE_IPC = {
3
+ getStatus: "rockhallweb:media-cache:get-status",
4
+ syncNow: "rockhallweb:media-cache:sync-now",
5
+ getAsset: "rockhallweb:media-cache:get-asset",
6
+ listByIndex: "rockhallweb:media-cache:list-by-index",
7
+ findByFileStem: "rockhallweb:media-cache:find-by-file-stem",
8
+ statusChanged: "rockhallweb:media-cache:status-changed"
9
+ };
10
+ //#endregion
11
+ export { MEDIA_CACHE_IPC };
12
+
13
+ //# sourceMappingURL=ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.js","names":[],"sources":["../../src/shared/ipc.ts"],"sourcesContent":["export const MEDIA_CACHE_IPC = {\n getStatus: \"rockhallweb:media-cache:get-status\",\n syncNow: \"rockhallweb:media-cache:sync-now\",\n getAsset: \"rockhallweb:media-cache:get-asset\",\n listByIndex: \"rockhallweb:media-cache:list-by-index\",\n findByFileStem: \"rockhallweb:media-cache:find-by-file-stem\",\n statusChanged: \"rockhallweb:media-cache:status-changed\",\n} as const;\n"],"mappings":";AAAA,MAAa,kBAAkB;CAC7B,WAAW;CACX,SAAS;CACT,UAAU;CACV,aAAa;CACb,gBAAgB;CAChB,eAAe;CAChB"}
@@ -0,0 +1,19 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_shared_errors = require("./errors.cjs");
3
+ //#region src/shared/normalize.ts
4
+ /**
5
+ * Validates flat manifest metadata (currently only `expiresAt`).
6
+ * All per-asset normalization happens inside `MediaStore._serialize()`.
7
+ */
8
+ function validateFlatManifest(manifest) {
9
+ if (manifest.expiresAt !== void 0) normalizeExpiration(manifest.expiresAt);
10
+ return manifest;
11
+ }
12
+ const ISO_8601_OFFSET_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
13
+ function normalizeExpiration(expiresAt) {
14
+ if (!ISO_8601_OFFSET_TIMESTAMP.test(expiresAt) || Number.isNaN(Date.parse(expiresAt))) throw new require_shared_errors.StoreValidationError("Store expiresAt must be an ISO 8601 timestamp with a timezone offset or Z suffix.");
15
+ }
16
+ //#endregion
17
+ exports.validateFlatManifest = validateFlatManifest;
18
+
19
+ //# sourceMappingURL=normalize.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.cjs","names":["StoreValidationError"],"sources":["../../src/shared/normalize.ts"],"sourcesContent":["import { StoreValidationError } from \"./errors.js\";\nimport type { FlatManifest } from \"./types.js\";\n\n/**\n * Validates flat manifest metadata (currently only `expiresAt`).\n * All per-asset normalization happens inside `MediaStore._serialize()`.\n */\nexport function validateFlatManifest(manifest: FlatManifest): FlatManifest {\n if (manifest.expiresAt !== undefined) {\n normalizeExpiration(manifest.expiresAt);\n }\n return manifest;\n}\n\nconst ISO_8601_OFFSET_TIMESTAMP =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\nfunction normalizeExpiration(expiresAt: string): void {\n if (!ISO_8601_OFFSET_TIMESTAMP.test(expiresAt) || Number.isNaN(Date.parse(expiresAt))) {\n throw new StoreValidationError(\n \"Store expiresAt must be an ISO 8601 timestamp with a timezone offset or Z suffix.\",\n );\n }\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,qBAAqB,UAAsC;CACzE,IAAI,SAAS,cAAc,KAAA,GACzB,oBAAoB,SAAS,UAAU;CAEzC,OAAO;;AAGT,MAAM,4BACJ;AAEF,SAAS,oBAAoB,WAAyB;CACpD,IAAI,CAAC,0BAA0B,KAAK,UAAU,IAAI,OAAO,MAAM,KAAK,MAAM,UAAU,CAAC,EACnF,MAAM,IAAIA,sBAAAA,qBACR,oFACD"}
@@ -0,0 +1,11 @@
1
+ import { FlatManifest } from "./types.cjs";
2
+
3
+ //#region src/shared/normalize.d.ts
4
+ /**
5
+ * Validates flat manifest metadata (currently only `expiresAt`).
6
+ * All per-asset normalization happens inside `MediaStore._serialize()`.
7
+ */
8
+ declare function validateFlatManifest(manifest: FlatManifest): FlatManifest;
9
+ //#endregion
10
+ export { validateFlatManifest };
11
+ //# sourceMappingURL=normalize.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.cts","names":[],"sources":["../../src/shared/normalize.ts"],"mappings":";;;;;AAOA;;iBAAgB,oBAAA,CAAqB,QAAA,EAAU,YAAA,GAAe,YAAA"}
@@ -0,0 +1,11 @@
1
+ import { FlatManifest } from "./types.js";
2
+
3
+ //#region src/shared/normalize.d.ts
4
+ /**
5
+ * Validates flat manifest metadata (currently only `expiresAt`).
6
+ * All per-asset normalization happens inside `MediaStore._serialize()`.
7
+ */
8
+ declare function validateFlatManifest(manifest: FlatManifest): FlatManifest;
9
+ //#endregion
10
+ export { validateFlatManifest };
11
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","names":[],"sources":["../../src/shared/normalize.ts"],"mappings":";;;;;AAOA;;iBAAgB,oBAAA,CAAqB,QAAA,EAAU,YAAA,GAAe,YAAA"}
@@ -0,0 +1,18 @@
1
+ import { StoreValidationError } from "./errors.js";
2
+ //#region src/shared/normalize.ts
3
+ /**
4
+ * Validates flat manifest metadata (currently only `expiresAt`).
5
+ * All per-asset normalization happens inside `MediaStore._serialize()`.
6
+ */
7
+ function validateFlatManifest(manifest) {
8
+ if (manifest.expiresAt !== void 0) normalizeExpiration(manifest.expiresAt);
9
+ return manifest;
10
+ }
11
+ const ISO_8601_OFFSET_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
12
+ function normalizeExpiration(expiresAt) {
13
+ if (!ISO_8601_OFFSET_TIMESTAMP.test(expiresAt) || Number.isNaN(Date.parse(expiresAt))) throw new StoreValidationError("Store expiresAt must be an ISO 8601 timestamp with a timezone offset or Z suffix.");
14
+ }
15
+ //#endregion
16
+ export { validateFlatManifest };
17
+
18
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","names":[],"sources":["../../src/shared/normalize.ts"],"sourcesContent":["import { StoreValidationError } from \"./errors.js\";\nimport type { FlatManifest } from \"./types.js\";\n\n/**\n * Validates flat manifest metadata (currently only `expiresAt`).\n * All per-asset normalization happens inside `MediaStore._serialize()`.\n */\nexport function validateFlatManifest(manifest: FlatManifest): FlatManifest {\n if (manifest.expiresAt !== undefined) {\n normalizeExpiration(manifest.expiresAt);\n }\n return manifest;\n}\n\nconst ISO_8601_OFFSET_TIMESTAMP =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\nfunction normalizeExpiration(expiresAt: string): void {\n if (!ISO_8601_OFFSET_TIMESTAMP.test(expiresAt) || Number.isNaN(Date.parse(expiresAt))) {\n throw new StoreValidationError(\n \"Store expiresAt must be an ISO 8601 timestamp with a timezone offset or Z suffix.\",\n );\n }\n}\n"],"mappings":";;;;;;AAOA,SAAgB,qBAAqB,UAAsC;CACzE,IAAI,SAAS,cAAc,KAAA,GACzB,oBAAoB,SAAS,UAAU;CAEzC,OAAO;;AAGT,MAAM,4BACJ;AAEF,SAAS,oBAAoB,WAAyB;CACpD,IAAI,CAAC,0BAA0B,KAAK,UAAU,IAAI,OAAO,MAAM,KAAK,MAAM,UAAU,CAAC,EACnF,MAAM,IAAI,qBACR,oFACD"}
@@ -0,0 +1,32 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_internal_validation = require("../internal/validation.cjs");
3
+ //#region src/shared/pagination.ts
4
+ function decodeCursor(cursor) {
5
+ if (!cursor) return 0;
6
+ return require_internal_validation.parseJsonWithSchema(Buffer.from(cursor, "base64url").toString("utf8"), require_internal_validation.cursorPayloadSchema, "pagination cursor").index;
7
+ }
8
+ function encodeCursor(index) {
9
+ return Buffer.from(JSON.stringify({ index }), "utf8").toString("base64url");
10
+ }
11
+ function resolvePaginationWindow(pagination) {
12
+ return {
13
+ start: decodeCursor(pagination?.cursor),
14
+ limit: Math.max(1, Math.min(pagination?.limit ?? 50, 500))
15
+ };
16
+ }
17
+ function paginateArray(items, pagination) {
18
+ const { start, limit } = resolvePaginationWindow(pagination);
19
+ const page = items.slice(start, start + limit);
20
+ const nextIndex = start + page.length;
21
+ return {
22
+ items: page,
23
+ nextCursor: nextIndex < items.length ? encodeCursor(nextIndex) : null
24
+ };
25
+ }
26
+ //#endregion
27
+ exports.decodeCursor = decodeCursor;
28
+ exports.encodeCursor = encodeCursor;
29
+ exports.paginateArray = paginateArray;
30
+ exports.resolvePaginationWindow = resolvePaginationWindow;
31
+
32
+ //# sourceMappingURL=pagination.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.cjs","names":["parseJsonWithSchema","cursorPayloadSchema"],"sources":["../../src/shared/pagination.ts"],"sourcesContent":["import type { PaginationInput, PaginationResult } from \"./types.js\";\nimport { cursorPayloadSchema, parseJsonWithSchema } from \"../internal/validation.js\";\n\ninterface DecodedCursor {\n index: number;\n}\n\ninterface PaginationWindow {\n start: number;\n limit: number;\n}\n\nexport function decodeCursor(cursor?: string): number {\n if (!cursor) {\n return 0;\n }\n\n const parsed = parseJsonWithSchema(\n Buffer.from(cursor, \"base64url\").toString(\"utf8\"),\n cursorPayloadSchema,\n \"pagination cursor\",\n ) as DecodedCursor;\n return parsed.index;\n}\n\nexport function encodeCursor(index: number): string {\n return Buffer.from(JSON.stringify({ index }), \"utf8\").toString(\"base64url\");\n}\n\nexport function resolvePaginationWindow(pagination?: PaginationInput): PaginationWindow {\n const start = decodeCursor(pagination?.cursor);\n const limit = Math.max(1, Math.min(pagination?.limit ?? 50, 500));\n\n return {\n start,\n limit,\n };\n}\n\nexport function paginateArray<T>(items: T[], pagination?: PaginationInput): PaginationResult<T> {\n const { start, limit } = resolvePaginationWindow(pagination);\n const page = items.slice(start, start + limit);\n const nextIndex = start + page.length;\n\n return {\n items: page,\n nextCursor: nextIndex < items.length ? encodeCursor(nextIndex) : null,\n };\n}\n"],"mappings":";;;AAYA,SAAgB,aAAa,QAAyB;CACpD,IAAI,CAAC,QACH,OAAO;CAQT,OALeA,4BAAAA,oBACb,OAAO,KAAK,QAAQ,YAAY,CAAC,SAAS,OAAO,EACjDC,4BAAAA,qBACA,oBAEW,CAAC;;AAGhB,SAAgB,aAAa,OAAuB;CAClD,OAAO,OAAO,KAAK,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,YAAY;;AAG7E,SAAgB,wBAAwB,YAAgD;CAItF,OAAO;EACL,OAJY,aAAa,YAAY,OAIhC;EACL,OAJY,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,SAAS,IAAI,IAAI,CAIzD;EACN;;AAGH,SAAgB,cAAiB,OAAY,YAAmD;CAC9F,MAAM,EAAE,OAAO,UAAU,wBAAwB,WAAW;CAC5D,MAAM,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM;CAC9C,MAAM,YAAY,QAAQ,KAAK;CAE/B,OAAO;EACL,OAAO;EACP,YAAY,YAAY,MAAM,SAAS,aAAa,UAAU,GAAG;EAClE"}
@@ -0,0 +1,14 @@
1
+ import { PaginationInput, PaginationResult } from "./types.cjs";
2
+
3
+ //#region src/shared/pagination.d.ts
4
+ interface PaginationWindow {
5
+ start: number;
6
+ limit: number;
7
+ }
8
+ declare function decodeCursor(cursor?: string): number;
9
+ declare function encodeCursor(index: number): string;
10
+ declare function resolvePaginationWindow(pagination?: PaginationInput): PaginationWindow;
11
+ declare function paginateArray<T>(items: T[], pagination?: PaginationInput): PaginationResult<T>;
12
+ //#endregion
13
+ export { decodeCursor, encodeCursor, paginateArray, resolvePaginationWindow };
14
+ //# sourceMappingURL=pagination.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.cts","names":[],"sources":["../../src/shared/pagination.ts"],"mappings":";;;UAOU,gBAAA;EACR,KAAA;EACA,KAAA;AAAA;AAAA,iBAGc,YAAA,CAAa,MAAA;AAAA,iBAab,YAAA,CAAa,KAAA;AAAA,iBAIb,uBAAA,CAAwB,UAAA,GAAa,eAAA,GAAkB,gBAAA;AAAA,iBAUvD,aAAA,GAAA,CAAiB,KAAA,EAAO,CAAA,IAAK,UAAA,GAAa,eAAA,GAAkB,gBAAA,CAAiB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { PaginationInput, PaginationResult } from "./types.js";
2
+
3
+ //#region src/shared/pagination.d.ts
4
+ interface PaginationWindow {
5
+ start: number;
6
+ limit: number;
7
+ }
8
+ declare function decodeCursor(cursor?: string): number;
9
+ declare function encodeCursor(index: number): string;
10
+ declare function resolvePaginationWindow(pagination?: PaginationInput): PaginationWindow;
11
+ declare function paginateArray<T>(items: T[], pagination?: PaginationInput): PaginationResult<T>;
12
+ //#endregion
13
+ export { decodeCursor, encodeCursor, paginateArray, resolvePaginationWindow };
14
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","names":[],"sources":["../../src/shared/pagination.ts"],"mappings":";;;UAOU,gBAAA;EACR,KAAA;EACA,KAAA;AAAA;AAAA,iBAGc,YAAA,CAAa,MAAA;AAAA,iBAab,YAAA,CAAa,KAAA;AAAA,iBAIb,uBAAA,CAAwB,UAAA,GAAa,eAAA,GAAkB,gBAAA;AAAA,iBAUvD,aAAA,GAAA,CAAiB,KAAA,EAAO,CAAA,IAAK,UAAA,GAAa,eAAA,GAAkB,gBAAA,CAAiB,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { cursorPayloadSchema, parseJsonWithSchema } from "../internal/validation.js";
2
+ //#region src/shared/pagination.ts
3
+ function decodeCursor(cursor) {
4
+ if (!cursor) return 0;
5
+ return parseJsonWithSchema(Buffer.from(cursor, "base64url").toString("utf8"), cursorPayloadSchema, "pagination cursor").index;
6
+ }
7
+ function encodeCursor(index) {
8
+ return Buffer.from(JSON.stringify({ index }), "utf8").toString("base64url");
9
+ }
10
+ function resolvePaginationWindow(pagination) {
11
+ return {
12
+ start: decodeCursor(pagination?.cursor),
13
+ limit: Math.max(1, Math.min(pagination?.limit ?? 50, 500))
14
+ };
15
+ }
16
+ function paginateArray(items, pagination) {
17
+ const { start, limit } = resolvePaginationWindow(pagination);
18
+ const page = items.slice(start, start + limit);
19
+ const nextIndex = start + page.length;
20
+ return {
21
+ items: page,
22
+ nextCursor: nextIndex < items.length ? encodeCursor(nextIndex) : null
23
+ };
24
+ }
25
+ //#endregion
26
+ export { decodeCursor, encodeCursor, paginateArray, resolvePaginationWindow };
27
+
28
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","names":[],"sources":["../../src/shared/pagination.ts"],"sourcesContent":["import type { PaginationInput, PaginationResult } from \"./types.js\";\nimport { cursorPayloadSchema, parseJsonWithSchema } from \"../internal/validation.js\";\n\ninterface DecodedCursor {\n index: number;\n}\n\ninterface PaginationWindow {\n start: number;\n limit: number;\n}\n\nexport function decodeCursor(cursor?: string): number {\n if (!cursor) {\n return 0;\n }\n\n const parsed = parseJsonWithSchema(\n Buffer.from(cursor, \"base64url\").toString(\"utf8\"),\n cursorPayloadSchema,\n \"pagination cursor\",\n ) as DecodedCursor;\n return parsed.index;\n}\n\nexport function encodeCursor(index: number): string {\n return Buffer.from(JSON.stringify({ index }), \"utf8\").toString(\"base64url\");\n}\n\nexport function resolvePaginationWindow(pagination?: PaginationInput): PaginationWindow {\n const start = decodeCursor(pagination?.cursor);\n const limit = Math.max(1, Math.min(pagination?.limit ?? 50, 500));\n\n return {\n start,\n limit,\n };\n}\n\nexport function paginateArray<T>(items: T[], pagination?: PaginationInput): PaginationResult<T> {\n const { start, limit } = resolvePaginationWindow(pagination);\n const page = items.slice(start, start + limit);\n const nextIndex = start + page.length;\n\n return {\n items: page,\n nextCursor: nextIndex < items.length ? encodeCursor(nextIndex) : null,\n };\n}\n"],"mappings":";;AAYA,SAAgB,aAAa,QAAyB;CACpD,IAAI,CAAC,QACH,OAAO;CAQT,OALe,oBACb,OAAO,KAAK,QAAQ,YAAY,CAAC,SAAS,OAAO,EACjD,qBACA,oBAEW,CAAC;;AAGhB,SAAgB,aAAa,OAAuB;CAClD,OAAO,OAAO,KAAK,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,YAAY;;AAG7E,SAAgB,wBAAwB,YAAgD;CAItF,OAAO;EACL,OAJY,aAAa,YAAY,OAIhC;EACL,OAJY,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,SAAS,IAAI,IAAI,CAIzD;EACN;;AAGH,SAAgB,cAAiB,OAAY,YAAmD;CAC9F,MAAM,EAAE,OAAO,UAAU,wBAAwB,WAAW;CAC5D,MAAM,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM;CAC9C,MAAM,YAAY,QAAQ,KAAK;CAE/B,OAAO;EACL,OAAO;EACP,YAAY,YAAY,MAAM,SAAS,aAAa,UAAU,GAAG;EAClE"}
@@ -0,0 +1,16 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let node_path = require("node:path");
3
+ //#region src/shared/stem.ts
4
+ function normalizeStem(stem) {
5
+ return stem.trim().toLowerCase();
6
+ }
7
+ function fileStem(fileName) {
8
+ const name = (0, node_path.basename)(fileName);
9
+ const ext = (0, node_path.extname)(name);
10
+ return normalizeStem(ext ? name.slice(0, -ext.length) : name);
11
+ }
12
+ //#endregion
13
+ exports.fileStem = fileStem;
14
+ exports.normalizeStem = normalizeStem;
15
+
16
+ //# sourceMappingURL=stem.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stem.cjs","names":[],"sources":["../../src/shared/stem.ts"],"sourcesContent":["import { basename, extname } from \"node:path\";\n\nexport function normalizeStem(stem: string): string {\n return stem.trim().toLowerCase();\n}\n\nexport function fileStem(fileName: string): string {\n const name = basename(fileName);\n const ext = extname(name);\n return normalizeStem(ext ? name.slice(0, -ext.length) : name);\n}\n"],"mappings":";;;AAEA,SAAgB,cAAc,MAAsB;CAClD,OAAO,KAAK,MAAM,CAAC,aAAa;;AAGlC,SAAgB,SAAS,UAA0B;CACjD,MAAM,QAAA,GAAA,UAAA,UAAgB,SAAS;CAC/B,MAAM,OAAA,GAAA,UAAA,SAAc,KAAK;CACzB,OAAO,cAAc,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK"}
@@ -0,0 +1,6 @@
1
+ //#region src/shared/stem.d.ts
2
+ declare function normalizeStem(stem: string): string;
3
+ declare function fileStem(fileName: string): string;
4
+ //#endregion
5
+ export { fileStem, normalizeStem };
6
+ //# sourceMappingURL=stem.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stem.d.cts","names":[],"sources":["../../src/shared/stem.ts"],"mappings":";iBAEgB,aAAA,CAAc,IAAA;AAAA,iBAId,QAAA,CAAS,QAAA"}
@@ -0,0 +1,6 @@
1
+ //#region src/shared/stem.d.ts
2
+ declare function normalizeStem(stem: string): string;
3
+ declare function fileStem(fileName: string): string;
4
+ //#endregion
5
+ export { fileStem, normalizeStem };
6
+ //# sourceMappingURL=stem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stem.d.ts","names":[],"sources":["../../src/shared/stem.ts"],"mappings":";iBAEgB,aAAA,CAAc,IAAA;AAAA,iBAId,QAAA,CAAS,QAAA"}
@@ -0,0 +1,14 @@
1
+ import { basename, extname } from "node:path";
2
+ //#region src/shared/stem.ts
3
+ function normalizeStem(stem) {
4
+ return stem.trim().toLowerCase();
5
+ }
6
+ function fileStem(fileName) {
7
+ const name = basename(fileName);
8
+ const ext = extname(name);
9
+ return normalizeStem(ext ? name.slice(0, -ext.length) : name);
10
+ }
11
+ //#endregion
12
+ export { fileStem, normalizeStem };
13
+
14
+ //# sourceMappingURL=stem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stem.js","names":[],"sources":["../../src/shared/stem.ts"],"sourcesContent":["import { basename, extname } from \"node:path\";\n\nexport function normalizeStem(stem: string): string {\n return stem.trim().toLowerCase();\n}\n\nexport function fileStem(fileName: string): string {\n const name = basename(fileName);\n const ext = extname(name);\n return normalizeStem(ext ? name.slice(0, -ext.length) : name);\n}\n"],"mappings":";;AAEA,SAAgB,cAAc,MAAsB;CAClD,OAAO,KAAK,MAAM,CAAC,aAAa;;AAGlC,SAAgB,SAAS,UAA0B;CACjD,MAAM,OAAO,SAAS,SAAS;CAC/B,MAAM,MAAM,QAAQ,KAAK;CACzB,OAAO,cAAc,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK"}
@@ -0,0 +1,15 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/shared/types.ts
3
+ /** Tagged index entry produced by calling a {@link import("../main/store.js").MediaIndex} handle. */
4
+ var IndexTag = class {
5
+ name;
6
+ value;
7
+ constructor(name, value) {
8
+ this.name = name;
9
+ this.value = value;
10
+ }
11
+ };
12
+ //#endregion
13
+ exports.IndexTag = IndexTag;
14
+
15
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.cjs","names":[],"sources":["../../src/shared/types.ts"],"sourcesContent":["/** JSON-serializable values used in structured logs, metadata, and manifest extras. */\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n/** Minimum severity emitted when logging is configured; entries below this level are dropped. */\nexport type MediaCacheLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n/**\n * How the built-in main-process console sink formats each line when `logging.onLog` is omitted.\n * Callback loggers always receive structured {@link MediaCacheLogEvent} objects regardless of this setting.\n */\nexport type MediaCacheLogFormat = \"english\" | \"json\";\n\n/** One structured log line from the cache; includes standard fields plus optional diagnostic keys. */\nexport interface MediaCacheLogEvent {\n [key: string]: JsonValue | undefined;\n timestamp: string;\n level: MediaCacheLogLevel;\n event: string;\n service: string;\n component: string;\n}\n\n/** Receives log entries from the main-process cache when `logging.onLog` is set on {@link MediaCacheOptions}. */\nexport type MediaCacheLogHandler = (entry: MediaCacheLogEvent) => void;\n\n/** Logging options when using a custom structured sink. */\nexport interface MediaCacheCustomLoggingOptions {\n level?: MediaCacheLogLevel;\n onLog: MediaCacheLogHandler;\n format?: never;\n}\n\n/** Logging options when using the built-in development console sink. */\nexport interface MediaCacheConsoleLoggingOptions {\n level?: MediaCacheLogLevel;\n format?: MediaCacheLogFormat;\n onLog?: undefined;\n}\n\n/** Logging configuration for `MediaCacheOptions`; custom sinks and console formatting are mutually exclusive. */\nexport type MediaCacheLoggingOptions =\n | MediaCacheCustomLoggingOptions\n | MediaCacheConsoleLoggingOptions;\n\n/** High-level media category derived from an asset's mimeType. */\nexport type MediaKind = \"video\" | \"image\" | \"audio\" | \"document\" | \"html\" | \"text\" | \"binary\";\n\n/** Accepted asset key input: a plain string or an array of string segments. */\nexport type AssetKeyInput = string | readonly string[];\n\n/** Tagged index entry produced by calling a {@link import(\"../main/store.js\").MediaIndex} handle. */\nexport class IndexTag {\n constructor(\n readonly name: string,\n readonly value: string | string[],\n ) {}\n}\n\n/** Input for adding an asset to a {@link import(\"../main/store.js\").MediaStore}. */\nexport interface MediaAssetInput {\n version: string;\n mimeType: string;\n url: string;\n fileName?: string;\n /**\n * Optional declared size in bytes. When set, must be a **non-negative finite** number\n * (`Number.isFinite` and `>= 0`). **Fractional values are allowed** (e.g. estimates);\n * the store does not require integers.\n */\n byteLength?: number;\n metadata?: Record<string, JsonValue>;\n indexes?: IndexTag[];\n}\n\n/** Describes one user-defined or built-in index in the serialized store output. */\nexport interface IndexDefinition {\n name: string;\n cardinality: \"single\" | \"multi\";\n required: boolean;\n builtin: boolean;\n}\n\n/** One asset in the serialized flat manifest (output of `MediaStore._serialize()`). */\nexport interface FlatManifestAsset {\n key: string;\n displayKey: string;\n version: string;\n mimeType: string;\n mediaKind: MediaKind;\n url: string;\n fileName: string;\n fileStem: string;\n byteLength?: number;\n metadata: Record<string, JsonValue>;\n indexes: Record<string, string | string[]>;\n}\n\n/** Serialized flat manifest produced by `MediaStore._serialize()` and consumed by the sync engine. */\nexport interface FlatManifest {\n snapshotId?: string;\n retrievedAt?: string;\n expiresAt?: string;\n indexDefinitions: IndexDefinition[];\n assets: FlatManifestAsset[];\n}\n\n/**\n * After a failed sync: keep serving the last committed generation (`serve-last-snapshot`), or\n * propagate the failure (`throw`). Ignored when `devPassthrough` is true (failures always throw).\n */\nexport type SyncFailureMode = \"serve-last-snapshot\" | \"throw\";\n\n/**\n * Allowed `electron.app.getPath(...)` keys for package-managed storage root resolution.\n */\nexport type MediaCacheAppPath =\n | \"home\"\n | \"appData\"\n | \"userData\"\n | \"sessionData\"\n | \"temp\"\n | \"exe\"\n | \"module\"\n | \"desktop\"\n | \"documents\"\n | \"downloads\"\n | \"music\"\n | \"pictures\"\n | \"videos\"\n | \"recent\"\n | \"logs\"\n | \"crashDumps\";\n\n/** Storage root composed from `electron.app.getPath(appPath)` plus optional subpath segments. */\nexport interface MediaCacheStoragePath {\n appPath: MediaCacheAppPath;\n segments?: string[];\n}\n\n/**\n * Main-process configuration: where state lives, sync and storage guardrails, logging, and how the\n * store is resolved.\n *\n * Default behavior is offline mode unless `process.env.NODE_ENV` is `\"development\"`: assets sync to\n * disk and resolved URLs use the privileged `media:` protocol.\n */\nexport interface MediaCacheOptions {\n storagePath: MediaCacheStoragePath;\n devPassthrough?: boolean;\n assetBaseUrl?: string | null;\n maxCacheBytes?: number;\n reserveFreeBytes?: number;\n staleDeleteAfterMs?: number;\n onSyncFailure?: SyncFailureMode;\n syncHistoryLimit?: number;\n logging?: MediaCacheLoggingOptions;\n resolveStore: () =>\n | Promise<import(\"../main/store.js\").MediaStore>\n | import(\"../main/store.js\").MediaStore;\n}\n\n/** Cursor-based page for list APIs. */\nexport interface PaginationInput {\n limit?: number;\n cursor?: string;\n}\n\n/** One page of results; `nextCursor` is null when there are no more items. */\nexport interface PaginationResult<T> {\n items: T[];\n nextCursor: string | null;\n}\n\n/** Snapshot of sync and readiness state. */\nexport interface MediaCacheStatus {\n phase: \"idle\" | \"syncing\" | \"ready\" | \"error\";\n storageRoot: string | null;\n activeGenerationId: number | null;\n progress: SyncProgress | null;\n lastRun: SyncRunSummary | null;\n error: SerializedMediaCacheError | null;\n updatedAt: number;\n}\n\nexport type MediaCachePhase = MediaCacheStatus[\"phase\"] | \"loading\";\n\n/** Fine-grained sync pipeline step and counters while a run is active. */\nexport interface SyncProgress {\n runId: number;\n phase:\n | \"resolving-store\"\n | \"staging-generation\"\n | \"diffing\"\n | \"downloading\"\n | \"committing\"\n | \"pruning\";\n totalAssets: number;\n completedAssets: number;\n downloadedAssets: number;\n skippedAssets: number;\n bytesDownloaded: number;\n}\n\n/** Counters persisted with a {@link SyncRunSummary} after (or during) a sync run. */\nexport interface SyncRunStats {\n totalAssets: number;\n downloadedAssets: number;\n skippedAssets: number;\n bytesDownloaded: number;\n}\n\n/** Record of one sync run persisted for history. */\nexport interface SyncRunSummary {\n id: number;\n status: \"running\" | \"success\" | \"error\";\n startedAt: number;\n finishedAt: number | null;\n errorCode: string | null;\n errorMessage: string | null;\n stats: SyncRunStats;\n}\n\n/** One asset after resolution: flat key-value with `media:` URL or remote URL in passthrough mode. */\nexport interface ResolvedMediaAsset {\n key: string;\n displayKey: string;\n version: string;\n mimeType: string;\n kind: MediaKind;\n byteLength?: number;\n url: string;\n metadata: Record<string, JsonValue>;\n indexes: Record<string, string | string[]>;\n}\n\n/** Assets whose manifest file name stem matched a search. */\nexport interface FileStemMatch {\n asset: ResolvedMediaAsset;\n}\n\n/**\n * Renderer-safe API to the cache: read/query operations plus status subscription.\n */\nexport interface MediaCacheBridge {\n getStatus(): Promise<MediaCacheStatus>;\n syncNow(): Promise<void>;\n getAsset(key: AssetKeyInput): Promise<ResolvedMediaAsset | null>;\n listByIndex(\n indexName: string,\n value: string,\n pagination?: PaginationInput,\n ): Promise<PaginationResult<ResolvedMediaAsset>>;\n findByFileStem(\n stem: string,\n pagination?: PaginationInput,\n ): Promise<PaginationResult<FileStemMatch>>;\n subscribeStatus(listener: (status: MediaCacheStatus) => void): () => void;\n}\n\n/** Stable error shape stored on {@link MediaCacheStatus} when a sync fails. */\nexport interface SerializedMediaCacheError {\n name: string;\n code: string;\n message: string;\n}\n\n/** Options for {@link import(\"../preload/index.js\").exposeMediaCacheBridge}. */\nexport interface PreloadExposeOptions {\n key?: string;\n}\n\n/** Optional sync-complete refetch behavior for React query hooks. */\nexport interface MediaQuerySyncOptions {\n refetchOnSyncComplete?: boolean;\n}\n\n/** Derived readiness snapshot for `useMediaCacheReady()`. */\nexport interface MediaCacheReadyState {\n ready: boolean;\n syncing: boolean;\n phase: MediaCacheStatus[\"phase\"];\n activeGenerationId: number | null;\n syncError: SerializedMediaCacheError | null;\n}\n\n/** Aggregated error view for the provider-driven `useMediaCacheErrors()`. */\nexport interface MediaCacheErrors {\n syncError: SerializedMediaCacheError | null;\n statusError: Error | null;\n queryErrors: Error[];\n hasError: boolean;\n primaryError: Error | null;\n}\n"],"mappings":";;;AAyDA,IAAa,WAAb,MAAsB;CAET;CACA;CAFX,YACE,MACA,OACA;EAFS,KAAA,OAAA;EACA,KAAA,QAAA"}
@@ -0,0 +1,234 @@
1
+ import { MediaStore } from "../main/store.cjs";
2
+
3
+ //#region src/shared/types.d.ts
4
+ /** JSON-serializable values used in structured logs, metadata, and manifest extras. */
5
+ type JsonValue = string | number | boolean | null | JsonValue[] | {
6
+ [key: string]: JsonValue;
7
+ };
8
+ /** Minimum severity emitted when logging is configured; entries below this level are dropped. */
9
+ type MediaCacheLogLevel = "debug" | "info" | "warn" | "error";
10
+ /**
11
+ * How the built-in main-process console sink formats each line when `logging.onLog` is omitted.
12
+ * Callback loggers always receive structured {@link MediaCacheLogEvent} objects regardless of this setting.
13
+ */
14
+ type MediaCacheLogFormat = "english" | "json";
15
+ /** One structured log line from the cache; includes standard fields plus optional diagnostic keys. */
16
+ interface MediaCacheLogEvent {
17
+ [key: string]: JsonValue | undefined;
18
+ timestamp: string;
19
+ level: MediaCacheLogLevel;
20
+ event: string;
21
+ service: string;
22
+ component: string;
23
+ }
24
+ /** Receives log entries from the main-process cache when `logging.onLog` is set on {@link MediaCacheOptions}. */
25
+ type MediaCacheLogHandler = (entry: MediaCacheLogEvent) => void;
26
+ /** Logging options when using a custom structured sink. */
27
+ interface MediaCacheCustomLoggingOptions {
28
+ level?: MediaCacheLogLevel;
29
+ onLog: MediaCacheLogHandler;
30
+ format?: never;
31
+ }
32
+ /** Logging options when using the built-in development console sink. */
33
+ interface MediaCacheConsoleLoggingOptions {
34
+ level?: MediaCacheLogLevel;
35
+ format?: MediaCacheLogFormat;
36
+ onLog?: undefined;
37
+ }
38
+ /** Logging configuration for `MediaCacheOptions`; custom sinks and console formatting are mutually exclusive. */
39
+ type MediaCacheLoggingOptions = MediaCacheCustomLoggingOptions | MediaCacheConsoleLoggingOptions;
40
+ /** High-level media category derived from an asset's mimeType. */
41
+ type MediaKind = "video" | "image" | "audio" | "document" | "html" | "text" | "binary";
42
+ /** Accepted asset key input: a plain string or an array of string segments. */
43
+ type AssetKeyInput = string | readonly string[];
44
+ /** Tagged index entry produced by calling a {@link import("../main/store.js").MediaIndex} handle. */
45
+ declare class IndexTag {
46
+ readonly name: string;
47
+ readonly value: string | string[];
48
+ constructor(name: string, value: string | string[]);
49
+ }
50
+ /** Input for adding an asset to a {@link import("../main/store.js").MediaStore}. */
51
+ interface MediaAssetInput {
52
+ version: string;
53
+ mimeType: string;
54
+ url: string;
55
+ fileName?: string;
56
+ /**
57
+ * Optional declared size in bytes. When set, must be a **non-negative finite** number
58
+ * (`Number.isFinite` and `>= 0`). **Fractional values are allowed** (e.g. estimates);
59
+ * the store does not require integers.
60
+ */
61
+ byteLength?: number;
62
+ metadata?: Record<string, JsonValue>;
63
+ indexes?: IndexTag[];
64
+ }
65
+ /** Describes one user-defined or built-in index in the serialized store output. */
66
+ interface IndexDefinition {
67
+ name: string;
68
+ cardinality: "single" | "multi";
69
+ required: boolean;
70
+ builtin: boolean;
71
+ }
72
+ /** One asset in the serialized flat manifest (output of `MediaStore._serialize()`). */
73
+ interface FlatManifestAsset {
74
+ key: string;
75
+ displayKey: string;
76
+ version: string;
77
+ mimeType: string;
78
+ mediaKind: MediaKind;
79
+ url: string;
80
+ fileName: string;
81
+ fileStem: string;
82
+ byteLength?: number;
83
+ metadata: Record<string, JsonValue>;
84
+ indexes: Record<string, string | string[]>;
85
+ }
86
+ /** Serialized flat manifest produced by `MediaStore._serialize()` and consumed by the sync engine. */
87
+ interface FlatManifest {
88
+ snapshotId?: string;
89
+ retrievedAt?: string;
90
+ expiresAt?: string;
91
+ indexDefinitions: IndexDefinition[];
92
+ assets: FlatManifestAsset[];
93
+ }
94
+ /**
95
+ * After a failed sync: keep serving the last committed generation (`serve-last-snapshot`), or
96
+ * propagate the failure (`throw`). Ignored when `devPassthrough` is true (failures always throw).
97
+ */
98
+ type SyncFailureMode = "serve-last-snapshot" | "throw";
99
+ /**
100
+ * Allowed `electron.app.getPath(...)` keys for package-managed storage root resolution.
101
+ */
102
+ type MediaCacheAppPath = "home" | "appData" | "userData" | "sessionData" | "temp" | "exe" | "module" | "desktop" | "documents" | "downloads" | "music" | "pictures" | "videos" | "recent" | "logs" | "crashDumps";
103
+ /** Storage root composed from `electron.app.getPath(appPath)` plus optional subpath segments. */
104
+ interface MediaCacheStoragePath {
105
+ appPath: MediaCacheAppPath;
106
+ segments?: string[];
107
+ }
108
+ /**
109
+ * Main-process configuration: where state lives, sync and storage guardrails, logging, and how the
110
+ * store is resolved.
111
+ *
112
+ * Default behavior is offline mode unless `process.env.NODE_ENV` is `"development"`: assets sync to
113
+ * disk and resolved URLs use the privileged `media:` protocol.
114
+ */
115
+ interface MediaCacheOptions {
116
+ storagePath: MediaCacheStoragePath;
117
+ devPassthrough?: boolean;
118
+ assetBaseUrl?: string | null;
119
+ maxCacheBytes?: number;
120
+ reserveFreeBytes?: number;
121
+ staleDeleteAfterMs?: number;
122
+ onSyncFailure?: SyncFailureMode;
123
+ syncHistoryLimit?: number;
124
+ logging?: MediaCacheLoggingOptions;
125
+ resolveStore: () => Promise<MediaStore> | MediaStore;
126
+ }
127
+ /** Cursor-based page for list APIs. */
128
+ interface PaginationInput {
129
+ limit?: number;
130
+ cursor?: string;
131
+ }
132
+ /** One page of results; `nextCursor` is null when there are no more items. */
133
+ interface PaginationResult<T> {
134
+ items: T[];
135
+ nextCursor: string | null;
136
+ }
137
+ /** Snapshot of sync and readiness state. */
138
+ interface MediaCacheStatus {
139
+ phase: "idle" | "syncing" | "ready" | "error";
140
+ storageRoot: string | null;
141
+ activeGenerationId: number | null;
142
+ progress: SyncProgress | null;
143
+ lastRun: SyncRunSummary | null;
144
+ error: SerializedMediaCacheError | null;
145
+ updatedAt: number;
146
+ }
147
+ type MediaCachePhase = MediaCacheStatus["phase"] | "loading";
148
+ /** Fine-grained sync pipeline step and counters while a run is active. */
149
+ interface SyncProgress {
150
+ runId: number;
151
+ phase: "resolving-store" | "staging-generation" | "diffing" | "downloading" | "committing" | "pruning";
152
+ totalAssets: number;
153
+ completedAssets: number;
154
+ downloadedAssets: number;
155
+ skippedAssets: number;
156
+ bytesDownloaded: number;
157
+ }
158
+ /** Counters persisted with a {@link SyncRunSummary} after (or during) a sync run. */
159
+ interface SyncRunStats {
160
+ totalAssets: number;
161
+ downloadedAssets: number;
162
+ skippedAssets: number;
163
+ bytesDownloaded: number;
164
+ }
165
+ /** Record of one sync run persisted for history. */
166
+ interface SyncRunSummary {
167
+ id: number;
168
+ status: "running" | "success" | "error";
169
+ startedAt: number;
170
+ finishedAt: number | null;
171
+ errorCode: string | null;
172
+ errorMessage: string | null;
173
+ stats: SyncRunStats;
174
+ }
175
+ /** One asset after resolution: flat key-value with `media:` URL or remote URL in passthrough mode. */
176
+ interface ResolvedMediaAsset {
177
+ key: string;
178
+ displayKey: string;
179
+ version: string;
180
+ mimeType: string;
181
+ kind: MediaKind;
182
+ byteLength?: number;
183
+ url: string;
184
+ metadata: Record<string, JsonValue>;
185
+ indexes: Record<string, string | string[]>;
186
+ }
187
+ /** Assets whose manifest file name stem matched a search. */
188
+ interface FileStemMatch {
189
+ asset: ResolvedMediaAsset;
190
+ }
191
+ /**
192
+ * Renderer-safe API to the cache: read/query operations plus status subscription.
193
+ */
194
+ interface MediaCacheBridge {
195
+ getStatus(): Promise<MediaCacheStatus>;
196
+ syncNow(): Promise<void>;
197
+ getAsset(key: AssetKeyInput): Promise<ResolvedMediaAsset | null>;
198
+ listByIndex(indexName: string, value: string, pagination?: PaginationInput): Promise<PaginationResult<ResolvedMediaAsset>>;
199
+ findByFileStem(stem: string, pagination?: PaginationInput): Promise<PaginationResult<FileStemMatch>>;
200
+ subscribeStatus(listener: (status: MediaCacheStatus) => void): () => void;
201
+ }
202
+ /** Stable error shape stored on {@link MediaCacheStatus} when a sync fails. */
203
+ interface SerializedMediaCacheError {
204
+ name: string;
205
+ code: string;
206
+ message: string;
207
+ }
208
+ /** Options for {@link import("../preload/index.js").exposeMediaCacheBridge}. */
209
+ interface PreloadExposeOptions {
210
+ key?: string;
211
+ }
212
+ /** Optional sync-complete refetch behavior for React query hooks. */
213
+ interface MediaQuerySyncOptions {
214
+ refetchOnSyncComplete?: boolean;
215
+ }
216
+ /** Derived readiness snapshot for `useMediaCacheReady()`. */
217
+ interface MediaCacheReadyState {
218
+ ready: boolean;
219
+ syncing: boolean;
220
+ phase: MediaCacheStatus["phase"];
221
+ activeGenerationId: number | null;
222
+ syncError: SerializedMediaCacheError | null;
223
+ }
224
+ /** Aggregated error view for the provider-driven `useMediaCacheErrors()`. */
225
+ interface MediaCacheErrors {
226
+ syncError: SerializedMediaCacheError | null;
227
+ statusError: Error | null;
228
+ queryErrors: Error[];
229
+ hasError: boolean;
230
+ primaryError: Error | null;
231
+ }
232
+ //#endregion
233
+ export { AssetKeyInput, FileStemMatch, FlatManifest, FlatManifestAsset, IndexDefinition, IndexTag, JsonValue, MediaAssetInput, MediaCacheAppPath, MediaCacheBridge, MediaCacheConsoleLoggingOptions, MediaCacheCustomLoggingOptions, MediaCacheErrors, MediaCacheLogEvent, MediaCacheLogFormat, MediaCacheLogHandler, MediaCacheLogLevel, MediaCacheLoggingOptions, MediaCacheOptions, MediaCachePhase, MediaCacheReadyState, MediaCacheStatus, MediaCacheStoragePath, MediaKind, MediaQuerySyncOptions, PaginationInput, PaginationResult, PreloadExposeOptions, ResolvedMediaAsset, SerializedMediaCacheError, SyncFailureMode, SyncProgress, SyncRunStats, SyncRunSummary };
234
+ //# sourceMappingURL=types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../src/shared/types.ts"],"mappings":"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"}