@seriousme/opifex 1.9.4 → 1.11.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 (331) hide show
  1. package/README.md +37 -26
  2. package/bin/conformanceServer.ts +3 -2
  3. package/bin/demoServer.ts +3 -2
  4. package/bin/mqtt.ts +127 -118
  5. package/client/client.ts +61 -21
  6. package/client/context.ts +71 -30
  7. package/client/deps.ts +5 -0
  8. package/client/handlers/handleConnack.ts +17 -5
  9. package/client/handlers/handlePublish.ts +4 -1
  10. package/client/handlers/handlePubrec.ts +3 -1
  11. package/client/handlers/handlePubrel.ts +3 -1
  12. package/client/handlers/handleSuback.ts +3 -1
  13. package/client/mod.ts +8 -1
  14. package/client/store/memoryStore.ts +2 -1
  15. package/deno/tcpClient.ts +1 -1
  16. package/dev_utils/dummyConn.ts +17 -2
  17. package/dist/bin/conformanceServer.js +3 -2
  18. package/dist/bin/conformanceServer.js.map +1 -1
  19. package/dist/bin/demoServer.js +3 -2
  20. package/dist/bin/demoServer.js.map +1 -1
  21. package/dist/bin/mqtt.d.ts +29 -0
  22. package/dist/bin/mqtt.d.ts.map +1 -1
  23. package/dist/bin/mqtt.js +102 -97
  24. package/dist/bin/mqtt.js.map +1 -1
  25. package/dist/client/client.d.ts +16 -5
  26. package/dist/client/client.d.ts.map +1 -1
  27. package/dist/client/client.js +36 -15
  28. package/dist/client/client.js.map +1 -1
  29. package/dist/client/context.d.ts +8 -3
  30. package/dist/client/context.d.ts.map +1 -1
  31. package/dist/client/context.js +51 -21
  32. package/dist/client/context.js.map +1 -1
  33. package/dist/client/deps.d.ts +3 -2
  34. package/dist/client/deps.d.ts.map +1 -1
  35. package/dist/client/deps.js +2 -1
  36. package/dist/client/deps.js.map +1 -1
  37. package/dist/client/handlers/handleConnack.d.ts +1 -1
  38. package/dist/client/handlers/handleConnack.d.ts.map +1 -1
  39. package/dist/client/handlers/handleConnack.js +14 -5
  40. package/dist/client/handlers/handleConnack.js.map +1 -1
  41. package/dist/client/handlers/handlePublish.d.ts +1 -1
  42. package/dist/client/handlers/handlePublish.d.ts.map +1 -1
  43. package/dist/client/handlers/handlePublish.js +2 -0
  44. package/dist/client/handlers/handlePublish.js.map +1 -1
  45. package/dist/client/handlers/handlePubrec.d.ts +1 -1
  46. package/dist/client/handlers/handlePubrec.d.ts.map +1 -1
  47. package/dist/client/handlers/handlePubrec.js +1 -0
  48. package/dist/client/handlers/handlePubrec.js.map +1 -1
  49. package/dist/client/handlers/handlePubrel.d.ts +1 -1
  50. package/dist/client/handlers/handlePubrel.d.ts.map +1 -1
  51. package/dist/client/handlers/handlePubrel.js +1 -0
  52. package/dist/client/handlers/handlePubrel.js.map +1 -1
  53. package/dist/client/handlers/handleSuback.d.ts.map +1 -1
  54. package/dist/client/handlers/handleSuback.js +3 -1
  55. package/dist/client/handlers/handleSuback.js.map +1 -1
  56. package/dist/client/mod.d.ts +3 -1
  57. package/dist/client/mod.d.ts.map +1 -1
  58. package/dist/client/mod.js +2 -1
  59. package/dist/client/mod.js.map +1 -1
  60. package/dist/client/store/memoryStore.d.ts +1 -1
  61. package/dist/client/store/memoryStore.d.ts.map +1 -1
  62. package/dist/client/store/memoryStore.js.map +1 -1
  63. package/dist/mqttConn/mqttConn.d.ts +13 -8
  64. package/dist/mqttConn/mqttConn.d.ts.map +1 -1
  65. package/dist/mqttConn/mqttConn.js +27 -12
  66. package/dist/mqttConn/mqttConn.js.map +1 -1
  67. package/dist/mqttPacket/PacketType.d.ts +1 -0
  68. package/dist/mqttPacket/PacketType.d.ts.map +1 -1
  69. package/dist/mqttPacket/PacketType.js +1 -0
  70. package/dist/mqttPacket/PacketType.js.map +1 -1
  71. package/dist/mqttPacket/Properties.d.ts +157 -0
  72. package/dist/mqttPacket/Properties.d.ts.map +1 -0
  73. package/dist/mqttPacket/Properties.js +177 -0
  74. package/dist/mqttPacket/Properties.js.map +1 -0
  75. package/dist/mqttPacket/ReasonCode.d.ts +74 -0
  76. package/dist/mqttPacket/ReasonCode.d.ts.map +1 -0
  77. package/dist/mqttPacket/ReasonCode.js +230 -0
  78. package/dist/mqttPacket/ReasonCode.js.map +1 -0
  79. package/dist/mqttPacket/RetainHandling.d.ts +12 -0
  80. package/dist/mqttPacket/RetainHandling.d.ts.map +1 -0
  81. package/dist/mqttPacket/RetainHandling.js +12 -0
  82. package/dist/mqttPacket/RetainHandling.js.map +1 -0
  83. package/dist/mqttPacket/auth.d.ts +21 -0
  84. package/dist/mqttPacket/auth.d.ts.map +1 -0
  85. package/dist/mqttPacket/auth.js +34 -0
  86. package/dist/mqttPacket/auth.js.map +1 -0
  87. package/dist/mqttPacket/connack.d.ts +19 -11
  88. package/dist/mqttPacket/connack.d.ts.map +1 -1
  89. package/dist/mqttPacket/connack.js +43 -15
  90. package/dist/mqttPacket/connack.js.map +1 -1
  91. package/dist/mqttPacket/connect.d.ts +30 -11
  92. package/dist/mqttPacket/connect.d.ts.map +1 -1
  93. package/dist/mqttPacket/connect.js +106 -30
  94. package/dist/mqttPacket/connect.js.map +1 -1
  95. package/dist/mqttPacket/decoder.d.ts +42 -3
  96. package/dist/mqttPacket/decoder.d.ts.map +1 -1
  97. package/dist/mqttPacket/decoder.js +135 -4
  98. package/dist/mqttPacket/decoder.js.map +1 -1
  99. package/dist/mqttPacket/disconnect.d.ts +15 -9
  100. package/dist/mqttPacket/disconnect.d.ts.map +1 -1
  101. package/dist/mqttPacket/disconnect.js +45 -6
  102. package/dist/mqttPacket/disconnect.js.map +1 -1
  103. package/dist/mqttPacket/encoder.d.ts +57 -8
  104. package/dist/mqttPacket/encoder.d.ts.map +1 -1
  105. package/dist/mqttPacket/encoder.js +185 -13
  106. package/dist/mqttPacket/encoder.js.map +1 -1
  107. package/dist/mqttPacket/length.d.ts.map +1 -1
  108. package/dist/mqttPacket/length.js +3 -2
  109. package/dist/mqttPacket/length.js.map +1 -1
  110. package/dist/mqttPacket/mod.d.ts +57 -91
  111. package/dist/mqttPacket/mod.d.ts.map +1 -1
  112. package/dist/mqttPacket/mod.js +23 -29
  113. package/dist/mqttPacket/mod.js.map +1 -1
  114. package/dist/mqttPacket/pingreq.d.ts +4 -6
  115. package/dist/mqttPacket/pingreq.d.ts.map +1 -1
  116. package/dist/mqttPacket/pingreq.js +5 -4
  117. package/dist/mqttPacket/pingreq.js.map +1 -1
  118. package/dist/mqttPacket/pingres.d.ts +4 -6
  119. package/dist/mqttPacket/pingres.d.ts.map +1 -1
  120. package/dist/mqttPacket/pingres.js +7 -5
  121. package/dist/mqttPacket/pingres.js.map +1 -1
  122. package/dist/mqttPacket/protocolLevels.d.ts +12 -0
  123. package/dist/mqttPacket/protocolLevels.d.ts.map +1 -0
  124. package/dist/mqttPacket/protocolLevels.js +11 -0
  125. package/dist/mqttPacket/protocolLevels.js.map +1 -0
  126. package/dist/mqttPacket/pubblishAcks.d.ts +42 -0
  127. package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -0
  128. package/dist/mqttPacket/pubblishAcks.js +56 -0
  129. package/dist/mqttPacket/pubblishAcks.js.map +1 -0
  130. package/dist/mqttPacket/publish.d.ts +19 -8
  131. package/dist/mqttPacket/publish.d.ts.map +1 -1
  132. package/dist/mqttPacket/publish.js +26 -7
  133. package/dist/mqttPacket/publish.js.map +1 -1
  134. package/dist/mqttPacket/suback.d.ts +18 -11
  135. package/dist/mqttPacket/suback.d.ts.map +1 -1
  136. package/dist/mqttPacket/suback.js +41 -20
  137. package/dist/mqttPacket/suback.js.map +1 -1
  138. package/dist/mqttPacket/subscribe.d.ts +27 -12
  139. package/dist/mqttPacket/subscribe.d.ts.map +1 -1
  140. package/dist/mqttPacket/subscribe.js +71 -15
  141. package/dist/mqttPacket/subscribe.js.map +1 -1
  142. package/dist/mqttPacket/types.d.ts +36 -0
  143. package/dist/mqttPacket/types.d.ts.map +1 -1
  144. package/dist/mqttPacket/unsuback.d.ts +17 -10
  145. package/dist/mqttPacket/unsuback.d.ts.map +1 -1
  146. package/dist/mqttPacket/unsuback.js +29 -6
  147. package/dist/mqttPacket/unsuback.js.map +1 -1
  148. package/dist/mqttPacket/unsubscribe.d.ts +17 -10
  149. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
  150. package/dist/mqttPacket/unsubscribe.js +24 -8
  151. package/dist/mqttPacket/unsubscribe.js.map +1 -1
  152. package/dist/mqttPacket/validators.d.ts +15 -0
  153. package/dist/mqttPacket/validators.d.ts.map +1 -1
  154. package/dist/mqttPacket/validators.js +15 -0
  155. package/dist/mqttPacket/validators.js.map +1 -1
  156. package/dist/node/tcpClient.js +1 -1
  157. package/dist/node/tcpClient.js.map +1 -1
  158. package/dist/node/wrapNodeSocket.d.ts.map +1 -1
  159. package/dist/node/wrapNodeSocket.js.map +1 -1
  160. package/dist/persistence/deps.d.ts +1 -1
  161. package/dist/persistence/deps.d.ts.map +1 -1
  162. package/dist/persistence/deps.js +1 -1
  163. package/dist/persistence/deps.js.map +1 -1
  164. package/dist/persistence/memory/memoryPersistence.js +1 -1
  165. package/dist/persistence/memory/memoryPersistence.js.map +1 -1
  166. package/dist/server/context.d.ts +3 -1
  167. package/dist/server/context.d.ts.map +1 -1
  168. package/dist/server/context.js +8 -2
  169. package/dist/server/context.js.map +1 -1
  170. package/dist/server/deps.d.ts +2 -2
  171. package/dist/server/deps.d.ts.map +1 -1
  172. package/dist/server/deps.js +1 -1
  173. package/dist/server/deps.js.map +1 -1
  174. package/dist/server/handlers/handleConnect.d.ts +1 -1
  175. package/dist/server/handlers/handleConnect.d.ts.map +1 -1
  176. package/dist/server/handlers/handleConnect.js +9 -1
  177. package/dist/server/handlers/handleConnect.js.map +1 -1
  178. package/dist/server/handlers/handlePacket.d.ts +1 -1
  179. package/dist/server/handlers/handlePacket.d.ts.map +1 -1
  180. package/dist/server/handlers/handlePacket.js +1 -1
  181. package/dist/server/handlers/handlePacket.js.map +1 -1
  182. package/dist/server/handlers/handlePingreq.d.ts.map +1 -1
  183. package/dist/server/handlers/handlePingreq.js +1 -0
  184. package/dist/server/handlers/handlePingreq.js.map +1 -1
  185. package/dist/server/handlers/handlePublish.d.ts +2 -2
  186. package/dist/server/handlers/handlePublish.d.ts.map +1 -1
  187. package/dist/server/handlers/handlePublish.js +2 -0
  188. package/dist/server/handlers/handlePublish.js.map +1 -1
  189. package/dist/server/handlers/handlePubrec.d.ts +1 -1
  190. package/dist/server/handlers/handlePubrec.d.ts.map +1 -1
  191. package/dist/server/handlers/handlePubrec.js +1 -0
  192. package/dist/server/handlers/handlePubrec.js.map +1 -1
  193. package/dist/server/handlers/handlePubrel.d.ts +1 -1
  194. package/dist/server/handlers/handlePubrel.d.ts.map +1 -1
  195. package/dist/server/handlers/handlePubrel.js +1 -0
  196. package/dist/server/handlers/handlePubrel.js.map +1 -1
  197. package/dist/server/handlers/handleSubscribe.d.ts +1 -1
  198. package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
  199. package/dist/server/handlers/handleSubscribe.js +2 -1
  200. package/dist/server/handlers/handleSubscribe.js.map +1 -1
  201. package/dist/server/handlers/handleUnsubscribe.d.ts +1 -1
  202. package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
  203. package/dist/server/handlers/handleUnsubscribe.js +1 -0
  204. package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
  205. package/dist/server/server.d.ts +2 -2
  206. package/dist/server/server.d.ts.map +1 -1
  207. package/dist/server/server.js +5 -3
  208. package/dist/server/server.js.map +1 -1
  209. package/dist/socket/socket.d.ts.map +1 -1
  210. package/dist/socket/socket.js +6 -1
  211. package/dist/socket/socket.js.map +1 -1
  212. package/dist/utils/assert.d.ts +0 -3
  213. package/dist/utils/assert.d.ts.map +1 -1
  214. package/dist/utils/assert.js +0 -7
  215. package/dist/utils/assert.js.map +1 -1
  216. package/dist/utils/asyncQueue.d.ts +1 -3
  217. package/dist/utils/asyncQueue.d.ts.map +1 -1
  218. package/dist/utils/asyncQueue.js +16 -21
  219. package/dist/utils/asyncQueue.js.map +1 -1
  220. package/dist/utils/logger.d.ts +5 -15
  221. package/dist/utils/logger.d.ts.map +1 -1
  222. package/dist/utils/logger.js +7 -8
  223. package/dist/utils/logger.js.map +1 -1
  224. package/dist/utils/mod.d.ts +0 -3
  225. package/dist/utils/mod.d.ts.map +1 -1
  226. package/dist/utils/mod.js +0 -2
  227. package/dist/utils/mod.js.map +1 -1
  228. package/dist/utils/utils.d.ts +2 -0
  229. package/dist/utils/utils.d.ts.map +1 -0
  230. package/dist/utils/utils.js +6 -0
  231. package/dist/utils/utils.js.map +1 -0
  232. package/mqttConn/mqttConn.test.ts +27 -12
  233. package/mqttConn/mqttConn.ts +45 -14
  234. package/mqttPacket/PacketType.ts +1 -0
  235. package/mqttPacket/Properties.ts +276 -0
  236. package/mqttPacket/ReasonCode.test.ts +22 -0
  237. package/mqttPacket/ReasonCode.ts +256 -0
  238. package/mqttPacket/RetainHandling.ts +11 -0
  239. package/mqttPacket/auth.test.ts +112 -0
  240. package/mqttPacket/auth.ts +71 -0
  241. package/mqttPacket/connack.test.ts +84 -64
  242. package/mqttPacket/connack.ts +88 -24
  243. package/mqttPacket/connect.test.ts +497 -18
  244. package/mqttPacket/connect.ts +170 -39
  245. package/mqttPacket/decoder.test.ts +33 -16
  246. package/mqttPacket/decoder.ts +173 -5
  247. package/mqttPacket/disconnect.test.ts +97 -18
  248. package/mqttPacket/disconnect.ts +84 -12
  249. package/mqttPacket/encoder.test.ts +32 -8
  250. package/mqttPacket/encoder.ts +236 -11
  251. package/mqttPacket/length.ts +3 -2
  252. package/mqttPacket/mod.ts +76 -39
  253. package/mqttPacket/pingreq.test.ts +52 -4
  254. package/mqttPacket/pingreq.ts +20 -7
  255. package/mqttPacket/pingres.test.ts +52 -4
  256. package/mqttPacket/pingres.ts +22 -8
  257. package/mqttPacket/properties.test.ts +193 -0
  258. package/mqttPacket/protocolLevels.ts +13 -0
  259. package/mqttPacket/pubblishAcks.ts +123 -0
  260. package/mqttPacket/publish.test.ts +212 -133
  261. package/mqttPacket/publish.ts +69 -14
  262. package/mqttPacket/publishAcks.test.ts +128 -0
  263. package/mqttPacket/suback.test.ts +71 -27
  264. package/mqttPacket/suback.ts +82 -30
  265. package/mqttPacket/subscribe.test.ts +132 -43
  266. package/mqttPacket/subscribe.ts +128 -25
  267. package/mqttPacket/types.ts +43 -0
  268. package/mqttPacket/unsuback.test.ts +80 -30
  269. package/mqttPacket/unsuback.ts +68 -13
  270. package/mqttPacket/unsubscribe.test.ts +59 -34
  271. package/mqttPacket/unsubscribe.ts +64 -17
  272. package/mqttPacket/validators.ts +15 -0
  273. package/node/tcpClient.ts +1 -1
  274. package/node/wrapNodeSocket.ts +2 -1
  275. package/package.json +2 -2
  276. package/persistence/deps.ts +1 -1
  277. package/persistence/memory/memoryPersistence.test.ts +5 -1
  278. package/persistence/memory/memoryPersistence.ts +1 -1
  279. package/server/context.ts +23 -10
  280. package/server/deps.ts +2 -0
  281. package/server/handlers/handleConnect.ts +12 -9
  282. package/server/handlers/handlePacket.ts +10 -11
  283. package/server/handlers/handlePingreq.ts +1 -0
  284. package/server/handlers/handlePublish.ts +6 -2
  285. package/server/handlers/handlePubrec.ts +3 -1
  286. package/server/handlers/handlePubrel.ts +3 -1
  287. package/server/handlers/handleSubscribe.ts +3 -6
  288. package/server/handlers/handleUnsubscribe.ts +3 -1
  289. package/server/server.ts +8 -12
  290. package/server/test/handleConnect.test.ts +2 -1
  291. package/server/test/test-handlers.ts +2 -1
  292. package/socket/socket.ts +5 -1
  293. package/utils/assert.ts +0 -18
  294. package/utils/asyncQueue.ts +17 -21
  295. package/utils/logger.ts +12 -11
  296. package/utils/mod.ts +0 -3
  297. package/utils/utils.ts +6 -0
  298. package/dist/mqttPacket/puback.d.ts +0 -16
  299. package/dist/mqttPacket/puback.d.ts.map +0 -1
  300. package/dist/mqttPacket/puback.js +0 -21
  301. package/dist/mqttPacket/puback.js.map +0 -1
  302. package/dist/mqttPacket/pubcomp.d.ts +0 -17
  303. package/dist/mqttPacket/pubcomp.d.ts.map +0 -1
  304. package/dist/mqttPacket/pubcomp.js +0 -21
  305. package/dist/mqttPacket/pubcomp.js.map +0 -1
  306. package/dist/mqttPacket/pubrec.d.ts +0 -17
  307. package/dist/mqttPacket/pubrec.d.ts.map +0 -1
  308. package/dist/mqttPacket/pubrec.js +0 -21
  309. package/dist/mqttPacket/pubrec.js.map +0 -1
  310. package/dist/mqttPacket/pubrel.d.ts +0 -17
  311. package/dist/mqttPacket/pubrel.d.ts.map +0 -1
  312. package/dist/mqttPacket/pubrel.js +0 -21
  313. package/dist/mqttPacket/pubrel.js.map +0 -1
  314. package/dist/utils/args.d.ts +0 -28
  315. package/dist/utils/args.d.ts.map +0 -1
  316. package/dist/utils/args.js +0 -76
  317. package/dist/utils/args.js.map +0 -1
  318. package/dist/utils/platform.d.ts +0 -5
  319. package/dist/utils/platform.d.ts.map +0 -1
  320. package/dist/utils/platform.js +0 -8
  321. package/dist/utils/platform.js.map +0 -1
  322. package/mqttPacket/puback.test.ts +0 -55
  323. package/mqttPacket/puback.ts +0 -34
  324. package/mqttPacket/pubcomp.test.ts +0 -55
  325. package/mqttPacket/pubcomp.ts +0 -35
  326. package/mqttPacket/pubrec.test.ts +0 -55
  327. package/mqttPacket/pubrec.ts +0 -35
  328. package/mqttPacket/pubrel.test.ts +0 -55
  329. package/mqttPacket/pubrel.ts +0 -35
  330. package/utils/args.ts +0 -103
  331. package/utils/platform.ts +0 -8
@@ -1,15 +1,30 @@
1
1
  import { PacketType } from "./PacketType.ts";
2
2
  import assert from "node:assert/strict";
3
3
  import { test } from "node:test";
4
+ import { decode, encode, MQTTLevel } from "./mod.ts";
5
+ import type { CodecOpts } from "./mod.ts";
4
6
 
5
- import { type ConnectPacket, decode, encode } from "./mod.ts";
7
+ const codecOptsV4: CodecOpts = {
8
+ protocolLevel: MQTTLevel.v4,
9
+ maxIncomingPacketSize: 0xffff,
10
+ maxOutgoingPacketSize: 0xffff,
11
+ };
12
+
13
+ const codecOptsUnknown: CodecOpts = {
14
+ protocolLevel: MQTTLevel.unknown,
15
+ maxIncomingPacketSize: 0xffff,
16
+ maxOutgoingPacketSize: 0xffff,
17
+ };
18
+
19
+ import type { ConnectPacket } from "./mod.ts";
6
20
 
7
21
  test("encode Connect with ClientId", () => {
8
22
  assert.deepStrictEqual(
9
23
  encode({
10
24
  type: PacketType.connect,
25
+ protocolLevel: MQTTLevel.v4,
11
26
  clientId: "id",
12
- }),
27
+ }, codecOptsUnknown),
13
28
  Uint8Array.from([
14
29
  // fixedHeader
15
30
  16, // packetType + flags
@@ -39,9 +54,10 @@ test("encode Connect with Clean false", () => {
39
54
  assert.deepStrictEqual(
40
55
  encode({
41
56
  type: PacketType.connect,
57
+ protocolLevel: MQTTLevel.v4,
42
58
  clientId: "id",
43
59
  clean: false,
44
- }),
60
+ }, codecOptsUnknown),
45
61
  Uint8Array.from([
46
62
  // fixedHeader
47
63
  16, // packetType + flags
@@ -71,9 +87,10 @@ test("encode Connect with KeepAlive", () => {
71
87
  assert.deepStrictEqual(
72
88
  encode({
73
89
  type: PacketType.connect,
90
+ protocolLevel: MQTTLevel.v4,
74
91
  clientId: "id",
75
92
  keepAlive: 300,
76
- }),
93
+ }, codecOptsV4),
77
94
  Uint8Array.from([
78
95
  // fixedHeader
79
96
  16, // packetType + flags
@@ -140,7 +157,7 @@ const decodedConnect: ConnectPacket = {
140
157
  type: PacketType.connect,
141
158
  clientId: "id",
142
159
  protocolName: "MQTT",
143
- protocolLevel: 4,
160
+ protocolLevel: MQTTLevel.v4,
144
161
  username: "user",
145
162
  password: Uint8Array.from([
146
163
  112, // 'p'
@@ -157,6 +174,7 @@ test("encode Connect with username and password", () => {
157
174
  assert.deepStrictEqual(
158
175
  encode({
159
176
  type: PacketType.connect,
177
+ protocolLevel: MQTTLevel.v4,
160
178
  clientId: "id",
161
179
  username: "user",
162
180
  password: Uint8Array.from([
@@ -165,14 +183,108 @@ test("encode Connect with username and password", () => {
165
183
  115, // 's'
166
184
  115, // 's'
167
185
  ]),
168
- }),
186
+ }, codecOptsV4),
169
187
  Uint8Array.from(encodedConnect),
170
188
  );
171
189
  });
172
190
 
191
+ test("encode/decode short Connect V5 with defaults and bridgeMode", () => {
192
+ const packet = {
193
+ type: PacketType.connect,
194
+ protocolLevel: MQTTLevel.v5,
195
+ bridgeMode: true,
196
+ };
197
+ const encoded = encode(packet, codecOptsUnknown);
198
+ assert.deepStrictEqual(
199
+ encoded,
200
+ Uint8Array.from([
201
+ // fixedHeader
202
+ 16, // packetType + flags
203
+ 13, // remainingLength
204
+ // variableHeader
205
+ 0, // protocolNameLength MSB
206
+ 4, // protocolNameLength LSB
207
+ 77, // 'M'
208
+ 81, // 'Q'
209
+ 84, // 'T'
210
+ 84, // 'T'
211
+ 133, // protocolLevel
212
+ 2, // connectFlags (cleanSession)
213
+ 0, // keepAlive MSB
214
+ 0, // keepAlive LSB
215
+ // payload
216
+ // clientId
217
+ 0, // length MSB
218
+ 0, // length LSB
219
+ 0, // properties length
220
+ ]),
221
+ );
222
+ const decoded = decode(encoded, codecOptsUnknown);
223
+ const expected = {
224
+ clean: true,
225
+ clientId: "",
226
+ keepAlive: 0,
227
+ password: undefined,
228
+ properties: {},
229
+ protocolLevel: MQTTLevel.v5,
230
+ protocolName: "MQTT",
231
+ type: PacketType.connect,
232
+ username: undefined,
233
+ will: undefined,
234
+ bridgeMode: true,
235
+ };
236
+ assert.deepStrictEqual(decoded, expected);
237
+ });
238
+
239
+ test("encode/decode short Connect V5 with defaults", () => {
240
+ const packet = {
241
+ type: PacketType.connect,
242
+ protocolLevel: MQTTLevel.v5,
243
+ };
244
+ const encoded = encode(packet, codecOptsUnknown);
245
+ assert.deepStrictEqual(
246
+ encoded,
247
+ Uint8Array.from([
248
+ // fixedHeader
249
+ 16, // packetType + flags
250
+ 13, // remainingLength
251
+ // variableHeader
252
+ 0, // protocolNameLength MSB
253
+ 4, // protocolNameLength LSB
254
+ 77, // 'M'
255
+ 81, // 'Q'
256
+ 84, // 'T'
257
+ 84, // 'T'
258
+ 5, // protocolLevel
259
+ 2, // connectFlags (cleanSession)
260
+ 0, // keepAlive MSB
261
+ 0, // keepAlive LSB
262
+ // payload
263
+ // clientId
264
+ 0, // length MSB
265
+ 0, // length LSB
266
+ 0, // properties length
267
+ ]),
268
+ );
269
+ const decoded = decode(encoded, codecOptsUnknown);
270
+ const expected = {
271
+ clean: true,
272
+ clientId: "",
273
+ keepAlive: 0,
274
+ password: undefined,
275
+ properties: {},
276
+ protocolLevel: MQTTLevel.v5,
277
+ protocolName: "MQTT",
278
+ type: PacketType.connect,
279
+ username: undefined,
280
+ will: undefined,
281
+ };
282
+ assert.deepStrictEqual(decoded, expected);
283
+ });
284
+
173
285
  test("decode Connect with username and password", () => {
174
286
  assert.deepStrictEqual(
175
- decode(Uint8Array.from(encodedConnect)),
287
+ decode(Uint8Array.from(encodedConnect), codecOptsUnknown),
176
288
  decodedConnect,
177
289
  );
178
290
  });
@@ -245,34 +357,89 @@ const encodedConnectWithWill = [
245
357
 
246
358
  test("encode Connect with username and password and will", () => {
247
359
  assert.deepStrictEqual(
248
- encode(decodedConnectWithWill),
360
+ encode(decodedConnectWithWill, codecOptsUnknown),
249
361
  Uint8Array.from(encodedConnectWithWill),
250
362
  );
251
363
  });
252
364
 
253
365
  test("decode invalid Connect", () => {
366
+ // Test packet with extra byte
254
367
  const longConnect = [...encodedConnect, 0];
255
368
  longConnect[1]++;
369
+
370
+ assert.throws(
371
+ () => decode(Uint8Array.from([...longConnect]), codecOptsUnknown),
372
+ /Packet too long/,
373
+ "Packet too long",
374
+ );
375
+
376
+ // Test packet with invalid reserved bit
256
377
  const reservedBitConnect = [...encodedConnect];
257
378
  reservedBitConnect[9] += 1; // set bit 0 of flags
379
+
380
+ assert.throws(
381
+ () => decode(Uint8Array.from(reservedBitConnect), codecOptsUnknown),
382
+ /Invalid reserved bit/,
383
+ "Invalid reserved bit",
384
+ );
385
+
386
+ // Test packet with invalid will
258
387
  const invalidWillQosConnect = [...encodedConnectWithWill];
259
388
  invalidWillQosConnect[9] += 16; // set bit 4 of flags
389
+ // Test packet with wrong protocol name 'MQTA'
390
+ const invalidProtocolName = [...encodedConnect];
391
+ invalidProtocolName[7] = 65; // 'A' instead of 'T'
260
392
 
261
393
  assert.throws(
262
- () => decode(Uint8Array.from([...longConnect])),
263
- Error,
264
- "too long",
394
+ () => decode(Uint8Array.from(invalidProtocolName), codecOptsUnknown),
395
+ /Invalid protocol name/,
396
+ "Invalid protocol name",
265
397
  );
266
398
 
399
+ // Test packet with wrong protocol name length
400
+ const invalidProtocolLength = [...encodedConnect];
401
+ invalidProtocolLength[3] = 5; // Length 5 instead of
402
+
267
403
  assert.throws(
268
- () => decode(Uint8Array.from(reservedBitConnect)),
269
- Error,
270
- "Invalid reserved bit",
404
+ () => decode(Uint8Array.from(invalidProtocolLength), codecOptsUnknown),
405
+ /Invalid protocol name or level/,
406
+ "incorrect protocol name length",
407
+ );
408
+
409
+ // Test packet with protocol level 5 and protocol name MQIsdp
410
+ const invalidProtocolNameLevel5 = [...invalidProtocolName];
411
+ invalidProtocolNameLevel5[9] = 5;
412
+
413
+ assert.throws(
414
+ () =>
415
+ decode(
416
+ Uint8Array.from(invalidProtocolNameLevel5),
417
+ codecOptsUnknown,
418
+ ),
419
+ /Invalid protocol name or level/,
420
+ "Invalid protocol name",
271
421
  );
272
422
 
423
+ const invalidProtocolLevel = [...encodedConnect];
424
+ invalidProtocolLevel[9] = 1;
425
+
273
426
  assert.throws(
274
- () => decode(Uint8Array.from(invalidWillQosConnect)),
275
- Error,
427
+ () =>
428
+ decode(
429
+ Uint8Array.from(invalidProtocolNameLevel5),
430
+ codecOptsUnknown,
431
+ ),
432
+ /Invalid protocol name or level/,
433
+ "Invalid protocol level",
434
+ );
435
+
436
+ assert.throws(
437
+ () =>
438
+ decode(
439
+ Uint8Array.from(invalidWillQosConnect),
440
+ codecOptsUnknown,
441
+ ),
442
+ /Invalid will qos/,
276
443
  "Invalid will qos",
277
444
  );
278
445
 
@@ -290,8 +457,320 @@ test("decode invalid Connect", () => {
290
457
  81, // 'Q'
291
458
  84, // 'T'
292
459
  ]),
460
+ codecOptsUnknown,
461
+ ),
462
+ /Packet too short/,
463
+ "Packet too short 2",
464
+ );
465
+ });
466
+
467
+ test("encode MQTTv4, clean=false, no clientId", () => {
468
+ assert.throws(
469
+ () =>
470
+ encode({
471
+ type: PacketType.connect,
472
+ protocolLevel: MQTTLevel.v4,
473
+ clean: false,
474
+ }, codecOptsUnknown),
475
+ /Client id required for clean session/,
476
+ );
477
+ });
478
+
479
+ test("encode MQTTv3, no clientId", () => {
480
+ assert.throws(
481
+ () =>
482
+ encode({
483
+ type: PacketType.connect,
484
+ protocolLevel: 3,
485
+ }, codecOptsUnknown),
486
+ /Client id required for protocol level 3/,
487
+ );
488
+ });
489
+
490
+ test("decode MQTTv3, protocolname MQTT", () => {
491
+ assert.throws(
492
+ () =>
493
+ decode(
494
+ Uint8Array.from([
495
+ // fixedHeader
496
+ 16, // packetType + flags
497
+ 26, // remainingLength
498
+ // variableHeader
499
+ 0, // protocolNameLength MSB
500
+ 4, // protocolNameLength LSB
501
+ 77, // 'M'
502
+ 81, // 'Q'
503
+ 84, // 'T'
504
+ 84, // 'T'
505
+ 3, // protocolLevel
506
+ 2, // connectFlags (cleanSession)
507
+ 0, // keepAlive MSB
508
+ 0, // keepAlive LSB
509
+ // payload
510
+ // clientId
511
+ 0, // length MSB
512
+ 2, // length LSB
513
+ 105, // 'i'
514
+ 100, // 'd'
515
+ ]),
516
+ codecOptsUnknown,
293
517
  ),
294
- Error,
295
- "too short",
518
+ /Invalid protocol name/,
296
519
  );
297
520
  });
521
+
522
+ test("encode/decode MQTTv5", () => {
523
+ const packet: ConnectPacket = {
524
+ type: PacketType.connect,
525
+ protocolName: "MQTT",
526
+ protocolLevel: 5,
527
+ username: undefined,
528
+ password: undefined,
529
+ will: {
530
+ retain: true,
531
+ qos: 2,
532
+ properties: {
533
+ willDelayInterval: 1234,
534
+ payloadFormatIndicator: false,
535
+ messageExpiryInterval: 4321,
536
+ contentType: "test",
537
+ responseTopic: "topic",
538
+ correlationData: Uint8Array.from([1, 2, 3, 4]),
539
+ userProperty: [["test", "test"]],
540
+ },
541
+ topic: "topic",
542
+ payload: Uint8Array.from([4, 3, 2, 1]),
543
+ },
544
+ clean: true,
545
+ keepAlive: 30,
546
+ properties: {
547
+ sessionExpiryInterval: 1234,
548
+ receiveMaximum: 432,
549
+ maximumPacketSize: 100,
550
+ topicAliasMaximum: 133,
551
+ requestResponseInformation: true,
552
+ requestProblemInformation: true,
553
+ userProperty: [["test", "test"]],
554
+ authenticationMethod: "test",
555
+ authenticationData: Uint8Array.from([1, 2, 3, 4]),
556
+ },
557
+ clientId: "test",
558
+ };
559
+
560
+ const buf = Uint8Array.from([
561
+ 16,
562
+ 125, // Header
563
+ 0,
564
+ 4, // Protocol ID length
565
+ 77,
566
+ 81,
567
+ 84,
568
+ 84, // Protocol ID
569
+ 5, // Protocol version
570
+ 54, // Connect flags
571
+ 0,
572
+ 30, // Keepalive
573
+ 47, // properties length
574
+ 17, // sessionExpiryInterval, 4 bytes
575
+ 0,
576
+ 0,
577
+ 4,
578
+ 210,
579
+ 21, // authenticationMethod, string 4 char
580
+ 0,
581
+ 4,
582
+ 116,
583
+ 101,
584
+ 115,
585
+ 116,
586
+ 22, // authenticationData, string 4 char
587
+ 0,
588
+ 4,
589
+ 1,
590
+ 2,
591
+ 3,
592
+ 4,
593
+ 23, // requestProblemInformation, boolean
594
+ 1,
595
+ 25, // requestResponseInformation, boolean
596
+ 1,
597
+ 33, // receiveMaximum 2 bytes
598
+ 1,
599
+ 176,
600
+ 34, // topicAliasMaximum 2 byte
601
+ 0,
602
+ 133,
603
+ 38,
604
+ 0,
605
+ 4,
606
+ 116,
607
+ 101,
608
+ 115,
609
+ 116,
610
+ 0,
611
+ 4,
612
+ 116,
613
+ 101,
614
+ 115,
615
+ 116,
616
+ 39, // maximumPacketSize 4 bytes
617
+ 0,
618
+ 0,
619
+ 0,
620
+ 100,
621
+ 0,
622
+ 4,
623
+ 116,
624
+ 101,
625
+ 115,
626
+ 116,
627
+ 47,
628
+ 1,
629
+ 0,
630
+ 2,
631
+ 0,
632
+ 0,
633
+ 16,
634
+ 225,
635
+ 3,
636
+ 0,
637
+ 4,
638
+ 116,
639
+ 101,
640
+ 115,
641
+ 116,
642
+ 8,
643
+ 0,
644
+ 5,
645
+ 116,
646
+ 111,
647
+ 112,
648
+ 105,
649
+ 99,
650
+ 9,
651
+ 0,
652
+ 4,
653
+ 1,
654
+ 2,
655
+ 3,
656
+ 4,
657
+ 24,
658
+ 0,
659
+ 0,
660
+ 4,
661
+ 210,
662
+ 38, // userProperties, stringpair 2x 4 bytes
663
+ 0,
664
+ 4,
665
+ 116,
666
+ 101,
667
+ 115,
668
+ 116,
669
+ 0,
670
+ 4,
671
+ 116,
672
+ 101,
673
+ 115,
674
+ 116,
675
+ 0, // will topic
676
+ 5,
677
+ 116,
678
+ 111,
679
+ 112,
680
+ 105,
681
+ 99,
682
+ 0, // will payload
683
+ 4,
684
+ 4,
685
+ 3,
686
+ 2,
687
+ 1,
688
+ ]);
689
+ const encoded = encode(packet, codecOptsUnknown);
690
+ assert.deepStrictEqual(buf, encoded);
691
+ assert.deepStrictEqual(decode(encoded, codecOptsUnknown), packet);
692
+ });
693
+
694
+ test("encode/decode minimal connect MQTTv5", () => {
695
+ const packet = {
696
+ type: PacketType.connect,
697
+ keepAlive: 60,
698
+ clientId: "Opifex-38417844-2161-4c40-a88f-0fe232891607",
699
+ protocolLevel: MQTTLevel.v5,
700
+ username: undefined,
701
+ password: undefined,
702
+ clean: false,
703
+ };
704
+
705
+ const expected = {
706
+ ...packet,
707
+ protocolName: "MQTT",
708
+ will: undefined,
709
+ properties: {},
710
+ };
711
+
712
+ const buf = Uint8Array.from([
713
+ 16,
714
+ 56,
715
+ 0,
716
+ 4,
717
+ 77,
718
+ 81,
719
+ 84,
720
+ 84,
721
+ 5,
722
+ 0,
723
+ 0,
724
+ 60,
725
+ 0,
726
+ 0,
727
+ 43,
728
+ 79,
729
+ 112,
730
+ 105,
731
+ 102,
732
+ 101,
733
+ 120,
734
+ 45,
735
+ 51,
736
+ 56,
737
+ 52,
738
+ 49,
739
+ 55,
740
+ 56,
741
+ 52,
742
+ 52,
743
+ 45,
744
+ 50,
745
+ 49,
746
+ 54,
747
+ 49,
748
+ 45,
749
+ 52,
750
+ 99,
751
+ 52,
752
+ 48,
753
+ 45,
754
+ 97,
755
+ 56,
756
+ 56,
757
+ 102,
758
+ 45,
759
+ 48,
760
+ 102,
761
+ 101,
762
+ 50,
763
+ 51,
764
+ 50,
765
+ 56,
766
+ 57,
767
+ 49,
768
+ 54,
769
+ 48,
770
+ 55,
771
+ ]);
772
+ const encoded = encode(packet, codecOptsUnknown);
773
+ assert.deepStrictEqual(buf, encoded);
774
+ const decoded = decode(encoded, codecOptsUnknown);
775
+ assert.deepStrictEqual(decoded, expected);
776
+ });