@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.
- package/README.md +5 -5
- package/benchmarks/bombing.ts +35 -0
- package/benchmarks/throughputCounter.ts +31 -0
- package/benchmarks/utils.ts +32 -0
- package/bin/mqtt.ts +1 -1
- package/client/client.ts +33 -17
- package/client/context.ts +33 -18
- package/client/deps.ts +1 -2
- package/client/handlers/handlePublish.ts +2 -2
- package/client/handlers/handlePubrel.ts +1 -1
- package/deno/tcpClient.ts +1 -1
- package/deno/tcpServer.test.ts +0 -1
- package/dev_utils/dummyConn.ts +5 -5
- package/dev_utils/mod.ts +1 -0
- package/dev_utils/timers.ts +51 -0
- package/dist/bin/mqtt.js +1 -1
- package/dist/bin/mqtt.js.map +1 -1
- package/dist/client/client.d.ts +11 -7
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +26 -16
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +7 -5
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/context.js +28 -16
- package/dist/client/context.js.map +1 -1
- package/dist/client/deps.d.ts +1 -2
- package/dist/client/deps.d.ts.map +1 -1
- package/dist/client/deps.js +1 -2
- package/dist/client/deps.js.map +1 -1
- package/dist/client/handlers/handlePublish.js +2 -2
- package/dist/client/handlers/handlePublish.js.map +1 -1
- package/dist/client/handlers/handlePubrel.js +1 -1
- package/dist/client/handlers/handlePubrel.js.map +1 -1
- package/dist/mqttConn/mqttConn.d.ts +2 -7
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +18 -11
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/mqttPacket/auth.d.ts +6 -6
- package/dist/mqttPacket/auth.d.ts.map +1 -1
- package/dist/mqttPacket/auth.js.map +1 -1
- package/dist/mqttPacket/connack.d.ts +4 -4
- package/dist/mqttPacket/connack.d.ts.map +1 -1
- package/dist/mqttPacket/connect.d.ts +3 -3
- package/dist/mqttPacket/connect.d.ts.map +1 -1
- package/dist/mqttPacket/disconnect.d.ts +4 -4
- package/dist/mqttPacket/disconnect.d.ts.map +1 -1
- package/dist/mqttPacket/mod.d.ts +1 -0
- package/dist/mqttPacket/mod.d.ts.map +1 -1
- package/dist/mqttPacket/mod.js +1 -0
- package/dist/mqttPacket/mod.js.map +1 -1
- package/dist/mqttPacket/protocolLevels.d.ts +5 -4
- package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
- package/dist/mqttPacket/protocolLevels.js +1 -1
- package/dist/mqttPacket/protocolLevels.js.map +1 -1
- package/dist/mqttPacket/pubblishAcks.d.ts +15 -8
- package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
- package/dist/mqttPacket/pubblishAcks.js.map +1 -1
- package/dist/mqttPacket/suback.d.ts +4 -4
- package/dist/mqttPacket/suback.d.ts.map +1 -1
- package/dist/mqttPacket/subscribe.d.ts +3 -3
- package/dist/mqttPacket/subscribe.d.ts.map +1 -1
- package/dist/mqttPacket/types.d.ts +3 -0
- package/dist/mqttPacket/types.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.d.ts +4 -4
- package/dist/mqttPacket/unsuback.d.ts.map +1 -1
- package/dist/mqttPacket/unsubscribe.d.ts +3 -3
- package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
- package/dist/mqttPacket/validators.d.ts +15 -0
- package/dist/mqttPacket/validators.d.ts.map +1 -1
- package/dist/mqttPacket/validators.js +15 -0
- package/dist/mqttPacket/validators.js.map +1 -1
- package/dist/node/tcpClient.js +1 -1
- package/dist/node/tcpClient.js.map +1 -1
- package/dist/persistence/memory/memoryPersistence.js +1 -1
- package/dist/persistence/memory/memoryPersistence.js.map +1 -1
- package/dist/utils/{asyncQueue.d.ts → BufferedAsyncIterable.d.ts} +9 -11
- package/dist/utils/BufferedAsyncIterable.d.ts.map +1 -0
- package/dist/utils/BufferedAsyncIterable.js +70 -0
- package/dist/utils/BufferedAsyncIterable.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -15
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +7 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/mod.d.ts +1 -2
- package/dist/utils/mod.d.ts.map +1 -1
- package/dist/utils/mod.js +1 -2
- package/dist/utils/mod.js.map +1 -1
- package/dist/utils/queue.d.ts +43 -0
- package/dist/utils/queue.d.ts.map +1 -0
- package/dist/utils/queue.js +63 -0
- package/dist/utils/queue.js.map +1 -0
- package/dist/utils/utils.d.ts +2 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +6 -0
- package/dist/utils/utils.js.map +1 -0
- package/examples/tcpServer.test.ts +0 -1
- package/mqttConn/mqttConn.test.ts +5 -4
- package/mqttConn/mqttConn.ts +19 -15
- package/mqttPacket/auth.ts +6 -7
- package/mqttPacket/connack.ts +4 -4
- package/mqttPacket/connect.ts +3 -3
- package/mqttPacket/disconnect.ts +4 -4
- package/mqttPacket/mod.ts +1 -0
- package/mqttPacket/protocolLevels.ts +2 -2
- package/mqttPacket/pubblishAcks.ts +15 -9
- package/mqttPacket/suback.ts +4 -4
- package/mqttPacket/subscribe.ts +3 -3
- package/mqttPacket/types.ts +3 -0
- package/mqttPacket/unsuback.ts +4 -4
- package/mqttPacket/unsubscribe.ts +3 -3
- package/mqttPacket/validators.ts +15 -0
- package/node/tcpClient.ts +1 -1
- package/node/tcpServer.test.ts +0 -1
- package/package.json +1 -1
- package/persistence/memory/memoryPersistence.ts +1 -1
- package/server/test/handleConnect.test.ts +11 -8
- package/utils/BufferedAsyncIterable.ts +76 -0
- package/utils/logger.ts +12 -11
- package/utils/mod.ts +1 -2
- package/utils/queue.ts +66 -0
- package/utils/utils.ts +6 -0
- package/dist/utils/asyncQueue.d.ts.map +0 -1
- package/dist/utils/asyncQueue.js +0 -70
- package/dist/utils/asyncQueue.js.map +0 -1
- package/dist/utils/nextTick.d.ts +0 -17
- package/dist/utils/nextTick.d.ts.map +0 -1
- package/dist/utils/nextTick.js +0 -19
- package/dist/utils/nextTick.js.map +0 -1
- package/utils/asyncQueue.ts +0 -75
- 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 [
|
|
23
|
+
provide its own persistence. (see [Architecture](#architecture))
|
|
24
24
|
|
|
25
25
|
## Usage
|
|
26
26
|
|
|
27
|
-
The
|
|
28
|
-
|
|
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
|
|
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
|
|
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
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
|
-
/**
|
|
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
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
259
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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 {
|
|
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
package/deno/tcpServer.test.ts
CHANGED
package/dev_utils/dummyConn.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
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:
|
|
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:
|
|
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:
|
|
100
|
-
w:
|
|
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
|
@@ -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
package/dist/bin/mqtt.js.map
CHANGED
|
@@ -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":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGnD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;AAC/B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAClC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B,MAAM,QAAQ,GAAG;;;;;6DAK4C,CAAC;AAE9D,MAAM,WAAW,GAAG;sDACkC,WAAW;;;;;oEAKG,qBAAqB;;;0EAGf,iBAAiB;;;GAGxF,CAAC;AAEJ,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE;IACzD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACxC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACxC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACtC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACxC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACvC,SAAS,EAAE;QACT,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE;KACtC;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,UAAU,MAAM,CAAC,UAAU,EAAE,EAAE;KACzC;IACD,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;IACxD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE;KAC3C;IACD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;CAC7C,CAAC;AAEX,KAAK,UAAU,OAAO,CAAC,WAAiB;IACtC,MAAM,EACJ,OAAO,EACP,IAAI,EACJ,GAAG,GACJ,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,MAAM,CAAC,OAAO,CAAC;QACnB,GAAG,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC,GAAa,CAAC;QACvC,OAAO;QACP,IAAI;QACJ,GAAG;QACH,OAAO,EAAE;YACP,QAAQ,EAAE,WAAW,CAAC,QAAkB;YACxC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,QAAkB,CAAC;YACnD,QAAQ,EAAE,WAAW,CAAC,QAAkB;YACxC,KAAK,EAAE,CAAC,WAAW,CAAC,OAAO;YAC3B,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;YACxC,aAAa,EAAE,QAAQ,CACrB,WAAW,CAAC,WAAqB,CACjB;SACnB;KACF,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAC,MAAuB;IACvC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC;YACJ,OAAO,CAAC,CAAC;QACX,KAAK,CAAC;YACJ,OAAO,CAAC,CAAC;QACX,KAAK,CAAC;YACJ,OAAO,CAAC,CAAC;QACX;YACE,MAAM;IACV,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,MAAuB;IAC5C,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,WAAiB;IACzC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,MAAgB,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,QAAkB,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,OAAiB,CAAC,CAAC;IAC7D,OAAO;QACL,OAAO;QACP,IAAI;QACJ,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,QAA4B;IAC7C,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,aAAa,GAAG;;;;;EAKpB,WAAW;iCACoB,CAAC;AAElC,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACrC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;CACzC,CAAC;AAEX,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,aAAa,CAAC;QACxB,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,aAAa,EAAE;QAC7C,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IACH,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,aAAa,GAAG,GAAG,CAAC,MAA0C,CAAC;IACrE,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,IAAI,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;QAC7B,MAAM,MAAM,CAAC,SAAS,CAAC;YACrB,aAAa,EAAE;gBACb;oBACE,WAAW,EAAE,aAAa,CAAC,KAAK;oBAChC,GAAG,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAa,CAAC;iBAC3C;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE5B,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAG;;;;;;;EAOlB,WAAW;wCAC2B,CAAC;AAEzC,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACrC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACvC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IACjD,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;CAC/C,CAAC;AAEX,KAAK,UAAU,OAAO;IACpB,MAAM,GAAG,GAAG,aAAa,CAAC;QACxB,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,WAAW,EAAE;QAC3C,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IACH,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,WAAW,GAAG,GAAG,CAAC,MAA0C,CAAC;IACnE,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,OAAO,WAAW,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3B,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAiB,CAAC;YACtD,MAAM,EAAE,WAAW,CAAC,MAAiB;YACrC,GAAG,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAa,CAAC;SACzC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3B,MAAM,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,aAAa,CAAC;QACxB,MAAM,EAAE,KAAK;QACb,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,EAAE,CAAC;YACV,MAAM;QACR,KAAK,WAAW;YACd,SAAS,EAAE,CAAC;YACZ,MAAM;QACR;YACE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,MAAM;IACV,CAAC;AACH,CAAC;AAED,WAAW,EAAE,CAAC"}
|
package/dist/client/client.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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():
|
|
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;
|
|
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"}
|