@seriousme/opifex 2.0.3 → 2.2.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.
- package/client/ConnectionState.ts +1 -1
- package/client/client.ts +41 -9
- package/client/context.ts +11 -13
- package/client/deps.ts +8 -5
- package/client/handlers/handleConnack.ts +2 -2
- package/client/mod.ts +13 -2
- package/client/store/memoryStore.ts +11 -10
- package/client/store/store.ts +1 -1
- package/deno/mod.ts +7 -0
- package/deno/tcpClient.ts +21 -8
- package/deno/tcpServer.ts +21 -4
- package/deno/tlsServer.ts +20 -4
- package/deno/wsServer.ts +23 -0
- package/dist/client/ConnectionState.d.ts +1 -1
- package/dist/client/ConnectionState.d.ts.map +1 -1
- package/dist/client/client.d.ts +39 -9
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +24 -0
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +8 -8
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/context.js.map +1 -1
- package/dist/client/deps.d.ts +3 -3
- package/dist/client/deps.d.ts.map +1 -1
- package/dist/client/deps.js.map +1 -1
- package/dist/client/handlers/handleConnack.d.ts.map +1 -1
- package/dist/client/handlers/handleConnack.js.map +1 -1
- package/dist/client/mod.d.ts +3 -2
- package/dist/client/mod.d.ts.map +1 -1
- package/dist/client/mod.js +1 -1
- package/dist/client/mod.js.map +1 -1
- package/dist/client/store/memoryStore.d.ts +3 -3
- package/dist/client/store/memoryStore.d.ts.map +1 -1
- package/dist/client/store/memoryStore.js +2 -2
- package/dist/client/store/memoryStore.js.map +1 -1
- package/dist/client/store/store.d.ts +1 -1
- package/dist/client/store/store.d.ts.map +1 -1
- package/dist/examples/authHandler.test.js +3 -3
- package/dist/examples/authHandler.test.js.map +1 -1
- package/dist/mqttConn/mqttConn.d.ts +2 -17
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +1 -1
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/mqttPacket/AuthenticationResult.d.ts +4 -0
- package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -1
- package/dist/mqttPacket/AuthenticationResult.js.map +1 -1
- package/dist/mqttPacket/PacketType.d.ts +4 -0
- package/dist/mqttPacket/PacketType.d.ts.map +1 -1
- package/dist/mqttPacket/Properties.d.ts +2 -2
- package/dist/mqttPacket/Properties.d.ts.map +1 -1
- package/dist/mqttPacket/ReasonCode.d.ts +3 -5
- package/dist/mqttPacket/ReasonCode.d.ts.map +1 -1
- package/dist/mqttPacket/ReasonCode.js.map +1 -1
- package/dist/mqttPacket/RetainHandling.d.ts +4 -0
- package/dist/mqttPacket/RetainHandling.d.ts.map +1 -1
- package/dist/mqttPacket/auth.d.ts +6 -5
- package/dist/mqttPacket/auth.d.ts.map +1 -1
- package/dist/mqttPacket/auth.js +2 -2
- package/dist/mqttPacket/auth.js.map +1 -1
- package/dist/mqttPacket/codec.d.ts.map +1 -1
- package/dist/mqttPacket/codec.js.map +1 -1
- package/dist/mqttPacket/connack.d.ts +9 -7
- package/dist/mqttPacket/connack.d.ts.map +1 -1
- package/dist/mqttPacket/connack.js +2 -2
- package/dist/mqttPacket/connack.js.map +1 -1
- package/dist/mqttPacket/connect.d.ts +5 -4
- package/dist/mqttPacket/connect.d.ts.map +1 -1
- package/dist/mqttPacket/connect.js.map +1 -1
- package/dist/mqttPacket/decoder.d.ts +6 -4
- package/dist/mqttPacket/decoder.d.ts.map +1 -1
- package/dist/mqttPacket/decoder.js +1 -1
- package/dist/mqttPacket/decoder.js.map +1 -1
- package/dist/mqttPacket/disconnect.d.ts +7 -5
- package/dist/mqttPacket/disconnect.d.ts.map +1 -1
- package/dist/mqttPacket/disconnect.js +2 -2
- package/dist/mqttPacket/disconnect.js.map +1 -1
- package/dist/mqttPacket/encoder.d.ts +7 -5
- package/dist/mqttPacket/encoder.d.ts.map +1 -1
- package/dist/mqttPacket/encoder.js +1 -1
- package/dist/mqttPacket/encoder.js.map +1 -1
- package/dist/mqttPacket/mod.d.ts +1 -1
- package/dist/mqttPacket/mod.d.ts.map +1 -1
- package/dist/mqttPacket/pingreq.d.ts +4 -3
- package/dist/mqttPacket/pingreq.d.ts.map +1 -1
- package/dist/mqttPacket/pingreq.js.map +1 -1
- package/dist/mqttPacket/pingres.d.ts +4 -3
- package/dist/mqttPacket/pingres.d.ts.map +1 -1
- package/dist/mqttPacket/pingres.js.map +1 -1
- package/dist/mqttPacket/protocolLevels.d.ts +2 -0
- package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
- package/dist/mqttPacket/pubblishAcks.d.ts +7 -7
- package/dist/mqttPacket/pubblishAcks.d.ts.map +1 -1
- package/dist/mqttPacket/pubblishAcks.js +2 -2
- package/dist/mqttPacket/pubblishAcks.js.map +1 -1
- package/dist/mqttPacket/publish.d.ts +5 -4
- package/dist/mqttPacket/publish.d.ts.map +1 -1
- package/dist/mqttPacket/publish.js.map +1 -1
- package/dist/mqttPacket/suback.d.ts +7 -5
- package/dist/mqttPacket/suback.d.ts.map +1 -1
- package/dist/mqttPacket/suback.js +2 -2
- package/dist/mqttPacket/suback.js.map +1 -1
- package/dist/mqttPacket/subscribe.d.ts +7 -5
- package/dist/mqttPacket/subscribe.d.ts.map +1 -1
- package/dist/mqttPacket/subscribe.js.map +1 -1
- package/dist/mqttPacket/types.d.ts +1 -21
- package/dist/mqttPacket/types.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.d.ts +7 -5
- package/dist/mqttPacket/unsuback.d.ts.map +1 -1
- package/dist/mqttPacket/unsuback.js +1 -1
- package/dist/mqttPacket/unsuback.js.map +1 -1
- package/dist/mqttPacket/unsubscribe.d.ts +5 -4
- package/dist/mqttPacket/unsubscribe.d.ts.map +1 -1
- package/dist/mqttPacket/unsubscribe.js.map +1 -1
- package/dist/node/tcpClient.d.ts +21 -1
- package/dist/node/tcpClient.d.ts.map +1 -1
- package/dist/node/tcpClient.js +18 -4
- package/dist/node/tcpClient.js.map +1 -1
- package/dist/node/tcpServer.d.ts +18 -0
- package/dist/node/tcpServer.d.ts.map +1 -1
- package/dist/node/tcpServer.js +17 -2
- package/dist/node/tcpServer.js.map +1 -1
- package/dist/node/tlsServer.d.ts +18 -0
- package/dist/node/tlsServer.d.ts.map +1 -1
- package/dist/node/tlsServer.js +17 -2
- package/dist/node/tlsServer.js.map +1 -1
- package/dist/persistence/basicPersistence.d.ts +4 -4
- package/dist/persistence/basicPersistence.d.ts.map +1 -1
- package/dist/persistence/basicPersistence.js.map +1 -1
- package/dist/persistence/deps.d.ts +1 -1
- package/dist/persistence/deps.d.ts.map +1 -1
- package/dist/persistence/memory/memoryStorage.d.ts +3 -3
- package/dist/persistence/memory/memoryStorage.d.ts.map +1 -1
- package/dist/persistence/mod.d.ts +1 -1
- package/dist/persistence/mod.d.ts.map +1 -1
- package/dist/persistence/persistence.d.ts +3 -3
- package/dist/persistence/persistence.d.ts.map +1 -1
- package/dist/persistence/sqlite/sqliteStorage.d.ts +2 -2
- package/dist/persistence/sqlite/sqliteStorage.d.ts.map +1 -1
- package/dist/persistence/storage.d.ts +1 -1
- package/dist/persistence/storage.d.ts.map +1 -1
- package/dist/server/context.d.ts +4 -4
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js.map +1 -1
- package/dist/server/deps.d.ts +2 -2
- package/dist/server/deps.d.ts.map +1 -1
- package/dist/server/deps.js.map +1 -1
- package/dist/server/handlers/completeConnect.d.ts +3 -2
- package/dist/server/handlers/completeConnect.d.ts.map +1 -1
- package/dist/server/handlers/completeConnect.js.map +1 -1
- package/dist/server/handlers/handlePublish.d.ts.map +1 -1
- package/dist/server/handlers/handlePublish.js.map +1 -1
- package/dist/server/handlers/handleSubscribe.d.ts.map +1 -1
- package/dist/server/handlers/handleSubscribe.js.map +1 -1
- package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -1
- package/dist/server/handlers/handleUnsubscribe.js.map +1 -1
- package/dist/server/mod.d.ts +1 -1
- package/dist/server/mod.d.ts.map +1 -1
- package/dist/server/server.d.ts +3 -3
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js.map +1 -1
- package/dist/socket/socket.d.ts +22 -0
- package/dist/socket/socket.d.ts.map +1 -1
- package/dist/socket/socket.js +5 -0
- package/dist/socket/socket.js.map +1 -1
- package/dist/utils/logger.d.ts +3 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/web/wsClient.d.ts +12 -0
- package/dist/web/wsClient.d.ts.map +1 -1
- package/dist/web/wsClient.js +12 -1
- package/dist/web/wsClient.js.map +1 -1
- package/examples/authHandler.test.ts +3 -3
- package/mqttConn/mqttConn.ts +2 -18
- package/mqttPacket/AuthenticationResult.ts +6 -0
- package/mqttPacket/PacketType.ts +5 -0
- package/mqttPacket/Properties.ts +2 -2
- package/mqttPacket/ReasonCode.ts +6 -8
- package/mqttPacket/RetainHandling.ts +5 -0
- package/mqttPacket/auth.ts +7 -7
- package/mqttPacket/codec.ts +3 -2
- package/mqttPacket/connack.ts +11 -10
- package/mqttPacket/connect.ts +4 -11
- package/mqttPacket/decoder.ts +9 -11
- package/mqttPacket/disconnect.ts +7 -7
- package/mqttPacket/encoder.test.ts +2 -2
- package/mqttPacket/encoder.ts +9 -7
- package/mqttPacket/mod.ts +0 -4
- package/mqttPacket/pingreq.ts +3 -3
- package/mqttPacket/pingres.ts +3 -3
- package/mqttPacket/protocolLevels.ts +2 -0
- package/mqttPacket/pubblishAcks.ts +9 -9
- package/mqttPacket/publish.ts +4 -11
- package/mqttPacket/publishAcks.test.ts +3 -3
- package/mqttPacket/suback.ts +8 -13
- package/mqttPacket/subscribe.ts +6 -12
- package/mqttPacket/types.ts +1 -26
- package/mqttPacket/unsuback.ts +8 -7
- package/mqttPacket/unsubscribe.ts +4 -10
- package/node/mod.ts +7 -0
- package/node/tcpClient.ts +21 -6
- package/node/tcpServer.ts +23 -6
- package/node/tlsServer.ts +23 -7
- package/package.json +6 -1
- package/persistence/basicPersistence.ts +5 -5
- package/persistence/deps.ts +1 -1
- package/persistence/memory/memoryStorage.ts +3 -3
- package/persistence/mod.ts +1 -1
- package/persistence/persistence.testing.ts +4 -4
- package/persistence/persistence.ts +3 -3
- package/persistence/sqlite/sqliteStorage.ts +2 -2
- package/persistence/storage.ts +1 -1
- package/server/context.ts +5 -5
- package/server/deps.ts +1 -2
- package/server/handlers/completeConnect.ts +2 -2
- package/server/handlers/handlePublish.ts +3 -4
- package/server/handlers/handleSubscribe.ts +3 -4
- package/server/handlers/handleUnsubscribe.ts +2 -2
- package/server/mod.ts +1 -1
- package/server/server.ts +3 -3
- package/socket/socket.ts +31 -2
- package/tools/benchmarks/receiver.ts +2 -2
- package/tools/benchmarks/sender.ts +2 -2
- package/utils/logger.ts +3 -3
- package/web/wsClient.ts +13 -1
package/client/client.ts
CHANGED
|
@@ -8,19 +8,20 @@ import {
|
|
|
8
8
|
} from "./deps.ts";
|
|
9
9
|
|
|
10
10
|
import type {
|
|
11
|
+
AuthenticationResult,
|
|
11
12
|
ConnectPacket,
|
|
12
|
-
|
|
13
|
+
ProtocolLevel,
|
|
13
14
|
PublishPacket,
|
|
14
15
|
SockConn,
|
|
16
|
+
Store,
|
|
15
17
|
SubscribePacket,
|
|
16
|
-
TAuthenticationResult,
|
|
17
18
|
} from "./deps.ts";
|
|
18
19
|
|
|
19
20
|
import { noop } from "../utils/mod.ts";
|
|
20
21
|
|
|
21
22
|
import { Context } from "./context.ts";
|
|
22
23
|
import type { AuthenticatedResult } from "./context.ts";
|
|
23
|
-
import type {
|
|
24
|
+
import type { ConnectionState } from "./ConnectionState.ts";
|
|
24
25
|
import { BufferedAsyncIterable } from "./deps.ts";
|
|
25
26
|
|
|
26
27
|
/**
|
|
@@ -32,18 +33,25 @@ function generateClientId(prefix: string): string {
|
|
|
32
33
|
return `${prefix}-${Math.random().toString().slice(-10)}`;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
type
|
|
36
|
+
/** All properties of a connect packet, except for type and protocol name */
|
|
37
|
+
export type ConnectOptions = Omit<
|
|
36
38
|
ConnectPacket,
|
|
37
39
|
"type" | "protocolName"
|
|
38
40
|
>;
|
|
39
41
|
|
|
40
42
|
/** ConnectParameters define how to connect */
|
|
41
43
|
export type ConnectParameters = {
|
|
44
|
+
/** the URL to connect to */
|
|
42
45
|
url?: URL | undefined;
|
|
46
|
+
/** any CA Certs to trust */
|
|
43
47
|
caCerts?: string[] | undefined;
|
|
48
|
+
/** the clients certificate */
|
|
44
49
|
cert?: string | undefined;
|
|
50
|
+
/** the clients private key*/
|
|
45
51
|
key?: string | undefined;
|
|
52
|
+
/** number of retries before stopping connection attempts */
|
|
46
53
|
numberOfRetries?: number | undefined;
|
|
54
|
+
/** connect options */
|
|
47
55
|
options?: ConnectOptions | undefined;
|
|
48
56
|
};
|
|
49
57
|
|
|
@@ -80,7 +88,7 @@ function backOffSleep(random: boolean, attempt: number): Promise<void> {
|
|
|
80
88
|
/** the default MQTT URL to connect to */
|
|
81
89
|
export const DEFAULT_URL = "mqtt://localhost:1883/";
|
|
82
90
|
/** the default protocol level to connect with*/
|
|
83
|
-
export const DEFAULT_PROTOCOLLEVEL = MQTTLevel.v4;
|
|
91
|
+
export const DEFAULT_PROTOCOLLEVEL = MQTTLevel.v4 as ProtocolLevel;
|
|
84
92
|
/** the default keepalive time */
|
|
85
93
|
export const DEFAULT_KEEPALIVE = 60; // 60 seconds
|
|
86
94
|
const DEFAULT_RETRIES = 3; // on first connect
|
|
@@ -110,6 +118,7 @@ function normalizeError(err: unknown): Error {
|
|
|
110
118
|
* connection type that is supported by the subclass.
|
|
111
119
|
*/
|
|
112
120
|
export class Client {
|
|
121
|
+
/** callback to handle v5 extended authentication, see /examples folder */
|
|
113
122
|
public onAuth: (
|
|
114
123
|
authMethod: string,
|
|
115
124
|
authData: Uint8Array,
|
|
@@ -119,21 +128,36 @@ export class Client {
|
|
|
119
128
|
reasonString: "No authentication method configured",
|
|
120
129
|
};
|
|
121
130
|
};
|
|
131
|
+
/** callback for errors */
|
|
122
132
|
public onError: (err: Error) => void = noop;
|
|
133
|
+
/** callback for publish packets */
|
|
123
134
|
public onPacket: (pkt: PublishPacket) => void | Promise<void> = noop;
|
|
135
|
+
/** callback once connected */
|
|
124
136
|
public onConnected: () => void = noop;
|
|
137
|
+
/** callback once disconnected */
|
|
125
138
|
public onDisconnected: () => void = noop;
|
|
139
|
+
/** callback when reconnecting */
|
|
126
140
|
public onReconnecting: () => void = noop;
|
|
127
141
|
|
|
142
|
+
/** clientId prefix used when automatically generating a client Id */
|
|
128
143
|
protected clientIdPrefix = CLIENTID_PREFIX;
|
|
144
|
+
/** number of times to retry connect */
|
|
129
145
|
protected numberOfRetries = DEFAULT_RETRIES;
|
|
146
|
+
/** the URL to connect to */
|
|
130
147
|
protected connectUrl: URL = new URL(DEFAULT_URL);
|
|
148
|
+
/** the keepAlive value in number of seconds */
|
|
131
149
|
protected keepAlive = DEFAULT_KEEPALIVE;
|
|
150
|
+
/** the requested protocol level */
|
|
132
151
|
protected protocolLevel = DEFAULT_PROTOCOLLEVEL;
|
|
152
|
+
/** try auto reconnect if connection is lost */
|
|
133
153
|
protected autoReconnect = true;
|
|
154
|
+
/** any CA Certs to trust */
|
|
134
155
|
protected caCerts?: string[] | undefined;
|
|
156
|
+
/** the clients certificate */
|
|
135
157
|
protected cert?: string | undefined;
|
|
158
|
+
/** the clients private key*/
|
|
136
159
|
protected key?: string | undefined;
|
|
160
|
+
/** the MQTT clientId */
|
|
137
161
|
protected clientId: string;
|
|
138
162
|
private ctx: Context;
|
|
139
163
|
private connectPacket?: ConnectPacket;
|
|
@@ -141,17 +165,25 @@ export class Client {
|
|
|
141
165
|
/**
|
|
142
166
|
* Creates a new MQTT client instance
|
|
143
167
|
*/
|
|
144
|
-
constructor(store?:
|
|
168
|
+
constructor(store?: Store) {
|
|
145
169
|
const cStore = store ? store : new MemoryStore();
|
|
146
170
|
this.ctx = new Context(cStore, this);
|
|
147
171
|
this.clientId = generateClientId(this.clientIdPrefix);
|
|
148
172
|
this.numberOfRetries = DEFAULT_RETRIES;
|
|
149
173
|
}
|
|
150
174
|
|
|
151
|
-
|
|
175
|
+
/**
|
|
176
|
+
* Current connection state
|
|
177
|
+
* @returns connectionState as ConnectionState
|
|
178
|
+
*/
|
|
179
|
+
public get connectionState(): ConnectionState {
|
|
152
180
|
return this.ctx.connectionState;
|
|
153
181
|
}
|
|
154
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Current configured connection URL
|
|
185
|
+
* @returns URL object
|
|
186
|
+
*/
|
|
155
187
|
public get url(): URL {
|
|
156
188
|
return this.connectUrl;
|
|
157
189
|
}
|
|
@@ -222,7 +254,7 @@ export class Client {
|
|
|
222
254
|
* @param params - Connection parameters
|
|
223
255
|
* @returns Promise resolving to authentication result
|
|
224
256
|
*/
|
|
225
|
-
connect(params: ConnectParameters = {}): Promise<
|
|
257
|
+
connect(params: ConnectParameters = {}): Promise<AuthenticationResult> {
|
|
226
258
|
this.connectUrl = params?.url || this.connectUrl;
|
|
227
259
|
this.numberOfRetries = params.numberOfRetries || this.numberOfRetries;
|
|
228
260
|
this.caCerts = params?.caCerts;
|
|
@@ -240,7 +272,7 @@ export class Client {
|
|
|
240
272
|
type: PacketType.connect,
|
|
241
273
|
...options,
|
|
242
274
|
};
|
|
243
|
-
const deferred = new Deferred<
|
|
275
|
+
const deferred = new Deferred<AuthenticationResult>();
|
|
244
276
|
this.ctx.unresolvedConnect = deferred;
|
|
245
277
|
this.doConnect();
|
|
246
278
|
return deferred.promise;
|
package/client/context.ts
CHANGED
|
@@ -8,22 +8,20 @@ import {
|
|
|
8
8
|
} from "./deps.ts";
|
|
9
9
|
import type {
|
|
10
10
|
AnyPacket,
|
|
11
|
+
AuthenticationResult,
|
|
11
12
|
ConnectPacket,
|
|
12
|
-
IStore,
|
|
13
13
|
PacketId,
|
|
14
14
|
ProtocolLevel,
|
|
15
15
|
PublishPacket,
|
|
16
|
+
ReasonCode,
|
|
16
17
|
ReturnCodes,
|
|
17
18
|
SockConn,
|
|
19
|
+
Store,
|
|
18
20
|
SubscribePacket,
|
|
19
|
-
TAuthenticationResult,
|
|
20
|
-
TPacketType,
|
|
21
|
-
TReasonCode,
|
|
22
21
|
UnsubscribePacket,
|
|
23
22
|
} from "./deps.ts";
|
|
24
23
|
|
|
25
24
|
import { handlePacket } from "./handlers/handlePacket.ts";
|
|
26
|
-
import type { TConnectionState } from "./ConnectionState.ts";
|
|
27
25
|
import { ConnectionState } from "./ConnectionState.ts";
|
|
28
26
|
import type { Client } from "./client.ts";
|
|
29
27
|
import { assert } from "../utils/assert.ts";
|
|
@@ -31,7 +29,7 @@ import { assert } from "../utils/assert.ts";
|
|
|
31
29
|
/**
|
|
32
30
|
* packets not allowed during authentication
|
|
33
31
|
*/
|
|
34
|
-
function blockedDuringAuthentication(pktType:
|
|
32
|
+
function blockedDuringAuthentication(pktType: PacketType) {
|
|
35
33
|
return (
|
|
36
34
|
pktType === PacketType.publish ||
|
|
37
35
|
pktType === PacketType.subscribe ||
|
|
@@ -41,24 +39,24 @@ function blockedDuringAuthentication(pktType: TPacketType) {
|
|
|
41
39
|
|
|
42
40
|
/** Possible results from authHandler */
|
|
43
41
|
export type AuthenticatedResult = {
|
|
44
|
-
reasonCode:
|
|
42
|
+
reasonCode: ReasonCode;
|
|
45
43
|
reasonString?: string;
|
|
46
44
|
authData?: Uint8Array;
|
|
47
45
|
};
|
|
48
46
|
|
|
49
47
|
export class Context {
|
|
50
48
|
mqttConn?: MqttConn;
|
|
51
|
-
#connectionState:
|
|
49
|
+
#connectionState: ConnectionState;
|
|
52
50
|
protocolLevel: ProtocolLevel;
|
|
53
51
|
pingTimer?: Timer;
|
|
54
|
-
unresolvedConnect?: Deferred<
|
|
52
|
+
unresolvedConnect?: Deferred<AuthenticationResult>;
|
|
55
53
|
unresolvedPublish: Map<PacketId, Deferred<void>>;
|
|
56
54
|
unresolvedSubscribe: Map<PacketId, Deferred<ReturnCodes>>;
|
|
57
55
|
unresolvedUnSubscribe: Map<PacketId, Deferred<void>>;
|
|
58
|
-
store:
|
|
56
|
+
store: Store;
|
|
59
57
|
#client: Client;
|
|
60
58
|
|
|
61
|
-
constructor(store:
|
|
59
|
+
constructor(store: Store, client: Client) {
|
|
62
60
|
this.#client = client;
|
|
63
61
|
this.store = store;
|
|
64
62
|
this.#connectionState = ConnectionState.offline;
|
|
@@ -68,11 +66,11 @@ export class Context {
|
|
|
68
66
|
this.unresolvedUnSubscribe = new Map();
|
|
69
67
|
}
|
|
70
68
|
|
|
71
|
-
get connectionState():
|
|
69
|
+
get connectionState(): ConnectionState {
|
|
72
70
|
return this.#connectionState;
|
|
73
71
|
}
|
|
74
72
|
|
|
75
|
-
set connectionState(state:
|
|
73
|
+
set connectionState(state: ConnectionState) {
|
|
76
74
|
this.#connectionState = state;
|
|
77
75
|
switch (state) {
|
|
78
76
|
case "connected":
|
package/client/deps.ts
CHANGED
|
@@ -17,10 +17,7 @@ export type {
|
|
|
17
17
|
ReturnCodes,
|
|
18
18
|
SubackPacket,
|
|
19
19
|
SubscribePacket,
|
|
20
|
-
TAuthenticationResult,
|
|
21
20
|
Topic,
|
|
22
|
-
TPacketType,
|
|
23
|
-
TReasonCode,
|
|
24
21
|
UnsubackPacket,
|
|
25
22
|
UnsubscribePacket,
|
|
26
23
|
} from "../mqttPacket/mod.ts";
|
|
@@ -38,8 +35,14 @@ export {
|
|
|
38
35
|
} from "../mqttPacket/mod.ts";
|
|
39
36
|
|
|
40
37
|
export { MqttConn } from "../mqttConn/mqttConn.ts";
|
|
41
|
-
export type {
|
|
38
|
+
export type {
|
|
39
|
+
NetAddr,
|
|
40
|
+
SockAddr,
|
|
41
|
+
SockConn,
|
|
42
|
+
UnixAddr,
|
|
43
|
+
VsockAddr,
|
|
44
|
+
} from "../socket/socket.ts";
|
|
42
45
|
export { Timer } from "../timer/timer.ts";
|
|
43
46
|
export { BufferedAsyncIterable, Deferred, logger } from "../utils/mod.ts";
|
|
44
47
|
export { MemoryStore } from "./store/memoryStore.ts";
|
|
45
|
-
export type {
|
|
48
|
+
export type { Store } from "./store/store.ts";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Context } from "../context.ts";
|
|
2
2
|
import { ConnectionState } from "../ConnectionState.ts";
|
|
3
3
|
import { AuthenticationResultByNumber, ReasonCodeByNumber } from "../deps.ts";
|
|
4
|
-
import type { ConnackPacket,
|
|
4
|
+
import type { ConnackPacket, ReasonCode } from "../deps.ts";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Handles the CONNACK packet received from the MQTT broker
|
|
@@ -38,7 +38,7 @@ export async function handleConnack(ctx: Context, packet: ConnackPacket) {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
const errMsg = packet.protocolLevel === 5
|
|
41
|
-
? ReasonCodeByNumber[result as
|
|
41
|
+
? ReasonCodeByNumber[result as ReasonCode]
|
|
42
42
|
: AuthenticationResultByNumber[result];
|
|
43
43
|
|
|
44
44
|
const err = new Error(
|
package/client/mod.ts
CHANGED
|
@@ -8,10 +8,21 @@ export {
|
|
|
8
8
|
DEFAULT_PROTOCOLLEVEL,
|
|
9
9
|
DEFAULT_URL,
|
|
10
10
|
} from "./client.ts";
|
|
11
|
-
export { MQTTLevel, ReasonCode } from "./deps.ts";
|
|
12
|
-
export type {
|
|
11
|
+
export { logger, MQTTLevel, ReasonCode } from "./deps.ts";
|
|
12
|
+
export type {
|
|
13
|
+
AuthenticationResult,
|
|
14
|
+
NetAddr,
|
|
15
|
+
ProtocolLevel,
|
|
16
|
+
QoS,
|
|
17
|
+
SockAddr,
|
|
18
|
+
SockConn,
|
|
19
|
+
UnixAddr,
|
|
20
|
+
VsockAddr,
|
|
21
|
+
} from "./deps.ts";
|
|
13
22
|
export type {
|
|
14
23
|
ConnectParameters,
|
|
15
24
|
PublishParameters,
|
|
16
25
|
SubscribeParameters,
|
|
17
26
|
} from "./client.ts";
|
|
27
|
+
|
|
28
|
+
export type { ConnectionState } from "./ConnectionState.ts";
|
|
@@ -5,20 +5,21 @@
|
|
|
5
5
|
import { assert } from "./deps.ts";
|
|
6
6
|
import type { PacketId } from "./deps.ts";
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
import { MAX_PACKET_ID } from "./store.ts";
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
PacketStore,
|
|
12
|
+
PendingAckOutgoing,
|
|
13
|
+
pendingIncoming,
|
|
14
|
+
PendingOutgoing,
|
|
15
|
+
PendingOutgoingPackets,
|
|
16
|
+
Store,
|
|
16
17
|
} from "./store.ts";
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
|
-
* In-memory implementation of the
|
|
20
|
+
* In-memory implementation of the Store interface for managing MQTT packet storage
|
|
20
21
|
*/
|
|
21
|
-
export class MemoryStore implements
|
|
22
|
+
export class MemoryStore implements Store {
|
|
22
23
|
/** Current packet ID counter */
|
|
23
24
|
private packetId: PacketId;
|
|
24
25
|
|
package/client/store/store.ts
CHANGED
|
@@ -46,7 +46,7 @@ export type PendingOutgoingPackets = PendingAckOutgoing | PendingOutgoing;
|
|
|
46
46
|
/**
|
|
47
47
|
* Interface defining the storage requirements for MQTT packet state management
|
|
48
48
|
*/
|
|
49
|
-
export interface
|
|
49
|
+
export interface Store {
|
|
50
50
|
/** Store for incoming packets pending processing */
|
|
51
51
|
pendingIncoming: PacketStore<pendingIncoming>;
|
|
52
52
|
|
package/deno/mod.ts
ADDED
package/deno/tcpClient.ts
CHANGED
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
* it extends the platform agnostic Client class
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { logger } from "../client/
|
|
8
|
-
import type { SockConn } from "../client/
|
|
6
|
+
|
|
7
|
+
import { Client, logger } from "../client/mod.ts";
|
|
8
|
+
import type { SockConn } from "../client/mod.ts";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Fetches data from a file and returns it as a string
|
|
12
|
+
*
|
|
12
13
|
* @param filename
|
|
13
14
|
* @returns Promise
|
|
14
15
|
*
|
|
15
|
-
* Fetches data from a file and returns it as a string
|
|
16
16
|
* @example
|
|
17
17
|
* const data = await getFileData("data.txt");
|
|
18
18
|
*/
|
|
@@ -29,12 +29,16 @@ export async function getFileData(
|
|
|
29
29
|
return data;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
*
|
|
32
|
+
/**
|
|
33
|
+
* TcpClient extends the Client class to provide TCP based clients
|
|
34
34
|
* it is used by the MQTTclient to connect to the broker
|
|
35
35
|
* see mqtt.ts in the /bin folder as an example
|
|
36
36
|
*/
|
|
37
37
|
export class TcpClient extends Client {
|
|
38
|
+
/** Connect using MQTT over TCP
|
|
39
|
+
* @param hostname the name of the host to connect to
|
|
40
|
+
* @param port the port number
|
|
41
|
+
*/
|
|
38
42
|
protected async connectMQTT(
|
|
39
43
|
hostname: string,
|
|
40
44
|
port = 1883,
|
|
@@ -43,6 +47,15 @@ export class TcpClient extends Client {
|
|
|
43
47
|
return await Deno.connect({ hostname, port });
|
|
44
48
|
}
|
|
45
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Connect using MQTT over TLS
|
|
52
|
+
* @param hostname the name of the host to connect to
|
|
53
|
+
* @param port the port number
|
|
54
|
+
* @param caCerts the CA certificates to trust
|
|
55
|
+
* @param cert the clients certificate
|
|
56
|
+
* @param key the clients private key
|
|
57
|
+
* @returns a Deno.TlsConn object
|
|
58
|
+
*/
|
|
46
59
|
protected async connectMQTTS(
|
|
47
60
|
hostname: string,
|
|
48
61
|
port = 8883,
|
|
@@ -61,7 +74,7 @@ export class TcpClient extends Client {
|
|
|
61
74
|
return await Deno.connectTls(connectOpts);
|
|
62
75
|
}
|
|
63
76
|
|
|
64
|
-
|
|
77
|
+
/** createConn is used by the base client class */
|
|
65
78
|
protected override createConn(): Promise<SockConn> {
|
|
66
79
|
const { protocol, hostname, port: portStr } = this.connectUrl;
|
|
67
80
|
const port = Number(portStr);
|
package/deno/tcpServer.ts
CHANGED
|
@@ -7,12 +7,16 @@
|
|
|
7
7
|
import { MqttServer } from "../server/mod.ts";
|
|
8
8
|
import type { MqttServerOptions } from "../server/mod.ts";
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
* TCP server that wraps a MqttServer, see
|
|
10
|
+
/**
|
|
11
|
+
* TCP server that wraps a MqttServer, see the /examples folder
|
|
12
12
|
*/
|
|
13
13
|
export class TcpServer {
|
|
14
14
|
private listener: Deno.Listener<Deno.Conn>;
|
|
15
15
|
private mqttServer: MqttServer;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Create a new TCP server
|
|
19
|
+
*/
|
|
16
20
|
constructor(
|
|
17
21
|
serverOptions: Deno.TcpListenOptions,
|
|
18
22
|
mqttOptions: MqttServerOptions,
|
|
@@ -21,16 +25,26 @@ export class TcpServer {
|
|
|
21
25
|
this.mqttServer = new MqttServer(mqttOptions);
|
|
22
26
|
}
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Start listening
|
|
30
|
+
*/
|
|
31
|
+
async start(): Promise<void> {
|
|
25
32
|
for await (const conn of this.listener) {
|
|
26
33
|
this.mqttServer.serve(conn);
|
|
27
34
|
}
|
|
28
35
|
}
|
|
29
|
-
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Stop listening
|
|
39
|
+
*/
|
|
40
|
+
stop(): void {
|
|
30
41
|
this.mqttServer.close(true);
|
|
31
42
|
this.listener.close();
|
|
32
43
|
}
|
|
33
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The port number the server is listening on
|
|
47
|
+
*/
|
|
34
48
|
get port(): number | undefined {
|
|
35
49
|
// deno-coverage-ignore-start
|
|
36
50
|
if (this.listener.addr.transport === "tcp") {
|
|
@@ -40,6 +54,9 @@ export class TcpServer {
|
|
|
40
54
|
// deno-coverage-ignore-stop
|
|
41
55
|
}
|
|
42
56
|
|
|
57
|
+
/**
|
|
58
|
+
* The address the server is listening on
|
|
59
|
+
*/
|
|
43
60
|
get address(): string | undefined {
|
|
44
61
|
// deno-coverage-ignore-start
|
|
45
62
|
if (this.listener.addr.transport === "tcp") {
|
package/deno/tlsServer.ts
CHANGED
|
@@ -7,12 +7,15 @@
|
|
|
7
7
|
import { MqttServer } from "../server/mod.ts";
|
|
8
8
|
import type { MqttServerOptions } from "../server/mod.ts";
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
*
|
|
10
|
+
/**
|
|
11
|
+
* TLS server that wraps a MqttServer, see the /examples folder
|
|
12
12
|
*/
|
|
13
13
|
export class TlsServer {
|
|
14
14
|
private listener: Deno.TlsListener;
|
|
15
15
|
private mqttServer: MqttServer;
|
|
16
|
+
/**
|
|
17
|
+
* Create a new TLS server
|
|
18
|
+
*/
|
|
16
19
|
constructor(
|
|
17
20
|
serverOptions: Deno.ListenTlsOptions & Deno.TlsCertifiedKeyPem,
|
|
18
21
|
mqttOptions: MqttServerOptions,
|
|
@@ -21,20 +24,33 @@ export class TlsServer {
|
|
|
21
24
|
this.mqttServer = new MqttServer(mqttOptions);
|
|
22
25
|
}
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Start listening
|
|
29
|
+
*/
|
|
30
|
+
async start(): Promise<void> {
|
|
25
31
|
for await (const conn of this.listener) {
|
|
26
32
|
this.mqttServer.serve(conn);
|
|
27
33
|
}
|
|
28
34
|
}
|
|
29
|
-
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Stop listening
|
|
38
|
+
*/
|
|
39
|
+
stop(): void {
|
|
30
40
|
this.mqttServer.close();
|
|
31
41
|
this.listener.close();
|
|
32
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* The port number the server is listening on
|
|
45
|
+
*/
|
|
33
46
|
// deno-coverage-ignore-start
|
|
34
47
|
get port(): number | undefined {
|
|
35
48
|
return this.listener.addr.port;
|
|
36
49
|
}
|
|
37
50
|
|
|
51
|
+
/**
|
|
52
|
+
* The address the server is listening on
|
|
53
|
+
*/
|
|
38
54
|
get address(): string | undefined {
|
|
39
55
|
return this.listener.addr.hostname;
|
|
40
56
|
}
|
package/deno/wsServer.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This a Deno specific implementation of a WebSocket server
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
1
5
|
import { MqttServer } from "../server/mod.ts";
|
|
2
6
|
import type { MqttServerOptions } from "../server/mod.ts";
|
|
3
7
|
import { logger } from "../utils/logger.ts";
|
|
4
8
|
import { wrapWebSocket } from "../web/wrapWebSocket.ts";
|
|
5
9
|
import type { HostnamePort } from "../web/wrapWebSocket.ts";
|
|
6
10
|
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket server that wraps a MqttServer, see the /examples folder
|
|
13
|
+
*/
|
|
7
14
|
export class WsServer {
|
|
8
15
|
private server?: Deno.HttpServer;
|
|
9
16
|
private mqttServer: MqttServer;
|
|
@@ -12,6 +19,9 @@ export class WsServer {
|
|
|
12
19
|
hostname?: string;
|
|
13
20
|
};
|
|
14
21
|
|
|
22
|
+
/**
|
|
23
|
+
* Create a new WebSocket server
|
|
24
|
+
*/
|
|
15
25
|
constructor(
|
|
16
26
|
serverOptions: Deno.ServeOptions & { port: number; hostname?: string },
|
|
17
27
|
mqttOptions: MqttServerOptions,
|
|
@@ -19,6 +29,7 @@ export class WsServer {
|
|
|
19
29
|
this.listenOptions = serverOptions;
|
|
20
30
|
this.mqttServer = new MqttServer(mqttOptions);
|
|
21
31
|
}
|
|
32
|
+
|
|
22
33
|
private async handleWsClient(socket: WebSocket, remoteAddr: HostnamePort) {
|
|
23
34
|
const conn = await wrapWebSocket(socket, remoteAddr);
|
|
24
35
|
logger.debug("created conn");
|
|
@@ -26,6 +37,9 @@ export class WsServer {
|
|
|
26
37
|
logger.debug("serving mqtt");
|
|
27
38
|
}
|
|
28
39
|
|
|
40
|
+
/**
|
|
41
|
+
* Start listening
|
|
42
|
+
*/
|
|
29
43
|
async start(): Promise<void> {
|
|
30
44
|
this.server = Deno.serve(this.listenOptions, (req, info) => {
|
|
31
45
|
const { hostname, port } = info.remoteAddr;
|
|
@@ -46,6 +60,9 @@ export class WsServer {
|
|
|
46
60
|
await this.server.finished;
|
|
47
61
|
}
|
|
48
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Stop listening
|
|
65
|
+
*/
|
|
49
66
|
stop(): void {
|
|
50
67
|
this.mqttServer.close(true);
|
|
51
68
|
if (this.server) {
|
|
@@ -53,6 +70,9 @@ export class WsServer {
|
|
|
53
70
|
}
|
|
54
71
|
}
|
|
55
72
|
|
|
73
|
+
/**
|
|
74
|
+
* The port number the server is listening on
|
|
75
|
+
*/
|
|
56
76
|
get port(): number | undefined {
|
|
57
77
|
// deno-coverage-ignore-start
|
|
58
78
|
if (this.server?.addr.transport === "tcp") {
|
|
@@ -62,6 +82,9 @@ export class WsServer {
|
|
|
62
82
|
// deno-coverage-ignore-stop
|
|
63
83
|
}
|
|
64
84
|
|
|
85
|
+
/**
|
|
86
|
+
* The address the server is listening on
|
|
87
|
+
*/
|
|
65
88
|
get address(): string | undefined {
|
|
66
89
|
// deno-coverage-ignore-start
|
|
67
90
|
if (this.server?.addr.transport === "tcp") {
|
|
@@ -19,5 +19,5 @@ export declare const ConnectionState: {
|
|
|
19
19
|
/**
|
|
20
20
|
* @description Type representing the possible values of ConnectionState
|
|
21
21
|
*/
|
|
22
|
-
export type
|
|
22
|
+
export type ConnectionState = (typeof ConnectionState)[keyof typeof ConnectionState];
|
|
23
23
|
//# sourceMappingURL=ConnectionState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionState.d.ts","sourceRoot":"","sources":["../../client/ConnectionState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe;IAC1B,sDAAsD;aACtD,OAAO,EAAE,SAAS;IAClB,4DAA4D;aAC5D,UAAU,EAAE,YAAY;IACxB,sCAAsC;aACtC,SAAS,EAAE,WAAW;IACtB,gDAAgD;aAChD,aAAa,EAAE,eAAe;IAC9B,mCAAmC;aACnC,YAAY,EAAE,cAAc;IAC5B,2CAA2C;aAC3C,cAAc,EAAE,gBAAgB;CACxB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"ConnectionState.d.ts","sourceRoot":"","sources":["../../client/ConnectionState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe;IAC1B,sDAAsD;aACtD,OAAO,EAAE,SAAS;IAClB,4DAA4D;aAC5D,UAAU,EAAE,YAAY;IACxB,sCAAsC;aACtC,SAAS,EAAE,WAAW;IACtB,gDAAgD;aAChD,aAAa,EAAE,eAAe;IAC9B,mCAAmC;aACnC,YAAY,EAAE,cAAc;IAC5B,2CAA2C;aAC3C,cAAc,EAAE,gBAAgB;CACxB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,eAAe,GACzB,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC"}
|