sa2kit 1.6.59 → 1.6.62

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 (335) hide show
  1. package/dist/UniversalFileService-C3WQAFOV.js +15 -0
  2. package/dist/{UniversalFileService-J6ET6KZK.js.map → UniversalFileService-C3WQAFOV.js.map} +1 -1
  3. package/dist/UniversalFileService-O3IEROBN.mjs +6 -0
  4. package/dist/{UniversalFileService-336GFY6N.mjs.map → UniversalFileService-O3IEROBN.mjs.map} +1 -1
  5. package/dist/ai/llm/index.d.mts +70 -0
  6. package/dist/ai/llm/index.d.ts +70 -0
  7. package/dist/ai/llm/index.js +54 -0
  8. package/dist/ai/llm/index.js.map +1 -0
  9. package/dist/ai/llm/index.mjs +5 -0
  10. package/dist/ai/llm/index.mjs.map +1 -0
  11. package/dist/ai/llm/ui/electron/index.d.mts +5 -0
  12. package/dist/ai/llm/ui/electron/index.d.ts +5 -0
  13. package/dist/ai/llm/ui/electron/index.js +21 -0
  14. package/dist/ai/llm/ui/electron/index.js.map +1 -0
  15. package/dist/ai/llm/ui/electron/index.mjs +8 -0
  16. package/dist/ai/llm/ui/electron/index.mjs.map +1 -0
  17. package/dist/ai/llm/ui/miniapp/index.d.mts +9 -0
  18. package/dist/ai/llm/ui/miniapp/index.d.ts +9 -0
  19. package/dist/ai/llm/ui/miniapp/index.js +107 -0
  20. package/dist/ai/llm/ui/miniapp/index.js.map +1 -0
  21. package/dist/ai/llm/ui/miniapp/index.mjs +101 -0
  22. package/dist/ai/llm/ui/miniapp/index.mjs.map +1 -0
  23. package/dist/ai/llm/ui/rn/index.d.mts +9 -0
  24. package/dist/ai/llm/ui/rn/index.d.ts +9 -0
  25. package/dist/ai/llm/ui/rn/index.js +249 -0
  26. package/dist/ai/llm/ui/rn/index.js.map +1 -0
  27. package/dist/ai/llm/ui/rn/index.mjs +243 -0
  28. package/dist/ai/llm/ui/rn/index.mjs.map +1 -0
  29. package/dist/ai/llm/ui/web/index.d.mts +15 -0
  30. package/dist/ai/llm/ui/web/index.d.ts +15 -0
  31. package/dist/ai/llm/ui/web/index.js +21 -0
  32. package/dist/ai/llm/ui/web/index.js.map +1 -0
  33. package/dist/ai/llm/ui/web/index.mjs +8 -0
  34. package/dist/ai/llm/ui/web/index.mjs.map +1 -0
  35. package/dist/ar/index.d.mts +7 -0
  36. package/dist/ar/index.d.ts +7 -0
  37. package/dist/ar/index.js +17 -0
  38. package/dist/ar/index.js.map +1 -0
  39. package/dist/ar/index.mjs +4 -0
  40. package/dist/ar/index.mjs.map +1 -0
  41. package/dist/auth/index.js +22 -22
  42. package/dist/auth/index.mjs +2 -2
  43. package/dist/auth/legacy/db/index.d.mts +5 -0
  44. package/dist/auth/legacy/db/index.d.ts +5 -0
  45. package/dist/auth/legacy/db/index.js +34 -0
  46. package/dist/auth/legacy/db/index.js.map +1 -0
  47. package/dist/auth/legacy/db/index.mjs +5 -0
  48. package/dist/auth/legacy/db/index.mjs.map +1 -0
  49. package/dist/auth/legacy/index.d.mts +51 -0
  50. package/dist/auth/legacy/index.d.ts +51 -0
  51. package/dist/auth/legacy/index.js +146 -0
  52. package/dist/auth/legacy/index.js.map +1 -0
  53. package/dist/auth/legacy/index.mjs +13 -0
  54. package/dist/auth/legacy/index.mjs.map +1 -0
  55. package/dist/auth/legacy/logic/index.d.mts +9 -0
  56. package/dist/auth/legacy/logic/index.d.ts +9 -0
  57. package/dist/auth/legacy/logic/index.js +18 -0
  58. package/dist/auth/legacy/logic/index.js.map +1 -0
  59. package/dist/auth/legacy/logic/index.mjs +5 -0
  60. package/dist/auth/legacy/logic/index.mjs.map +1 -0
  61. package/dist/auth/legacy/routes/index.d.mts +50 -0
  62. package/dist/auth/legacy/routes/index.d.ts +50 -0
  63. package/dist/auth/legacy/routes/index.js +34 -0
  64. package/dist/auth/legacy/routes/index.js.map +1 -0
  65. package/dist/auth/legacy/routes/index.mjs +5 -0
  66. package/dist/auth/legacy/routes/index.mjs.map +1 -0
  67. package/dist/auth/legacy/schema/index.d.mts +401 -0
  68. package/dist/auth/legacy/schema/index.d.ts +401 -0
  69. package/dist/auth/legacy/schema/index.js +29 -0
  70. package/dist/auth/legacy/schema/index.js.map +1 -0
  71. package/dist/auth/legacy/schema/index.mjs +4 -0
  72. package/dist/auth/legacy/schema/index.mjs.map +1 -0
  73. package/dist/auth/legacy/server/index.d.mts +15 -0
  74. package/dist/auth/legacy/server/index.d.ts +15 -0
  75. package/dist/auth/legacy/server/index.js +65 -0
  76. package/dist/auth/legacy/server/index.js.map +1 -0
  77. package/dist/auth/legacy/server/index.mjs +8 -0
  78. package/dist/auth/legacy/server/index.mjs.map +1 -0
  79. package/dist/auth/legacy/services/index.d.mts +40 -0
  80. package/dist/auth/legacy/services/index.d.ts +40 -0
  81. package/dist/auth/legacy/services/index.js +14 -0
  82. package/dist/auth/legacy/services/index.js.map +1 -0
  83. package/dist/auth/legacy/services/index.mjs +5 -0
  84. package/dist/auth/legacy/services/index.mjs.map +1 -0
  85. package/dist/auth/legacy/ui/miniapp/index.d.mts +10 -0
  86. package/dist/auth/legacy/ui/miniapp/index.d.ts +10 -0
  87. package/dist/auth/legacy/ui/miniapp/index.js +23 -0
  88. package/dist/auth/legacy/ui/miniapp/index.js.map +1 -0
  89. package/dist/auth/legacy/ui/miniapp/index.mjs +6 -0
  90. package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -0
  91. package/dist/auth/legacy/ui/web/index.d.mts +22 -0
  92. package/dist/auth/legacy/ui/web/index.d.ts +22 -0
  93. package/dist/auth/legacy/ui/web/index.js +31 -0
  94. package/dist/auth/legacy/ui/web/index.js.map +1 -0
  95. package/dist/auth/legacy/ui/web/index.mjs +6 -0
  96. package/dist/auth/legacy/ui/web/index.mjs.map +1 -0
  97. package/dist/booking-B0BM8grt.d.mts +141 -0
  98. package/dist/booking-CUy8u7Za.d.ts +141 -0
  99. package/dist/{bookingAdminService-Dmg7dC6V.d.mts → bookingAdminService-BNEDyw7U.d.mts} +1 -1
  100. package/dist/{bookingAdminService-B2QDjSHJ.d.ts → bookingAdminService-BtOtG96L.d.ts} +1 -1
  101. package/dist/calendar/index.d.mts +390 -237
  102. package/dist/calendar/index.d.ts +390 -237
  103. package/dist/calendar/index.js +3825 -3785
  104. package/dist/calendar/index.js.map +1 -1
  105. package/dist/calendar/index.mjs +3730 -3696
  106. package/dist/calendar/index.mjs.map +1 -1
  107. package/dist/calendar/routes/index.js +30 -327
  108. package/dist/calendar/routes/index.js.map +1 -1
  109. package/dist/calendar/routes/index.mjs +1 -323
  110. package/dist/calendar/routes/index.mjs.map +1 -1
  111. package/dist/calendar/server.d.mts +6 -0
  112. package/dist/calendar/server.d.ts +6 -0
  113. package/dist/calendar/server.js +41 -13
  114. package/dist/calendar/server.js.map +1 -1
  115. package/dist/calendar/server.mjs +2 -2
  116. package/dist/calendar/server.mjs.map +1 -1
  117. package/dist/{cart-D3o67Q3H.d.ts → cart-Cw3i0Dy6.d.ts} +1 -1
  118. package/dist/{cart-CcZ7rQyG.d.mts → cart-DLSbsihH.d.mts} +1 -1
  119. package/dist/chunk-24F7KUED.js +263 -0
  120. package/dist/chunk-24F7KUED.js.map +1 -0
  121. package/dist/{chunk-YMS6BPXS.js → chunk-27IUMDDK.js} +3 -3
  122. package/dist/{chunk-YMS6BPXS.js.map → chunk-27IUMDDK.js.map} +1 -1
  123. package/dist/chunk-37M6NZIF.js +279 -0
  124. package/dist/chunk-37M6NZIF.js.map +1 -0
  125. package/dist/chunk-3JMUNOUT.js +144 -0
  126. package/dist/chunk-3JMUNOUT.js.map +1 -0
  127. package/dist/chunk-3PFCOTJP.mjs +256 -0
  128. package/dist/chunk-3PFCOTJP.mjs.map +1 -0
  129. package/dist/{chunk-SKCMZYSQ.js → chunk-3YSRTVIY.js} +31 -15
  130. package/dist/chunk-3YSRTVIY.js.map +1 -0
  131. package/dist/{chunk-NZZZUMMX.mjs → chunk-57MVE5LL.mjs} +3 -3
  132. package/dist/{chunk-NZZZUMMX.mjs.map → chunk-57MVE5LL.mjs.map} +1 -1
  133. package/dist/{chunk-622Y6LTH.mjs → chunk-5BLZEVWK.mjs} +196 -468
  134. package/dist/chunk-5BLZEVWK.mjs.map +1 -0
  135. package/dist/{chunk-UVHPCLP6.js → chunk-5LCGOCKG.js} +5 -5
  136. package/dist/{chunk-UVHPCLP6.js.map → chunk-5LCGOCKG.js.map} +1 -1
  137. package/dist/chunk-6XUQ2B4K.js +219 -0
  138. package/dist/chunk-6XUQ2B4K.js.map +1 -0
  139. package/dist/{chunk-NCOXT7SK.js → chunk-77UEPWVQ.js} +4 -4
  140. package/dist/{chunk-NCOXT7SK.js.map → chunk-77UEPWVQ.js.map} +1 -1
  141. package/dist/chunk-C76U5FF4.mjs +10 -0
  142. package/dist/chunk-C76U5FF4.mjs.map +1 -0
  143. package/dist/chunk-CFM56MGO.mjs +35 -0
  144. package/dist/chunk-CFM56MGO.mjs.map +1 -0
  145. package/dist/{chunk-LJGJPAQ4.js → chunk-COOI6MT3.js} +2 -11
  146. package/dist/chunk-COOI6MT3.js.map +1 -0
  147. package/dist/chunk-CPSFYP34.mjs +140 -0
  148. package/dist/chunk-CPSFYP34.mjs.map +1 -0
  149. package/dist/chunk-D22QBOCM.mjs +336 -0
  150. package/dist/chunk-D22QBOCM.mjs.map +1 -0
  151. package/dist/chunk-DA4QV64P.mjs +35 -0
  152. package/dist/chunk-DA4QV64P.mjs.map +1 -0
  153. package/dist/{chunk-FVDPGX6A.mjs → chunk-DWJLOHAE.mjs} +2 -11
  154. package/dist/chunk-DWJLOHAE.mjs.map +1 -0
  155. package/dist/chunk-EKDLZND6.js +275 -0
  156. package/dist/chunk-EKDLZND6.js.map +1 -0
  157. package/dist/chunk-EKQPFZXQ.js +12 -0
  158. package/dist/chunk-EKQPFZXQ.js.map +1 -0
  159. package/dist/chunk-ERAAB5VG.js +324 -0
  160. package/dist/chunk-ERAAB5VG.js.map +1 -0
  161. package/dist/chunk-ESLY72VI.mjs +175 -0
  162. package/dist/chunk-ESLY72VI.mjs.map +1 -0
  163. package/dist/chunk-FGQGWW73.js +38 -0
  164. package/dist/chunk-FGQGWW73.js.map +1 -0
  165. package/dist/chunk-FXQOXLDE.js +120 -0
  166. package/dist/chunk-FXQOXLDE.js.map +1 -0
  167. package/dist/chunk-FZELCJR7.mjs +19 -0
  168. package/dist/chunk-FZELCJR7.mjs.map +1 -0
  169. package/dist/{chunk-HHVDOIPV.js → chunk-H3P2PGZL.js} +3 -3
  170. package/dist/{chunk-HHVDOIPV.js.map → chunk-H3P2PGZL.js.map} +1 -1
  171. package/dist/chunk-HBQMN5QM.mjs +10 -0
  172. package/dist/chunk-HBQMN5QM.mjs.map +1 -0
  173. package/dist/chunk-ITRIXMXF.mjs +862 -0
  174. package/dist/chunk-ITRIXMXF.mjs.map +1 -0
  175. package/dist/chunk-IUWSCUDC.js +4 -0
  176. package/dist/chunk-IUWSCUDC.js.map +1 -0
  177. package/dist/chunk-JCKCKRC2.js +50 -0
  178. package/dist/chunk-JCKCKRC2.js.map +1 -0
  179. package/dist/chunk-L7GQNY54.mjs +286 -0
  180. package/dist/chunk-L7GQNY54.mjs.map +1 -0
  181. package/dist/{chunk-ZRWED7Q6.js → chunk-LDVJ7URJ.js} +235 -520
  182. package/dist/chunk-LDVJ7URJ.js.map +1 -0
  183. package/dist/{chunk-WK3HTUID.js → chunk-MLP74E3O.js} +609 -1643
  184. package/dist/chunk-MLP74E3O.js.map +1 -0
  185. package/dist/chunk-NAX4TUT7.js +182 -0
  186. package/dist/chunk-NAX4TUT7.js.map +1 -0
  187. package/dist/chunk-NW4EN4YI.mjs +213 -0
  188. package/dist/chunk-NW4EN4YI.mjs.map +1 -0
  189. package/dist/{chunk-7CMGQX3S.mjs → chunk-OX6VMQDU.mjs} +14 -13
  190. package/dist/chunk-OX6VMQDU.mjs.map +1 -0
  191. package/dist/chunk-P3QMT3AY.mjs +44 -0
  192. package/dist/chunk-P3QMT3AY.mjs.map +1 -0
  193. package/dist/chunk-PJ4KYAQZ.mjs +631 -0
  194. package/dist/chunk-PJ4KYAQZ.mjs.map +1 -0
  195. package/dist/chunk-PLSEAREM.js +345 -0
  196. package/dist/chunk-PLSEAREM.js.map +1 -0
  197. package/dist/{chunk-EGJPS7OL.mjs → chunk-QZU4UJZG.mjs} +3 -3
  198. package/dist/{chunk-EGJPS7OL.mjs.map → chunk-QZU4UJZG.mjs.map} +1 -1
  199. package/dist/chunk-RJVR33ME.mjs +3 -0
  200. package/dist/chunk-RJVR33ME.mjs.map +1 -0
  201. package/dist/chunk-SYBHDB2D.js +650 -0
  202. package/dist/chunk-SYBHDB2D.js.map +1 -0
  203. package/dist/chunk-TVKVM7JT.js +21 -0
  204. package/dist/chunk-TVKVM7JT.js.map +1 -0
  205. package/dist/{chunk-UZB4IO3T.mjs → chunk-UTB72ZJ7.mjs} +415 -1449
  206. package/dist/chunk-UTB72ZJ7.mjs.map +1 -0
  207. package/dist/chunk-V5HE6IYN.js +12 -0
  208. package/dist/chunk-V5HE6IYN.js.map +1 -0
  209. package/dist/chunk-V7EVKD5G.mjs +116 -0
  210. package/dist/chunk-V7EVKD5G.mjs.map +1 -0
  211. package/dist/chunk-VGPR3KLR.js +872 -0
  212. package/dist/chunk-VGPR3KLR.js.map +1 -0
  213. package/dist/chunk-VS7WATQD.js +255 -0
  214. package/dist/chunk-VS7WATQD.js.map +1 -0
  215. package/dist/chunk-VSP7XJT5.mjs +272 -0
  216. package/dist/chunk-VSP7XJT5.mjs.map +1 -0
  217. package/dist/{chunk-SNBILYSH.mjs → chunk-VTKAIOP5.mjs} +5 -5
  218. package/dist/{chunk-SNBILYSH.mjs.map → chunk-VTKAIOP5.mjs.map} +1 -1
  219. package/dist/chunk-VULJUXTF.mjs +267 -0
  220. package/dist/chunk-VULJUXTF.mjs.map +1 -0
  221. package/dist/chunk-XAHM6B3V.js +44 -0
  222. package/dist/chunk-XAHM6B3V.js.map +1 -0
  223. package/dist/chunk-YSF5YISM.mjs +248 -0
  224. package/dist/chunk-YSF5YISM.mjs.map +1 -0
  225. package/dist/{chunk-OFYBMMWT.mjs → chunk-YYJEVAJI.mjs} +3 -3
  226. package/dist/{chunk-OFYBMMWT.mjs.map → chunk-YYJEVAJI.mjs.map} +1 -1
  227. package/dist/components/index.d.mts +1 -0
  228. package/dist/components/index.d.ts +1 -0
  229. package/dist/components/index.js +182 -181
  230. package/dist/components/index.mjs +4 -3
  231. package/dist/{booking-BXtkG2ns.d.mts → index-Bi666jIm.d.mts} +1 -139
  232. package/dist/{booking-BXtkG2ns.d.ts → index-Bi666jIm.d.ts} +1 -139
  233. package/dist/index-DNKZ7-R_.d.mts +184 -0
  234. package/dist/index-DNKZ7-R_.d.ts +184 -0
  235. package/dist/index.d.mts +4 -1
  236. package/dist/index.d.ts +4 -1
  237. package/dist/index.js +285 -229
  238. package/dist/index.js.map +1 -1
  239. package/dist/index.mjs +15 -10
  240. package/dist/index.mjs.map +1 -1
  241. package/dist/mikuFusionGame/index.js +3 -3
  242. package/dist/mikuFusionGame/index.mjs +2 -2
  243. package/dist/mmd/index.d.mts +67 -9
  244. package/dist/mmd/index.d.ts +67 -9
  245. package/dist/mmd/index.js +969 -625
  246. package/dist/mmd/index.js.map +1 -1
  247. package/dist/mmd/index.mjs +969 -628
  248. package/dist/mmd/index.mjs.map +1 -1
  249. package/dist/portfolio/index.js +10 -9
  250. package/dist/portfolio/index.mjs +5 -4
  251. package/dist/qqbot/index.d.mts +2 -0
  252. package/dist/qqbot/index.d.ts +2 -0
  253. package/dist/qqbot/index.js +21 -0
  254. package/dist/qqbot/index.js.map +1 -0
  255. package/dist/qqbot/index.mjs +4 -0
  256. package/dist/qqbot/index.mjs.map +1 -0
  257. package/dist/qqbot/server/index.d.mts +91 -0
  258. package/dist/qqbot/server/index.d.ts +91 -0
  259. package/dist/qqbot/server/index.js +21 -0
  260. package/dist/qqbot/server/index.js.map +1 -0
  261. package/dist/qqbot/server/index.mjs +4 -0
  262. package/dist/qqbot/server/index.mjs.map +1 -0
  263. package/dist/qqbot/ui/web/index.d.mts +10 -0
  264. package/dist/qqbot/ui/web/index.d.ts +10 -0
  265. package/dist/qqbot/ui/web/index.js +105 -0
  266. package/dist/qqbot/ui/web/index.js.map +1 -0
  267. package/dist/qqbot/ui/web/index.mjs +99 -0
  268. package/dist/qqbot/ui/web/index.mjs.map +1 -0
  269. package/dist/screenReceiver/index.d.mts +78 -0
  270. package/dist/screenReceiver/index.d.ts +78 -0
  271. package/dist/screenReceiver/index.js +17 -0
  272. package/dist/screenReceiver/index.js.map +1 -0
  273. package/dist/screenReceiver/index.mjs +4 -0
  274. package/dist/screenReceiver/index.mjs.map +1 -0
  275. package/dist/screenReceiver/server/index.d.mts +36 -0
  276. package/dist/screenReceiver/server/index.d.ts +36 -0
  277. package/dist/screenReceiver/server/index.js +160 -0
  278. package/dist/screenReceiver/server/index.js.map +1 -0
  279. package/dist/screenReceiver/server/index.mjs +157 -0
  280. package/dist/screenReceiver/server/index.mjs.map +1 -0
  281. package/dist/showmasterpiece/db/index.js +42 -42
  282. package/dist/showmasterpiece/db/index.mjs +1 -1
  283. package/dist/showmasterpiece/index.d.mts +8 -6
  284. package/dist/showmasterpiece/index.d.ts +8 -6
  285. package/dist/showmasterpiece/index.js +142 -130
  286. package/dist/showmasterpiece/index.js.map +1 -1
  287. package/dist/showmasterpiece/index.mjs +18 -6
  288. package/dist/showmasterpiece/index.mjs.map +1 -1
  289. package/dist/showmasterpiece/logic/index.d.mts +9 -17
  290. package/dist/showmasterpiece/logic/index.d.ts +9 -17
  291. package/dist/showmasterpiece/logic/index.js +35 -34
  292. package/dist/showmasterpiece/logic/index.mjs +3 -2
  293. package/dist/showmasterpiece/logic/miniapp/index.d.mts +15 -0
  294. package/dist/showmasterpiece/logic/miniapp/index.d.ts +15 -0
  295. package/dist/showmasterpiece/logic/miniapp/index.js +42 -0
  296. package/dist/showmasterpiece/logic/miniapp/index.js.map +1 -0
  297. package/dist/showmasterpiece/logic/miniapp/index.mjs +5 -0
  298. package/dist/showmasterpiece/logic/miniapp/index.mjs.map +1 -0
  299. package/dist/showmasterpiece/server/index.js +42 -42
  300. package/dist/showmasterpiece/server/index.mjs +1 -1
  301. package/dist/showmasterpiece/ui/miniapp/index.d.mts +5 -2
  302. package/dist/showmasterpiece/ui/miniapp/index.d.ts +5 -2
  303. package/dist/showmasterpiece/ui/miniapp/index.js +83 -55
  304. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
  305. package/dist/showmasterpiece/ui/miniapp/index.mjs +83 -55
  306. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
  307. package/dist/showmasterpiece/ui/web/index.d.mts +3 -2
  308. package/dist/showmasterpiece/ui/web/index.d.ts +3 -2
  309. package/dist/showmasterpiece/ui/web/index.js +44 -33
  310. package/dist/showmasterpiece/ui/web/index.mjs +16 -5
  311. package/dist/testYourself/index.js +13 -13
  312. package/dist/testYourself/index.mjs +2 -2
  313. package/dist/types-B-hOccQw.d.mts +122 -0
  314. package/dist/types-B8rGXc4e.d.mts +38 -0
  315. package/dist/types-Cg89HGz2.d.ts +38 -0
  316. package/dist/types-CvKvpyN8.d.mts +48 -0
  317. package/dist/types-CvKvpyN8.d.ts +48 -0
  318. package/dist/types-Dy6x2gJW.d.ts +122 -0
  319. package/dist/universalFile/server/index.js +11 -11
  320. package/dist/universalFile/server/index.mjs +4 -4
  321. package/package.json +106 -1
  322. package/dist/UniversalFileService-336GFY6N.mjs +0 -6
  323. package/dist/UniversalFileService-J6ET6KZK.js +0 -15
  324. package/dist/chunk-622Y6LTH.mjs.map +0 -1
  325. package/dist/chunk-7CMGQX3S.mjs.map +0 -1
  326. package/dist/chunk-FVDPGX6A.mjs.map +0 -1
  327. package/dist/chunk-GVVS4IMM.mjs +0 -302
  328. package/dist/chunk-GVVS4IMM.mjs.map +0 -1
  329. package/dist/chunk-LJGJPAQ4.js.map +0 -1
  330. package/dist/chunk-SKCMZYSQ.js.map +0 -1
  331. package/dist/chunk-UZB4IO3T.mjs.map +0 -1
  332. package/dist/chunk-WC5QFO3T.js +0 -314
  333. package/dist/chunk-WC5QFO3T.js.map +0 -1
  334. package/dist/chunk-WK3HTUID.js.map +0 -1
  335. package/dist/chunk-ZRWED7Q6.js.map +0 -1
@@ -0,0 +1,78 @@
1
+ import React__default, { RefObject } from 'react';
2
+
3
+ type ScreenReceiverRole = 'viewer' | 'broadcaster';
4
+ type ScreenReceiverSignalType = 'offer' | 'answer' | 'ice';
5
+ interface ScreenReceiverJoinMessage {
6
+ type: 'join';
7
+ roomId: string;
8
+ role?: ScreenReceiverRole;
9
+ peerId?: string;
10
+ }
11
+ interface ScreenReceiverSignalMessage {
12
+ type: ScreenReceiverSignalType;
13
+ sdp?: string;
14
+ candidate?: RTCIceCandidateInit;
15
+ targetPeerId?: string;
16
+ }
17
+ type ScreenReceiverIncomingMessage = ScreenReceiverJoinMessage | ScreenReceiverSignalMessage | Record<string, unknown>;
18
+ interface ScreenReceiverJoinedMessage {
19
+ type: 'joined';
20
+ roomId: string;
21
+ peerId: string;
22
+ role: ScreenReceiverRole;
23
+ }
24
+ interface ScreenReceiverPeerJoinedMessage {
25
+ type: 'peer_joined';
26
+ roomId: string;
27
+ peerId: string;
28
+ role: ScreenReceiverRole;
29
+ }
30
+ interface ScreenReceiverPeerLeftMessage {
31
+ type: 'peer_left';
32
+ roomId: string;
33
+ peerId: string;
34
+ }
35
+ interface ScreenReceiverRoomStateMessage {
36
+ type: 'room_state';
37
+ roomId: string;
38
+ peers: Array<{
39
+ peerId: string;
40
+ role: ScreenReceiverRole;
41
+ }>;
42
+ }
43
+ interface ScreenReceiverErrorMessage {
44
+ type: 'error';
45
+ reason: string;
46
+ }
47
+
48
+ interface ScreenReceiverLogEntry {
49
+ id: number;
50
+ text: string;
51
+ }
52
+ interface UseScreenReceiverOptions {
53
+ wsUrl: string;
54
+ roomId: string;
55
+ iceServers?: RTCIceServer[];
56
+ maxLogs?: number;
57
+ }
58
+ interface UseScreenReceiverReturn {
59
+ connect: () => Promise<void>;
60
+ disconnect: () => void;
61
+ clearLogs: () => void;
62
+ logs: ScreenReceiverLogEntry[];
63
+ isConnected: boolean;
64
+ connectionState: RTCPeerConnectionState | 'idle';
65
+ iceConnectionState: RTCIceConnectionState | 'idle';
66
+ videoRef: RefObject<HTMLVideoElement>;
67
+ stream: MediaStream | null;
68
+ }
69
+ declare function useScreenReceiver(options: UseScreenReceiverOptions): UseScreenReceiverReturn;
70
+
71
+ interface ScreenReceiverPanelProps {
72
+ defaultSignalUrl?: string;
73
+ defaultRoomId?: string;
74
+ className?: string;
75
+ }
76
+ declare function ScreenReceiverPanel(props: ScreenReceiverPanelProps): React__default.JSX.Element;
77
+
78
+ export { type ScreenReceiverErrorMessage, type ScreenReceiverIncomingMessage, type ScreenReceiverJoinMessage, type ScreenReceiverJoinedMessage, type ScreenReceiverLogEntry, ScreenReceiverPanel, type ScreenReceiverPanelProps, type ScreenReceiverPeerJoinedMessage, type ScreenReceiverPeerLeftMessage, type ScreenReceiverRole, type ScreenReceiverRoomStateMessage, type ScreenReceiverSignalMessage, type ScreenReceiverSignalType, type UseScreenReceiverOptions, type UseScreenReceiverReturn, useScreenReceiver };
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ var chunk24F7KUED_js = require('../chunk-24F7KUED.js');
4
+ require('../chunk-Z6ZWNWWR.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "ScreenReceiverPanel", {
9
+ enumerable: true,
10
+ get: function () { return chunk24F7KUED_js.ScreenReceiverPanel; }
11
+ });
12
+ Object.defineProperty(exports, "useScreenReceiver", {
13
+ enumerable: true,
14
+ get: function () { return chunk24F7KUED_js.useScreenReceiver; }
15
+ });
16
+ //# sourceMappingURL=index.js.map
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,4 @@
1
+ export { ScreenReceiverPanel, useScreenReceiver } from '../chunk-3PFCOTJP.mjs';
2
+ import '../chunk-WMJKH4XE.mjs';
3
+ //# sourceMappingURL=index.mjs.map
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -0,0 +1,36 @@
1
+ import * as ws from 'ws';
2
+ import { ServerOptions, WebSocket } from 'ws';
3
+ import * as http from 'http';
4
+
5
+ interface ScreenReceiverSignalingHubOptions {
6
+ logger?: (message: string) => void;
7
+ createPeerId?: () => string;
8
+ }
9
+ interface CreateScreenReceiverWebSocketServerOptions {
10
+ serverOptions: ServerOptions;
11
+ hubOptions?: ScreenReceiverSignalingHubOptions;
12
+ }
13
+ declare class ScreenReceiverSignalingHub {
14
+ private readonly rooms;
15
+ private readonly clients;
16
+ private readonly logger?;
17
+ private readonly createPeerId;
18
+ constructor(options?: ScreenReceiverSignalingHubOptions);
19
+ attachClient(socket: WebSocket): void;
20
+ close(): void;
21
+ private parseMessage;
22
+ private handleMessage;
23
+ private joinRoom;
24
+ private forwardSignal;
25
+ private broadcast;
26
+ private removeClient;
27
+ private send;
28
+ private log;
29
+ }
30
+ declare function createScreenReceiverWebSocketServer(options: CreateScreenReceiverWebSocketServerOptions): {
31
+ wss: ws.Server<typeof WebSocket, typeof http.IncomingMessage>;
32
+ hub: ScreenReceiverSignalingHub;
33
+ close(): void;
34
+ };
35
+
36
+ export { type CreateScreenReceiverWebSocketServerOptions, ScreenReceiverSignalingHub, type ScreenReceiverSignalingHubOptions, createScreenReceiverWebSocketServer };
@@ -0,0 +1,36 @@
1
+ import * as ws from 'ws';
2
+ import { ServerOptions, WebSocket } from 'ws';
3
+ import * as http from 'http';
4
+
5
+ interface ScreenReceiverSignalingHubOptions {
6
+ logger?: (message: string) => void;
7
+ createPeerId?: () => string;
8
+ }
9
+ interface CreateScreenReceiverWebSocketServerOptions {
10
+ serverOptions: ServerOptions;
11
+ hubOptions?: ScreenReceiverSignalingHubOptions;
12
+ }
13
+ declare class ScreenReceiverSignalingHub {
14
+ private readonly rooms;
15
+ private readonly clients;
16
+ private readonly logger?;
17
+ private readonly createPeerId;
18
+ constructor(options?: ScreenReceiverSignalingHubOptions);
19
+ attachClient(socket: WebSocket): void;
20
+ close(): void;
21
+ private parseMessage;
22
+ private handleMessage;
23
+ private joinRoom;
24
+ private forwardSignal;
25
+ private broadcast;
26
+ private removeClient;
27
+ private send;
28
+ private log;
29
+ }
30
+ declare function createScreenReceiverWebSocketServer(options: CreateScreenReceiverWebSocketServerOptions): {
31
+ wss: ws.Server<typeof WebSocket, typeof http.IncomingMessage>;
32
+ hub: ScreenReceiverSignalingHub;
33
+ close(): void;
34
+ };
35
+
36
+ export { type CreateScreenReceiverWebSocketServerOptions, ScreenReceiverSignalingHub, type ScreenReceiverSignalingHubOptions, createScreenReceiverWebSocketServer };
@@ -0,0 +1,160 @@
1
+ 'use strict';
2
+
3
+ require('../../chunk-Z6ZWNWWR.js');
4
+ var crypto = require('crypto');
5
+ var ws = require('ws');
6
+
7
+ var WS_OPEN = 1;
8
+ var ScreenReceiverSignalingHub = class {
9
+ constructor(options = {}) {
10
+ this.rooms = /* @__PURE__ */ new Map();
11
+ this.clients = /* @__PURE__ */ new Map();
12
+ this.logger = options.logger;
13
+ this.createPeerId = options.createPeerId ?? crypto.randomUUID;
14
+ }
15
+ attachClient(socket) {
16
+ socket.on("message", (raw) => {
17
+ const message = this.parseMessage(raw);
18
+ if (!message) {
19
+ this.send(socket, { type: "error", reason: "invalid_json" });
20
+ return;
21
+ }
22
+ this.handleMessage(socket, message);
23
+ });
24
+ socket.on("close", () => this.removeClient(socket));
25
+ socket.on("error", () => this.removeClient(socket));
26
+ }
27
+ close() {
28
+ for (const socket of this.clients.keys()) {
29
+ socket.close();
30
+ }
31
+ this.rooms.clear();
32
+ this.clients.clear();
33
+ }
34
+ parseMessage(raw) {
35
+ try {
36
+ if (typeof raw === "string") return JSON.parse(raw);
37
+ if (raw instanceof ArrayBuffer) return JSON.parse(Buffer.from(raw).toString("utf-8"));
38
+ if (Array.isArray(raw)) return JSON.parse(Buffer.concat(raw).toString("utf-8"));
39
+ return JSON.parse(raw.toString());
40
+ } catch {
41
+ return null;
42
+ }
43
+ }
44
+ handleMessage(socket, message) {
45
+ if (isJoinMessage(message)) {
46
+ this.joinRoom(socket, message);
47
+ return;
48
+ }
49
+ const sender = this.clients.get(socket);
50
+ if (!sender) {
51
+ this.send(socket, { type: "error", reason: "join_first" });
52
+ return;
53
+ }
54
+ if (isSignalMessage(message)) {
55
+ this.forwardSignal(sender, message);
56
+ return;
57
+ }
58
+ this.send(socket, { type: "error", reason: "unknown_type" });
59
+ }
60
+ joinRoom(socket, message) {
61
+ const roomId = typeof message.roomId === "string" ? message.roomId.trim() : "";
62
+ if (!roomId) {
63
+ this.send(socket, { type: "error", reason: "missing_room_id" });
64
+ return;
65
+ }
66
+ this.removeClient(socket, false);
67
+ const role = message.role === "broadcaster" ? "broadcaster" : "viewer";
68
+ const peerId = typeof message.peerId === "string" && message.peerId.trim() ? message.peerId : this.createPeerId();
69
+ const record = { peerId, roomId, role, socket };
70
+ this.clients.set(socket, record);
71
+ const room = this.rooms.get(roomId) ?? /* @__PURE__ */ new Map();
72
+ room.set(peerId, record);
73
+ this.rooms.set(roomId, room);
74
+ this.send(socket, { type: "joined", roomId, peerId, role });
75
+ this.send(socket, {
76
+ type: "room_state",
77
+ roomId,
78
+ peers: [...room.values()].filter((peer) => peer.peerId !== peerId).map((peer) => ({ peerId: peer.peerId, role: peer.role }))
79
+ });
80
+ this.broadcast(roomId, socket, { type: "peer_joined", roomId, peerId, role });
81
+ this.log(`[screenReceiver] peer ${peerId} joined room ${roomId} as ${role}`);
82
+ }
83
+ forwardSignal(sender, message) {
84
+ const room = this.rooms.get(sender.roomId);
85
+ if (!room) return;
86
+ const payload = { ...message, fromPeerId: sender.peerId };
87
+ const targetPeerId = typeof message.targetPeerId === "string" ? message.targetPeerId : void 0;
88
+ if (targetPeerId) {
89
+ const target = room.get(targetPeerId);
90
+ if (!target) {
91
+ this.send(sender.socket, { type: "error", reason: "target_not_found", targetPeerId });
92
+ return;
93
+ }
94
+ this.send(target.socket, payload);
95
+ return;
96
+ }
97
+ this.broadcast(sender.roomId, sender.socket, payload);
98
+ }
99
+ broadcast(roomId, from, payload) {
100
+ const room = this.rooms.get(roomId);
101
+ if (!room) return;
102
+ for (const peer of room.values()) {
103
+ if (peer.socket === from || peer.socket.readyState !== WS_OPEN) continue;
104
+ this.send(peer.socket, payload);
105
+ }
106
+ }
107
+ removeClient(socket, notifyRoom = true) {
108
+ const record = this.clients.get(socket);
109
+ if (!record) return;
110
+ this.clients.delete(socket);
111
+ const room = this.rooms.get(record.roomId);
112
+ if (!room) return;
113
+ room.delete(record.peerId);
114
+ if (room.size === 0) {
115
+ this.rooms.delete(record.roomId);
116
+ } else if (notifyRoom) {
117
+ this.broadcast(record.roomId, socket, {
118
+ type: "peer_left",
119
+ roomId: record.roomId,
120
+ peerId: record.peerId
121
+ });
122
+ }
123
+ this.log(`[screenReceiver] peer ${record.peerId} left room ${record.roomId}`);
124
+ }
125
+ send(socket, payload) {
126
+ if (socket.readyState !== WS_OPEN) return;
127
+ socket.send(JSON.stringify(payload));
128
+ }
129
+ log(message) {
130
+ this.logger?.(message);
131
+ }
132
+ };
133
+ function isObject(value) {
134
+ return typeof value === "object" && value !== null;
135
+ }
136
+ function isJoinMessage(value) {
137
+ return isObject(value) && value.type === "join" && typeof value.roomId === "string";
138
+ }
139
+ function isSignalMessage(value) {
140
+ if (!isObject(value)) return false;
141
+ return value.type === "offer" || value.type === "answer" || value.type === "ice";
142
+ }
143
+ function createScreenReceiverWebSocketServer(options) {
144
+ const hub = new ScreenReceiverSignalingHub(options.hubOptions);
145
+ const wss = new ws.WebSocketServer(options.serverOptions);
146
+ wss.on("connection", (socket) => hub.attachClient(socket));
147
+ return {
148
+ wss,
149
+ hub,
150
+ close() {
151
+ hub.close();
152
+ wss.close();
153
+ }
154
+ };
155
+ }
156
+
157
+ exports.ScreenReceiverSignalingHub = ScreenReceiverSignalingHub;
158
+ exports.createScreenReceiverWebSocketServer = createScreenReceiverWebSocketServer;
159
+ //# sourceMappingURL=index.js.map
160
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/screenReceiver/server/index.ts"],"names":["randomUUID","WebSocketServer"],"mappings":"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","file":"index.js","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { WebSocketServer } from 'ws';\nimport type { RawData, ServerOptions, WebSocket } from 'ws';\nimport type {\n ScreenReceiverIncomingMessage,\n ScreenReceiverRole,\n ScreenReceiverSignalMessage,\n} from '../types';\n\ntype PeerRecord = {\n peerId: string;\n roomId: string;\n role: ScreenReceiverRole;\n socket: WebSocket;\n};\n\ntype RoomPeers = Map<string, PeerRecord>;\n\nconst WS_OPEN = 1;\n\nexport interface ScreenReceiverSignalingHubOptions {\n logger?: (message: string) => void;\n createPeerId?: () => string;\n}\n\nexport interface CreateScreenReceiverWebSocketServerOptions {\n serverOptions: ServerOptions;\n hubOptions?: ScreenReceiverSignalingHubOptions;\n}\n\nexport class ScreenReceiverSignalingHub {\n private readonly rooms = new Map<string, RoomPeers>();\n private readonly clients = new Map<WebSocket, PeerRecord>();\n private readonly logger?: (message: string) => void;\n private readonly createPeerId: () => string;\n\n constructor(options: ScreenReceiverSignalingHubOptions = {}) {\n this.logger = options.logger;\n this.createPeerId = options.createPeerId ?? randomUUID;\n }\n\n attachClient(socket: WebSocket) {\n socket.on('message', (raw) => {\n const message = this.parseMessage(raw);\n if (!message) {\n this.send(socket, { type: 'error', reason: 'invalid_json' });\n return;\n }\n this.handleMessage(socket, message);\n });\n\n socket.on('close', () => this.removeClient(socket));\n socket.on('error', () => this.removeClient(socket));\n }\n\n close() {\n for (const socket of this.clients.keys()) {\n socket.close();\n }\n this.rooms.clear();\n this.clients.clear();\n }\n\n private parseMessage(raw: RawData): ScreenReceiverIncomingMessage | null {\n try {\n if (typeof raw === 'string') return JSON.parse(raw);\n if (raw instanceof ArrayBuffer) return JSON.parse(Buffer.from(raw).toString('utf-8'));\n if (Array.isArray(raw)) return JSON.parse(Buffer.concat(raw).toString('utf-8'));\n return JSON.parse(raw.toString());\n } catch {\n return null;\n }\n }\n\n private handleMessage(socket: WebSocket, message: ScreenReceiverIncomingMessage) {\n if (isJoinMessage(message)) {\n this.joinRoom(socket, message);\n return;\n }\n\n const sender = this.clients.get(socket);\n if (!sender) {\n this.send(socket, { type: 'error', reason: 'join_first' });\n return;\n }\n\n if (isSignalMessage(message)) {\n this.forwardSignal(sender, message);\n return;\n }\n\n this.send(socket, { type: 'error', reason: 'unknown_type' });\n }\n\n private joinRoom(socket: WebSocket, message: { type: 'join'; roomId: string; role?: string; peerId?: string }) {\n const roomId = typeof message.roomId === 'string' ? message.roomId.trim() : '';\n if (!roomId) {\n this.send(socket, { type: 'error', reason: 'missing_room_id' });\n return;\n }\n\n this.removeClient(socket, false);\n\n const role: ScreenReceiverRole = message.role === 'broadcaster' ? 'broadcaster' : 'viewer';\n const peerId = typeof message.peerId === 'string' && message.peerId.trim() ? message.peerId : this.createPeerId();\n\n const record: PeerRecord = { peerId, roomId, role, socket };\n this.clients.set(socket, record);\n const room = this.rooms.get(roomId) ?? new Map<string, PeerRecord>();\n room.set(peerId, record);\n this.rooms.set(roomId, room);\n\n this.send(socket, { type: 'joined', roomId, peerId, role });\n this.send(socket, {\n type: 'room_state',\n roomId,\n peers: [...room.values()]\n .filter((peer) => peer.peerId !== peerId)\n .map((peer) => ({ peerId: peer.peerId, role: peer.role })),\n });\n this.broadcast(roomId, socket, { type: 'peer_joined', roomId, peerId, role });\n this.log(`[screenReceiver] peer ${peerId} joined room ${roomId} as ${role}`);\n }\n\n private forwardSignal(sender: PeerRecord, message: ScreenReceiverSignalMessage) {\n const room = this.rooms.get(sender.roomId);\n if (!room) return;\n const payload = { ...message, fromPeerId: sender.peerId };\n\n const targetPeerId = typeof message.targetPeerId === 'string' ? message.targetPeerId : undefined;\n if (targetPeerId) {\n const target = room.get(targetPeerId);\n if (!target) {\n this.send(sender.socket, { type: 'error', reason: 'target_not_found', targetPeerId });\n return;\n }\n this.send(target.socket, payload);\n return;\n }\n\n this.broadcast(sender.roomId, sender.socket, payload);\n }\n\n private broadcast(roomId: string, from: WebSocket, payload: unknown) {\n const room = this.rooms.get(roomId);\n if (!room) return;\n for (const peer of room.values()) {\n if (peer.socket === from || peer.socket.readyState !== WS_OPEN) continue;\n this.send(peer.socket, payload);\n }\n }\n\n private removeClient(socket: WebSocket, notifyRoom = true) {\n const record = this.clients.get(socket);\n if (!record) return;\n this.clients.delete(socket);\n\n const room = this.rooms.get(record.roomId);\n if (!room) return;\n room.delete(record.peerId);\n if (room.size === 0) {\n this.rooms.delete(record.roomId);\n } else if (notifyRoom) {\n this.broadcast(record.roomId, socket, {\n type: 'peer_left',\n roomId: record.roomId,\n peerId: record.peerId,\n });\n }\n this.log(`[screenReceiver] peer ${record.peerId} left room ${record.roomId}`);\n }\n\n private send(socket: WebSocket, payload: unknown) {\n if (socket.readyState !== WS_OPEN) return;\n socket.send(JSON.stringify(payload));\n }\n\n private log(message: string) {\n this.logger?.(message);\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isJoinMessage(value: ScreenReceiverIncomingMessage): value is { type: 'join'; roomId: string; role?: string; peerId?: string } {\n return isObject(value) && value.type === 'join' && typeof value.roomId === 'string';\n}\n\nfunction isSignalMessage(value: ScreenReceiverIncomingMessage): value is ScreenReceiverSignalMessage {\n if (!isObject(value)) return false;\n return value.type === 'offer' || value.type === 'answer' || value.type === 'ice';\n}\n\nexport function createScreenReceiverWebSocketServer(options: CreateScreenReceiverWebSocketServerOptions) {\n const hub = new ScreenReceiverSignalingHub(options.hubOptions);\n const wss = new WebSocketServer(options.serverOptions);\n wss.on('connection', (socket) => hub.attachClient(socket));\n\n return {\n wss,\n hub,\n close() {\n hub.close();\n wss.close();\n },\n };\n}\n"]}
@@ -0,0 +1,157 @@
1
+ import '../../chunk-WMJKH4XE.mjs';
2
+ import { randomUUID } from 'crypto';
3
+ import { WebSocketServer } from 'ws';
4
+
5
+ var WS_OPEN = 1;
6
+ var ScreenReceiverSignalingHub = class {
7
+ constructor(options = {}) {
8
+ this.rooms = /* @__PURE__ */ new Map();
9
+ this.clients = /* @__PURE__ */ new Map();
10
+ this.logger = options.logger;
11
+ this.createPeerId = options.createPeerId ?? randomUUID;
12
+ }
13
+ attachClient(socket) {
14
+ socket.on("message", (raw) => {
15
+ const message = this.parseMessage(raw);
16
+ if (!message) {
17
+ this.send(socket, { type: "error", reason: "invalid_json" });
18
+ return;
19
+ }
20
+ this.handleMessage(socket, message);
21
+ });
22
+ socket.on("close", () => this.removeClient(socket));
23
+ socket.on("error", () => this.removeClient(socket));
24
+ }
25
+ close() {
26
+ for (const socket of this.clients.keys()) {
27
+ socket.close();
28
+ }
29
+ this.rooms.clear();
30
+ this.clients.clear();
31
+ }
32
+ parseMessage(raw) {
33
+ try {
34
+ if (typeof raw === "string") return JSON.parse(raw);
35
+ if (raw instanceof ArrayBuffer) return JSON.parse(Buffer.from(raw).toString("utf-8"));
36
+ if (Array.isArray(raw)) return JSON.parse(Buffer.concat(raw).toString("utf-8"));
37
+ return JSON.parse(raw.toString());
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+ handleMessage(socket, message) {
43
+ if (isJoinMessage(message)) {
44
+ this.joinRoom(socket, message);
45
+ return;
46
+ }
47
+ const sender = this.clients.get(socket);
48
+ if (!sender) {
49
+ this.send(socket, { type: "error", reason: "join_first" });
50
+ return;
51
+ }
52
+ if (isSignalMessage(message)) {
53
+ this.forwardSignal(sender, message);
54
+ return;
55
+ }
56
+ this.send(socket, { type: "error", reason: "unknown_type" });
57
+ }
58
+ joinRoom(socket, message) {
59
+ const roomId = typeof message.roomId === "string" ? message.roomId.trim() : "";
60
+ if (!roomId) {
61
+ this.send(socket, { type: "error", reason: "missing_room_id" });
62
+ return;
63
+ }
64
+ this.removeClient(socket, false);
65
+ const role = message.role === "broadcaster" ? "broadcaster" : "viewer";
66
+ const peerId = typeof message.peerId === "string" && message.peerId.trim() ? message.peerId : this.createPeerId();
67
+ const record = { peerId, roomId, role, socket };
68
+ this.clients.set(socket, record);
69
+ const room = this.rooms.get(roomId) ?? /* @__PURE__ */ new Map();
70
+ room.set(peerId, record);
71
+ this.rooms.set(roomId, room);
72
+ this.send(socket, { type: "joined", roomId, peerId, role });
73
+ this.send(socket, {
74
+ type: "room_state",
75
+ roomId,
76
+ peers: [...room.values()].filter((peer) => peer.peerId !== peerId).map((peer) => ({ peerId: peer.peerId, role: peer.role }))
77
+ });
78
+ this.broadcast(roomId, socket, { type: "peer_joined", roomId, peerId, role });
79
+ this.log(`[screenReceiver] peer ${peerId} joined room ${roomId} as ${role}`);
80
+ }
81
+ forwardSignal(sender, message) {
82
+ const room = this.rooms.get(sender.roomId);
83
+ if (!room) return;
84
+ const payload = { ...message, fromPeerId: sender.peerId };
85
+ const targetPeerId = typeof message.targetPeerId === "string" ? message.targetPeerId : void 0;
86
+ if (targetPeerId) {
87
+ const target = room.get(targetPeerId);
88
+ if (!target) {
89
+ this.send(sender.socket, { type: "error", reason: "target_not_found", targetPeerId });
90
+ return;
91
+ }
92
+ this.send(target.socket, payload);
93
+ return;
94
+ }
95
+ this.broadcast(sender.roomId, sender.socket, payload);
96
+ }
97
+ broadcast(roomId, from, payload) {
98
+ const room = this.rooms.get(roomId);
99
+ if (!room) return;
100
+ for (const peer of room.values()) {
101
+ if (peer.socket === from || peer.socket.readyState !== WS_OPEN) continue;
102
+ this.send(peer.socket, payload);
103
+ }
104
+ }
105
+ removeClient(socket, notifyRoom = true) {
106
+ const record = this.clients.get(socket);
107
+ if (!record) return;
108
+ this.clients.delete(socket);
109
+ const room = this.rooms.get(record.roomId);
110
+ if (!room) return;
111
+ room.delete(record.peerId);
112
+ if (room.size === 0) {
113
+ this.rooms.delete(record.roomId);
114
+ } else if (notifyRoom) {
115
+ this.broadcast(record.roomId, socket, {
116
+ type: "peer_left",
117
+ roomId: record.roomId,
118
+ peerId: record.peerId
119
+ });
120
+ }
121
+ this.log(`[screenReceiver] peer ${record.peerId} left room ${record.roomId}`);
122
+ }
123
+ send(socket, payload) {
124
+ if (socket.readyState !== WS_OPEN) return;
125
+ socket.send(JSON.stringify(payload));
126
+ }
127
+ log(message) {
128
+ this.logger?.(message);
129
+ }
130
+ };
131
+ function isObject(value) {
132
+ return typeof value === "object" && value !== null;
133
+ }
134
+ function isJoinMessage(value) {
135
+ return isObject(value) && value.type === "join" && typeof value.roomId === "string";
136
+ }
137
+ function isSignalMessage(value) {
138
+ if (!isObject(value)) return false;
139
+ return value.type === "offer" || value.type === "answer" || value.type === "ice";
140
+ }
141
+ function createScreenReceiverWebSocketServer(options) {
142
+ const hub = new ScreenReceiverSignalingHub(options.hubOptions);
143
+ const wss = new WebSocketServer(options.serverOptions);
144
+ wss.on("connection", (socket) => hub.attachClient(socket));
145
+ return {
146
+ wss,
147
+ hub,
148
+ close() {
149
+ hub.close();
150
+ wss.close();
151
+ }
152
+ };
153
+ }
154
+
155
+ export { ScreenReceiverSignalingHub, createScreenReceiverWebSocketServer };
156
+ //# sourceMappingURL=index.mjs.map
157
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/screenReceiver/server/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { WebSocketServer } from 'ws';\nimport type { RawData, ServerOptions, WebSocket } from 'ws';\nimport type {\n ScreenReceiverIncomingMessage,\n ScreenReceiverRole,\n ScreenReceiverSignalMessage,\n} from '../types';\n\ntype PeerRecord = {\n peerId: string;\n roomId: string;\n role: ScreenReceiverRole;\n socket: WebSocket;\n};\n\ntype RoomPeers = Map<string, PeerRecord>;\n\nconst WS_OPEN = 1;\n\nexport interface ScreenReceiverSignalingHubOptions {\n logger?: (message: string) => void;\n createPeerId?: () => string;\n}\n\nexport interface CreateScreenReceiverWebSocketServerOptions {\n serverOptions: ServerOptions;\n hubOptions?: ScreenReceiverSignalingHubOptions;\n}\n\nexport class ScreenReceiverSignalingHub {\n private readonly rooms = new Map<string, RoomPeers>();\n private readonly clients = new Map<WebSocket, PeerRecord>();\n private readonly logger?: (message: string) => void;\n private readonly createPeerId: () => string;\n\n constructor(options: ScreenReceiverSignalingHubOptions = {}) {\n this.logger = options.logger;\n this.createPeerId = options.createPeerId ?? randomUUID;\n }\n\n attachClient(socket: WebSocket) {\n socket.on('message', (raw) => {\n const message = this.parseMessage(raw);\n if (!message) {\n this.send(socket, { type: 'error', reason: 'invalid_json' });\n return;\n }\n this.handleMessage(socket, message);\n });\n\n socket.on('close', () => this.removeClient(socket));\n socket.on('error', () => this.removeClient(socket));\n }\n\n close() {\n for (const socket of this.clients.keys()) {\n socket.close();\n }\n this.rooms.clear();\n this.clients.clear();\n }\n\n private parseMessage(raw: RawData): ScreenReceiverIncomingMessage | null {\n try {\n if (typeof raw === 'string') return JSON.parse(raw);\n if (raw instanceof ArrayBuffer) return JSON.parse(Buffer.from(raw).toString('utf-8'));\n if (Array.isArray(raw)) return JSON.parse(Buffer.concat(raw).toString('utf-8'));\n return JSON.parse(raw.toString());\n } catch {\n return null;\n }\n }\n\n private handleMessage(socket: WebSocket, message: ScreenReceiverIncomingMessage) {\n if (isJoinMessage(message)) {\n this.joinRoom(socket, message);\n return;\n }\n\n const sender = this.clients.get(socket);\n if (!sender) {\n this.send(socket, { type: 'error', reason: 'join_first' });\n return;\n }\n\n if (isSignalMessage(message)) {\n this.forwardSignal(sender, message);\n return;\n }\n\n this.send(socket, { type: 'error', reason: 'unknown_type' });\n }\n\n private joinRoom(socket: WebSocket, message: { type: 'join'; roomId: string; role?: string; peerId?: string }) {\n const roomId = typeof message.roomId === 'string' ? message.roomId.trim() : '';\n if (!roomId) {\n this.send(socket, { type: 'error', reason: 'missing_room_id' });\n return;\n }\n\n this.removeClient(socket, false);\n\n const role: ScreenReceiverRole = message.role === 'broadcaster' ? 'broadcaster' : 'viewer';\n const peerId = typeof message.peerId === 'string' && message.peerId.trim() ? message.peerId : this.createPeerId();\n\n const record: PeerRecord = { peerId, roomId, role, socket };\n this.clients.set(socket, record);\n const room = this.rooms.get(roomId) ?? new Map<string, PeerRecord>();\n room.set(peerId, record);\n this.rooms.set(roomId, room);\n\n this.send(socket, { type: 'joined', roomId, peerId, role });\n this.send(socket, {\n type: 'room_state',\n roomId,\n peers: [...room.values()]\n .filter((peer) => peer.peerId !== peerId)\n .map((peer) => ({ peerId: peer.peerId, role: peer.role })),\n });\n this.broadcast(roomId, socket, { type: 'peer_joined', roomId, peerId, role });\n this.log(`[screenReceiver] peer ${peerId} joined room ${roomId} as ${role}`);\n }\n\n private forwardSignal(sender: PeerRecord, message: ScreenReceiverSignalMessage) {\n const room = this.rooms.get(sender.roomId);\n if (!room) return;\n const payload = { ...message, fromPeerId: sender.peerId };\n\n const targetPeerId = typeof message.targetPeerId === 'string' ? message.targetPeerId : undefined;\n if (targetPeerId) {\n const target = room.get(targetPeerId);\n if (!target) {\n this.send(sender.socket, { type: 'error', reason: 'target_not_found', targetPeerId });\n return;\n }\n this.send(target.socket, payload);\n return;\n }\n\n this.broadcast(sender.roomId, sender.socket, payload);\n }\n\n private broadcast(roomId: string, from: WebSocket, payload: unknown) {\n const room = this.rooms.get(roomId);\n if (!room) return;\n for (const peer of room.values()) {\n if (peer.socket === from || peer.socket.readyState !== WS_OPEN) continue;\n this.send(peer.socket, payload);\n }\n }\n\n private removeClient(socket: WebSocket, notifyRoom = true) {\n const record = this.clients.get(socket);\n if (!record) return;\n this.clients.delete(socket);\n\n const room = this.rooms.get(record.roomId);\n if (!room) return;\n room.delete(record.peerId);\n if (room.size === 0) {\n this.rooms.delete(record.roomId);\n } else if (notifyRoom) {\n this.broadcast(record.roomId, socket, {\n type: 'peer_left',\n roomId: record.roomId,\n peerId: record.peerId,\n });\n }\n this.log(`[screenReceiver] peer ${record.peerId} left room ${record.roomId}`);\n }\n\n private send(socket: WebSocket, payload: unknown) {\n if (socket.readyState !== WS_OPEN) return;\n socket.send(JSON.stringify(payload));\n }\n\n private log(message: string) {\n this.logger?.(message);\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isJoinMessage(value: ScreenReceiverIncomingMessage): value is { type: 'join'; roomId: string; role?: string; peerId?: string } {\n return isObject(value) && value.type === 'join' && typeof value.roomId === 'string';\n}\n\nfunction isSignalMessage(value: ScreenReceiverIncomingMessage): value is ScreenReceiverSignalMessage {\n if (!isObject(value)) return false;\n return value.type === 'offer' || value.type === 'answer' || value.type === 'ice';\n}\n\nexport function createScreenReceiverWebSocketServer(options: CreateScreenReceiverWebSocketServerOptions) {\n const hub = new ScreenReceiverSignalingHub(options.hubOptions);\n const wss = new WebSocketServer(options.serverOptions);\n wss.on('connection', (socket) => hub.attachClient(socket));\n\n return {\n wss,\n hub,\n close() {\n hub.close();\n wss.close();\n },\n };\n}\n"]}