@adaas/a-frame 0.0.22 → 0.1.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 (379) hide show
  1. package/.conf/tsconfig.browser.json +13 -0
  2. package/.conf/tsconfig.node.json +14 -0
  3. package/.env.example +12 -0
  4. package/dist/browser/A-FrameBrowserStorageBlobs.context-OEQr85oq.d.mts +40 -0
  5. package/dist/browser/A-FrameBundle.types-DaaUvViw.d.mts +33 -0
  6. package/dist/browser/A-FrameChannel.types-DWOEUs28.d.mts +142 -0
  7. package/dist/browser/A-FrameDefinition.entity-DWGN_Ujr.d.mts +329 -0
  8. package/dist/browser/A-FrameDynamicStructure.entity-DaBgSRCR.d.mts +188 -0
  9. package/dist/browser/A-FrameLogger.component.env-browser-BIPAP4oQ.d.mts +112 -0
  10. package/dist/browser/A-FrameNamespace.entity-rCm1AavP.d.mts +125 -0
  11. package/dist/browser/bundle.d.mts +8 -0
  12. package/dist/browser/bundle.mjs +2 -0
  13. package/dist/browser/bundle.mjs.map +1 -0
  14. package/dist/browser/channel.d.mts +165 -0
  15. package/dist/browser/channel.mjs +3 -0
  16. package/dist/browser/channel.mjs.map +1 -0
  17. package/dist/browser/chunk-5TTVFB3G.mjs +2 -0
  18. package/dist/browser/chunk-5TTVFB3G.mjs.map +1 -0
  19. package/dist/browser/chunk-AYN7KUQT.mjs +3 -0
  20. package/dist/browser/chunk-AYN7KUQT.mjs.map +1 -0
  21. package/dist/browser/chunk-DMGQW3AO.mjs +2 -0
  22. package/dist/browser/chunk-DMGQW3AO.mjs.map +1 -0
  23. package/dist/browser/chunk-G66IL2DR.mjs +2 -0
  24. package/dist/browser/chunk-G66IL2DR.mjs.map +1 -0
  25. package/dist/browser/chunk-GOADBDTE.mjs +2 -0
  26. package/dist/browser/chunk-GOADBDTE.mjs.map +1 -0
  27. package/dist/browser/chunk-H6OZP4ZV.mjs +2 -0
  28. package/dist/browser/chunk-H6OZP4ZV.mjs.map +1 -0
  29. package/dist/browser/chunk-INS7RO3B.mjs +2 -0
  30. package/dist/browser/chunk-INS7RO3B.mjs.map +1 -0
  31. package/dist/browser/chunk-K4MZY4ME.mjs +2 -0
  32. package/dist/browser/chunk-K4MZY4ME.mjs.map +1 -0
  33. package/dist/browser/chunk-OFKV5GNB.mjs +3 -0
  34. package/dist/browser/chunk-OFKV5GNB.mjs.map +1 -0
  35. package/dist/browser/chunk-QATIN7CO.mjs +3 -0
  36. package/dist/browser/chunk-QATIN7CO.mjs.map +1 -0
  37. package/dist/browser/chunk-QBBQ37P3.mjs +2 -0
  38. package/dist/browser/chunk-QBBQ37P3.mjs.map +1 -0
  39. package/dist/browser/chunk-VDVJWU5T.mjs +2 -0
  40. package/dist/browser/chunk-VDVJWU5T.mjs.map +1 -0
  41. package/dist/browser/chunk-X3C4I6YJ.mjs +2 -0
  42. package/dist/browser/chunk-X3C4I6YJ.mjs.map +1 -0
  43. package/dist/browser/chunk-YQJFTBGV.mjs +3 -0
  44. package/dist/browser/chunk-YQJFTBGV.mjs.map +1 -0
  45. package/dist/browser/chunk-ZVCTU2DN.mjs +3 -0
  46. package/dist/browser/chunk-ZVCTU2DN.mjs.map +1 -0
  47. package/dist/browser/core.d.mts +97 -0
  48. package/dist/browser/core.mjs +2 -0
  49. package/dist/browser/core.mjs.map +1 -0
  50. package/dist/browser/crypto.d.mts +35 -0
  51. package/dist/browser/crypto.mjs +2 -0
  52. package/dist/browser/crypto.mjs.map +1 -0
  53. package/dist/browser/definition.d.mts +13 -0
  54. package/dist/browser/definition.mjs +2 -0
  55. package/dist/browser/definition.mjs.map +1 -0
  56. package/dist/browser/dynamic-feature.d.mts +10 -0
  57. package/dist/browser/dynamic-feature.mjs +2 -0
  58. package/dist/browser/dynamic-feature.mjs.map +1 -0
  59. package/dist/browser/dynamic-structure.d.mts +12 -0
  60. package/dist/browser/dynamic-structure.mjs +2 -0
  61. package/dist/browser/dynamic-structure.mjs.map +1 -0
  62. package/dist/browser/env.d.mts +2 -0
  63. package/dist/browser/env.mjs +2 -0
  64. package/dist/browser/env.mjs.map +1 -0
  65. package/dist/browser/frame-index.d.mts +95 -0
  66. package/dist/browser/frame-index.mjs +2 -0
  67. package/dist/browser/frame-index.mjs.map +1 -0
  68. package/dist/browser/index.browser-CZlhzfSP.d.mts +22 -0
  69. package/dist/browser/index.d.mts +1 -144
  70. package/dist/browser/index.mjs +1 -1
  71. package/dist/browser/index.mjs.map +1 -1
  72. package/dist/browser/logger.d.mts +41 -0
  73. package/dist/browser/logger.mjs +2 -0
  74. package/dist/browser/logger.mjs.map +1 -0
  75. package/dist/browser/namespace.d.mts +13 -0
  76. package/dist/browser/namespace.mjs +2 -0
  77. package/dist/browser/namespace.mjs.map +1 -0
  78. package/dist/browser/storage.d.mts +194 -0
  79. package/dist/browser/storage.mjs +2 -0
  80. package/dist/browser/storage.mjs.map +1 -0
  81. package/dist/browser/vector.d.mts +15 -0
  82. package/dist/browser/vector.mjs +2 -0
  83. package/dist/browser/vector.mjs.map +1 -0
  84. package/dist/index.cjs +0 -0
  85. package/dist/node/A-FrameChannel.component-BfBcs734.d.ts +62 -0
  86. package/dist/node/A-FrameChannel.component-NNKcFViw.d.mts +62 -0
  87. package/dist/node/A-FrameChannel.types-DQF-IiRq.d.mts +146 -0
  88. package/dist/node/A-FrameChannel.types-DQF-IiRq.d.ts +146 -0
  89. package/dist/node/A-FrameDefinition.entity-CAUOdEvU.d.ts +329 -0
  90. package/dist/node/A-FrameDefinition.entity-DWGN_Ujr.d.mts +329 -0
  91. package/dist/node/A-FrameDynamicStructure.entity-DaBgSRCR.d.mts +188 -0
  92. package/dist/node/A-FrameDynamicStructure.entity-DaBgSRCR.d.ts +188 -0
  93. package/dist/node/A-FrameNamespace.entity-D3fZBGDx.d.ts +125 -0
  94. package/dist/node/A-FrameNamespace.entity-rCm1AavP.d.mts +125 -0
  95. package/dist/node/A-FrameStorage.component-BYjHfHJJ.d.mts +107 -0
  96. package/dist/node/A-FrameStorage.component-CT01fs-t.d.ts +107 -0
  97. package/dist/node/bundle.cjs +101 -0
  98. package/dist/node/bundle.cjs.map +1 -0
  99. package/dist/node/bundle.d.mts +69 -0
  100. package/dist/node/bundle.d.ts +69 -0
  101. package/dist/node/bundle.mjs +76 -0
  102. package/dist/node/bundle.mjs.map +1 -0
  103. package/dist/node/channel.cjs +60 -0
  104. package/dist/node/channel.cjs.map +1 -0
  105. package/dist/node/channel.d.mts +61 -0
  106. package/dist/node/channel.d.ts +61 -0
  107. package/dist/node/channel.mjs +11 -0
  108. package/dist/node/channel.mjs.map +1 -0
  109. package/dist/node/chunk-3LOMGNWA.cjs +8 -0
  110. package/dist/node/chunk-3LOMGNWA.cjs.map +1 -0
  111. package/dist/node/chunk-3ONWH75E.mjs +257 -0
  112. package/dist/node/chunk-3ONWH75E.mjs.map +1 -0
  113. package/dist/node/chunk-3TD2PEDZ.mjs +53 -0
  114. package/dist/node/chunk-3TD2PEDZ.mjs.map +1 -0
  115. package/dist/node/chunk-442DXGOD.mjs +16 -0
  116. package/dist/node/chunk-442DXGOD.mjs.map +1 -0
  117. package/dist/node/chunk-5BKCX2RO.mjs +33 -0
  118. package/dist/node/chunk-5BKCX2RO.mjs.map +1 -0
  119. package/dist/node/chunk-6EFXNUL4.mjs +6 -0
  120. package/dist/node/chunk-6EFXNUL4.mjs.map +1 -0
  121. package/dist/node/chunk-6KAGWGTE.mjs +529 -0
  122. package/dist/node/chunk-6KAGWGTE.mjs.map +1 -0
  123. package/dist/node/chunk-7A6XGT5J.cjs +541 -0
  124. package/dist/node/chunk-7A6XGT5J.cjs.map +1 -0
  125. package/dist/node/chunk-AOQRXZPC.mjs +207 -0
  126. package/dist/node/chunk-AOQRXZPC.mjs.map +1 -0
  127. package/dist/node/chunk-APRYHBEF.mjs +171 -0
  128. package/dist/node/chunk-APRYHBEF.mjs.map +1 -0
  129. package/dist/node/chunk-B7BXP7K4.mjs +253 -0
  130. package/dist/node/chunk-B7BXP7K4.mjs.map +1 -0
  131. package/dist/node/chunk-B7ZDJXD3.cjs +35 -0
  132. package/dist/node/chunk-B7ZDJXD3.cjs.map +1 -0
  133. package/dist/node/chunk-CP6JHUU6.cjs +541 -0
  134. package/dist/node/chunk-CP6JHUU6.cjs.map +1 -0
  135. package/dist/node/chunk-DDCEMKBP.mjs +655 -0
  136. package/dist/node/chunk-DDCEMKBP.mjs.map +1 -0
  137. package/dist/node/chunk-DMY44VUG.mjs +655 -0
  138. package/dist/node/chunk-DMY44VUG.mjs.map +1 -0
  139. package/dist/node/chunk-F46TSY2K.cjs +541 -0
  140. package/dist/node/chunk-F46TSY2K.cjs.map +1 -0
  141. package/dist/node/chunk-F4UCOZW5.mjs +33 -0
  142. package/dist/node/chunk-F4UCOZW5.mjs.map +1 -0
  143. package/dist/node/chunk-GBTFMT3K.cjs +256 -0
  144. package/dist/node/chunk-GBTFMT3K.cjs.map +1 -0
  145. package/dist/node/chunk-GNVXVK2B.cjs +8 -0
  146. package/dist/node/chunk-GNVXVK2B.cjs.map +1 -0
  147. package/dist/node/chunk-GRR6NNWY.cjs +688 -0
  148. package/dist/node/chunk-GRR6NNWY.cjs.map +1 -0
  149. package/dist/node/chunk-IIVYTS5M.mjs +239 -0
  150. package/dist/node/chunk-IIVYTS5M.mjs.map +1 -0
  151. package/dist/node/chunk-JQBYDEMW.mjs +33 -0
  152. package/dist/node/chunk-JQBYDEMW.mjs.map +1 -0
  153. package/dist/node/chunk-K4MZY4ME.mjs +3 -0
  154. package/dist/node/chunk-K4MZY4ME.mjs.map +1 -0
  155. package/dist/node/chunk-KK64VLZN.cjs +4 -0
  156. package/dist/node/chunk-KK64VLZN.cjs.map +1 -0
  157. package/dist/node/chunk-KLG6HKFU.cjs +175 -0
  158. package/dist/node/chunk-KLG6HKFU.cjs.map +1 -0
  159. package/dist/node/chunk-LJIZ47HO.cjs +688 -0
  160. package/dist/node/chunk-LJIZ47HO.cjs.map +1 -0
  161. package/dist/node/chunk-NIXKAQVP.cjs +35 -0
  162. package/dist/node/chunk-NIXKAQVP.cjs.map +1 -0
  163. package/dist/node/chunk-OI76LHVT.mjs +21 -0
  164. package/dist/node/chunk-OI76LHVT.mjs.map +1 -0
  165. package/dist/node/chunk-OJGCQNAH.mjs +529 -0
  166. package/dist/node/chunk-OJGCQNAH.mjs.map +1 -0
  167. package/dist/node/chunk-OYC6L5NX.mjs +6 -0
  168. package/dist/node/chunk-OYC6L5NX.mjs.map +1 -0
  169. package/dist/node/chunk-QFHZIG7Y.cjs +25 -0
  170. package/dist/node/chunk-QFHZIG7Y.cjs.map +1 -0
  171. package/dist/node/chunk-QFUZVN4Y.cjs +259 -0
  172. package/dist/node/chunk-QFUZVN4Y.cjs.map +1 -0
  173. package/dist/node/chunk-R2H234YO.cjs +8 -0
  174. package/dist/node/chunk-R2H234YO.cjs.map +1 -0
  175. package/dist/node/chunk-RRLTGGM7.cjs +209 -0
  176. package/dist/node/chunk-RRLTGGM7.cjs.map +1 -0
  177. package/dist/node/chunk-SDKIJDMH.mjs +655 -0
  178. package/dist/node/chunk-SDKIJDMH.mjs.map +1 -0
  179. package/dist/node/chunk-TO4BPKCY.mjs +6 -0
  180. package/dist/node/chunk-TO4BPKCY.mjs.map +1 -0
  181. package/dist/node/chunk-UKKCN7CQ.cjs +688 -0
  182. package/dist/node/chunk-UKKCN7CQ.cjs.map +1 -0
  183. package/dist/node/chunk-UPA7VN4R.mjs +153 -0
  184. package/dist/node/chunk-UPA7VN4R.mjs.map +1 -0
  185. package/dist/node/chunk-UTJ7CVVB.cjs +248 -0
  186. package/dist/node/chunk-UTJ7CVVB.cjs.map +1 -0
  187. package/dist/node/chunk-XFUF7SDO.cjs +35 -0
  188. package/dist/node/chunk-XFUF7SDO.cjs.map +1 -0
  189. package/dist/node/chunk-YVX4W6SI.cjs +155 -0
  190. package/dist/node/chunk-YVX4W6SI.cjs.map +1 -0
  191. package/dist/node/chunk-YWWGJ6EJ.cjs +55 -0
  192. package/dist/node/chunk-YWWGJ6EJ.cjs.map +1 -0
  193. package/dist/node/chunk-Z4HUCRK2.mjs +529 -0
  194. package/dist/node/chunk-Z4HUCRK2.mjs.map +1 -0
  195. package/dist/node/chunk-ZM2RLVVH.cjs +18 -0
  196. package/dist/node/chunk-ZM2RLVVH.cjs.map +1 -0
  197. package/dist/node/core.cjs +259 -0
  198. package/dist/node/core.cjs.map +1 -0
  199. package/dist/node/core.d.mts +76 -0
  200. package/dist/node/core.d.ts +76 -0
  201. package/dist/node/core.mjs +248 -0
  202. package/dist/node/core.mjs.map +1 -0
  203. package/dist/node/crypto.cjs +13 -0
  204. package/dist/node/crypto.cjs.map +1 -0
  205. package/dist/node/crypto.d.mts +44 -0
  206. package/dist/node/crypto.d.ts +44 -0
  207. package/dist/node/crypto.mjs +4 -0
  208. package/dist/node/crypto.mjs.map +1 -0
  209. package/dist/node/definition.cjs +19 -0
  210. package/dist/node/definition.cjs.map +1 -0
  211. package/dist/node/definition.d.mts +13 -0
  212. package/dist/node/definition.d.ts +13 -0
  213. package/dist/node/definition.mjs +6 -0
  214. package/dist/node/definition.mjs.map +1 -0
  215. package/dist/node/dynamic-feature.cjs +14 -0
  216. package/dist/node/dynamic-feature.cjs.map +1 -0
  217. package/dist/node/dynamic-feature.d.mts +10 -0
  218. package/dist/node/dynamic-feature.d.ts +10 -0
  219. package/dist/node/dynamic-feature.mjs +12 -0
  220. package/dist/node/dynamic-feature.mjs.map +1 -0
  221. package/dist/node/dynamic-structure.cjs +143 -0
  222. package/dist/node/dynamic-structure.cjs.map +1 -0
  223. package/dist/node/dynamic-structure.d.mts +12 -0
  224. package/dist/node/dynamic-structure.d.ts +12 -0
  225. package/dist/node/dynamic-structure.mjs +138 -0
  226. package/dist/node/dynamic-structure.mjs.map +1 -0
  227. package/dist/node/env.cjs +14 -0
  228. package/dist/node/env.cjs.map +1 -0
  229. package/dist/node/env.d.mts +22 -0
  230. package/dist/node/env.d.ts +22 -0
  231. package/dist/node/env.mjs +5 -0
  232. package/dist/node/env.mjs.map +1 -0
  233. package/dist/node/frame-index.cjs +16 -0
  234. package/dist/node/frame-index.cjs.map +1 -0
  235. package/dist/node/frame-index.d.mts +95 -0
  236. package/dist/node/frame-index.d.ts +95 -0
  237. package/dist/node/frame-index.mjs +7 -0
  238. package/dist/node/frame-index.mjs.map +1 -0
  239. package/dist/node/index.cjs +0 -288
  240. package/dist/node/index.cjs.map +1 -1
  241. package/dist/node/index.d.mts +1 -144
  242. package/dist/node/index.d.ts +1 -144
  243. package/dist/node/index.mjs +0 -284
  244. package/dist/node/index.mjs.map +1 -1
  245. package/dist/node/logger.cjs +41 -0
  246. package/dist/node/logger.cjs.map +1 -0
  247. package/dist/node/logger.d.mts +150 -0
  248. package/dist/node/logger.d.ts +150 -0
  249. package/dist/node/logger.mjs +4 -0
  250. package/dist/node/logger.mjs.map +1 -0
  251. package/dist/node/namespace.cjs +24 -0
  252. package/dist/node/namespace.cjs.map +1 -0
  253. package/dist/node/namespace.d.mts +13 -0
  254. package/dist/node/namespace.d.ts +13 -0
  255. package/dist/node/namespace.mjs +7 -0
  256. package/dist/node/namespace.mjs.map +1 -0
  257. package/dist/node/storage.cjs +42 -0
  258. package/dist/node/storage.cjs.map +1 -0
  259. package/dist/node/storage.d.mts +110 -0
  260. package/dist/node/storage.d.ts +110 -0
  261. package/dist/node/storage.mjs +13 -0
  262. package/dist/node/storage.mjs.map +1 -0
  263. package/dist/node/vector.cjs +13 -0
  264. package/dist/node/vector.cjs.map +1 -0
  265. package/dist/node/vector.d.mts +15 -0
  266. package/dist/node/vector.d.ts +15 -0
  267. package/dist/node/vector.mjs +4 -0
  268. package/dist/node/vector.mjs.map +1 -0
  269. package/jest.config.browser.ts +41 -0
  270. package/jest.config.ts +18 -8
  271. package/package.json +125 -13
  272. package/{index.ts → src/concept.ts} +5 -2
  273. package/src/helpers/Hash.helper.ts +14 -0
  274. package/src/index.ts +0 -24
  275. package/src/lib/A-Frame/A-Frame.component.env-browser.ts +126 -0
  276. package/src/lib/A-Frame/A-Frame.component.env-node.ts +105 -0
  277. package/src/lib/A-Frame/A-Frame.component.ts +62 -0
  278. package/src/lib/A-Frame/A-Frame.context.ts +40 -0
  279. package/src/lib/{components/Index.component.ts/Index.error.ts → A-Frame/A-Frame.error.ts} +1 -1
  280. package/src/lib/{components/Index.component.ts/Index.guard.ts → A-Frame/A-Frame.guard.ts} +9 -6
  281. package/src/lib/A-Frame/A-Frame.meta.ts +27 -0
  282. package/src/lib/{components/Index.component.ts/Index.types.ts → A-Frame/A-Frame.types.ts} +52 -17
  283. package/src/lib/A-Frame/decorators/A-FrameDefine.decorator.ts +104 -0
  284. package/src/lib/A-Frame/decorators/A-FrameNamespace.decorator.ts +33 -0
  285. package/src/lib/A-Frame/index.browser.ts +10 -0
  286. package/src/lib/A-Frame/index.ts +10 -0
  287. package/src/lib/A-FrameBundle/A-FrameBundle.builder.env-node.ts +95 -0
  288. package/src/lib/A-FrameBundle/A-FrameBundle.constants.ts +5 -0
  289. package/src/lib/A-FrameBundle/A-FrameBundle.types.ts +31 -0
  290. package/src/lib/A-FrameBundle/index.browser.ts +6 -0
  291. package/src/lib/A-FrameBundle/index.ts +7 -0
  292. package/src/lib/A-FrameCLI/A-FrameCLI.container.ts +333 -0
  293. package/src/lib/A-FrameChannel/A-FrameChannel.component.env-browser.ts +63 -0
  294. package/src/lib/A-FrameChannel/A-FrameChannel.component.env-node.ts +586 -0
  295. package/src/lib/A-FrameChannel/A-FrameChannel.component.ts +273 -0
  296. package/src/lib/A-FrameChannel/A-FrameChannel.constants.ts +39 -0
  297. package/src/lib/A-FrameChannel/A-FrameChannel.error.ts +10 -0
  298. package/src/lib/A-FrameChannel/A-FrameChannel.types.ts +143 -0
  299. package/src/lib/A-FrameChannel/A-FrameChannelEvent.context.ts +28 -0
  300. package/src/lib/A-FrameChannel/A-FrameChannelRequest.context.ts +36 -0
  301. package/src/lib/A-FrameChannel/A-FrameChannelSocket.entity.ts +189 -0
  302. package/src/lib/A-FrameChannel/A-FrameChannelStream.entity.ts +144 -0
  303. package/src/lib/A-FrameChannel/index.browser.ts +3 -0
  304. package/src/lib/A-FrameChannel/index.ts +10 -0
  305. package/src/lib/A-FrameCrypto/A-FrameCrypto.component.env-browser.ts +123 -0
  306. package/src/lib/A-FrameCrypto/A-FrameCrypto.component.env-node.ts +204 -0
  307. package/src/lib/A-FrameCrypto/index.browser.ts +1 -0
  308. package/src/lib/A-FrameCrypto/index.ts +1 -0
  309. package/src/lib/A-FrameDefinition/A-FrameDefinition.constants.ts +8 -0
  310. package/src/lib/A-FrameDefinition/A-FrameDefinition.entity.ts +290 -0
  311. package/src/lib/A-FrameDefinition/A-FrameDefinition.types.ts +109 -0
  312. package/src/lib/A-FrameDefinition/index.ts +3 -0
  313. package/src/lib/A-FrameDynamicFeature/A-FrameDynamicFeature.entity.ts +13 -0
  314. package/src/lib/A-FrameDynamicFeature/A-FrameDynamicFeature.types.ts +10 -0
  315. package/src/lib/A-FrameDynamicFeature/index.ts +2 -0
  316. package/src/lib/A-FrameDynamicPatch/A-FrameDynamicPatch.entity.ts +38 -0
  317. package/src/lib/A-FrameDynamicPatch/A-FrameDynamicPatch.types.ts +20 -0
  318. package/src/lib/A-FrameDynamicSession/A-FrameDynamicSession.constants.ts +9 -0
  319. package/src/lib/A-FrameDynamicSession/A-FrameDynamicSession.entity.ts +91 -0
  320. package/src/lib/A-FrameDynamicSession/A-FrameDynamicSession.types.ts +18 -0
  321. package/src/lib/A-FrameDynamicStructure/A-FrameDynamicStructure.constants.ts +13 -0
  322. package/src/lib/A-FrameDynamicStructure/A-FrameDynamicStructure.entity.ts +187 -0
  323. package/src/lib/A-FrameDynamicStructure/A-FrameDynamicStructure.error.ts +13 -0
  324. package/src/lib/A-FrameDynamicStructure/A-FrameDynamicStructure.types.ts +128 -0
  325. package/src/lib/A-FrameDynamicStructure/A-FrameDynamicStructureOperation.context.ts +32 -0
  326. package/src/lib/A-FrameDynamicStructure/index.ts +5 -0
  327. package/src/lib/A-FrameEnv/A-FrameEnv.fragment.env-browser.ts +31 -0
  328. package/src/lib/A-FrameEnv/A-FrameEnv.fragment.env-node.ts +39 -0
  329. package/src/lib/A-FrameEnv/A-FrameEnv.types.ts +7 -0
  330. package/src/lib/A-FrameEnv/index.browser.ts +1 -0
  331. package/src/lib/A-FrameEnv/index.ts +1 -0
  332. package/src/lib/A-FrameIndex/A-FrameIndex.context.ts +321 -0
  333. package/src/lib/A-FrameIndex/A-FrameIndex.types.ts +63 -0
  334. package/src/lib/A-FrameIndex/index.browser.ts +3 -0
  335. package/src/lib/A-FrameIndex/index.ts +3 -0
  336. package/src/lib/A-FrameLogger/A-FrameLogger.component.env-browser.ts +99 -0
  337. package/src/lib/A-FrameLogger/A-FrameLogger.component.env-node.ts +129 -0
  338. package/src/lib/A-FrameLogger/A-FrameLogger.component.ts +123 -0
  339. package/src/lib/A-FrameLogger/A-FrameLogger.constants.ts +66 -0
  340. package/src/lib/A-FrameLogger/A-FrameLogger.types.ts +67 -0
  341. package/src/lib/A-FrameLogger/index.browser.ts +4 -0
  342. package/src/lib/A-FrameLogger/index.ts +4 -0
  343. package/src/lib/A-FrameNamespace/A-FrameNamespace.constants.ts +12 -0
  344. package/src/lib/A-FrameNamespace/A-FrameNamespace.entity.ts +211 -0
  345. package/src/lib/A-FrameNamespace/A-FrameNamespace.types.ts +72 -0
  346. package/src/lib/A-FrameNamespace/index.ts +3 -0
  347. package/src/lib/A-FrameStorage/A-FrameStorage.codec.ts +338 -0
  348. package/src/lib/A-FrameStorage/A-FrameStorage.component.ts +191 -0
  349. package/src/lib/A-FrameStorage/A-FrameStorage.constants.ts +11 -0
  350. package/src/lib/A-FrameStorage/A-FrameStorage.error.ts +13 -0
  351. package/src/lib/A-FrameStorage/A-FrameStorage.types.ts +98 -0
  352. package/src/lib/A-FrameStorage/A-FrameStorageOperation.context.ts +59 -0
  353. package/src/lib/A-FrameStorage/browser/A-FrameBrowserStorage.component.ts +312 -0
  354. package/src/lib/A-FrameStorage/browser/A-FrameBrowserStorageBlobs.context.ts +77 -0
  355. package/src/lib/A-FrameStorage/index.browser.ts +11 -0
  356. package/src/lib/A-FrameStorage/index.ts +10 -0
  357. package/src/lib/A-FrameStorage/node/A-FrameNodeStorage.component.ts +464 -0
  358. package/src/lib/A-FrameStorage/server/A-FrameServerStorage.component.ts +177 -0
  359. package/src/lib/{entities/A_FrameVector/A_FrameVector.entity.ts → A-FrameVector/A-FrameVector.entity.ts} +10 -0
  360. package/src/lib/A-FrameVector/index.ts +3 -0
  361. package/tests/A-Frame.browser.test.ts +94 -0
  362. package/tests/A-Frame.test.ts +74 -67
  363. package/tests/jest.browser-environment.js +30 -0
  364. package/tests/jest.polyfills.browser.ts +13 -0
  365. package/tests/jest.setup.browser.ts +33 -0
  366. package/tsconfig.browser.json +54 -0
  367. package/tsconfig.json +16 -0
  368. package/tsup.config.ts +32 -2
  369. package/src/lib/components/Builder.component.ts/Builder.component.ts +0 -0
  370. package/src/lib/components/Index.component.ts/Index.component.ts +0 -79
  371. package/src/lib/components/Index.component.ts/Index.constants.ts +0 -0
  372. package/src/lib/components/Index.component.ts/Index.meta.ts +0 -28
  373. package/src/lib/components/Index.component.ts/IndexConfigurations.meta.ts +0 -78
  374. package/src/lib/components/Index.component.ts/decorators/IndexComponent.decorator.ts +0 -97
  375. package/src/lib/components/Index.component.ts/decorators/IndexDescribe.decorator.ts +0 -59
  376. package/src/lib/components/Index.component.ts/decorators/IndexNamespace.decorator.ts +0 -57
  377. package/src/lib/components/Search/A_FrameSearch.component.ts +0 -66
  378. package/src/lib/containers/CLI.container.ts +0 -27
  379. package/src/lib/entities/Namespace/Namespace.entity.ts +0 -8
@@ -0,0 +1,586 @@
1
+ import { A_Feature, A_Inject } from "@adaas/a-concept";
2
+ import { A_FrameFeatures } from "./A-FrameChannel.constants";
3
+ import { A_FrameChannelRequest } from "./A-FrameChannelRequest.context";
4
+ import { A_FrameEnv } from "../A-FrameEnv/A-FrameEnv.fragment.env-node";
5
+ import { A_FrameChannelError } from "./A-FrameChannel.error";
6
+ import { A_FrameChannel } from "./A-FrameChannel.component";
7
+ import * as http from "http";
8
+ import * as https from "https";
9
+ // import * as crypto from "crypto";
10
+ // import * as net from "net";
11
+ // import * as tls from "tls";
12
+ import { A_FrameChannelStream } from "./A-FrameChannelStream.entity";
13
+ import { A_FrameChannelEvent } from "./A-FrameChannelEvent.context";
14
+
15
+ export class A_FrameNodeChannel extends A_FrameChannel {
16
+
17
+ @A_Feature.Extend({
18
+ name: A_FrameFeatures.Request,
19
+ scope: [A_FrameChannel],
20
+ })
21
+ async request(
22
+ @A_Inject(A_FrameChannelRequest) context: A_FrameChannelRequest,
23
+ @A_Inject(A_FrameEnv) env: A_FrameEnv,
24
+ ) {
25
+ const url = `${env.A_FRAME_SERVER_URL}${context.path}`;
26
+ const parsedUrl = new URL(url);
27
+ const client = parsedUrl.protocol === "https:" ? https : http;
28
+ const payload = context.body !== undefined ? JSON.stringify(context.body) : undefined;
29
+
30
+ const result = await new Promise<unknown>((resolve, reject) => {
31
+ const req = client.request(
32
+ {
33
+ protocol: parsedUrl.protocol,
34
+ hostname: parsedUrl.hostname,
35
+ port: parsedUrl.port,
36
+ path: `${parsedUrl.pathname}${parsedUrl.search}`,
37
+ method: context.method,
38
+ headers: {
39
+ "Content-Type": "application/json",
40
+ Authorization: `Bearer ${env.A_FRAME_SERVER_API_KEY}`,
41
+ ...(payload ? { "Content-Length": Buffer.byteLength(payload) } : {}),
42
+ },
43
+ },
44
+ (res) => {
45
+ const chunks: Buffer[] = [];
46
+
47
+ res.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
48
+ res.on("end", () => {
49
+ const raw = Buffer.concat(chunks).toString("utf8");
50
+
51
+ if ((res.statusCode ?? 500) >= 400) {
52
+ console.error(`[A-FrameChannel] <-- ${res.statusCode} ${context.method} ${url}`);
53
+ reject(
54
+ new A_FrameChannelError({
55
+ title: A_FrameChannelError.RequestFailed,
56
+ description: `Request to ${context.path} failed with status ${res.statusCode}`,
57
+ }),
58
+ );
59
+ return;
60
+ }
61
+
62
+ if (!raw) {
63
+ console.log(`[A-FrameChannel] <-- ${res.statusCode} ${context.method} ${url} (empty)`);
64
+ resolve(undefined);
65
+ return;
66
+ }
67
+
68
+ try {
69
+ const parsed = JSON.parse(raw);
70
+ console.log(`[A-FrameChannel] <-- ${res.statusCode} ${context.method} ${url}`);
71
+ resolve(parsed);
72
+ } catch {
73
+ console.error(`[A-FrameChannel] <-- ${res.statusCode} ${context.method} ${url} (invalid JSON)`);
74
+ reject(
75
+ new A_FrameChannelError({
76
+ title: A_FrameChannelError.RequestFailed,
77
+ description: `Invalid JSON response from ${context.path}`,
78
+ }),
79
+ );
80
+ }
81
+ });
82
+ },
83
+ );
84
+
85
+ req.setTimeout(15_000, () => {
86
+ console.error(`[A-FrameChannel] TIMEOUT ${context.method} ${url}`);
87
+ req.destroy(
88
+ new A_FrameChannelError({
89
+ title: A_FrameChannelError.Timeout,
90
+ description: `Request to ${context.path} timed out after 15 seconds`,
91
+ }),
92
+ );
93
+ });
94
+
95
+ req.on("error", (err) => reject(err));
96
+
97
+ if (payload) req.write(payload);
98
+ req.end();
99
+ });
100
+
101
+ context.complete(result);
102
+
103
+ }
104
+
105
+
106
+
107
+
108
+ async stream(
109
+ @A_Inject(A_FrameChannelStream) stream: A_FrameChannelStream,
110
+ @A_Inject(A_FrameEnv) env: A_FrameEnv,
111
+ ) {
112
+ const url = `${env.A_FRAME_SERVER_URL}${stream.path}`;
113
+ const parsedUrl = new URL(url);
114
+ const client = parsedUrl.protocol === "https:" ? https : http;
115
+ const payload = stream.body !== undefined ? JSON.stringify(stream.body) : undefined;
116
+
117
+ await new Promise<void>((resolve, reject) => {
118
+
119
+ const req = client.request(
120
+ {
121
+ protocol: parsedUrl.protocol,
122
+ hostname: parsedUrl.hostname,
123
+ port: parsedUrl.port,
124
+ path: `${parsedUrl.pathname}${parsedUrl.search}`,
125
+ method: stream.method,
126
+ headers: {
127
+ "Content-Type": "application/json",
128
+ Accept: "text/event-stream",
129
+ Authorization: `Bearer ${env.A_FRAME_SERVER_API_KEY}`,
130
+ ...(payload ? { "Content-Length": Buffer.byteLength(payload) } : {}),
131
+ },
132
+ },
133
+ (res) => {
134
+ if ((res.statusCode ?? 500) >= 400) {
135
+ console.error(`[A-FrameChannel] <-- ${res.statusCode} ${stream.method} ${url}`);
136
+ reject(
137
+ new A_FrameChannelError({
138
+ title: A_FrameChannelError.RequestFailed,
139
+ description: `Stream request to ${stream.path} failed with status ${res.statusCode}`,
140
+ }),
141
+ );
142
+ return;
143
+ }
144
+
145
+ let buffer = '';
146
+
147
+ res.on("data", async (chunk) => {
148
+ buffer += Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk);
149
+ const lines = buffer.split('\n');
150
+ // Keep the last incomplete line in the buffer for the next chunk
151
+ buffer = lines.pop() || '';
152
+
153
+ for (const line of lines) {
154
+ // SSE spec: only lines prefixed with "data: " carry event payloads
155
+ if (!line.startsWith('data: ')) continue;
156
+
157
+ const data = line.slice(6).trim();
158
+
159
+ // SSE end-of-stream sentinel — no payload to process
160
+ if (data === '[DONE]') continue;
161
+
162
+ // ──────────────────────────────────────────────────
163
+ // SERVER ACTION DISPATCH
164
+ // Each parsed event is expected to carry a `type`
165
+ // field that identifies the action sent by the server.
166
+ //
167
+ // Add new cases here as the server-side action set
168
+ // grows. The raw event is also pushed to `events` so
169
+ // callers receive the full history via context.complete.
170
+ //
171
+ // Example shape: { type: 'some_action', data: { ... } }
172
+ // ──────────────────────────────────────────────────
173
+ try {
174
+ const event = JSON.parse(data);
175
+
176
+ await stream.propagate(event.type, event.data);
177
+ } catch {
178
+ console.error(`[A-FrameChannel] Invalid SSE payload from ${stream.path}: ${data}`);
179
+ }
180
+ }
181
+ });
182
+
183
+ res.on("end", () => {
184
+ console.log(`[A-FrameChannel] <-- ${res.statusCode} ${stream.method} ${url} (stream complete)`);
185
+ resolve();
186
+ });
187
+
188
+ res.on("error", (err) => reject(err));
189
+ },
190
+ );
191
+
192
+ req.setTimeout(60_000, () => {
193
+ console.error(`[A-FrameChannel] TIMEOUT ${stream.method} ${url}`);
194
+ req.destroy(
195
+ new A_FrameChannelError({
196
+ title: A_FrameChannelError.Timeout,
197
+ description: `Stream request to ${stream.path} timed out after 60 seconds`,
198
+ }),
199
+ );
200
+ });
201
+
202
+ req.on("error", (err) => reject(err));
203
+
204
+ if (payload) req.write(payload);
205
+ req.end();
206
+ });
207
+
208
+ stream.complete();
209
+ }
210
+
211
+
212
+ async send(
213
+ @A_Inject(A_FrameChannelStream) stream: A_FrameChannelStream,
214
+ @A_Inject(A_FrameChannelEvent) event: A_FrameChannelEvent,
215
+ @A_Inject(A_FrameEnv) env: A_FrameEnv,
216
+ ) {
217
+ // SSE is server-to-client only; to push data back to the server
218
+ // during an active stream session we make a separate HTTP POST to
219
+ // a companion endpoint.
220
+ //
221
+ // Convention: same base path as the stream with "/send" appended —
222
+ // adjust to match your server-side routing.
223
+ const url = `${env.A_FRAME_SERVER_URL}${stream.path}/send`;
224
+ const parsedUrl = new URL(url);
225
+ const client = parsedUrl.protocol === "https:" ? https : http;
226
+
227
+ // Always serialise as { type, data } so the server can dispatch
228
+ // the same way it dispatches events back to the client.
229
+ const payload = JSON.stringify({ type: event.name, data: event.data });
230
+
231
+ await new Promise<void>((resolve, reject) => {
232
+ const req = client.request(
233
+ {
234
+ protocol: parsedUrl.protocol,
235
+ hostname: parsedUrl.hostname,
236
+ port: parsedUrl.port,
237
+ path: `${parsedUrl.pathname}${parsedUrl.search}`,
238
+ method: "POST",
239
+ headers: {
240
+ "Content-Type": "application/json",
241
+ Authorization: `Bearer ${env.A_FRAME_SERVER_API_KEY}`,
242
+ "Content-Length": Buffer.byteLength(payload),
243
+ },
244
+ },
245
+ (res) => {
246
+ // Drain the response so the socket can be freed/reused.
247
+ res.resume();
248
+
249
+ res.on("end", () => {
250
+ if ((res.statusCode ?? 500) >= 400) {
251
+ console.error(`[A-FrameChannel] <-- ${res.statusCode} POST ${url}`);
252
+ reject(
253
+ new A_FrameChannelError({
254
+ title: A_FrameChannelError.RequestFailed,
255
+ description: `Send event "${event.name}" to ${stream.path} failed with status ${res.statusCode}`,
256
+ }),
257
+ );
258
+ return;
259
+ }
260
+
261
+ console.log(`[A-FrameChannel] --> ${res.statusCode} POST ${url} (event: ${event.name})`);
262
+ resolve();
263
+ });
264
+ },
265
+ );
266
+
267
+ req.setTimeout(15_000, () => {
268
+ console.error(`[A-FrameChannel] TIMEOUT POST ${url}`);
269
+ req.destroy(
270
+ new A_FrameChannelError({
271
+ title: A_FrameChannelError.Timeout,
272
+ description: `Send event "${event.name}" to ${stream.path} timed out after 15 seconds`,
273
+ }),
274
+ );
275
+ });
276
+
277
+ req.on("error", (err) => reject(err));
278
+
279
+ req.write(payload);
280
+ req.end();
281
+ });
282
+ }
283
+ }
284
+
285
+ // // ─── WebSocket feature ────────────────────────────────────────────────────
286
+
287
+ // @A_Feature.Extend({
288
+ // name: A_FrameFeatures.Socket,
289
+ // scope: [A_FrameChannel],
290
+ // })
291
+ // async socket(
292
+ // @A_Inject(A_FrameChannelSocket) socket: A_FrameChannelSocket,
293
+ // @A_Inject(A_FrameEnv) env: A_FrameEnv,
294
+ // ) {
295
+ // const url = `${env.A_FRAME_SERVER_URL}${socket.path}`;
296
+ // const parsedUrl = new URL(url);
297
+
298
+ // // Both http→ws and https→wss are TLS-detected the same way
299
+ // const isSecure =
300
+ // parsedUrl.protocol === "https:" || parsedUrl.protocol === "wss:";
301
+
302
+ // const hostname = parsedUrl.hostname;
303
+ // const port = parsedUrl.port
304
+ // ? parseInt(parsedUrl.port, 10)
305
+ // : isSecure ? 443 : 80;
306
+ // const wsPath = `${parsedUrl.pathname}${parsedUrl.search}`;
307
+ // const hostHeader = parsedUrl.port ? `${hostname}:${parsedUrl.port}` : hostname;
308
+
309
+ // // ── WebSocket opening handshake (RFC 6455 §4.1) ─────────────────────
310
+ // // Generate a fresh 16-byte random key. The server must echo it back
311
+ // // as SHA-1("key" + magic) in Sec-WebSocket-Accept, which we verify to
312
+ // // guard against accidental plain-HTTP responses being accepted as WS.
313
+ // const wsKey = crypto.randomBytes(16).toString("base64");
314
+ // const expectedAccept = crypto
315
+ // .createHash("sha1")
316
+ // .update(wsKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
317
+ // .digest("base64");
318
+
319
+ // await new Promise<void>((resolve, reject) => {
320
+ // // Establish raw TCP (or TLS) transport without HTTP machinery
321
+ // const rawSocket: net.Socket = isSecure
322
+ // ? tls.connect({ host: hostname, port, servername: hostname })
323
+ // : net.connect({ host: hostname, port });
324
+
325
+ // let handshakeDone = false;
326
+ // let frameBuffer = Buffer.alloc(0);
327
+
328
+ // // ── Send the HTTP/1.1 Upgrade request once transport is ready ────
329
+ // function sendHandshake() {
330
+ // // If the caller provided a body, encode it in a custom header so
331
+ // // it survives the GET-only WebSocket upgrade request.
332
+ // const initHeader = socket.body !== undefined
333
+ // ? [`X-A-Frame-Init: ${Buffer.from(JSON.stringify(socket.body)).toString("base64")}`]
334
+ // : [];
335
+
336
+ // const lines = [
337
+ // `GET ${wsPath} HTTP/1.1`,
338
+ // `Host: ${hostHeader}`,
339
+ // "Upgrade: websocket",
340
+ // "Connection: Upgrade",
341
+ // `Sec-WebSocket-Key: ${wsKey}`,
342
+ // "Sec-WebSocket-Version: 13",
343
+ // // Auth header — same Bearer token used by all other methods
344
+ // `Authorization: Bearer ${env.A_FRAME_SERVER_API_KEY}`,
345
+ // ...initHeader,
346
+ // "", // produces the mandatory blank CRLF line
347
+ // "",
348
+ // ];
349
+
350
+ // rawSocket.write(lines.join("\r\n"));
351
+ // }
352
+
353
+ // // For TLS, wait until the TLS handshake finishes before writing
354
+ // if (isSecure) {
355
+ // (rawSocket as tls.TLSSocket).once("secureConnect", sendHandshake);
356
+ // } else {
357
+ // rawSocket.once("connect", sendHandshake);
358
+ // }
359
+
360
+ // rawSocket.on("data", async (chunk: Buffer) => {
361
+ // frameBuffer = Buffer.concat([frameBuffer, chunk]);
362
+
363
+ // // ── Phase 1: wait for the HTTP 101 response header block ─────
364
+ // if (!handshakeDone) {
365
+ // const headEnd = frameBuffer.indexOf("\r\n\r\n");
366
+ // if (headEnd === -1) return; // headers still arriving
367
+
368
+ // const statusBlock = frameBuffer.slice(0, headEnd).toString("utf8");
369
+ // frameBuffer = frameBuffer.slice(headEnd + 4);
370
+
371
+ // // Reject anything that isn't a 101 Switching Protocols
372
+ // const statusLine = statusBlock.split("\r\n")[0];
373
+ // if (!statusLine.includes("101")) {
374
+ // rawSocket.destroy();
375
+ // reject(
376
+ // new A_FrameChannelError({
377
+ // title: A_FrameChannelError.RequestFailed,
378
+ // description: `WebSocket upgrade rejected: ${statusLine}`,
379
+ // }),
380
+ // );
381
+ // return;
382
+ // }
383
+
384
+ // // ── Sec-WebSocket-Accept verification ────────────────────
385
+ // // Confirms the server is a genuine WebSocket endpoint and not
386
+ // // an HTTP proxy replaying our request unchanged.
387
+ // const acceptMatch = statusBlock.match(/Sec-WebSocket-Accept:\s*([^\r\n]+)/i);
388
+ // if (!acceptMatch || acceptMatch[1].trim() !== expectedAccept) {
389
+ // rawSocket.destroy();
390
+ // reject(
391
+ // new A_FrameChannelError({
392
+ // title: A_FrameChannelError.RequestFailed,
393
+ // description:
394
+ // "WebSocket handshake failed: invalid Sec-WebSocket-Accept — possible MITM or non-WS endpoint",
395
+ // }),
396
+ // );
397
+ // return;
398
+ // }
399
+
400
+ // handshakeDone = true;
401
+
402
+ // // Attach the send capability now that the socket is open
403
+ // socket.attachSendFn((data: string) => {
404
+ // rawSocket.write(encodeWebSocketFrame(data));
405
+ // });
406
+
407
+ // console.log(`[A-FrameChannel] WS OPEN ${url}`);
408
+ // }
409
+
410
+ // // ── Phase 2: parse and dispatch complete WS frames ───────────
411
+ // while (frameBuffer.length >= 2) {
412
+ // const { frame, consumed } = tryParseWebSocketFrame(frameBuffer);
413
+ // if (!frame || consumed === 0) break; // incomplete frame — wait for more data
414
+
415
+ // frameBuffer = frameBuffer.slice(consumed);
416
+
417
+ // switch (frame.opcode) {
418
+ // case 0x8: {
419
+ // // Close frame — echo it back and tear down gracefully
420
+ // rawSocket.write(encodeWebSocketFrame("", 0x8));
421
+ // rawSocket.end();
422
+ // socket.complete();
423
+ // console.log(`[A-FrameChannel] WS CLOSE ${url}`);
424
+ // resolve();
425
+ // return;
426
+ // }
427
+
428
+ // case 0x9: {
429
+ // // Ping — must reply with Pong carrying the same payload (RFC 6455 §5.5.2)
430
+ // rawSocket.write(encodeWebSocketFrame(frame.payload.toString("utf8"), 0xa));
431
+ // break;
432
+ // }
433
+
434
+ // case 0x1:
435
+ // case 0x2: {
436
+ // // ──────────────────────────────────────────────────
437
+ // // SERVER ACTION DISPATCH
438
+ // // Each text/binary frame carries a JSON payload shaped
439
+ // // as { type: string, data: any }.
440
+ // //
441
+ // // Add new cases in a subclass via:
442
+ // // @A_FrameChannelSocket.onEvent('type_name')
443
+ // // async onTypeName(@A_Inject(A_FrameChannelEvent) event) { ... }
444
+ // // ──────────────────────────────────────────────────
445
+ // const text = frame.payload.toString("utf8");
446
+ // try {
447
+ // const event = JSON.parse(text);
448
+ // await socket.propagate(event.type, event.data);
449
+ // } catch {
450
+ // console.error(
451
+ // `[A-FrameChannel] Invalid WS payload from ${socket.path}: ${text}`,
452
+ // );
453
+ // }
454
+ // break;
455
+ // }
456
+ // }
457
+ // }
458
+ // });
459
+
460
+ // rawSocket.on("end", () => {
461
+ // socket.complete();
462
+ // resolve();
463
+ // });
464
+
465
+ // rawSocket.on("error", (err) => {
466
+ // socket.fail(
467
+ // new A_FrameChannelError({
468
+ // title: A_FrameChannelError.RequestFailed,
469
+ // description: `WebSocket error on ${socket.path}: ${err.message}`,
470
+ // }),
471
+ // );
472
+ // reject(err);
473
+ // });
474
+
475
+ // // 60 s idle timeout — same as stream; adjust per use-case
476
+ // rawSocket.setTimeout(60_000, () => {
477
+ // console.error(`[A-FrameChannel] WS TIMEOUT ${url}`);
478
+ // rawSocket.destroy(
479
+ // new A_FrameChannelError({
480
+ // title: A_FrameChannelError.Timeout,
481
+ // description: `WebSocket connection to ${socket.path} timed out after 60 seconds`,
482
+ // }),
483
+ // );
484
+ // });
485
+ // });
486
+ // }
487
+ // }
488
+
489
+
490
+ // // =============================================================================
491
+ // // WebSocket frame helpers (RFC 6455)
492
+ // // Module-level pure functions — no external dependencies required.
493
+ // // =============================================================================
494
+
495
+ // /**
496
+ // * Encode `data` as a masked WebSocket text frame (opcode 0x1).
497
+ // * Client → server frames MUST be masked per RFC 6455 §5.3.
498
+ // * Pass opcode 0x8 for a close frame, 0xa for pong, etc.
499
+ // */
500
+ // function encodeWebSocketFrame(data: string, opcode: number = 0x1): Buffer {
501
+ // const payload = Buffer.from(data, "utf8");
502
+ // const len = payload.length;
503
+
504
+ // // 4-byte random masking key — new key per frame (RFC 6455 §10.3)
505
+ // const mask = crypto.randomBytes(4);
506
+
507
+ // // Header size: 2 base bytes + 0/2/8 extended length bytes + 4 mask bytes
508
+ // let headerLen = 6;
509
+ // if (len > 65535) headerLen += 8;
510
+ // else if (len > 125) headerLen += 2;
511
+
512
+ // const frame = Buffer.allocUnsafe(headerLen + len);
513
+ // frame[0] = 0x80 | (opcode & 0x0f); // FIN=1, opcode
514
+
515
+ // let offset = 1;
516
+ // if (len <= 125) {
517
+ // frame[offset++] = 0x80 | len; // MASK=1, 7-bit length
518
+ // } else if (len <= 65535) {
519
+ // frame[offset++] = 0x80 | 126; // MASK=1, 16-bit extended length
520
+ // frame.writeUInt16BE(len, offset);
521
+ // offset += 2;
522
+ // } else {
523
+ // frame[offset++] = 0x80 | 127; // MASK=1, 64-bit extended length
524
+ // frame.writeBigUInt64BE(BigInt(len), offset);
525
+ // offset += 8;
526
+ // }
527
+
528
+ // mask.copy(frame, offset);
529
+ // offset += 4;
530
+
531
+ // for (let i = 0; i < len; i++) {
532
+ // frame[offset + i] = payload[i] ^ mask[i % 4];
533
+ // }
534
+
535
+ // return frame;
536
+ // }
537
+
538
+ // /**
539
+ // * Attempt to parse one complete WebSocket frame from `buf`.
540
+ // * Returns `{ frame: null, consumed: 0 }` if the buffer does not yet contain a
541
+ // * complete frame — the caller should buffer more data and retry.
542
+ // *
543
+ // * Server → client frames are never masked, so no unmasking is needed here.
544
+ // * If the server incorrectly sends a masked frame it is unmasked anyway.
545
+ // */
546
+ // function tryParseWebSocketFrame(
547
+ // buf: Buffer,
548
+ // ): { frame: { opcode: number; payload: Buffer; fin: boolean } | null; consumed: number } {
549
+ // if (buf.length < 2) return { frame: null, consumed: 0 };
550
+
551
+ // const fin = (buf[0] & 0x80) !== 0;
552
+ // const opcode = buf[0] & 0x0f;
553
+ // const masked = (buf[1] & 0x80) !== 0;
554
+ // let payloadLen = buf[1] & 0x7f;
555
+ // let offset = 2;
556
+
557
+ // if (payloadLen === 126) {
558
+ // if (buf.length < 4) return { frame: null, consumed: 0 };
559
+ // payloadLen = buf.readUInt16BE(2);
560
+ // offset = 4;
561
+ // } else if (payloadLen === 127) {
562
+ // if (buf.length < 10) return { frame: null, consumed: 0 };
563
+ // payloadLen = Number(buf.readBigUInt64BE(2));
564
+ // offset = 10;
565
+ // }
566
+
567
+ // const maskBytes = masked ? 4 : 0;
568
+ // if (buf.length < offset + maskBytes + payloadLen) {
569
+ // return { frame: null, consumed: 0 };
570
+ // }
571
+
572
+ // let maskKey: Buffer | null = null;
573
+ // if (masked) {
574
+ // maskKey = buf.slice(offset, offset + 4);
575
+ // offset += 4;
576
+ // }
577
+
578
+ // const payload = Buffer.from(buf.slice(offset, offset + payloadLen));
579
+ // if (masked && maskKey) {
580
+ // for (let i = 0; i < payload.length; i++) {
581
+ // payload[i] ^= maskKey[i % 4];
582
+ // }
583
+ // }
584
+
585
+ // return { frame: { opcode, payload, fin }, consumed: offset + payloadLen };
586
+ // }