@seriousme/opifex 1.7.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/dist/bin/conformanceServer.d.ts +3 -0
  2. package/dist/bin/conformanceServer.d.ts.map +1 -0
  3. package/dist/bin/conformanceServer.js +98 -0
  4. package/dist/bin/conformanceServer.js.map +1 -0
  5. package/dist/bin/demoServer.d.ts +3 -0
  6. package/dist/bin/demoServer.d.ts.map +1 -0
  7. package/dist/bin/demoServer.js +97 -0
  8. package/dist/bin/demoServer.js.map +1 -0
  9. package/dist/bin/mqtt.d.ts +3 -0
  10. package/dist/bin/mqtt.d.ts.map +1 -0
  11. package/dist/bin/mqtt.js +257 -0
  12. package/dist/bin/mqtt.js.map +1 -0
  13. package/dist/client/ConnectionState.d.ts +21 -0
  14. package/dist/client/ConnectionState.d.ts.map +1 -0
  15. package/dist/client/ConnectionState.js +17 -0
  16. package/dist/client/ConnectionState.js.map +1 -0
  17. package/dist/client/client.d.ts +94 -0
  18. package/dist/client/client.d.ts.map +1 -0
  19. package/dist/client/client.js +188 -0
  20. package/dist/client/client.js.map +1 -0
  21. package/dist/client/context.d.ts +29 -0
  22. package/dist/client/context.d.ts.map +1 -0
  23. package/dist/client/context.js +153 -0
  24. package/dist/client/context.js.map +1 -0
  25. package/dist/client/deps.d.ts +8 -0
  26. package/dist/client/deps.d.ts.map +1 -0
  27. package/dist/client/deps.js +6 -0
  28. package/dist/client/deps.js.map +1 -0
  29. package/dist/client/handlers/handleConnack.d.ts +10 -0
  30. package/dist/client/handlers/handleConnack.d.ts.map +1 -0
  31. package/dist/client/handlers/handleConnack.js +25 -0
  32. package/dist/client/handlers/handleConnack.js.map +1 -0
  33. package/dist/client/handlers/handlePacket.d.ts +11 -0
  34. package/dist/client/handlers/handlePacket.d.ts.map +1 -0
  35. package/dist/client/handlers/handlePacket.js +58 -0
  36. package/dist/client/handlers/handlePacket.js.map +1 -0
  37. package/dist/client/handlers/handlePuback.d.ts +12 -0
  38. package/dist/client/handlers/handlePuback.d.ts.map +1 -0
  39. package/dist/client/handlers/handlePuback.js +14 -0
  40. package/dist/client/handlers/handlePuback.js.map +1 -0
  41. package/dist/client/handlers/handlePubcomp.d.ts +13 -0
  42. package/dist/client/handlers/handlePubcomp.d.ts.map +1 -0
  43. package/dist/client/handlers/handlePubcomp.js +17 -0
  44. package/dist/client/handlers/handlePubcomp.js.map +1 -0
  45. package/dist/client/handlers/handlePublish.d.ts +10 -0
  46. package/dist/client/handlers/handlePublish.d.ts.map +1 -0
  47. package/dist/client/handlers/handlePublish.js +34 -0
  48. package/dist/client/handlers/handlePublish.js.map +1 -0
  49. package/dist/client/handlers/handlePubrec.d.ts +17 -0
  50. package/dist/client/handlers/handlePubrec.d.ts.map +1 -0
  51. package/dist/client/handlers/handlePubrec.js +27 -0
  52. package/dist/client/handlers/handlePubrec.js.map +1 -0
  53. package/dist/client/handlers/handlePubrel.d.ts +20 -0
  54. package/dist/client/handlers/handlePubrel.d.ts.map +1 -0
  55. package/dist/client/handlers/handlePubrel.js +32 -0
  56. package/dist/client/handlers/handlePubrel.js.map +1 -0
  57. package/dist/client/handlers/handleSuback.d.ts +13 -0
  58. package/dist/client/handlers/handleSuback.d.ts.map +1 -0
  59. package/dist/client/handlers/handleSuback.js +15 -0
  60. package/dist/client/handlers/handleSuback.js.map +1 -0
  61. package/dist/client/handlers/handleUnsuback.d.ts +14 -0
  62. package/dist/client/handlers/handleUnsuback.d.ts.map +1 -0
  63. package/dist/client/handlers/handleUnsuback.js +16 -0
  64. package/dist/client/handlers/handleUnsuback.js.map +1 -0
  65. package/dist/client/mod.d.ts +7 -0
  66. package/dist/client/mod.d.ts.map +1 -0
  67. package/dist/client/mod.js +6 -0
  68. package/dist/client/mod.js.map +1 -0
  69. package/dist/client/store/deps.d.ts +3 -0
  70. package/dist/client/store/deps.d.ts.map +1 -0
  71. package/dist/client/store/deps.js +2 -0
  72. package/dist/client/store/deps.js.map +1 -0
  73. package/dist/client/store/memoryStore.d.ts +34 -0
  74. package/dist/client/store/memoryStore.d.ts.map +1 -0
  75. package/dist/client/store/memoryStore.js +59 -0
  76. package/dist/client/store/memoryStore.js.map +1 -0
  77. package/dist/client/store/store.d.ts +46 -0
  78. package/dist/client/store/store.d.ts.map +1 -0
  79. package/dist/client/store/store.js +5 -0
  80. package/dist/client/store/store.js.map +1 -0
  81. package/dist/mqttConn/mqttConn.d.ts +36 -0
  82. package/dist/mqttConn/mqttConn.d.ts.map +1 -0
  83. package/dist/mqttConn/mqttConn.js +105 -0
  84. package/dist/mqttConn/mqttConn.js.map +1 -0
  85. package/dist/mqttPacket/AuthenticationResult.d.ts +16 -0
  86. package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -0
  87. package/dist/mqttPacket/AuthenticationResult.js +17 -0
  88. package/dist/mqttPacket/AuthenticationResult.js.map +1 -0
  89. package/dist/mqttPacket/BitMask.d.ts +11 -0
  90. package/dist/mqttPacket/BitMask.d.ts.map +1 -0
  91. package/dist/mqttPacket/BitMask.js +11 -0
  92. package/dist/mqttPacket/BitMask.js.map +1 -0
  93. package/dist/mqttPacket/PacketType.d.ts +19 -0
  94. package/dist/mqttPacket/PacketType.d.ts.map +1 -0
  95. package/dist/mqttPacket/PacketType.js +19 -0
  96. package/dist/mqttPacket/PacketType.js.map +1 -0
  97. package/dist/mqttPacket/connack.d.ts +18 -0
  98. package/dist/mqttPacket/connack.d.ts.map +1 -0
  99. package/dist/mqttPacket/connack.js +28 -0
  100. package/dist/mqttPacket/connack.js.map +1 -0
  101. package/dist/mqttPacket/connect.d.ts +28 -0
  102. package/dist/mqttPacket/connect.d.ts.map +1 -0
  103. package/dist/mqttPacket/connect.js +116 -0
  104. package/dist/mqttPacket/connect.js.map +1 -0
  105. package/dist/mqttPacket/decoder.d.ts +24 -0
  106. package/dist/mqttPacket/decoder.d.ts.map +1 -0
  107. package/dist/mqttPacket/decoder.js +90 -0
  108. package/dist/mqttPacket/decoder.js.map +1 -0
  109. package/dist/mqttPacket/disconnect.d.ts +16 -0
  110. package/dist/mqttPacket/disconnect.d.ts.map +1 -0
  111. package/dist/mqttPacket/disconnect.js +15 -0
  112. package/dist/mqttPacket/disconnect.js.map +1 -0
  113. package/dist/mqttPacket/encoder.d.ts +17 -0
  114. package/dist/mqttPacket/encoder.d.ts.map +1 -0
  115. package/dist/mqttPacket/encoder.js +57 -0
  116. package/dist/mqttPacket/encoder.js.map +1 -0
  117. package/dist/mqttPacket/length.d.ts +12 -0
  118. package/dist/mqttPacket/length.d.ts.map +1 -0
  119. package/dist/mqttPacket/length.js +44 -0
  120. package/dist/mqttPacket/length.js.map +1 -0
  121. package/dist/mqttPacket/mod.d.ts +122 -0
  122. package/dist/mqttPacket/mod.d.ts.map +1 -0
  123. package/dist/mqttPacket/mod.js +77 -0
  124. package/dist/mqttPacket/mod.js.map +1 -0
  125. package/dist/mqttPacket/pingreq.d.ts +15 -0
  126. package/dist/mqttPacket/pingreq.d.ts.map +1 -0
  127. package/dist/mqttPacket/pingreq.js +16 -0
  128. package/dist/mqttPacket/pingreq.js.map +1 -0
  129. package/dist/mqttPacket/pingres.d.ts +16 -0
  130. package/dist/mqttPacket/pingres.d.ts.map +1 -0
  131. package/dist/mqttPacket/pingres.js +15 -0
  132. package/dist/mqttPacket/pingres.js.map +1 -0
  133. package/dist/mqttPacket/puback.d.ts +16 -0
  134. package/dist/mqttPacket/puback.d.ts.map +1 -0
  135. package/dist/mqttPacket/puback.js +21 -0
  136. package/dist/mqttPacket/puback.js.map +1 -0
  137. package/dist/mqttPacket/pubcomp.d.ts +17 -0
  138. package/dist/mqttPacket/pubcomp.d.ts.map +1 -0
  139. package/dist/mqttPacket/pubcomp.js +21 -0
  140. package/dist/mqttPacket/pubcomp.js.map +1 -0
  141. package/dist/mqttPacket/publish.d.ts +22 -0
  142. package/dist/mqttPacket/publish.d.ts.map +1 -0
  143. package/dist/mqttPacket/publish.js +52 -0
  144. package/dist/mqttPacket/publish.js.map +1 -0
  145. package/dist/mqttPacket/pubrec.d.ts +17 -0
  146. package/dist/mqttPacket/pubrec.d.ts.map +1 -0
  147. package/dist/mqttPacket/pubrec.js +21 -0
  148. package/dist/mqttPacket/pubrec.js.map +1 -0
  149. package/dist/mqttPacket/pubrel.d.ts +17 -0
  150. package/dist/mqttPacket/pubrel.d.ts.map +1 -0
  151. package/dist/mqttPacket/pubrel.js +21 -0
  152. package/dist/mqttPacket/pubrel.js.map +1 -0
  153. package/dist/mqttPacket/suback.d.ts +18 -0
  154. package/dist/mqttPacket/suback.d.ts.map +1 -0
  155. package/dist/mqttPacket/suback.js +30 -0
  156. package/dist/mqttPacket/suback.js.map +1 -0
  157. package/dist/mqttPacket/subscribe.d.ts +24 -0
  158. package/dist/mqttPacket/subscribe.d.ts.map +1 -0
  159. package/dist/mqttPacket/subscribe.js +53 -0
  160. package/dist/mqttPacket/subscribe.js.map +1 -0
  161. package/dist/mqttPacket/types.d.ts +48 -0
  162. package/dist/mqttPacket/types.d.ts.map +1 -0
  163. package/dist/mqttPacket/types.js +2 -0
  164. package/dist/mqttPacket/types.js.map +1 -0
  165. package/dist/mqttPacket/unsuback.d.ts +17 -0
  166. package/dist/mqttPacket/unsuback.d.ts.map +1 -0
  167. package/dist/mqttPacket/unsuback.js +21 -0
  168. package/dist/mqttPacket/unsuback.js.map +1 -0
  169. package/dist/mqttPacket/unsubscribe.d.ts +17 -0
  170. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -0
  171. package/dist/mqttPacket/unsubscribe.js +37 -0
  172. package/dist/mqttPacket/unsubscribe.js.map +1 -0
  173. package/dist/mqttPacket/validators.d.ts +5 -0
  174. package/dist/mqttPacket/validators.d.ts.map +1 -0
  175. package/dist/mqttPacket/validators.js +16 -0
  176. package/dist/mqttPacket/validators.js.map +1 -0
  177. package/dist/node/tcpClient.d.ts +18 -0
  178. package/dist/node/tcpClient.d.ts.map +1 -0
  179. package/dist/node/tcpClient.js +82 -0
  180. package/dist/node/tcpClient.js.map +1 -0
  181. package/dist/node/tcpServer.d.ts +17 -0
  182. package/dist/node/tcpServer.d.ts.map +1 -0
  183. package/dist/node/tcpServer.js +51 -0
  184. package/dist/node/tcpServer.js.map +1 -0
  185. package/dist/node/wrapNodeSocket.d.ts +12 -0
  186. package/dist/node/wrapNodeSocket.d.ts.map +1 -0
  187. package/dist/node/wrapNodeSocket.js +57 -0
  188. package/dist/node/wrapNodeSocket.js.map +1 -0
  189. package/dist/persistence/deps.d.ts +5 -0
  190. package/dist/persistence/deps.d.ts.map +1 -0
  191. package/dist/persistence/deps.js +4 -0
  192. package/dist/persistence/deps.js.map +1 -0
  193. package/dist/persistence/memory/memoryPersistence.d.ts +28 -0
  194. package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -0
  195. package/dist/persistence/memory/memoryPersistence.js +119 -0
  196. package/dist/persistence/memory/memoryPersistence.js.map +1 -0
  197. package/dist/persistence/persistence.d.ts +24 -0
  198. package/dist/persistence/persistence.d.ts.map +1 -0
  199. package/dist/persistence/persistence.js +2 -0
  200. package/dist/persistence/persistence.js.map +1 -0
  201. package/dist/persistence/store.d.ts +13 -0
  202. package/dist/persistence/store.d.ts.map +1 -0
  203. package/dist/persistence/store.js +2 -0
  204. package/dist/persistence/store.js.map +1 -0
  205. package/dist/server/context.d.ts +45 -0
  206. package/dist/server/context.d.ts.map +1 -0
  207. package/dist/server/context.js +101 -0
  208. package/dist/server/context.js.map +1 -0
  209. package/dist/server/deps.d.ts +10 -0
  210. package/dist/server/deps.d.ts.map +1 -0
  211. package/dist/server/deps.js +6 -0
  212. package/dist/server/deps.js.map +1 -0
  213. package/dist/server/handlers/handleConnect.d.ts +9 -0
  214. package/dist/server/handlers/handleConnect.d.ts.map +1 -0
  215. package/dist/server/handlers/handleConnect.js +81 -0
  216. package/dist/server/handlers/handleConnect.js.map +1 -0
  217. package/dist/server/handlers/handleDisconnect.d.ts +8 -0
  218. package/dist/server/handlers/handleDisconnect.d.ts.map +1 -0
  219. package/dist/server/handlers/handleDisconnect.js +10 -0
  220. package/dist/server/handlers/handleDisconnect.js.map +1 -0
  221. package/dist/server/handlers/handlePacket.d.ts +11 -0
  222. package/dist/server/handlers/handlePacket.d.ts.map +1 -0
  223. package/dist/server/handlers/handlePacket.js +66 -0
  224. package/dist/server/handlers/handlePacket.js.map +1 -0
  225. package/dist/server/handlers/handlePingreq.d.ts +8 -0
  226. package/dist/server/handlers/handlePingreq.d.ts.map +1 -0
  227. package/dist/server/handlers/handlePingreq.js +12 -0
  228. package/dist/server/handlers/handlePingreq.js.map +1 -0
  229. package/dist/server/handlers/handlePuback.d.ts +13 -0
  230. package/dist/server/handlers/handlePuback.d.ts.map +1 -0
  231. package/dist/server/handlers/handlePuback.js +17 -0
  232. package/dist/server/handlers/handlePuback.js.map +1 -0
  233. package/dist/server/handlers/handlePubcomp.d.ts +12 -0
  234. package/dist/server/handlers/handlePubcomp.d.ts.map +1 -0
  235. package/dist/server/handlers/handlePubcomp.js +15 -0
  236. package/dist/server/handlers/handlePubcomp.js.map +1 -0
  237. package/dist/server/handlers/handlePublish.d.ts +11 -0
  238. package/dist/server/handlers/handlePublish.d.ts.map +1 -0
  239. package/dist/server/handlers/handlePublish.js +55 -0
  240. package/dist/server/handlers/handlePublish.js.map +1 -0
  241. package/dist/server/handlers/handlePubrec.d.ts +15 -0
  242. package/dist/server/handlers/handlePubrec.d.ts.map +1 -0
  243. package/dist/server/handlers/handlePubrec.js +24 -0
  244. package/dist/server/handlers/handlePubrec.js.map +1 -0
  245. package/dist/server/handlers/handlePubrel.d.ts +16 -0
  246. package/dist/server/handlers/handlePubrel.d.ts.map +1 -0
  247. package/dist/server/handlers/handlePubrel.js +28 -0
  248. package/dist/server/handlers/handlePubrel.js.map +1 -0
  249. package/dist/server/handlers/handleSubscribe.d.ts +13 -0
  250. package/dist/server/handlers/handleSubscribe.d.ts.map +1 -0
  251. package/dist/server/handlers/handleSubscribe.js +57 -0
  252. package/dist/server/handlers/handleSubscribe.js.map +1 -0
  253. package/dist/server/handlers/handleUnsubscribe.d.ts +10 -0
  254. package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -0
  255. package/dist/server/handlers/handleUnsubscribe.js +19 -0
  256. package/dist/server/handlers/handleUnsubscribe.js.map +1 -0
  257. package/dist/server/mod.d.ts +11 -0
  258. package/dist/server/mod.d.ts.map +1 -0
  259. package/dist/server/mod.js +8 -0
  260. package/dist/server/mod.js.map +1 -0
  261. package/dist/server/server.d.ts +27 -0
  262. package/dist/server/server.d.ts.map +1 -0
  263. package/dist/server/server.js +48 -0
  264. package/dist/server/server.js.map +1 -0
  265. package/dist/socket/socket.d.ts +29 -0
  266. package/dist/socket/socket.d.ts.map +1 -0
  267. package/dist/socket/socket.js +37 -0
  268. package/dist/socket/socket.js.map +1 -0
  269. package/dist/timer/timer.d.ts +13 -0
  270. package/dist/timer/timer.d.ts.map +1 -0
  271. package/dist/timer/timer.js +41 -0
  272. package/dist/timer/timer.js.map +1 -0
  273. package/dist/trie/trie.d.ts +21 -0
  274. package/dist/trie/trie.d.ts.map +1 -0
  275. package/dist/trie/trie.js +96 -0
  276. package/dist/trie/trie.js.map +1 -0
  277. package/dist/utils/args.d.ts +28 -0
  278. package/dist/utils/args.d.ts.map +1 -0
  279. package/dist/utils/args.js +76 -0
  280. package/dist/utils/args.js.map +1 -0
  281. package/dist/utils/assert.d.ts +10 -0
  282. package/dist/utils/assert.d.ts.map +1 -0
  283. package/dist/utils/assert.js +21 -0
  284. package/dist/utils/assert.js.map +1 -0
  285. package/dist/utils/asyncQueue.d.ts +28 -0
  286. package/dist/utils/asyncQueue.d.ts.map +1 -0
  287. package/dist/utils/asyncQueue.js +70 -0
  288. package/dist/utils/asyncQueue.js.map +1 -0
  289. package/dist/utils/deferred.d.ts +10 -0
  290. package/dist/utils/deferred.d.ts.map +1 -0
  291. package/dist/utils/deferred.js +15 -0
  292. package/dist/utils/deferred.js.map +1 -0
  293. package/dist/utils/logger.d.ts +63 -0
  294. package/dist/utils/logger.d.ts.map +1 -0
  295. package/dist/utils/logger.js +59 -0
  296. package/dist/utils/logger.js.map +1 -0
  297. package/dist/utils/mod.d.ts +13 -0
  298. package/dist/utils/mod.d.ts.map +1 -0
  299. package/dist/utils/mod.js +12 -0
  300. package/dist/utils/mod.js.map +1 -0
  301. package/dist/utils/nextTick.d.ts +17 -0
  302. package/dist/utils/nextTick.d.ts.map +1 -0
  303. package/dist/utils/nextTick.js +19 -0
  304. package/dist/utils/nextTick.js.map +1 -0
  305. package/dist/utils/platform.d.ts +5 -0
  306. package/dist/utils/platform.d.ts.map +1 -0
  307. package/dist/utils/platform.js +8 -0
  308. package/dist/utils/platform.js.map +1 -0
  309. package/package.json +2 -3
@@ -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"}
@@ -0,0 +1,94 @@
1
+ import { type ConnectPacket, type PublishPacket, type SockConn, type SubscribePacket, type TAuthenticationResult } from "./deps.ts";
2
+ type ConnectOptions = Omit<ConnectPacket, "type" | "protocolName" | "protocolLevel">;
3
+ /** ConnectParameters define how to connect */
4
+ export type ConnectParameters = {
5
+ url?: URL;
6
+ caCerts?: string[];
7
+ cert?: string;
8
+ key?: string;
9
+ numberOfRetries?: number;
10
+ options?: ConnectOptions;
11
+ };
12
+ /** PublishParameters define how a message should be published */
13
+ export type PublishParameters = Omit<PublishPacket, "type" | "id">;
14
+ /** SubscribeParameters define how to subscribe to a topic */
15
+ export type SubscribeParameters = Omit<SubscribePacket, "type" | "id">;
16
+ /** the default MQTT URL to connect to */
17
+ export declare const DEFAULT_URL = "mqtt://localhost:1883/";
18
+ /**
19
+ * The Client class provides an MQTT Client that can be used to connect to
20
+ * a MQTT broker and publish/subscribe messages.
21
+ *
22
+ * The Client class is not meant to be used directly, but
23
+ * instead should be subclassed and the subclass should
24
+ * override the createConn() method to provide a
25
+ * connection type that is supported by the subclass.
26
+ */
27
+ export declare class Client {
28
+ protected clientIdPrefix: string;
29
+ protected numberOfRetries: number;
30
+ protected url: URL;
31
+ protected keepAlive: number;
32
+ protected autoReconnect: boolean;
33
+ private caCerts?;
34
+ private cert?;
35
+ private key?;
36
+ private clientId;
37
+ private ctx;
38
+ private connectPacket?;
39
+ /**
40
+ * Creates a new MQTT client instance
41
+ */
42
+ constructor();
43
+ /**
44
+ * Creates a new connection to the MQTT broker
45
+ * @param protocol - The protocol to use (mqtt, mqtts, etc)
46
+ * @param _hostname - The hostname to connect to
47
+ * @param _port - The port to connect to
48
+ * @param _caCerts - Optional CA certificates
49
+ * @param _cert - Optional client certificate
50
+ * @param _key - Optional client key
51
+ * @returns Promise resolving to a SockConn connection
52
+ */
53
+ protected createConn(protocol: string, _hostname: string, _port?: number, _caCerts?: string[], _cert?: string, _key?: string): Promise<SockConn>;
54
+ /**
55
+ * Handles the connection process including retries and reconnection
56
+ * @returns Promise that resolves when connection is established or fails
57
+ */
58
+ private doConnect;
59
+ /**
60
+ * Connects to the MQTT broker
61
+ * @param params - Connection parameters
62
+ * @returns Promise resolving to authentication result
63
+ */
64
+ connect(params?: ConnectParameters): Promise<TAuthenticationResult>;
65
+ /**
66
+ * Disconnects from the MQTT broker
67
+ * @returns Promise that resolves when disconnected
68
+ */
69
+ disconnect(): Promise<void>;
70
+ /**
71
+ * Publishes a message to the MQTT broker
72
+ * @param params - Publish parameters including topic and payload
73
+ * @returns Promise that resolves when published
74
+ */
75
+ publish(params: PublishParameters): Promise<void>;
76
+ /**
77
+ * Subscribes to topics on the MQTT broker
78
+ * @param params - Subscribe parameters including topics
79
+ * @returns Promise that resolves when subscribed
80
+ */
81
+ subscribe(params: SubscribeParameters): Promise<void>;
82
+ /**
83
+ * Gets an async iterator for received messages
84
+ * @returns AsyncGenerator yielding received publish packets
85
+ */
86
+ messages(): AsyncGenerator<PublishPacket, void, unknown>;
87
+ /**
88
+ * Closes the message stream
89
+ * @param reason - Optional reason for closing
90
+ */
91
+ closeMessages(reason?: string): void;
92
+ }
93
+ export {};
94
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAKlB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,WAAW,CAAC;AAanB,KAAK,cAAc,GAAG,IAAI,CACxB,aAAa,EACb,MAAM,GAAG,cAAc,GAAG,eAAe,CAC1C,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AACnE,6DAA6D;AAC7D,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAqBvE,0CAA0C;AAC1C,eAAO,MAAM,WAAW,2BAA2B,CAAC;AAKpD;;;;;;;;GAQG;AACH,qBAAa,MAAM;IACjB,SAAS,CAAC,cAAc,SAAmB;IAC3C,SAAS,CAAC,eAAe,SAAmB;IAC5C,SAAS,CAAC,GAAG,EAAE,GAAG,CAAwB;IAC1C,SAAS,CAAC,SAAS,SAAqB;IACxC,SAAS,CAAC,aAAa,UAAQ;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAW;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,GAAG,CAAC,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,GAAG,CAAkC;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAgB;IAEtC;;OAEG;;IAMH;;;;;;;;;OASG;IACH,SAAS,CAAC,UAAU,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC;IAMpB;;;OAGG;YACW,SAAS;IA6CvB;;;;OAIG;IACH,OAAO,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAuBvE;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D;;;OAGG;IACI,QAAQ,IAAI,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,OAAO,CAAC;IAI/D;;;OAGG;IACH,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM;CAG9B"}