@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
@@ -0,0 +1,71 @@
1
+ import type { CodecOpts, TPacketType } from "./types.ts";
2
+ import { PacketType } from "./PacketType.ts";
3
+ import { Encoder, EncoderError } from "./encoder.ts";
4
+ import { Decoder, DecoderError, hasEmptyFlags } from "./decoder.ts";
5
+ import type { TReasonCode } from "./ReasonCode.ts";
6
+ import type { AuthProperties } from "./Properties.ts";
7
+
8
+ // AuthPacket does not exist on protocol levels < 5
9
+ export type AuthPacketV5 = {
10
+ type: TPacketType;
11
+ protocolLevel: 5;
12
+ reasonCode: TReasonCode;
13
+ properties?: AuthProperties;
14
+ };
15
+
16
+ /**
17
+ * An AUTH packet is sent from Client to Server or Server to Client as part of an extended
18
+ * authentication exchange, such as challenge / response authentication.
19
+ * It is a Protocol Error for the Client or Server to send an AUTH packet
20
+ * if the CONNECT packet did not contain the same Authentication Method.
21
+ */
22
+ export type AuthPacket = AuthPacketV5;
23
+
24
+ export const auth: {
25
+ encode(packet: AuthPacket, codecOpts: CodecOpts): Uint8Array;
26
+ decode(
27
+ buffer: Uint8Array,
28
+ flags: number,
29
+ codecOpts: CodecOpts,
30
+ packetType: TPacketType,
31
+ ): AuthPacket;
32
+ } = {
33
+ encode(packet: AuthPacket, codecOpts: CodecOpts): Uint8Array {
34
+ if (packet.protocolLevel !== 5) {
35
+ throw new EncoderError("Invalid protocol level");
36
+ }
37
+ const encoder = new Encoder(packet.type);
38
+ encoder
39
+ .setReasonCode(packet.reasonCode || 0)
40
+ .setProperties(
41
+ packet.properties || {},
42
+ packet.type,
43
+ codecOpts.maxOutgoingPacketSize,
44
+ );
45
+ return encoder.done(0);
46
+ },
47
+
48
+ decode(
49
+ buffer: Uint8Array,
50
+ flags: number,
51
+ codecOpts: CodecOpts,
52
+ packetType: TPacketType,
53
+ ): AuthPacket {
54
+ // Bits 3,2,1 and 0 of the Fixed Header of the AUTH packet are reserved and MUST all be set to 0.
55
+ // The Client or Server MUST treat any other value as malformed and close the Network Connection [MQTT-3.15.1-1].
56
+ hasEmptyFlags(flags);
57
+ if (codecOpts.protocolLevel !== 5) {
58
+ throw new DecoderError("Invalid protocol level");
59
+ }
60
+ const decoder = new Decoder(packetType, buffer);
61
+ const reasonCode = decoder.getReasonCode();
62
+ const properties = decoder.getProperties(PacketType.auth);
63
+ decoder.done();
64
+ return {
65
+ type: PacketType.auth,
66
+ protocolLevel: 5,
67
+ reasonCode,
68
+ properties,
69
+ };
70
+ },
71
+ };
@@ -1,53 +1,53 @@
1
1
  import assert from "node:assert/strict";
2
2
  import { test } from "node:test";
3
- import { decode, encode } from "./mod.ts";
4
- import { PacketType } from "./PacketType.ts";
3
+ import { decode, encode, MQTTLevel, PacketType, ReasonCode } from "./mod.ts";
4
+ import type { CodecOpts, ConnackPacket } from "./mod.ts";
5
5
 
6
- test("encode Connack packet", () => {
6
+ const codecOptsV4: CodecOpts = {
7
+ protocolLevel: MQTTLevel.v4,
8
+ maxIncomingPacketSize: 0xffff,
9
+ maxOutgoingPacketSize: 0xffff,
10
+ };
11
+
12
+ const codecOptsV5: CodecOpts = {
13
+ protocolLevel: MQTTLevel.v5,
14
+ maxIncomingPacketSize: 0xffff,
15
+ maxOutgoingPacketSize: 0xffff,
16
+ };
17
+
18
+ test("encode/decode Connack packet v4", () => {
19
+ const packet = {
20
+ type: PacketType.connack,
21
+ protocolLevel: MQTTLevel.v4,
22
+ sessionPresent: false,
23
+ returnCode: 0,
24
+ };
25
+ const encoded = encode(packet, codecOptsV4);
7
26
  assert.deepStrictEqual(
8
- encode({
9
- type: PacketType.connack,
10
- sessionPresent: false,
11
- returnCode: 0,
12
- }),
13
- Uint8Array.from([
27
+ encoded,
28
+ Uint8Array.from(Uint8Array.from([
14
29
  // fixedHeader
15
30
  0x20, // packetType + flags
16
31
  2, // remainingLength
17
32
  // variableHeader
18
33
  0, // connack flags
19
34
  0, // return code
20
- ]),
21
- );
22
- });
23
-
24
- test("decode Connack packet", () => {
25
- assert.deepStrictEqual(
26
- decode(
27
- Uint8Array.from([
28
- // fixedHeader
29
- 0x20, // packetType + flags
30
- 2, // remainingLength
31
- // variableHeader
32
- 0, // connack flags
33
- 0, // return code
34
- ]),
35
- ),
36
- {
37
- type: PacketType.connack,
38
- sessionPresent: false,
39
- returnCode: 0,
40
- },
35
+ ])),
41
36
  );
37
+ const decoded = decode(encoded, codecOptsV4);
38
+ assert.deepStrictEqual(decoded, packet);
42
39
  });
43
40
 
44
- test("encode Connack with session present", () => {
41
+ test("encode/decode Connack with session present v4", () => {
42
+ const packet = {
43
+ type: PacketType.connack,
44
+ protocolLevel: MQTTLevel.v4,
45
+ sessionPresent: true,
46
+ returnCode: 0,
47
+ };
48
+ const encoded = encode(packet, codecOptsV4);
45
49
  assert.deepStrictEqual(
46
- encode({
47
- type: PacketType.connack,
48
- sessionPresent: true,
49
- returnCode: 0,
50
- }),
50
+ encoded,
51
51
  Uint8Array.from([
52
52
  // fixedHeader
53
53
  0x20, // packetType + flags
@@ -57,27 +57,8 @@ test("encode Connack with session present", () => {
57
57
  0, // return code
58
58
  ]),
59
59
  );
60
- });
61
-
62
- test("decode Connack with session present", () => {
63
- assert
64
- .deepStrictEqual(
65
- decode(
66
- Uint8Array.from([
67
- // fixedHeader
68
- 0x20, // packetType + flags
69
- 2, // remainingLength
70
- // variableHeader
71
- 1, // connack flags (sessionPresent)
72
- 0, // return code
73
- ]),
74
- ),
75
- {
76
- type: PacketType.connack,
77
- sessionPresent: true,
78
- returnCode: 0,
79
- },
80
- );
60
+ const decoded = decode(encoded, codecOptsV4);
61
+ assert.deepStrictEqual(decoded, packet);
81
62
  });
82
63
 
83
64
  test("decode Connack with non-zero returnCode", () => {
@@ -91,8 +72,10 @@ test("decode Connack with non-zero returnCode", () => {
91
72
  0, // connack flags
92
73
  4, // return code (bad username or password)
93
74
  ]),
75
+ codecOptsV4,
94
76
  ),
95
77
  {
78
+ protocolLevel: 4,
96
79
  type: PacketType.connack,
97
80
  sessionPresent: false,
98
81
  returnCode: 4,
@@ -112,18 +95,55 @@ test("decode Connack with invalid returnCode", () => {
112
95
  0, // connack flags
113
96
  64, // return code (reserved)
114
97
  ]),
98
+ codecOptsV4,
115
99
  ),
116
- Error,
117
- "Invalid return code",
100
+ /Invalid return code/,
118
101
  );
119
102
  });
120
103
 
121
104
  test("decode short Connack packets", () => {
122
105
  assert.throws(
123
- () => decode(Uint8Array.from([0x20])),
124
- Error,
125
- "decoding failed",
106
+ () => decode(Uint8Array.from([0x20]), codecOptsV4),
107
+ /decoding failed/,
108
+ );
109
+ assert.throws(
110
+ () => decode(Uint8Array.from([0x20, 2]), codecOptsV4),
111
+ /Packet too short/,
112
+ );
113
+ assert.throws(
114
+ () => decode(Uint8Array.from([0x20, 2, 0]), codecOptsV4),
115
+ /Packet too long/,
116
+ );
117
+ });
118
+
119
+ test("encode/decode connack v5", () => {
120
+ const packet: ConnackPacket = {
121
+ protocolLevel: 5,
122
+ type: PacketType.connack,
123
+ sessionPresent: false,
124
+ reasonCode: ReasonCode.badUserNameOrPassword,
125
+ properties: {
126
+ userProperty: [["key", "value"]],
127
+ },
128
+ };
129
+ const encoded = encode(packet, codecOptsV5);
130
+ const decoded = decode(encoded, codecOptsV5);
131
+ assert.deepStrictEqual(decoded, packet);
132
+ });
133
+
134
+ test("encode/decode connack v5 as v4", () => {
135
+ const packet: ConnackPacket = {
136
+ protocolLevel: 5,
137
+ type: PacketType.connack,
138
+ sessionPresent: false,
139
+ reasonCode: ReasonCode.banned,
140
+ properties: {
141
+ userProperty: [["key", "value"]],
142
+ },
143
+ };
144
+ const encoded = encode(packet, codecOptsV4);
145
+ assert.throws(
146
+ () => decode(encoded, codecOptsV4),
147
+ /Packet too long/,
126
148
  );
127
- assert.throws(() => decode(Uint8Array.from([0x20, 2])), Error, "too short");
128
- assert.throws(() => decode(Uint8Array.from([0x20, 2, 0])), Error, "too long");
129
149
  });
@@ -1,44 +1,108 @@
1
- import type { TAuthenticationResult, TPacketType } from "./types.ts";
1
+ import type {
2
+ CodecOpts,
3
+ ProtocolLevelNoV5,
4
+ TAuthenticationResult,
5
+ TPacketType,
6
+ } from "./types.ts";
2
7
  import { PacketType } from "./PacketType.ts";
3
8
  import { BitMask } from "./BitMask.ts";
4
- import { booleanFlag, Decoder, DecoderError } from "./decoder.ts";
9
+ import { Encoder } from "./encoder.ts";
10
+ import {
11
+ booleanFlag,
12
+ Decoder,
13
+ DecoderError,
14
+ hasEmptyFlags,
15
+ } from "./decoder.ts";
5
16
  import { AuthenticationResultByNumber } from "./AuthenticationResult.ts";
17
+ import type { TReasonCode } from "./ReasonCode.ts";
18
+ import type { ConnackProperties } from "./Properties.ts";
6
19
 
7
- /**
8
- * ConnackPacket is sent from the server to the client in response to a connect packet.
9
- * It indicates that the connect is accepted.
10
- */
11
- export type ConnackPacket = {
20
+ export type ConnackPacketV4 = {
12
21
  type: TPacketType;
22
+ protocolLevel: ProtocolLevelNoV5;
13
23
  sessionPresent: boolean;
14
24
  returnCode: TAuthenticationResult;
15
25
  };
16
26
 
27
+ export type ConnackPacketV5 = {
28
+ type: TPacketType;
29
+ protocolLevel: 5;
30
+ sessionPresent: boolean;
31
+ reasonCode: TReasonCode;
32
+ properties?: ConnackProperties;
33
+ };
34
+
35
+ /**
36
+ * ConnackPacket is sent from the server to the client in response to a connect packet.
37
+ * It indicates that the connect is accepted.
38
+ */
39
+ export type ConnackPacket = ConnackPacketV4 | ConnackPacketV5;
40
+
17
41
  export const connack: {
18
- encode(packet: ConnackPacket): { flags: number; bytes: number[] };
19
- decode(buffer: Uint8Array, _flags: number): ConnackPacket | undefined;
42
+ encode(packet: ConnackPacket, codecOpts: CodecOpts): Uint8Array;
43
+ decode(
44
+ buffer: Uint8Array,
45
+ flags: number,
46
+ codecOpts: CodecOpts,
47
+ packetType: TPacketType,
48
+ ): ConnackPacket;
20
49
  } = {
21
- encode(packet: ConnackPacket): { flags: number; bytes: number[] } {
22
- const flags = 0;
23
- return {
24
- flags,
25
- bytes: [packet.sessionPresent ? 1 : 0, packet.returnCode || 0],
26
- };
50
+ encode(packet: ConnackPacket, codecOpts: CodecOpts): Uint8Array {
51
+ if (packet.protocolLevel !== 5) {
52
+ return new Uint8Array([
53
+ packet.type << 4,
54
+ 2,
55
+ packet.sessionPresent ? 1 : 0,
56
+ packet.returnCode || 0,
57
+ ]);
58
+ }
59
+ const encoder = new Encoder(packet.type);
60
+ encoder
61
+ .setByte(packet.sessionPresent ? 1 : 0)
62
+ .setReasonCode(packet.reasonCode || 0)
63
+ .setProperties(
64
+ packet.properties || {},
65
+ packet.type,
66
+ codecOpts.maxOutgoingPacketSize,
67
+ );
68
+ return encoder.done(0);
27
69
  },
28
70
 
29
- decode(buffer: Uint8Array, _flags: number): ConnackPacket | undefined {
30
- const decoder = new Decoder(buffer);
31
-
32
- const sessionPresent = booleanFlag(decoder.getByte(), BitMask.bit0);
33
- const returnCode = decoder.getByte() as TAuthenticationResult;
34
- decoder.done();
35
- if (!AuthenticationResultByNumber[returnCode]) {
36
- throw new DecoderError("Invalid return code");
71
+ decode(
72
+ buffer: Uint8Array,
73
+ flags: number,
74
+ codecOpts: CodecOpts,
75
+ packetType: TPacketType,
76
+ ): ConnackPacket {
77
+ const decoder = new Decoder(packetType, buffer);
78
+ hasEmptyFlags(flags);
79
+ const ackflags = decoder.getByte();
80
+ if (ackflags > 1) {
81
+ throw new DecoderError("Invalid Connect Acknowledge flags");
37
82
  }
83
+ const sessionPresent = booleanFlag(ackflags, BitMask.bit0);
84
+ if (codecOpts.protocolLevel !== 5) {
85
+ const returnCode = decoder.getByte() as TAuthenticationResult;
86
+ decoder.done();
87
+ if (!AuthenticationResultByNumber[returnCode]) {
88
+ throw new DecoderError("Invalid return code");
89
+ }
90
+ return {
91
+ type: PacketType.connack,
92
+ protocolLevel: codecOpts.protocolLevel,
93
+ sessionPresent,
94
+ returnCode,
95
+ };
96
+ }
97
+ const reasonCode = decoder.getReasonCode();
98
+ const properties = decoder.getProperties(PacketType.connack);
99
+ decoder.done();
38
100
  return {
39
101
  type: PacketType.connack,
102
+ protocolLevel: 5,
40
103
  sessionPresent,
41
- returnCode,
104
+ reasonCode,
105
+ properties,
42
106
  };
43
107
  },
44
108
  };