@lightningjs/renderer 0.9.4 → 1.0.0-rc.1

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 (289) hide show
  1. package/README.md +0 -82
  2. package/dist/exports/index.d.ts +42 -3
  3. package/dist/exports/index.js +37 -3
  4. package/dist/exports/index.js.map +1 -1
  5. package/dist/src/core/CoreNode.d.ts +461 -46
  6. package/dist/src/core/CoreNode.js +170 -104
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreShaderManager.d.ts +16 -6
  9. package/dist/src/core/CoreShaderManager.js +20 -20
  10. package/dist/src/core/CoreShaderManager.js.map +1 -1
  11. package/dist/src/core/CoreTextNode.d.ts +30 -4
  12. package/dist/src/core/CoreTextNode.js +24 -1
  13. package/dist/src/core/CoreTextNode.js.map +1 -1
  14. package/dist/src/core/CoreTextureManager.d.ts +31 -82
  15. package/dist/src/core/CoreTextureManager.js +39 -126
  16. package/dist/src/core/CoreTextureManager.js.map +1 -1
  17. package/dist/src/core/Stage.d.ts +67 -9
  18. package/dist/src/core/Stage.js +174 -30
  19. package/dist/src/core/Stage.js.map +1 -1
  20. package/dist/src/core/TextureMemoryManager.d.ts +97 -8
  21. package/dist/src/core/TextureMemoryManager.js +142 -19
  22. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  23. package/dist/src/core/animations/CoreAnimation.d.ts +14 -6
  24. package/dist/src/core/animations/CoreAnimation.js +137 -43
  25. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  26. package/dist/src/core/lib/ImageWorker.js +59 -52
  27. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  28. package/dist/src/core/lib/utils.js.map +1 -1
  29. package/dist/src/core/platform.js +7 -1
  30. package/dist/src/core/platform.js.map +1 -1
  31. package/dist/src/core/renderers/CoreContextTexture.d.ts +3 -2
  32. package/dist/src/core/renderers/CoreContextTexture.js +7 -1
  33. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  34. package/dist/src/core/renderers/CoreRenderer.d.ts +5 -1
  35. package/dist/src/core/renderers/CoreRenderer.js +0 -1
  36. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  37. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +3 -0
  38. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +16 -1
  39. package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
  40. package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +0 -1
  41. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +2 -5
  42. package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
  43. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +2 -2
  44. package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
  45. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +0 -1
  46. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +7 -10
  47. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  48. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +3 -0
  49. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +47 -9
  50. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  51. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +2 -43
  52. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +70 -37
  53. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  54. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +2 -2
  55. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js.map +1 -1
  56. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +2 -2
  57. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js.map +1 -1
  58. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +2 -2
  59. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js.map +1 -1
  60. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +2 -2
  61. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js.map +1 -1
  62. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +2 -2
  63. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js.map +1 -1
  64. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.d.ts +8 -0
  65. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +103 -0
  66. package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js.map +1 -1
  67. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +3 -18
  68. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js.map +1 -1
  69. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +5 -2
  70. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js.map +1 -1
  71. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +4 -36
  72. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js.map +1 -1
  73. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +3 -2
  74. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +4 -2
  76. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  77. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +2 -1
  78. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js.map +1 -1
  79. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +4 -36
  80. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.d.ts +69 -0
  82. package/dist/src/core/renderers/webgl/shaders/effects/ShaderEffect.js.map +1 -1
  83. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +5 -2
  84. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  85. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -1
  86. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -1
  87. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +1 -1
  88. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -1
  89. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +1 -1
  90. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +10 -26
  91. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +116 -365
  92. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  93. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -1
  94. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -2
  95. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  96. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +2 -2
  97. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  98. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +2 -0
  99. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  100. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +3 -2
  101. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  102. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  103. package/dist/src/core/textures/ColorTexture.js +1 -1
  104. package/dist/src/core/textures/ImageTexture.d.ts +1 -1
  105. package/dist/src/core/textures/NoiseTexture.d.ts +1 -1
  106. package/dist/src/core/textures/NoiseTexture.js +3 -0
  107. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  108. package/dist/src/core/textures/SubTexture.d.ts +2 -2
  109. package/dist/src/core/textures/SubTexture.js +5 -1
  110. package/dist/src/core/textures/SubTexture.js.map +1 -1
  111. package/dist/src/core/textures/Texture.d.ts +23 -2
  112. package/dist/src/core/textures/Texture.js +32 -3
  113. package/dist/src/core/textures/Texture.js.map +1 -1
  114. package/dist/src/core/utils.d.ts +7 -0
  115. package/dist/src/core/utils.js +12 -10
  116. package/dist/src/core/utils.js.map +1 -1
  117. package/dist/src/main-api/DynamicShaderController.d.ts +9 -14
  118. package/dist/src/main-api/DynamicShaderController.js +21 -17
  119. package/dist/src/main-api/DynamicShaderController.js.map +1 -1
  120. package/dist/src/main-api/INode.d.ts +43 -463
  121. package/dist/src/main-api/INode.js +1 -19
  122. package/dist/src/main-api/INode.js.map +1 -1
  123. package/dist/src/main-api/Inspector.d.ts +10 -10
  124. package/dist/src/main-api/Inspector.js +18 -15
  125. package/dist/src/main-api/Inspector.js.map +1 -1
  126. package/dist/src/main-api/Renderer.d.ts +71 -25
  127. package/dist/src/main-api/Renderer.js +80 -109
  128. package/dist/src/main-api/Renderer.js.map +1 -1
  129. package/dist/src/main-api/ShaderController.d.ts +3 -8
  130. package/dist/src/main-api/ShaderController.js +8 -3
  131. package/dist/src/main-api/ShaderController.js.map +1 -1
  132. package/dist/src/utils.d.ts +1 -0
  133. package/dist/src/utils.js +7 -0
  134. package/dist/src/utils.js.map +1 -1
  135. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  136. package/exports/index.ts +62 -3
  137. package/package.json +8 -7
  138. package/src/core/CoreNode.test.ts +93 -0
  139. package/src/core/CoreNode.ts +675 -188
  140. package/src/core/CoreShaderManager.ts +56 -29
  141. package/src/core/CoreTextNode.ts +41 -9
  142. package/src/core/CoreTextureManager.ts +55 -175
  143. package/src/core/Stage.ts +199 -43
  144. package/src/core/TextureMemoryManager.ts +231 -22
  145. package/src/core/animations/CoreAnimation.ts +194 -67
  146. package/src/core/lib/ImageWorker.ts +79 -52
  147. package/src/core/lib/utils.ts +1 -0
  148. package/src/core/platform.ts +8 -1
  149. package/src/core/renderers/CoreContextTexture.ts +9 -2
  150. package/src/core/renderers/CoreRenderer.ts +5 -2
  151. package/src/core/renderers/canvas/CanvasCoreRenderer.ts +20 -1
  152. package/src/core/renderers/canvas/CanvasCoreTexture.ts +2 -6
  153. package/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.ts +2 -2
  154. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +7 -11
  155. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +51 -9
  156. package/src/core/renderers/webgl/shaders/DynamicShader.ts +94 -92
  157. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +2 -2
  158. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +2 -2
  159. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +2 -2
  160. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +2 -2
  161. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +2 -2
  162. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +129 -3
  163. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +7 -15
  164. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +5 -2
  165. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +6 -15
  166. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +6 -2
  167. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +10 -2
  168. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +2 -1
  169. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +6 -15
  170. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +80 -0
  171. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +14 -15
  172. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -2
  173. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -1
  174. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +139 -447
  175. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -3
  176. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +2 -2
  177. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +4 -2
  178. package/src/core/text-rendering/renderers/TextRenderer.ts +3 -2
  179. package/src/core/textures/ColorTexture.ts +1 -1
  180. package/src/core/textures/ImageTexture.ts +1 -1
  181. package/src/core/textures/NoiseTexture.ts +4 -1
  182. package/src/core/textures/SubTexture.ts +7 -7
  183. package/src/core/textures/Texture.ts +46 -3
  184. package/src/core/utils.ts +12 -11
  185. package/src/main-api/DynamicShaderController.ts +104 -0
  186. package/src/main-api/INode.ts +57 -479
  187. package/src/main-api/Inspector.ts +37 -39
  188. package/src/main-api/Renderer.ts +586 -0
  189. package/src/main-api/ShaderController.ts +81 -0
  190. package/src/main-api/utils.ts +45 -0
  191. package/src/utils.ts +8 -0
  192. package/dist/exports/core-api.d.ts +0 -74
  193. package/dist/exports/core-api.js +0 -96
  194. package/dist/exports/core-api.js.map +0 -1
  195. package/dist/exports/main-api.d.ts +0 -30
  196. package/dist/exports/main-api.js +0 -45
  197. package/dist/exports/main-api.js.map +0 -1
  198. package/dist/src/core/CoreExtension.d.ts +0 -12
  199. package/dist/src/core/CoreExtension.js +0 -29
  200. package/dist/src/core/CoreExtension.js.map +0 -1
  201. package/dist/src/core/renderers/SpecificNode.d.ts +0 -1
  202. package/dist/src/core/renderers/SpecificNode.js +0 -19
  203. package/dist/src/core/renderers/SpecificNode.js.map +0 -1
  204. package/dist/src/core/renderers/webgl/newShader/effectsMock.d.ts +0 -13
  205. package/dist/src/core/renderers/webgl/newShader/effectsMock.js +0 -62
  206. package/dist/src/core/renderers/webgl/newShader/effectsMock.js.map +0 -1
  207. package/dist/src/main-api/ICoreDriver.d.ts +0 -24
  208. package/dist/src/main-api/ICoreDriver.js +0 -20
  209. package/dist/src/main-api/ICoreDriver.js.map +0 -1
  210. package/dist/src/main-api/RendererMain.d.ts +0 -378
  211. package/dist/src/main-api/RendererMain.js +0 -367
  212. package/dist/src/main-api/RendererMain.js.map +0 -1
  213. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.d.ts +0 -9
  214. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js +0 -38
  215. package/dist/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.js.map +0 -1
  216. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.d.ts +0 -56
  217. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js +0 -101
  218. package/dist/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.js.map +0 -1
  219. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.d.ts +0 -32
  220. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js +0 -28
  221. package/dist/src/main-api/texture-usage-trackers/TextureUsageTracker.js.map +0 -1
  222. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +0 -21
  223. package/dist/src/render-drivers/main/MainCoreDriver.js +0 -115
  224. package/dist/src/render-drivers/main/MainCoreDriver.js.map +0 -1
  225. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +0 -101
  226. package/dist/src/render-drivers/main/MainOnlyNode.js +0 -425
  227. package/dist/src/render-drivers/main/MainOnlyNode.js.map +0 -1
  228. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -47
  229. package/dist/src/render-drivers/main/MainOnlyTextNode.js +0 -204
  230. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +0 -1
  231. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +0 -93
  232. package/dist/src/render-drivers/threadx/NodeStruct.js +0 -290
  233. package/dist/src/render-drivers/threadx/NodeStruct.js.map +0 -1
  234. package/dist/src/render-drivers/threadx/SharedNode.d.ts +0 -40
  235. package/dist/src/render-drivers/threadx/SharedNode.js +0 -61
  236. package/dist/src/render-drivers/threadx/SharedNode.js.map +0 -1
  237. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +0 -44
  238. package/dist/src/render-drivers/threadx/TextNodeStruct.js +0 -203
  239. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +0 -1
  240. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +0 -25
  241. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +0 -232
  242. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +0 -1
  243. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.d.ts +0 -24
  244. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js +0 -113
  245. package/dist/src/render-drivers/threadx/ThreadXMainAnimationController.js.map +0 -1
  246. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +0 -46
  247. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +0 -160
  248. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +0 -1
  249. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +0 -28
  250. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +0 -55
  251. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +0 -1
  252. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +0 -70
  253. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js +0 -32
  254. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +0 -1
  255. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.d.ts +0 -19
  256. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +0 -184
  257. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +0 -1
  258. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +0 -27
  259. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +0 -109
  260. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +0 -1
  261. package/dist/src/render-drivers/threadx/worker/renderer.d.ts +0 -1
  262. package/dist/src/render-drivers/threadx/worker/renderer.js +0 -147
  263. package/dist/src/render-drivers/threadx/worker/renderer.js.map +0 -1
  264. package/dist/src/render-drivers/utils.d.ts +0 -12
  265. package/dist/src/render-drivers/utils.js +0 -74
  266. package/dist/src/render-drivers/utils.js.map +0 -1
  267. package/exports/core-api.ts +0 -102
  268. package/exports/main-api.ts +0 -62
  269. package/src/core/CoreExtension.ts +0 -32
  270. package/src/main-api/ICoreDriver.ts +0 -68
  271. package/src/main-api/RendererMain.ts +0 -685
  272. package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +0 -45
  273. package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +0 -154
  274. package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +0 -54
  275. package/src/render-drivers/main/MainCoreDriver.ts +0 -159
  276. package/src/render-drivers/main/MainOnlyNode.ts +0 -553
  277. package/src/render-drivers/main/MainOnlyTextNode.ts +0 -261
  278. package/src/render-drivers/threadx/NodeStruct.ts +0 -320
  279. package/src/render-drivers/threadx/SharedNode.ts +0 -101
  280. package/src/render-drivers/threadx/TextNodeStruct.ts +0 -213
  281. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +0 -291
  282. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +0 -135
  283. package/src/render-drivers/threadx/ThreadXMainNode.ts +0 -201
  284. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +0 -85
  285. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +0 -112
  286. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +0 -253
  287. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +0 -151
  288. package/src/render-drivers/threadx/worker/renderer.ts +0 -156
  289. package/src/render-drivers/utils.ts +0 -102
@@ -0,0 +1,586 @@
1
+ /*
2
+ * If not stated otherwise in this file or this component's LICENSE file the
3
+ * following copyright and licenses apply:
4
+ *
5
+ * Copyright 2023 Comcast Cable Communications Management, LLC.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the License);
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+
20
+ /* eslint-disable @typescript-eslint/no-unused-vars */
21
+ import type { EffectMap, ShaderMap } from '../core/CoreShaderManager.js';
22
+ import type {
23
+ ExtractProps,
24
+ TextureTypeMap,
25
+ TextureMap,
26
+ } from '../core/CoreTextureManager.js';
27
+ import { EventEmitter } from '../common/EventEmitter.js';
28
+ import { Inspector } from './Inspector.js';
29
+ import { assertTruthy, isProductionEnvironment } from '../utils.js';
30
+ import { Stage } from '../core/Stage.js';
31
+ import { CoreNode, type CoreNodeProps } from '../core/CoreNode.js';
32
+ import { type CoreTextNodeProps } from '../core/CoreTextNode.js';
33
+ import type {
34
+ BaseShaderController,
35
+ ShaderController,
36
+ } from './ShaderController.js';
37
+ import type { INode, INodeProps, ITextNode, ITextNodeProps } from './INode.js';
38
+ import type {
39
+ DynamicEffects,
40
+ DynamicShaderController,
41
+ } from './DynamicShaderController.js';
42
+ import type {
43
+ EffectDesc,
44
+ EffectDescUnion,
45
+ } from '../core/renderers/webgl/shaders/effects/ShaderEffect.js';
46
+ import type { TextureMemoryManagerSettings } from '../core/TextureMemoryManager.js';
47
+
48
+ /**
49
+ * An immutable reference to a specific Shader type
50
+ *
51
+ * @remarks
52
+ * See {@link ShaderRef} for more details.
53
+ */
54
+ export interface SpecificShaderRef<ShType extends keyof ShaderMap> {
55
+ readonly descType: 'shader';
56
+ readonly shType: ShType;
57
+ readonly props: ExtractProps<ShaderMap[ShType]>;
58
+ }
59
+
60
+ type MapShaderRefs<ShType extends keyof ShaderMap> =
61
+ ShType extends keyof ShaderMap ? SpecificShaderRef<ShType> : never;
62
+
63
+ /**
64
+ * An immutable reference to a Shader
65
+ *
66
+ * @remarks
67
+ * This structure should only be created by the RendererMain's `createShader`
68
+ * method. The structure is immutable and should not be modified once created.
69
+ *
70
+ * A `ShaderRef` exists in the Main API Space and is used to point to an actual
71
+ * `Shader` instance in the Core API Space. The `ShaderRef` is used to
72
+ * communicate with the Core API Space to create, load, and destroy the
73
+ * `Shader` instance.
74
+ *
75
+ * This type is technically a discriminated union of all possible shader types.
76
+ * If you'd like to represent a specific shader type, you can use the
77
+ * `SpecificShaderRef` generic type.
78
+ */
79
+ export type ShaderRef = MapShaderRefs<keyof ShaderMap>;
80
+
81
+ /**
82
+ * Configuration settings for {@link RendererMain}
83
+ */
84
+ export interface RendererMainSettings {
85
+ /**
86
+ * Authored logical pixel width of the application
87
+ *
88
+ * @defaultValue `1920`
89
+ */
90
+ appWidth?: number;
91
+
92
+ /**
93
+ * Authored logical pixel height of the application
94
+ *
95
+ * @defaultValue `1080`
96
+ */
97
+ appHeight?: number;
98
+
99
+ /**
100
+ * Texture Memory Manager Settings
101
+ */
102
+ textureMemory?: Partial<TextureMemoryManagerSettings>;
103
+
104
+ /**
105
+ * Bounds margin to extend the boundary in which a Node is added as Quad.
106
+ */
107
+ boundsMargin?: number | [number, number, number, number];
108
+
109
+ /**
110
+ * Factor to convert app-authored logical coorindates to device logical coordinates
111
+ *
112
+ * @remarks
113
+ * This value allows auto-scaling to support larger/small resolutions than the
114
+ * app was authored for.
115
+ *
116
+ * If the app was authored for 1920x1080 and this value is 2, the app's canvas
117
+ * will be rendered at 3840x2160 logical pixels.
118
+ *
119
+ * Likewise, if the app was authored for 1920x1080 and this value is 0.66667,
120
+ * the app's canvas will be rendered at 1280x720 logical pixels.
121
+ *
122
+ * @defaultValue `1`
123
+ */
124
+ deviceLogicalPixelRatio?: number;
125
+
126
+ /**
127
+ * Factor to convert device logical coordinates to device physical coordinates
128
+ *
129
+ * @remarks
130
+ * This value allows auto-scaling to support devices with different pixel densities.
131
+ *
132
+ * This controls the number of physical pixels that are used to render each logical
133
+ * pixel. For example, if the device has a pixel density of 2, each logical pixel
134
+ * will be rendered using 2x2 physical pixels.
135
+ *
136
+ * By default, it will be set to `window.devicePixelRatio` which is the pixel
137
+ * density of the device the app is running on reported by the browser.
138
+ *
139
+ * @defaultValue `window.devicePixelRatio`
140
+ */
141
+ devicePhysicalPixelRatio?: number;
142
+
143
+ /**
144
+ * RGBA encoded number of the background to use
145
+ *
146
+ * @defaultValue `0x00000000`
147
+ */
148
+ clearColor?: number;
149
+
150
+ /**
151
+ * Interval in milliseconds to receive FPS updates
152
+ *
153
+ * @remarks
154
+ * If set to `0`, FPS updates will be disabled.
155
+ *
156
+ * @defaultValue `0` (disabled)
157
+ */
158
+ fpsUpdateInterval?: number;
159
+
160
+ /**
161
+ * Include context call (i.e. WebGL) information in FPS updates
162
+ *
163
+ * @remarks
164
+ * When enabled the number of calls to each context method over the
165
+ * `fpsUpdateInterval` will be included in the FPS update payload's
166
+ * `contextSpyData` property.
167
+ *
168
+ * Enabling the context spy has a serious impact on performance so only use it
169
+ * when you need to extract context call information.
170
+ *
171
+ * @defaultValue `false` (disabled)
172
+ */
173
+ enableContextSpy?: boolean;
174
+
175
+ /**
176
+ * Number or Image Workers to use
177
+ *
178
+ * @remarks
179
+ * On devices with multiple cores, this can be used to improve image loading
180
+ * as well as reduce the impact of image loading on the main thread.
181
+ * Set to 0 to disable image workers.
182
+ *
183
+ * @defaultValue `2`
184
+ */
185
+ numImageWorkers?: number;
186
+
187
+ /**
188
+ * Enable inspector
189
+ *
190
+ * @remarks
191
+ * When enabled the renderer will spawn a inspector. The inspector will
192
+ * replicate the state of the Nodes created in the renderer and allow
193
+ * inspection of the state of the nodes.
194
+ *
195
+ * @defaultValue `false` (disabled)
196
+ */
197
+ enableInspector?: boolean;
198
+
199
+ /**
200
+ * Renderer mode
201
+ */
202
+ renderMode?: 'webgl' | 'canvas';
203
+ }
204
+
205
+ /**
206
+ * The Renderer Main API
207
+ *
208
+ * @remarks
209
+ * This is the primary class used to configure and operate the Renderer.
210
+ *
211
+ * It is used to create and destroy Nodes, as well as Texture and Shader
212
+ * references.
213
+ *
214
+ * Example:
215
+ * ```ts
216
+ * import { RendererMain, MainCoreDriver } from '@lightningjs/renderer';
217
+ *
218
+ * // Initialize the Renderer
219
+ * const renderer = new RendererMain(
220
+ * {
221
+ * appWidth: 1920,
222
+ * appHeight: 1080
223
+ * },
224
+ * 'app',
225
+ * new MainCoreDriver(),
226
+ * );
227
+ * ```
228
+ *
229
+ * ## Events
230
+ * - `fpsUpdate`
231
+ * - Emitted every `fpsUpdateInterval` milliseconds with the current FPS
232
+ * - `frameTick`
233
+ * - Emitted every frame tick
234
+ * - `idle`
235
+ * - Emitted when the renderer is idle (no changes to the scene
236
+ * graph/animations running)
237
+ * - `criticalCleanup`
238
+ * - Emitted when the Texture Memory Manager Cleanup process is triggered
239
+ * - Payload: { memUsed: number, criticalThreshold: number }
240
+ * - `memUsed` - The amount of memory (in bytes) used by textures before the
241
+ * cleanup process
242
+ * - `criticalThreshold` - The critical threshold (in bytes)
243
+ * - `criticalCleanupFailed`
244
+ * - Emitted when the Texture Memory Manager Cleanup process is unable to free
245
+ * up enough texture memory to reach below the critical threshold.
246
+ * This can happen when there is not enough non-renderable textures to
247
+ * free up.
248
+ * - Payload (object with keys):
249
+ * - `memUsed` - The amount of memory (in bytes) used by textures after
250
+ * the cleanup process
251
+ * - `criticalThreshold` - The critical threshold (in bytes)
252
+ */
253
+ export class RendererMain extends EventEmitter {
254
+ readonly root: INode<ShaderController<'DefaultShader'>>;
255
+ readonly canvas: HTMLCanvasElement;
256
+ readonly settings: Readonly<Required<RendererMainSettings>>;
257
+ readonly stage: Stage;
258
+ private inspector: Inspector | null = null;
259
+
260
+ /**
261
+ * Constructs a new Renderer instance
262
+ *
263
+ * @param settings Renderer settings
264
+ * @param target Element ID or HTMLElement to insert the canvas into
265
+ * @param driver Core Driver to use
266
+ */
267
+ constructor(settings: RendererMainSettings, target: string | HTMLElement) {
268
+ super();
269
+ const resolvedTxSettings: TextureMemoryManagerSettings = {
270
+ criticalThreshold: settings.textureMemory?.criticalThreshold || 124e6,
271
+ targetThresholdLevel: settings.textureMemory?.targetThresholdLevel || 0.5,
272
+ cleanupInterval: settings.textureMemory?.cleanupInterval || 30000,
273
+ debugLogging: settings.textureMemory?.debugLogging || false,
274
+ };
275
+ const resolvedSettings: Required<RendererMainSettings> = {
276
+ appWidth: settings.appWidth || 1920,
277
+ appHeight: settings.appHeight || 1080,
278
+ textureMemory: resolvedTxSettings,
279
+ boundsMargin: settings.boundsMargin || 0,
280
+ deviceLogicalPixelRatio: settings.deviceLogicalPixelRatio || 1,
281
+ devicePhysicalPixelRatio:
282
+ settings.devicePhysicalPixelRatio || window.devicePixelRatio,
283
+ clearColor: settings.clearColor ?? 0x00000000,
284
+ fpsUpdateInterval: settings.fpsUpdateInterval || 0,
285
+ numImageWorkers:
286
+ settings.numImageWorkers !== undefined ? settings.numImageWorkers : 2,
287
+ enableContextSpy: settings.enableContextSpy ?? false,
288
+ enableInspector: settings.enableInspector ?? false,
289
+ renderMode: settings.renderMode ?? 'webgl',
290
+ };
291
+ this.settings = resolvedSettings;
292
+
293
+ const {
294
+ appWidth,
295
+ appHeight,
296
+ deviceLogicalPixelRatio,
297
+ devicePhysicalPixelRatio,
298
+ enableInspector,
299
+ } = resolvedSettings;
300
+
301
+ const deviceLogicalWidth = appWidth * deviceLogicalPixelRatio;
302
+ const deviceLogicalHeight = appHeight * deviceLogicalPixelRatio;
303
+
304
+ const canvas = document.createElement('canvas');
305
+ this.canvas = canvas;
306
+ canvas.width = deviceLogicalWidth * devicePhysicalPixelRatio;
307
+ canvas.height = deviceLogicalHeight * devicePhysicalPixelRatio;
308
+
309
+ canvas.style.width = `${deviceLogicalWidth}px`;
310
+ canvas.style.height = `${deviceLogicalHeight}px`;
311
+
312
+ // Initialize the stage
313
+ this.stage = new Stage({
314
+ appWidth: this.settings.appWidth,
315
+ appHeight: this.settings.appHeight,
316
+ boundsMargin: this.settings.boundsMargin,
317
+ clearColor: this.settings.clearColor,
318
+ canvas: this.canvas,
319
+ deviceLogicalPixelRatio: this.settings.deviceLogicalPixelRatio,
320
+ devicePhysicalPixelRatio: this.settings.devicePhysicalPixelRatio,
321
+ enableContextSpy: this.settings.enableContextSpy,
322
+ fpsUpdateInterval: this.settings.fpsUpdateInterval,
323
+ numImageWorkers: this.settings.numImageWorkers,
324
+ renderMode: this.settings.renderMode,
325
+ textureMemory: resolvedTxSettings,
326
+ eventBus: this,
327
+ });
328
+
329
+ // Extract the root node
330
+ this.root = this.stage.root as unknown as INode<
331
+ ShaderController<'DefaultShader'>
332
+ >;
333
+
334
+ // Get the target element and attach the canvas to it
335
+ let targetEl: HTMLElement | null;
336
+ if (typeof target === 'string') {
337
+ targetEl = document.getElementById(target);
338
+ } else {
339
+ targetEl = target;
340
+ }
341
+
342
+ if (!targetEl) {
343
+ throw new Error('Could not find target element');
344
+ }
345
+
346
+ targetEl.appendChild(canvas);
347
+
348
+ // Initialize inspector (if enabled)
349
+ if (enableInspector && !isProductionEnvironment()) {
350
+ this.inspector = new Inspector(canvas, resolvedSettings);
351
+ }
352
+ }
353
+
354
+ /**
355
+ * Create a new scene graph node
356
+ *
357
+ * @remarks
358
+ * A node is the main graphical building block of the Renderer scene graph. It
359
+ * can be a container for other nodes, or it can be a leaf node that renders a
360
+ * solid color, gradient, image, or specific texture, using a specific shader.
361
+ *
362
+ * To create a text node, see {@link createTextNode}.
363
+ *
364
+ * See {@link CoreNode} for more details.
365
+ *
366
+ * @param props
367
+ * @returns
368
+ */
369
+ createNode<
370
+ ShCtr extends BaseShaderController = ShaderController<'DefaultShader'>,
371
+ >(props: Partial<INodeProps<ShCtr>>): INode<ShCtr> {
372
+ assertTruthy(this.stage, 'Stage is not initialized');
373
+
374
+ const node = this.stage.createNode(props as Partial<CoreNodeProps>);
375
+
376
+ if (this.inspector) {
377
+ return this.inspector.createNode(node) as unknown as INode<ShCtr>;
378
+ }
379
+
380
+ // FIXME onDestroy event? node.once('beforeDestroy'
381
+ // FIXME onCreate event?
382
+ return node as unknown as INode<ShCtr>;
383
+ }
384
+
385
+ /**
386
+ * Create a new scene graph text node
387
+ *
388
+ * @remarks
389
+ * A text node is the second graphical building block of the Renderer scene
390
+ * graph. It renders text using a specific text renderer that is automatically
391
+ * chosen based on the font requested and what type of fonts are installed
392
+ * into an app.
393
+ *
394
+ * See {@link ITextNode} for more details.
395
+ *
396
+ * @param props
397
+ * @returns
398
+ */
399
+ createTextNode(props: Partial<ITextNodeProps>): ITextNode {
400
+ const textNode = this.stage.createTextNode(props as CoreTextNodeProps);
401
+
402
+ if (this.inspector) {
403
+ return this.inspector.createTextNode(textNode);
404
+ }
405
+
406
+ return textNode as unknown as ITextNode;
407
+ }
408
+
409
+ /**
410
+ * Destroy a node
411
+ *
412
+ * @remarks
413
+ * This method destroys a node
414
+ *
415
+ * @param node
416
+ * @returns
417
+ */
418
+ destroyNode(node: INode) {
419
+ if (this.inspector) {
420
+ this.inspector.destroyNode(node.id);
421
+ }
422
+
423
+ return node.destroy();
424
+ }
425
+
426
+ /**
427
+ * Create a new texture reference
428
+ *
429
+ * @remarks
430
+ * This method creates a new reference to a texture. The texture is not
431
+ * loaded until it is used on a node.
432
+ *
433
+ * It can be assigned to a node's `texture` property, or it can be used
434
+ * when creating a SubTexture.
435
+ *
436
+ * @param textureType
437
+ * @param props
438
+ * @param options
439
+ * @returns
440
+ */
441
+ createTexture<TxType extends keyof TextureTypeMap>(
442
+ textureType: TxType,
443
+ props: ExtractProps<TextureTypeMap[TxType]>,
444
+ ): TextureMap[TxType] {
445
+ return this.stage.txManager.loadTexture(
446
+ textureType,
447
+ props,
448
+ ) as TextureMap[TxType];
449
+ }
450
+
451
+ /**
452
+ * Create a new shader controller for a shader type
453
+ *
454
+ * @remarks
455
+ * This method creates a new Shader Controller for a specific shader type.
456
+ *
457
+ * If the shader has not been loaded yet, it will be loaded. Otherwise, the
458
+ * existing shader will be reused.
459
+ *
460
+ * It can be assigned to a Node's `shader` property.
461
+ *
462
+ * @param shaderType
463
+ * @param props
464
+ * @returns
465
+ */
466
+ createShader<ShType extends keyof ShaderMap>(
467
+ shaderType: ShType,
468
+ props?: ExtractProps<ShaderMap[ShType]>,
469
+ ): ShaderController<ShType> {
470
+ return this.stage.shManager.loadShader(shaderType, props);
471
+ }
472
+
473
+ /**
474
+ * Create a new Dynamic Shader controller
475
+ *
476
+ * @remarks
477
+ * A Dynamic Shader is a shader that can be composed of an array of mulitple
478
+ * effects. Each effect can be animated or changed after creation (provided
479
+ * the effect is given a name).
480
+ *
481
+ * Example:
482
+ * ```ts
483
+ * renderer.createNode({
484
+ * shader: renderer.createDynamicShader([
485
+ * renderer.createEffect('radius', {
486
+ * radius: 0
487
+ * }, 'effect1'),
488
+ * renderer.createEffect('border', {
489
+ * color: 0xff00ffff,
490
+ * width: 10,
491
+ * }, 'effect2'),
492
+ * ]),
493
+ * });
494
+ * ```
495
+ *
496
+ * @param effects
497
+ * @returns
498
+ */
499
+ createDynamicShader<
500
+ T extends DynamicEffects<[...{ name?: string; type: keyof EffectMap }[]]>,
501
+ >(effects: [...T]): DynamicShaderController<T> {
502
+ return this.stage.shManager.loadDynamicShader({
503
+ effects: effects as EffectDescUnion[],
504
+ });
505
+ }
506
+
507
+ /**
508
+ * Create an effect to be used in a Dynamic Shader
509
+ *
510
+ * @remark
511
+ * The {name} parameter is optional but required if you want to animate the effect
512
+ * or change the effect's properties after creation.
513
+ *
514
+ * See {@link createDynamicShader} for an example.
515
+ *
516
+ * @param type
517
+ * @param props
518
+ * @param name
519
+ * @returns
520
+ */
521
+ createEffect<
522
+ Type extends keyof EffectMap,
523
+ Name extends string | undefined = undefined,
524
+ >(
525
+ type: Type,
526
+ props: EffectDesc<{ name: Name; type: Type }>['props'],
527
+ name?: Name,
528
+ ): EffectDesc<{ name: Name; type: Type }> {
529
+ return {
530
+ name,
531
+ type,
532
+ props,
533
+ };
534
+ }
535
+
536
+ /**
537
+ * Get a Node by its ID
538
+ *
539
+ * @param id
540
+ * @returns
541
+ */
542
+ getNodeById(id: number): CoreNode | null {
543
+ const root = this.stage?.root;
544
+ if (!root) {
545
+ return null;
546
+ }
547
+
548
+ const findNode = (node: CoreNode): CoreNode | null => {
549
+ if (node.id === id) {
550
+ return node;
551
+ }
552
+
553
+ for (const child of node.children) {
554
+ const found = findNode(child);
555
+ if (found) {
556
+ return found;
557
+ }
558
+ }
559
+
560
+ return null;
561
+ };
562
+
563
+ return findNode(root);
564
+ }
565
+
566
+ toggleFreeze() {
567
+ throw new Error('Not implemented');
568
+ }
569
+
570
+ advanceFrame() {
571
+ throw new Error('Not implemented');
572
+ }
573
+
574
+ /**
575
+ * Re-render the current frame without advancing any running animations.
576
+ *
577
+ * @remarks
578
+ * Any state changes will be reflected in the re-rendered frame. Useful for
579
+ * debugging.
580
+ *
581
+ * May not do anything if the render loop is running on a separate worker.
582
+ */
583
+ rerender() {
584
+ throw new Error('Not implemented');
585
+ }
586
+ }
@@ -0,0 +1,81 @@
1
+ /*
2
+ * If not stated otherwise in this file or this component's LICENSE file the
3
+ * following copyright and licenses apply:
4
+ *
5
+ * Copyright 2024 Comcast Cable Communications Management, LLC.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the License);
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+ /* eslint-disable @typescript-eslint/no-explicit-any */
20
+ import type { ShaderMap } from '../core/CoreShaderManager.js';
21
+ import type { ExtractProps } from '../core/CoreTextureManager.js';
22
+ import type { Stage } from '../core/Stage.js';
23
+ import type { CoreShader } from '../core/renderers/CoreShader.js';
24
+
25
+ /**
26
+ * Shader Controller Base Interface
27
+ *
28
+ * @remarks
29
+ * Used directly this interface is like an `any` type for Shader Controllers.
30
+ * But it is also used as a base for more specific Shader Controller interfaces.
31
+ */
32
+ export interface BaseShaderController {
33
+ type: keyof ShaderMap;
34
+ shader: CoreShader;
35
+ props: Record<string, any>;
36
+ getResolvedProps: () => Record<string, any>;
37
+ }
38
+
39
+ /**
40
+ * Shader Controller Class
41
+ *
42
+ * @remarks
43
+ * This class is used to control shader props.
44
+ */
45
+
46
+ export class ShaderController<S extends keyof ShaderMap>
47
+ implements BaseShaderController
48
+ {
49
+ private resolvedProps: ExtractProps<ShaderMap[S]>;
50
+ props: ExtractProps<ShaderMap[S]>;
51
+ constructor(
52
+ readonly type: S,
53
+ readonly shader: InstanceType<ShaderMap[S]>,
54
+ props: ExtractProps<ShaderMap[S]>,
55
+ stage: Stage,
56
+ ) {
57
+ this.resolvedProps = props;
58
+
59
+ const keys = Object.keys(props);
60
+ const l = keys.length;
61
+
62
+ const definedProps = {};
63
+ for (let i = 0; i < l; i++) {
64
+ const name = keys[i]!;
65
+ Object.defineProperty(definedProps, name, {
66
+ get: () => {
67
+ return this.resolvedProps[name as keyof ExtractProps<ShaderMap[S]>];
68
+ },
69
+ set: (value) => {
70
+ this.resolvedProps[name as keyof ExtractProps<ShaderMap[S]>] = value;
71
+ stage.requestRender();
72
+ },
73
+ });
74
+ }
75
+ this.props = definedProps as ExtractProps<ShaderMap[S]>;
76
+ }
77
+
78
+ getResolvedProps() {
79
+ return this.resolvedProps;
80
+ }
81
+ }
@@ -0,0 +1,45 @@
1
+ import type { CustomDataMap } from '../core/CoreNode.js';
2
+
3
+ export function santizeCustomDataMap(d: CustomDataMap): CustomDataMap {
4
+ const validTypes = {
5
+ boolean: true,
6
+ string: true,
7
+ number: true,
8
+ undefined: true,
9
+ };
10
+
11
+ const keys = Object.keys(d);
12
+ for (let i = 0; i < keys.length; i++) {
13
+ const key = keys[i];
14
+ if (!key) {
15
+ continue;
16
+ }
17
+
18
+ const value = d[key];
19
+ const valueType = typeof value;
20
+
21
+ // Typescript doesn't understand the above const valueType ¯\_(ツ)_/¯
22
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
23
+ // @ts-ignore-next-line
24
+ if (valueType === 'string' && value.length > 2048) {
25
+ console.warn(
26
+ `Custom Data value for ${key} is too long, it will be truncated to 2048 characters`,
27
+ );
28
+
29
+ // same here, see above comment, this can only be a string at this point
30
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
31
+ // @ts-ignore-next-line
32
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
33
+ d[key] = value.substring(0, 2048);
34
+ }
35
+
36
+ if (!validTypes[valueType as keyof typeof validTypes]) {
37
+ console.warn(
38
+ `Custom Data value for ${key} is not a boolean, string, or number, it will be ignored`,
39
+ );
40
+ delete d[key];
41
+ }
42
+ }
43
+
44
+ return d;
45
+ }