@seriousme/opifex 1.7.0 → 1.8.0

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 (313) hide show
  1. package/README.md +17 -2
  2. package/dist/bin/conformanceServer.d.ts +3 -0
  3. package/dist/bin/conformanceServer.d.ts.map +1 -0
  4. package/dist/bin/conformanceServer.js +98 -0
  5. package/dist/bin/conformanceServer.js.map +1 -0
  6. package/dist/bin/demoServer.d.ts +3 -0
  7. package/dist/bin/demoServer.d.ts.map +1 -0
  8. package/dist/bin/demoServer.js +97 -0
  9. package/dist/bin/demoServer.js.map +1 -0
  10. package/dist/bin/mqtt.d.ts +3 -0
  11. package/dist/bin/mqtt.d.ts.map +1 -0
  12. package/dist/bin/mqtt.js +257 -0
  13. package/dist/bin/mqtt.js.map +1 -0
  14. package/dist/client/ConnectionState.d.ts +21 -0
  15. package/dist/client/ConnectionState.d.ts.map +1 -0
  16. package/dist/client/ConnectionState.js +17 -0
  17. package/dist/client/ConnectionState.js.map +1 -0
  18. package/dist/client/client.d.ts +94 -0
  19. package/dist/client/client.d.ts.map +1 -0
  20. package/dist/client/client.js +188 -0
  21. package/dist/client/client.js.map +1 -0
  22. package/dist/client/context.d.ts +29 -0
  23. package/dist/client/context.d.ts.map +1 -0
  24. package/dist/client/context.js +153 -0
  25. package/dist/client/context.js.map +1 -0
  26. package/dist/client/deps.d.ts +8 -0
  27. package/dist/client/deps.d.ts.map +1 -0
  28. package/dist/client/deps.js +6 -0
  29. package/dist/client/deps.js.map +1 -0
  30. package/dist/client/handlers/handleConnack.d.ts +10 -0
  31. package/dist/client/handlers/handleConnack.d.ts.map +1 -0
  32. package/dist/client/handlers/handleConnack.js +25 -0
  33. package/dist/client/handlers/handleConnack.js.map +1 -0
  34. package/dist/client/handlers/handlePacket.d.ts +11 -0
  35. package/dist/client/handlers/handlePacket.d.ts.map +1 -0
  36. package/dist/client/handlers/handlePacket.js +58 -0
  37. package/dist/client/handlers/handlePacket.js.map +1 -0
  38. package/dist/client/handlers/handlePuback.d.ts +12 -0
  39. package/dist/client/handlers/handlePuback.d.ts.map +1 -0
  40. package/dist/client/handlers/handlePuback.js +14 -0
  41. package/dist/client/handlers/handlePuback.js.map +1 -0
  42. package/dist/client/handlers/handlePubcomp.d.ts +13 -0
  43. package/dist/client/handlers/handlePubcomp.d.ts.map +1 -0
  44. package/dist/client/handlers/handlePubcomp.js +17 -0
  45. package/dist/client/handlers/handlePubcomp.js.map +1 -0
  46. package/dist/client/handlers/handlePublish.d.ts +10 -0
  47. package/dist/client/handlers/handlePublish.d.ts.map +1 -0
  48. package/dist/client/handlers/handlePublish.js +34 -0
  49. package/dist/client/handlers/handlePublish.js.map +1 -0
  50. package/dist/client/handlers/handlePubrec.d.ts +17 -0
  51. package/dist/client/handlers/handlePubrec.d.ts.map +1 -0
  52. package/dist/client/handlers/handlePubrec.js +27 -0
  53. package/dist/client/handlers/handlePubrec.js.map +1 -0
  54. package/dist/client/handlers/handlePubrel.d.ts +20 -0
  55. package/dist/client/handlers/handlePubrel.d.ts.map +1 -0
  56. package/dist/client/handlers/handlePubrel.js +32 -0
  57. package/dist/client/handlers/handlePubrel.js.map +1 -0
  58. package/dist/client/handlers/handleSuback.d.ts +13 -0
  59. package/dist/client/handlers/handleSuback.d.ts.map +1 -0
  60. package/dist/client/handlers/handleSuback.js +15 -0
  61. package/dist/client/handlers/handleSuback.js.map +1 -0
  62. package/dist/client/handlers/handleUnsuback.d.ts +14 -0
  63. package/dist/client/handlers/handleUnsuback.d.ts.map +1 -0
  64. package/dist/client/handlers/handleUnsuback.js +16 -0
  65. package/dist/client/handlers/handleUnsuback.js.map +1 -0
  66. package/dist/client/mod.d.ts +7 -0
  67. package/dist/client/mod.d.ts.map +1 -0
  68. package/dist/client/mod.js +6 -0
  69. package/dist/client/mod.js.map +1 -0
  70. package/dist/client/store/deps.d.ts +3 -0
  71. package/dist/client/store/deps.d.ts.map +1 -0
  72. package/dist/client/store/deps.js +2 -0
  73. package/dist/client/store/deps.js.map +1 -0
  74. package/dist/client/store/memoryStore.d.ts +34 -0
  75. package/dist/client/store/memoryStore.d.ts.map +1 -0
  76. package/dist/client/store/memoryStore.js +59 -0
  77. package/dist/client/store/memoryStore.js.map +1 -0
  78. package/dist/client/store/store.d.ts +46 -0
  79. package/dist/client/store/store.d.ts.map +1 -0
  80. package/dist/client/store/store.js +5 -0
  81. package/dist/client/store/store.js.map +1 -0
  82. package/dist/mqttConn/mqttConn.d.ts +79 -0
  83. package/dist/mqttConn/mqttConn.d.ts.map +1 -0
  84. package/dist/mqttConn/mqttConn.js +151 -0
  85. package/dist/mqttConn/mqttConn.js.map +1 -0
  86. package/dist/mqttPacket/AuthenticationResult.d.ts +16 -0
  87. package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -0
  88. package/dist/mqttPacket/AuthenticationResult.js +17 -0
  89. package/dist/mqttPacket/AuthenticationResult.js.map +1 -0
  90. package/dist/mqttPacket/BitMask.d.ts +11 -0
  91. package/dist/mqttPacket/BitMask.d.ts.map +1 -0
  92. package/dist/mqttPacket/BitMask.js +11 -0
  93. package/dist/mqttPacket/BitMask.js.map +1 -0
  94. package/dist/mqttPacket/PacketType.d.ts +19 -0
  95. package/dist/mqttPacket/PacketType.d.ts.map +1 -0
  96. package/dist/mqttPacket/PacketType.js +19 -0
  97. package/dist/mqttPacket/PacketType.js.map +1 -0
  98. package/dist/mqttPacket/connack.d.ts +18 -0
  99. package/dist/mqttPacket/connack.d.ts.map +1 -0
  100. package/dist/mqttPacket/connack.js +28 -0
  101. package/dist/mqttPacket/connack.js.map +1 -0
  102. package/dist/mqttPacket/connect.d.ts +28 -0
  103. package/dist/mqttPacket/connect.d.ts.map +1 -0
  104. package/dist/mqttPacket/connect.js +116 -0
  105. package/dist/mqttPacket/connect.js.map +1 -0
  106. package/dist/mqttPacket/decoder.d.ts +24 -0
  107. package/dist/mqttPacket/decoder.d.ts.map +1 -0
  108. package/dist/mqttPacket/decoder.js +90 -0
  109. package/dist/mqttPacket/decoder.js.map +1 -0
  110. package/dist/mqttPacket/disconnect.d.ts +16 -0
  111. package/dist/mqttPacket/disconnect.d.ts.map +1 -0
  112. package/dist/mqttPacket/disconnect.js +15 -0
  113. package/dist/mqttPacket/disconnect.js.map +1 -0
  114. package/dist/mqttPacket/encoder.d.ts +17 -0
  115. package/dist/mqttPacket/encoder.d.ts.map +1 -0
  116. package/dist/mqttPacket/encoder.js +57 -0
  117. package/dist/mqttPacket/encoder.js.map +1 -0
  118. package/dist/mqttPacket/length.d.ts +12 -0
  119. package/dist/mqttPacket/length.d.ts.map +1 -0
  120. package/dist/mqttPacket/length.js +44 -0
  121. package/dist/mqttPacket/length.js.map +1 -0
  122. package/dist/mqttPacket/mod.d.ts +122 -0
  123. package/dist/mqttPacket/mod.d.ts.map +1 -0
  124. package/dist/mqttPacket/mod.js +77 -0
  125. package/dist/mqttPacket/mod.js.map +1 -0
  126. package/dist/mqttPacket/pingreq.d.ts +15 -0
  127. package/dist/mqttPacket/pingreq.d.ts.map +1 -0
  128. package/dist/mqttPacket/pingreq.js +16 -0
  129. package/dist/mqttPacket/pingreq.js.map +1 -0
  130. package/dist/mqttPacket/pingres.d.ts +16 -0
  131. package/dist/mqttPacket/pingres.d.ts.map +1 -0
  132. package/dist/mqttPacket/pingres.js +15 -0
  133. package/dist/mqttPacket/pingres.js.map +1 -0
  134. package/dist/mqttPacket/puback.d.ts +16 -0
  135. package/dist/mqttPacket/puback.d.ts.map +1 -0
  136. package/dist/mqttPacket/puback.js +21 -0
  137. package/dist/mqttPacket/puback.js.map +1 -0
  138. package/dist/mqttPacket/pubcomp.d.ts +17 -0
  139. package/dist/mqttPacket/pubcomp.d.ts.map +1 -0
  140. package/dist/mqttPacket/pubcomp.js +21 -0
  141. package/dist/mqttPacket/pubcomp.js.map +1 -0
  142. package/dist/mqttPacket/publish.d.ts +22 -0
  143. package/dist/mqttPacket/publish.d.ts.map +1 -0
  144. package/dist/mqttPacket/publish.js +52 -0
  145. package/dist/mqttPacket/publish.js.map +1 -0
  146. package/dist/mqttPacket/pubrec.d.ts +17 -0
  147. package/dist/mqttPacket/pubrec.d.ts.map +1 -0
  148. package/dist/mqttPacket/pubrec.js +21 -0
  149. package/dist/mqttPacket/pubrec.js.map +1 -0
  150. package/dist/mqttPacket/pubrel.d.ts +17 -0
  151. package/dist/mqttPacket/pubrel.d.ts.map +1 -0
  152. package/dist/mqttPacket/pubrel.js +21 -0
  153. package/dist/mqttPacket/pubrel.js.map +1 -0
  154. package/dist/mqttPacket/suback.d.ts +18 -0
  155. package/dist/mqttPacket/suback.d.ts.map +1 -0
  156. package/dist/mqttPacket/suback.js +30 -0
  157. package/dist/mqttPacket/suback.js.map +1 -0
  158. package/dist/mqttPacket/subscribe.d.ts +24 -0
  159. package/dist/mqttPacket/subscribe.d.ts.map +1 -0
  160. package/dist/mqttPacket/subscribe.js +53 -0
  161. package/dist/mqttPacket/subscribe.js.map +1 -0
  162. package/dist/mqttPacket/types.d.ts +48 -0
  163. package/dist/mqttPacket/types.d.ts.map +1 -0
  164. package/dist/mqttPacket/types.js +2 -0
  165. package/dist/mqttPacket/types.js.map +1 -0
  166. package/dist/mqttPacket/unsuback.d.ts +17 -0
  167. package/dist/mqttPacket/unsuback.d.ts.map +1 -0
  168. package/dist/mqttPacket/unsuback.js +21 -0
  169. package/dist/mqttPacket/unsuback.js.map +1 -0
  170. package/dist/mqttPacket/unsubscribe.d.ts +17 -0
  171. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -0
  172. package/dist/mqttPacket/unsubscribe.js +37 -0
  173. package/dist/mqttPacket/unsubscribe.js.map +1 -0
  174. package/dist/mqttPacket/validators.d.ts +5 -0
  175. package/dist/mqttPacket/validators.d.ts.map +1 -0
  176. package/dist/mqttPacket/validators.js +16 -0
  177. package/dist/mqttPacket/validators.js.map +1 -0
  178. package/dist/node/tcpClient.d.ts +18 -0
  179. package/dist/node/tcpClient.d.ts.map +1 -0
  180. package/dist/node/tcpClient.js +82 -0
  181. package/dist/node/tcpClient.js.map +1 -0
  182. package/dist/node/tcpServer.d.ts +17 -0
  183. package/dist/node/tcpServer.d.ts.map +1 -0
  184. package/dist/node/tcpServer.js +51 -0
  185. package/dist/node/tcpServer.js.map +1 -0
  186. package/dist/node/wrapNodeSocket.d.ts +12 -0
  187. package/dist/node/wrapNodeSocket.d.ts.map +1 -0
  188. package/dist/node/wrapNodeSocket.js +57 -0
  189. package/dist/node/wrapNodeSocket.js.map +1 -0
  190. package/dist/persistence/deps.d.ts +5 -0
  191. package/dist/persistence/deps.d.ts.map +1 -0
  192. package/dist/persistence/deps.js +4 -0
  193. package/dist/persistence/deps.js.map +1 -0
  194. package/dist/persistence/memory/memoryPersistence.d.ts +28 -0
  195. package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -0
  196. package/dist/persistence/memory/memoryPersistence.js +119 -0
  197. package/dist/persistence/memory/memoryPersistence.js.map +1 -0
  198. package/dist/persistence/persistence.d.ts +81 -0
  199. package/dist/persistence/persistence.d.ts.map +1 -0
  200. package/dist/persistence/persistence.js +2 -0
  201. package/dist/persistence/persistence.js.map +1 -0
  202. package/dist/persistence/store.d.ts +13 -0
  203. package/dist/persistence/store.d.ts.map +1 -0
  204. package/dist/persistence/store.js +2 -0
  205. package/dist/persistence/store.js.map +1 -0
  206. package/dist/server/context.d.ts +45 -0
  207. package/dist/server/context.d.ts.map +1 -0
  208. package/dist/server/context.js +101 -0
  209. package/dist/server/context.js.map +1 -0
  210. package/dist/server/deps.d.ts +10 -0
  211. package/dist/server/deps.d.ts.map +1 -0
  212. package/dist/server/deps.js +6 -0
  213. package/dist/server/deps.js.map +1 -0
  214. package/dist/server/handlers/handleConnect.d.ts +9 -0
  215. package/dist/server/handlers/handleConnect.d.ts.map +1 -0
  216. package/dist/server/handlers/handleConnect.js +81 -0
  217. package/dist/server/handlers/handleConnect.js.map +1 -0
  218. package/dist/server/handlers/handleDisconnect.d.ts +8 -0
  219. package/dist/server/handlers/handleDisconnect.d.ts.map +1 -0
  220. package/dist/server/handlers/handleDisconnect.js +10 -0
  221. package/dist/server/handlers/handleDisconnect.js.map +1 -0
  222. package/dist/server/handlers/handlePacket.d.ts +11 -0
  223. package/dist/server/handlers/handlePacket.d.ts.map +1 -0
  224. package/dist/server/handlers/handlePacket.js +66 -0
  225. package/dist/server/handlers/handlePacket.js.map +1 -0
  226. package/dist/server/handlers/handlePingreq.d.ts +8 -0
  227. package/dist/server/handlers/handlePingreq.d.ts.map +1 -0
  228. package/dist/server/handlers/handlePingreq.js +12 -0
  229. package/dist/server/handlers/handlePingreq.js.map +1 -0
  230. package/dist/server/handlers/handlePuback.d.ts +13 -0
  231. package/dist/server/handlers/handlePuback.d.ts.map +1 -0
  232. package/dist/server/handlers/handlePuback.js +17 -0
  233. package/dist/server/handlers/handlePuback.js.map +1 -0
  234. package/dist/server/handlers/handlePubcomp.d.ts +12 -0
  235. package/dist/server/handlers/handlePubcomp.d.ts.map +1 -0
  236. package/dist/server/handlers/handlePubcomp.js +15 -0
  237. package/dist/server/handlers/handlePubcomp.js.map +1 -0
  238. package/dist/server/handlers/handlePublish.d.ts +11 -0
  239. package/dist/server/handlers/handlePublish.d.ts.map +1 -0
  240. package/dist/server/handlers/handlePublish.js +55 -0
  241. package/dist/server/handlers/handlePublish.js.map +1 -0
  242. package/dist/server/handlers/handlePubrec.d.ts +15 -0
  243. package/dist/server/handlers/handlePubrec.d.ts.map +1 -0
  244. package/dist/server/handlers/handlePubrec.js +24 -0
  245. package/dist/server/handlers/handlePubrec.js.map +1 -0
  246. package/dist/server/handlers/handlePubrel.d.ts +16 -0
  247. package/dist/server/handlers/handlePubrel.d.ts.map +1 -0
  248. package/dist/server/handlers/handlePubrel.js +28 -0
  249. package/dist/server/handlers/handlePubrel.js.map +1 -0
  250. package/dist/server/handlers/handleSubscribe.d.ts +13 -0
  251. package/dist/server/handlers/handleSubscribe.d.ts.map +1 -0
  252. package/dist/server/handlers/handleSubscribe.js +57 -0
  253. package/dist/server/handlers/handleSubscribe.js.map +1 -0
  254. package/dist/server/handlers/handleUnsubscribe.d.ts +10 -0
  255. package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -0
  256. package/dist/server/handlers/handleUnsubscribe.js +19 -0
  257. package/dist/server/handlers/handleUnsubscribe.js.map +1 -0
  258. package/dist/server/mod.d.ts +11 -0
  259. package/dist/server/mod.d.ts.map +1 -0
  260. package/dist/server/mod.js +8 -0
  261. package/dist/server/mod.js.map +1 -0
  262. package/dist/server/server.d.ts +27 -0
  263. package/dist/server/server.d.ts.map +1 -0
  264. package/dist/server/server.js +48 -0
  265. package/dist/server/server.js.map +1 -0
  266. package/dist/socket/socket.d.ts +29 -0
  267. package/dist/socket/socket.d.ts.map +1 -0
  268. package/dist/socket/socket.js +37 -0
  269. package/dist/socket/socket.js.map +1 -0
  270. package/dist/timer/timer.d.ts +13 -0
  271. package/dist/timer/timer.d.ts.map +1 -0
  272. package/dist/timer/timer.js +41 -0
  273. package/dist/timer/timer.js.map +1 -0
  274. package/dist/trie/trie.d.ts +21 -0
  275. package/dist/trie/trie.d.ts.map +1 -0
  276. package/dist/trie/trie.js +96 -0
  277. package/dist/trie/trie.js.map +1 -0
  278. package/dist/utils/args.d.ts +28 -0
  279. package/dist/utils/args.d.ts.map +1 -0
  280. package/dist/utils/args.js +76 -0
  281. package/dist/utils/args.js.map +1 -0
  282. package/dist/utils/assert.d.ts +10 -0
  283. package/dist/utils/assert.d.ts.map +1 -0
  284. package/dist/utils/assert.js +21 -0
  285. package/dist/utils/assert.js.map +1 -0
  286. package/dist/utils/asyncQueue.d.ts +28 -0
  287. package/dist/utils/asyncQueue.d.ts.map +1 -0
  288. package/dist/utils/asyncQueue.js +70 -0
  289. package/dist/utils/asyncQueue.js.map +1 -0
  290. package/dist/utils/deferred.d.ts +10 -0
  291. package/dist/utils/deferred.d.ts.map +1 -0
  292. package/dist/utils/deferred.js +15 -0
  293. package/dist/utils/deferred.js.map +1 -0
  294. package/dist/utils/logger.d.ts +63 -0
  295. package/dist/utils/logger.d.ts.map +1 -0
  296. package/dist/utils/logger.js +59 -0
  297. package/dist/utils/logger.js.map +1 -0
  298. package/dist/utils/mod.d.ts +13 -0
  299. package/dist/utils/mod.d.ts.map +1 -0
  300. package/dist/utils/mod.js +12 -0
  301. package/dist/utils/mod.js.map +1 -0
  302. package/dist/utils/nextTick.d.ts +17 -0
  303. package/dist/utils/nextTick.d.ts.map +1 -0
  304. package/dist/utils/nextTick.js +19 -0
  305. package/dist/utils/nextTick.js.map +1 -0
  306. package/dist/utils/platform.d.ts +5 -0
  307. package/dist/utils/platform.d.ts.map +1 -0
  308. package/dist/utils/platform.js +8 -0
  309. package/dist/utils/platform.js.map +1 -0
  310. package/examples/tcpServer.test.ts +149 -0
  311. package/mqttConn/mqttConn.ts +58 -2
  312. package/package.json +14 -10
  313. package/persistence/persistence.ts +66 -2
package/README.md CHANGED
@@ -13,8 +13,7 @@ persistence.
13
13
 
14
14
  ## Example
15
15
 
16
- A simple server example using Deno, for more elaborate examples see the Usage
17
- section below.
16
+ A simple server example using Deno.
18
17
 
19
18
  ```typescript
20
19
  import { MqttServer } from "./server/mod.ts";
@@ -26,6 +25,9 @@ for await (const conn of this.listener) {
26
25
  }
27
26
  ```
28
27
 
28
+ A more elaborate example including client and server can be found in the
29
+ [examples](/examples/) folder.
30
+
29
31
  ## Architecture
30
32
 
31
33
  1. The basis of Opifex is the MQTT packet module
@@ -86,6 +88,19 @@ inspiration.
86
88
 
87
89
  Bun (as of version 1.2) is capable of running the NodeJS version.
88
90
 
91
+ ## Exports
92
+
93
+ | Export | Description |
94
+ | ---------------------------- | ------------------------------------------------------- |
95
+ | @seriousme/opifex/tcpClient | Exports a MQTT over TCP client |
96
+ | @seriousme/opifex/tcpServer | Exports a MQTT over TCP server |
97
+ | @seriousme/opifex/server | Exports a transport agnostic MQTT server |
98
+ | @seriousme/opifex/client | Exports a transport agnostic MQTT client |
99
+ | @seriousme/opifex/client | Exports an Typescript interface for storage persistence |
100
+ | @seriousme/opifex/mqttConn | Exports MQTT connection handling |
101
+ | @seriousme/opifex/mqttPacket | Exports MQTT packet handling |
102
+ | @seriousme/opifex/utils | Exports various utilities |
103
+
89
104
  ## Naming
90
105
 
91
106
  Some MQTT servers have names like:
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --experimental-strip-types
2
+ export {};
3
+ //# sourceMappingURL=conformanceServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformanceServer.d.ts","sourceRoot":"","sources":["../../bin/conformanceServer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env -S node --experimental-strip-types
2
+ // this server is intended to be used with https://github.com/eclipse/iottestware
3
+ /**
4
+ * MQTT Server implementation with authentication and authorization
5
+ * @module mqttServer
6
+ */
7
+ import { TcpServer } from "../node/tcpServer.js";
8
+ import { AuthenticationResult } from "../server/mod.js";
9
+ import { getArgs, logger, LogLevel, parseArgs } from "../utils/mod.js";
10
+ /**
11
+ * UTF-8 decoder for parsing passwords
12
+ */
13
+ const utf8Decoder = new TextDecoder();
14
+ /**
15
+ * Map storing valid username/password combinations
16
+ */
17
+ const userTable = new Map();
18
+ userTable.set("IoTester_1", "strong_password");
19
+ userTable.set("IoTester_2", "strong_password");
20
+ /**
21
+ * Regular expression for validating usernames
22
+ * Allows alphanumeric characters up to 23 chars long
23
+ */
24
+ const strictUsername = new RegExp(/^[a-zA-Z0-9]{0,23}$/);
25
+ /**
26
+ * Flag to enable/disable username checking
27
+ * If false, all users are allowed access
28
+ * If true, only users in userTable are allowed access
29
+ */
30
+ const checkUsername = true;
31
+ /**
32
+ * Authenticates MQTT clients
33
+ * @param {Context} _ctx - Connection context
34
+ * @param {string} clientId - Client identifier
35
+ * @param {string} username - Username to authenticate
36
+ * @param {Uint8Array} password - Password as byte array
37
+ * @returns {TAuthenticationResult} Authentication result
38
+ */
39
+ function isAuthenticated(_ctx, clientId, username, password) {
40
+ const pwd = utf8Decoder.decode(password);
41
+ logger.info(`Verifying authentication of client '${clientId}' with username '${username}' and password '${pwd}'`);
42
+ if (!checkUsername) {
43
+ // allow all users access
44
+ return AuthenticationResult.ok;
45
+ }
46
+ // is the username valid according to MQTT specification
47
+ if (!strictUsername.test(username)) {
48
+ return AuthenticationResult.badUsernameOrPassword;
49
+ }
50
+ // Does user and password match an entry in userTable
51
+ if (userTable.has(username)) {
52
+ const pass = userTable.get(username);
53
+ if (pwd === pass) {
54
+ return AuthenticationResult.ok;
55
+ }
56
+ }
57
+ return AuthenticationResult.notAuthorized;
58
+ }
59
+ /**
60
+ * Checks if client is authorized to publish to a topic
61
+ * @param {Context} ctx - Connection context
62
+ * @param {Topic} topic - Topic to publish to
63
+ * @returns {boolean} True if authorized
64
+ */
65
+ function isAuthorizedToPublish(ctx, topic) {
66
+ logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to publish on topic '${topic}'`);
67
+ return true;
68
+ }
69
+ /**
70
+ * Checks if client is authorized to subscribe to a topic
71
+ * @param {Context} ctx - Connection context
72
+ * @param {Topic} topic - Topic to subscribe to
73
+ * @returns {boolean} True if authorized
74
+ */
75
+ function isAuthorizedToSubscribe(ctx, topic) {
76
+ logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to subscribe to topic '${topic}'`);
77
+ return true;
78
+ }
79
+ /**
80
+ * Parse command line arguments and start server
81
+ */
82
+ const { _: [portNum] } = parseArgs(getArgs());
83
+ const port = Number(portNum ?? 1883);
84
+ const hostname = "::";
85
+ logger.level(LogLevel.info);
86
+ /**
87
+ * TCP Server instance with authentication and authorization handlers
88
+ */
89
+ const tcpServer = new TcpServer({ port, hostname }, {
90
+ handlers: {
91
+ isAuthenticated,
92
+ isAuthorizedToPublish,
93
+ isAuthorizedToSubscribe,
94
+ },
95
+ });
96
+ tcpServer.start();
97
+ logger.info(`Server started on port ${tcpServer.port}`);
98
+ //# sourceMappingURL=conformanceServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformanceServer.js","sourceRoot":"","sources":["../../bin/conformanceServer.ts"],"names":[],"mappings":";AACA,iFAAiF;AAEjF;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5B,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAC/C,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B;;;;;;;GAOG;AACH,SAAS,eAAe,CACtB,IAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,QAAoB;IAEpB,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CACT,uCAAuC,QAAQ,oBAAoB,QAAQ,mBAAmB,GAAG,GAAG,CACrG,CAAC;IAEF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,yBAAyB;QACzB,OAAO,oBAAoB,CAAC,EAAE,CAAC;IACjC,CAAC;IACD,wDAAwD;IACxD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,oBAAoB,CAAC,qBAAqB,CAAC;IACpD,CAAC;IACD,qDAAqD;IACrD,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,oBAAoB,CAAC,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,aAAa,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,GAAY,EAAE,KAAY;IACvD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,0BAA0B,KAAK,GAAG,CAC3F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,GAAY,EAAE,KAAY;IACzD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,4BAA4B,KAAK,GAAG,CAC7F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAClD,QAAQ,EAAE;QACR,eAAe;QACf,qBAAqB;QACrB,uBAAuB;KACxB;CACF,CAAC,CAAC;AACH,SAAS,CAAC,KAAK,EAAE,CAAC;AAClB,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --experimental-strip-types
2
+ export {};
3
+ //# sourceMappingURL=demoServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoServer.d.ts","sourceRoot":"","sources":["../../bin/demoServer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env -S node --experimental-strip-types
2
+ /**
3
+ * MQTT Server implementation with authentication and authorization
4
+ * @module mqttServer
5
+ */
6
+ import { TcpServer } from "../node/tcpServer.js";
7
+ import { AuthenticationResult } from "../server/mod.js";
8
+ import { getArgs, logger, LogLevel, parseArgs } from "../utils/mod.js";
9
+ /**
10
+ * UTF-8 decoder for parsing passwords
11
+ */
12
+ const utf8Decoder = new TextDecoder();
13
+ /**
14
+ * Map storing valid username/password combinations
15
+ */
16
+ const userTable = new Map();
17
+ userTable.set("IoTester_1", "strong_password");
18
+ userTable.set("IoTester_2", "strong_password");
19
+ /**
20
+ * Regular expression for validating usernames
21
+ * Allows alphanumeric characters up to 23 chars long
22
+ */
23
+ const strictUsername = new RegExp(/^[a-zA-Z0-9]{0,23}$/);
24
+ /**
25
+ * Flag to enable/disable username checking
26
+ * If false, all users are allowed access
27
+ * If true, only users in userTable are allowed access
28
+ */
29
+ const checkUsername = false;
30
+ /**
31
+ * Authenticates MQTT clients
32
+ * @param {Context} _ctx - Connection context
33
+ * @param {string} clientId - Client identifier
34
+ * @param {string} username - Username to authenticate
35
+ * @param {Uint8Array} password - Password as byte array
36
+ * @returns {TAuthenticationResult} Authentication result
37
+ */
38
+ function isAuthenticated(_ctx, clientId, username, password) {
39
+ const pwd = utf8Decoder.decode(password);
40
+ logger.info(`Verifying authentication of client '${clientId}' with username '${username}' and password '${pwd}'`);
41
+ if (!checkUsername) {
42
+ // allow all users access
43
+ return AuthenticationResult.ok;
44
+ }
45
+ // is the username valid according to MQTT specification
46
+ if (!strictUsername.test(username)) {
47
+ return AuthenticationResult.badUsernameOrPassword;
48
+ }
49
+ // Does user and password match an entry in userTable
50
+ if (userTable.has(username)) {
51
+ const pass = userTable.get(username);
52
+ if (pwd === pass) {
53
+ return AuthenticationResult.ok;
54
+ }
55
+ }
56
+ return AuthenticationResult.notAuthorized;
57
+ }
58
+ /**
59
+ * Checks if client is authorized to publish to a topic
60
+ * @param {Context} ctx - Connection context
61
+ * @param {Topic} topic - Topic to publish to
62
+ * @returns {boolean} True if authorized
63
+ */
64
+ function isAuthorizedToPublish(ctx, topic) {
65
+ logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to publish on topic '${topic}'`);
66
+ return true;
67
+ }
68
+ /**
69
+ * Checks if client is authorized to subscribe to a topic
70
+ * @param {Context} ctx - Connection context
71
+ * @param {Topic} topic - Topic to subscribe to
72
+ * @returns {boolean} True if authorized
73
+ */
74
+ function isAuthorizedToSubscribe(ctx, topic) {
75
+ logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to subscribe to topic '${topic}'`);
76
+ return true;
77
+ }
78
+ /**
79
+ * Parse command line arguments and start server
80
+ */
81
+ const { _: [portNum] } = parseArgs(getArgs());
82
+ const port = Number(portNum ?? 1883);
83
+ const hostname = "::";
84
+ logger.level(LogLevel.info);
85
+ /**
86
+ * TCP Server instance with authentication and authorization handlers
87
+ */
88
+ const tcpServer = new TcpServer({ port, hostname }, {
89
+ handlers: {
90
+ isAuthenticated,
91
+ isAuthorizedToPublish,
92
+ isAuthorizedToSubscribe,
93
+ },
94
+ });
95
+ tcpServer.start();
96
+ logger.info(`Server started on port ${tcpServer.port}`);
97
+ //# sourceMappingURL=demoServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoServer.js","sourceRoot":"","sources":["../../bin/demoServer.ts"],"names":[],"mappings":";AAEA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5B,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAC/C,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B;;;;;;;GAOG;AACH,SAAS,eAAe,CACtB,IAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,QAAoB;IAEpB,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CACT,uCAAuC,QAAQ,oBAAoB,QAAQ,mBAAmB,GAAG,GAAG,CACrG,CAAC;IAEF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,yBAAyB;QACzB,OAAO,oBAAoB,CAAC,EAAE,CAAC;IACjC,CAAC;IACD,wDAAwD;IACxD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,oBAAoB,CAAC,qBAAqB,CAAC;IACpD,CAAC;IACD,qDAAqD;IACrD,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,oBAAoB,CAAC,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,aAAa,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,GAAY,EAAE,KAAY;IACvD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,0BAA0B,KAAK,GAAG,CAC3F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,GAAY,EAAE,KAAY;IACzD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,4BAA4B,KAAK,GAAG,CAC7F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAClD,QAAQ,EAAE;QACR,eAAe;QACf,qBAAqB;QACrB,uBAAuB;KACxB;CACF,CAAC,CAAC;AACH,SAAS,CAAC,KAAK,EAAE,CAAC;AAClB,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --experimental-strip-types
2
+ export {};
3
+ //# sourceMappingURL=mqtt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mqtt.d.ts","sourceRoot":"","sources":["../../bin/mqtt.ts"],"names":[],"mappings":""}
@@ -0,0 +1,257 @@
1
+ #!/usr/bin/env -S node --experimental-strip-types
2
+ /**
3
+ * @fileoverview MQTT command line interface that provides publish and subscribe functionality
4
+ * @module mqtt-cli
5
+ *
6
+ * @description
7
+ * This module implements a command line interface for MQTT operations:
8
+ * - Publish messages to an MQTT broker
9
+ * - Subscribe to topics on an MQTT broker
10
+ *
11
+ * Features:
12
+ * - TLS support with custom certificates
13
+ * - Authentication with username/password
14
+ * - Configurable QoS levels (0-2)
15
+ * - Message retention
16
+ * - Session persistence
17
+ * - Custom client IDs
18
+ *
19
+ * @example
20
+ * # Publish a message
21
+ * mqtt publish -t topic -m message
22
+ *
23
+ * # Subscribe to a topic
24
+ * mqtt subscribe -t topic
25
+ *
26
+ * @requires node
27
+ * @requires ../client/mod.ts
28
+ * @requires ../node/tcpClient.ts
29
+ * @requires ../utils/mod.ts
30
+ */
31
+ import { DEFAULT_URL } from "../client/mod.js";
32
+ import { getFileData, TcpClient } from "../node/tcpClient.js";
33
+ import { getArgs, logger, LogLevel, parseArgs } from "../utils/mod.js";
34
+ const client = new TcpClient();
35
+ const encoder = new TextEncoder();
36
+ const decoder = new TextDecoder();
37
+ logger.level(LogLevel.info);
38
+ const MQTTHelp = `MQTT command line interface, available commands are:
39
+
40
+ * publish publish a message to the broker
41
+ * subscribe subscribe for updates from the broker
42
+
43
+ Run 'mqtt [command] --help' to know more about the commands.`;
44
+ const ConnectHelp = `
45
+ -u/--url the URL to connect to: default is ${DEFAULT_URL}
46
+ -i/--clientId the clientId to connect to the server
47
+ -U/--username the username to connect to the server
48
+ -P/--password the password to connect to the server
49
+ -C/--caFile the path to a CA certificate file
50
+ -c/--certFile the path to a certificate file
51
+ -k/--keyFile the path to a key file
52
+ -n/--noClean try to resume a previous session
53
+ -h/--help this text
54
+ `;
55
+ const connectOpts = {
56
+ string: [
57
+ "url",
58
+ "username",
59
+ "password",
60
+ "caFile",
61
+ "certFile",
62
+ "keyFile",
63
+ "clientId",
64
+ ],
65
+ alias: {
66
+ u: "url",
67
+ U: "username",
68
+ P: "password",
69
+ C: "caFile",
70
+ c: "certFile",
71
+ k: "keyFile",
72
+ i: "clientId",
73
+ n: "noClean",
74
+ h: "help",
75
+ },
76
+ boolean: ["noClean", "help"],
77
+ default: {
78
+ noClean: false,
79
+ clientId: `Opifex-${crypto.randomUUID()}`,
80
+ },
81
+ };
82
+ const SubscribeHelp = `Usage: mqtt subscribe <options>
83
+
84
+ Where options are:
85
+ -t/--topic the topic to use
86
+ -q/--qos the QoS (0/1/2) to use, default is 0
87
+ ${ConnectHelp}
88
+ Example: mqtt subscribe -t hello`;
89
+ const subscribeOpts = {
90
+ string: ["topic"],
91
+ alias: {
92
+ t: "topic",
93
+ q: "qos",
94
+ },
95
+ default: {
96
+ qos: 0,
97
+ topic: "",
98
+ },
99
+ };
100
+ function parseQos(qosArg) {
101
+ const qos = Number(qosArg);
102
+ switch (qos) {
103
+ case 0:
104
+ return 0;
105
+ case 1:
106
+ return 1;
107
+ case 2:
108
+ return 2;
109
+ default:
110
+ break;
111
+ }
112
+ console.log("QoS must be between 0 and 2");
113
+ return 0;
114
+ }
115
+ async function getTLSdata(connectArgs) {
116
+ const caFileData = await getFileData(connectArgs.caFile);
117
+ const caCerts = caFileData ? [caFileData] : undefined;
118
+ const cert = await getFileData(connectArgs.certFile);
119
+ const key = await getFileData(connectArgs.keyFile);
120
+ return {
121
+ caCerts,
122
+ cert,
123
+ key,
124
+ };
125
+ }
126
+ async function subscribe() {
127
+ const connectArgs = parseArgs(getArgs(), connectOpts);
128
+ const { caCerts, cert, key, } = await getTLSdata(connectArgs);
129
+ const subscribeArgs = parseArgs(getArgs(), subscribeOpts);
130
+ if (connectArgs.help) {
131
+ console.log(SubscribeHelp);
132
+ return;
133
+ }
134
+ if (subscribeArgs.topic === undefined) {
135
+ console.log("Missing `topic`");
136
+ return;
137
+ }
138
+ try {
139
+ await client.connect({
140
+ url: connectArgs.url,
141
+ caCerts,
142
+ cert,
143
+ key,
144
+ options: {
145
+ username: connectArgs.username,
146
+ password: encoder.encode(connectArgs.password),
147
+ clientId: connectArgs.clientId,
148
+ clean: !connectArgs.noClean,
149
+ keepAlive: 60,
150
+ },
151
+ });
152
+ logger.debug("Connected !");
153
+ client.subscribe({
154
+ subscriptions: [
155
+ {
156
+ topicFilter: subscribeArgs.topic,
157
+ qos: parseQos(subscribeArgs.qos),
158
+ },
159
+ ],
160
+ });
161
+ logger.debug("Subscribed!");
162
+ for await (const message of client.messages()) {
163
+ console.log(decoder.decode(message.payload));
164
+ }
165
+ }
166
+ catch (err) {
167
+ if (err instanceof Error) {
168
+ // @ts-ignore the type spec of err is missing err.code
169
+ logger.info(`Error: ${err.message || err.code}`);
170
+ }
171
+ }
172
+ }
173
+ const PublishHelp = `Usage: mqtt publish <options>
174
+
175
+ Where options are:
176
+ -t/--topic the topic to use
177
+ -m/--message the message to send
178
+ -q/--qos the QoS (0/1/2) to use, default is 0
179
+ -r/--retain if the message should be retained, default is false
180
+ ${ConnectHelp}
181
+ Example: mqtt publish -t hello -m world`;
182
+ const publishOpts = {
183
+ string: ["topic", "message"],
184
+ boolean: ["retain"],
185
+ alias: {
186
+ t: "topic",
187
+ m: "message",
188
+ q: "qos",
189
+ r: "retain",
190
+ },
191
+ default: {
192
+ qos: 0,
193
+ dup: false,
194
+ retain: false,
195
+ topic: undefined,
196
+ message: "",
197
+ },
198
+ };
199
+ async function publish() {
200
+ const connectArgs = parseArgs(getArgs(), connectOpts);
201
+ const { caCerts, cert, key, } = await getTLSdata(connectArgs);
202
+ const publishArgs = parseArgs(getArgs(), publishOpts);
203
+ if (connectArgs.help) {
204
+ console.log(PublishHelp);
205
+ return;
206
+ }
207
+ if (publishArgs.topic === undefined) {
208
+ console.log("Missing `topic`");
209
+ return;
210
+ }
211
+ try {
212
+ await client.connect({
213
+ url: connectArgs.url,
214
+ caCerts,
215
+ cert,
216
+ key,
217
+ options: {
218
+ username: connectArgs.username,
219
+ password: encoder.encode(connectArgs.password),
220
+ clientId: connectArgs.clientId,
221
+ clean: !connectArgs.noClean,
222
+ },
223
+ });
224
+ logger.debug("Connected !");
225
+ await client.publish({
226
+ topic: publishArgs.topic,
227
+ payload: encoder.encode(publishArgs.message),
228
+ retain: publishArgs.retain,
229
+ qos: parseQos(publishArgs.qos),
230
+ });
231
+ logger.debug("Published!");
232
+ client.disconnect();
233
+ logger.debug("Disconnected !");
234
+ }
235
+ catch (err) {
236
+ if (err instanceof Error) {
237
+ // @ts-ignore the type spec of err is missing err.code
238
+ logger.info(`Error: ${err.message || err.code}`);
239
+ }
240
+ }
241
+ }
242
+ function processArgs() {
243
+ const { _: [cmd] } = parseArgs(getArgs());
244
+ switch (cmd) {
245
+ case "publish":
246
+ publish();
247
+ break;
248
+ case "subscribe":
249
+ subscribe();
250
+ break;
251
+ default:
252
+ console.log(MQTTHelp);
253
+ break;
254
+ }
255
+ }
256
+ processArgs();
257
+ //# sourceMappingURL=mqtt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mqtt.js","sourceRoot":"","sources":["../../bin/mqtt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @description Object representing possible connection states
3
+ * @readonly
4
+ */
5
+ export declare const ConnectionState: {
6
+ /** System is offline and not attempting connection */
7
+ readonly offline: "offline";
8
+ /** System is in the process of establishing a connection */
9
+ readonly connecting: "connecting";
10
+ /** System has an active connection */
11
+ readonly connected: "connected";
12
+ /** System is in the process of disconnecting */
13
+ readonly disconnecting: "disconnecting";
14
+ /** System has been disconnected */
15
+ readonly disconnected: "disconnected";
16
+ };
17
+ /**
18
+ * @description Type representing the possible values of ConnectionState
19
+ */
20
+ export type TConnectionState = (typeof ConnectionState)[keyof typeof ConnectionState];
21
+ //# sourceMappingURL=ConnectionState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionState.d.ts","sourceRoot":"","sources":["../../client/ConnectionState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe;IAC1B,sDAAsD;;IAEtD,4DAA4D;;IAE5D,sCAAsC;;IAEtC,gDAAgD;;IAEhD,mCAAmC;;CAE3B,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @description Object representing possible connection states
3
+ * @readonly
4
+ */
5
+ export const ConnectionState = {
6
+ /** System is offline and not attempting connection */
7
+ offline: "offline",
8
+ /** System is in the process of establishing a connection */
9
+ connecting: "connecting",
10
+ /** System has an active connection */
11
+ connected: "connected",
12
+ /** System is in the process of disconnecting */
13
+ disconnecting: "disconnecting",
14
+ /** System has been disconnected */
15
+ disconnected: "disconnected",
16
+ };
17
+ //# sourceMappingURL=ConnectionState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionState.js","sourceRoot":"","sources":["../../client/ConnectionState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,sDAAsD;IACtD,OAAO,EAAE,SAAS;IAClB,4DAA4D;IAC5D,UAAU,EAAE,YAAY;IACxB,sCAAsC;IACtC,SAAS,EAAE,WAAW;IACtB,gDAAgD;IAChD,aAAa,EAAE,eAAe;IAC9B,mCAAmC;IACnC,YAAY,EAAE,cAAc;CACpB,CAAC"}