matterbridge 3.3.7-dev-20251108-f254812 → 3.3.7

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 (304) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/README-SERVICE-OPT.md +23 -7
  3. package/dist/broadcastServer.d.ts +115 -0
  4. package/dist/broadcastServer.d.ts.map +1 -0
  5. package/dist/broadcastServer.js +93 -1
  6. package/dist/broadcastServer.js.map +1 -0
  7. package/dist/broadcastServerTypes.d.ts +806 -0
  8. package/dist/broadcastServerTypes.d.ts.map +1 -0
  9. package/dist/broadcastServerTypes.js +24 -0
  10. package/dist/broadcastServerTypes.js.map +1 -0
  11. package/dist/cli.d.ts +30 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +97 -1
  14. package/dist/cli.js.map +1 -0
  15. package/dist/cliEmitter.d.ts +50 -0
  16. package/dist/cliEmitter.d.ts.map +1 -0
  17. package/dist/cliEmitter.js +37 -0
  18. package/dist/cliEmitter.js.map +1 -0
  19. package/dist/cliHistory.d.ts +48 -0
  20. package/dist/cliHistory.d.ts.map +1 -0
  21. package/dist/cliHistory.js +38 -0
  22. package/dist/cliHistory.js.map +1 -0
  23. package/dist/clusters/export.d.ts +2 -0
  24. package/dist/clusters/export.d.ts.map +1 -0
  25. package/dist/clusters/export.js +2 -0
  26. package/dist/clusters/export.js.map +1 -0
  27. package/dist/defaultConfigSchema.d.ts +28 -0
  28. package/dist/defaultConfigSchema.d.ts.map +1 -0
  29. package/dist/defaultConfigSchema.js +24 -0
  30. package/dist/defaultConfigSchema.js.map +1 -0
  31. package/dist/deviceManager.d.ts +128 -0
  32. package/dist/deviceManager.d.ts.map +1 -0
  33. package/dist/deviceManager.js +105 -1
  34. package/dist/deviceManager.js.map +1 -0
  35. package/dist/devices/airConditioner.d.ts +98 -0
  36. package/dist/devices/airConditioner.d.ts.map +1 -0
  37. package/dist/devices/airConditioner.js +57 -0
  38. package/dist/devices/airConditioner.js.map +1 -0
  39. package/dist/devices/batteryStorage.d.ts +48 -0
  40. package/dist/devices/batteryStorage.d.ts.map +1 -0
  41. package/dist/devices/batteryStorage.js +48 -1
  42. package/dist/devices/batteryStorage.js.map +1 -0
  43. package/dist/devices/cooktop.d.ts +60 -0
  44. package/dist/devices/cooktop.d.ts.map +1 -0
  45. package/dist/devices/cooktop.js +55 -0
  46. package/dist/devices/cooktop.js.map +1 -0
  47. package/dist/devices/dishwasher.d.ts +71 -0
  48. package/dist/devices/dishwasher.d.ts.map +1 -0
  49. package/dist/devices/dishwasher.js +57 -0
  50. package/dist/devices/dishwasher.js.map +1 -0
  51. package/dist/devices/evse.d.ts +76 -0
  52. package/dist/devices/evse.d.ts.map +1 -0
  53. package/dist/devices/evse.js +74 -10
  54. package/dist/devices/evse.js.map +1 -0
  55. package/dist/devices/export.d.ts +17 -0
  56. package/dist/devices/export.d.ts.map +1 -0
  57. package/dist/devices/export.js +5 -0
  58. package/dist/devices/export.js.map +1 -0
  59. package/dist/devices/extractorHood.d.ts +46 -0
  60. package/dist/devices/extractorHood.d.ts.map +1 -0
  61. package/dist/devices/extractorHood.js +42 -0
  62. package/dist/devices/extractorHood.js.map +1 -0
  63. package/dist/devices/heatPump.d.ts +47 -0
  64. package/dist/devices/heatPump.d.ts.map +1 -0
  65. package/dist/devices/heatPump.js +50 -2
  66. package/dist/devices/heatPump.js.map +1 -0
  67. package/dist/devices/laundryDryer.d.ts +67 -0
  68. package/dist/devices/laundryDryer.d.ts.map +1 -0
  69. package/dist/devices/laundryDryer.js +62 -3
  70. package/dist/devices/laundryDryer.js.map +1 -0
  71. package/dist/devices/laundryWasher.d.ts +81 -0
  72. package/dist/devices/laundryWasher.d.ts.map +1 -0
  73. package/dist/devices/laundryWasher.js +70 -4
  74. package/dist/devices/laundryWasher.js.map +1 -0
  75. package/dist/devices/microwaveOven.d.ts +168 -0
  76. package/dist/devices/microwaveOven.d.ts.map +1 -0
  77. package/dist/devices/microwaveOven.js +88 -5
  78. package/dist/devices/microwaveOven.js.map +1 -0
  79. package/dist/devices/oven.d.ts +105 -0
  80. package/dist/devices/oven.d.ts.map +1 -0
  81. package/dist/devices/oven.js +85 -0
  82. package/dist/devices/oven.js.map +1 -0
  83. package/dist/devices/refrigerator.d.ts +118 -0
  84. package/dist/devices/refrigerator.d.ts.map +1 -0
  85. package/dist/devices/refrigerator.js +102 -0
  86. package/dist/devices/refrigerator.js.map +1 -0
  87. package/dist/devices/roboticVacuumCleaner.d.ts +112 -0
  88. package/dist/devices/roboticVacuumCleaner.d.ts.map +1 -0
  89. package/dist/devices/roboticVacuumCleaner.js +100 -9
  90. package/dist/devices/roboticVacuumCleaner.js.map +1 -0
  91. package/dist/devices/solarPower.d.ts +40 -0
  92. package/dist/devices/solarPower.d.ts.map +1 -0
  93. package/dist/devices/solarPower.js +38 -0
  94. package/dist/devices/solarPower.js.map +1 -0
  95. package/dist/devices/speaker.d.ts +87 -0
  96. package/dist/devices/speaker.d.ts.map +1 -0
  97. package/dist/devices/speaker.js +84 -0
  98. package/dist/devices/speaker.js.map +1 -0
  99. package/dist/devices/temperatureControl.d.ts +166 -0
  100. package/dist/devices/temperatureControl.d.ts.map +1 -0
  101. package/dist/devices/temperatureControl.js +24 -3
  102. package/dist/devices/temperatureControl.js.map +1 -0
  103. package/dist/devices/waterHeater.d.ts +111 -0
  104. package/dist/devices/waterHeater.d.ts.map +1 -0
  105. package/dist/devices/waterHeater.js +82 -2
  106. package/dist/devices/waterHeater.js.map +1 -0
  107. package/dist/dgram/coap.d.ts +205 -0
  108. package/dist/dgram/coap.d.ts.map +1 -0
  109. package/dist/dgram/coap.js +126 -13
  110. package/dist/dgram/coap.js.map +1 -0
  111. package/dist/dgram/dgram.d.ts +141 -0
  112. package/dist/dgram/dgram.d.ts.map +1 -0
  113. package/dist/dgram/dgram.js +114 -2
  114. package/dist/dgram/dgram.js.map +1 -0
  115. package/dist/dgram/mb_coap.d.ts +24 -0
  116. package/dist/dgram/mb_coap.d.ts.map +1 -0
  117. package/dist/dgram/mb_coap.js +41 -3
  118. package/dist/dgram/mb_coap.js.map +1 -0
  119. package/dist/dgram/mb_mdns.d.ts +24 -0
  120. package/dist/dgram/mb_mdns.d.ts.map +1 -0
  121. package/dist/dgram/mb_mdns.js +80 -15
  122. package/dist/dgram/mb_mdns.js.map +1 -0
  123. package/dist/dgram/mdns.d.ts +290 -0
  124. package/dist/dgram/mdns.d.ts.map +1 -0
  125. package/dist/dgram/mdns.js +299 -137
  126. package/dist/dgram/mdns.js.map +1 -0
  127. package/dist/dgram/multicast.d.ts +67 -0
  128. package/dist/dgram/multicast.d.ts.map +1 -0
  129. package/dist/dgram/multicast.js +62 -1
  130. package/dist/dgram/multicast.js.map +1 -0
  131. package/dist/dgram/unicast.d.ts +56 -0
  132. package/dist/dgram/unicast.d.ts.map +1 -0
  133. package/dist/dgram/unicast.js +54 -0
  134. package/dist/dgram/unicast.js.map +1 -0
  135. package/dist/frontend.d.ts +238 -0
  136. package/dist/frontend.d.ts.map +1 -0
  137. package/dist/frontend.js +451 -35
  138. package/dist/frontend.js.map +1 -0
  139. package/dist/frontendTypes.d.ts +529 -0
  140. package/dist/frontendTypes.d.ts.map +1 -0
  141. package/dist/frontendTypes.js +45 -0
  142. package/dist/frontendTypes.js.map +1 -0
  143. package/dist/helpers.d.ts +48 -0
  144. package/dist/helpers.d.ts.map +1 -0
  145. package/dist/helpers.js +53 -0
  146. package/dist/helpers.js.map +1 -0
  147. package/dist/index.d.ts +33 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +25 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/logger/export.d.ts +2 -0
  152. package/dist/logger/export.d.ts.map +1 -0
  153. package/dist/logger/export.js +1 -0
  154. package/dist/logger/export.js.map +1 -0
  155. package/dist/matter/behaviors.d.ts +2 -0
  156. package/dist/matter/behaviors.d.ts.map +1 -0
  157. package/dist/matter/behaviors.js +2 -0
  158. package/dist/matter/behaviors.js.map +1 -0
  159. package/dist/matter/clusters.d.ts +2 -0
  160. package/dist/matter/clusters.d.ts.map +1 -0
  161. package/dist/matter/clusters.js +2 -0
  162. package/dist/matter/clusters.js.map +1 -0
  163. package/dist/matter/devices.d.ts +2 -0
  164. package/dist/matter/devices.d.ts.map +1 -0
  165. package/dist/matter/devices.js +2 -0
  166. package/dist/matter/devices.js.map +1 -0
  167. package/dist/matter/endpoints.d.ts +2 -0
  168. package/dist/matter/endpoints.d.ts.map +1 -0
  169. package/dist/matter/endpoints.js +2 -0
  170. package/dist/matter/endpoints.js.map +1 -0
  171. package/dist/matter/export.d.ts +5 -0
  172. package/dist/matter/export.d.ts.map +1 -0
  173. package/dist/matter/export.js +3 -0
  174. package/dist/matter/export.js.map +1 -0
  175. package/dist/matter/types.d.ts +3 -0
  176. package/dist/matter/types.d.ts.map +1 -0
  177. package/dist/matter/types.js +3 -0
  178. package/dist/matter/types.js.map +1 -0
  179. package/dist/matterbridge.d.ts +478 -0
  180. package/dist/matterbridge.d.ts.map +1 -0
  181. package/dist/matterbridge.js +828 -46
  182. package/dist/matterbridge.js.map +1 -0
  183. package/dist/matterbridgeAccessoryPlatform.d.ts +42 -0
  184. package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -0
  185. package/dist/matterbridgeAccessoryPlatform.js +37 -0
  186. package/dist/matterbridgeAccessoryPlatform.js.map +1 -0
  187. package/dist/matterbridgeBehaviors.d.ts +2404 -0
  188. package/dist/matterbridgeBehaviors.d.ts.map +1 -0
  189. package/dist/matterbridgeBehaviors.js +68 -5
  190. package/dist/matterbridgeBehaviors.js.map +1 -0
  191. package/dist/matterbridgeDeviceTypes.d.ts +770 -0
  192. package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
  193. package/dist/matterbridgeDeviceTypes.js +638 -17
  194. package/dist/matterbridgeDeviceTypes.js.map +1 -0
  195. package/dist/matterbridgeDynamicPlatform.d.ts +42 -0
  196. package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -0
  197. package/dist/matterbridgeDynamicPlatform.js +37 -0
  198. package/dist/matterbridgeDynamicPlatform.js.map +1 -0
  199. package/dist/matterbridgeEndpoint.d.ts +1556 -0
  200. package/dist/matterbridgeEndpoint.d.ts.map +1 -0
  201. package/dist/matterbridgeEndpoint.js +1408 -52
  202. package/dist/matterbridgeEndpoint.js.map +1 -0
  203. package/dist/matterbridgeEndpointHelpers.d.ts +758 -0
  204. package/dist/matterbridgeEndpointHelpers.d.ts.map +1 -0
  205. package/dist/matterbridgeEndpointHelpers.js +464 -19
  206. package/dist/matterbridgeEndpointHelpers.js.map +1 -0
  207. package/dist/matterbridgePlatform.d.ts +402 -0
  208. package/dist/matterbridgePlatform.d.ts.map +1 -0
  209. package/dist/matterbridgePlatform.js +341 -1
  210. package/dist/matterbridgePlatform.js.map +1 -0
  211. package/dist/matterbridgeTypes.d.ts +239 -0
  212. package/dist/matterbridgeTypes.d.ts.map +1 -0
  213. package/dist/matterbridgeTypes.js +26 -0
  214. package/dist/matterbridgeTypes.js.map +1 -0
  215. package/dist/pluginManager.d.ts +371 -0
  216. package/dist/pluginManager.d.ts.map +1 -0
  217. package/dist/pluginManager.js +339 -4
  218. package/dist/pluginManager.js.map +1 -0
  219. package/dist/shelly.d.ts +174 -0
  220. package/dist/shelly.d.ts.map +1 -0
  221. package/dist/shelly.js +168 -7
  222. package/dist/shelly.js.map +1 -0
  223. package/dist/storage/export.d.ts +2 -0
  224. package/dist/storage/export.d.ts.map +1 -0
  225. package/dist/storage/export.js +1 -0
  226. package/dist/storage/export.js.map +1 -0
  227. package/dist/update.d.ts +75 -0
  228. package/dist/update.d.ts.map +1 -0
  229. package/dist/update.js +69 -0
  230. package/dist/update.js.map +1 -0
  231. package/dist/utils/colorUtils.d.ts +101 -0
  232. package/dist/utils/colorUtils.d.ts.map +1 -0
  233. package/dist/utils/colorUtils.js +97 -2
  234. package/dist/utils/colorUtils.js.map +1 -0
  235. package/dist/utils/commandLine.d.ts +66 -0
  236. package/dist/utils/commandLine.d.ts.map +1 -0
  237. package/dist/utils/commandLine.js +60 -0
  238. package/dist/utils/commandLine.js.map +1 -0
  239. package/dist/utils/copyDirectory.d.ts +33 -0
  240. package/dist/utils/copyDirectory.d.ts.map +1 -0
  241. package/dist/utils/copyDirectory.js +38 -1
  242. package/dist/utils/copyDirectory.js.map +1 -0
  243. package/dist/utils/createDirectory.d.ts +34 -0
  244. package/dist/utils/createDirectory.d.ts.map +1 -0
  245. package/dist/utils/createDirectory.js +33 -0
  246. package/dist/utils/createDirectory.js.map +1 -0
  247. package/dist/utils/createZip.d.ts +39 -0
  248. package/dist/utils/createZip.d.ts.map +1 -0
  249. package/dist/utils/createZip.js +47 -2
  250. package/dist/utils/createZip.js.map +1 -0
  251. package/dist/utils/deepCopy.d.ts +32 -0
  252. package/dist/utils/deepCopy.d.ts.map +1 -0
  253. package/dist/utils/deepCopy.js +39 -0
  254. package/dist/utils/deepCopy.js.map +1 -0
  255. package/dist/utils/deepEqual.d.ts +54 -0
  256. package/dist/utils/deepEqual.d.ts.map +1 -0
  257. package/dist/utils/deepEqual.js +72 -1
  258. package/dist/utils/deepEqual.js.map +1 -0
  259. package/dist/utils/error.d.ts +44 -0
  260. package/dist/utils/error.d.ts.map +1 -0
  261. package/dist/utils/error.js +41 -0
  262. package/dist/utils/error.js.map +1 -0
  263. package/dist/utils/export.d.ts +13 -0
  264. package/dist/utils/export.d.ts.map +1 -0
  265. package/dist/utils/export.js +1 -0
  266. package/dist/utils/export.js.map +1 -0
  267. package/dist/utils/format.d.ts +53 -0
  268. package/dist/utils/format.d.ts.map +1 -0
  269. package/dist/utils/format.js +49 -0
  270. package/dist/utils/format.js.map +1 -0
  271. package/dist/utils/hex.d.ts +89 -0
  272. package/dist/utils/hex.d.ts.map +1 -0
  273. package/dist/utils/hex.js +124 -0
  274. package/dist/utils/hex.js.map +1 -0
  275. package/dist/utils/inspector.d.ts +87 -0
  276. package/dist/utils/inspector.d.ts.map +1 -0
  277. package/dist/utils/inspector.js +69 -1
  278. package/dist/utils/inspector.js.map +1 -0
  279. package/dist/utils/isvalid.d.ts +103 -0
  280. package/dist/utils/isvalid.d.ts.map +1 -0
  281. package/dist/utils/isvalid.js +101 -0
  282. package/dist/utils/isvalid.js.map +1 -0
  283. package/dist/utils/jestHelpers.d.ts +139 -0
  284. package/dist/utils/jestHelpers.d.ts.map +1 -0
  285. package/dist/utils/jestHelpers.js +153 -3
  286. package/dist/utils/jestHelpers.js.map +1 -0
  287. package/dist/utils/network.d.ts +101 -0
  288. package/dist/utils/network.d.ts.map +1 -0
  289. package/dist/utils/network.js +96 -5
  290. package/dist/utils/network.js.map +1 -0
  291. package/dist/utils/spawn.d.ts +35 -0
  292. package/dist/utils/spawn.d.ts.map +1 -0
  293. package/dist/utils/spawn.js +71 -0
  294. package/dist/utils/spawn.js.map +1 -0
  295. package/dist/utils/tracker.d.ts +108 -0
  296. package/dist/utils/tracker.d.ts.map +1 -0
  297. package/dist/utils/tracker.js +64 -1
  298. package/dist/utils/tracker.js.map +1 -0
  299. package/dist/utils/wait.d.ts +54 -0
  300. package/dist/utils/wait.d.ts.map +1 -0
  301. package/dist/utils/wait.js +60 -8
  302. package/dist/utils/wait.js.map +1 -0
  303. package/npm-shrinkwrap.json +2 -2
  304. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -28,7 +28,7 @@ Advantages:
28
28
  - individual plugin isolation in childbridge mode;
29
29
  - ability to update the plugin in childbridge mode without restarting matterbridge;
30
30
 
31
- ## [3.3.7] - 2025-11-07
31
+ ## [3.3.7] - 2025-11-08
32
32
 
33
33
  ### Breaking Changes
34
34
 
@@ -37,7 +37,7 @@ Advantages:
37
37
  ### Added
38
38
 
39
39
  - [matterbridge]: Added a first check for plugin existence (docker pull or Hass add-on rebuild) and reinstall it before parsing the plugin. The error messages have been removed.
40
- - [service]: Added [configuration](README-SERVICE-OPT.md) to run matterbridge as a daemon with systemctl (Linux only) and with private global node_modules (user matterbridge and no sudo required).
40
+ - [service]: Added [configuration](README-SERVICE-OPT.md) to run matterbridge as a daemon with systemctl (Linux only), private global node_modules, user/group matterbridge and no sudo required.
41
41
 
42
42
  ### Changed
43
43
 
@@ -20,14 +20,16 @@
20
20
 
21
21
  The advantage of this setup is that the global node_modules are private for matterbridge and sudo is not required.
22
22
 
23
- The service runs with user matterbridge and the system has full protection.
23
+ The service runs with group and user matterbridge and the system has full protection.
24
24
 
25
25
  The storage position is **not compatible** with the traditional setup (~/Matterbridge ~/.matterbridge ~/.mattercert).
26
26
 
27
27
  ### 1 - Create the matterbridge user and group
28
28
 
29
29
  ```bash
30
+ # ✅ Create the matterbridge group
30
31
  sudo groupadd --system matterbridge 2>/dev/null || true
32
+ # ✅ Create the matterbridge user
31
33
  sudo useradd --system \
32
34
  --home-dir /opt/matterbridge \
33
35
  --shell /usr/sbin/nologin \
@@ -42,10 +44,10 @@ This will create the required directories if they don't exist
42
44
  ```bash
43
45
  cd ~
44
46
  # ✅ Safe precaution if matterbridge was already running with the traditional setup
45
- sudo systemctl stop matterbridge
46
- # ✅ We need to uninstall from the global node_modules
47
- sudo npm uninstall matterbridge -g
48
- # ✅ Creates all needed dirs
47
+ sudo systemctl stop matterbridge 2>/dev/null || true
48
+ # ✅ Safe precaution we need to uninstall from the global node_modules
49
+ sudo npm uninstall matterbridge -g 2>/dev/null || true
50
+ # ✅ Creates all required directories
49
51
  sudo mkdir -p /opt/matterbridge /opt/matterbridge/Matterbridge /opt/matterbridge/.matterbridge /opt/matterbridge/.mattercert /opt/matterbridge/.npm-global
50
52
  # ✅ Ensures ownership
51
53
  sudo chown -R matterbridge:matterbridge /opt/matterbridge /opt/matterbridge/Matterbridge /opt/matterbridge/.matterbridge /opt/matterbridge/.mattercert /opt/matterbridge/.npm-global
@@ -55,7 +57,7 @@ sudo chmod -R 755 /opt/matterbridge /opt/matterbridge/Matterbridge /opt/matterbr
55
57
  sudo -u matterbridge mkdir -p /opt/matterbridge/.npm-global/bin
56
58
  # ✅ Install matterbridge in the private global node_modules
57
59
  sudo -u matterbridge NPM_CONFIG_PREFIX=/opt/matterbridge/.npm-global npm install matterbridge --omit=dev --verbose --global
58
- # ✅ Create a link to matterbridge bin
60
+ # ✅ Create a link to matterbridge bins
59
61
  sudo ln -sf /opt/matterbridge/.npm-global/bin/matterbridge /usr/bin/matterbridge
60
62
  sudo ln -sf /opt/matterbridge/.npm-global/bin/mb_mdns /usr/bin/mb_mdns
61
63
  sudo ln -sf /opt/matterbridge/.npm-global/bin/mb_coap /usr/bin/mb_coap
@@ -69,7 +71,21 @@ matterbridge --version
69
71
 
70
72
  The storage position is **not compatible** with the traditional setup (~/Matterbridge ~/.matterbridge ~/.mattercert).
71
73
 
72
- You may want to copy the contents to the new directories.
74
+ If you are migrating from the traditional service setup, before removing the old diretories, you may want to copy the contents of ~/Matterbridge ~/.matterbridge ~/.mattercert to the new directories /opt/matterbridge/Matterbridge /opt/matterbridge/.matterbridge /opt/matterbridge/.mattercert.
75
+
76
+ Copy the old diretories content
77
+
78
+ ```bash
79
+ sudo cp -a ~/Matterbridge/. /opt/matterbridge/Matterbridge/
80
+ sudo cp -a ~/.matterbridge/. /opt/matterbridge/.matterbridge/
81
+ sudo cp -a ~/.mattercert/. /opt/matterbridge/.mattercert/
82
+ ```
83
+
84
+ Remove the old diretories
85
+
86
+ ```bash
87
+ sudo rm -rf ~/Matterbridge ~/.matterbridge ~/.mattercert ~/.npm-global
88
+ ```
73
89
 
74
90
  ### 3 - Create a systemctl configuration file for Matterbridge
75
91
 
@@ -0,0 +1,115 @@
1
+ /**
2
+ * This file contains the BroadcastServer class.
3
+ *
4
+ * @file broadcastServer.ts
5
+ * @author Luca Liguori
6
+ * @created 2025-10-05
7
+ * @version 1.0.2
8
+ * @license Apache-2.0
9
+ *
10
+ * Copyright 2024, 2025, 2026 Luca Liguori.
11
+ *
12
+ * Licensed under the Apache License, Version 2.0 (the "License");
13
+ * you may not use this file except in compliance with the License.
14
+ * You may obtain a copy of the License at
15
+ *
16
+ * http://www.apache.org/licenses/LICENSE-2.0
17
+ *
18
+ * Unless required by applicable law or agreed to in writing, software
19
+ * distributed under the License is distributed on an "AS IS" BASIS,
20
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
+ * See the License for the specific language governing permissions and
22
+ * limitations under the License.
23
+ */
24
+ import { EventEmitter } from 'node:events';
25
+ import { type AnsiLogger } from 'node-ansi-logger';
26
+ import type { WorkerMessage, WorkerMessageType, WorkerRequest, WorkerResponse, WorkerSrcType } from './broadcastServerTypes.js';
27
+ interface BroadcastServerEvents {
28
+ 'broadcast_message': [msg: WorkerMessage];
29
+ }
30
+ /**
31
+ * BroadcastServer class to handle broadcast messages between workers with BroadcastChannel.
32
+ */
33
+ export declare class BroadcastServer extends EventEmitter<BroadcastServerEvents> {
34
+ readonly name: WorkerSrcType;
35
+ private readonly log;
36
+ private readonly channel;
37
+ private readonly broadcastChannel;
38
+ private readonly debug;
39
+ private readonly verbose;
40
+ /**
41
+ * Creates an instance of BroadcastServer.
42
+ *
43
+ * @param {string} name - The name of the broadcast server.
44
+ * @param {AnsiLogger} log - The logger instance to use for logging.
45
+ * @param {string} channel - The channel name for the broadcast. Default is 'broadcast-channel'.
46
+ */
47
+ constructor(name: WorkerSrcType, log: AnsiLogger, channel?: string);
48
+ /**
49
+ * Closes the broadcast channel.
50
+ *
51
+ * @returns {void}
52
+ */
53
+ close(): void;
54
+ /**
55
+ * Generates a unique ID with range 100000-999999.
56
+ *
57
+ * @returns {number} - A unique ID between 100000 and 999999
58
+ */
59
+ getUniqueId(): number;
60
+ /**
61
+ * Type guard to check if a message is a request of a specific type.
62
+ *
63
+ * @param {unknown} msg - The message to check.
64
+ * @param {T} type - The type to check against.
65
+ * @returns {msg is WorkerRequest<T>} True if the message is a request of the specified type.
66
+ */
67
+ isWorkerRequest<T extends WorkerMessageType>(msg: unknown, type: T): msg is WorkerRequest<T>;
68
+ /**
69
+ * Type guard to check if a message is a response of a specific type.
70
+ *
71
+ * @param {unknown} msg - The message to check.
72
+ * @param {T} type - The type to check against.
73
+ * @returns {msg is WorkerResponse<T>} True if the message is a response of the specified type.
74
+ */
75
+ isWorkerResponse<T extends WorkerMessageType>(msg: unknown, type: T): msg is WorkerResponse<T>;
76
+ /**
77
+ * Handles incoming broadcast messages.
78
+ *
79
+ * @param {MessageEvent} event - The message event containing the broadcast message.
80
+ * @returns {void}
81
+ */
82
+ private broadcastMessageHandler;
83
+ /**
84
+ * Broadcast a message to all workers.
85
+ *
86
+ * @param {WorkerMessage} message - The message to broadcast.
87
+ */
88
+ broadcast(message: WorkerMessage): void;
89
+ /**
90
+ * Broadcast a request message to all workers.
91
+ *
92
+ * @param {WorkerRequest<T>} message - The typed request message to broadcast.
93
+ * @returns {void}
94
+ */
95
+ request<M extends WorkerRequest<WorkerMessageType>>(message: M): void;
96
+ /**
97
+ * Broadcast a response message to all workers.
98
+ *
99
+ * @param {WorkerResponse<T>} message - The typed response message to broadcast.
100
+ * @returns {void}
101
+ */
102
+ respond<M extends WorkerResponse<WorkerMessageType>>(message: M): void;
103
+ /**
104
+ * Fetch data from a worker.
105
+ * It broadcasts a request message and waits for a response with the same id.
106
+ *
107
+ * @param {WorkerRequest<T>} message - The typed request message to broadcast.
108
+ * @param {number} timeout - The timeout in milliseconds to wait for a response. Default is 100ms.
109
+ * @returns {Promise<WorkerResponse<T>>} A promise that resolves with the response from the worker or rejects on timeout.
110
+ * @throws {Error} If the fetch operation times out after 100ms.
111
+ */
112
+ fetch<M extends WorkerRequest<WorkerMessageType>>(message: M, timeout?: number): Promise<WorkerResponse<M['type']>>;
113
+ }
114
+ export {};
115
+ //# sourceMappingURL=broadcastServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcastServer.d.ts","sourceRoot":"","sources":["../src/broadcastServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,kBAAkB,CAAC;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAGhI,UAAU,qBAAqB;IAC7B,mBAAmB,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IAapE,QAAQ,CAAC,IAAI,EAAE,aAAa;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoD;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD;;;;;;OAMG;gBAEQ,IAAI,EAAE,aAAa,EACX,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,MAA4B;IAOxD;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAMb;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;;;OAMG;IACH,eAAe,CAAC,CAAC,SAAS,iBAAiB,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC;IAI5F;;;;;;OAMG;IACH,gBAAgB,CAAC,CAAC,SAAS,iBAAiB,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC;IAI9F;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAM/B;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,aAAa;IAKhC;;;;;OAKG;IACH,OAAO,CAAC,CAAC,SAAS,aAAa,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAerE;;;;;OAKG;IACH,OAAO,CAAC,CAAC,SAAS,cAAc,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAYtE;;;;;;;;OAQG;IACG,KAAK,CAAC,CAAC,SAAS,aAAa,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAE,MAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CA4B/H"}
@@ -1,9 +1,36 @@
1
+ /**
2
+ * This file contains the BroadcastServer class.
3
+ *
4
+ * @file broadcastServer.ts
5
+ * @author Luca Liguori
6
+ * @created 2025-10-05
7
+ * @version 1.0.2
8
+ * @license Apache-2.0
9
+ *
10
+ * Copyright 2024, 2025, 2026 Luca Liguori.
11
+ *
12
+ * Licensed under the Apache License, Version 2.0 (the "License");
13
+ * you may not use this file except in compliance with the License.
14
+ * You may obtain a copy of the License at
15
+ *
16
+ * http://www.apache.org/licenses/LICENSE-2.0
17
+ *
18
+ * Unless required by applicable law or agreed to in writing, software
19
+ * distributed under the License is distributed on an "AS IS" BASIS,
20
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
+ * See the License for the specific language governing permissions and
22
+ * limitations under the License.
23
+ */
24
+ // eslint-disable-next-line no-console
1
25
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
2
26
  console.log('\u001B[32mBroadcastServer loaded.\u001B[40;0m');
3
27
  import { EventEmitter } from 'node:events';
4
28
  import { BroadcastChannel } from 'node:worker_threads';
5
29
  import { debugStringify } from 'node-ansi-logger';
6
30
  import { hasParameter } from './utils/commandLine.js';
31
+ /**
32
+ * BroadcastServer class to handle broadcast messages between workers with BroadcastChannel.
33
+ */
7
34
  export class BroadcastServer extends EventEmitter {
8
35
  name;
9
36
  log;
@@ -11,6 +38,13 @@ export class BroadcastServer extends EventEmitter {
11
38
  broadcastChannel;
12
39
  debug = hasParameter('debug') || hasParameter('verbose');
13
40
  verbose = hasParameter('verbose');
41
+ /**
42
+ * Creates an instance of BroadcastServer.
43
+ *
44
+ * @param {string} name - The name of the broadcast server.
45
+ * @param {AnsiLogger} log - The logger instance to use for logging.
46
+ * @param {string} channel - The channel name for the broadcast. Default is 'broadcast-channel'.
47
+ */
14
48
  constructor(name, log, channel = 'broadcast-channel') {
15
49
  super();
16
50
  this.name = name;
@@ -19,30 +53,72 @@ export class BroadcastServer extends EventEmitter {
19
53
  this.broadcastChannel = new BroadcastChannel(this.channel);
20
54
  this.broadcastChannel.onmessage = this.broadcastMessageHandler.bind(this);
21
55
  }
56
+ /**
57
+ * Closes the broadcast channel.
58
+ *
59
+ * @returns {void}
60
+ */
22
61
  close() {
62
+ // @ts-expect-error: wrong type definition in node.d.ts
23
63
  this.broadcastChannel.onmessage = null;
24
64
  this.broadcastChannel.close();
25
65
  }
66
+ /**
67
+ * Generates a unique ID with range 100000-999999.
68
+ *
69
+ * @returns {number} - A unique ID between 100000 and 999999
70
+ */
26
71
  getUniqueId() {
27
- return Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000;
72
+ return Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000; // random int between 100000 and 999999
28
73
  }
74
+ /**
75
+ * Type guard to check if a message is a request of a specific type.
76
+ *
77
+ * @param {unknown} msg - The message to check.
78
+ * @param {T} type - The type to check against.
79
+ * @returns {msg is WorkerRequest<T>} True if the message is a request of the specified type.
80
+ */
29
81
  isWorkerRequest(msg, type) {
30
82
  return typeof msg === 'object' && msg !== null && 'id' in msg && 'timestamp' in msg && 'type' in msg && msg.type === type && !('response' in msg) && 'src' in msg && 'dst' in msg;
31
83
  }
84
+ /**
85
+ * Type guard to check if a message is a response of a specific type.
86
+ *
87
+ * @param {unknown} msg - The message to check.
88
+ * @param {T} type - The type to check against.
89
+ * @returns {msg is WorkerResponse<T>} True if the message is a response of the specified type.
90
+ */
32
91
  isWorkerResponse(msg, type) {
33
92
  return typeof msg === 'object' && msg !== null && 'id' in msg && 'timestamp' in msg && 'type' in msg && msg.type === type && 'response' in msg && 'src' in msg && 'dst' in msg;
34
93
  }
94
+ /**
95
+ * Handles incoming broadcast messages.
96
+ *
97
+ * @param {MessageEvent} event - The message event containing the broadcast message.
98
+ * @returns {void}
99
+ */
35
100
  broadcastMessageHandler(event) {
36
101
  const data = event.data;
37
102
  if (this.verbose)
38
103
  this.log.debug(`Received broadcast message: ${debugStringify(data)}`);
39
104
  this.emit('broadcast_message', data);
40
105
  }
106
+ /**
107
+ * Broadcast a message to all workers.
108
+ *
109
+ * @param {WorkerMessage} message - The message to broadcast.
110
+ */
41
111
  broadcast(message) {
42
112
  if (this.verbose)
43
113
  this.log.debug(`Broadcasting message: ${debugStringify(message)}`);
44
114
  this.broadcastChannel.postMessage(message);
45
115
  }
116
+ /**
117
+ * Broadcast a request message to all workers.
118
+ *
119
+ * @param {WorkerRequest<T>} message - The typed request message to broadcast.
120
+ * @returns {void}
121
+ */
46
122
  request(message) {
47
123
  if (message.id === undefined) {
48
124
  message.id = this.getUniqueId();
@@ -58,6 +134,12 @@ export class BroadcastServer extends EventEmitter {
58
134
  this.log.debug(`Broadcasting request message: ${debugStringify(message)}`);
59
135
  this.broadcastChannel.postMessage(message);
60
136
  }
137
+ /**
138
+ * Broadcast a response message to all workers.
139
+ *
140
+ * @param {WorkerResponse<T>} message - The typed response message to broadcast.
141
+ * @returns {void}
142
+ */
61
143
  respond(message) {
62
144
  if (message.timestamp === undefined) {
63
145
  message.timestamp = Date.now();
@@ -70,6 +152,15 @@ export class BroadcastServer extends EventEmitter {
70
152
  this.log.debug(`Broadcasting response message: ${debugStringify(message)}`);
71
153
  this.broadcastChannel.postMessage(message);
72
154
  }
155
+ /**
156
+ * Fetch data from a worker.
157
+ * It broadcasts a request message and waits for a response with the same id.
158
+ *
159
+ * @param {WorkerRequest<T>} message - The typed request message to broadcast.
160
+ * @param {number} timeout - The timeout in milliseconds to wait for a response. Default is 100ms.
161
+ * @returns {Promise<WorkerResponse<T>>} A promise that resolves with the response from the worker or rejects on timeout.
162
+ * @throws {Error} If the fetch operation times out after 100ms.
163
+ */
73
164
  async fetch(message, timeout = 100) {
74
165
  if (message.id === undefined) {
75
166
  message.id = this.getUniqueId();
@@ -98,3 +189,4 @@ export class BroadcastServer extends EventEmitter {
98
189
  });
99
190
  }
100
191
  }
192
+ //# sourceMappingURL=broadcastServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcastServer.js","sourceRoot":"","sources":["../src/broadcastServer.ts"],"names":[],"mappings":"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"}