@forgeax/engine-assets-runtime 0.1.3 → 0.1.6

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 (313) hide show
  1. package/README.md +442 -175
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/aabb.unit.test.d.ts +2 -0
  4. package/dist/__tests__/aabb.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/artifact-integrity.unit.test.d.ts +2 -0
  6. package/dist/__tests__/artifact-integrity.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/artifact-io.unit.test.d.ts +2 -0
  8. package/dist/__tests__/artifact-io.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/asset-evidence-sdk.integration.test.d.ts +2 -0
  10. package/dist/__tests__/asset-evidence-sdk.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/asset-evidence.unit.test.d.ts +2 -0
  12. package/dist/__tests__/asset-evidence.unit.test.d.ts.map +1 -0
  13. package/dist/__tests__/asset-kind.unit.test.d.ts +2 -0
  14. package/dist/__tests__/asset-kind.unit.test.d.ts.map +1 -0
  15. package/dist/__tests__/asset-registry-catalog-reconcile.integration.test.d.ts +2 -0
  16. package/dist/__tests__/asset-registry-catalog-reconcile.integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/asset-registry-catalog-reconcile.unit.test.d.ts +2 -0
  18. package/dist/__tests__/asset-registry-catalog-reconcile.unit.test.d.ts.map +1 -0
  19. package/dist/__tests__/asset-registry-catalog.unit.test.d.ts +2 -0
  20. package/dist/__tests__/asset-registry-catalog.unit.test.d.ts.map +1 -0
  21. package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
  22. package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
  23. package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
  24. package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
  25. package/dist/__tests__/asset-runtime-error-code-owner.test-d.d.ts +2 -0
  26. package/dist/__tests__/asset-runtime-error-code-owner.test-d.d.ts.map +1 -0
  27. package/dist/__tests__/catalog-replica.unit.test.d.ts +2 -0
  28. package/dist/__tests__/catalog-replica.unit.test.d.ts.map +1 -0
  29. package/dist/__tests__/catalog-source-v2.unit.test.d.ts +2 -0
  30. package/dist/__tests__/catalog-source-v2.unit.test.d.ts.map +1 -0
  31. package/dist/__tests__/catalog-source.unit.test.d.ts +2 -0
  32. package/dist/__tests__/catalog-source.unit.test.d.ts.map +1 -0
  33. package/dist/__tests__/catalog-subscription-order.unit.test.d.ts +2 -0
  34. package/dist/__tests__/catalog-subscription-order.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/catalog-subscription.unit.test.d.ts +2 -0
  36. package/dist/__tests__/catalog-subscription.unit.test.d.ts.map +1 -0
  37. package/dist/__tests__/decode-image-bytes-pass-through.test.d.ts +2 -0
  38. package/dist/__tests__/decode-image-bytes-pass-through.test.d.ts.map +1 -0
  39. package/dist/__tests__/decode-image-bytes.browser.test.d.ts +2 -0
  40. package/dist/__tests__/decode-image-bytes.browser.test.d.ts.map +1 -0
  41. package/dist/__tests__/decode-image-bytes.test-d.d.ts +2 -0
  42. package/dist/__tests__/decode-image-bytes.test-d.d.ts.map +1 -0
  43. package/dist/__tests__/decode-image-bytes.test.d.ts +2 -0
  44. package/dist/__tests__/decode-image-bytes.test.d.ts.map +1 -0
  45. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
  46. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
  47. package/dist/__tests__/errors-asset.unit.test.d.ts +2 -0
  48. package/dist/__tests__/errors-asset.unit.test.d.ts.map +1 -0
  49. package/dist/__tests__/inline-pack-loaders.unit.test.d.ts +2 -0
  50. package/dist/__tests__/inline-pack-loaders.unit.test.d.ts.map +1 -0
  51. package/dist/__tests__/instantiate-context.unit.test.d.ts +2 -0
  52. package/dist/__tests__/instantiate-context.unit.test.d.ts.map +1 -0
  53. package/dist/__tests__/instantiate-publication-fence.unit.test.d.ts +2 -0
  54. package/dist/__tests__/instantiate-publication-fence.unit.test.d.ts.map +1 -0
  55. package/dist/__tests__/instantiate.unit.test.d.ts +2 -0
  56. package/dist/__tests__/instantiate.unit.test.d.ts.map +1 -0
  57. package/dist/__tests__/loader-input-contract.unit.test.d.ts +2 -0
  58. package/dist/__tests__/loader-input-contract.unit.test.d.ts.map +1 -0
  59. package/dist/__tests__/loader-registry.unit.test.d.ts +2 -0
  60. package/dist/__tests__/loader-registry.unit.test.d.ts.map +1 -0
  61. package/dist/__tests__/material-dependency-invalidation.unit.test.d.ts +2 -0
  62. package/dist/__tests__/material-dependency-invalidation.unit.test.d.ts.map +1 -0
  63. package/dist/__tests__/material-generation-cache.unit.test.d.ts +2 -0
  64. package/dist/__tests__/material-generation-cache.unit.test.d.ts.map +1 -0
  65. package/dist/__tests__/material-load-consumer.test-d.d.ts +2 -0
  66. package/dist/__tests__/material-load-consumer.test-d.d.ts.map +1 -0
  67. package/dist/__tests__/material-ready.integration.test.d.ts +2 -0
  68. package/dist/__tests__/material-ready.integration.test.d.ts.map +1 -0
  69. package/dist/__tests__/material-stale-generation.unit.test.d.ts +2 -0
  70. package/dist/__tests__/material-stale-generation.unit.test.d.ts.map +1 -0
  71. package/dist/__tests__/mesh-bin-morph-v3.test.d.ts +2 -0
  72. package/dist/__tests__/mesh-bin-morph-v3.test.d.ts.map +1 -0
  73. package/dist/__tests__/mesh-bin.unit.test.d.ts +2 -0
  74. package/dist/__tests__/mesh-bin.unit.test.d.ts.map +1 -0
  75. package/dist/__tests__/mipmap-generator.unit.test.d.ts +2 -0
  76. package/dist/__tests__/mipmap-generator.unit.test.d.ts.map +1 -0
  77. package/dist/__tests__/pack-artifact-transcode-model-owner.test.d.ts +2 -0
  78. package/dist/__tests__/pack-artifact-transcode-model-owner.test.d.ts.map +1 -0
  79. package/dist/__tests__/pack-basis-load.integration.test.d.ts +2 -0
  80. package/dist/__tests__/pack-basis-load.integration.test.d.ts.map +1 -0
  81. package/dist/__tests__/payload-validate.unit.test.d.ts +2 -0
  82. package/dist/__tests__/payload-validate.unit.test.d.ts.map +1 -0
  83. package/dist/__tests__/plugin.test.d.ts +2 -0
  84. package/dist/__tests__/plugin.test.d.ts.map +1 -0
  85. package/dist/__tests__/registry-concurrency.bench.test.d.ts +2 -0
  86. package/dist/__tests__/registry-concurrency.bench.test.d.ts.map +1 -0
  87. package/dist/__tests__/registry-failure-retry.integration.test.d.ts +2 -0
  88. package/dist/__tests__/registry-failure-retry.integration.test.d.ts.map +1 -0
  89. package/dist/__tests__/registry-load-graph.integration.test.d.ts +2 -0
  90. package/dist/__tests__/registry-load-graph.integration.test.d.ts.map +1 -0
  91. package/dist/__tests__/registry-load-state.unit.test.d.ts +2 -0
  92. package/dist/__tests__/registry-load-state.unit.test.d.ts.map +1 -0
  93. package/dist/__tests__/registry-package-cache.unit.test.d.ts +2 -0
  94. package/dist/__tests__/registry-package-cache.unit.test.d.ts.map +1 -0
  95. package/dist/__tests__/registry-public-ready.unit.test.d.ts +2 -0
  96. package/dist/__tests__/registry-public-ready.unit.test.d.ts.map +1 -0
  97. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
  98. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
  99. package/dist/__tests__/scene-handle-fields.unit.test.d.ts +2 -0
  100. package/dist/__tests__/scene-handle-fields.unit.test.d.ts.map +1 -0
  101. package/dist/__tests__/scene-payload.unit.test.d.ts +2 -0
  102. package/dist/__tests__/scene-payload.unit.test.d.ts.map +1 -0
  103. package/dist/__tests__/scene-publication-fence.test.d.ts +2 -0
  104. package/dist/__tests__/scene-publication-fence.test.d.ts.map +1 -0
  105. package/dist/__tests__/scriptable-pack-public-surface.test-d.d.ts +2 -0
  106. package/dist/__tests__/scriptable-pack-public-surface.test-d.d.ts.map +1 -0
  107. package/dist/__tests__/static-rig.integration.test.d.ts +2 -0
  108. package/dist/__tests__/static-rig.integration.test.d.ts.map +1 -0
  109. package/dist/__tests__/validate-material.unit.test.d.ts +2 -0
  110. package/dist/__tests__/validate-material.unit.test.d.ts.map +1 -0
  111. package/dist/__tests__/video-pack-loader.integration.test.d.ts +2 -0
  112. package/dist/__tests__/video-pack-loader.integration.test.d.ts.map +1 -0
  113. package/dist/aabb.d.ts +3 -0
  114. package/dist/aabb.d.ts.map +1 -0
  115. package/dist/asset-registry.d.ts +552 -0
  116. package/dist/asset-registry.d.ts.map +1 -0
  117. package/dist/builtin-asset-registry.d.ts +22 -0
  118. package/dist/builtin-asset-registry.d.ts.map +1 -0
  119. package/dist/catalog-source.d.ts +2 -1
  120. package/dist/catalog-source.d.ts.map +1 -1
  121. package/dist/decode-image-bytes.d.ts +57 -0
  122. package/dist/decode-image-bytes.d.ts.map +1 -0
  123. package/dist/dynamic-texture-store.d.ts +89 -0
  124. package/dist/dynamic-texture-store.d.ts.map +1 -0
  125. package/dist/errors/asset.d.ts +201 -0
  126. package/dist/errors/asset.d.ts.map +1 -0
  127. package/dist/handles.d.ts +141 -0
  128. package/dist/handles.d.ts.map +1 -0
  129. package/dist/image-error.d.ts +6 -0
  130. package/dist/image-error.d.ts.map +1 -0
  131. package/dist/index.d.ts +32 -3
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.mjs +7218 -114
  134. package/dist/index.mjs.map +1 -1
  135. package/dist/internal.d.ts +2 -1
  136. package/dist/internal.d.ts.map +1 -1
  137. package/dist/internal.mjs +317 -3
  138. package/dist/internal.mjs.map +1 -1
  139. package/dist/loader-registry.d.ts +63 -0
  140. package/dist/loader-registry.d.ts.map +1 -0
  141. package/dist/loaders/inline-pack.d.ts +72 -0
  142. package/dist/loaders/inline-pack.d.ts.map +1 -0
  143. package/dist/loaders/mesh-bin.d.ts +21 -0
  144. package/dist/loaders/mesh-bin.d.ts.map +1 -0
  145. package/dist/loaders/pack-artifact.d.ts +20 -0
  146. package/dist/loaders/pack-artifact.d.ts.map +1 -0
  147. package/dist/material/dependency-graph.d.ts +9 -0
  148. package/dist/material/dependency-graph.d.ts.map +1 -0
  149. package/dist/material/generation-cache.d.ts +24 -0
  150. package/dist/material/generation-cache.d.ts.map +1 -0
  151. package/dist/material/inspection.d.ts +24 -0
  152. package/dist/material/inspection.d.ts.map +1 -0
  153. package/dist/material/loader.d.ts +59 -0
  154. package/dist/material/loader.d.ts.map +1 -0
  155. package/dist/material/runtime-shader.d.ts +14 -0
  156. package/dist/material/runtime-shader.d.ts.map +1 -0
  157. package/dist/mesh-bin.d.ts +3 -0
  158. package/dist/mesh-bin.d.ts.map +1 -0
  159. package/dist/mipmap-generator.d.ts +132 -0
  160. package/dist/mipmap-generator.d.ts.map +1 -0
  161. package/dist/payload-validate.d.ts +60 -0
  162. package/dist/payload-validate.d.ts.map +1 -0
  163. package/dist/plugin.d.ts +16 -0
  164. package/dist/plugin.d.ts.map +1 -0
  165. package/dist/registry/artifact-io.d.ts +16 -0
  166. package/dist/registry/artifact-io.d.ts.map +1 -0
  167. package/dist/registry/asset-evidence.d.ts +13 -0
  168. package/dist/registry/asset-evidence.d.ts.map +1 -0
  169. package/dist/registry/catalog-state.d.ts +47 -0
  170. package/dist/registry/catalog-state.d.ts.map +1 -0
  171. package/dist/registry/catalog.d.ts +48 -0
  172. package/dist/registry/catalog.d.ts.map +1 -0
  173. package/dist/registry/instantiate.d.ts +153 -0
  174. package/dist/registry/instantiate.d.ts.map +1 -0
  175. package/dist/registry/load-by-guid.d.ts +247 -0
  176. package/dist/registry/load-by-guid.d.ts.map +1 -0
  177. package/dist/registry/load-state.d.ts +26 -0
  178. package/dist/registry/load-state.d.ts.map +1 -0
  179. package/dist/registry/runtime-projection.d.ts +16 -0
  180. package/dist/registry/runtime-projection.d.ts.map +1 -0
  181. package/dist/registry/scene-publication-fence.d.ts +38 -0
  182. package/dist/registry/scene-publication-fence.d.ts.map +1 -0
  183. package/dist/registry/validate-material.d.ts +77 -0
  184. package/dist/registry/validate-material.d.ts.map +1 -0
  185. package/dist/resolve-asset-handle.d.ts +43 -0
  186. package/dist/resolve-asset-handle.d.ts.map +1 -0
  187. package/dist/resolve-tileset-runtime.d.ts +23 -0
  188. package/dist/resolve-tileset-runtime.d.ts.map +1 -0
  189. package/dist/scene-handle-fields.d.ts +88 -0
  190. package/dist/scene-handle-fields.d.ts.map +1 -0
  191. package/dist/scene-payload.d.ts +15 -0
  192. package/dist/scene-payload.d.ts.map +1 -0
  193. package/dist/wire-default-loaders.d.ts +29 -0
  194. package/dist/wire-default-loaders.d.ts.map +1 -0
  195. package/package.json +22 -9
  196. package/src/__tests__/aabb.unit.test.ts +97 -0
  197. package/src/__tests__/artifact-integrity.unit.test.ts +99 -0
  198. package/src/__tests__/artifact-io.unit.test.ts +127 -0
  199. package/src/__tests__/asset-evidence-sdk.integration.test.ts +32 -0
  200. package/src/__tests__/asset-evidence.unit.test.ts +32 -0
  201. package/src/__tests__/{asset-kind.test.ts → asset-kind.unit.test.ts} +1 -1
  202. package/src/__tests__/asset-registry-catalog-reconcile.integration.test.ts +74 -0
  203. package/src/__tests__/asset-registry-catalog-reconcile.unit.test.ts +89 -0
  204. package/src/__tests__/asset-registry-catalog.unit.test.ts +170 -0
  205. package/src/__tests__/asset-registry.pack-cache.test.ts +96 -0
  206. package/src/__tests__/asset-registry.unit.test.ts +511 -0
  207. package/src/__tests__/asset-runtime-error-code-owner.test-d.ts +63 -0
  208. package/src/__tests__/catalog-replica.unit.test.ts +196 -0
  209. package/src/__tests__/catalog-source-v2.unit.test.ts +158 -0
  210. package/src/__tests__/catalog-source.unit.test.ts +126 -0
  211. package/src/__tests__/catalog-subscription-order.unit.test.ts +65 -0
  212. package/src/__tests__/catalog-subscription.unit.test.ts +28 -0
  213. package/src/__tests__/decode-image-bytes-pass-through.test.ts +34 -0
  214. package/src/__tests__/decode-image-bytes.browser.test.ts +102 -0
  215. package/src/__tests__/decode-image-bytes.test-d.ts +108 -0
  216. package/src/__tests__/decode-image-bytes.test.ts +90 -0
  217. package/src/__tests__/decode-image-mime-owner.test.ts +2 -5
  218. package/src/__tests__/dynamic-texture-store.unit.test.ts +115 -0
  219. package/src/__tests__/errors-asset.unit.test.ts +92 -0
  220. package/src/__tests__/inline-pack-loaders.unit.test.ts +548 -0
  221. package/src/__tests__/instantiate-context.unit.test.ts +65 -0
  222. package/src/__tests__/instantiate-publication-fence.unit.test.ts +158 -0
  223. package/src/__tests__/instantiate.unit.test.ts +684 -0
  224. package/src/__tests__/loader-input-contract.unit.test.ts +89 -0
  225. package/src/__tests__/loader-registry.unit.test.ts +101 -0
  226. package/src/__tests__/material-dependency-invalidation.unit.test.ts +14 -0
  227. package/src/__tests__/material-generation-cache.unit.test.ts +46 -0
  228. package/src/__tests__/material-load-consumer.test-d.ts +42 -0
  229. package/src/__tests__/material-ready.integration.test.ts +492 -0
  230. package/src/__tests__/material-stale-generation.unit.test.ts +152 -0
  231. package/src/__tests__/mesh-bin-morph-v3.test.ts +22 -0
  232. package/src/__tests__/mesh-bin.unit.test.ts +152 -0
  233. package/src/__tests__/mipmap-generator.unit.test.ts +202 -0
  234. package/src/__tests__/pack-artifact-transcode-model-owner.test.ts +32 -0
  235. package/src/__tests__/pack-basis-load.integration.test.ts +168 -0
  236. package/src/__tests__/payload-validate.unit.test.ts +285 -0
  237. package/src/__tests__/plugin.test.ts +55 -0
  238. package/src/__tests__/registry-concurrency.bench.test.ts +40 -0
  239. package/src/__tests__/registry-failure-retry.integration.test.ts +69 -0
  240. package/src/__tests__/registry-load-graph.integration.test.ts +246 -0
  241. package/src/__tests__/registry-load-state.unit.test.ts +35 -0
  242. package/src/__tests__/registry-package-cache.unit.test.ts +53 -0
  243. package/src/__tests__/registry-public-ready.unit.test.ts +38 -0
  244. package/src/__tests__/resolve-asset-handle.unit.test.ts +238 -0
  245. package/src/__tests__/scene-handle-fields.unit.test.ts +129 -0
  246. package/src/__tests__/scene-payload.unit.test.ts +151 -0
  247. package/src/__tests__/scene-publication-fence.test.ts +129 -0
  248. package/src/__tests__/scriptable-pack-public-surface.test-d.ts +16 -0
  249. package/src/__tests__/static-rig.integration.test.ts +8 -0
  250. package/src/__tests__/validate-material.unit.test.ts +359 -0
  251. package/src/__tests__/video-pack-loader.integration.test.ts +83 -0
  252. package/src/aabb.ts +107 -0
  253. package/src/asset-registry.ts +2040 -0
  254. package/src/builtin-asset-registry.ts +164 -0
  255. package/src/catalog-source.ts +14 -70
  256. package/src/decode-image-bytes.ts +126 -0
  257. package/src/dynamic-texture-store.ts +234 -0
  258. package/src/errors/asset.ts +347 -0
  259. package/src/handles.ts +180 -0
  260. package/src/image-error.ts +45 -0
  261. package/src/index.ts +177 -19
  262. package/src/internal.ts +2 -0
  263. package/src/loader-registry.ts +157 -0
  264. package/src/loaders/inline-pack.ts +837 -0
  265. package/src/loaders/mesh-bin.ts +304 -0
  266. package/src/loaders/pack-artifact.ts +665 -0
  267. package/src/material/dependency-graph.ts +46 -0
  268. package/src/material/generation-cache.ts +177 -0
  269. package/src/material/inspection.ts +46 -0
  270. package/src/material/loader.ts +326 -0
  271. package/src/material/runtime-shader.ts +133 -0
  272. package/src/mesh-bin.ts +5 -0
  273. package/src/mipmap-generator.ts +450 -0
  274. package/src/payload-validate.ts +573 -0
  275. package/src/plugin.ts +48 -0
  276. package/src/registry/artifact-io.ts +259 -0
  277. package/src/registry/asset-evidence.ts +51 -0
  278. package/src/registry/catalog-state.ts +409 -0
  279. package/src/registry/catalog.ts +369 -0
  280. package/src/registry/instantiate.ts +1056 -0
  281. package/src/registry/load-by-guid.ts +1657 -0
  282. package/src/registry/load-state.ts +115 -0
  283. package/src/registry/runtime-projection.ts +63 -0
  284. package/src/registry/scene-publication-fence.ts +256 -0
  285. package/src/registry/validate-material.ts +386 -0
  286. package/src/resolve-asset-handle.ts +147 -0
  287. package/src/resolve-tileset-runtime.ts +72 -0
  288. package/src/scene-handle-fields.ts +221 -0
  289. package/src/scene-payload.ts +207 -0
  290. package/src/wire-default-loaders.ts +79 -0
  291. package/dist/__tests__/asset-graph-red.integration.test.d.ts +0 -2
  292. package/dist/__tests__/asset-graph-red.integration.test.d.ts.map +0 -1
  293. package/dist/__tests__/asset-kind.test.d.ts +0 -2
  294. package/dist/__tests__/asset-kind.test.d.ts.map +0 -1
  295. package/dist/__tests__/asset-registry-core.integration.test.d.ts +0 -2
  296. package/dist/__tests__/asset-registry-core.integration.test.d.ts.map +0 -1
  297. package/dist/__tests__/asset-registry-public-api.test-d.d.ts +0 -2
  298. package/dist/__tests__/asset-registry-public-api.test-d.d.ts.map +0 -1
  299. package/dist/__tests__/asset-runtime-core-lifecycle.integration.test.d.ts +0 -2
  300. package/dist/__tests__/asset-runtime-core-lifecycle.integration.test.d.ts.map +0 -1
  301. package/dist/__tests__/asset-runtime-snapshot.unit.test.d.ts +0 -2
  302. package/dist/__tests__/asset-runtime-snapshot.unit.test.d.ts.map +0 -1
  303. package/dist/__tests__/catalog-session-red.unit.test.d.ts +0 -2
  304. package/dist/__tests__/catalog-session-red.unit.test.d.ts.map +0 -1
  305. package/dist/__tests__/registry-lifecycle-red.integration.test.d.ts +0 -2
  306. package/dist/__tests__/registry-lifecycle-red.integration.test.d.ts.map +0 -1
  307. package/src/__tests__/asset-graph-red.integration.test.ts +0 -113
  308. package/src/__tests__/asset-registry-core.integration.test.ts +0 -161
  309. package/src/__tests__/asset-registry-public-api.test-d.ts +0 -31
  310. package/src/__tests__/asset-runtime-core-lifecycle.integration.test.ts +0 -79
  311. package/src/__tests__/asset-runtime-snapshot.unit.test.ts +0 -23
  312. package/src/__tests__/catalog-session-red.unit.test.ts +0 -276
  313. package/src/__tests__/registry-lifecycle-red.integration.test.ts +0 -80
@@ -1,2 +1,3 @@
1
- export { type AssetRegistryResolver, getAssetRegistryResolver, } from './internal/load-asset.js';
1
+ export { CatalogSession } from './internal/catalog-session.js';
2
+ export { type AssetRegistry, type AssetRegistryResolver, getAssetRegistryResolver, } from './internal/load-asset.js';
2
3
  //# sourceMappingURL=internal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAC1B,wBAAwB,GACzB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,wBAAwB,GACzB,MAAM,0BAA0B,CAAC"}
package/dist/internal.mjs CHANGED
@@ -1,6 +1,320 @@
1
- import '@forgeax/engine-types';
1
+ import { err, ok } from '@forgeax/engine-types';
2
2
 
3
- // src/internal/load-asset.ts
3
+ // src/internal/catalog-session.ts
4
+ function invalidRow(guid, reason) {
5
+ return err({
6
+ code: "asset-package-invalid",
7
+ expected: "one complete current runtime Catalog row",
8
+ hint: "rebuild the producer Catalog and publish one Pack v2 tuple",
9
+ detail: { guid, reason }
10
+ });
11
+ }
12
+ function validateRuntimeRow(row) {
13
+ if (row === null || typeof row !== "object") return invalidRow("", "row");
14
+ const candidate = row;
15
+ const guid = typeof candidate.guid === "string" ? candidate.guid : "";
16
+ if (guid.trim().length === 0) return invalidRow(guid, "guid");
17
+ if (typeof candidate.kind !== "string" || candidate.kind.trim().length === 0)
18
+ return invalidRow(guid, "kind");
19
+ if (typeof candidate.packageUrl !== "string" || candidate.packageUrl.trim().length === 0)
20
+ return invalidRow(guid, "packageUrl");
21
+ if (typeof candidate.sourcePath !== "string" || candidate.sourcePath.trim().length === 0)
22
+ return invalidRow(guid, "sourcePath");
23
+ if (!Number.isSafeInteger(candidate.publication?.generation))
24
+ return invalidRow(guid, "publication generation");
25
+ if (candidate.publication === void 0) return invalidRow(guid, "publication");
26
+ const publication = candidate.publication;
27
+ if (publication.schemaVersion !== "asset-publication/1" || typeof publication.sourcePath !== "string" || publication.sourcePath.trim().length === 0 || typeof publication.sourceRevision !== "string" || publication.sourceRevision.trim().length === 0 || publication.generation < 0 || typeof publication.digest !== "string" || publication.digest.trim().length === 0 || typeof publication.outputSetDigest !== "string" || publication.outputSetDigest.trim().length === 0 || !Array.isArray(publication.outputs) || publication.receipt === null || typeof publication.receipt !== "object" || !Array.isArray(publication.externalEvidence)) {
28
+ return invalidRow(guid, "publication tuple");
29
+ }
30
+ return ok(Object.freeze({ ...candidate, guid, publication }));
31
+ }
32
+
33
+ // src/internal/catalog-session.ts
34
+ function runtimeError(code, guid, detail) {
35
+ if (code === "catalog-discontinuous") {
36
+ return {
37
+ code,
38
+ expected: "an ordered catalog revision window",
39
+ hint: "reconcile the current Catalog before consuming this delta",
40
+ detail: {
41
+ scopeId: String(detail.scopeId ?? "unknown"),
42
+ expectedGeneration: Number(detail.expectedGeneration ?? 0),
43
+ actualGeneration: Number(detail.actualGeneration ?? 0)
44
+ }
45
+ };
46
+ }
47
+ return {
48
+ code: "asset-package-invalid",
49
+ expected: "a verified Catalog source",
50
+ hint: "repair the producer Catalog and retry with the current publication",
51
+ detail: { guid, reason: String(detail.reason ?? "catalog source failed") }
52
+ };
53
+ }
54
+ function freezeSnapshot(snapshot) {
55
+ return Object.freeze({
56
+ ...snapshot,
57
+ entries: Object.freeze([...snapshot.entries]),
58
+ changed: Object.freeze([...snapshot.changed]),
59
+ removed: Object.freeze([...snapshot.removed]),
60
+ diagnostics: Object.freeze([...snapshot.diagnostics])
61
+ });
62
+ }
63
+ function sameEntry(left, right) {
64
+ return JSON.stringify(left) === JSON.stringify(right);
65
+ }
66
+ function key(guid) {
67
+ return guid.toLowerCase();
68
+ }
69
+ var CatalogSession = class {
70
+ source;
71
+ scopeId;
72
+ generation;
73
+ entries = /* @__PURE__ */ new Map();
74
+ listeners = /* @__PURE__ */ new Set();
75
+ unsubscribe;
76
+ baselinePromise;
77
+ reconcilePromise;
78
+ pending = [];
79
+ currentSnapshot;
80
+ revision;
81
+ diagnostics = [];
82
+ listenerFailures = 0;
83
+ changed = /* @__PURE__ */ new Set();
84
+ removed = /* @__PURE__ */ new Set();
85
+ epoch = 0;
86
+ stale = false;
87
+ staleGeneration = 0;
88
+ started = false;
89
+ disposed = false;
90
+ constructor(source, options = {}) {
91
+ this.source = source;
92
+ this.scopeId = options.scopeId ?? source.expectedScope?.scopeId ?? "asset-runtime";
93
+ this.generation = options.generation ?? source.expectedScope?.generation ?? 0;
94
+ this.currentSnapshot = freezeSnapshot({
95
+ scopeId: this.scopeId,
96
+ generation: this.generation,
97
+ epoch: 0,
98
+ entries: [],
99
+ changed: [],
100
+ removed: [],
101
+ diagnostics: [],
102
+ listenerFailures: 0,
103
+ stale: false
104
+ });
105
+ }
106
+ start() {
107
+ if (this.baselinePromise !== void 0) return this.baselinePromise;
108
+ if (this.disposed) return Promise.resolve(err(this.disposedError()));
109
+ this.unsubscribe = this.source.subscribe((delta) => this.receive(delta));
110
+ const promise = this.source.enumerate().then((result) => {
111
+ if (!result.ok) {
112
+ this.markStale();
113
+ this.publish();
114
+ return err(runtimeError("asset-package-invalid", "", { reason: result.error.code }));
115
+ }
116
+ this.entries.clear();
117
+ for (const entry of result.value) {
118
+ const validated = validateRuntimeRow(entry);
119
+ if (!validated.ok) {
120
+ this.markStale();
121
+ this.publish();
122
+ return err(validated.error);
123
+ }
124
+ this.entries.set(key(validated.value.guid), validated.value);
125
+ }
126
+ this.started = true;
127
+ this.stale = false;
128
+ this.staleGeneration = this.generation;
129
+ this.diagnostics = [];
130
+ for (const delta of this.pending) this.fold(delta, false);
131
+ this.pending = [];
132
+ this.publish();
133
+ return ok(this.currentSnapshot);
134
+ }).catch((cause) => {
135
+ this.markStale();
136
+ this.addDiagnostic("catalog-degraded-rows", "Catalog enumeration must resolve a Result");
137
+ this.publish();
138
+ return err(
139
+ runtimeError("asset-package-invalid", "", {
140
+ reason: cause instanceof Error ? cause.message : String(cause)
141
+ })
142
+ );
143
+ });
144
+ this.baselinePromise = promise;
145
+ void promise.then(
146
+ (result) => {
147
+ if (!result.ok) this.baselinePromise = void 0;
148
+ },
149
+ () => {
150
+ this.baselinePromise = void 0;
151
+ }
152
+ );
153
+ return promise;
154
+ }
155
+ reconcile() {
156
+ if (this.disposed) return Promise.resolve(err(this.disposedError()));
157
+ if (this.reconcilePromise !== void 0) return this.reconcilePromise;
158
+ this.unsubscribe?.();
159
+ this.unsubscribe = void 0;
160
+ this.started = false;
161
+ this.pending = [];
162
+ this.baselinePromise = void 0;
163
+ this.epoch += 1;
164
+ const promise = this.start();
165
+ this.reconcilePromise = promise;
166
+ void promise.then(
167
+ () => {
168
+ if (this.reconcilePromise === promise) this.reconcilePromise = void 0;
169
+ },
170
+ () => {
171
+ if (this.reconcilePromise === promise) this.reconcilePromise = void 0;
172
+ }
173
+ );
174
+ return promise;
175
+ }
176
+ current(guid) {
177
+ return this.entries.get(key(guid));
178
+ }
179
+ snapshot() {
180
+ return this.currentSnapshot;
181
+ }
182
+ discontinuity() {
183
+ if (!this.stale) return void 0;
184
+ return {
185
+ code: "catalog-discontinuous",
186
+ expected: "an ordered, authoritative catalog revision window",
187
+ hint: "reconcile the Catalog source and retry the current publication",
188
+ detail: {
189
+ scopeId: this.scopeId,
190
+ expectedGeneration: this.generation,
191
+ actualGeneration: this.staleGeneration
192
+ }
193
+ };
194
+ }
195
+ subscribe(listener) {
196
+ this.listeners.add(listener);
197
+ return () => this.listeners.delete(listener);
198
+ }
199
+ dispose() {
200
+ if (this.disposed) return;
201
+ this.disposed = true;
202
+ this.unsubscribe?.();
203
+ this.unsubscribe = void 0;
204
+ this.pending = [];
205
+ this.listeners.clear();
206
+ }
207
+ receive(delta) {
208
+ if (this.disposed) return;
209
+ if (!this.started) {
210
+ this.pending.push(delta);
211
+ return;
212
+ }
213
+ this.fold(delta, true);
214
+ }
215
+ fold(delta, publish) {
216
+ if (delta.scopeId !== void 0 && delta.scopeId !== this.scopeId || delta.generation !== void 0 && delta.generation !== this.generation) {
217
+ this.markStale(delta.generation);
218
+ this.addDiagnostic("catalog-scope-mismatch", "delta scope does not match the session");
219
+ if (publish) this.publish();
220
+ return;
221
+ }
222
+ if (delta.authority === "degraded") {
223
+ this.markStale(delta.generation);
224
+ this.addDiagnostic("catalog-degraded-rows", "degraded rows are not identity-bearing");
225
+ if (publish) this.publish();
226
+ return;
227
+ }
228
+ if (delta.revisions !== void 0) {
229
+ const baseline = delta.revisions.baseline;
230
+ const current = delta.revisions.current;
231
+ const valid = baseline.length === current.length && current.every((point) => {
232
+ const prior = baseline.find((item) => item.rootId === point.rootId);
233
+ return prior !== void 0 && point.revision === prior.revision + 1;
234
+ });
235
+ if (!valid) {
236
+ this.markStale(delta.generation);
237
+ this.addDiagnostic("catalog-gap", "delta revision window is not contiguous");
238
+ if (publish) this.publish();
239
+ return;
240
+ }
241
+ }
242
+ let changed = false;
243
+ for (const entry of [...delta.added, ...delta.changed]) {
244
+ const validated = validateRuntimeRow(entry);
245
+ if (!validated.ok) {
246
+ this.markStale(delta.generation);
247
+ this.addDiagnostic("catalog-degraded-rows", "delta contains an invalid runtime row");
248
+ if (publish) this.publish();
249
+ return;
250
+ }
251
+ const entryKey = key(validated.value.guid);
252
+ const prior = this.entries.get(entryKey);
253
+ if (prior === void 0 || !sameEntry(prior, validated.value)) {
254
+ this.entries.set(entryKey, validated.value);
255
+ this.changed.add(entryKey);
256
+ changed = true;
257
+ if (validated.value.revision !== void 0) this.revision = validated.value.revision;
258
+ }
259
+ }
260
+ for (const guid of delta.removed) {
261
+ const entryKey = key(guid);
262
+ if (this.entries.delete(entryKey)) {
263
+ this.removed.add(entryKey);
264
+ changed = true;
265
+ }
266
+ }
267
+ if (changed) this.epoch += 1;
268
+ if (publish) this.publish();
269
+ }
270
+ addDiagnostic(code, expected) {
271
+ if (this.diagnostics.some((diagnostic) => diagnostic.code === code)) return;
272
+ this.diagnostics.push({
273
+ code,
274
+ severity: "blocking",
275
+ expected,
276
+ hint: "reconcile the Catalog before loading the affected publication",
277
+ authority: "catalog"
278
+ });
279
+ }
280
+ markStale(actualGeneration = this.generation) {
281
+ this.stale = true;
282
+ this.staleGeneration = actualGeneration;
283
+ this.epoch += 1;
284
+ }
285
+ publish() {
286
+ this.currentSnapshot = freezeSnapshot({
287
+ scopeId: this.scopeId,
288
+ generation: this.generation,
289
+ epoch: this.epoch,
290
+ ...this.revision === void 0 ? {} : { revision: this.revision },
291
+ entries: [...this.entries.values()].sort(
292
+ (left, right) => key(left.guid).localeCompare(key(right.guid))
293
+ ),
294
+ changed: [...this.changed].sort(),
295
+ removed: [...this.removed].sort(),
296
+ diagnostics: this.diagnostics,
297
+ listenerFailures: this.listenerFailures,
298
+ stale: this.stale
299
+ });
300
+ this.changed.clear();
301
+ this.removed.clear();
302
+ for (const listener of [...this.listeners]) {
303
+ try {
304
+ listener(this.currentSnapshot);
305
+ } catch {
306
+ this.listenerFailures = Math.min(1024, this.listenerFailures + 1);
307
+ this.currentSnapshot = freezeSnapshot({
308
+ ...this.currentSnapshot,
309
+ listenerFailures: this.listenerFailures
310
+ });
311
+ }
312
+ }
313
+ }
314
+ disposedError() {
315
+ return runtimeError("asset-runtime-disposed", "", { scopeId: this.scopeId });
316
+ }
317
+ };
4
318
  var REGISTRY_RESOLVER = /* @__PURE__ */ Symbol.for("forgeax.assets-runtime.registry-resolver");
5
319
  function getAssetRegistryResolver(registry) {
6
320
  const resolver = registry[REGISTRY_RESOLVER];
@@ -10,6 +324,6 @@ function getAssetRegistryResolver(registry) {
10
324
  return resolver;
11
325
  }
12
326
 
13
- export { getAssetRegistryResolver };
327
+ export { CatalogSession, getAssetRegistryResolver };
14
328
  //# sourceMappingURL=internal.mjs.map
15
329
  //# sourceMappingURL=internal.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/load-asset.ts"],"names":[],"mappings":";;;AA+DA,IAAM,iBAAA,mBAAoB,MAAA,CAAO,GAAA,CAAI,0CAA0C,CAAA;AAKxE,SAAS,yBAAyB,QAAA,EAAgD;AACvF,EAAA,MAAM,QAAA,GAAY,SAAkC,iBAAiB,CAAA;AACrE,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,MAAM,IAAI,UAAU,2DAA2D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,QAAA;AACT","file":"internal.mjs","sourcesContent":["import type {\n Asset,\n AssetArtifactReader,\n AssetDecoder,\n AssetDecoderInput,\n AssetDecoderLease,\n AssetKind,\n AssetLoadError,\n BuiltinAssetKind,\n BuiltinAssetPayload,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport type { CatalogSource } from '../catalog-source.js';\nimport { ArtifactCache } from './artifact-cache.js';\nimport { AssetGraph, type AssetGraphSnapshot } from './asset-graph.js';\nimport { CatalogSession, type CatalogSessionOptions } from './catalog-session.js';\nimport { DecoderRegistry } from './decoder-registry.js';\nimport { freezeRuntimePayload } from './immutable-payload.js';\nimport { PackReader } from './pack-reader.js';\nimport { validateRuntimeRow } from './validate-runtime-row.js';\n\nexport interface AssetRegistryOptions extends CatalogSessionOptions {\n readonly catalog: CatalogSource;\n readonly fetcher?: typeof globalThis.fetch;\n readonly maxConcurrentReads?: number;\n}\n\nexport interface AssetLoadOptions {\n readonly signal?: AbortSignal;\n}\n\nexport type AssetRegistrySnapshot = AssetGraphSnapshot;\n\nexport type AssetRegistrySnapshotCounters = AssetRegistrySnapshot['counters'];\n\nexport interface AssetRegistry {\n installDecoder<P, K extends string>(\n kind: AssetKind<P, K>,\n decoder: AssetDecoder<P>,\n ): AssetDecoderLease;\n load<K extends BuiltinAssetKind>(\n guid: string,\n kind: K,\n options?: AssetLoadOptions,\n ): Promise<Result<BuiltinAssetPayload<K>, AssetLoadError>>;\n load<P, K extends string>(\n guid: string,\n kind: AssetKind<P, K>,\n options?: AssetLoadOptions,\n ): Promise<Result<P, AssetLoadError>>;\n snapshot(): AssetRegistrySnapshot;\n subscribe(listener: (snapshot: AssetRegistrySnapshot) => void): () => void;\n dispose(): void;\n}\n\n/** Internal render projection; the root Registry keeps only its five actions. */\nexport interface AssetRegistryResolver {\n readonly epoch: number;\n lookup<T extends Asset>(guid: string): T | undefined;\n guidOf(asset: Asset): string | undefined;\n}\n\nconst REGISTRY_RESOLVER = Symbol.for('forgeax.assets-runtime.registry-resolver');\ntype RegistryWithResolver = AssetRegistry & {\n [REGISTRY_RESOLVER]?: AssetRegistryResolver;\n};\n\nexport function getAssetRegistryResolver(registry: AssetRegistry): AssetRegistryResolver {\n const resolver = (registry as RegistryWithResolver)[REGISTRY_RESOLVER];\n if (resolver === undefined) {\n throw new TypeError('AssetRegistry resolver is not owned by this asset runtime');\n }\n return resolver;\n}\n\nfunction missing(guid: string): AssetLoadError {\n return {\n code: 'asset-not-found',\n expected: `the current Catalog to contain GUID \"${guid}\"`,\n hint: 'inspect the producer Catalog and rebuild the missing publication',\n detail: { guid },\n };\n}\n\nfunction mismatch(guid: string, expectedKind: string, actualKind: string): AssetLoadError {\n return {\n code: 'asset-kind-mismatch',\n expected: `Catalog kind \"${actualKind}\" to match \"${expectedKind}\"`,\n hint: 'pass the Catalog kind or the matching custom AssetKind token',\n detail: { guid, expectedKind, actualKind },\n };\n}\n\nfunction artifactError(guid: string, reason: string): AssetLoadError {\n return {\n code: 'asset-integrity-failed',\n expected: 'the verified artifact byte length and digest',\n hint: 'verify the artifact digest and recook the Pack',\n detail: {\n guid,\n artifactKey: reason,\n expectedDigest: 'descriptor integrity',\n actualDigest: reason,\n },\n };\n}\n\nconst ASSET_GUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction invalidGuid(guid: string): AssetLoadError {\n return {\n code: 'asset-guid-invalid',\n expected: 'a 36-character dash-form asset GUID',\n hint: 'pass the producer GUID from the current Catalog row',\n detail: { guid },\n };\n}\n\nexport function createAssetRegistry(options: AssetRegistryOptions): AssetRegistry {\n const session = new CatalogSession(options.catalog, options);\n const reader = new PackReader(options.fetcher === undefined ? {} : { fetcher: options.fetcher });\n const cache = new ArtifactCache();\n const decoders = new DecoderRegistry(\n options.scopeId === undefined ? {} : { scopeId: options.scopeId },\n );\n const graph = new AssetGraph<{ readonly value: unknown; readonly refs: readonly string[] }>({\n ...(options.maxConcurrentReads === undefined\n ? {}\n : { maxConcurrentReads: options.maxConcurrentReads }),\n read: async (guid, signal) => {\n const row = session.current(guid);\n if (row === undefined) return err(missing(guid));\n const validated = validateRuntimeRow(row);\n if (!validated.ok) return validated;\n const publication = validated.value.publication;\n const tuple = {\n scopeId: session.snapshot().scopeId,\n generation: publication.generation,\n digest: publication.digest,\n outputSetDigest: publication.outputSetDigest,\n };\n const pack = await reader.read(row.packageUrl, tuple, signal);\n if (!pack.ok) return pack;\n const envelope = pack.value.assets.find(\n (asset) => asset.guid.toLowerCase() === guid.toLowerCase(),\n );\n if (envelope === undefined) return err(missing(guid));\n const artifacts: AssetArtifactReader = {\n read: (descriptor) => {\n const integrity = descriptor.integrity;\n if (integrity === undefined)\n return Promise.resolve(err(artifactError(guid, descriptor.path)));\n const key = `${tuple.scopeId}:${tuple.generation}:${tuple.outputSetDigest}:${integrity.digest}`;\n return cache.read(key, async () => {\n const url = resolveArtifactUrl(row.packageUrl, descriptor.path);\n let response: Response;\n try {\n response = await (options.fetcher ?? globalThis.fetch)(url, { signal });\n } catch {\n return err(artifactError(guid, descriptor.path));\n }\n if (!response.ok) return err(artifactError(guid, descriptor.path));\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (descriptor.byteLength === undefined || bytes.byteLength !== descriptor.byteLength) {\n return err(artifactError(guid, descriptor.path));\n }\n const actualDigest = await sha256(bytes);\n if (actualDigest !== descriptor.integrity?.digest.toLowerCase()) {\n return err(artifactError(guid, `${descriptor.path}:${actualDigest}`));\n }\n return ok(bytes);\n });\n },\n };\n const input: AssetDecoderInput<unknown> = { envelope, artifacts, signal };\n const decoded = await decoders.loadByKind(envelope.kind, input);\n if (!decoded.ok) return decoded;\n return ok({ value: freezeRuntimePayload(decoded.value), refs: envelope.refs });\n },\n });\n\n let catalogEpoch = session.snapshot().epoch;\n const unsubscribeCatalog = session.subscribe((snapshot) => {\n if (snapshot.epoch === catalogEpoch) return;\n catalogEpoch = snapshot.epoch;\n graph.invalidateForCatalogChange(\n snapshot.stale ? undefined : [...snapshot.changed, ...snapshot.removed],\n );\n });\n\n const registry: AssetRegistry = {\n installDecoder: (kind, decoder) => decoders.install(kind, decoder),\n load: (async (\n guid: string,\n kind: BuiltinAssetKind | AssetKind<unknown, string>,\n loadOptions: AssetLoadOptions = {},\n ): Promise<Result<unknown, AssetLoadError>> => {\n if (!ASSET_GUID_PATTERN.test(guid)) return err(invalidGuid(guid));\n const expectedKind = typeof kind === 'string' ? kind : kind.kind;\n const started = await session.start();\n if (!started.ok) return err(started.error);\n if (session.snapshot().stale) {\n const reconciled = await session.reconcile();\n if (!reconciled.ok) return err(reconciled.error);\n const discontinuity = session.discontinuity();\n if (discontinuity !== undefined) return err(discontinuity);\n }\n const row = session.current(guid);\n if (row === undefined) return err(missing(guid));\n if (row.kind !== expectedKind) return err(mismatch(guid, expectedKind, row.kind));\n const result = await graph.load(guid, loadOptions.signal);\n return result.ok ? ok(result.value.value) : result;\n }) as AssetRegistry['load'],\n snapshot: () => graph.snapshot(),\n subscribe: (listener) => graph.subscribe(listener),\n dispose: () => {\n graph.dispose();\n unsubscribeCatalog();\n decoders.dispose();\n cache.clear();\n session.dispose();\n },\n };\n const resolver: AssetRegistryResolver = {\n get epoch() {\n return graph.snapshot().epoch;\n },\n lookup: <T extends Asset>(guid: string) => graph.lookup(guid) as T | undefined,\n guidOf: (asset: Asset) => graph.guidOf(asset),\n };\n Object.defineProperty(registry, REGISTRY_RESOLVER, {\n value: resolver,\n enumerable: false,\n });\n return registry;\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes as unknown as BufferSource);\n return `sha256:${Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('')}`;\n}\n\nfunction resolveArtifactUrl(packageUrl: string, path: string): string {\n const separator = packageUrl.lastIndexOf('/');\n const packageDirectory = separator < 0 ? '' : packageUrl.slice(0, separator + 1);\n try {\n return new URL(path, packageDirectory).toString();\n } catch {\n return `${packageDirectory}${path.replace(/^\\//, '')}`;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/validate-runtime-row.ts","../src/internal/catalog-session.ts","../src/internal/load-asset.ts"],"names":["err","ok"],"mappings":"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","file":"internal.mjs","sourcesContent":["import type { CatalogEntry } from '@forgeax/engine-types';\nimport { type AssetLoadError, err, ok, type Result } from '@forgeax/engine-types';\n\nexport interface RuntimeCatalogRow extends CatalogEntry {\n readonly publication: NonNullable<CatalogEntry['publication']>;\n}\n\nfunction invalidRow(guid: string, reason: string): Result<never, AssetLoadError> {\n return err({\n code: 'asset-package-invalid',\n expected: 'one complete current runtime Catalog row',\n hint: 'rebuild the producer Catalog and publish one Pack v2 tuple',\n detail: { guid, reason },\n });\n}\n\nexport function validateRuntimeRow(row: CatalogEntry): Result<RuntimeCatalogRow, AssetLoadError> {\n if (row === null || typeof row !== 'object') return invalidRow('', 'row');\n const candidate = row as Partial<CatalogEntry>;\n const guid = typeof candidate.guid === 'string' ? candidate.guid : '';\n if (guid.trim().length === 0) return invalidRow(guid, 'guid');\n if (typeof candidate.kind !== 'string' || candidate.kind.trim().length === 0)\n return invalidRow(guid, 'kind');\n if (typeof candidate.packageUrl !== 'string' || candidate.packageUrl.trim().length === 0)\n return invalidRow(guid, 'packageUrl');\n if (typeof candidate.sourcePath !== 'string' || candidate.sourcePath.trim().length === 0)\n return invalidRow(guid, 'sourcePath');\n if (!Number.isSafeInteger(candidate.publication?.generation))\n return invalidRow(guid, 'publication generation');\n if (candidate.publication === undefined) return invalidRow(guid, 'publication');\n const publication = candidate.publication;\n if (\n publication.schemaVersion !== 'asset-publication/1' ||\n typeof publication.sourcePath !== 'string' ||\n publication.sourcePath.trim().length === 0 ||\n typeof publication.sourceRevision !== 'string' ||\n publication.sourceRevision.trim().length === 0 ||\n publication.generation < 0 ||\n typeof publication.digest !== 'string' ||\n publication.digest.trim().length === 0 ||\n typeof publication.outputSetDigest !== 'string' ||\n publication.outputSetDigest.trim().length === 0 ||\n !Array.isArray(publication.outputs) ||\n publication.receipt === null ||\n typeof publication.receipt !== 'object' ||\n !Array.isArray(publication.externalEvidence)\n ) {\n return invalidRow(guid, 'publication tuple');\n }\n return ok(Object.freeze({ ...candidate, guid, publication }) as RuntimeCatalogRow);\n}\n","import type {\n CatalogDelta,\n CatalogDiagnostic,\n CatalogEntry,\n ResourceRevision,\n} from '@forgeax/engine-types';\nimport { type AssetLoadError, err, ok, type Result } from '@forgeax/engine-types';\nimport type { CatalogSource } from '../catalog-source.js';\nimport { type RuntimeCatalogRow, validateRuntimeRow } from './validate-runtime-row.js';\n\nexport interface CatalogSessionOptions {\n readonly scopeId?: string;\n readonly generation?: number;\n}\n\nexport interface CatalogSessionSnapshot {\n readonly scopeId: string;\n readonly generation: number;\n readonly epoch: number;\n readonly revision?: ResourceRevision;\n readonly entries: readonly RuntimeCatalogRow[];\n readonly changed: readonly string[];\n readonly removed: readonly string[];\n readonly diagnostics: readonly CatalogDiagnostic[];\n readonly listenerFailures: number;\n readonly stale: boolean;\n}\n\ntype SessionResult = Result<CatalogSessionSnapshot, AssetLoadError>;\ntype SessionListener = (snapshot: CatalogSessionSnapshot) => void;\n\nfunction runtimeError(\n code: AssetLoadError['code'],\n guid: string,\n detail: Record<string, unknown>,\n): AssetLoadError {\n if (code === 'catalog-discontinuous') {\n return {\n code,\n expected: 'an ordered catalog revision window',\n hint: 'reconcile the current Catalog before consuming this delta',\n detail: {\n scopeId: String(detail.scopeId ?? 'unknown'),\n expectedGeneration: Number(detail.expectedGeneration ?? 0),\n actualGeneration: Number(detail.actualGeneration ?? 0),\n },\n };\n }\n return {\n code: 'asset-package-invalid',\n expected: 'a verified Catalog source',\n hint: 'repair the producer Catalog and retry with the current publication',\n detail: { guid, reason: String(detail.reason ?? 'catalog source failed') },\n };\n}\n\nfunction freezeSnapshot(snapshot: CatalogSessionSnapshot): CatalogSessionSnapshot {\n return Object.freeze({\n ...snapshot,\n entries: Object.freeze([...snapshot.entries]),\n changed: Object.freeze([...snapshot.changed]),\n removed: Object.freeze([...snapshot.removed]),\n diagnostics: Object.freeze([...snapshot.diagnostics]),\n });\n}\n\nfunction sameEntry(left: CatalogEntry, right: CatalogEntry): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction key(guid: string): string {\n return guid.toLowerCase();\n}\n\nexport class CatalogSession {\n private readonly source: CatalogSource;\n private readonly scopeId: string;\n private readonly generation: number;\n private readonly entries = new Map<string, RuntimeCatalogRow>();\n private readonly listeners = new Set<SessionListener>();\n private unsubscribe: (() => void) | undefined;\n private baselinePromise: Promise<SessionResult> | undefined;\n private reconcilePromise: Promise<SessionResult> | undefined;\n private pending: CatalogDelta[] = [];\n private currentSnapshot: CatalogSessionSnapshot;\n private revision: ResourceRevision | undefined;\n private diagnostics: CatalogDiagnostic[] = [];\n private listenerFailures = 0;\n private changed = new Set<string>();\n private removed = new Set<string>();\n private epoch = 0;\n private stale = false;\n private staleGeneration = 0;\n private started = false;\n private disposed = false;\n\n constructor(source: CatalogSource, options: CatalogSessionOptions = {}) {\n this.source = source;\n this.scopeId = options.scopeId ?? source.expectedScope?.scopeId ?? 'asset-runtime';\n this.generation = options.generation ?? source.expectedScope?.generation ?? 0;\n this.currentSnapshot = freezeSnapshot({\n scopeId: this.scopeId,\n generation: this.generation,\n epoch: 0,\n entries: [],\n changed: [],\n removed: [],\n diagnostics: [],\n listenerFailures: 0,\n stale: false,\n });\n }\n\n start(): Promise<SessionResult> {\n if (this.baselinePromise !== undefined) return this.baselinePromise;\n if (this.disposed) return Promise.resolve(err(this.disposedError()));\n this.unsubscribe = this.source.subscribe((delta) => this.receive(delta));\n const promise = this.source\n .enumerate()\n .then((result) => {\n if (!result.ok) {\n this.markStale();\n this.publish();\n return err(runtimeError('asset-package-invalid', '', { reason: result.error.code }));\n }\n this.entries.clear();\n for (const entry of result.value) {\n const validated = validateRuntimeRow(entry);\n if (!validated.ok) {\n this.markStale();\n this.publish();\n return err(validated.error);\n }\n this.entries.set(key(validated.value.guid), validated.value);\n }\n this.started = true;\n this.stale = false;\n this.staleGeneration = this.generation;\n this.diagnostics = [];\n for (const delta of this.pending) this.fold(delta, false);\n this.pending = [];\n this.publish();\n return ok(this.currentSnapshot);\n })\n .catch((cause: unknown) => {\n this.markStale();\n this.addDiagnostic('catalog-degraded-rows', 'Catalog enumeration must resolve a Result');\n this.publish();\n return err(\n runtimeError('asset-package-invalid', '', {\n reason: cause instanceof Error ? cause.message : String(cause),\n }),\n );\n });\n this.baselinePromise = promise;\n void promise.then(\n (result) => {\n if (!result.ok) this.baselinePromise = undefined;\n },\n () => {\n this.baselinePromise = undefined;\n },\n );\n return promise;\n }\n\n reconcile(): Promise<SessionResult> {\n if (this.disposed) return Promise.resolve(err(this.disposedError()));\n if (this.reconcilePromise !== undefined) return this.reconcilePromise;\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n this.started = false;\n this.pending = [];\n this.baselinePromise = undefined;\n this.epoch += 1;\n const promise = this.start();\n this.reconcilePromise = promise;\n void promise.then(\n () => {\n if (this.reconcilePromise === promise) this.reconcilePromise = undefined;\n },\n () => {\n if (this.reconcilePromise === promise) this.reconcilePromise = undefined;\n },\n );\n return promise;\n }\n\n current(guid: string): RuntimeCatalogRow | undefined {\n return this.entries.get(key(guid));\n }\n\n snapshot(): CatalogSessionSnapshot {\n return this.currentSnapshot;\n }\n\n discontinuity(): AssetLoadError | undefined {\n if (!this.stale) return undefined;\n return {\n code: 'catalog-discontinuous',\n expected: 'an ordered, authoritative catalog revision window',\n hint: 'reconcile the Catalog source and retry the current publication',\n detail: {\n scopeId: this.scopeId,\n expectedGeneration: this.generation,\n actualGeneration: this.staleGeneration,\n },\n };\n }\n\n subscribe(listener: SessionListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.unsubscribe?.();\n this.unsubscribe = undefined;\n this.pending = [];\n this.listeners.clear();\n }\n\n private receive(delta: CatalogDelta): void {\n if (this.disposed) return;\n if (!this.started) {\n this.pending.push(delta);\n return;\n }\n this.fold(delta, true);\n }\n\n private fold(delta: CatalogDelta, publish: boolean): void {\n if (\n (delta.scopeId !== undefined && delta.scopeId !== this.scopeId) ||\n (delta.generation !== undefined && delta.generation !== this.generation)\n ) {\n this.markStale(delta.generation);\n this.addDiagnostic('catalog-scope-mismatch', 'delta scope does not match the session');\n if (publish) this.publish();\n return;\n }\n if (delta.authority === 'degraded') {\n this.markStale(delta.generation);\n this.addDiagnostic('catalog-degraded-rows', 'degraded rows are not identity-bearing');\n if (publish) this.publish();\n return;\n }\n if (delta.revisions !== undefined) {\n const baseline = delta.revisions.baseline;\n const current = delta.revisions.current;\n const valid =\n baseline.length === current.length &&\n current.every((point) => {\n const prior = baseline.find((item) => item.rootId === point.rootId);\n return prior !== undefined && point.revision === prior.revision + 1;\n });\n if (!valid) {\n this.markStale(delta.generation);\n this.addDiagnostic('catalog-gap', 'delta revision window is not contiguous');\n if (publish) this.publish();\n return;\n }\n }\n let changed = false;\n for (const entry of [...delta.added, ...delta.changed]) {\n const validated = validateRuntimeRow(entry);\n if (!validated.ok) {\n this.markStale(delta.generation);\n this.addDiagnostic('catalog-degraded-rows', 'delta contains an invalid runtime row');\n if (publish) this.publish();\n return;\n }\n const entryKey = key(validated.value.guid);\n const prior = this.entries.get(entryKey);\n if (prior === undefined || !sameEntry(prior, validated.value)) {\n this.entries.set(entryKey, validated.value);\n this.changed.add(entryKey);\n changed = true;\n if (validated.value.revision !== undefined) this.revision = validated.value.revision;\n }\n }\n for (const guid of delta.removed) {\n const entryKey = key(guid);\n if (this.entries.delete(entryKey)) {\n this.removed.add(entryKey);\n changed = true;\n }\n }\n if (changed) this.epoch += 1;\n if (publish) this.publish();\n }\n\n private addDiagnostic(code: CatalogDiagnostic['code'], expected: string): void {\n if (this.diagnostics.some((diagnostic) => diagnostic.code === code)) return;\n this.diagnostics.push({\n code,\n severity: 'blocking',\n expected,\n hint: 'reconcile the Catalog before loading the affected publication',\n authority: 'catalog',\n });\n }\n\n private markStale(actualGeneration = this.generation): void {\n this.stale = true;\n this.staleGeneration = actualGeneration;\n this.epoch += 1;\n }\n\n private publish(): void {\n this.currentSnapshot = freezeSnapshot({\n scopeId: this.scopeId,\n generation: this.generation,\n epoch: this.epoch,\n ...(this.revision === undefined ? {} : { revision: this.revision }),\n entries: [...this.entries.values()].sort((left, right) =>\n key(left.guid).localeCompare(key(right.guid)),\n ),\n changed: [...this.changed].sort(),\n removed: [...this.removed].sort(),\n diagnostics: this.diagnostics,\n listenerFailures: this.listenerFailures,\n stale: this.stale,\n });\n this.changed.clear();\n this.removed.clear();\n for (const listener of [...this.listeners]) {\n try {\n listener(this.currentSnapshot);\n } catch {\n this.listenerFailures = Math.min(1024, this.listenerFailures + 1);\n this.currentSnapshot = freezeSnapshot({\n ...this.currentSnapshot,\n listenerFailures: this.listenerFailures,\n });\n }\n }\n }\n\n private disposedError(): AssetLoadError {\n return runtimeError('asset-runtime-disposed', '', { scopeId: this.scopeId });\n }\n}\n","import type {\n Asset,\n AssetArtifactReader,\n AssetDecoder,\n AssetDecoderInput,\n AssetDecoderLease,\n AssetKind,\n AssetLoadError,\n BuiltinAssetKind,\n BuiltinAssetPayload,\n Result,\n} from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport type { CatalogSource } from '../catalog-source.js';\nimport { ArtifactCache } from './artifact-cache.js';\nimport { AssetGraph, type AssetGraphSnapshot } from './asset-graph.js';\nimport { CatalogSession, type CatalogSessionOptions } from './catalog-session.js';\nimport { DecoderRegistry } from './decoder-registry.js';\nimport { freezeRuntimePayload } from './immutable-payload.js';\nimport { PackReader } from './pack-reader.js';\nimport { validateRuntimeRow } from './validate-runtime-row.js';\n\nexport interface AssetRegistryOptions extends CatalogSessionOptions {\n readonly catalog: CatalogSource;\n readonly fetcher?: typeof globalThis.fetch;\n readonly maxConcurrentReads?: number;\n}\n\nexport interface AssetLoadOptions {\n readonly signal?: AbortSignal;\n}\n\nexport type AssetRegistrySnapshot = AssetGraphSnapshot;\n\nexport type AssetRegistrySnapshotCounters = AssetRegistrySnapshot['counters'];\n\nexport interface AssetRegistry {\n installDecoder<P, K extends string>(\n kind: AssetKind<P, K>,\n decoder: AssetDecoder<P>,\n ): AssetDecoderLease;\n load<K extends BuiltinAssetKind>(\n guid: string,\n kind: K,\n options?: AssetLoadOptions,\n ): Promise<Result<BuiltinAssetPayload<K>, AssetLoadError>>;\n load<P, K extends string>(\n guid: string,\n kind: AssetKind<P, K>,\n options?: AssetLoadOptions,\n ): Promise<Result<P, AssetLoadError>>;\n snapshot(): AssetRegistrySnapshot;\n subscribe(listener: (snapshot: AssetRegistrySnapshot) => void): () => void;\n dispose(): void;\n}\n\n/** Internal render projection; the root Registry keeps only its five actions. */\nexport interface AssetRegistryResolver {\n readonly epoch: number;\n lookup<T extends Asset>(guid: string): T | undefined;\n guidOf(asset: Asset): string | undefined;\n}\n\nconst REGISTRY_RESOLVER = Symbol.for('forgeax.assets-runtime.registry-resolver');\ntype RegistryWithResolver = AssetRegistry & {\n [REGISTRY_RESOLVER]?: AssetRegistryResolver;\n};\n\nexport function getAssetRegistryResolver(registry: AssetRegistry): AssetRegistryResolver {\n const resolver = (registry as RegistryWithResolver)[REGISTRY_RESOLVER];\n if (resolver === undefined) {\n throw new TypeError('AssetRegistry resolver is not owned by this asset runtime');\n }\n return resolver;\n}\n\nfunction missing(guid: string): AssetLoadError {\n return {\n code: 'asset-not-found',\n expected: `the current Catalog to contain GUID \"${guid}\"`,\n hint: 'inspect the producer Catalog and rebuild the missing publication',\n detail: { guid },\n };\n}\n\nfunction mismatch(guid: string, expectedKind: string, actualKind: string): AssetLoadError {\n return {\n code: 'asset-kind-mismatch',\n expected: `Catalog kind \"${actualKind}\" to match \"${expectedKind}\"`,\n hint: 'pass the Catalog kind or the matching custom AssetKind token',\n detail: { guid, expectedKind, actualKind },\n };\n}\n\nfunction artifactError(guid: string, reason: string): AssetLoadError {\n return {\n code: 'asset-integrity-failed',\n expected: 'the verified artifact byte length and digest',\n hint: 'verify the artifact digest and recook the Pack',\n detail: {\n guid,\n artifactKey: reason,\n expectedDigest: 'descriptor integrity',\n actualDigest: reason,\n },\n };\n}\n\nconst ASSET_GUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction invalidGuid(guid: string): AssetLoadError {\n return {\n code: 'asset-guid-invalid',\n expected: 'a 36-character dash-form asset GUID',\n hint: 'pass the producer GUID from the current Catalog row',\n detail: { guid },\n };\n}\n\nexport function createAssetRegistry(options: AssetRegistryOptions): AssetRegistry {\n const session = new CatalogSession(options.catalog, options);\n const reader = new PackReader(options.fetcher === undefined ? {} : { fetcher: options.fetcher });\n const cache = new ArtifactCache();\n const decoders = new DecoderRegistry(\n options.scopeId === undefined ? {} : { scopeId: options.scopeId },\n );\n const graph = new AssetGraph<{ readonly value: unknown; readonly refs: readonly string[] }>({\n ...(options.maxConcurrentReads === undefined\n ? {}\n : { maxConcurrentReads: options.maxConcurrentReads }),\n read: async (guid, signal) => {\n const row = session.current(guid);\n if (row === undefined) return err(missing(guid));\n const validated = validateRuntimeRow(row);\n if (!validated.ok) return validated;\n const publication = validated.value.publication;\n const tuple = {\n scopeId: session.snapshot().scopeId,\n generation: publication.generation,\n digest: publication.digest,\n outputSetDigest: publication.outputSetDigest,\n };\n const pack = await reader.read(row.packageUrl, tuple, signal);\n if (!pack.ok) return pack;\n const envelope = pack.value.assets.find(\n (asset) => asset.guid.toLowerCase() === guid.toLowerCase(),\n );\n if (envelope === undefined) return err(missing(guid));\n const artifacts: AssetArtifactReader = {\n read: (descriptor) => {\n const integrity = descriptor.integrity;\n if (integrity === undefined)\n return Promise.resolve(err(artifactError(guid, descriptor.path)));\n const key = `${tuple.scopeId}:${tuple.generation}:${tuple.outputSetDigest}:${integrity.digest}`;\n return cache.read(key, async () => {\n const url = resolveArtifactUrl(row.packageUrl, descriptor.path);\n let response: Response;\n try {\n response = await (options.fetcher ?? globalThis.fetch)(url, { signal });\n } catch {\n return err(artifactError(guid, descriptor.path));\n }\n if (!response.ok) return err(artifactError(guid, descriptor.path));\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (descriptor.byteLength === undefined || bytes.byteLength !== descriptor.byteLength) {\n return err(artifactError(guid, descriptor.path));\n }\n const actualDigest = await sha256(bytes);\n if (actualDigest !== descriptor.integrity?.digest.toLowerCase()) {\n return err(artifactError(guid, `${descriptor.path}:${actualDigest}`));\n }\n return ok(bytes);\n });\n },\n };\n const input: AssetDecoderInput<unknown> = { envelope, artifacts, signal };\n const decoded = await decoders.loadByKind(envelope.kind, input);\n if (!decoded.ok) return decoded;\n return ok({ value: freezeRuntimePayload(decoded.value), refs: envelope.refs });\n },\n });\n\n let catalogEpoch = session.snapshot().epoch;\n const unsubscribeCatalog = session.subscribe((snapshot) => {\n if (snapshot.epoch === catalogEpoch) return;\n catalogEpoch = snapshot.epoch;\n graph.invalidateForCatalogChange(\n snapshot.stale ? undefined : [...snapshot.changed, ...snapshot.removed],\n );\n });\n\n const registry: AssetRegistry = {\n installDecoder: (kind, decoder) => decoders.install(kind, decoder),\n load: (async (\n guid: string,\n kind: BuiltinAssetKind | AssetKind<unknown, string>,\n loadOptions: AssetLoadOptions = {},\n ): Promise<Result<unknown, AssetLoadError>> => {\n if (!ASSET_GUID_PATTERN.test(guid)) return err(invalidGuid(guid));\n const expectedKind = typeof kind === 'string' ? kind : kind.kind;\n const started = await session.start();\n if (!started.ok) return err(started.error);\n if (session.snapshot().stale) {\n const reconciled = await session.reconcile();\n if (!reconciled.ok) return err(reconciled.error);\n const discontinuity = session.discontinuity();\n if (discontinuity !== undefined) return err(discontinuity);\n }\n const row = session.current(guid);\n if (row === undefined) return err(missing(guid));\n if (row.kind !== expectedKind) return err(mismatch(guid, expectedKind, row.kind));\n const result = await graph.load(guid, loadOptions.signal);\n return result.ok ? ok(result.value.value) : result;\n }) as AssetRegistry['load'],\n snapshot: () => graph.snapshot(),\n subscribe: (listener) => graph.subscribe(listener),\n dispose: () => {\n graph.dispose();\n unsubscribeCatalog();\n decoders.dispose();\n cache.clear();\n session.dispose();\n },\n };\n const resolver: AssetRegistryResolver = {\n get epoch() {\n return graph.snapshot().epoch;\n },\n lookup: <T extends Asset>(guid: string) => graph.lookup(guid) as T | undefined,\n guidOf: (asset: Asset) => graph.guidOf(asset),\n };\n Object.defineProperty(registry, REGISTRY_RESOLVER, {\n value: resolver,\n enumerable: false,\n });\n return registry;\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes as unknown as BufferSource);\n return `sha256:${Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('')}`;\n}\n\nfunction resolveArtifactUrl(packageUrl: string, path: string): string {\n const separator = packageUrl.lastIndexOf('/');\n const packageDirectory = separator < 0 ? '' : packageUrl.slice(0, separator + 1);\n try {\n return new URL(path, packageDirectory).toString();\n } catch {\n return `${packageDirectory}${path.replace(/^\\//, '')}`;\n }\n}\n"]}
@@ -0,0 +1,63 @@
1
+ import type { ArtifactDescriptor, LoadContext, Loader } from '@forgeax/engine-types';
2
+ export interface PackArtifactInput {
3
+ readonly descriptor: ArtifactDescriptor;
4
+ readonly bytes: Uint8Array;
5
+ }
6
+ export interface PackLoaderInput {
7
+ readonly guid: string;
8
+ readonly kind: string;
9
+ readonly payload: Record<string, unknown>;
10
+ readonly refs: readonly string[];
11
+ readonly artifacts: Readonly<Record<string, PackArtifactInput>>;
12
+ }
13
+ export interface PackLoader {
14
+ readonly kind: string;
15
+ load(input: PackLoaderInput, ctx: LoadContext): unknown;
16
+ }
17
+ export type PackLoadResult = {
18
+ readonly ok: true;
19
+ readonly value: unknown;
20
+ } | {
21
+ readonly ok: false;
22
+ readonly error: unknown;
23
+ };
24
+ /**
25
+ * Injectable `asset.kind` -> {@link Loader} table held by `AssetRegistry`.
26
+ *
27
+ * @example Wire + dispatch (host side)
28
+ * ```ts
29
+ * import { LoaderRegistry, wireDefaultLoaders } from '@forgeax/engine-assets-runtime';
30
+ * const loaders = new LoaderRegistry();
31
+ * wireDefaultLoaders(loaders);
32
+ * const meshLoader = loaders.get('mesh'); // Loader | undefined
33
+ * ```
34
+ */
35
+ export declare class LoaderRegistry {
36
+ private readonly loaders;
37
+ private readonly packLoaders;
38
+ /**
39
+ * Register a loader for its `loader.kind`. Fail-fast on a malformed loader
40
+ * (charter P3); rejects a repeated kind so the canonical owner cannot be replaced.
41
+ *
42
+ * @param loader the `{ kind, load }` object to register.
43
+ * @throws TypeError when `loader.kind` is empty or `loader.load` is not a
44
+ * function — a wire-time misconfiguration the host must fix.
45
+ */
46
+ register(loader: Loader<unknown>): () => void;
47
+ registerPackLoader(loader: PackLoader): () => void;
48
+ loadPack(input: PackLoaderInput, ctx: LoadContext): Promise<PackLoadResult>;
49
+ /**
50
+ * Look up the loader registered for `kind`. Returns `undefined` when no
51
+ * loader is wired — the `AssetRegistry` consumer maps that to a structured
52
+ * `AssetError(code='loader-not-registered')` with the registered kinds in
53
+ * `.detail` (charter P3).
54
+ */
55
+ get(kind: string): Loader<unknown> | undefined;
56
+ /**
57
+ * The kinds currently wired, in insertion order. Fed into the
58
+ * `loader-not-registered` error `.detail.registeredKinds` so AI users see
59
+ * exactly what is injectable.
60
+ */
61
+ registeredKinds(): readonly string[];
62
+ }
63
+ //# sourceMappingURL=loader-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-registry.d.ts","sourceRoot":"","sources":["../src/loader-registry.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAErF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC;CACzD;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,qBAAa,cAAc;IAIzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI;IAoB7C,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI;IAoB5C,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAqBjF;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS;IAI9C;;;;OAIG;IACH,eAAe,IAAI,SAAS,MAAM,EAAE;CAGrC"}
@@ -0,0 +1,72 @@
1
+ import type { Loader } from '@forgeax/engine-types';
2
+ /** mesh loader — Float32Array / Uint16Array | Uint32Array normalisation -> MeshAsset.
3
+ *
4
+ * feat-20260611: skinIndex (Uint16Array) and skinWeight (Float32Array) accept
5
+ * both their native typed-array shape (in-memory: dawn smoke / direct
6
+ * `register` test) AND `number[]` (post-`JSON.stringify` shape produced by the
7
+ * dev-server / build-mode pack-body round-trip — `JSON.stringify(pack) -> fetch
8
+ * -> JSON.parse` flattens every typed array to a plain Array). Same dual
9
+ * contract `skeletonLoader` / `animationClipLoader` already honour (PR #350);
10
+ * without the array arm, every Fox.glb / Khronos skinned glTF surfaces as
11
+ * `asset-parse-failed` on the browser path while dawn smoke stays green.
12
+ */
13
+ export declare const meshLoader: Loader;
14
+ /** scene loader — delegates to parseScenePayload; routes structured ref error via ctx. */
15
+ export declare const sceneLoader: Loader;
16
+ /** material loader — passes + values + serialized parent GUID -> parentGuid. */
17
+ export declare const materialLoader: Loader;
18
+ /** sampler loader — preserve the serialised SamplerAsset descriptor. */
19
+ export declare const samplerLoader: Loader;
20
+ /** skeleton loader — inverseBindMatrices stride validation.
21
+ *
22
+ * bug-20260611: accept both `Float32Array` (in-memory: dawn smoke / direct
23
+ * `register` test) AND `number[]` (post-`JSON.stringify` shape: `normaliseForPack`
24
+ * in @forgeax/engine-import flattens every typed array to a plain Array so
25
+ * `JSON.stringify(pack)` survives the dev-server / build-mode round-trip --
26
+ * the same dual contract `meshLoader` already honours). Without the array arm
27
+ * the .pack.json -> fetch -> JSON.parse path lands a plain object whose
28
+ * `instanceof Float32Array` check fails, surfacing as `asset-parse-failed`
29
+ * for any glTF carrying a Skin (e.g. Khronos Fox.glb).
30
+ */
31
+ export declare const skeletonLoader: Loader;
32
+ /** skin loader — skeletonGuid + jointPaths validation. */
33
+ export declare const skinLoader: Loader;
34
+ /** animation-clip loader — channels / sampler validation.
35
+ *
36
+ * bug-20260611: sampler.input / sampler.output accept both `Float32Array`
37
+ * (in-memory) and `number[]` (post-`JSON.stringify` shape produced by
38
+ * `normaliseForPack`). Same dual contract as `skeletonLoader` /
39
+ * `meshLoader`; without it the dev `.pack.json` round-trip surfaces every
40
+ * skinned-with-animation glTF as `asset-parse-failed`.
41
+ */
42
+ export declare const animationClipLoader: Loader;
43
+ /** animation-graph loader — pack payload -> AnimationGraph POD.
44
+ *
45
+ * feat-20260713-animation-state-machine-plugin M4 / w30 (plan D-4 landing (3)):
46
+ * the inverse of `serializeAnimationGraph` (runtime). Each Clip leaf's `clip`
47
+ * field arrives as a `refs[]` index (small int); the loader resolves it back to
48
+ * the GUID string verbatim, leaving GUID -> handle re-resolution to the ECS/use
49
+ * time (the same "GUID at load, handle at use" contract materialLoader honours
50
+ * for parentGuid / values texture fields, asset-registry D-19). Blend/Add
51
+ * node references + `root` are intra-graph node indices, validated against the
52
+ * node count. A malformed payload (out-of-range refs / node index, bad node
53
+ * shape, non-finite weight) returns `undefined` so the load-by-guid path
54
+ * surfaces the existing `asset-parse-failed` error code (AC-14).
55
+ *
56
+ * OOS-7: reconstructs only an engine-authored graph's topology; no DCC-import
57
+ * metadata is consumed.
58
+ */
59
+ export declare const animationGraphLoader: Loader;
60
+ /** audio loader -- restore the durable descriptor; host decode stays elsewhere. */
61
+ export declare const audioLoader: Loader;
62
+ /** particle loader -- restore the complete cooked program without a GPU device. */
63
+ export declare const particleEffectLoader: Loader;
64
+ export { renderPipelineLoader, tilesetLoader } from './pack-artifact';
65
+ /**
66
+ * The eight inline pack-payload loaders, in the historical `if`-chain order
67
+ * (the animation-graph loader, feat-20260713 M4 / w30, appends after the clip
68
+ * loader). `wireDefaultLoaders` (w5) registers these plus the texture / font /
69
+ * equirect loaders (w6) and the audio placeholder (w8).
70
+ */
71
+ export declare const INLINE_PACK_LOADERS: readonly Loader[];
72
+ //# sourceMappingURL=inline-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-pack.d.ts","sourceRoot":"","sources":["../../src/loaders/inline-pack.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAWV,MAAM,EAOP,MAAM,uBAAuB,CAAC;AAoB/B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,EAAE,MA8OxB,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,WAAW,EAAE,MAazB,CAAC;AAiFF,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,MAsI5B,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,aAAa,EAAE,MAiE3B,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,EAAE,MAoB5B,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,UAAU,EAAE,MAcxB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,MA0DjC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAgDlC,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,WAAW,EAAE,MAqBzB,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,EAAE,MASlC,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAahD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type VertexLayoutProjection } from '@forgeax/engine-geometry';
2
+ import { type Result, type VertexAttributeMap } from '@forgeax/engine-types';
3
+ import { MeshBinAssetError } from '../errors/asset';
4
+ export interface UnpackedMeshBin {
5
+ readonly version: 4;
6
+ readonly projection: VertexLayoutProjection;
7
+ readonly vertices: Float32Array;
8
+ readonly attributes: VertexAttributeMap;
9
+ readonly indices?: Uint16Array | Uint32Array;
10
+ readonly submeshes: ReadonlyArray<Record<string, unknown>>;
11
+ readonly materialSlots: readonly {
12
+ readonly slotName: string;
13
+ readonly sourceKey?: string;
14
+ readonly defaultMaterialRef?: number;
15
+ }[];
16
+ readonly aabb?: Float32Array;
17
+ readonly morphTargets?: ReadonlyArray<Record<string, Float32Array>>;
18
+ readonly morphWeights?: Float32Array;
19
+ }
20
+ export declare function unpackMeshBinV4(bytes: Uint8Array, sourceKey: string): Result<UnpackedMeshBin, MeshBinAssetError>;
21
+ //# sourceMappingURL=mesh-bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-bin.d.ts","sourceRoot":"","sources":["../../src/loaders/mesh-bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAAW,KAAK,MAAM,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,aAAa,EAAE,SAAS;QAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;KACtC,EAAE,CAAC;IACJ,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;CACtC;AAmDD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC,CA8N5C"}
@@ -0,0 +1,20 @@
1
+ import type { Loader } from '@forgeax/engine-types';
2
+ export type CodecContextFailure = {
3
+ readonly code: 'basis-profile-unsupported';
4
+ readonly detail: {
5
+ readonly profile: string;
6
+ };
7
+ } | {
8
+ readonly code: 'ktx2-color-space-mismatch';
9
+ readonly detail: {
10
+ readonly authoredColorSpace: 'srgb' | 'linear';
11
+ readonly dfdColorSpace: 'srgb' | 'linear' | 'unknown';
12
+ };
13
+ };
14
+ export declare const textureLoader: Loader;
15
+ export declare const equirectLoader: Loader;
16
+ export declare const fontLoader: Loader;
17
+ export declare const renderPipelineLoader: Loader;
18
+ export declare const tilesetLoader: Loader;
19
+ export declare const PACK_ARTIFACT_LOADERS: readonly Loader[];
20
+ //# sourceMappingURL=pack-artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-artifact.d.ts","sourceRoot":"","sources":["../../src/loaders/pack-artifact.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAMV,MAAM,EAKP,MAAM,uBAAuB,CAAC;AA+L/B,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,QAAQ,CAAC;QAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;KACvD,CAAC;CACH,CAAC;AAyXN,eAAO,MAAM,aAAa,EAAE,MAI3B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAI5B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAIxB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAkBlC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MA0B3B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAMlD,CAAC"}