@seriousme/opifex 1.10.1 → 1.11.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 (130) hide show
  1. package/README.md +5 -5
  2. package/benchmarks/bombing.ts +35 -0
  3. package/benchmarks/throughputCounter.ts +31 -0
  4. package/benchmarks/utils.ts +32 -0
  5. package/bin/mqtt.ts +1 -1
  6. package/client/client.ts +33 -17
  7. package/client/context.ts +33 -18
  8. package/client/deps.ts +1 -2
  9. package/client/handlers/handlePublish.ts +2 -2
  10. package/client/handlers/handlePubrel.ts +1 -1
  11. package/deno/tcpClient.ts +1 -1
  12. package/deno/tcpServer.test.ts +0 -1
  13. package/dev_utils/dummyConn.ts +5 -5
  14. package/dev_utils/mod.ts +1 -0
  15. package/dev_utils/timers.ts +51 -0
  16. package/dist/bin/mqtt.js +1 -1
  17. package/dist/bin/mqtt.js.map +1 -1
  18. package/dist/client/client.d.ts +11 -7
  19. package/dist/client/client.d.ts.map +1 -1
  20. package/dist/client/client.js +26 -16
  21. package/dist/client/client.js.map +1 -1
  22. package/dist/client/context.d.ts +7 -5
  23. package/dist/client/context.d.ts.map +1 -1
  24. package/dist/client/context.js +28 -16
  25. package/dist/client/context.js.map +1 -1
  26. package/dist/client/deps.d.ts +1 -2
  27. package/dist/client/deps.d.ts.map +1 -1
  28. package/dist/client/deps.js +1 -2
  29. package/dist/client/deps.js.map +1 -1
  30. package/dist/client/handlers/handlePublish.js +2 -2
  31. package/dist/client/handlers/handlePublish.js.map +1 -1
  32. package/dist/client/handlers/handlePubrel.js +1 -1
  33. package/dist/client/handlers/handlePubrel.js.map +1 -1
  34. package/dist/mqttConn/mqttConn.d.ts +2 -7
  35. package/dist/mqttConn/mqttConn.d.ts.map +1 -1
  36. package/dist/mqttConn/mqttConn.js +18 -11
  37. package/dist/mqttConn/mqttConn.js.map +1 -1
  38. package/dist/mqttPacket/auth.d.ts +6 -6
  39. package/dist/mqttPacket/auth.d.ts.map +1 -1
  40. package/dist/mqttPacket/auth.js.map +1 -1
  41. package/dist/mqttPacket/connack.d.ts +4 -4
  42. package/dist/mqttPacket/connack.d.ts.map +1 -1
  43. package/dist/mqttPacket/connect.d.ts +3 -3
  44. package/dist/mqttPacket/connect.d.ts.map +1 -1
  45. package/dist/mqttPacket/disconnect.d.ts +4 -4
  46. package/dist/mqttPacket/disconnect.d.ts.map +1 -1
  47. package/dist/mqttPacket/mod.d.ts +1 -0
  48. package/dist/mqttPacket/mod.d.ts.map +1 -1
  49. package/dist/mqttPacket/mod.js +1 -0
  50. package/dist/mqttPacket/mod.js.map +1 -1
  51. package/dist/mqttPacket/protocolLevels.d.ts +5 -4
  52. package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
  53. package/dist/mqttPacket/protocolLevels.js +1 -1
  54. package/dist/mqttPacket/protocolLevels.js.map +1 -1
  55. package/dist/mqttPacket/pubblishAcks.d.ts +15 -8
  56. package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
  57. package/dist/mqttPacket/pubblishAcks.js.map +1 -1
  58. package/dist/mqttPacket/suback.d.ts +4 -4
  59. package/dist/mqttPacket/suback.d.ts.map +1 -1
  60. package/dist/mqttPacket/subscribe.d.ts +3 -3
  61. package/dist/mqttPacket/subscribe.d.ts.map +1 -1
  62. package/dist/mqttPacket/types.d.ts +3 -0
  63. package/dist/mqttPacket/types.d.ts.map +1 -1
  64. package/dist/mqttPacket/unsuback.d.ts +4 -4
  65. package/dist/mqttPacket/unsuback.d.ts.map +1 -1
  66. package/dist/mqttPacket/unsubscribe.d.ts +3 -3
  67. package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
  68. package/dist/mqttPacket/validators.d.ts +15 -0
  69. package/dist/mqttPacket/validators.d.ts.map +1 -1
  70. package/dist/mqttPacket/validators.js +15 -0
  71. package/dist/mqttPacket/validators.js.map +1 -1
  72. package/dist/node/tcpClient.js +1 -1
  73. package/dist/node/tcpClient.js.map +1 -1
  74. package/dist/persistence/memory/memoryPersistence.js +1 -1
  75. package/dist/persistence/memory/memoryPersistence.js.map +1 -1
  76. package/dist/utils/{asyncQueue.d.ts → BufferedAsyncIterable.d.ts} +9 -11
  77. package/dist/utils/BufferedAsyncIterable.d.ts.map +1 -0
  78. package/dist/utils/BufferedAsyncIterable.js +70 -0
  79. package/dist/utils/BufferedAsyncIterable.js.map +1 -0
  80. package/dist/utils/logger.d.ts +5 -15
  81. package/dist/utils/logger.d.ts.map +1 -1
  82. package/dist/utils/logger.js +7 -8
  83. package/dist/utils/logger.js.map +1 -1
  84. package/dist/utils/mod.d.ts +1 -2
  85. package/dist/utils/mod.d.ts.map +1 -1
  86. package/dist/utils/mod.js +1 -2
  87. package/dist/utils/mod.js.map +1 -1
  88. package/dist/utils/queue.d.ts +43 -0
  89. package/dist/utils/queue.d.ts.map +1 -0
  90. package/dist/utils/queue.js +63 -0
  91. package/dist/utils/queue.js.map +1 -0
  92. package/dist/utils/utils.d.ts +2 -0
  93. package/dist/utils/utils.d.ts.map +1 -0
  94. package/dist/utils/utils.js +6 -0
  95. package/dist/utils/utils.js.map +1 -0
  96. package/examples/tcpServer.test.ts +0 -1
  97. package/mqttConn/mqttConn.test.ts +5 -4
  98. package/mqttConn/mqttConn.ts +19 -15
  99. package/mqttPacket/auth.ts +6 -7
  100. package/mqttPacket/connack.ts +4 -4
  101. package/mqttPacket/connect.ts +3 -3
  102. package/mqttPacket/disconnect.ts +4 -4
  103. package/mqttPacket/mod.ts +1 -0
  104. package/mqttPacket/protocolLevels.ts +2 -2
  105. package/mqttPacket/pubblishAcks.ts +15 -9
  106. package/mqttPacket/suback.ts +4 -4
  107. package/mqttPacket/subscribe.ts +3 -3
  108. package/mqttPacket/types.ts +3 -0
  109. package/mqttPacket/unsuback.ts +4 -4
  110. package/mqttPacket/unsubscribe.ts +3 -3
  111. package/mqttPacket/validators.ts +15 -0
  112. package/node/tcpClient.ts +1 -1
  113. package/node/tcpServer.test.ts +0 -1
  114. package/package.json +1 -1
  115. package/persistence/memory/memoryPersistence.ts +1 -1
  116. package/server/test/handleConnect.test.ts +11 -8
  117. package/utils/BufferedAsyncIterable.ts +76 -0
  118. package/utils/logger.ts +12 -11
  119. package/utils/mod.ts +1 -2
  120. package/utils/queue.ts +66 -0
  121. package/utils/utils.ts +6 -0
  122. package/dist/utils/asyncQueue.d.ts.map +0 -1
  123. package/dist/utils/asyncQueue.js +0 -70
  124. package/dist/utils/asyncQueue.js.map +0 -1
  125. package/dist/utils/nextTick.d.ts +0 -17
  126. package/dist/utils/nextTick.d.ts.map +0 -1
  127. package/dist/utils/nextTick.js +0 -19
  128. package/dist/utils/nextTick.js.map +0 -1
  129. package/utils/asyncQueue.ts +0 -75
  130. package/utils/nextTick.ts +0 -18
package/README.md CHANGED
@@ -20,12 +20,12 @@ The following MQTT versions are supported:
20
20
  | Server | ❌ | ✅ | ❌ |
21
21
 
22
22
  Client and server currently only have memory based persistence, but one can
23
- provide its own persistence. (see [#Architecture] )
23
+ provide its own persistence. (see [Architecture](#architecture))
24
24
 
25
25
  ## Usage
26
26
 
27
- The most easy way to use this project is to just use the demo server
28
- (demoServer) and/or the demo client (mqtt).
27
+ The easiest way to use this project is to just use the demo server (demoServer)
28
+ and/or the demo client (mqtt).
29
29
 
30
30
  - [NodeJS/Bun](node/README.md)
31
31
  - [Deno](deno/README.md)
@@ -35,7 +35,7 @@ can be done with CLI options then the next step is to clone the demo server
35
35
  and/or the client scripts and modify them to your liking.
36
36
 
37
37
  If you want to port the platform independent client and server libs to other
38
- types of transport (e.g. Unix sockets or websocketstream) then its recommended
38
+ types of transports (e.g. Unix sockets or websocketstream) then it's recommended
39
39
  to clone and modify the platform specific code in `/node` or `/deno` as well.
40
40
 
41
41
  If you want to port the platform independent client and server libs to another
@@ -65,7 +65,7 @@ A more elaborate example including client and server can be found in the
65
65
  ## Architecture
66
66
 
67
67
  1. The basis of Opifex is the MQTT packet module
68
- ([mqttPacket/mod.ts](mqttPacket/mod.ts)) which contains al the logic to
68
+ ([mqttPacket/mod.ts](mqttPacket/mod.ts)) which contains all the logic to
69
69
  encode and decode packets.
70
70
 
71
71
  2. On top of mqttPacket sits the MQTT connection module
@@ -0,0 +1,35 @@
1
+ import { loader } from "./utils.ts";
2
+ import { runAsap } from "../dev_utils/timers.ts";
3
+
4
+ loader((ClientClass) => {
5
+ const client = new ClientClass();
6
+
7
+ client.connect({
8
+ url: new URL("mqtt://127.0.0.1:1884"),
9
+ });
10
+
11
+ client.onConnected = () => {
12
+ const payload = new TextEncoder().encode("payload");
13
+
14
+ let sent = 0;
15
+ const interval = 5000;
16
+
17
+ const loop = () => {
18
+ sent++;
19
+ client.publish({ topic: "test", payload })
20
+ .then(() => runAsap(loop));
21
+ };
22
+
23
+ function count() {
24
+ console.log("sent/s", (sent / interval) * 1000);
25
+ sent = 0;
26
+ }
27
+
28
+ setInterval(count, interval);
29
+ loop();
30
+ };
31
+
32
+ client.onError = (err) => {
33
+ console.log("client error", err);
34
+ };
35
+ });
@@ -0,0 +1,31 @@
1
+ import { loader } from "./utils.ts";
2
+
3
+ loader(async (ClientClass) => {
4
+ const client = new ClientClass();
5
+
6
+ await client.connect({
7
+ url: new URL("mqtt://127.0.0.1:1884"),
8
+ });
9
+
10
+ await client.subscribe({ subscriptions: [{ topicFilter: "test", qos: 0 }] });
11
+
12
+ let counter = 0;
13
+ const interval = 5000;
14
+
15
+ function count() {
16
+ console.log("received/s", (counter / interval) * 1000);
17
+ counter = 0;
18
+ }
19
+
20
+ setInterval(count, interval);
21
+
22
+ // // Consume using a callback
23
+ // client.onPacket = async (packet) => {
24
+ // counter++;
25
+ // };
26
+
27
+ // Consume using an AsyncIterator
28
+ for await (const _ of client.messages()) {
29
+ counter++;
30
+ }
31
+ });
@@ -0,0 +1,32 @@
1
+ import type { Client } from "../client/client.ts";
2
+
3
+ export type ClientClass = new () => Client;
4
+
5
+ export type Main = (clientClass: ClientClass) => void | Promise<void>;
6
+
7
+ // @ts-ignore: the Deno global variable is not defined in @types/node,
8
+ // therefore we need to ignore this error because this file
9
+ // is meant to be used in both environments.
10
+ const isDeno = typeof Deno !== "undefined";
11
+
12
+ // @ts-ignore: the Deno global variable is not defined in @types/node,
13
+ // therefore we need to ignore this error because this file
14
+ // is meant to be used in both environments.
15
+ // deno-lint-ignore no-process-global
16
+ const exit = isDeno ? Deno.exit : process.exit;
17
+
18
+ const importClientClass = async (): Promise<ClientClass> => {
19
+ return isDeno
20
+ ? (await import("../deno/tcpClient.ts")).TcpClient
21
+ : (await import("../node/tcpClient.ts")).TcpClient;
22
+ };
23
+
24
+ export const loader = async (main: Main) => {
25
+ const TcpClient = await importClientClass();
26
+ try {
27
+ await main(TcpClient);
28
+ } catch (err) {
29
+ console.error(err);
30
+ exit(1);
31
+ }
32
+ };
package/bin/mqtt.ts CHANGED
@@ -194,7 +194,7 @@ async function subscribe() {
194
194
  }
195
195
  try {
196
196
  await connect(subscribeArgs);
197
- client.subscribe({
197
+ await client.subscribe({
198
198
  subscriptions: [
199
199
  {
200
200
  topicFilter: subscribeArgs.topic,
package/client/client.ts CHANGED
@@ -14,7 +14,12 @@ import type {
14
14
  TAuthenticationResult,
15
15
  } from "./deps.ts";
16
16
 
17
+ import { noop } from "../utils/utils.ts";
18
+
17
19
  import { Context } from "./context.ts";
20
+ import type { TConnectionState } from "./ConnectionState.ts";
21
+ import { assert } from "../utils/assert.ts";
22
+ import { BufferedAsyncIterable } from "./deps.ts";
18
23
 
19
24
  /**
20
25
  * Generates a random client ID with the given prefix
@@ -70,9 +75,11 @@ function backOffSleep(random: boolean, attempt: number): Promise<void> {
70
75
  return new Promise((resolve) => setTimeout(resolve, delay));
71
76
  }
72
77
 
73
- /** the default MQTT URL to connect to */
78
+ /** the default MQTT URL to connect to */
74
79
  export const DEFAULT_URL = "mqtt://localhost:1883/";
80
+ /** the default protocol level to connect with*/
75
81
  export const DEFAULT_PROTOCOLLEVEL = MQTTLevel.v4;
82
+ /** the default keepalive time */
76
83
  export const DEFAULT_KEEPALIVE = 60; // 60 seconds
77
84
  const DEFAULT_RETRIES = 3; // on first connect
78
85
  const CLIENTID_PREFIX = "opifex"; // on first connect
@@ -87,6 +94,12 @@ const CLIENTID_PREFIX = "opifex"; // on first connect
87
94
  * connection type that is supported by the subclass.
88
95
  */
89
96
  export class Client {
97
+ public onError: (err: Error) => void = noop;
98
+ public onPacket: (pkt: PublishPacket) => void | Promise<void> = noop;
99
+ public onConnected: () => void = noop;
100
+ public onDisconnected: () => void = noop;
101
+ public onReconnecting: () => void = noop;
102
+
90
103
  protected clientIdPrefix = CLIENTID_PREFIX;
91
104
  protected numberOfRetries = DEFAULT_RETRIES;
92
105
  protected url: URL = new URL(DEFAULT_URL);
@@ -97,17 +110,22 @@ export class Client {
97
110
  private cert?: string;
98
111
  private key?: string;
99
112
  private clientId: string;
100
- private ctx = new Context(new MemoryStore());
113
+ private ctx: Context;
101
114
  private connectPacket?: ConnectPacket;
102
115
 
103
116
  /**
104
117
  * Creates a new MQTT client instance
105
118
  */
106
119
  constructor() {
120
+ this.ctx = new Context(new MemoryStore(), this);
107
121
  this.clientId = generateClientId(this.clientIdPrefix);
108
122
  this.numberOfRetries = DEFAULT_RETRIES;
109
123
  }
110
124
 
125
+ get connectionState(): TConnectionState {
126
+ return this.ctx.connectionState;
127
+ }
128
+
111
129
  /**
112
130
  * Creates a new connection to the MQTT broker
113
131
  * @param protocol - The protocol to use (mqtt, mqtts, etc)
@@ -128,7 +146,7 @@ export class Client {
128
146
  ): Promise<SockConn> {
129
147
  // if you need to support alternative connection types just
130
148
  // overload this method in your subclass
131
- throw `Unsupported protocol: ${protocol}`;
149
+ throw new Error(`Unsupported protocol: ${protocol}`);
132
150
  }
133
151
 
134
152
  /**
@@ -164,10 +182,13 @@ export class Client {
164
182
  this.connectPacket.clean = false;
165
183
  this.ctx.close();
166
184
  } catch (err) {
167
- if (err instanceof Error) {
168
- lastMessage = err;
169
- logger.debug({ lastMessage });
170
- }
185
+ assert(
186
+ err instanceof Error,
187
+ `Caught something that is not an instance of Error: ${err}`,
188
+ );
189
+ queueMicrotask(() => this.onError(err));
190
+ lastMessage = err;
191
+ logger.debug({ lastMessage });
171
192
  }
172
193
 
173
194
  if (tryConnect && (isReconnect || attempt < this.numberOfRetries)) {
@@ -175,6 +196,7 @@ export class Client {
175
196
  if (!isReconnect) {
176
197
  attempt++;
177
198
  }
199
+ queueMicrotask(this.onReconnecting);
178
200
  } else {
179
201
  tryConnect = false;
180
202
  }
@@ -255,15 +277,9 @@ export class Client {
255
277
  * Gets an async iterator for received messages
256
278
  * @returns AsyncGenerator yielding received publish packets
257
279
  */
258
- async *messages(): AsyncGenerator<PublishPacket, void, unknown> {
259
- yield* this.ctx.incoming;
260
- }
261
-
262
- /**
263
- * Closes the message stream
264
- * @param reason - Optional reason for closing
265
- */
266
- closeMessages(reason?: string) {
267
- this.ctx.incoming.close(reason);
280
+ messages(): AsyncIterable<PublishPacket> {
281
+ const bufferedIterable = new BufferedAsyncIterable<PublishPacket>();
282
+ this.onPacket = bufferedIterable.push;
283
+ return bufferedIterable;
268
284
  }
269
285
  }
package/client/context.ts CHANGED
@@ -1,10 +1,8 @@
1
1
  import {
2
- AsyncQueue,
3
2
  Deferred,
4
3
  logger,
5
4
  MqttConn,
6
5
  MQTTLevel,
7
- nextTick,
8
6
  PacketType,
9
7
  Timer,
10
8
  } from "./deps.ts";
@@ -25,10 +23,12 @@ import type {
25
23
  import { handlePacket } from "./handlers/handlePacket.ts";
26
24
  import type { TConnectionState } from "./ConnectionState.ts";
27
25
  import { ConnectionState } from "./ConnectionState.ts";
26
+ import type { Client } from "./client.ts";
27
+ import { assert } from "../utils/assert.ts";
28
28
 
29
29
  export class Context {
30
30
  mqttConn?: MqttConn;
31
- connectionState: TConnectionState;
31
+ #connectionState: TConnectionState;
32
32
  protocolLevel: ProtocolLevel;
33
33
  pingTimer?: Timer;
34
34
  unresolvedConnect?: Deferred<TAuthenticationResult>;
@@ -36,18 +36,34 @@ export class Context {
36
36
  unresolvedSubscribe: Map<PacketId, Deferred<ReturnCodes>>;
37
37
  unresolvedUnSubscribe: Map<PacketId, Deferred<void>>;
38
38
  store: MemoryStore;
39
- incoming: AsyncQueue<PublishPacket>;
39
+ #client: Client;
40
40
 
41
- constructor(store: MemoryStore) {
41
+ constructor(store: MemoryStore, client: Client) {
42
+ this.#client = client;
42
43
  this.store = store;
43
- this.connectionState = ConnectionState.offline;
44
+ this.#connectionState = ConnectionState.offline;
44
45
  this.protocolLevel = MQTTLevel.unknown;
45
- this.incoming = new AsyncQueue();
46
46
  this.unresolvedPublish = new Map();
47
47
  this.unresolvedSubscribe = new Map();
48
48
  this.unresolvedUnSubscribe = new Map();
49
49
  }
50
50
 
51
+ get connectionState(): TConnectionState {
52
+ return this.#connectionState;
53
+ }
54
+
55
+ set connectionState(state: TConnectionState) {
56
+ this.#connectionState = state;
57
+ switch (state) {
58
+ case "connected":
59
+ queueMicrotask(this.#client.onConnected);
60
+ break;
61
+ case "disconnected":
62
+ queueMicrotask(this.#client.onDisconnected);
63
+ break;
64
+ }
65
+ }
66
+
51
67
  async connect(packet: ConnectPacket) {
52
68
  this.connectionState = ConnectionState.connecting;
53
69
  if (packet.protocolLevel === MQTTLevel.unknown) {
@@ -88,7 +104,6 @@ export class Context {
88
104
  ) {
89
105
  await this.mqttConn?.send(packet);
90
106
  this.pingTimer?.reset();
91
- await nextTick(); // Yield to allow other tasks to run
92
107
  return;
93
108
  }
94
109
  logger.debug("not connected");
@@ -107,21 +122,22 @@ export class Context {
107
122
  connectPacket: ConnectPacket,
108
123
  ): Promise<boolean> {
109
124
  this.mqttConn = new MqttConn({ conn });
110
- if (this.mqttConn === undefined) {
111
- return true;
112
- }
113
-
114
125
  try {
115
126
  logger.debug("Send connect packet", connectPacket);
116
127
  await this.connect(connectPacket);
117
128
  logger.debug("Accepting packets");
118
129
  for await (const packet of this.mqttConn) {
119
- handlePacket(this, packet);
130
+ await handlePacket(this, packet);
120
131
  }
121
132
  logger.debug("No more packets");
122
133
  } catch (err) {
134
+ assert(
135
+ err instanceof Error,
136
+ `Caught something that is not an instance of Error: ${err}`,
137
+ );
138
+ queueMicrotask(() => this.#client.onError(err));
123
139
  logger.debug(`error ${err}`);
124
- if (this.mqttConn.isClosed) {
140
+ if (!this.mqttConn.isClosed) {
125
141
  this.mqttConn.close();
126
142
  }
127
143
  }
@@ -137,8 +153,8 @@ export class Context {
137
153
  this.pingTimer?.clear();
138
154
  }
139
155
 
140
- receivePublish(packet: PublishPacket) {
141
- this.incoming.push(packet);
156
+ async receivePublish(packet: PublishPacket) {
157
+ await this.#client.onPacket(packet);
142
158
  }
143
159
 
144
160
  async publish(packet: PublishPacket): Promise<void> {
@@ -146,8 +162,7 @@ export class Context {
146
162
  if (qos === 0) {
147
163
  packet.id = 0;
148
164
  await this.send(packet);
149
- // return empty promise
150
- return Promise.resolve();
165
+ return;
151
166
  }
152
167
  packet.id = this.store.nextId();
153
168
  this.store.pendingOutgoing.set(packet.id, packet);
package/client/deps.ts CHANGED
@@ -36,6 +36,5 @@ export {
36
36
  export { MqttConn } from "../mqttConn/mqttConn.ts";
37
37
  export type { SockConn } from "../socket/socket.ts";
38
38
  export { Timer } from "../timer/timer.ts";
39
- export { AsyncQueue, Deferred, logger } from "../utils/mod.ts";
39
+ export { BufferedAsyncIterable, Deferred, logger } from "../utils/mod.ts";
40
40
  export { MemoryStore } from "./store/memoryStore.ts";
41
- export { nextTick } from "../utils/mod.ts";
@@ -11,14 +11,14 @@ import type { PublishPacket } from "../deps.ts";
11
11
  export async function handlePublish(ctx: Context, packet: PublishPacket) {
12
12
  const qos = packet.qos || 0;
13
13
  if (qos === 0) {
14
- ctx.receivePublish(packet);
14
+ await ctx.receivePublish(packet);
15
15
  return;
16
16
  }
17
17
 
18
18
  if (packet.id !== undefined) {
19
19
  // qos 1
20
20
  if (qos === 1) {
21
- ctx.receivePublish(packet);
21
+ await ctx.receivePublish(packet);
22
22
  await ctx.send({
23
23
  type: PacketType.puback,
24
24
  protocolLevel: ctx.protocolLevel,
@@ -26,7 +26,7 @@ export async function handlePubrel(
26
26
  if (ctx.store.pendingIncoming.has(id)) {
27
27
  const storedPacket = ctx.store.pendingIncoming.get(id);
28
28
  if (storedPacket) {
29
- ctx.receivePublish(storedPacket);
29
+ await ctx.receivePublish(storedPacket);
30
30
  ctx.store.pendingIncoming.delete(id);
31
31
  await ctx.send({
32
32
  type: PacketType.pubcomp,
package/deno/tcpClient.ts CHANGED
@@ -70,6 +70,6 @@ export class TcpClient extends Client {
70
70
  if (protocol === "mqtt:") {
71
71
  return this.connectMQTT(hostname, port);
72
72
  }
73
- throw `Unsupported protocol: ${protocol}`;
73
+ throw new Error(`Unsupported protocol: ${protocol}`);
74
74
  }
75
75
  }
@@ -72,7 +72,6 @@ test("Deno Test pubSub using client and server", async function () {
72
72
 
73
73
  await sleep(100);
74
74
  logger.verbose(`Disconnect client`);
75
- //client.closeMessages();
76
75
  await client.disconnect();
77
76
 
78
77
  logger.verbose(`Check completeness`);
@@ -1,4 +1,4 @@
1
- import type { AsyncQueue } from "../utils/mod.ts";
1
+ import type { BufferedAsyncIterable } from "../utils/mod.ts";
2
2
 
3
3
  class Uint8Writer implements WritableStreamDefaultWriter {
4
4
  private buff: Uint8Array;
@@ -24,7 +24,7 @@ class Uint8Writer implements WritableStreamDefaultWriter {
24
24
  }
25
25
 
26
26
  class Uint8QueuedWriter implements WritableStreamDefaultWriter {
27
- private queue: AsyncQueue<Uint8Array>;
27
+ private queue: BufferedAsyncIterable<Uint8Array>;
28
28
  closed = Promise.resolve(undefined);
29
29
  close = () => Promise.resolve();
30
30
  abort = () => Promise.resolve();
@@ -33,7 +33,7 @@ class Uint8QueuedWriter implements WritableStreamDefaultWriter {
33
33
  desiredSize = 20;
34
34
 
35
35
  constructor(
36
- queue: AsyncQueue<Uint8Array>,
36
+ queue: BufferedAsyncIterable<Uint8Array>,
37
37
  ) {
38
38
  this.queue = queue;
39
39
  }
@@ -96,8 +96,8 @@ export function makeDummySockConn(
96
96
  }
97
97
 
98
98
  export function makeDummyQueueSockConn(
99
- r: AsyncQueue<Uint8Array>,
100
- w: AsyncQueue<Uint8Array>,
99
+ r: BufferedAsyncIterable<Uint8Array>,
100
+ w: BufferedAsyncIterable<Uint8Array>,
101
101
  close = () => {},
102
102
  ) {
103
103
  const readable = ReadableStreamFrom(r);
package/dev_utils/mod.ts CHANGED
@@ -1 +1,2 @@
1
1
  export { makeDummyQueueSockConn, makeDummySockConn } from "./dummyConn.ts";
2
+ export { resolveAsap, resolveNextTick, runAsap } from "./timers.ts";
@@ -0,0 +1,51 @@
1
+ /*
2
+ * This file contains timer functions that support all major JS runtimes
3
+ * (Deno, Bun, Node.js).
4
+ */
5
+
6
+ // This will also work on Deno:
7
+ // https://docs.deno.com/api/node/timers/#namespace_setimmediate
8
+ import { setImmediate } from "node:timers";
9
+
10
+ let taskCounter = 0;
11
+
12
+ /**
13
+ * This function runs a function asynchronously but as soon as possible.
14
+ * In most cases, this means as an additional microtask within the same
15
+ * tick of the event loop via `queueMicrotask()`. However, in order not to
16
+ * block the event loop in case of task loops, every 64 invocations we use
17
+ * `setImmediate()` instead of `queueMicrotask()`.
18
+ *
19
+ * For some reason I do not understand, Deno does not tolerate anything more
20
+ * than 64 subsequent invocations of `queueMicrotask()`. Setting this limit to
21
+ * 100, for example, leads to a constant decrease in actual tick/s. Neither
22
+ * Node nor Bun exhibit the same behavior.
23
+ *
24
+ * See https://nodejs.org/en/learn/asynchronous-work/understanding-setimmediate
25
+ * See https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide
26
+ */
27
+ export const runAsap = (fn: () => void): void => {
28
+ if (taskCounter === 64) {
29
+ taskCounter = 0;
30
+ setImmediate(fn);
31
+ } else {
32
+ taskCounter++;
33
+ queueMicrotask(fn);
34
+ }
35
+ };
36
+
37
+ /**
38
+ * Returns a promise that resolves asynchronously but as soon as possible.
39
+ * Internally, this function uses `runAsap()` to schedule the resolution.
40
+ * See above for more details on the scheduling strategy.
41
+ */
42
+ export const resolveAsap = (): Promise<void> => {
43
+ return new Promise((resolve) => runAsap(resolve));
44
+ };
45
+
46
+ /**
47
+ * Returns a promise that resolves in the next tick of the event loop.
48
+ */
49
+ export const resolveNextTick = (): Promise<void> => {
50
+ return new Promise((resolve) => setImmediate(resolve));
51
+ };
package/dist/bin/mqtt.js CHANGED
@@ -169,7 +169,7 @@ async function subscribe() {
169
169
  }
170
170
  try {
171
171
  await connect(subscribeArgs);
172
- client.subscribe({
172
+ await client.subscribe({
173
173
  subscriptions: [
174
174
  {
175
175
  topicFilter: subscribeArgs.topic,
@@ -1 +1 @@
1
- {"version":3,"file":"mqtt.js","sourceRoot":"","sources":["../../bin/mqtt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mqtt.js","sourceRoot":"","sources":["../../bin/mqtt.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { ConnectPacket, PublishPacket, SockConn, SubscribePacket, TAuthenticationResult } from "./deps.ts";
2
+ import type { TConnectionState } from "./ConnectionState.ts";
2
3
  type ConnectOptions = Omit<ConnectPacket, "type" | "protocolName">;
3
4
  /** ConnectParameters define how to connect */
4
5
  export type ConnectParameters = {
@@ -13,9 +14,11 @@ export type ConnectParameters = {
13
14
  export type PublishParameters = Omit<PublishPacket, "type" | "id" | "protocolLevel">;
14
15
  /** SubscribeParameters define how to subscribe to a topic */
15
16
  export type SubscribeParameters = Omit<SubscribePacket, "type" | "id" | "protocolLevel">;
16
- /** the default MQTT URL to connect to */
17
+ /** the default MQTT URL to connect to */
17
18
  export declare const DEFAULT_URL = "mqtt://localhost:1883/";
19
+ /** the default protocol level to connect with*/
18
20
  export declare const DEFAULT_PROTOCOLLEVEL: import("./deps.ts").ProtocolLevel;
21
+ /** the default keepalive time */
19
22
  export declare const DEFAULT_KEEPALIVE = 60;
20
23
  /**
21
24
  * The Client class provides an MQTT Client that can be used to connect to
@@ -27,6 +30,11 @@ export declare const DEFAULT_KEEPALIVE = 60;
27
30
  * connection type that is supported by the subclass.
28
31
  */
29
32
  export declare class Client {
33
+ onError: (err: Error) => void;
34
+ onPacket: (pkt: PublishPacket) => void | Promise<void>;
35
+ onConnected: () => void;
36
+ onDisconnected: () => void;
37
+ onReconnecting: () => void;
30
38
  protected clientIdPrefix: string;
31
39
  protected numberOfRetries: number;
32
40
  protected url: URL;
@@ -43,6 +51,7 @@ export declare class Client {
43
51
  * Creates a new MQTT client instance
44
52
  */
45
53
  constructor();
54
+ get connectionState(): TConnectionState;
46
55
  /**
47
56
  * Creates a new connection to the MQTT broker
48
57
  * @param protocol - The protocol to use (mqtt, mqtts, etc)
@@ -86,12 +95,7 @@ export declare class Client {
86
95
  * Gets an async iterator for received messages
87
96
  * @returns AsyncGenerator yielding received publish packets
88
97
  */
89
- messages(): AsyncGenerator<PublishPacket, void, unknown>;
90
- /**
91
- * Closes the message stream
92
- * @param reason - Optional reason for closing
93
- */
94
- closeMessages(reason?: string): void;
98
+ messages(): AsyncIterable<PublishPacket>;
95
99
  }
96
100
  export {};
97
101
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../client/client.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,QAAQ,EACR,eAAe,EACf,qBAAqB,EACtB,MAAM,WAAW,CAAC;AAanB,KAAK,cAAc,GAAG,IAAI,CACxB,aAAa,EACb,MAAM,GAAG,cAAc,CACxB,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,CAClC,aAAa,EACb,MAAM,GAAG,IAAI,GAAG,eAAe,CAChC,CAAC;AACF,6DAA6D;AAC7D,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,eAAe,EACf,MAAM,GAAG,IAAI,GAAG,eAAe,CAChC,CAAC;AAqBF,0CAA0C;AAC1C,eAAO,MAAM,WAAW,2BAA2B,CAAC;AACpD,eAAO,MAAM,qBAAqB,mCAAe,CAAC;AAClD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAIpC;;;;;;;;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,oCAAyB;IAChD,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;IAkDvB;;;;OAIG;IACH,OAAO,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwBvE;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D;;;OAGG;IACI,QAAQ,IAAI,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,OAAO,CAAC;IAI/D;;;OAGG;IACH,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM;CAG9B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../client/client.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,QAAQ,EACR,eAAe,EACf,qBAAqB,EACtB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAa7D,KAAK,cAAc,GAAG,IAAI,CACxB,aAAa,EACb,MAAM,GAAG,cAAc,CACxB,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,CAClC,aAAa,EACb,MAAM,GAAG,IAAI,GAAG,eAAe,CAChC,CAAC;AACF,6DAA6D;AAC7D,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,eAAe,EACf,MAAM,GAAG,IAAI,GAAG,eAAe,CAChC,CAAC;AAqBF,yCAAyC;AACzC,eAAO,MAAM,WAAW,2BAA2B,CAAC;AACpD,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,mCAAe,CAAC;AAClD,iCAAiC;AACjC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAIpC;;;;;;;;GAQG;AACH,qBAAa,MAAM;IACV,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAQ;IACrC,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAQ;IAC9D,WAAW,EAAE,MAAM,IAAI,CAAQ;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAQ;IAClC,cAAc,EAAE,MAAM,IAAI,CAAQ;IAEzC,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,oCAAyB;IAChD,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,CAAU;IACrB,OAAO,CAAC,aAAa,CAAC,CAAgB;IAEtC;;OAEG;;IAOH,IAAI,eAAe,IAAI,gBAAgB,CAEtC;IAED;;;;;;;;;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;IAsDvB;;;;OAIG;IACH,OAAO,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwBvE;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D;;;OAGG;IACH,QAAQ,IAAI,aAAa,CAAC,aAAa,CAAC;CAKzC"}