matterbridge 3.3.5-dev-20251031-3482891 → 3.3.5

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 (305) hide show
  1. package/CHANGELOG.md +4 -3
  2. package/README-SERVICE-LOCAL.md +13 -13
  3. package/README.md +3 -1
  4. package/dist/broadcastServer.d.ts +112 -0
  5. package/dist/broadcastServer.d.ts.map +1 -0
  6. package/dist/broadcastServer.js +92 -1
  7. package/dist/broadcastServer.js.map +1 -0
  8. package/dist/broadcastServerTypes.d.ts +803 -0
  9. package/dist/broadcastServerTypes.d.ts.map +1 -0
  10. package/dist/broadcastServerTypes.js +24 -0
  11. package/dist/broadcastServerTypes.js.map +1 -0
  12. package/dist/cli.d.ts +30 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +97 -1
  15. package/dist/cli.js.map +1 -0
  16. package/dist/cliEmitter.d.ts +50 -0
  17. package/dist/cliEmitter.d.ts.map +1 -0
  18. package/dist/cliEmitter.js +37 -0
  19. package/dist/cliEmitter.js.map +1 -0
  20. package/dist/cliHistory.d.ts +48 -0
  21. package/dist/cliHistory.d.ts.map +1 -0
  22. package/dist/cliHistory.js +38 -0
  23. package/dist/cliHistory.js.map +1 -0
  24. package/dist/clusters/export.d.ts +2 -0
  25. package/dist/clusters/export.d.ts.map +1 -0
  26. package/dist/clusters/export.js +2 -0
  27. package/dist/clusters/export.js.map +1 -0
  28. package/dist/defaultConfigSchema.d.ts +28 -0
  29. package/dist/defaultConfigSchema.d.ts.map +1 -0
  30. package/dist/defaultConfigSchema.js +24 -0
  31. package/dist/defaultConfigSchema.js.map +1 -0
  32. package/dist/deviceManager.d.ts +117 -0
  33. package/dist/deviceManager.d.ts.map +1 -0
  34. package/dist/deviceManager.js +124 -1
  35. package/dist/deviceManager.js.map +1 -0
  36. package/dist/devices/airConditioner.d.ts +98 -0
  37. package/dist/devices/airConditioner.d.ts.map +1 -0
  38. package/dist/devices/airConditioner.js +57 -0
  39. package/dist/devices/airConditioner.js.map +1 -0
  40. package/dist/devices/batteryStorage.d.ts +48 -0
  41. package/dist/devices/batteryStorage.d.ts.map +1 -0
  42. package/dist/devices/batteryStorage.js +48 -1
  43. package/dist/devices/batteryStorage.js.map +1 -0
  44. package/dist/devices/cooktop.d.ts +60 -0
  45. package/dist/devices/cooktop.d.ts.map +1 -0
  46. package/dist/devices/cooktop.js +55 -0
  47. package/dist/devices/cooktop.js.map +1 -0
  48. package/dist/devices/dishwasher.d.ts +71 -0
  49. package/dist/devices/dishwasher.d.ts.map +1 -0
  50. package/dist/devices/dishwasher.js +57 -0
  51. package/dist/devices/dishwasher.js.map +1 -0
  52. package/dist/devices/evse.d.ts +76 -0
  53. package/dist/devices/evse.d.ts.map +1 -0
  54. package/dist/devices/evse.js +74 -10
  55. package/dist/devices/evse.js.map +1 -0
  56. package/dist/devices/export.d.ts +17 -0
  57. package/dist/devices/export.d.ts.map +1 -0
  58. package/dist/devices/export.js +5 -0
  59. package/dist/devices/export.js.map +1 -0
  60. package/dist/devices/extractorHood.d.ts +46 -0
  61. package/dist/devices/extractorHood.d.ts.map +1 -0
  62. package/dist/devices/extractorHood.js +42 -0
  63. package/dist/devices/extractorHood.js.map +1 -0
  64. package/dist/devices/heatPump.d.ts +47 -0
  65. package/dist/devices/heatPump.d.ts.map +1 -0
  66. package/dist/devices/heatPump.js +50 -2
  67. package/dist/devices/heatPump.js.map +1 -0
  68. package/dist/devices/laundryDryer.d.ts +67 -0
  69. package/dist/devices/laundryDryer.d.ts.map +1 -0
  70. package/dist/devices/laundryDryer.js +62 -3
  71. package/dist/devices/laundryDryer.js.map +1 -0
  72. package/dist/devices/laundryWasher.d.ts +81 -0
  73. package/dist/devices/laundryWasher.d.ts.map +1 -0
  74. package/dist/devices/laundryWasher.js +70 -4
  75. package/dist/devices/laundryWasher.js.map +1 -0
  76. package/dist/devices/microwaveOven.d.ts +168 -0
  77. package/dist/devices/microwaveOven.d.ts.map +1 -0
  78. package/dist/devices/microwaveOven.js +88 -5
  79. package/dist/devices/microwaveOven.js.map +1 -0
  80. package/dist/devices/oven.d.ts +105 -0
  81. package/dist/devices/oven.d.ts.map +1 -0
  82. package/dist/devices/oven.js +85 -0
  83. package/dist/devices/oven.js.map +1 -0
  84. package/dist/devices/refrigerator.d.ts +118 -0
  85. package/dist/devices/refrigerator.d.ts.map +1 -0
  86. package/dist/devices/refrigerator.js +102 -0
  87. package/dist/devices/refrigerator.js.map +1 -0
  88. package/dist/devices/roboticVacuumCleaner.d.ts +112 -0
  89. package/dist/devices/roboticVacuumCleaner.d.ts.map +1 -0
  90. package/dist/devices/roboticVacuumCleaner.js +100 -9
  91. package/dist/devices/roboticVacuumCleaner.js.map +1 -0
  92. package/dist/devices/solarPower.d.ts +40 -0
  93. package/dist/devices/solarPower.d.ts.map +1 -0
  94. package/dist/devices/solarPower.js +38 -0
  95. package/dist/devices/solarPower.js.map +1 -0
  96. package/dist/devices/speaker.d.ts +87 -0
  97. package/dist/devices/speaker.d.ts.map +1 -0
  98. package/dist/devices/speaker.js +84 -0
  99. package/dist/devices/speaker.js.map +1 -0
  100. package/dist/devices/temperatureControl.d.ts +166 -0
  101. package/dist/devices/temperatureControl.d.ts.map +1 -0
  102. package/dist/devices/temperatureControl.js +24 -3
  103. package/dist/devices/temperatureControl.js.map +1 -0
  104. package/dist/devices/waterHeater.d.ts +111 -0
  105. package/dist/devices/waterHeater.d.ts.map +1 -0
  106. package/dist/devices/waterHeater.js +82 -2
  107. package/dist/devices/waterHeater.js.map +1 -0
  108. package/dist/dgram/coap.d.ts +205 -0
  109. package/dist/dgram/coap.d.ts.map +1 -0
  110. package/dist/dgram/coap.js +126 -13
  111. package/dist/dgram/coap.js.map +1 -0
  112. package/dist/dgram/dgram.d.ts +141 -0
  113. package/dist/dgram/dgram.d.ts.map +1 -0
  114. package/dist/dgram/dgram.js +114 -2
  115. package/dist/dgram/dgram.js.map +1 -0
  116. package/dist/dgram/mb_coap.d.ts +24 -0
  117. package/dist/dgram/mb_coap.d.ts.map +1 -0
  118. package/dist/dgram/mb_coap.js +41 -3
  119. package/dist/dgram/mb_coap.js.map +1 -0
  120. package/dist/dgram/mb_mdns.d.ts +24 -0
  121. package/dist/dgram/mb_mdns.d.ts.map +1 -0
  122. package/dist/dgram/mb_mdns.js +80 -15
  123. package/dist/dgram/mb_mdns.js.map +1 -0
  124. package/dist/dgram/mdns.d.ts +290 -0
  125. package/dist/dgram/mdns.d.ts.map +1 -0
  126. package/dist/dgram/mdns.js +299 -137
  127. package/dist/dgram/mdns.js.map +1 -0
  128. package/dist/dgram/multicast.d.ts +67 -0
  129. package/dist/dgram/multicast.d.ts.map +1 -0
  130. package/dist/dgram/multicast.js +62 -1
  131. package/dist/dgram/multicast.js.map +1 -0
  132. package/dist/dgram/unicast.d.ts +56 -0
  133. package/dist/dgram/unicast.d.ts.map +1 -0
  134. package/dist/dgram/unicast.js +54 -0
  135. package/dist/dgram/unicast.js.map +1 -0
  136. package/dist/frontend.d.ts +236 -0
  137. package/dist/frontend.d.ts.map +1 -0
  138. package/dist/frontend.js +431 -34
  139. package/dist/frontend.js.map +1 -0
  140. package/dist/frontendTypes.d.ts +529 -0
  141. package/dist/frontendTypes.d.ts.map +1 -0
  142. package/dist/frontendTypes.js +45 -0
  143. package/dist/frontendTypes.js.map +1 -0
  144. package/dist/helpers.d.ts +48 -0
  145. package/dist/helpers.d.ts.map +1 -0
  146. package/dist/helpers.js +53 -0
  147. package/dist/helpers.js.map +1 -0
  148. package/dist/index.d.ts +33 -0
  149. package/dist/index.d.ts.map +1 -0
  150. package/dist/index.js +25 -0
  151. package/dist/index.js.map +1 -0
  152. package/dist/logger/export.d.ts +2 -0
  153. package/dist/logger/export.d.ts.map +1 -0
  154. package/dist/logger/export.js +1 -0
  155. package/dist/logger/export.js.map +1 -0
  156. package/dist/matter/behaviors.d.ts +2 -0
  157. package/dist/matter/behaviors.d.ts.map +1 -0
  158. package/dist/matter/behaviors.js +2 -0
  159. package/dist/matter/behaviors.js.map +1 -0
  160. package/dist/matter/clusters.d.ts +2 -0
  161. package/dist/matter/clusters.d.ts.map +1 -0
  162. package/dist/matter/clusters.js +2 -0
  163. package/dist/matter/clusters.js.map +1 -0
  164. package/dist/matter/devices.d.ts +2 -0
  165. package/dist/matter/devices.d.ts.map +1 -0
  166. package/dist/matter/devices.js +2 -0
  167. package/dist/matter/devices.js.map +1 -0
  168. package/dist/matter/endpoints.d.ts +2 -0
  169. package/dist/matter/endpoints.d.ts.map +1 -0
  170. package/dist/matter/endpoints.js +2 -0
  171. package/dist/matter/endpoints.js.map +1 -0
  172. package/dist/matter/export.d.ts +5 -0
  173. package/dist/matter/export.d.ts.map +1 -0
  174. package/dist/matter/export.js +3 -0
  175. package/dist/matter/export.js.map +1 -0
  176. package/dist/matter/types.d.ts +3 -0
  177. package/dist/matter/types.d.ts.map +1 -0
  178. package/dist/matter/types.js +3 -0
  179. package/dist/matter/types.js.map +1 -0
  180. package/dist/matterbridge.d.ts +476 -0
  181. package/dist/matterbridge.d.ts.map +1 -0
  182. package/dist/matterbridge.js +828 -46
  183. package/dist/matterbridge.js.map +1 -0
  184. package/dist/matterbridgeAccessoryPlatform.d.ts +42 -0
  185. package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -0
  186. package/dist/matterbridgeAccessoryPlatform.js +37 -0
  187. package/dist/matterbridgeAccessoryPlatform.js.map +1 -0
  188. package/dist/matterbridgeBehaviors.d.ts +2404 -0
  189. package/dist/matterbridgeBehaviors.d.ts.map +1 -0
  190. package/dist/matterbridgeBehaviors.js +68 -5
  191. package/dist/matterbridgeBehaviors.js.map +1 -0
  192. package/dist/matterbridgeDeviceTypes.d.ts +770 -0
  193. package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
  194. package/dist/matterbridgeDeviceTypes.js +638 -17
  195. package/dist/matterbridgeDeviceTypes.js.map +1 -0
  196. package/dist/matterbridgeDynamicPlatform.d.ts +42 -0
  197. package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -0
  198. package/dist/matterbridgeDynamicPlatform.js +37 -0
  199. package/dist/matterbridgeDynamicPlatform.js.map +1 -0
  200. package/dist/matterbridgeEndpoint.d.ts +1556 -0
  201. package/dist/matterbridgeEndpoint.d.ts.map +1 -0
  202. package/dist/matterbridgeEndpoint.js +1408 -52
  203. package/dist/matterbridgeEndpoint.js.map +1 -0
  204. package/dist/matterbridgeEndpointHelpers.d.ts +758 -0
  205. package/dist/matterbridgeEndpointHelpers.d.ts.map +1 -0
  206. package/dist/matterbridgeEndpointHelpers.js +464 -19
  207. package/dist/matterbridgeEndpointHelpers.js.map +1 -0
  208. package/dist/matterbridgePlatform.d.ts +402 -0
  209. package/dist/matterbridgePlatform.d.ts.map +1 -0
  210. package/dist/matterbridgePlatform.js +341 -1
  211. package/dist/matterbridgePlatform.js.map +1 -0
  212. package/dist/matterbridgeTypes.d.ts +226 -0
  213. package/dist/matterbridgeTypes.d.ts.map +1 -0
  214. package/dist/matterbridgeTypes.js +26 -0
  215. package/dist/matterbridgeTypes.js.map +1 -0
  216. package/dist/pluginManager.d.ts +347 -0
  217. package/dist/pluginManager.d.ts.map +1 -0
  218. package/dist/pluginManager.js +319 -3
  219. package/dist/pluginManager.js.map +1 -0
  220. package/dist/shelly.d.ts +174 -0
  221. package/dist/shelly.d.ts.map +1 -0
  222. package/dist/shelly.js +168 -7
  223. package/dist/shelly.js.map +1 -0
  224. package/dist/storage/export.d.ts +2 -0
  225. package/dist/storage/export.d.ts.map +1 -0
  226. package/dist/storage/export.js +1 -0
  227. package/dist/storage/export.js.map +1 -0
  228. package/dist/update.d.ts +75 -0
  229. package/dist/update.d.ts.map +1 -0
  230. package/dist/update.js +69 -0
  231. package/dist/update.js.map +1 -0
  232. package/dist/utils/colorUtils.d.ts +101 -0
  233. package/dist/utils/colorUtils.d.ts.map +1 -0
  234. package/dist/utils/colorUtils.js +97 -2
  235. package/dist/utils/colorUtils.js.map +1 -0
  236. package/dist/utils/commandLine.d.ts +66 -0
  237. package/dist/utils/commandLine.d.ts.map +1 -0
  238. package/dist/utils/commandLine.js +60 -0
  239. package/dist/utils/commandLine.js.map +1 -0
  240. package/dist/utils/copyDirectory.d.ts +33 -0
  241. package/dist/utils/copyDirectory.d.ts.map +1 -0
  242. package/dist/utils/copyDirectory.js +38 -1
  243. package/dist/utils/copyDirectory.js.map +1 -0
  244. package/dist/utils/createDirectory.d.ts +34 -0
  245. package/dist/utils/createDirectory.d.ts.map +1 -0
  246. package/dist/utils/createDirectory.js +33 -0
  247. package/dist/utils/createDirectory.js.map +1 -0
  248. package/dist/utils/createZip.d.ts +39 -0
  249. package/dist/utils/createZip.d.ts.map +1 -0
  250. package/dist/utils/createZip.js +47 -2
  251. package/dist/utils/createZip.js.map +1 -0
  252. package/dist/utils/deepCopy.d.ts +32 -0
  253. package/dist/utils/deepCopy.d.ts.map +1 -0
  254. package/dist/utils/deepCopy.js +39 -0
  255. package/dist/utils/deepCopy.js.map +1 -0
  256. package/dist/utils/deepEqual.d.ts +54 -0
  257. package/dist/utils/deepEqual.d.ts.map +1 -0
  258. package/dist/utils/deepEqual.js +72 -1
  259. package/dist/utils/deepEqual.js.map +1 -0
  260. package/dist/utils/error.d.ts +44 -0
  261. package/dist/utils/error.d.ts.map +1 -0
  262. package/dist/utils/error.js +41 -0
  263. package/dist/utils/error.js.map +1 -0
  264. package/dist/utils/export.d.ts +13 -0
  265. package/dist/utils/export.d.ts.map +1 -0
  266. package/dist/utils/export.js +1 -0
  267. package/dist/utils/export.js.map +1 -0
  268. package/dist/utils/format.d.ts +53 -0
  269. package/dist/utils/format.d.ts.map +1 -0
  270. package/dist/utils/format.js +49 -0
  271. package/dist/utils/format.js.map +1 -0
  272. package/dist/utils/hex.d.ts +89 -0
  273. package/dist/utils/hex.d.ts.map +1 -0
  274. package/dist/utils/hex.js +124 -0
  275. package/dist/utils/hex.js.map +1 -0
  276. package/dist/utils/inspector.d.ts +87 -0
  277. package/dist/utils/inspector.d.ts.map +1 -0
  278. package/dist/utils/inspector.js +69 -1
  279. package/dist/utils/inspector.js.map +1 -0
  280. package/dist/utils/isvalid.d.ts +103 -0
  281. package/dist/utils/isvalid.d.ts.map +1 -0
  282. package/dist/utils/isvalid.js +101 -0
  283. package/dist/utils/isvalid.js.map +1 -0
  284. package/dist/utils/jestHelpers.d.ts +139 -0
  285. package/dist/utils/jestHelpers.d.ts.map +1 -0
  286. package/dist/utils/jestHelpers.js +153 -3
  287. package/dist/utils/jestHelpers.js.map +1 -0
  288. package/dist/utils/network.d.ts +101 -0
  289. package/dist/utils/network.d.ts.map +1 -0
  290. package/dist/utils/network.js +96 -5
  291. package/dist/utils/network.js.map +1 -0
  292. package/dist/utils/spawn.d.ts +35 -0
  293. package/dist/utils/spawn.d.ts.map +1 -0
  294. package/dist/utils/spawn.js +71 -0
  295. package/dist/utils/spawn.js.map +1 -0
  296. package/dist/utils/tracker.d.ts +108 -0
  297. package/dist/utils/tracker.d.ts.map +1 -0
  298. package/dist/utils/tracker.js +64 -1
  299. package/dist/utils/tracker.js.map +1 -0
  300. package/dist/utils/wait.d.ts +54 -0
  301. package/dist/utils/wait.d.ts.map +1 -0
  302. package/dist/utils/wait.js +60 -8
  303. package/dist/utils/wait.js.map +1 -0
  304. package/npm-shrinkwrap.json +2 -2
  305. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -28,16 +28,17 @@ 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.5] - 2025-10-??
31
+ ## [3.3.5] - 2025-10-31
32
32
 
33
33
  ### Breaking Changes
34
34
 
35
- - [concentrationMeasurement]: Changed the default unit of measurement to comply with the generally used (and supported by Apple Home). Is is always possible to pass a different unit of measurement.
35
+ - [concentrationMeasurement]: Changed the default unit of measurement of some concentration measurement clusters to adapt to the generally used (and supported by Apple Home). Is is always possible to pass a different unit of measurement (Tvoc is Ugm3. Formaldehyde is Mgm3. Pm1, Pm2.5 and Pm10 are Ugm3. Ozone is Ugm3. Radon is Bqm3.)
36
36
 
37
37
  ### Added
38
38
 
39
39
  - [thread]: Added get_log_level and set_log_level to BroadcastServer.
40
40
  - [frontend]: Added password check to WebSocket.
41
+ - [service]: Added link to [configuration](README-SERVICE-LOCAL.md) to run matterbridge as a daemon with systemctl (Linux only) and with local global node_modules (no sudo required).
41
42
 
42
43
  ### Changed
43
44
 
@@ -46,7 +47,7 @@ Advantages:
46
47
 
47
48
  ### Fixed
48
49
 
49
- - [service]: Fixed systemd configuration with local global node_modules.
50
+ - [service]: Fixed systemd [configuration](README-SERVICE-LOCAL.md) with local global node_modules.
50
51
 
51
52
  <a href="https://www.buymeacoffee.com/luligugithub">
52
53
  <img src="bmc-button.svg" alt="Buy me a coffee" width="80">
@@ -18,9 +18,11 @@
18
18
 
19
19
  ## Run matterbridge as a daemon with systemctl (Linux only) with local global node_modules
20
20
 
21
- The easiest way to add systemctl is to use [Matterbridge service cli for linux](https://github.com/Luligu/mb-service-linux).
21
+ The advantage of this setup is that the global node_modules are private for matterbridge and sudo is not required.
22
22
 
23
- If your setup is too complex or you prefer to do it manually follow this method. You can still use mb-service to manage systemd after.
23
+ The service runs rootless.
24
+
25
+ The storage position is compatible with the traditional setup (~/Matterbridge ~/.matterbridge ~/.mattercert).
24
26
 
25
27
  ### First create the Matterbridge directories and set the correct permissions
26
28
 
@@ -28,19 +30,16 @@ This will create the required directories if they don't exist
28
30
 
29
31
  ```bash
30
32
  cd ~
31
- sudo systemctl stop matterbridge # ✅ Safe precaution
33
+ sudo systemctl stop matterbridge # ✅ Safe precaution if matterbridge was already running with the traditional setup
34
+ sudo npm uninstall matterbridge -g # ✅ We need to uninstall from the global node_modules
32
35
  mkdir -p ~/Matterbridge ~/.matterbridge ~/.mattercert ~/.npm-global # ✅ Creates all needed dirs
33
36
  chown -R $USER:$USER ~/Matterbridge ~/.matterbridge ~/.mattercert ~/.npm-global # ✅ Ensures ownership
34
37
  chmod -R 755 ~/Matterbridge ~/.matterbridge ~/.mattercert ~/.npm-global # ✅ Secure permissions
35
- NPM_CONFIG_PREFIX=~/.npm-global npm install matterbridge --omit=dev --verbose --global # ✅ Install, no sudo
36
- ```
37
-
38
- ### Then create a system-wide symlink
39
-
40
- ```bash
41
- sudo ln -sf /home/$USER/.npm-global/bin/matterbridge /usr/local/bin/matterbridge
42
- which matterbridge
43
- matterbridge --version
38
+ NPM_CONFIG_PREFIX=~/.npm-global npm install matterbridge --omit=dev --verbose --global # ✅ Install matterbridge in the local global node_modules, no sudo
39
+ sudo ln -sf /home/$USER/.npm-global/bin/matterbridge /usr/local/bin/matterbridge # ✅ Create a link to matterbridge bin
40
+ hash -r # ✅ Clear bash command cache as a precaution
41
+ which matterbridge # Check it
42
+ matterbridge --version # ✅ Will output the matterbridge version
44
43
  ```
45
44
 
46
45
  ### Then create a systemctl configuration file for Matterbridge
@@ -51,7 +50,7 @@ Create a systemctl configuration file for Matterbridge
51
50
  sudo nano /etc/systemd/system/matterbridge.service
52
51
  ```
53
52
 
54
- Add the following to this file, replacing 4 times (!) USER with your user name (e.g. WorkingDirectory=/home/pi/Matterbridge, User=pi and Group=pi and Environment="NPM_CONFIG_PREFIX=/home/pi/.npm-global"):
53
+ Add the following to this file, **replacing 4 times (!) USER with your user name** (e.g. WorkingDirectory=/home/pi/Matterbridge, User=pi and Group=pi and Environment="NPM_CONFIG_PREFIX=/home/pi/.npm-global"):
55
54
 
56
55
  ```
57
56
  [Unit]
@@ -94,6 +93,7 @@ Now and if you modify matterbridge.service after, run:
94
93
  ```bash
95
94
  sudo systemctl daemon-reload
96
95
  sudo systemctl restart matterbridge.service
96
+ sudo systemctl status matterbridge.service
97
97
  ```
98
98
 
99
99
  ### Start Matterbridge
package/README.md CHANGED
@@ -170,9 +170,11 @@ Config editor:
170
170
 
171
171
  ### Run matterbridge as a daemon with systemctl (Linux only)
172
172
 
173
+ Traditional configuration
174
+
173
175
  [Service configurations](README-SERVICE.md)
174
176
 
175
- or with local global node_modules
177
+ or with local global node_modules (no sudo required)
176
178
 
177
179
  [Service configurations with local global node_modules](README-SERVICE-LOCAL.md)
178
180
 
@@ -0,0 +1,112 @@
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.1
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
+ /**
39
+ * Creates an instance of BroadcastServer.
40
+ *
41
+ * @param {string} name - The name of the broadcast server.
42
+ * @param {AnsiLogger} log - The logger instance to use for logging.
43
+ * @param {string} channel - The channel name for the broadcast. Default is 'broadcast-channel'.
44
+ */
45
+ constructor(name: WorkerSrcType, log: AnsiLogger, channel?: string);
46
+ /**
47
+ * Closes the broadcast channel.
48
+ *
49
+ * @returns {void}
50
+ */
51
+ close(): void;
52
+ /**
53
+ * Generates a unique ID with range 100000-999999.
54
+ *
55
+ * @returns {number} - A unique ID between 100000 and 999999
56
+ */
57
+ getUniqueId(): number;
58
+ /**
59
+ * Type guard to check if a message is a request of a specific type.
60
+ *
61
+ * @param {unknown} msg - The message to check.
62
+ * @param {T} type - The type to check against.
63
+ * @returns {msg is WorkerRequest<T>} True if the message is a request of the specified type.
64
+ */
65
+ isWorkerRequest<T extends WorkerMessageType>(msg: unknown, type: T): msg is WorkerRequest<T>;
66
+ /**
67
+ * Type guard to check if a message is a response of a specific type.
68
+ *
69
+ * @param {unknown} msg - The message to check.
70
+ * @param {T} type - The type to check against.
71
+ * @returns {msg is WorkerResponse<T>} True if the message is a response of the specified type.
72
+ */
73
+ isWorkerResponse<T extends WorkerMessageType>(msg: unknown, type: T): msg is WorkerResponse<T>;
74
+ /**
75
+ * Handles incoming broadcast messages.
76
+ *
77
+ * @param {MessageEvent} event - The message event containing the broadcast message.
78
+ * @returns {void}
79
+ */
80
+ private broadcastMessageHandler;
81
+ /**
82
+ * Broadcast a message to all workers.
83
+ *
84
+ * @param {WorkerMessage} message - The message to broadcast.
85
+ */
86
+ broadcast(message: WorkerMessage): void;
87
+ /**
88
+ * Broadcast a request message to all workers.
89
+ *
90
+ * @param {WorkerRequest<T>} message - The typed request message to broadcast.
91
+ * @returns {void}
92
+ */
93
+ request<M extends WorkerRequest<WorkerMessageType>>(message: M): void;
94
+ /**
95
+ * Broadcast a response message to all workers.
96
+ *
97
+ * @param {WorkerResponse<T>} message - The typed response message to broadcast.
98
+ * @returns {void}
99
+ */
100
+ respond<M extends WorkerResponse<WorkerMessageType>>(message: M): void;
101
+ /**
102
+ * Fetch data from a worker.
103
+ * It broadcasts a request message and waits for a response with the same id.
104
+ *
105
+ * @param {WorkerRequest<T>} message - The typed request message to broadcast.
106
+ * @returns {Promise<WorkerResponse<T>>} A promise that resolves with the response from the worker or rejects on timeout.
107
+ * @throws {Error} If the fetch operation times out after 100ms.
108
+ */
109
+ fetch<M extends WorkerRequest<WorkerMessageType>>(message: M): Promise<WorkerResponse<M['type']>>;
110
+ }
111
+ export {};
112
+ //# 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;AAEhI,UAAU,qBAAqB;IAC7B,mBAAmB,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IAWpE,QAAQ,CAAC,IAAI,EAAE,aAAa;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD;;;;;;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;IAIhC;;;;;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;;;;;;;OAOG;IACG,KAAK,CAAC,CAAC,SAAS,aAAa,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CA4BxG"}
@@ -1,13 +1,47 @@
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.1
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';
30
+ /**
31
+ * BroadcastServer class to handle broadcast messages between workers with BroadcastChannel.
32
+ */
6
33
  export class BroadcastServer extends EventEmitter {
7
34
  name;
8
35
  log;
9
36
  channel;
10
37
  broadcastChannel;
38
+ /**
39
+ * Creates an instance of BroadcastServer.
40
+ *
41
+ * @param {string} name - The name of the broadcast server.
42
+ * @param {AnsiLogger} log - The logger instance to use for logging.
43
+ * @param {string} channel - The channel name for the broadcast. Default is 'broadcast-channel'.
44
+ */
11
45
  constructor(name, log, channel = 'broadcast-channel') {
12
46
  super();
13
47
  this.name = name;
@@ -16,27 +50,69 @@ export class BroadcastServer extends EventEmitter {
16
50
  this.broadcastChannel = new BroadcastChannel(this.channel);
17
51
  this.broadcastChannel.onmessage = this.broadcastMessageHandler.bind(this);
18
52
  }
53
+ /**
54
+ * Closes the broadcast channel.
55
+ *
56
+ * @returns {void}
57
+ */
19
58
  close() {
59
+ // @ts-expect-error: wrong type definition in node.d.ts
20
60
  this.broadcastChannel.onmessage = null;
21
61
  this.broadcastChannel.close();
22
62
  }
63
+ /**
64
+ * Generates a unique ID with range 100000-999999.
65
+ *
66
+ * @returns {number} - A unique ID between 100000 and 999999
67
+ */
23
68
  getUniqueId() {
24
- return Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000;
69
+ return Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000; // random int between 100000 and 999999
25
70
  }
71
+ /**
72
+ * Type guard to check if a message is a request of a specific type.
73
+ *
74
+ * @param {unknown} msg - The message to check.
75
+ * @param {T} type - The type to check against.
76
+ * @returns {msg is WorkerRequest<T>} True if the message is a request of the specified type.
77
+ */
26
78
  isWorkerRequest(msg, type) {
27
79
  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;
28
80
  }
81
+ /**
82
+ * Type guard to check if a message is a response of a specific type.
83
+ *
84
+ * @param {unknown} msg - The message to check.
85
+ * @param {T} type - The type to check against.
86
+ * @returns {msg is WorkerResponse<T>} True if the message is a response of the specified type.
87
+ */
29
88
  isWorkerResponse(msg, type) {
30
89
  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
90
  }
91
+ /**
92
+ * Handles incoming broadcast messages.
93
+ *
94
+ * @param {MessageEvent} event - The message event containing the broadcast message.
95
+ * @returns {void}
96
+ */
32
97
  broadcastMessageHandler(event) {
33
98
  const data = event.data;
34
99
  this.log.debug(`Received broadcast message: ${debugStringify(data)}`);
35
100
  this.emit('broadcast_message', data);
36
101
  }
102
+ /**
103
+ * Broadcast a message to all workers.
104
+ *
105
+ * @param {WorkerMessage} message - The message to broadcast.
106
+ */
37
107
  broadcast(message) {
38
108
  this.broadcastChannel.postMessage(message);
39
109
  }
110
+ /**
111
+ * Broadcast a request message to all workers.
112
+ *
113
+ * @param {WorkerRequest<T>} message - The typed request message to broadcast.
114
+ * @returns {void}
115
+ */
40
116
  request(message) {
41
117
  if (message.id === undefined) {
42
118
  message.id = this.getUniqueId();
@@ -51,6 +127,12 @@ export class BroadcastServer extends EventEmitter {
51
127
  this.log.debug(`Broadcasting request message: ${debugStringify(message)}`);
52
128
  this.broadcastChannel.postMessage(message);
53
129
  }
130
+ /**
131
+ * Broadcast a response message to all workers.
132
+ *
133
+ * @param {WorkerResponse<T>} message - The typed response message to broadcast.
134
+ * @returns {void}
135
+ */
54
136
  respond(message) {
55
137
  if (message.timestamp === undefined) {
56
138
  message.timestamp = Date.now();
@@ -62,6 +144,14 @@ export class BroadcastServer extends EventEmitter {
62
144
  this.log.debug(`Broadcasting response message: ${debugStringify(message)}`);
63
145
  this.broadcastChannel.postMessage(message);
64
146
  }
147
+ /**
148
+ * Fetch data from a worker.
149
+ * It broadcasts a request message and waits for a response with the same id.
150
+ *
151
+ * @param {WorkerRequest<T>} message - The typed request message to broadcast.
152
+ * @returns {Promise<WorkerResponse<T>>} A promise that resolves with the response from the worker or rejects on timeout.
153
+ * @throws {Error} If the fetch operation times out after 100ms.
154
+ */
65
155
  async fetch(message) {
66
156
  if (message.id === undefined) {
67
157
  message.id = this.getUniqueId();
@@ -88,3 +178,4 @@ export class BroadcastServer extends EventEmitter {
88
178
  });
89
179
  }
90
180
  }
181
+ //# sourceMappingURL=broadcastServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcastServer.js","sourceRoot":"","sources":["../src/broadcastServer.ts"],"names":[],"mappings":"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"}