@carbonenginejs/runtime-resource 0.9.2 → 0.10.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 (324) hide show
  1. package/NOTICE +3 -2
  2. package/README.md +47 -6
  3. package/dist/CjsMotherLode.js +88 -88
  4. package/dist/CjsMotherLode.js.map +1 -1
  5. package/dist/CjsResMan.js +717 -228
  6. package/dist/CjsResMan.js.map +1 -1
  7. package/dist/CjsResManFetchProvider.js +94 -0
  8. package/dist/CjsResManFetchProvider.js.map +1 -0
  9. package/dist/{CjsResManQueue.js → CjsResManWorkQueue.js} +112 -25
  10. package/dist/CjsResManWorkQueue.js.map +1 -0
  11. package/dist/format/CjsBlueReader.js +89 -0
  12. package/dist/format/CjsBlueReader.js.map +1 -1
  13. package/dist/format/CjsFormat.js +42 -16
  14. package/dist/format/CjsFormat.js.map +1 -1
  15. package/dist/format/CjsReader.js +4 -0
  16. package/dist/format/CjsReader.js.map +1 -1
  17. package/dist/format/CjsResourceProbe.js +2 -0
  18. package/dist/format/CjsResourceProbe.js.map +1 -1
  19. package/dist/format/payloadContract.js +20 -0
  20. package/dist/format/payloadContract.js.map +1 -1
  21. package/dist/formats/black/CjsBlackFormat.js +15 -1
  22. package/dist/formats/black/CjsBlackFormat.js.map +1 -1
  23. package/dist/formats/black/core/CjsBlackBinaryReader.js +103 -0
  24. package/dist/formats/black/core/CjsBlackBinaryReader.js.map +1 -1
  25. package/dist/formats/black/core/CjsBlackPropertyReaders.js +61 -0
  26. package/dist/formats/black/core/CjsBlackPropertyReaders.js.map +1 -1
  27. package/dist/formats/black/core/CjsBlackReader.js +125 -0
  28. package/dist/formats/black/core/CjsBlackReader.js.map +1 -1
  29. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +103 -0
  30. package/dist/formats/black/core/CjsBlackSchemaRegistry.js.map +1 -1
  31. package/dist/formats/black/core/helpers.js +17 -0
  32. package/dist/formats/black/core/helpers.js.map +1 -1
  33. package/dist/formats/bnk/CjsBnkFormat.js +8 -0
  34. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  35. package/dist/formats/bnk/core/helpers.js +20 -0
  36. package/dist/formats/bnk/core/helpers.js.map +1 -1
  37. package/dist/formats/bnk/core/musicNodes.js +40 -3
  38. package/dist/formats/bnk/core/musicNodes.js.map +1 -1
  39. package/dist/formats/bnk/core/soundbanksInfo.js +2 -0
  40. package/dist/formats/bnk/core/soundbanksInfo.js.map +1 -1
  41. package/dist/formats/cmf/core/binary.js +71 -0
  42. package/dist/formats/cmf/core/binary.js.map +1 -1
  43. package/dist/formats/cmf/core/buffers.js +4 -0
  44. package/dist/formats/cmf/core/buffers.js.map +1 -1
  45. package/dist/formats/cmf/core/helpers.js +31 -0
  46. package/dist/formats/cmf/core/helpers.js.map +1 -1
  47. package/dist/formats/cmf/core/schema.js +10 -0
  48. package/dist/formats/cmf/core/schema.js.map +1 -1
  49. package/dist/formats/cmf/core/shared.js +9 -0
  50. package/dist/formats/cmf/core/shared.js.map +1 -1
  51. package/dist/formats/cmf/core/writer.js +54 -0
  52. package/dist/formats/cmf/core/writer.js.map +1 -1
  53. package/dist/formats/dds/core/bc6h.js +10 -0
  54. package/dist/formats/dds/core/bc6h.js.map +1 -1
  55. package/dist/formats/dds/core/bc7.js +16 -0
  56. package/dist/formats/dds/core/bc7.js.map +1 -1
  57. package/dist/formats/dds/core/helpers.js +47 -0
  58. package/dist/formats/dds/core/helpers.js.map +1 -1
  59. package/dist/formats/fbx/core/helpers.js +21 -0
  60. package/dist/formats/fbx/core/helpers.js.map +1 -1
  61. package/dist/formats/flac/CjsFlacFormat.js +49 -0
  62. package/dist/formats/flac/CjsFlacFormat.js.map +1 -1
  63. package/dist/formats/flac/core/helpers.js +20 -0
  64. package/dist/formats/flac/core/helpers.js.map +1 -1
  65. package/dist/formats/gif/CjsGifFormat.js +49 -0
  66. package/dist/formats/gif/CjsGifFormat.js.map +1 -1
  67. package/dist/formats/gif/core/helpers.js +20 -0
  68. package/dist/formats/gif/core/helpers.js.map +1 -1
  69. package/dist/formats/gltf/core/helpers.js +15 -0
  70. package/dist/formats/gltf/core/helpers.js.map +1 -1
  71. package/dist/formats/gltf/core/parser.js +13 -0
  72. package/dist/formats/gltf/core/parser.js.map +1 -1
  73. package/dist/formats/gltf/core/targets.js +10 -0
  74. package/dist/formats/gltf/core/targets.js.map +1 -1
  75. package/dist/formats/gr2/core/bitknit2.js +2 -0
  76. package/dist/formats/gr2/core/bitknit2.js.map +1 -1
  77. package/dist/formats/gr2/core/helpers.js +20 -0
  78. package/dist/formats/gr2/core/helpers.js.map +1 -1
  79. package/dist/formats/gr2/core/targets.js +10 -0
  80. package/dist/formats/gr2/core/targets.js.map +1 -1
  81. package/dist/formats/jpeg/core/helpers.js +52 -0
  82. package/dist/formats/jpeg/core/helpers.js.map +1 -1
  83. package/dist/formats/jpeg/core/jpeg.js +93 -0
  84. package/dist/formats/jpeg/core/jpeg.js.map +1 -1
  85. package/dist/formats/mp3/core/helpers.js +37 -0
  86. package/dist/formats/mp3/core/helpers.js.map +1 -1
  87. package/dist/formats/mp4/core/helpers.js +35 -0
  88. package/dist/formats/mp4/core/helpers.js.map +1 -1
  89. package/dist/formats/ogg/CjsOggFormat.js +49 -0
  90. package/dist/formats/ogg/CjsOggFormat.js.map +1 -1
  91. package/dist/formats/ogg/core/helpers.js +23 -0
  92. package/dist/formats/ogg/core/helpers.js.map +1 -1
  93. package/dist/formats/ogg/core/vorbis.js +13 -0
  94. package/dist/formats/ogg/core/vorbis.js.map +1 -1
  95. package/dist/formats/png/core/helpers.js +52 -0
  96. package/dist/formats/png/core/helpers.js.map +1 -1
  97. package/dist/formats/red/CjsRedFormat.js +2 -0
  98. package/dist/formats/red/CjsRedFormat.js.map +1 -1
  99. package/dist/formats/red/core/CjsRedReader.js +52 -0
  100. package/dist/formats/red/core/CjsRedReader.js.map +1 -1
  101. package/dist/formats/red/core/helpers.js +19 -0
  102. package/dist/formats/red/core/helpers.js.map +1 -1
  103. package/dist/formats/stl/core/stl.js +8 -0
  104. package/dist/formats/stl/core/stl.js.map +1 -1
  105. package/dist/formats/stl/core/targets.js +10 -0
  106. package/dist/formats/stl/core/targets.js.map +1 -1
  107. package/dist/formats/tga/core/helpers.js +47 -0
  108. package/dist/formats/tga/core/helpers.js.map +1 -1
  109. package/dist/formats/wav/core/helpers.js +37 -0
  110. package/dist/formats/wav/core/helpers.js.map +1 -1
  111. package/dist/formats/webm/core/helpers.js +35 -0
  112. package/dist/formats/webm/core/helpers.js.map +1 -1
  113. package/dist/formats/webp/CjsWebpFormat.js +49 -0
  114. package/dist/formats/webp/CjsWebpFormat.js.map +1 -1
  115. package/dist/formats/webp/core/helpers.js +23 -0
  116. package/dist/formats/webp/core/helpers.js.map +1 -1
  117. package/dist/formats/wem/CjsWemFormat.js +8 -0
  118. package/dist/formats/wem/CjsWemFormat.js.map +1 -1
  119. package/dist/formats/wem/core/bitStream.js +2 -0
  120. package/dist/formats/wem/core/bitStream.js.map +1 -1
  121. package/dist/formats/wem/core/helpers.js +20 -0
  122. package/dist/formats/wem/core/helpers.js.map +1 -1
  123. package/dist/formats/yaml/CjsYamlFormat.js +45 -0
  124. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  125. package/dist/formats/yaml/core/CjsYamlReader.js +91 -0
  126. package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
  127. package/dist/formats/yaml/core/helpers.js +10 -0
  128. package/dist/formats/yaml/core/helpers.js.map +1 -1
  129. package/dist/index.js +56 -43
  130. package/dist/index.js.map +1 -1
  131. package/dist/{CjsResource.js → resource/CjsResource.js} +232 -17
  132. package/dist/resource/CjsResource.js.map +1 -0
  133. package/dist/{resources → resource}/Tr2LightProfileRes.js +4 -3
  134. package/dist/resource/Tr2LightProfileRes.js.map +1 -0
  135. package/dist/{resources → resource/audio}/AudioGeometryResData.js +1 -1
  136. package/dist/resource/audio/AudioGeometryResData.js.map +1 -0
  137. package/dist/resource/audio/CjsAudioBufferRes.js +86 -0
  138. package/dist/resource/audio/CjsAudioBufferRes.js.map +1 -0
  139. package/dist/resource/audio/CjsAudioRes.js +213 -0
  140. package/dist/resource/audio/CjsAudioRes.js.map +1 -0
  141. package/dist/resource/audio/index.js +4 -0
  142. package/dist/resource/audio/index.js.map +1 -0
  143. package/dist/{resources → resource/geometry}/MeshDecalData.js +1 -1
  144. package/dist/resource/geometry/MeshDecalData.js.map +1 -0
  145. package/dist/{resources → resource/geometry}/MeshDecalLodData.js +1 -1
  146. package/dist/resource/geometry/MeshDecalLodData.js.map +1 -0
  147. package/dist/resource/geometry/TriGeometryRes.js +656 -0
  148. package/dist/resource/geometry/TriGeometryRes.js.map +1 -0
  149. package/dist/{resources → resource/geometry}/TriGeometryResAreaData.js +1 -1
  150. package/dist/resource/geometry/TriGeometryResAreaData.js.map +1 -0
  151. package/dist/{resources → resource/geometry}/TriGeometryResJointData.js +1 -1
  152. package/dist/resource/geometry/TriGeometryResJointData.js.map +1 -0
  153. package/dist/{resources → resource/geometry}/TriGeometryResLodData.js +1 -1
  154. package/dist/resource/geometry/TriGeometryResLodData.js.map +1 -0
  155. package/dist/{resources → resource/geometry}/TriGeometryResMeshData.js +1 -1
  156. package/dist/resource/geometry/TriGeometryResMeshData.js.map +1 -0
  157. package/dist/{resources → resource/geometry}/TriGeometryResSkeletonData.js +1 -1
  158. package/dist/resource/geometry/TriGeometryResSkeletonData.js.map +1 -0
  159. package/dist/{resources → resource/geometry}/TriJointBinding.js +1 -1
  160. package/dist/resource/geometry/TriJointBinding.js.map +1 -0
  161. package/dist/{resources → resource/geometry}/TriMorphTargetGeometryConstants.js +1 -1
  162. package/dist/resource/geometry/TriMorphTargetGeometryConstants.js.map +1 -0
  163. package/dist/{resources → resource/geometry}/TriRtGeometryConstants.js +1 -1
  164. package/dist/resource/geometry/TriRtGeometryConstants.js.map +1 -0
  165. package/dist/{resources → resource/geometry/granny}/GStateBindingCallbackData.js +1 -1
  166. package/dist/resource/geometry/granny/GStateBindingCallbackData.js.map +1 -0
  167. package/dist/{resources → resource/geometry/granny}/Tr2GrannyIntersectionResult.js +1 -1
  168. package/dist/resource/geometry/granny/Tr2GrannyIntersectionResult.js.map +1 -0
  169. package/dist/{resources → resource/geometry/granny}/Tr2GrannyStateRes.js +6 -5
  170. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js.map +1 -0
  171. package/dist/{resources → resource/geometry/granny}/TriGrannyRes.js +6 -5
  172. package/dist/resource/geometry/granny/TriGrannyRes.js.map +1 -0
  173. package/dist/{resources → resource/geometry/granny}/enums.js +1 -9
  174. package/dist/resource/geometry/granny/enums.js.map +1 -0
  175. package/dist/resource/geometry/granny/index.js +6 -0
  176. package/dist/resource/geometry/granny/index.js.map +1 -0
  177. package/dist/resource/geometry/index.js +17 -0
  178. package/dist/resource/geometry/index.js.map +1 -0
  179. package/dist/resource/index.js +52 -0
  180. package/dist/resource/index.js.map +1 -0
  181. package/dist/resource/resourceBoundary.js +64 -0
  182. package/dist/resource/resourceBoundary.js.map +1 -0
  183. package/dist/resource/shader/Tr2EffectRes.js +420 -0
  184. package/dist/resource/shader/Tr2EffectRes.js.map +1 -0
  185. package/dist/{resources → resource/shader}/Tr2MaterialArea.js +9 -4
  186. package/dist/resource/shader/Tr2MaterialArea.js.map +1 -0
  187. package/dist/{resources → resource/shader}/Tr2MaterialMesh.js +8 -3
  188. package/dist/resource/shader/Tr2MaterialMesh.js.map +1 -0
  189. package/dist/{resources → resource/shader}/Tr2MaterialRes.js +10 -4
  190. package/dist/resource/shader/Tr2MaterialRes.js.map +1 -0
  191. package/dist/resource/shader/Tr2Shader.js +250 -0
  192. package/dist/resource/shader/Tr2Shader.js.map +1 -0
  193. package/dist/{resources → resource/shader}/Tr2ShaderPermutation.js +13 -7
  194. package/dist/resource/shader/Tr2ShaderPermutation.js.map +1 -0
  195. package/dist/resource/shader/index.js +17 -0
  196. package/dist/resource/shader/index.js.map +1 -0
  197. package/dist/resource/shader/portable.js +33 -0
  198. package/dist/resource/shader/portable.js.map +1 -0
  199. package/dist/resource/shader/portableValidation.js +461 -0
  200. package/dist/resource/shader/portableValidation.js.map +1 -0
  201. package/dist/resource/shader/reflection/Tr2EffectConstant.js +100 -0
  202. package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -0
  203. package/dist/resource/shader/reflection/Tr2EffectDefine.js +34 -0
  204. package/dist/resource/shader/reflection/Tr2EffectDefine.js.map +1 -0
  205. package/dist/resource/shader/reflection/Tr2EffectDescription.js +113 -0
  206. package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -0
  207. package/dist/resource/shader/reflection/Tr2EffectLibrary.js +141 -0
  208. package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -0
  209. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +107 -0
  210. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -0
  211. package/dist/resource/shader/reflection/Tr2EffectResource.js +90 -0
  212. package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -0
  213. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +235 -0
  214. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -0
  215. package/dist/resource/shader/reflection/Tr2EffectTechnique.js +71 -0
  216. package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -0
  217. package/dist/resource/shader/reflection/Tr2Pass.js +111 -0
  218. package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -0
  219. package/dist/resource/shader/sampler/Tr2SamplerSetup.js +80 -0
  220. package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -0
  221. package/dist/{texture → resource/texture}/CjsTextureArrayRes.js +83 -6
  222. package/dist/resource/texture/CjsTextureArrayRes.js.map +1 -0
  223. package/dist/{texture/CjsTextureParameterProxy.js → resource/texture/CjsTextureArrayResParameterProxy.js} +56 -10
  224. package/dist/resource/texture/CjsTextureArrayResParameterProxy.js.map +1 -0
  225. package/dist/{resources → resource/texture}/Tr2ImageRes.js +6 -4
  226. package/dist/resource/texture/Tr2ImageRes.js.map +1 -0
  227. package/dist/{resources → resource/texture}/Tr2TextureLodManager.js +3 -1
  228. package/dist/resource/texture/Tr2TextureLodManager.js.map +1 -0
  229. package/dist/{resources → resource/texture}/Tr2TextureLodUpdateRequest.js +1 -1
  230. package/dist/resource/texture/Tr2TextureLodUpdateRequest.js.map +1 -0
  231. package/dist/{resources → resource/texture}/Tr2TexturePackChannel.js +1 -1
  232. package/dist/resource/texture/Tr2TexturePackChannel.js.map +1 -0
  233. package/dist/{resources → resource/texture}/Tr2TexturePipeline.js +6 -4
  234. package/dist/resource/texture/Tr2TexturePipeline.js.map +1 -0
  235. package/dist/{resources → resource/texture}/Tr2TexturePipelineParams.js +1 -1
  236. package/dist/resource/texture/Tr2TexturePipelineParams.js.map +1 -0
  237. package/dist/{resources → resource/texture}/Tr2TexturePipelineStepCompress.js +1 -1
  238. package/dist/resource/texture/Tr2TexturePipelineStepCompress.js.map +1 -0
  239. package/dist/{resources → resource/texture}/Tr2TexturePipelineStepGenerateMips.js +1 -1
  240. package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js.map +1 -0
  241. package/dist/{resources → resource/texture}/Tr2TexturePipelineStepLimitSize.js +1 -1
  242. package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js.map +1 -0
  243. package/dist/{resources → resource/texture}/Tr2TexturePipelineStepLoad.js +1 -1
  244. package/dist/resource/texture/Tr2TexturePipelineStepLoad.js.map +1 -0
  245. package/dist/{resources → resource/texture}/Tr2TexturePipelineStepPack.js +1 -1
  246. package/dist/resource/texture/Tr2TexturePipelineStepPack.js.map +1 -0
  247. package/dist/{resources → resource/texture}/TriTextureRes.js +42 -26
  248. package/dist/resource/texture/TriTextureRes.js.map +1 -0
  249. package/dist/resource/texture/index.js +15 -0
  250. package/dist/resource/texture/index.js.map +1 -0
  251. package/dist/{resources → resource/texture}/texturePipelineBehavior.js +59 -59
  252. package/dist/resource/texture/texturePipelineBehavior.js.map +1 -0
  253. package/dist/worker/CjsResManMainThreadLoader.js +87 -0
  254. package/dist/worker/CjsResManMainThreadLoader.js.map +1 -0
  255. package/dist/worker/CjsResManWorker.js +217 -0
  256. package/dist/worker/CjsResManWorker.js.map +1 -0
  257. package/dist/worker/CjsResManWorkerLoader.js +434 -0
  258. package/dist/worker/CjsResManWorkerLoader.js.map +1 -0
  259. package/dist/worker/protocol.js +12 -0
  260. package/dist/worker/protocol.js.map +1 -0
  261. package/docs/README.md +16 -3
  262. package/docs/architecture.md +39 -16
  263. package/docs/concepts/resource-lifecycle.md +2 -1
  264. package/docs/formats/README.md +4 -0
  265. package/docs/reference/classes/README.md +6 -4
  266. package/docs/reference/classes/audio.md +30 -0
  267. package/docs/reference/classes/core.md +31 -11
  268. package/docs/reference/classes/resources.md +151 -41
  269. package/docs/reference/classes/texture.md +7 -7
  270. package/docs/reference/motherlode-cache.md +17 -0
  271. package/docs/reference/queues.md +9 -1
  272. package/docs/reference/workers.md +135 -0
  273. package/docs/roadmap.md +27 -1
  274. package/package.json +8 -1
  275. package/dist/CjsResManQueue.js.map +0 -1
  276. package/dist/CjsResource.js.map +0 -1
  277. package/dist/CjsResourceSource.js +0 -68
  278. package/dist/CjsResourceSource.js.map +0 -1
  279. package/dist/resourcePath.js +0 -18
  280. package/dist/resourcePath.js.map +0 -1
  281. package/dist/resourceStates.js +0 -9
  282. package/dist/resourceStates.js.map +0 -1
  283. package/dist/resources/AudioGeometryResData.js.map +0 -1
  284. package/dist/resources/GStateBindingCallbackData.js.map +0 -1
  285. package/dist/resources/MeshDecalData.js.map +0 -1
  286. package/dist/resources/MeshDecalLodData.js.map +0 -1
  287. package/dist/resources/Tr2EffectRes.js +0 -71
  288. package/dist/resources/Tr2EffectRes.js.map +0 -1
  289. package/dist/resources/Tr2GrannyIntersectionResult.js.map +0 -1
  290. package/dist/resources/Tr2GrannyStateRes.js.map +0 -1
  291. package/dist/resources/Tr2ImageRes.js.map +0 -1
  292. package/dist/resources/Tr2LightProfileRes.js.map +0 -1
  293. package/dist/resources/Tr2MaterialArea.js.map +0 -1
  294. package/dist/resources/Tr2MaterialMesh.js.map +0 -1
  295. package/dist/resources/Tr2MaterialRes.js.map +0 -1
  296. package/dist/resources/Tr2ShaderPermutation.js.map +0 -1
  297. package/dist/resources/Tr2TextureLodManager.js.map +0 -1
  298. package/dist/resources/Tr2TextureLodUpdateRequest.js.map +0 -1
  299. package/dist/resources/Tr2TexturePackChannel.js.map +0 -1
  300. package/dist/resources/Tr2TexturePipeline.js.map +0 -1
  301. package/dist/resources/Tr2TexturePipelineParams.js.map +0 -1
  302. package/dist/resources/Tr2TexturePipelineStepCompress.js.map +0 -1
  303. package/dist/resources/Tr2TexturePipelineStepGenerateMips.js.map +0 -1
  304. package/dist/resources/Tr2TexturePipelineStepLimitSize.js.map +0 -1
  305. package/dist/resources/Tr2TexturePipelineStepLoad.js.map +0 -1
  306. package/dist/resources/Tr2TexturePipelineStepPack.js.map +0 -1
  307. package/dist/resources/TriGeometryRes.js +0 -239
  308. package/dist/resources/TriGeometryRes.js.map +0 -1
  309. package/dist/resources/TriGeometryResAreaData.js.map +0 -1
  310. package/dist/resources/TriGeometryResJointData.js.map +0 -1
  311. package/dist/resources/TriGeometryResLodData.js.map +0 -1
  312. package/dist/resources/TriGeometryResMeshData.js.map +0 -1
  313. package/dist/resources/TriGeometryResSkeletonData.js.map +0 -1
  314. package/dist/resources/TriGrannyRes.js.map +0 -1
  315. package/dist/resources/TriJointBinding.js.map +0 -1
  316. package/dist/resources/TriMorphTargetGeometryConstants.js.map +0 -1
  317. package/dist/resources/TriRtGeometryConstants.js.map +0 -1
  318. package/dist/resources/TriTextureRes.js.map +0 -1
  319. package/dist/resources/enums.js.map +0 -1
  320. package/dist/resources/resourceBoundary.js +0 -47
  321. package/dist/resources/resourceBoundary.js.map +0 -1
  322. package/dist/resources/texturePipelineBehavior.js.map +0 -1
  323. package/dist/texture/CjsTextureArrayRes.js.map +0 -1
  324. package/dist/texture/CjsTextureParameterProxy.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CjsResManWorker.js","sources":["../../../src/worker/CjsResManWorker.js"],"sourcesContent":["import { Message, Operation } from \"./protocol.js\";\n\n/**\n * Static browser-worker host that owns its operation/message vocabulary,\n * executes clone-safe source and format operations, installs the message\n * envelope, transfers owned buffers, and serializes failures for `CjsResMan`.\n */\nexport class CjsResManWorker\n{\n /** Stable operations understood by the bundled resource module worker. */\n static Operation = Operation;\n\n /** Stable message kinds exchanged with the resource module worker. */\n static Message = Message;\n\n /**\n * Execute one bundled resource worker operation.\n *\n * This method also permits deterministic non-browser tests and custom\n * worker hosts without installing global message handlers.\n *\n * @param {string} operation Worker operation name.\n * @param {*} payload Structured-cloneable operation payload.\n * @param {object} [context={}] Optional fetch and abort context.\n * @returns {Promise<*>} Operation result.\n */\n static async execute(operation, payload, context = {})\n {\n switch (operation)\n {\n case Operation.FETCH:\n return fetchResource(payload, context);\n\n case Operation.FORMAT_READ:\n return readFormat(payload);\n\n default:\n {\n const error = new Error(`Unknown resource worker operation: ${operation}`);\n error.code = \"CJS_RESOURCE_WORKER_OPERATION_UNKNOWN\";\n error.operation = operation;\n throw error;\n }\n }\n }\n\n /**\n * Install the ResMan message protocol on a Worker-compatible scope.\n *\n * @param {WorkerGlobalScope|object} scope Worker global.\n * @returns {() => void} Uninstall callback.\n */\n static install(scope = globalThis)\n {\n if (!scope || typeof scope.postMessage !== \"function\")\n {\n throw new TypeError(\"Resource worker scope must provide postMessage.\");\n }\n const controllers = new Map();\n const onMessage = async event =>\n {\n const message = event?.data;\n if (!message || typeof message !== \"object\") return;\n\n if (message.type === Message.CANCEL)\n {\n controllers.get(message.id)?.abort();\n return;\n }\n if (message.type !== Message.EXECUTE) return;\n\n const controller = typeof AbortController === \"function\"\n ? new AbortController()\n : null;\n if (controller) controllers.set(message.id, controller);\n try\n {\n const result = await CjsResManWorker.execute(\n message.operation,\n message.payload,\n { signal: controller?.signal }\n );\n scope.postMessage({\n type: Message.RESULT,\n id: message.id,\n ok: true,\n result\n }, CjsResManWorker.collectTransferables(result));\n }\n catch (error)\n {\n scope.postMessage({\n type: Message.RESULT,\n id: message.id,\n ok: false,\n error: CjsResManWorker.serializeError(error, message.operation)\n });\n }\n finally\n {\n controllers.delete(message.id);\n }\n };\n\n if (typeof scope.addEventListener === \"function\")\n {\n scope.addEventListener(\"message\", onMessage);\n return () => scope.removeEventListener?.(\"message\", onMessage);\n }\n const previous = scope.onmessage;\n scope.onmessage = onMessage;\n return () =>\n {\n if (scope.onmessage === onMessage) scope.onmessage = previous || null;\n };\n }\n\n /**\n * Collect unique transferable ArrayBuffers from a worker result.\n *\n * SharedArrayBuffer is intentionally excluded because it is shared rather\n * than transferable.\n *\n * @param {*} value Result graph.\n * @returns {ArrayBuffer[]} Transfer list.\n */\n static collectTransferables(value)\n {\n const buffers = new Set();\n const seen = new Set();\n\n const visit = entry =>\n {\n if (entry === null || entry === undefined) return;\n if (entry instanceof ArrayBuffer)\n {\n buffers.add(entry);\n return;\n }\n if (ArrayBuffer.isView(entry))\n {\n if (entry.buffer instanceof ArrayBuffer) buffers.add(entry.buffer);\n return;\n }\n if (typeof entry !== \"object\" || seen.has(entry)) return;\n seen.add(entry);\n if (Array.isArray(entry))\n {\n for (const item of entry) visit(item);\n return;\n }\n for (const item of Object.values(entry)) visit(item);\n };\n\n visit(value);\n return [ ...buffers ];\n }\n\n /**\n * Convert an exception into a cloneable diagnostic.\n *\n * @param {*} value Failure value.\n * @param {string} [operation] Operation name.\n * @returns {object} Cloneable error data.\n */\n static serializeError(value, operation = undefined)\n {\n return {\n name: value?.name || \"CjsResManWorkerError\",\n message: value?.message || String(value),\n code: value?.code,\n operation: value?.operation || operation,\n path: value?.path,\n status: value?.status,\n statusText: value?.statusText\n };\n }\n}\n\nasync function fetchResource(payload, context) {\n if (!payload || typeof payload.url !== \"string\") {\n throw new TypeError(\"Worker fetch requires a URL.\");\n }\n const fetchImplementation = context.fetch || globalThis.fetch;\n if (typeof fetchImplementation !== \"function\") {\n throw new ReferenceError(\"Worker fetch is unavailable.\");\n }\n const options = {\n ...(payload.options || {}),\n ...(context.signal ? { signal: context.signal } : {})\n };\n const response = await fetchImplementation(payload.url, options);\n if (!response.ok) {\n const error = new Error(\n `Resource fetch failed: ${response.status} ${response.statusText}`\n );\n error.code = \"CJS_RESOURCE_FETCH_FAILED\";\n error.path = payload.path;\n error.status = response.status;\n error.statusText = response.statusText;\n throw error;\n }\n\n switch (payload.responseType || \"arraybuffer\") {\n case \"arraybuffer\":\n return response.arrayBuffer();\n case \"blob\":\n return response.blob();\n case \"json\":\n return response.json();\n case \"text\":\n return response.text();\n default: {\n const error = new Error(`Unsupported worker fetch response type: ${payload.responseType}`);\n error.code = \"CJS_RESOURCE_WORKER_RESPONSE_TYPE\";\n throw error;\n }\n }\n}\n\nasync function readFormat(payload) {\n if (!payload || typeof payload.module !== \"string\" || payload.module === \"\") {\n throw new TypeError(\"Worker format read requires a module URL.\");\n }\n const module = await import(payload.module);\n const Format = module[payload.exportName || \"default\"];\n if (typeof Format !== \"function\") {\n throw new TypeError(\n `Worker format export was not found: ${payload.exportName || \"default\"}`\n );\n }\n const options = payload.options || {};\n if (typeof Format.readAsync === \"function\") {\n return Format.readAsync(payload.input, options);\n }\n if (typeof Format.read === \"function\") {\n return Format.read(payload.input, options);\n }\n\n const reader = new Format(options);\n if (typeof reader.ReadAsync === \"function\") {\n return reader.ReadAsync(payload.input, options);\n }\n if (typeof reader.Read === \"function\") {\n return reader.Read(payload.input, options);\n }\n throw new TypeError(`${Format.name} does not expose a read operation.`);\n}\n\nconst isWorkerScope = typeof WorkerGlobalScope !== \"undefined\"\n && globalThis instanceof WorkerGlobalScope;\nif (isWorkerScope) CjsResManWorker.install(globalThis);\n"],"names":["CjsResManWorker","Operation","Message","execute","operation","payload","context","FETCH","fetchResource","FORMAT_READ","readFormat","error","Error","code","install","scope","globalThis","postMessage","TypeError","controllers","Map","onMessage","event","message","data","type","CANCEL","get","id","abort","EXECUTE","controller","AbortController","set","result","signal","RESULT","ok","collectTransferables","serializeError","delete","addEventListener","removeEventListener","previous","onmessage","value","buffers","Set","seen","visit","entry","undefined","ArrayBuffer","add","isView","buffer","has","Array","isArray","item","Object","values","name","String","path","status","statusText","url","fetchImplementation","fetch","ReferenceError","options","response","responseType","arrayBuffer","blob","json","text","module","Format","exportName","readAsync","input","read","reader","ReadAsync","Read","isWorkerScope","WorkerGlobalScope"],"mappings":"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"}
@@ -0,0 +1,434 @@
1
+ import { Operation, Message } from './protocol.js';
2
+ import { CjsResManMainThreadLoader } from './CjsResManMainThreadLoader.js';
3
+
4
+ const DEFAULT_WORKER_OPTIONS = Object.freeze({
5
+ type: "module",
6
+ name: "CjsResManWorker"
7
+ });
8
+
9
+ /**
10
+ * Browser module-worker strategy that correlates source/format requests, transfers owned buffers, propagates cancellation and fatal failure, and delegates unsupported operations to a main-thread loader.
11
+ *
12
+ * One module worker can overlap fetch requests and serializes synchronous
13
+ * reader work on its own event loop. Sources opt in through
14
+ * `CreateWorkerRequest(path, options)`. Formats opt in through a static
15
+ * `worker` declaration containing their module URL and export name.
16
+ */
17
+ class CjsResManWorkerLoader {
18
+ #boundError;
19
+ #boundMessage;
20
+ #nextId = 1;
21
+ #pending = new Map();
22
+
23
+ /**
24
+ * @param {object} [options={}] Worker construction and fallback options.
25
+ * @param {CjsResManMainThreadLoader|object} [options.fallback] Unsupported-operation fallback.
26
+ * @param {Worker|object} [options.worker] Existing Worker-compatible instance.
27
+ * @param {(url: string|URL, options: object) => Worker|object} [options.workerFactory] Worker factory.
28
+ * @param {string|URL} [options.workerUrl] Module worker entry URL.
29
+ * @param {object} [options.workerOptions] Options passed to the Worker constructor.
30
+ * @param {boolean} [options.enabled=true] Whether worker execution may be used.
31
+ */
32
+ constructor(options = {}) {
33
+ if (!options || typeof options !== "object" || Array.isArray(options)) {
34
+ throw new TypeError("CjsResManWorkerLoader options must be an object.");
35
+ }
36
+ this.fallback = options.fallback || new CjsResManMainThreadLoader();
37
+ assertResourceLoader(this.fallback, "fallback");
38
+ this.workerFactory = options.workerFactory || defaultWorkerFactory;
39
+ if (typeof this.workerFactory !== "function") {
40
+ throw new TypeError("CjsResManWorkerLoader workerFactory must be a function.");
41
+ }
42
+ this.workerUrl = options.workerUrl || new URL("./CjsResManWorker.js", import.meta.url);
43
+ this.workerOptions = Object.freeze({
44
+ ...DEFAULT_WORKER_OPTIONS,
45
+ ...(options.workerOptions || {})
46
+ });
47
+ this.enabled = options.enabled !== false;
48
+ this.failed = false;
49
+ this.worker = options.worker || null;
50
+ this.#boundMessage = event => this.#OnMessage(event);
51
+ this.#boundError = event => this.#OnError(event);
52
+ if (this.worker) this.#Attach(this.worker);
53
+ }
54
+
55
+ /**
56
+ * Enable and lazily create the configured worker.
57
+ *
58
+ * @param {string|URL} [workerUrl] Optional replacement worker URL.
59
+ * @returns {boolean} Whether a worker is ready.
60
+ */
61
+ Enable(workerUrl = this.workerUrl) {
62
+ this.enabled = true;
63
+ if (workerUrl !== undefined && workerUrl !== null) this.workerUrl = workerUrl;
64
+ if (this.worker) return true;
65
+ if (this.failed) return false;
66
+ try {
67
+ const worker = this.workerFactory(this.workerUrl, this.workerOptions);
68
+ if (!worker || typeof worker.postMessage !== "function") {
69
+ throw new TypeError("Worker factory did not return a Worker-compatible object.");
70
+ }
71
+ this.worker = worker;
72
+ this.#Attach(worker);
73
+ return true;
74
+ } catch {
75
+ this.worker = null;
76
+ this.failed = true;
77
+ return false;
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Stop worker use and reject every pending request.
83
+ *
84
+ * @param {*} [reason] Optional failure reason.
85
+ * @returns {CjsResManWorkerLoader} This loader.
86
+ */
87
+ Disable(reason = null) {
88
+ const worker = this.worker;
89
+ if (worker) {
90
+ this.#Detach(worker);
91
+ worker.terminate?.();
92
+ }
93
+ this.worker = null;
94
+ this.enabled = false;
95
+ this.failed = reason !== null && reason !== undefined;
96
+ if (this.#pending.size) {
97
+ const error = normalizeWorkerError(reason || createWorkerUnavailableError("Resource worker was disabled."));
98
+ for (const request of this.#pending.values()) {
99
+ cleanupPendingRequest(request);
100
+ request.reject(error);
101
+ }
102
+ this.#pending.clear();
103
+ }
104
+ return this;
105
+ }
106
+
107
+ /**
108
+ * Clear a previous creation/fatal failure so a later enable can retry.
109
+ *
110
+ * @returns {CjsResManWorkerLoader} This loader.
111
+ */
112
+ Reset() {
113
+ this.failed = false;
114
+ this.enabled = true;
115
+ return this;
116
+ }
117
+
118
+ /**
119
+ * Replace the unsupported-operation fallback.
120
+ *
121
+ * @param {CjsResManMainThreadLoader|object} fallback Loader exposing Read and ReadFormat.
122
+ * @returns {CjsResManWorkerLoader} This loader.
123
+ */
124
+ SetFallback(fallback) {
125
+ assertResourceLoader(fallback, "fallback");
126
+ this.fallback = fallback;
127
+ return this;
128
+ }
129
+
130
+ /**
131
+ * Report whether worker execution is configured and constructible.
132
+ *
133
+ * @returns {boolean}
134
+ */
135
+ IsAvailable() {
136
+ return this.enabled && (Boolean(this.worker) || this.Enable());
137
+ }
138
+
139
+ /**
140
+ * Read a source through its declared worker request, falling back when the
141
+ * source is not worker-aware or a worker cannot be created.
142
+ *
143
+ * @param {object|Function} source Source implementation.
144
+ * @param {string} path Normalized resource path.
145
+ * @param {object} [options={}] Source options.
146
+ * @returns {Promise<*>|*} Source result.
147
+ */
148
+ Read(source, path, options = {}) {
149
+ assertResourceSource(source);
150
+ if (typeof source.CreateWorkerRequest !== "function") {
151
+ return this.fallback.Read(source, path, options);
152
+ }
153
+ const request = normalizeWorkerRequest(source.CreateWorkerRequest(path, options));
154
+ if (!request || !this.IsAvailable()) {
155
+ return this.fallback.Read(source, path, options);
156
+ }
157
+ return this.Execute(request.operation, request.payload, {
158
+ signal: request.signal || options.signal,
159
+ transfer: request.transfer
160
+ });
161
+ }
162
+
163
+ /**
164
+ * Test whether a registered format can be safely dispatched to this worker.
165
+ *
166
+ * @param {object} descriptor Registered format descriptor.
167
+ * @param {object} [formatOptions={}] Normalized format options.
168
+ * @returns {boolean}
169
+ */
170
+ CanReadFormat(descriptor, formatOptions = {}) {
171
+ const declaration = normalizeFormatWorkerDeclaration(descriptor);
172
+ return Boolean(declaration && isWorkerFormatOutputSupported(declaration, formatOptions) && canCloneWorkerValue(formatOptions) && this.IsAvailable());
173
+ }
174
+
175
+ /**
176
+ * Execute a worker-safe format reader or use the main-thread fallback.
177
+ *
178
+ * Inputs are cloned by default so shared source-cache ownership is not
179
+ * detached. A format may explicitly declare `transferInput: true` when its
180
+ * caller guarantees exclusive ownership.
181
+ *
182
+ * @param {object} descriptor Registered format descriptor.
183
+ * @param {*} input Reader input.
184
+ * @param {object} [formatOptions={}] Normalized format options.
185
+ * @returns {Promise<*>} Format result.
186
+ */
187
+ ReadFormat(descriptor, input, formatOptions = {}) {
188
+ const declaration = normalizeFormatWorkerDeclaration(descriptor);
189
+ if (!declaration || !isWorkerFormatOutputSupported(declaration, formatOptions) || !canCloneWorkerValue(formatOptions) || !this.IsAvailable()) {
190
+ return this.fallback.ReadFormat(descriptor, input, formatOptions);
191
+ }
192
+ const transfer = declaration.transferInput ? getExclusiveInputTransferables(input) : [];
193
+ return this.Execute(Operation.FORMAT_READ, {
194
+ module: declaration.module,
195
+ exportName: declaration.exportName,
196
+ input,
197
+ options: formatOptions
198
+ }, {
199
+ transfer
200
+ });
201
+ }
202
+
203
+ /**
204
+ * Dispatch one operation using the stable worker message protocol.
205
+ *
206
+ * @param {string} operation Operation name.
207
+ * @param {*} payload Structured-cloneable operation payload.
208
+ * @param {object} [options={}] Transfer and cancellation options.
209
+ * @returns {Promise<*>} Worker result.
210
+ */
211
+ Execute(operation, payload, options = {}) {
212
+ if (typeof operation !== "string" || operation.trim() === "") {
213
+ return Promise.reject(new TypeError("Worker operation must be a non-empty string."));
214
+ }
215
+ if (!this.IsAvailable()) {
216
+ return Promise.reject(createWorkerUnavailableError());
217
+ }
218
+ const signal = options.signal || null;
219
+ if (signal?.aborted) return Promise.reject(createAbortError(signal.reason));
220
+ const id = this.#nextId++;
221
+ let resolve;
222
+ let reject;
223
+ const promise = new Promise((onResolve, onReject) => {
224
+ resolve = onResolve;
225
+ reject = onReject;
226
+ });
227
+ const request = {
228
+ id,
229
+ resolve,
230
+ reject,
231
+ signal,
232
+ onAbort: null
233
+ };
234
+ if (signal && typeof signal.addEventListener === "function") {
235
+ request.onAbort = () => {
236
+ if (!this.#pending.delete(id)) return;
237
+ cleanupPendingRequest(request);
238
+ try {
239
+ this.worker?.postMessage({
240
+ type: Message.CANCEL,
241
+ id
242
+ });
243
+ } catch {
244
+ // The local abort remains authoritative if the worker is already gone.
245
+ }
246
+ reject(createAbortError(signal.reason));
247
+ };
248
+ signal.addEventListener("abort", request.onAbort, {
249
+ once: true
250
+ });
251
+ }
252
+ this.#pending.set(id, request);
253
+ try {
254
+ this.worker.postMessage({
255
+ type: Message.EXECUTE,
256
+ id,
257
+ operation,
258
+ payload
259
+ }, normalizeTransferList(options.transfer));
260
+ } catch (error) {
261
+ this.#pending.delete(id);
262
+ cleanupPendingRequest(request);
263
+ reject(error);
264
+ }
265
+ return promise;
266
+ }
267
+
268
+ /**
269
+ * Return the number of unresolved worker requests.
270
+ *
271
+ * @returns {number}
272
+ */
273
+ GetPendingCount() {
274
+ return this.#pending.size;
275
+ }
276
+
277
+ /** Attach this loader's result and failure listeners to a worker. */
278
+ #Attach(worker) {
279
+ if (typeof worker.addEventListener === "function") {
280
+ worker.addEventListener("message", this.#boundMessage);
281
+ worker.addEventListener("error", this.#boundError);
282
+ worker.addEventListener("messageerror", this.#boundError);
283
+ } else {
284
+ worker.onmessage = this.#boundMessage;
285
+ worker.onerror = this.#boundError;
286
+ worker.onmessageerror = this.#boundError;
287
+ }
288
+ }
289
+
290
+ /** Detach this loader's result and failure listeners from a worker. */
291
+ #Detach(worker) {
292
+ if (typeof worker.removeEventListener === "function") {
293
+ worker.removeEventListener("message", this.#boundMessage);
294
+ worker.removeEventListener("error", this.#boundError);
295
+ worker.removeEventListener("messageerror", this.#boundError);
296
+ } else {
297
+ if (worker.onmessage === this.#boundMessage) worker.onmessage = null;
298
+ if (worker.onerror === this.#boundError) worker.onerror = null;
299
+ if (worker.onmessageerror === this.#boundError) worker.onmessageerror = null;
300
+ }
301
+ }
302
+
303
+ /** Settle the pending request identified by one worker result message. */
304
+ #OnMessage(event) {
305
+ const data = event?.data;
306
+ if (!data || data.type !== Message.RESULT) return;
307
+ const request = this.#pending.get(data.id);
308
+ if (!request) return;
309
+ this.#pending.delete(data.id);
310
+ cleanupPendingRequest(request);
311
+ if (data.ok) request.resolve(data.result);else request.reject(normalizeWorkerError(data.error));
312
+ }
313
+
314
+ /** Disable worker execution after a fatal worker or message failure. */
315
+ #OnError(event) {
316
+ const reason = event?.error || event || new Error("Resource worker failed.");
317
+ this.Disable(reason);
318
+ }
319
+ }
320
+ function assertResourceSource(source) {
321
+ if (!source || typeof source !== "object" && typeof source !== "function" || typeof source.Read !== "function") {
322
+ throw new TypeError("Resource source must provide Read(path, options).");
323
+ }
324
+ }
325
+ function assertResourceLoader(loader, name = "loader") {
326
+ if (!loader || typeof loader.Read !== "function" || typeof loader.ReadFormat !== "function") {
327
+ throw new TypeError(`CjsResManWorkerLoader ${name} must provide Read and ReadFormat.`);
328
+ }
329
+ }
330
+ function defaultWorkerFactory(url, options) {
331
+ if (typeof Worker === "undefined") {
332
+ throw new ReferenceError("Browser Worker is not available.");
333
+ }
334
+ return new Worker(url, options);
335
+ }
336
+ function normalizeWorkerRequest(request) {
337
+ if (request === null || request === undefined || request === false) return null;
338
+ if (!request || typeof request !== "object" || Array.isArray(request)) {
339
+ throw new TypeError("CreateWorkerRequest must return an object or null.");
340
+ }
341
+ if (typeof request.operation !== "string" || request.operation.trim() === "") {
342
+ throw new TypeError("Worker source request requires a non-empty operation.");
343
+ }
344
+ return {
345
+ operation: request.operation,
346
+ payload: request.payload,
347
+ signal: request.signal || null,
348
+ transfer: normalizeTransferList(request.transfer)
349
+ };
350
+ }
351
+ function normalizeFormatWorkerDeclaration(descriptor) {
352
+ const Format = descriptor?.Format;
353
+ const declaration = descriptor?.worker || Format?.worker;
354
+ if (!declaration) return null;
355
+ const value = typeof declaration === "string" ? {
356
+ module: declaration
357
+ } : declaration;
358
+ if (!value || typeof value !== "object" || !value.module) return null;
359
+ return Object.freeze({
360
+ module: String(value.module),
361
+ exportName: String(value.exportName || Format?.name || "default"),
362
+ outputTypes: Array.isArray(value.outputTypes) ? Object.freeze(value.outputTypes.map(String)) : null,
363
+ defaultOutput: value.defaultOutput === undefined ? undefined : String(value.defaultOutput),
364
+ transferInput: value.transferInput === true
365
+ });
366
+ }
367
+ function isWorkerFormatOutputSupported(declaration, formatOptions) {
368
+ if (!declaration.outputTypes) return true;
369
+ const output = formatOptions.emit ?? declaration.defaultOutput;
370
+ return output !== undefined && declaration.outputTypes.includes(String(output));
371
+ }
372
+ function normalizeTransferList(value) {
373
+ if (value === null || value === undefined) return [];
374
+ if (!Array.isArray(value)) {
375
+ throw new TypeError("Worker transfer list must be an array.");
376
+ }
377
+ return value;
378
+ }
379
+ function getExclusiveInputTransferables(input) {
380
+ if (input instanceof ArrayBuffer) return [input];
381
+ if (ArrayBuffer.isView(input) && input.byteOffset === 0 && input.byteLength === input.buffer.byteLength) {
382
+ return [input.buffer];
383
+ }
384
+ return [];
385
+ }
386
+ function canCloneWorkerValue(value, seen = new Set()) {
387
+ if (value === null || value === undefined) return true;
388
+ const type = typeof value;
389
+ if (type === "string" || type === "number" || type === "boolean" || type === "bigint") {
390
+ return true;
391
+ }
392
+ if (type !== "object") return false;
393
+ if (value instanceof ArrayBuffer || ArrayBuffer.isView(value) || value instanceof Date) {
394
+ return true;
395
+ }
396
+ if (seen.has(value)) return false;
397
+ seen.add(value);
398
+ if (Array.isArray(value)) {
399
+ return value.every(entry => canCloneWorkerValue(entry, seen));
400
+ }
401
+ const prototype = Object.getPrototypeOf(value);
402
+ if (prototype !== Object.prototype && prototype !== null) return false;
403
+ return Object.values(value).every(entry => canCloneWorkerValue(entry, seen));
404
+ }
405
+ function cleanupPendingRequest(request) {
406
+ if (request.signal && request.onAbort && typeof request.signal.removeEventListener === "function") {
407
+ request.signal.removeEventListener("abort", request.onAbort);
408
+ }
409
+ }
410
+ function createWorkerUnavailableError(message = "Resource worker is unavailable.") {
411
+ const error = new Error(message);
412
+ error.name = "CjsResManWorkerUnavailableError";
413
+ error.code = "CJS_RESOURCE_WORKER_UNAVAILABLE";
414
+ return error;
415
+ }
416
+ function createAbortError(reason) {
417
+ if (reason instanceof Error) return reason;
418
+ const error = new Error(reason === undefined ? "Resource worker request was aborted." : String(reason));
419
+ error.name = "AbortError";
420
+ error.code = "ABORT_ERR";
421
+ return error;
422
+ }
423
+ function normalizeWorkerError(value) {
424
+ if (value instanceof Error) return value;
425
+ const error = new Error(value?.message || "Resource worker operation failed.");
426
+ error.name = value?.name || "CjsResManWorkerError";
427
+ for (const key of ["code", "operation", "path", "status", "statusText"]) {
428
+ if (value?.[key] !== undefined) error[key] = value[key];
429
+ }
430
+ return error;
431
+ }
432
+
433
+ export { CjsResManWorkerLoader };
434
+ //# sourceMappingURL=CjsResManWorkerLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CjsResManWorkerLoader.js","sources":["../../../src/worker/CjsResManWorkerLoader.js"],"sourcesContent":["import { Message, Operation } from \"./protocol.js\";\nimport { CjsResManMainThreadLoader } from \"./CjsResManMainThreadLoader.js\";\n\nconst DEFAULT_WORKER_OPTIONS = Object.freeze({\n type: \"module\",\n name: \"CjsResManWorker\"\n});\n\n/**\n * Browser module-worker strategy that correlates source/format requests, transfers owned buffers, propagates cancellation and fatal failure, and delegates unsupported operations to a main-thread loader.\n *\n * One module worker can overlap fetch requests and serializes synchronous\n * reader work on its own event loop. Sources opt in through\n * `CreateWorkerRequest(path, options)`. Formats opt in through a static\n * `worker` declaration containing their module URL and export name.\n */\nexport class CjsResManWorkerLoader\n{\n #boundError;\n #boundMessage;\n #nextId = 1;\n #pending = new Map();\n\n /**\n * @param {object} [options={}] Worker construction and fallback options.\n * @param {CjsResManMainThreadLoader|object} [options.fallback] Unsupported-operation fallback.\n * @param {Worker|object} [options.worker] Existing Worker-compatible instance.\n * @param {(url: string|URL, options: object) => Worker|object} [options.workerFactory] Worker factory.\n * @param {string|URL} [options.workerUrl] Module worker entry URL.\n * @param {object} [options.workerOptions] Options passed to the Worker constructor.\n * @param {boolean} [options.enabled=true] Whether worker execution may be used.\n */\n constructor(options = {}) {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"CjsResManWorkerLoader options must be an object.\");\n }\n\n this.fallback = options.fallback || new CjsResManMainThreadLoader();\n assertResourceLoader(this.fallback, \"fallback\");\n this.workerFactory = options.workerFactory || defaultWorkerFactory;\n if (typeof this.workerFactory !== \"function\") {\n throw new TypeError(\"CjsResManWorkerLoader workerFactory must be a function.\");\n }\n this.workerUrl = options.workerUrl\n || new URL(\"./CjsResManWorker.js\", import.meta.url);\n this.workerOptions = Object.freeze({\n ...DEFAULT_WORKER_OPTIONS,\n ...(options.workerOptions || {})\n });\n this.enabled = options.enabled !== false;\n this.failed = false;\n this.worker = options.worker || null;\n this.#boundMessage = event => this.#OnMessage(event);\n this.#boundError = event => this.#OnError(event);\n if (this.worker) this.#Attach(this.worker);\n }\n\n /**\n * Enable and lazily create the configured worker.\n *\n * @param {string|URL} [workerUrl] Optional replacement worker URL.\n * @returns {boolean} Whether a worker is ready.\n */\n Enable(workerUrl = this.workerUrl) {\n this.enabled = true;\n if (workerUrl !== undefined && workerUrl !== null) this.workerUrl = workerUrl;\n if (this.worker) return true;\n if (this.failed) return false;\n\n try {\n const worker = this.workerFactory(this.workerUrl, this.workerOptions);\n if (!worker || typeof worker.postMessage !== \"function\") {\n throw new TypeError(\"Worker factory did not return a Worker-compatible object.\");\n }\n this.worker = worker;\n this.#Attach(worker);\n return true;\n } catch {\n this.worker = null;\n this.failed = true;\n return false;\n }\n }\n\n /**\n * Stop worker use and reject every pending request.\n *\n * @param {*} [reason] Optional failure reason.\n * @returns {CjsResManWorkerLoader} This loader.\n */\n Disable(reason = null) {\n const worker = this.worker;\n if (worker) {\n this.#Detach(worker);\n worker.terminate?.();\n }\n this.worker = null;\n this.enabled = false;\n this.failed = reason !== null && reason !== undefined;\n\n if (this.#pending.size) {\n const error = normalizeWorkerError(\n reason || createWorkerUnavailableError(\"Resource worker was disabled.\")\n );\n for (const request of this.#pending.values()) {\n cleanupPendingRequest(request);\n request.reject(error);\n }\n this.#pending.clear();\n }\n return this;\n }\n\n /**\n * Clear a previous creation/fatal failure so a later enable can retry.\n *\n * @returns {CjsResManWorkerLoader} This loader.\n */\n Reset() {\n this.failed = false;\n this.enabled = true;\n return this;\n }\n\n /**\n * Replace the unsupported-operation fallback.\n *\n * @param {CjsResManMainThreadLoader|object} fallback Loader exposing Read and ReadFormat.\n * @returns {CjsResManWorkerLoader} This loader.\n */\n SetFallback(fallback) {\n assertResourceLoader(fallback, \"fallback\");\n this.fallback = fallback;\n return this;\n }\n\n /**\n * Report whether worker execution is configured and constructible.\n *\n * @returns {boolean}\n */\n IsAvailable() {\n return this.enabled && (Boolean(this.worker) || this.Enable());\n }\n\n /**\n * Read a source through its declared worker request, falling back when the\n * source is not worker-aware or a worker cannot be created.\n *\n * @param {object|Function} source Source implementation.\n * @param {string} path Normalized resource path.\n * @param {object} [options={}] Source options.\n * @returns {Promise<*>|*} Source result.\n */\n Read(source, path, options = {}) {\n assertResourceSource(source);\n if (typeof source.CreateWorkerRequest !== \"function\") {\n return this.fallback.Read(source, path, options);\n }\n\n const request = normalizeWorkerRequest(source.CreateWorkerRequest(path, options));\n if (!request || !this.IsAvailable()) {\n return this.fallback.Read(source, path, options);\n }\n return this.Execute(request.operation, request.payload, {\n signal: request.signal || options.signal,\n transfer: request.transfer\n });\n }\n\n /**\n * Test whether a registered format can be safely dispatched to this worker.\n *\n * @param {object} descriptor Registered format descriptor.\n * @param {object} [formatOptions={}] Normalized format options.\n * @returns {boolean}\n */\n CanReadFormat(descriptor, formatOptions = {}) {\n const declaration = normalizeFormatWorkerDeclaration(descriptor);\n return Boolean(\n declaration\n && isWorkerFormatOutputSupported(declaration, formatOptions)\n && canCloneWorkerValue(formatOptions)\n && this.IsAvailable()\n );\n }\n\n /**\n * Execute a worker-safe format reader or use the main-thread fallback.\n *\n * Inputs are cloned by default so shared source-cache ownership is not\n * detached. A format may explicitly declare `transferInput: true` when its\n * caller guarantees exclusive ownership.\n *\n * @param {object} descriptor Registered format descriptor.\n * @param {*} input Reader input.\n * @param {object} [formatOptions={}] Normalized format options.\n * @returns {Promise<*>} Format result.\n */\n ReadFormat(descriptor, input, formatOptions = {}) {\n const declaration = normalizeFormatWorkerDeclaration(descriptor);\n if (!declaration\n || !isWorkerFormatOutputSupported(declaration, formatOptions)\n || !canCloneWorkerValue(formatOptions)\n || !this.IsAvailable()) {\n return this.fallback.ReadFormat(descriptor, input, formatOptions);\n }\n\n const transfer = declaration.transferInput\n ? getExclusiveInputTransferables(input)\n : [];\n return this.Execute(Operation.FORMAT_READ, {\n module: declaration.module,\n exportName: declaration.exportName,\n input,\n options: formatOptions\n }, { transfer });\n }\n\n /**\n * Dispatch one operation using the stable worker message protocol.\n *\n * @param {string} operation Operation name.\n * @param {*} payload Structured-cloneable operation payload.\n * @param {object} [options={}] Transfer and cancellation options.\n * @returns {Promise<*>} Worker result.\n */\n Execute(operation, payload, options = {}) {\n if (typeof operation !== \"string\" || operation.trim() === \"\") {\n return Promise.reject(new TypeError(\"Worker operation must be a non-empty string.\"));\n }\n if (!this.IsAvailable()) {\n return Promise.reject(createWorkerUnavailableError());\n }\n const signal = options.signal || null;\n if (signal?.aborted) return Promise.reject(createAbortError(signal.reason));\n\n const id = this.#nextId++;\n let resolve;\n let reject;\n const promise = new Promise((onResolve, onReject) => {\n resolve = onResolve;\n reject = onReject;\n });\n const request = {\n id,\n resolve,\n reject,\n signal,\n onAbort: null\n };\n if (signal && typeof signal.addEventListener === \"function\") {\n request.onAbort = () => {\n if (!this.#pending.delete(id)) return;\n cleanupPendingRequest(request);\n try {\n this.worker?.postMessage({\n type: Message.CANCEL,\n id\n });\n } catch {\n // The local abort remains authoritative if the worker is already gone.\n }\n reject(createAbortError(signal.reason));\n };\n signal.addEventListener(\"abort\", request.onAbort, { once: true });\n }\n this.#pending.set(id, request);\n\n try {\n this.worker.postMessage({\n type: Message.EXECUTE,\n id,\n operation,\n payload\n }, normalizeTransferList(options.transfer));\n } catch (error) {\n this.#pending.delete(id);\n cleanupPendingRequest(request);\n reject(error);\n }\n return promise;\n }\n\n /**\n * Return the number of unresolved worker requests.\n *\n * @returns {number}\n */\n GetPendingCount() {\n return this.#pending.size;\n }\n\n /** Attach this loader's result and failure listeners to a worker. */\n #Attach(worker) {\n if (typeof worker.addEventListener === \"function\") {\n worker.addEventListener(\"message\", this.#boundMessage);\n worker.addEventListener(\"error\", this.#boundError);\n worker.addEventListener(\"messageerror\", this.#boundError);\n } else {\n worker.onmessage = this.#boundMessage;\n worker.onerror = this.#boundError;\n worker.onmessageerror = this.#boundError;\n }\n }\n\n /** Detach this loader's result and failure listeners from a worker. */\n #Detach(worker) {\n if (typeof worker.removeEventListener === \"function\") {\n worker.removeEventListener(\"message\", this.#boundMessage);\n worker.removeEventListener(\"error\", this.#boundError);\n worker.removeEventListener(\"messageerror\", this.#boundError);\n } else {\n if (worker.onmessage === this.#boundMessage) worker.onmessage = null;\n if (worker.onerror === this.#boundError) worker.onerror = null;\n if (worker.onmessageerror === this.#boundError) worker.onmessageerror = null;\n }\n }\n\n /** Settle the pending request identified by one worker result message. */\n #OnMessage(event) {\n const data = event?.data;\n if (!data || data.type !== Message.RESULT) return;\n const request = this.#pending.get(data.id);\n if (!request) return;\n this.#pending.delete(data.id);\n cleanupPendingRequest(request);\n if (data.ok) request.resolve(data.result);\n else request.reject(normalizeWorkerError(data.error));\n }\n\n /** Disable worker execution after a fatal worker or message failure. */\n #OnError(event) {\n const reason = event?.error || event || new Error(\"Resource worker failed.\");\n this.Disable(reason);\n }\n}\n\nfunction assertResourceSource(source) {\n if (!source || (typeof source !== \"object\" && typeof source !== \"function\")\n || typeof source.Read !== \"function\") {\n throw new TypeError(\"Resource source must provide Read(path, options).\");\n }\n}\n\nfunction assertResourceLoader(loader, name = \"loader\") {\n if (!loader || typeof loader.Read !== \"function\" || typeof loader.ReadFormat !== \"function\") {\n throw new TypeError(`CjsResManWorkerLoader ${name} must provide Read and ReadFormat.`);\n }\n}\n\nfunction defaultWorkerFactory(url, options) {\n if (typeof Worker === \"undefined\") {\n throw new ReferenceError(\"Browser Worker is not available.\");\n }\n return new Worker(url, options);\n}\n\nfunction normalizeWorkerRequest(request) {\n if (request === null || request === undefined || request === false) return null;\n if (!request || typeof request !== \"object\" || Array.isArray(request)) {\n throw new TypeError(\"CreateWorkerRequest must return an object or null.\");\n }\n if (typeof request.operation !== \"string\" || request.operation.trim() === \"\") {\n throw new TypeError(\"Worker source request requires a non-empty operation.\");\n }\n return {\n operation: request.operation,\n payload: request.payload,\n signal: request.signal || null,\n transfer: normalizeTransferList(request.transfer)\n };\n}\n\nfunction normalizeFormatWorkerDeclaration(descriptor) {\n const Format = descriptor?.Format;\n const declaration = descriptor?.worker || Format?.worker;\n if (!declaration) return null;\n\n const value = typeof declaration === \"string\"\n ? { module: declaration }\n : declaration;\n if (!value || typeof value !== \"object\" || !value.module) return null;\n return Object.freeze({\n module: String(value.module),\n exportName: String(value.exportName || Format?.name || \"default\"),\n outputTypes: Array.isArray(value.outputTypes)\n ? Object.freeze(value.outputTypes.map(String))\n : null,\n defaultOutput: value.defaultOutput === undefined\n ? undefined\n : String(value.defaultOutput),\n transferInput: value.transferInput === true\n });\n}\n\nfunction isWorkerFormatOutputSupported(declaration, formatOptions) {\n if (!declaration.outputTypes) return true;\n const output = formatOptions.emit ?? declaration.defaultOutput;\n return output !== undefined && declaration.outputTypes.includes(String(output));\n}\n\nfunction normalizeTransferList(value) {\n if (value === null || value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new TypeError(\"Worker transfer list must be an array.\");\n }\n return value;\n}\n\nfunction getExclusiveInputTransferables(input) {\n if (input instanceof ArrayBuffer) return [ input ];\n if (ArrayBuffer.isView(input)\n && input.byteOffset === 0\n && input.byteLength === input.buffer.byteLength) {\n return [ input.buffer ];\n }\n return [];\n}\n\nfunction canCloneWorkerValue(value, seen = new Set()) {\n if (value === null || value === undefined) return true;\n const type = typeof value;\n if (type === \"string\" || type === \"number\" || type === \"boolean\" || type === \"bigint\") {\n return true;\n }\n if (type !== \"object\") return false;\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value) || value instanceof Date) {\n return true;\n }\n if (seen.has(value)) return false;\n seen.add(value);\n if (Array.isArray(value)) {\n return value.every(entry => canCloneWorkerValue(entry, seen));\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return false;\n return Object.values(value).every(entry => canCloneWorkerValue(entry, seen));\n}\n\nfunction cleanupPendingRequest(request) {\n if (request.signal && request.onAbort\n && typeof request.signal.removeEventListener === \"function\") {\n request.signal.removeEventListener(\"abort\", request.onAbort);\n }\n}\n\nfunction createWorkerUnavailableError(message = \"Resource worker is unavailable.\") {\n const error = new Error(message);\n error.name = \"CjsResManWorkerUnavailableError\";\n error.code = \"CJS_RESOURCE_WORKER_UNAVAILABLE\";\n return error;\n}\n\nfunction createAbortError(reason) {\n if (reason instanceof Error) return reason;\n const error = new Error(reason === undefined ? \"Resource worker request was aborted.\" : String(reason));\n error.name = \"AbortError\";\n error.code = \"ABORT_ERR\";\n return error;\n}\n\nfunction normalizeWorkerError(value) {\n if (value instanceof Error) return value;\n const error = new Error(value?.message || \"Resource worker operation failed.\");\n error.name = value?.name || \"CjsResManWorkerError\";\n for (const key of [ \"code\", \"operation\", \"path\", \"status\", \"statusText\" ]) {\n if (value?.[key] !== undefined) error[key] = value[key];\n }\n return error;\n}\n"],"names":["DEFAULT_WORKER_OPTIONS","Object","freeze","type","name","CjsResManWorkerLoader","Map","constructor","options","Array","isArray","TypeError","fallback","CjsResManMainThreadLoader","assertResourceLoader","workerFactory","defaultWorkerFactory","workerUrl","URL","import","meta","url","workerOptions","enabled","failed","worker","event","Enable","undefined","postMessage","Disable","reason","terminate","size","error","normalizeWorkerError","createWorkerUnavailableError","request","values","cleanupPendingRequest","reject","clear","Reset","SetFallback","IsAvailable","Boolean","Read","source","path","assertResourceSource","CreateWorkerRequest","normalizeWorkerRequest","Execute","operation","payload","signal","transfer","CanReadFormat","descriptor","formatOptions","declaration","normalizeFormatWorkerDeclaration","isWorkerFormatOutputSupported","canCloneWorkerValue","ReadFormat","input","transferInput","getExclusiveInputTransferables","Operation","FORMAT_READ","module","exportName","trim","Promise","aborted","createAbortError","id","resolve","promise","onResolve","onReject","onAbort","addEventListener","delete","Message","CANCEL","once","set","EXECUTE","normalizeTransferList","GetPendingCount","#Attach","onmessage","onerror","onmessageerror","#Detach","removeEventListener","#OnMessage","data","RESULT","get","ok","result","#OnError","Error","loader","Worker","ReferenceError","Format","value","String","outputTypes","map","defaultOutput","output","emit","includes","ArrayBuffer","isView","byteOffset","byteLength","buffer","seen","Set","Date","has","add","every","entry","prototype","getPrototypeOf","message","code","key"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ const Operation = Object.freeze({
2
+ FETCH: "source.fetch",
3
+ FORMAT_READ: "format.read"
4
+ });
5
+ const Message = Object.freeze({
6
+ CANCEL: "cancel",
7
+ EXECUTE: "execute",
8
+ RESULT: "result"
9
+ });
10
+
11
+ export { Message, Operation };
12
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sources":["../../../src/worker/protocol.js"],"sourcesContent":["export const Operation = Object.freeze({\n FETCH: \"source.fetch\",\n FORMAT_READ: \"format.read\"\n});\n\nexport const Message = Object.freeze({\n CANCEL: \"cancel\",\n EXECUTE: \"execute\",\n RESULT: \"result\"\n});\n"],"names":["Operation","Object","freeze","FETCH","FORMAT_READ","Message","CANCEL","EXECUTE","RESULT"],"mappings":"MAAaA,SAAS,GAAGC,MAAM,CAACC,MAAM,CAAC;AACrCC,EAAAA,KAAK,EAAE,cAAc;AACrBC,EAAAA,WAAW,EAAE;AACf,CAAC;MAEYC,OAAO,GAAGJ,MAAM,CAACC,MAAM,CAAC;AACnCI,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,MAAM,EAAE;AACV,CAAC;;;;"}
package/docs/README.md CHANGED
@@ -9,9 +9,11 @@ Summary: Documentation home for the GPU-free resource lifecycle, cache, format,
9
9
 
10
10
  `@carbonenginejs/runtime-resource` owns the GPU-free resource layer of
11
11
  CarbonEngineJS: resource identity and state, the MotherLode cache, semantic
12
- resource classes, registered format readers, source adapters, and the queued
12
+ resource classes, registered format readers, fetch providers, and the queued
13
13
  CPU load/publication pipeline. It stops at a published CPU payload; engine
14
- packages realize that payload into backend objects.
14
+ packages realize that payload into backend objects. It also owns the canonical
15
+ device-free `Tr2EffectRes`/`Tr2Shader` reflection graph and portable-reflection
16
+ hydration boundary.
15
17
 
16
18
  ## Use this package when
17
19
 
@@ -19,6 +21,10 @@ packages realize that payload into backend objects.
19
21
  selection, `Ready()`/`GetObject()`) without choosing a GPU backend;
20
22
  - you need one of the non-shader format readers as a tree-shakeable subpath
21
23
  (`@carbonenginejs/runtime-resource/formats/<name>`);
24
+ - you need canonical effect permutation selection or immutable shader
25
+ reflection records from `@carbonenginejs/runtime-resource/resource/shader`;
26
+ - you need canonical raw audio resources for complete files or byte windows
27
+ over shared physical sources;
22
28
  - you are writing an engine adapter that consumes published CPU payloads and
23
29
  needs the documented retention, reload, and texture-array contracts.
24
30
 
@@ -31,7 +37,8 @@ packages realize that payload into backend objects.
31
37
  packages (`engine-webgpu`, future WebGL engines) that realize prepared
32
38
  resources.
33
39
  - Owned responsibility: resource identity, cache, CPU payload lifecycle,
34
- format selection and conversion, and load/publication queues.
40
+ format selection and conversion, load/publication queues, and canonical
41
+ device-free effect/shader reflection hydration and selection.
35
42
  - Owned elsewhere: WebGL/WebGPU realization, device budgets, and device-loss
36
43
  recovery belong to engine packages; shader formats belong to the dedicated
37
44
  shader format packages.
@@ -54,6 +61,12 @@ packages realize that payload into backend objects.
54
61
  reload contract.
55
62
  - [reference/queues.md](reference/queues.md): queued CPU load, publication,
56
63
  registration, and the `Wait()` fence.
64
+ - [reference/workers.md](reference/workers.md): browser-worker source and
65
+ declared worker-safe format execution.
66
+ - [reference/classes/audio.md](reference/classes/audio.md): complete/shared
67
+ audio byte owners and individually addressable audio resource views.
68
+ - [reference/classes/resources.md](reference/classes/resources.md): canonical
69
+ resource records, effect selection, and shader-reflection classes.
57
70
  - [reference/texture-arrays.md](reference/texture-arrays.md): texture-array
58
71
  proxies, update generations, and adapter commits.
59
72
  - [reference/texture-pipeline.md](reference/texture-pipeline.md):