@seriousme/opifex 1.7.0 → 1.7.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/dist/bin/conformanceServer.d.ts +3 -0
- package/dist/bin/conformanceServer.d.ts.map +1 -0
- package/dist/bin/conformanceServer.js +98 -0
- package/dist/bin/conformanceServer.js.map +1 -0
- package/dist/bin/demoServer.d.ts +3 -0
- package/dist/bin/demoServer.d.ts.map +1 -0
- package/dist/bin/demoServer.js +97 -0
- package/dist/bin/demoServer.js.map +1 -0
- package/dist/bin/mqtt.d.ts +3 -0
- package/dist/bin/mqtt.d.ts.map +1 -0
- package/dist/bin/mqtt.js +257 -0
- package/dist/bin/mqtt.js.map +1 -0
- package/dist/client/ConnectionState.d.ts +21 -0
- package/dist/client/ConnectionState.d.ts.map +1 -0
- package/dist/client/ConnectionState.js +17 -0
- package/dist/client/ConnectionState.js.map +1 -0
- package/dist/client/client.d.ts +94 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +188 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/context.d.ts +29 -0
- package/dist/client/context.d.ts.map +1 -0
- package/dist/client/context.js +153 -0
- package/dist/client/context.js.map +1 -0
- package/dist/client/deps.d.ts +8 -0
- package/dist/client/deps.d.ts.map +1 -0
- package/dist/client/deps.js +6 -0
- package/dist/client/deps.js.map +1 -0
- package/dist/client/handlers/handleConnack.d.ts +10 -0
- package/dist/client/handlers/handleConnack.d.ts.map +1 -0
- package/dist/client/handlers/handleConnack.js +25 -0
- package/dist/client/handlers/handleConnack.js.map +1 -0
- package/dist/client/handlers/handlePacket.d.ts +11 -0
- package/dist/client/handlers/handlePacket.d.ts.map +1 -0
- package/dist/client/handlers/handlePacket.js +58 -0
- package/dist/client/handlers/handlePacket.js.map +1 -0
- package/dist/client/handlers/handlePuback.d.ts +12 -0
- package/dist/client/handlers/handlePuback.d.ts.map +1 -0
- package/dist/client/handlers/handlePuback.js +14 -0
- package/dist/client/handlers/handlePuback.js.map +1 -0
- package/dist/client/handlers/handlePubcomp.d.ts +13 -0
- package/dist/client/handlers/handlePubcomp.d.ts.map +1 -0
- package/dist/client/handlers/handlePubcomp.js +17 -0
- package/dist/client/handlers/handlePubcomp.js.map +1 -0
- package/dist/client/handlers/handlePublish.d.ts +10 -0
- package/dist/client/handlers/handlePublish.d.ts.map +1 -0
- package/dist/client/handlers/handlePublish.js +34 -0
- package/dist/client/handlers/handlePublish.js.map +1 -0
- package/dist/client/handlers/handlePubrec.d.ts +17 -0
- package/dist/client/handlers/handlePubrec.d.ts.map +1 -0
- package/dist/client/handlers/handlePubrec.js +27 -0
- package/dist/client/handlers/handlePubrec.js.map +1 -0
- package/dist/client/handlers/handlePubrel.d.ts +20 -0
- package/dist/client/handlers/handlePubrel.d.ts.map +1 -0
- package/dist/client/handlers/handlePubrel.js +32 -0
- package/dist/client/handlers/handlePubrel.js.map +1 -0
- package/dist/client/handlers/handleSuback.d.ts +13 -0
- package/dist/client/handlers/handleSuback.d.ts.map +1 -0
- package/dist/client/handlers/handleSuback.js +15 -0
- package/dist/client/handlers/handleSuback.js.map +1 -0
- package/dist/client/handlers/handleUnsuback.d.ts +14 -0
- package/dist/client/handlers/handleUnsuback.d.ts.map +1 -0
- package/dist/client/handlers/handleUnsuback.js +16 -0
- package/dist/client/handlers/handleUnsuback.js.map +1 -0
- package/dist/client/mod.d.ts +7 -0
- package/dist/client/mod.d.ts.map +1 -0
- package/dist/client/mod.js +6 -0
- package/dist/client/mod.js.map +1 -0
- package/dist/client/store/deps.d.ts +3 -0
- package/dist/client/store/deps.d.ts.map +1 -0
- package/dist/client/store/deps.js +2 -0
- package/dist/client/store/deps.js.map +1 -0
- package/dist/client/store/memoryStore.d.ts +34 -0
- package/dist/client/store/memoryStore.d.ts.map +1 -0
- package/dist/client/store/memoryStore.js +59 -0
- package/dist/client/store/memoryStore.js.map +1 -0
- package/dist/client/store/store.d.ts +46 -0
- package/dist/client/store/store.d.ts.map +1 -0
- package/dist/client/store/store.js +5 -0
- package/dist/client/store/store.js.map +1 -0
- package/dist/mqttConn/mqttConn.d.ts +36 -0
- package/dist/mqttConn/mqttConn.d.ts.map +1 -0
- package/dist/mqttConn/mqttConn.js +105 -0
- package/dist/mqttConn/mqttConn.js.map +1 -0
- package/dist/mqttPacket/AuthenticationResult.d.ts +16 -0
- package/dist/mqttPacket/AuthenticationResult.d.ts.map +1 -0
- package/dist/mqttPacket/AuthenticationResult.js +17 -0
- package/dist/mqttPacket/AuthenticationResult.js.map +1 -0
- package/dist/mqttPacket/BitMask.d.ts +11 -0
- package/dist/mqttPacket/BitMask.d.ts.map +1 -0
- package/dist/mqttPacket/BitMask.js +11 -0
- package/dist/mqttPacket/BitMask.js.map +1 -0
- package/dist/mqttPacket/PacketType.d.ts +19 -0
- package/dist/mqttPacket/PacketType.d.ts.map +1 -0
- package/dist/mqttPacket/PacketType.js +19 -0
- package/dist/mqttPacket/PacketType.js.map +1 -0
- package/dist/mqttPacket/connack.d.ts +18 -0
- package/dist/mqttPacket/connack.d.ts.map +1 -0
- package/dist/mqttPacket/connack.js +28 -0
- package/dist/mqttPacket/connack.js.map +1 -0
- package/dist/mqttPacket/connect.d.ts +28 -0
- package/dist/mqttPacket/connect.d.ts.map +1 -0
- package/dist/mqttPacket/connect.js +116 -0
- package/dist/mqttPacket/connect.js.map +1 -0
- package/dist/mqttPacket/decoder.d.ts +24 -0
- package/dist/mqttPacket/decoder.d.ts.map +1 -0
- package/dist/mqttPacket/decoder.js +90 -0
- package/dist/mqttPacket/decoder.js.map +1 -0
- package/dist/mqttPacket/disconnect.d.ts +16 -0
- package/dist/mqttPacket/disconnect.d.ts.map +1 -0
- package/dist/mqttPacket/disconnect.js +15 -0
- package/dist/mqttPacket/disconnect.js.map +1 -0
- package/dist/mqttPacket/encoder.d.ts +17 -0
- package/dist/mqttPacket/encoder.d.ts.map +1 -0
- package/dist/mqttPacket/encoder.js +57 -0
- package/dist/mqttPacket/encoder.js.map +1 -0
- package/dist/mqttPacket/length.d.ts +12 -0
- package/dist/mqttPacket/length.d.ts.map +1 -0
- package/dist/mqttPacket/length.js +44 -0
- package/dist/mqttPacket/length.js.map +1 -0
- package/dist/mqttPacket/mod.d.ts +122 -0
- package/dist/mqttPacket/mod.d.ts.map +1 -0
- package/dist/mqttPacket/mod.js +77 -0
- package/dist/mqttPacket/mod.js.map +1 -0
- package/dist/mqttPacket/pingreq.d.ts +15 -0
- package/dist/mqttPacket/pingreq.d.ts.map +1 -0
- package/dist/mqttPacket/pingreq.js +16 -0
- package/dist/mqttPacket/pingreq.js.map +1 -0
- package/dist/mqttPacket/pingres.d.ts +16 -0
- package/dist/mqttPacket/pingres.d.ts.map +1 -0
- package/dist/mqttPacket/pingres.js +15 -0
- package/dist/mqttPacket/pingres.js.map +1 -0
- package/dist/mqttPacket/puback.d.ts +16 -0
- package/dist/mqttPacket/puback.d.ts.map +1 -0
- package/dist/mqttPacket/puback.js +21 -0
- package/dist/mqttPacket/puback.js.map +1 -0
- package/dist/mqttPacket/pubcomp.d.ts +17 -0
- package/dist/mqttPacket/pubcomp.d.ts.map +1 -0
- package/dist/mqttPacket/pubcomp.js +21 -0
- package/dist/mqttPacket/pubcomp.js.map +1 -0
- package/dist/mqttPacket/publish.d.ts +22 -0
- package/dist/mqttPacket/publish.d.ts.map +1 -0
- package/dist/mqttPacket/publish.js +52 -0
- package/dist/mqttPacket/publish.js.map +1 -0
- package/dist/mqttPacket/pubrec.d.ts +17 -0
- package/dist/mqttPacket/pubrec.d.ts.map +1 -0
- package/dist/mqttPacket/pubrec.js +21 -0
- package/dist/mqttPacket/pubrec.js.map +1 -0
- package/dist/mqttPacket/pubrel.d.ts +17 -0
- package/dist/mqttPacket/pubrel.d.ts.map +1 -0
- package/dist/mqttPacket/pubrel.js +21 -0
- package/dist/mqttPacket/pubrel.js.map +1 -0
- package/dist/mqttPacket/suback.d.ts +18 -0
- package/dist/mqttPacket/suback.d.ts.map +1 -0
- package/dist/mqttPacket/suback.js +30 -0
- package/dist/mqttPacket/suback.js.map +1 -0
- package/dist/mqttPacket/subscribe.d.ts +24 -0
- package/dist/mqttPacket/subscribe.d.ts.map +1 -0
- package/dist/mqttPacket/subscribe.js +53 -0
- package/dist/mqttPacket/subscribe.js.map +1 -0
- package/dist/mqttPacket/types.d.ts +48 -0
- package/dist/mqttPacket/types.d.ts.map +1 -0
- package/dist/mqttPacket/types.js +2 -0
- package/dist/mqttPacket/types.js.map +1 -0
- package/dist/mqttPacket/unsuback.d.ts +17 -0
- package/dist/mqttPacket/unsuback.d.ts.map +1 -0
- package/dist/mqttPacket/unsuback.js +21 -0
- package/dist/mqttPacket/unsuback.js.map +1 -0
- package/dist/mqttPacket/unsubscribe.d.ts +17 -0
- package/dist/mqttPacket/unsubscribe.d.ts.map +1 -0
- package/dist/mqttPacket/unsubscribe.js +37 -0
- package/dist/mqttPacket/unsubscribe.js.map +1 -0
- package/dist/mqttPacket/validators.d.ts +5 -0
- package/dist/mqttPacket/validators.d.ts.map +1 -0
- package/dist/mqttPacket/validators.js +16 -0
- package/dist/mqttPacket/validators.js.map +1 -0
- package/dist/node/tcpClient.d.ts +18 -0
- package/dist/node/tcpClient.d.ts.map +1 -0
- package/dist/node/tcpClient.js +82 -0
- package/dist/node/tcpClient.js.map +1 -0
- package/dist/node/tcpServer.d.ts +17 -0
- package/dist/node/tcpServer.d.ts.map +1 -0
- package/dist/node/tcpServer.js +51 -0
- package/dist/node/tcpServer.js.map +1 -0
- package/dist/node/wrapNodeSocket.d.ts +12 -0
- package/dist/node/wrapNodeSocket.d.ts.map +1 -0
- package/dist/node/wrapNodeSocket.js +57 -0
- package/dist/node/wrapNodeSocket.js.map +1 -0
- package/dist/persistence/deps.d.ts +5 -0
- package/dist/persistence/deps.d.ts.map +1 -0
- package/dist/persistence/deps.js +4 -0
- package/dist/persistence/deps.js.map +1 -0
- package/dist/persistence/memory/memoryPersistence.d.ts +28 -0
- package/dist/persistence/memory/memoryPersistence.d.ts.map +1 -0
- package/dist/persistence/memory/memoryPersistence.js +119 -0
- package/dist/persistence/memory/memoryPersistence.js.map +1 -0
- package/dist/persistence/persistence.d.ts +24 -0
- package/dist/persistence/persistence.d.ts.map +1 -0
- package/dist/persistence/persistence.js +2 -0
- package/dist/persistence/persistence.js.map +1 -0
- package/dist/persistence/store.d.ts +13 -0
- package/dist/persistence/store.d.ts.map +1 -0
- package/dist/persistence/store.js +2 -0
- package/dist/persistence/store.js.map +1 -0
- package/dist/server/context.d.ts +45 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +101 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/deps.d.ts +10 -0
- package/dist/server/deps.d.ts.map +1 -0
- package/dist/server/deps.js +6 -0
- package/dist/server/deps.js.map +1 -0
- package/dist/server/handlers/handleConnect.d.ts +9 -0
- package/dist/server/handlers/handleConnect.d.ts.map +1 -0
- package/dist/server/handlers/handleConnect.js +81 -0
- package/dist/server/handlers/handleConnect.js.map +1 -0
- package/dist/server/handlers/handleDisconnect.d.ts +8 -0
- package/dist/server/handlers/handleDisconnect.d.ts.map +1 -0
- package/dist/server/handlers/handleDisconnect.js +10 -0
- package/dist/server/handlers/handleDisconnect.js.map +1 -0
- package/dist/server/handlers/handlePacket.d.ts +11 -0
- package/dist/server/handlers/handlePacket.d.ts.map +1 -0
- package/dist/server/handlers/handlePacket.js +66 -0
- package/dist/server/handlers/handlePacket.js.map +1 -0
- package/dist/server/handlers/handlePingreq.d.ts +8 -0
- package/dist/server/handlers/handlePingreq.d.ts.map +1 -0
- package/dist/server/handlers/handlePingreq.js +12 -0
- package/dist/server/handlers/handlePingreq.js.map +1 -0
- package/dist/server/handlers/handlePuback.d.ts +13 -0
- package/dist/server/handlers/handlePuback.d.ts.map +1 -0
- package/dist/server/handlers/handlePuback.js +17 -0
- package/dist/server/handlers/handlePuback.js.map +1 -0
- package/dist/server/handlers/handlePubcomp.d.ts +12 -0
- package/dist/server/handlers/handlePubcomp.d.ts.map +1 -0
- package/dist/server/handlers/handlePubcomp.js +15 -0
- package/dist/server/handlers/handlePubcomp.js.map +1 -0
- package/dist/server/handlers/handlePublish.d.ts +11 -0
- package/dist/server/handlers/handlePublish.d.ts.map +1 -0
- package/dist/server/handlers/handlePublish.js +55 -0
- package/dist/server/handlers/handlePublish.js.map +1 -0
- package/dist/server/handlers/handlePubrec.d.ts +15 -0
- package/dist/server/handlers/handlePubrec.d.ts.map +1 -0
- package/dist/server/handlers/handlePubrec.js +24 -0
- package/dist/server/handlers/handlePubrec.js.map +1 -0
- package/dist/server/handlers/handlePubrel.d.ts +16 -0
- package/dist/server/handlers/handlePubrel.d.ts.map +1 -0
- package/dist/server/handlers/handlePubrel.js +28 -0
- package/dist/server/handlers/handlePubrel.js.map +1 -0
- package/dist/server/handlers/handleSubscribe.d.ts +13 -0
- package/dist/server/handlers/handleSubscribe.d.ts.map +1 -0
- package/dist/server/handlers/handleSubscribe.js +57 -0
- package/dist/server/handlers/handleSubscribe.js.map +1 -0
- package/dist/server/handlers/handleUnsubscribe.d.ts +10 -0
- package/dist/server/handlers/handleUnsubscribe.d.ts.map +1 -0
- package/dist/server/handlers/handleUnsubscribe.js +19 -0
- package/dist/server/handlers/handleUnsubscribe.js.map +1 -0
- package/dist/server/mod.d.ts +11 -0
- package/dist/server/mod.d.ts.map +1 -0
- package/dist/server/mod.js +8 -0
- package/dist/server/mod.js.map +1 -0
- package/dist/server/server.d.ts +27 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +48 -0
- package/dist/server/server.js.map +1 -0
- package/dist/socket/socket.d.ts +29 -0
- package/dist/socket/socket.d.ts.map +1 -0
- package/dist/socket/socket.js +37 -0
- package/dist/socket/socket.js.map +1 -0
- package/dist/timer/timer.d.ts +13 -0
- package/dist/timer/timer.d.ts.map +1 -0
- package/dist/timer/timer.js +41 -0
- package/dist/timer/timer.js.map +1 -0
- package/dist/trie/trie.d.ts +21 -0
- package/dist/trie/trie.d.ts.map +1 -0
- package/dist/trie/trie.js +96 -0
- package/dist/trie/trie.js.map +1 -0
- package/dist/utils/args.d.ts +28 -0
- package/dist/utils/args.d.ts.map +1 -0
- package/dist/utils/args.js +76 -0
- package/dist/utils/args.js.map +1 -0
- package/dist/utils/assert.d.ts +10 -0
- package/dist/utils/assert.d.ts.map +1 -0
- package/dist/utils/assert.js +21 -0
- package/dist/utils/assert.js.map +1 -0
- package/dist/utils/asyncQueue.d.ts +28 -0
- package/dist/utils/asyncQueue.d.ts.map +1 -0
- package/dist/utils/asyncQueue.js +70 -0
- package/dist/utils/asyncQueue.js.map +1 -0
- package/dist/utils/deferred.d.ts +10 -0
- package/dist/utils/deferred.d.ts.map +1 -0
- package/dist/utils/deferred.js +15 -0
- package/dist/utils/deferred.js.map +1 -0
- package/dist/utils/logger.d.ts +63 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +59 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mod.d.ts +13 -0
- package/dist/utils/mod.d.ts.map +1 -0
- package/dist/utils/mod.js +12 -0
- package/dist/utils/mod.js.map +1 -0
- package/dist/utils/nextTick.d.ts +17 -0
- package/dist/utils/nextTick.d.ts.map +1 -0
- package/dist/utils/nextTick.js +19 -0
- package/dist/utils/nextTick.js.map +1 -0
- package/dist/utils/platform.d.ts +5 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +8 -0
- package/dist/utils/platform.js.map +1 -0
- package/package.json +2 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceServer.d.ts","sourceRoot":"","sources":["../../bin/conformanceServer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --experimental-strip-types
|
|
2
|
+
// this server is intended to be used with https://github.com/eclipse/iottestware
|
|
3
|
+
/**
|
|
4
|
+
* MQTT Server implementation with authentication and authorization
|
|
5
|
+
* @module mqttServer
|
|
6
|
+
*/
|
|
7
|
+
import { TcpServer } from "../node/tcpServer.js";
|
|
8
|
+
import { AuthenticationResult } from "../server/mod.js";
|
|
9
|
+
import { getArgs, logger, LogLevel, parseArgs } from "../utils/mod.js";
|
|
10
|
+
/**
|
|
11
|
+
* UTF-8 decoder for parsing passwords
|
|
12
|
+
*/
|
|
13
|
+
const utf8Decoder = new TextDecoder();
|
|
14
|
+
/**
|
|
15
|
+
* Map storing valid username/password combinations
|
|
16
|
+
*/
|
|
17
|
+
const userTable = new Map();
|
|
18
|
+
userTable.set("IoTester_1", "strong_password");
|
|
19
|
+
userTable.set("IoTester_2", "strong_password");
|
|
20
|
+
/**
|
|
21
|
+
* Regular expression for validating usernames
|
|
22
|
+
* Allows alphanumeric characters up to 23 chars long
|
|
23
|
+
*/
|
|
24
|
+
const strictUsername = new RegExp(/^[a-zA-Z0-9]{0,23}$/);
|
|
25
|
+
/**
|
|
26
|
+
* Flag to enable/disable username checking
|
|
27
|
+
* If false, all users are allowed access
|
|
28
|
+
* If true, only users in userTable are allowed access
|
|
29
|
+
*/
|
|
30
|
+
const checkUsername = true;
|
|
31
|
+
/**
|
|
32
|
+
* Authenticates MQTT clients
|
|
33
|
+
* @param {Context} _ctx - Connection context
|
|
34
|
+
* @param {string} clientId - Client identifier
|
|
35
|
+
* @param {string} username - Username to authenticate
|
|
36
|
+
* @param {Uint8Array} password - Password as byte array
|
|
37
|
+
* @returns {TAuthenticationResult} Authentication result
|
|
38
|
+
*/
|
|
39
|
+
function isAuthenticated(_ctx, clientId, username, password) {
|
|
40
|
+
const pwd = utf8Decoder.decode(password);
|
|
41
|
+
logger.info(`Verifying authentication of client '${clientId}' with username '${username}' and password '${pwd}'`);
|
|
42
|
+
if (!checkUsername) {
|
|
43
|
+
// allow all users access
|
|
44
|
+
return AuthenticationResult.ok;
|
|
45
|
+
}
|
|
46
|
+
// is the username valid according to MQTT specification
|
|
47
|
+
if (!strictUsername.test(username)) {
|
|
48
|
+
return AuthenticationResult.badUsernameOrPassword;
|
|
49
|
+
}
|
|
50
|
+
// Does user and password match an entry in userTable
|
|
51
|
+
if (userTable.has(username)) {
|
|
52
|
+
const pass = userTable.get(username);
|
|
53
|
+
if (pwd === pass) {
|
|
54
|
+
return AuthenticationResult.ok;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return AuthenticationResult.notAuthorized;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Checks if client is authorized to publish to a topic
|
|
61
|
+
* @param {Context} ctx - Connection context
|
|
62
|
+
* @param {Topic} topic - Topic to publish to
|
|
63
|
+
* @returns {boolean} True if authorized
|
|
64
|
+
*/
|
|
65
|
+
function isAuthorizedToPublish(ctx, topic) {
|
|
66
|
+
logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to publish on topic '${topic}'`);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Checks if client is authorized to subscribe to a topic
|
|
71
|
+
* @param {Context} ctx - Connection context
|
|
72
|
+
* @param {Topic} topic - Topic to subscribe to
|
|
73
|
+
* @returns {boolean} True if authorized
|
|
74
|
+
*/
|
|
75
|
+
function isAuthorizedToSubscribe(ctx, topic) {
|
|
76
|
+
logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to subscribe to topic '${topic}'`);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Parse command line arguments and start server
|
|
81
|
+
*/
|
|
82
|
+
const { _: [portNum] } = parseArgs(getArgs());
|
|
83
|
+
const port = Number(portNum ?? 1883);
|
|
84
|
+
const hostname = "::";
|
|
85
|
+
logger.level(LogLevel.info);
|
|
86
|
+
/**
|
|
87
|
+
* TCP Server instance with authentication and authorization handlers
|
|
88
|
+
*/
|
|
89
|
+
const tcpServer = new TcpServer({ port, hostname }, {
|
|
90
|
+
handlers: {
|
|
91
|
+
isAuthenticated,
|
|
92
|
+
isAuthorizedToPublish,
|
|
93
|
+
isAuthorizedToSubscribe,
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
tcpServer.start();
|
|
97
|
+
logger.info(`Server started on port ${tcpServer.port}`);
|
|
98
|
+
//# sourceMappingURL=conformanceServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceServer.js","sourceRoot":"","sources":["../../bin/conformanceServer.ts"],"names":[],"mappings":";AACA,iFAAiF;AAEjF;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5B,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAC/C,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B;;;;;;;GAOG;AACH,SAAS,eAAe,CACtB,IAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,QAAoB;IAEpB,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CACT,uCAAuC,QAAQ,oBAAoB,QAAQ,mBAAmB,GAAG,GAAG,CACrG,CAAC;IAEF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,yBAAyB;QACzB,OAAO,oBAAoB,CAAC,EAAE,CAAC;IACjC,CAAC;IACD,wDAAwD;IACxD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,oBAAoB,CAAC,qBAAqB,CAAC;IACpD,CAAC;IACD,qDAAqD;IACrD,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,oBAAoB,CAAC,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,aAAa,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,GAAY,EAAE,KAAY;IACvD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,0BAA0B,KAAK,GAAG,CAC3F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,GAAY,EAAE,KAAY;IACzD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,4BAA4B,KAAK,GAAG,CAC7F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAClD,QAAQ,EAAE;QACR,eAAe;QACf,qBAAqB;QACrB,uBAAuB;KACxB;CACF,CAAC,CAAC;AACH,SAAS,CAAC,KAAK,EAAE,CAAC;AAClB,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoServer.d.ts","sourceRoot":"","sources":["../../bin/demoServer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --experimental-strip-types
|
|
2
|
+
/**
|
|
3
|
+
* MQTT Server implementation with authentication and authorization
|
|
4
|
+
* @module mqttServer
|
|
5
|
+
*/
|
|
6
|
+
import { TcpServer } from "../node/tcpServer.js";
|
|
7
|
+
import { AuthenticationResult } from "../server/mod.js";
|
|
8
|
+
import { getArgs, logger, LogLevel, parseArgs } from "../utils/mod.js";
|
|
9
|
+
/**
|
|
10
|
+
* UTF-8 decoder for parsing passwords
|
|
11
|
+
*/
|
|
12
|
+
const utf8Decoder = new TextDecoder();
|
|
13
|
+
/**
|
|
14
|
+
* Map storing valid username/password combinations
|
|
15
|
+
*/
|
|
16
|
+
const userTable = new Map();
|
|
17
|
+
userTable.set("IoTester_1", "strong_password");
|
|
18
|
+
userTable.set("IoTester_2", "strong_password");
|
|
19
|
+
/**
|
|
20
|
+
* Regular expression for validating usernames
|
|
21
|
+
* Allows alphanumeric characters up to 23 chars long
|
|
22
|
+
*/
|
|
23
|
+
const strictUsername = new RegExp(/^[a-zA-Z0-9]{0,23}$/);
|
|
24
|
+
/**
|
|
25
|
+
* Flag to enable/disable username checking
|
|
26
|
+
* If false, all users are allowed access
|
|
27
|
+
* If true, only users in userTable are allowed access
|
|
28
|
+
*/
|
|
29
|
+
const checkUsername = false;
|
|
30
|
+
/**
|
|
31
|
+
* Authenticates MQTT clients
|
|
32
|
+
* @param {Context} _ctx - Connection context
|
|
33
|
+
* @param {string} clientId - Client identifier
|
|
34
|
+
* @param {string} username - Username to authenticate
|
|
35
|
+
* @param {Uint8Array} password - Password as byte array
|
|
36
|
+
* @returns {TAuthenticationResult} Authentication result
|
|
37
|
+
*/
|
|
38
|
+
function isAuthenticated(_ctx, clientId, username, password) {
|
|
39
|
+
const pwd = utf8Decoder.decode(password);
|
|
40
|
+
logger.info(`Verifying authentication of client '${clientId}' with username '${username}' and password '${pwd}'`);
|
|
41
|
+
if (!checkUsername) {
|
|
42
|
+
// allow all users access
|
|
43
|
+
return AuthenticationResult.ok;
|
|
44
|
+
}
|
|
45
|
+
// is the username valid according to MQTT specification
|
|
46
|
+
if (!strictUsername.test(username)) {
|
|
47
|
+
return AuthenticationResult.badUsernameOrPassword;
|
|
48
|
+
}
|
|
49
|
+
// Does user and password match an entry in userTable
|
|
50
|
+
if (userTable.has(username)) {
|
|
51
|
+
const pass = userTable.get(username);
|
|
52
|
+
if (pwd === pass) {
|
|
53
|
+
return AuthenticationResult.ok;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return AuthenticationResult.notAuthorized;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Checks if client is authorized to publish to a topic
|
|
60
|
+
* @param {Context} ctx - Connection context
|
|
61
|
+
* @param {Topic} topic - Topic to publish to
|
|
62
|
+
* @returns {boolean} True if authorized
|
|
63
|
+
*/
|
|
64
|
+
function isAuthorizedToPublish(ctx, topic) {
|
|
65
|
+
logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to publish on topic '${topic}'`);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Checks if client is authorized to subscribe to a topic
|
|
70
|
+
* @param {Context} ctx - Connection context
|
|
71
|
+
* @param {Topic} topic - Topic to subscribe to
|
|
72
|
+
* @returns {boolean} True if authorized
|
|
73
|
+
*/
|
|
74
|
+
function isAuthorizedToSubscribe(ctx, topic) {
|
|
75
|
+
logger.debug(`Checking authorization of client '${ctx.store?.clientId}' to subscribe to topic '${topic}'`);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse command line arguments and start server
|
|
80
|
+
*/
|
|
81
|
+
const { _: [portNum] } = parseArgs(getArgs());
|
|
82
|
+
const port = Number(portNum ?? 1883);
|
|
83
|
+
const hostname = "::";
|
|
84
|
+
logger.level(LogLevel.info);
|
|
85
|
+
/**
|
|
86
|
+
* TCP Server instance with authentication and authorization handlers
|
|
87
|
+
*/
|
|
88
|
+
const tcpServer = new TcpServer({ port, hostname }, {
|
|
89
|
+
handlers: {
|
|
90
|
+
isAuthenticated,
|
|
91
|
+
isAuthorizedToPublish,
|
|
92
|
+
isAuthorizedToSubscribe,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
tcpServer.start();
|
|
96
|
+
logger.info(`Server started on port ${tcpServer.port}`);
|
|
97
|
+
//# sourceMappingURL=demoServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoServer.js","sourceRoot":"","sources":["../../bin/demoServer.ts"],"names":[],"mappings":";AAEA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5B,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAC/C,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B;;;;;;;GAOG;AACH,SAAS,eAAe,CACtB,IAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,QAAoB;IAEpB,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CACT,uCAAuC,QAAQ,oBAAoB,QAAQ,mBAAmB,GAAG,GAAG,CACrG,CAAC;IAEF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,yBAAyB;QACzB,OAAO,oBAAoB,CAAC,EAAE,CAAC;IACjC,CAAC;IACD,wDAAwD;IACxD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,oBAAoB,CAAC,qBAAqB,CAAC;IACpD,CAAC;IACD,qDAAqD;IACrD,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,oBAAoB,CAAC,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,aAAa,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,GAAY,EAAE,KAAY;IACvD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,0BAA0B,KAAK,GAAG,CAC3F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,GAAY,EAAE,KAAY;IACzD,MAAM,CAAC,KAAK,CACV,qCAAqC,GAAG,CAAC,KAAK,EAAE,QAAQ,4BAA4B,KAAK,GAAG,CAC7F,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAClD,QAAQ,EAAE;QACR,eAAe;QACf,qBAAqB;QACrB,uBAAuB;KACxB;CACF,CAAC,CAAC;AACH,SAAS,CAAC,KAAK,EAAE,CAAC;AAClB,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mqtt.d.ts","sourceRoot":"","sources":["../../bin/mqtt.ts"],"names":[],"mappings":""}
|
package/dist/bin/mqtt.js
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --experimental-strip-types
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview MQTT command line interface that provides publish and subscribe functionality
|
|
4
|
+
* @module mqtt-cli
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
* This module implements a command line interface for MQTT operations:
|
|
8
|
+
* - Publish messages to an MQTT broker
|
|
9
|
+
* - Subscribe to topics on an MQTT broker
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - TLS support with custom certificates
|
|
13
|
+
* - Authentication with username/password
|
|
14
|
+
* - Configurable QoS levels (0-2)
|
|
15
|
+
* - Message retention
|
|
16
|
+
* - Session persistence
|
|
17
|
+
* - Custom client IDs
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* # Publish a message
|
|
21
|
+
* mqtt publish -t topic -m message
|
|
22
|
+
*
|
|
23
|
+
* # Subscribe to a topic
|
|
24
|
+
* mqtt subscribe -t topic
|
|
25
|
+
*
|
|
26
|
+
* @requires node
|
|
27
|
+
* @requires ../client/mod.ts
|
|
28
|
+
* @requires ../node/tcpClient.ts
|
|
29
|
+
* @requires ../utils/mod.ts
|
|
30
|
+
*/
|
|
31
|
+
import { DEFAULT_URL } from "../client/mod.js";
|
|
32
|
+
import { getFileData, TcpClient } from "../node/tcpClient.js";
|
|
33
|
+
import { getArgs, logger, LogLevel, parseArgs } from "../utils/mod.js";
|
|
34
|
+
const client = new TcpClient();
|
|
35
|
+
const encoder = new TextEncoder();
|
|
36
|
+
const decoder = new TextDecoder();
|
|
37
|
+
logger.level(LogLevel.info);
|
|
38
|
+
const MQTTHelp = `MQTT command line interface, available commands are:
|
|
39
|
+
|
|
40
|
+
* publish publish a message to the broker
|
|
41
|
+
* subscribe subscribe for updates from the broker
|
|
42
|
+
|
|
43
|
+
Run 'mqtt [command] --help' to know more about the commands.`;
|
|
44
|
+
const ConnectHelp = `
|
|
45
|
+
-u/--url the URL to connect to: default is ${DEFAULT_URL}
|
|
46
|
+
-i/--clientId the clientId to connect to the server
|
|
47
|
+
-U/--username the username to connect to the server
|
|
48
|
+
-P/--password the password to connect to the server
|
|
49
|
+
-C/--caFile the path to a CA certificate file
|
|
50
|
+
-c/--certFile the path to a certificate file
|
|
51
|
+
-k/--keyFile the path to a key file
|
|
52
|
+
-n/--noClean try to resume a previous session
|
|
53
|
+
-h/--help this text
|
|
54
|
+
`;
|
|
55
|
+
const connectOpts = {
|
|
56
|
+
string: [
|
|
57
|
+
"url",
|
|
58
|
+
"username",
|
|
59
|
+
"password",
|
|
60
|
+
"caFile",
|
|
61
|
+
"certFile",
|
|
62
|
+
"keyFile",
|
|
63
|
+
"clientId",
|
|
64
|
+
],
|
|
65
|
+
alias: {
|
|
66
|
+
u: "url",
|
|
67
|
+
U: "username",
|
|
68
|
+
P: "password",
|
|
69
|
+
C: "caFile",
|
|
70
|
+
c: "certFile",
|
|
71
|
+
k: "keyFile",
|
|
72
|
+
i: "clientId",
|
|
73
|
+
n: "noClean",
|
|
74
|
+
h: "help",
|
|
75
|
+
},
|
|
76
|
+
boolean: ["noClean", "help"],
|
|
77
|
+
default: {
|
|
78
|
+
noClean: false,
|
|
79
|
+
clientId: `Opifex-${crypto.randomUUID()}`,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
const SubscribeHelp = `Usage: mqtt subscribe <options>
|
|
83
|
+
|
|
84
|
+
Where options are:
|
|
85
|
+
-t/--topic the topic to use
|
|
86
|
+
-q/--qos the QoS (0/1/2) to use, default is 0
|
|
87
|
+
${ConnectHelp}
|
|
88
|
+
Example: mqtt subscribe -t hello`;
|
|
89
|
+
const subscribeOpts = {
|
|
90
|
+
string: ["topic"],
|
|
91
|
+
alias: {
|
|
92
|
+
t: "topic",
|
|
93
|
+
q: "qos",
|
|
94
|
+
},
|
|
95
|
+
default: {
|
|
96
|
+
qos: 0,
|
|
97
|
+
topic: "",
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
function parseQos(qosArg) {
|
|
101
|
+
const qos = Number(qosArg);
|
|
102
|
+
switch (qos) {
|
|
103
|
+
case 0:
|
|
104
|
+
return 0;
|
|
105
|
+
case 1:
|
|
106
|
+
return 1;
|
|
107
|
+
case 2:
|
|
108
|
+
return 2;
|
|
109
|
+
default:
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
console.log("QoS must be between 0 and 2");
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
async function getTLSdata(connectArgs) {
|
|
116
|
+
const caFileData = await getFileData(connectArgs.caFile);
|
|
117
|
+
const caCerts = caFileData ? [caFileData] : undefined;
|
|
118
|
+
const cert = await getFileData(connectArgs.certFile);
|
|
119
|
+
const key = await getFileData(connectArgs.keyFile);
|
|
120
|
+
return {
|
|
121
|
+
caCerts,
|
|
122
|
+
cert,
|
|
123
|
+
key,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async function subscribe() {
|
|
127
|
+
const connectArgs = parseArgs(getArgs(), connectOpts);
|
|
128
|
+
const { caCerts, cert, key, } = await getTLSdata(connectArgs);
|
|
129
|
+
const subscribeArgs = parseArgs(getArgs(), subscribeOpts);
|
|
130
|
+
if (connectArgs.help) {
|
|
131
|
+
console.log(SubscribeHelp);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (subscribeArgs.topic === undefined) {
|
|
135
|
+
console.log("Missing `topic`");
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
await client.connect({
|
|
140
|
+
url: connectArgs.url,
|
|
141
|
+
caCerts,
|
|
142
|
+
cert,
|
|
143
|
+
key,
|
|
144
|
+
options: {
|
|
145
|
+
username: connectArgs.username,
|
|
146
|
+
password: encoder.encode(connectArgs.password),
|
|
147
|
+
clientId: connectArgs.clientId,
|
|
148
|
+
clean: !connectArgs.noClean,
|
|
149
|
+
keepAlive: 60,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
logger.debug("Connected !");
|
|
153
|
+
client.subscribe({
|
|
154
|
+
subscriptions: [
|
|
155
|
+
{
|
|
156
|
+
topicFilter: subscribeArgs.topic,
|
|
157
|
+
qos: parseQos(subscribeArgs.qos),
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
});
|
|
161
|
+
logger.debug("Subscribed!");
|
|
162
|
+
for await (const message of client.messages()) {
|
|
163
|
+
console.log(decoder.decode(message.payload));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (err instanceof Error) {
|
|
168
|
+
// @ts-ignore the type spec of err is missing err.code
|
|
169
|
+
logger.info(`Error: ${err.message || err.code}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const PublishHelp = `Usage: mqtt publish <options>
|
|
174
|
+
|
|
175
|
+
Where options are:
|
|
176
|
+
-t/--topic the topic to use
|
|
177
|
+
-m/--message the message to send
|
|
178
|
+
-q/--qos the QoS (0/1/2) to use, default is 0
|
|
179
|
+
-r/--retain if the message should be retained, default is false
|
|
180
|
+
${ConnectHelp}
|
|
181
|
+
Example: mqtt publish -t hello -m world`;
|
|
182
|
+
const publishOpts = {
|
|
183
|
+
string: ["topic", "message"],
|
|
184
|
+
boolean: ["retain"],
|
|
185
|
+
alias: {
|
|
186
|
+
t: "topic",
|
|
187
|
+
m: "message",
|
|
188
|
+
q: "qos",
|
|
189
|
+
r: "retain",
|
|
190
|
+
},
|
|
191
|
+
default: {
|
|
192
|
+
qos: 0,
|
|
193
|
+
dup: false,
|
|
194
|
+
retain: false,
|
|
195
|
+
topic: undefined,
|
|
196
|
+
message: "",
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
async function publish() {
|
|
200
|
+
const connectArgs = parseArgs(getArgs(), connectOpts);
|
|
201
|
+
const { caCerts, cert, key, } = await getTLSdata(connectArgs);
|
|
202
|
+
const publishArgs = parseArgs(getArgs(), publishOpts);
|
|
203
|
+
if (connectArgs.help) {
|
|
204
|
+
console.log(PublishHelp);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (publishArgs.topic === undefined) {
|
|
208
|
+
console.log("Missing `topic`");
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
await client.connect({
|
|
213
|
+
url: connectArgs.url,
|
|
214
|
+
caCerts,
|
|
215
|
+
cert,
|
|
216
|
+
key,
|
|
217
|
+
options: {
|
|
218
|
+
username: connectArgs.username,
|
|
219
|
+
password: encoder.encode(connectArgs.password),
|
|
220
|
+
clientId: connectArgs.clientId,
|
|
221
|
+
clean: !connectArgs.noClean,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
logger.debug("Connected !");
|
|
225
|
+
await client.publish({
|
|
226
|
+
topic: publishArgs.topic,
|
|
227
|
+
payload: encoder.encode(publishArgs.message),
|
|
228
|
+
retain: publishArgs.retain,
|
|
229
|
+
qos: parseQos(publishArgs.qos),
|
|
230
|
+
});
|
|
231
|
+
logger.debug("Published!");
|
|
232
|
+
client.disconnect();
|
|
233
|
+
logger.debug("Disconnected !");
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
if (err instanceof Error) {
|
|
237
|
+
// @ts-ignore the type spec of err is missing err.code
|
|
238
|
+
logger.info(`Error: ${err.message || err.code}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function processArgs() {
|
|
243
|
+
const { _: [cmd] } = parseArgs(getArgs());
|
|
244
|
+
switch (cmd) {
|
|
245
|
+
case "publish":
|
|
246
|
+
publish();
|
|
247
|
+
break;
|
|
248
|
+
case "subscribe":
|
|
249
|
+
subscribe();
|
|
250
|
+
break;
|
|
251
|
+
default:
|
|
252
|
+
console.log(MQTTHelp);
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
processArgs();
|
|
257
|
+
//# sourceMappingURL=mqtt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mqtt.js","sourceRoot":"","sources":["../../bin/mqtt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Object representing possible connection states
|
|
3
|
+
* @readonly
|
|
4
|
+
*/
|
|
5
|
+
export declare const ConnectionState: {
|
|
6
|
+
/** System is offline and not attempting connection */
|
|
7
|
+
readonly offline: "offline";
|
|
8
|
+
/** System is in the process of establishing a connection */
|
|
9
|
+
readonly connecting: "connecting";
|
|
10
|
+
/** System has an active connection */
|
|
11
|
+
readonly connected: "connected";
|
|
12
|
+
/** System is in the process of disconnecting */
|
|
13
|
+
readonly disconnecting: "disconnecting";
|
|
14
|
+
/** System has been disconnected */
|
|
15
|
+
readonly disconnected: "disconnected";
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* @description Type representing the possible values of ConnectionState
|
|
19
|
+
*/
|
|
20
|
+
export type TConnectionState = (typeof ConnectionState)[keyof typeof ConnectionState];
|
|
21
|
+
//# sourceMappingURL=ConnectionState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionState.d.ts","sourceRoot":"","sources":["../../client/ConnectionState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe;IAC1B,sDAAsD;;IAEtD,4DAA4D;;IAE5D,sCAAsC;;IAEtC,gDAAgD;;IAEhD,mCAAmC;;CAE3B,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Object representing possible connection states
|
|
3
|
+
* @readonly
|
|
4
|
+
*/
|
|
5
|
+
export const ConnectionState = {
|
|
6
|
+
/** System is offline and not attempting connection */
|
|
7
|
+
offline: "offline",
|
|
8
|
+
/** System is in the process of establishing a connection */
|
|
9
|
+
connecting: "connecting",
|
|
10
|
+
/** System has an active connection */
|
|
11
|
+
connected: "connected",
|
|
12
|
+
/** System is in the process of disconnecting */
|
|
13
|
+
disconnecting: "disconnecting",
|
|
14
|
+
/** System has been disconnected */
|
|
15
|
+
disconnected: "disconnected",
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=ConnectionState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionState.js","sourceRoot":"","sources":["../../client/ConnectionState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,sDAAsD;IACtD,OAAO,EAAE,SAAS;IAClB,4DAA4D;IAC5D,UAAU,EAAE,YAAY;IACxB,sCAAsC;IACtC,SAAS,EAAE,WAAW;IACtB,gDAAgD;IAChD,aAAa,EAAE,eAAe;IAC9B,mCAAmC;IACnC,YAAY,EAAE,cAAc;CACpB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type ConnectPacket, type PublishPacket, type SockConn, type SubscribePacket, type TAuthenticationResult } from "./deps.ts";
|
|
2
|
+
type ConnectOptions = Omit<ConnectPacket, "type" | "protocolName" | "protocolLevel">;
|
|
3
|
+
/** ConnectParameters define how to connect */
|
|
4
|
+
export type ConnectParameters = {
|
|
5
|
+
url?: URL;
|
|
6
|
+
caCerts?: string[];
|
|
7
|
+
cert?: string;
|
|
8
|
+
key?: string;
|
|
9
|
+
numberOfRetries?: number;
|
|
10
|
+
options?: ConnectOptions;
|
|
11
|
+
};
|
|
12
|
+
/** PublishParameters define how a message should be published */
|
|
13
|
+
export type PublishParameters = Omit<PublishPacket, "type" | "id">;
|
|
14
|
+
/** SubscribeParameters define how to subscribe to a topic */
|
|
15
|
+
export type SubscribeParameters = Omit<SubscribePacket, "type" | "id">;
|
|
16
|
+
/** the default MQTT URL to connect to */
|
|
17
|
+
export declare const DEFAULT_URL = "mqtt://localhost:1883/";
|
|
18
|
+
/**
|
|
19
|
+
* The Client class provides an MQTT Client that can be used to connect to
|
|
20
|
+
* a MQTT broker and publish/subscribe messages.
|
|
21
|
+
*
|
|
22
|
+
* The Client class is not meant to be used directly, but
|
|
23
|
+
* instead should be subclassed and the subclass should
|
|
24
|
+
* override the createConn() method to provide a
|
|
25
|
+
* connection type that is supported by the subclass.
|
|
26
|
+
*/
|
|
27
|
+
export declare class Client {
|
|
28
|
+
protected clientIdPrefix: string;
|
|
29
|
+
protected numberOfRetries: number;
|
|
30
|
+
protected url: URL;
|
|
31
|
+
protected keepAlive: number;
|
|
32
|
+
protected autoReconnect: boolean;
|
|
33
|
+
private caCerts?;
|
|
34
|
+
private cert?;
|
|
35
|
+
private key?;
|
|
36
|
+
private clientId;
|
|
37
|
+
private ctx;
|
|
38
|
+
private connectPacket?;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a new MQTT client instance
|
|
41
|
+
*/
|
|
42
|
+
constructor();
|
|
43
|
+
/**
|
|
44
|
+
* Creates a new connection to the MQTT broker
|
|
45
|
+
* @param protocol - The protocol to use (mqtt, mqtts, etc)
|
|
46
|
+
* @param _hostname - The hostname to connect to
|
|
47
|
+
* @param _port - The port to connect to
|
|
48
|
+
* @param _caCerts - Optional CA certificates
|
|
49
|
+
* @param _cert - Optional client certificate
|
|
50
|
+
* @param _key - Optional client key
|
|
51
|
+
* @returns Promise resolving to a SockConn connection
|
|
52
|
+
*/
|
|
53
|
+
protected createConn(protocol: string, _hostname: string, _port?: number, _caCerts?: string[], _cert?: string, _key?: string): Promise<SockConn>;
|
|
54
|
+
/**
|
|
55
|
+
* Handles the connection process including retries and reconnection
|
|
56
|
+
* @returns Promise that resolves when connection is established or fails
|
|
57
|
+
*/
|
|
58
|
+
private doConnect;
|
|
59
|
+
/**
|
|
60
|
+
* Connects to the MQTT broker
|
|
61
|
+
* @param params - Connection parameters
|
|
62
|
+
* @returns Promise resolving to authentication result
|
|
63
|
+
*/
|
|
64
|
+
connect(params?: ConnectParameters): Promise<TAuthenticationResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Disconnects from the MQTT broker
|
|
67
|
+
* @returns Promise that resolves when disconnected
|
|
68
|
+
*/
|
|
69
|
+
disconnect(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Publishes a message to the MQTT broker
|
|
72
|
+
* @param params - Publish parameters including topic and payload
|
|
73
|
+
* @returns Promise that resolves when published
|
|
74
|
+
*/
|
|
75
|
+
publish(params: PublishParameters): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Subscribes to topics on the MQTT broker
|
|
78
|
+
* @param params - Subscribe parameters including topics
|
|
79
|
+
* @returns Promise that resolves when subscribed
|
|
80
|
+
*/
|
|
81
|
+
subscribe(params: SubscribeParameters): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Gets an async iterator for received messages
|
|
84
|
+
* @returns AsyncGenerator yielding received publish packets
|
|
85
|
+
*/
|
|
86
|
+
messages(): AsyncGenerator<PublishPacket, void, unknown>;
|
|
87
|
+
/**
|
|
88
|
+
* Closes the message stream
|
|
89
|
+
* @param reason - Optional reason for closing
|
|
90
|
+
*/
|
|
91
|
+
closeMessages(reason?: string): void;
|
|
92
|
+
}
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAKlB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,WAAW,CAAC;AAanB,KAAK,cAAc,GAAG,IAAI,CACxB,aAAa,EACb,MAAM,GAAG,cAAc,GAAG,eAAe,CAC1C,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,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AACnE,6DAA6D;AAC7D,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAqBvE,0CAA0C;AAC1C,eAAO,MAAM,WAAW,2BAA2B,CAAC;AAKpD;;;;;;;;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,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;IA6CvB;;;;OAIG;IACH,OAAO,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAuBvE;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D;;;OAGG;IACI,QAAQ,IAAI,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,OAAO,CAAC;IAI/D;;;OAGG;IACH,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM;CAG9B"}
|