@alwaysai/device-agent 2.1.0-1 → 2.1.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/lib/cloud-connection/bootstrap-agent.d.ts +16 -0
- package/lib/cloud-connection/bootstrap-agent.d.ts.map +1 -0
- package/lib/cloud-connection/{device-agent.js → bootstrap-agent.js} +47 -24
- package/lib/cloud-connection/bootstrap-agent.js.map +1 -0
- package/lib/cloud-connection/connection-manager.d.ts +18 -6
- package/lib/cloud-connection/connection-manager.d.ts.map +1 -1
- package/lib/cloud-connection/connection-manager.js +108 -41
- package/lib/cloud-connection/connection-manager.js.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +10 -4
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -1
- package/lib/cloud-connection/passthrough-handler.js +50 -46
- package/lib/cloud-connection/passthrough-handler.js.map +1 -1
- package/lib/cloud-connection/publisher.d.ts +1 -1
- package/lib/cloud-connection/publisher.d.ts.map +1 -1
- package/lib/cloud-connection/publisher.js +22 -20
- package/lib/cloud-connection/publisher.js.map +1 -1
- package/package.json +2 -2
- package/src/cloud-connection/{device-agent.ts → bootstrap-agent.ts} +70 -39
- package/src/cloud-connection/connection-manager.ts +180 -54
- package/src/cloud-connection/device-agent-cloud-connection.ts +11 -9
- package/src/cloud-connection/passthrough-handler.ts +61 -56
- package/src/cloud-connection/publisher.ts +30 -28
- package/lib/cloud-connection/bootstrap-provision.d.ts +0 -2
- package/lib/cloud-connection/bootstrap-provision.d.ts.map +0 -1
- package/lib/cloud-connection/bootstrap-provision.js +0 -35
- package/lib/cloud-connection/bootstrap-provision.js.map +0 -1
- package/lib/cloud-connection/device-agent.d.ts +0 -21
- package/lib/cloud-connection/device-agent.d.ts.map +0 -1
- package/lib/cloud-connection/device-agent.js.map +0 -1
- package/lib/util/clean-certs.d.ts +0 -2
- package/lib/util/clean-certs.d.ts.map +0 -1
- package/lib/util/clean-certs.js +0 -17
- package/lib/util/clean-certs.js.map +0 -1
- package/src/cloud-connection/bootstrap-provision.ts +0 -43
- package/src/util/clean-certs.ts +0 -16
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MessageHandler } from './message-dispatcher';
|
|
2
|
+
export declare class BootstrapAgent implements MessageHandler {
|
|
3
|
+
private connectionManager;
|
|
4
|
+
private publisher;
|
|
5
|
+
private readonly clientId;
|
|
6
|
+
private readonly host;
|
|
7
|
+
private readonly port;
|
|
8
|
+
constructor();
|
|
9
|
+
hardwareId: () => Promise<string>;
|
|
10
|
+
deviceId: string;
|
|
11
|
+
deviceType: string;
|
|
12
|
+
publishMessage(topic: string, message: string): void;
|
|
13
|
+
handle(payload: any, topic: string): Promise<void>;
|
|
14
|
+
bootstrapProvision(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=bootstrap-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-agent.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/bootstrap-agent.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAsBtD,qBAAa,cAAe,YAAW,cAAc;IACnD,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;;IAoBtB,UAAU,wBAAwD;IAClE,QAAQ,SAAmB;IAC3B,UAAU,SAAgB;IAE1B,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAIvC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM;IAwDlC,kBAAkB;CA6BhC"}
|
|
@@ -1,43 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BootstrapAgent =
|
|
4
|
-
// eslint-disable-next-line
|
|
5
|
-
const awsIot = require('aws-iot-device-sdk');
|
|
3
|
+
exports.BootstrapAgent = void 0;
|
|
6
4
|
const app_1 = require("alwaysai/lib/core/app");
|
|
7
5
|
const infrastructure_1 = require("alwaysai/lib/infrastructure");
|
|
8
6
|
const util_1 = require("alwaysai/lib/util");
|
|
9
7
|
const device_certificate_1 = require("../infrastructure/device-certificate");
|
|
10
8
|
const get_device_id_1 = require("../util/get-device-id");
|
|
11
9
|
const logger_1 = require("../util/logger");
|
|
10
|
+
const connection_manager_1 = require("./connection-manager");
|
|
11
|
+
const publisher_1 = require("./publisher");
|
|
12
|
+
const device_certificate_2 = require("../infrastructure/device-certificate");
|
|
13
|
+
const urls_1 = require("../infrastructure/urls");
|
|
14
|
+
``;
|
|
15
|
+
const directories_1 = require("../util/directories");
|
|
12
16
|
// eslint-disable-next-line
|
|
13
17
|
const process = require('process');
|
|
14
|
-
class
|
|
15
|
-
constructor(
|
|
16
|
-
this.
|
|
17
|
-
this.
|
|
18
|
+
class BootstrapAgent {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.clientId = (0, get_device_id_1.getDeviceUuid)();
|
|
21
|
+
this.host = (0, urls_1.getIoTCoreEndpointUrl)();
|
|
22
|
+
this.port = 8883;
|
|
18
23
|
this.hardwareId = async () => await (0, app_1.getTargetHardwareUuid)((0, util_1.JsSpawner)());
|
|
19
24
|
this.deviceId = (0, get_device_id_1.getDeviceUuid)();
|
|
20
|
-
this.
|
|
25
|
+
this.deviceType = 'aai-device';
|
|
26
|
+
// Initialize & setup the connection
|
|
27
|
+
const bootstrapAgentConfig = {
|
|
28
|
+
clientId: this.clientId,
|
|
29
|
+
host: this.host,
|
|
30
|
+
port: this.port,
|
|
31
|
+
keyPath: (0, device_certificate_2.getBootstrapPrivateKeyFilePath)(),
|
|
32
|
+
certPath: (0, device_certificate_2.getBootstrapCertificateFilePath)(),
|
|
33
|
+
caPath: directories_1.AWS_ROOT_CERTIFICATE_FILE_PATH
|
|
34
|
+
};
|
|
35
|
+
this.connectionManager = new connection_manager_1.ConnectionManager(bootstrapAgentConfig);
|
|
36
|
+
this.publisher = new publisher_1.Publisher(this.connectionManager, bootstrapAgentConfig.clientId);
|
|
21
37
|
}
|
|
22
38
|
publishMessage(topic, message) {
|
|
23
|
-
this.
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
exports.DeviceAgent = DeviceAgent;
|
|
27
|
-
class BootstrapAgent extends DeviceAgent {
|
|
28
|
-
async subscribeToAllTopics() {
|
|
29
|
-
const AWS_CERTIFICATE_ACCEPT_TOPIC = '$aws/certificates/create/json/accepted';
|
|
30
|
-
const PROVISIONING_ACCEPTED_TOPIC = '$aws/provisioning-templates/FleetProvisionTemplate/provision/json/accepted';
|
|
31
|
-
const topics = [AWS_CERTIFICATE_ACCEPT_TOPIC, PROVISIONING_ACCEPTED_TOPIC];
|
|
32
|
-
const resp = this.device.subscribe(topics, function (err, granted) {
|
|
33
|
-
logger_1.logger.debug(`Bootstrap Agent: ${JSON.stringify(granted, null, 2)}`);
|
|
34
|
-
});
|
|
39
|
+
this.publisher.publish(topic, message);
|
|
35
40
|
}
|
|
36
|
-
async
|
|
41
|
+
async handle(payload, topic) {
|
|
37
42
|
switch (topic) {
|
|
38
43
|
case '$aws/certificates/create/json/accepted': {
|
|
39
|
-
logger_1.logger.debug(`Received Certs: ${JSON.stringify(
|
|
40
|
-
const { certificateId, certificatePem, privateKey, certificateOwnershipToken } =
|
|
44
|
+
logger_1.logger.debug(`Received Certs: ${JSON.stringify(payload, null, 2)}`);
|
|
45
|
+
const { certificateId, certificatePem, privateKey, certificateOwnershipToken } = payload;
|
|
41
46
|
const certSpawner = (0, util_1.JsSpawner)({ path: infrastructure_1.LOCAL_CERT_AND_KEY_DIR });
|
|
42
47
|
await certSpawner.writeFile(infrastructure_1.DEVICE_CERTIFICATE_FILE_NAME, certificatePem);
|
|
43
48
|
await certSpawner.writeFile(infrastructure_1.DEVICE_PRIVATE_KEY_FILE_NAME, privateKey);
|
|
@@ -63,6 +68,24 @@ class BootstrapAgent extends DeviceAgent {
|
|
|
63
68
|
}
|
|
64
69
|
}
|
|
65
70
|
}
|
|
71
|
+
async bootstrapProvision() {
|
|
72
|
+
const rmBootstrapCertsAndClose = async () => {
|
|
73
|
+
const deviceCertificates = new infrastructure_1.LocalDeviceCertificates();
|
|
74
|
+
const spawner = (0, util_1.JsSpawner)();
|
|
75
|
+
await spawner.rimraf((0, device_certificate_1.getBootstrapCertificateDirectoryPath)());
|
|
76
|
+
await spawner.rimraf(deviceCertificates.getCertificateDirectoryPath());
|
|
77
|
+
logger_1.logger.error('Could not provision device. Try again.');
|
|
78
|
+
process.exit(1);
|
|
79
|
+
};
|
|
80
|
+
setTimeout(rmBootstrapCertsAndClose, 60000);
|
|
81
|
+
this.connectionManager.initConnectionHandlers(() => {
|
|
82
|
+
logger_1.logger.info('Your device is being provisioned');
|
|
83
|
+
});
|
|
84
|
+
await this.connectionManager.waitForConnection();
|
|
85
|
+
this.connectionManager.registerHandler('$aws/certificates/create/json/accepted', this);
|
|
86
|
+
this.connectionManager.registerHandler('$aws/provisioning-templates/FleetProvisionTemplate/provision/json/accepted', this);
|
|
87
|
+
this.publishMessage('$aws/certificates/create/json', '{}');
|
|
88
|
+
}
|
|
66
89
|
}
|
|
67
90
|
exports.BootstrapAgent = BootstrapAgent;
|
|
68
|
-
//# sourceMappingURL=
|
|
91
|
+
//# sourceMappingURL=bootstrap-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-agent.js","sourceRoot":"","sources":["../../src/cloud-connection/bootstrap-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,31 @@
|
|
|
1
|
+
import { mqtt5 } from 'aws-iot-device-sdk-v2';
|
|
1
2
|
import { MessageDispatcher, MessageHandler } from './message-dispatcher';
|
|
3
|
+
export interface DeviceAgentConfigType {
|
|
4
|
+
clientId: string;
|
|
5
|
+
host: string;
|
|
6
|
+
port: number;
|
|
7
|
+
keyPath?: string;
|
|
8
|
+
certPath?: string;
|
|
9
|
+
caPath?: string;
|
|
10
|
+
}
|
|
2
11
|
export declare class ConnectionManager extends MessageDispatcher<any> {
|
|
3
12
|
private clientId;
|
|
4
13
|
private host;
|
|
5
14
|
private port;
|
|
6
|
-
private
|
|
15
|
+
private config;
|
|
16
|
+
private client;
|
|
7
17
|
private subscribedTopics;
|
|
8
18
|
private connected;
|
|
9
|
-
|
|
10
|
-
|
|
19
|
+
readonly qos: mqtt5.QoS;
|
|
20
|
+
constructor(deviceAgentConfig: DeviceAgentConfigType);
|
|
21
|
+
getIoTDevice(): mqtt5.Mqtt5Client;
|
|
11
22
|
isConnected(): boolean;
|
|
12
23
|
registerHandler(topic: string, handler: MessageHandler): void;
|
|
13
|
-
disconnect(): void
|
|
14
|
-
subscribe(topic: string): void
|
|
15
|
-
unsubscribe(topic: string): void
|
|
24
|
+
disconnect(): Promise<void>;
|
|
25
|
+
subscribe(topic: string): Promise<void>;
|
|
26
|
+
unsubscribe(topic: string): Promise<void>;
|
|
16
27
|
initConnectionHandlers(connectCallback: () => void): void;
|
|
28
|
+
waitForConnection(timeoutMs?: number): Promise<void>;
|
|
17
29
|
private logConnectionInfo;
|
|
18
30
|
}
|
|
19
31
|
//# sourceMappingURL=connection-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/connection-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAO,MAAM,uBAAuB,CAAC;AAUnD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMzE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAkB,SAAQ,iBAAiB,CAAC,GAAG,CAAC;IAC3D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,SAAS,CAAS;IAC1B,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;gBAEZ,iBAAiB,EAAE,qBAAqB;IAgC7C,YAAY;IAIZ,WAAW,IAAI,OAAO;IAItB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc;IAKhD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCvC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/C,sBAAsB,CAAC,eAAe,EAAE,MAAM,IAAI,GAAG,IAAI;IAwFzD,iBAAiB,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YA4B5C,iBAAiB;CAoDhC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ConnectionManager = void 0;
|
|
4
|
-
const
|
|
4
|
+
const aws_iot_device_sdk_v2_1 = require("aws-iot-device-sdk-v2");
|
|
5
5
|
const infrastructure_1 = require("alwaysai/lib/infrastructure");
|
|
6
6
|
const directories_1 = require("../util/directories");
|
|
7
7
|
const util_1 = require("alwaysai/lib/util");
|
|
@@ -9,88 +9,155 @@ const logger_1 = require("../util/logger");
|
|
|
9
9
|
const util_2 = require("util");
|
|
10
10
|
const child_process_1 = require("child_process");
|
|
11
11
|
const message_dispatcher_1 = require("./message-dispatcher");
|
|
12
|
+
const events_1 = require("events");
|
|
12
13
|
const exec_promise = (0, util_2.promisify)(child_process_1.exec);
|
|
13
14
|
class ConnectionManager extends message_dispatcher_1.MessageDispatcher {
|
|
14
|
-
constructor(
|
|
15
|
+
constructor(deviceAgentConfig) {
|
|
15
16
|
super();
|
|
16
17
|
this.subscribedTopics = new Set();
|
|
17
18
|
this.connected = false;
|
|
18
|
-
|
|
19
|
-
this.
|
|
20
|
-
this.
|
|
21
|
-
this.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
// Use config values if provided, otherwise use defaults
|
|
20
|
+
this.clientId = deviceAgentConfig.clientId;
|
|
21
|
+
this.host = deviceAgentConfig.host;
|
|
22
|
+
this.port = deviceAgentConfig.port;
|
|
23
|
+
this.qos = aws_iot_device_sdk_v2_1.mqtt5.QoS.AtLeastOnce;
|
|
24
|
+
const certPath = deviceAgentConfig.certPath || infrastructure_1.DEVICE_CERTIFICATE_FILE_PATH;
|
|
25
|
+
const keyPath = deviceAgentConfig.keyPath || infrastructure_1.DEVICE_PRIVATE_KEY_FILE_PATH;
|
|
26
|
+
const caPath = deviceAgentConfig.caPath || directories_1.AWS_ROOT_CERTIFICATE_FILE_PATH;
|
|
27
|
+
const builder = aws_iot_device_sdk_v2_1.iot.AwsIotMqtt5ClientConfigBuilder.newDirectMqttBuilderWithMtlsFromPath(this.host, certPath, keyPath);
|
|
28
|
+
builder.withConnectProperties({
|
|
25
29
|
clientId: this.clientId,
|
|
26
|
-
|
|
27
|
-
port: this.port,
|
|
28
|
-
keepalive: 10 // time before re-connect attempt on dropped connection, default is 400 seconds
|
|
30
|
+
keepAliveIntervalSeconds: 10
|
|
29
31
|
});
|
|
32
|
+
builder.withCertificateAuthorityFromPath(undefined, caPath);
|
|
33
|
+
this.config = builder.build();
|
|
34
|
+
this.client = new aws_iot_device_sdk_v2_1.mqtt5.Mqtt5Client(this.config);
|
|
35
|
+
this.client.start();
|
|
30
36
|
}
|
|
31
37
|
getIoTDevice() {
|
|
32
|
-
return this.
|
|
38
|
+
return this.client;
|
|
33
39
|
}
|
|
34
40
|
isConnected() {
|
|
35
41
|
return this.connected;
|
|
36
42
|
}
|
|
37
43
|
registerHandler(topic, handler) {
|
|
38
44
|
super.registerHandler(topic, handler);
|
|
39
|
-
this.subscribe(topic);
|
|
45
|
+
void this.subscribe(topic);
|
|
40
46
|
}
|
|
41
|
-
disconnect() {
|
|
42
|
-
this.
|
|
43
|
-
|
|
47
|
+
async disconnect() {
|
|
48
|
+
const stopped = (0, events_1.once)(this.client, aws_iot_device_sdk_v2_1.mqtt5.Mqtt5Client.STOPPED);
|
|
49
|
+
this.client.stop();
|
|
50
|
+
await stopped;
|
|
51
|
+
logger_1.logger.info(`Device Agent has been disconnected from the AWS IoT Core.`);
|
|
44
52
|
}
|
|
45
|
-
subscribe(topic) {
|
|
53
|
+
async subscribe(topic) {
|
|
46
54
|
if (!this.subscribedTopics.has(topic)) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
try {
|
|
56
|
+
const suback = await this.client.subscribe({
|
|
57
|
+
subscriptions: [{ qos: aws_iot_device_sdk_v2_1.mqtt5.QoS.AtLeastOnce, topicFilter: topic }]
|
|
58
|
+
});
|
|
59
|
+
this.subscribedTopics.add(topic);
|
|
60
|
+
logger_1.logger.debug(`Subscribed to topic: ${topic}, result: ${JSON.stringify(suback)}`);
|
|
61
|
+
// Based on documentation here: https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901178
|
|
62
|
+
suback.reasonCodes.forEach((code, index) => {
|
|
63
|
+
if ([0, 1, 2].includes(code)) {
|
|
64
|
+
logger_1.logger.debug(`SUBACK success for topic index ${index}: reason code ${code}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
logger_1.logger.error(`SUBACK error for topic index ${index}: unexpected reason code ${code}`);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
logger_1.logger.error(`Failed to subscribe to topic: ${topic}. Error: ${(0, util_1.stringifyError)(error)}`);
|
|
73
|
+
}
|
|
50
74
|
}
|
|
51
75
|
}
|
|
52
|
-
unsubscribe(topic) {
|
|
76
|
+
async unsubscribe(topic) {
|
|
53
77
|
if (this.subscribedTopics.has(topic)) {
|
|
54
|
-
this.
|
|
78
|
+
const unsuback = await this.client.unsubscribe({
|
|
79
|
+
topicFilters: [topic]
|
|
80
|
+
});
|
|
81
|
+
logger_1.logger.debug(`Unsubscribed from topic: ${topic}, result: ${JSON.stringify(unsuback)}`);
|
|
55
82
|
this.subscribedTopics.delete(topic);
|
|
56
|
-
logger_1.logger.debug(`Unsubscribed from topic: ${topic}`);
|
|
57
83
|
}
|
|
58
84
|
}
|
|
59
85
|
initConnectionHandlers(connectCallback) {
|
|
60
|
-
this.
|
|
86
|
+
this.client.on('attemptingConnect', () => {
|
|
87
|
+
logger_1.logger.debug(`Device Agent is attempting connection`);
|
|
88
|
+
});
|
|
89
|
+
this.client.on('connectionSuccess', (eventData) => {
|
|
61
90
|
logger_1.logger.info('Device Agent has connected to the cloud.');
|
|
91
|
+
logger_1.logger.debug(`Connack: ${JSON.stringify(eventData.connack)}`);
|
|
92
|
+
logger_1.logger.debug(`Settings: ${JSON.stringify(eventData.settings)}`);
|
|
62
93
|
this.connected = true;
|
|
63
94
|
connectCallback();
|
|
64
95
|
});
|
|
65
|
-
this.
|
|
66
|
-
logger_1.logger.
|
|
96
|
+
this.client.on('disconnection', (eventData) => {
|
|
97
|
+
logger_1.logger.info('Device Agent has been disconnected from the cloud');
|
|
98
|
+
logger_1.logger.info(`Disconnection event: ${eventData.error.toString()}`);
|
|
99
|
+
if (eventData.disconnect !== undefined) {
|
|
100
|
+
logger_1.logger.debug('Disconnect packet: ' + JSON.stringify(eventData.disconnect));
|
|
101
|
+
}
|
|
67
102
|
this.connected = false;
|
|
68
103
|
});
|
|
69
|
-
this.
|
|
70
|
-
logger_1.logger.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
104
|
+
this.client.on('connectionFailure', (eventData) => {
|
|
105
|
+
logger_1.logger.error(`Error connecting to the AWS IoT Core! Disconnection event: ${eventData.error.toString()}`);
|
|
106
|
+
if (eventData.connack) {
|
|
107
|
+
logger_1.logger.debug('Disconnect packet: ' + JSON.stringify(eventData.connack));
|
|
108
|
+
}
|
|
74
109
|
this.connected = false;
|
|
75
110
|
});
|
|
76
|
-
this.
|
|
77
|
-
logger_1.logger.
|
|
111
|
+
this.client.on('error', (error) => {
|
|
112
|
+
logger_1.logger.error(`Error connecting to the AWS IoT Core! Error:\n${(0, util_1.stringifyError)(error)}`);
|
|
78
113
|
this.connected = false;
|
|
79
114
|
});
|
|
80
|
-
this.
|
|
81
|
-
logger_1.logger.warn(`Device Agent
|
|
115
|
+
this.client.on('stopped', () => {
|
|
116
|
+
logger_1.logger.warn(`Device Agent has stopped ${new Date().toLocaleString()}`);
|
|
82
117
|
void this.logConnectionInfo();
|
|
83
118
|
this.connected = false;
|
|
84
119
|
});
|
|
85
|
-
this.
|
|
86
|
-
|
|
120
|
+
this.client.on('messageReceived', (eventData) => {
|
|
121
|
+
const topic = eventData.message.topicName;
|
|
122
|
+
const payloadBuffer = eventData.message.payload;
|
|
87
123
|
try {
|
|
88
|
-
const
|
|
89
|
-
|
|
124
|
+
const payloadString = payloadBuffer
|
|
125
|
+
? Buffer.from(new Uint8Array(payloadBuffer)).toString('utf-8')
|
|
126
|
+
: null;
|
|
127
|
+
logger_1.logger.debug(`Message received on topic: ${topic}:\n${payloadString}`);
|
|
128
|
+
if (payloadString) {
|
|
129
|
+
const parsed = JSON.parse(payloadString);
|
|
130
|
+
this.dispatch(eventData.message.topicName, parsed);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
logger_1.logger.warn(`Empty payload received on topic: ${topic}`);
|
|
134
|
+
}
|
|
90
135
|
}
|
|
91
136
|
catch (e) {
|
|
92
|
-
logger_1.logger.error(`Error parsing message
|
|
137
|
+
logger_1.logger.error(`Error parsing message on topic ${eventData.message.topicName}!:\n${(0, util_1.stringifyError)(e)}`);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
waitForConnection(timeoutMs = 10000) {
|
|
142
|
+
return new Promise((resolve, reject) => {
|
|
143
|
+
if (this.connected) {
|
|
144
|
+
return resolve(); // already connected
|
|
93
145
|
}
|
|
146
|
+
const timeout = setTimeout(() => {
|
|
147
|
+
reject(new Error('Timed out waiting for MQTT connection'));
|
|
148
|
+
}, timeoutMs);
|
|
149
|
+
this.client.on('connectionSuccess', () => {
|
|
150
|
+
clearTimeout(timeout);
|
|
151
|
+
this.connected = true;
|
|
152
|
+
resolve();
|
|
153
|
+
});
|
|
154
|
+
this.client.on('disconnection', (event) => {
|
|
155
|
+
const errorString = event.error
|
|
156
|
+
? event.error.toString()
|
|
157
|
+
: 'Unknown reason';
|
|
158
|
+
logger_1.logger.warn(`Disconnected while waiting for connection: ${errorString}`);
|
|
159
|
+
reject(new Error(`Disconnected: ${errorString}`));
|
|
160
|
+
});
|
|
94
161
|
});
|
|
95
162
|
}
|
|
96
163
|
async logConnectionInfo() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../src/cloud-connection/connection-manager.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../src/cloud-connection/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-agent-cloud-connection.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/device-agent-cloud-connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"device-agent-cloud-connection.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/device-agent-cloud-connection.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAA+B,MAAM,kBAAkB,CAAC;AAQ9E,qBAAa,0BAA0B;IACrC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,kBAAkB,CAAqB;IACxC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CACS;;IAuGtC,WAAW,IAAI,MAAM;IAIrB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIrC,IAAI;IAUJ,iBAAiB;IAMjB,UAAU,CAAC,SAAS,EAAE,MAAM;IAM5B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;CAGpD;AAED,wBAAsB,4BAA4B,kBA4BjD"}
|
|
@@ -13,7 +13,6 @@ const check_for_updates_1 = require("../util/check-for-updates");
|
|
|
13
13
|
const get_device_id_1 = require("../util/get-device-id");
|
|
14
14
|
const logger_1 = require("../util/logger");
|
|
15
15
|
const sleep_1 = require("../util/sleep");
|
|
16
|
-
const bootstrap_provision_1 = require("./bootstrap-provision");
|
|
17
16
|
const live_updates_handler_1 = require("./live-updates-handler");
|
|
18
17
|
const passthrough_handler_1 = require("./passthrough-handler");
|
|
19
18
|
const publisher_1 = require("./publisher");
|
|
@@ -22,6 +21,7 @@ const job_handler_1 = require("../jobs/job-handler");
|
|
|
22
21
|
const transaction_manager_1 = require("./transaction-manager");
|
|
23
22
|
const connection_manager_1 = require("./connection-manager");
|
|
24
23
|
const device_agent_message_handler_1 = require("./device-agent-message-handler");
|
|
24
|
+
const bootstrap_agent_1 = require("./bootstrap-agent");
|
|
25
25
|
class DeviceAgentCloudConnection {
|
|
26
26
|
constructor() {
|
|
27
27
|
this.clientId = (0, get_device_id_1.getDeviceUuid)();
|
|
@@ -30,7 +30,12 @@ class DeviceAgentCloudConnection {
|
|
|
30
30
|
this.toDeviceTopic = (0, device_agent_schemas_1.getToDeviceTopic)(this.clientId);
|
|
31
31
|
this.secureTunnelHandler = secure_tunneling_1.SecureTunnelHandlerSingleton.getInstance();
|
|
32
32
|
// Initialize & setup the connection
|
|
33
|
-
|
|
33
|
+
const deviceAgentConfig = {
|
|
34
|
+
clientId: this.clientId,
|
|
35
|
+
host: this.host,
|
|
36
|
+
port: this.port
|
|
37
|
+
};
|
|
38
|
+
this.connectionManager = new connection_manager_1.ConnectionManager(deviceAgentConfig);
|
|
34
39
|
this.publisher = new publisher_1.Publisher(this.connectionManager, this.clientId);
|
|
35
40
|
this.shadowHandler = new shadow_handler_1.ShadowHandler(this.clientId, this.publisher);
|
|
36
41
|
this.liveUpdatesHandler = new live_updates_handler_1.LiveUpdatesHandler();
|
|
@@ -87,7 +92,7 @@ class DeviceAgentCloudConnection {
|
|
|
87
92
|
// lost since we aren't waiting for responses so sleep for a short time to
|
|
88
93
|
// receive them
|
|
89
94
|
await (0, sleep_1.default)(1000);
|
|
90
|
-
this.connectionManager.disconnect();
|
|
95
|
+
await this.connectionManager.disconnect();
|
|
91
96
|
}
|
|
92
97
|
// CLI methods
|
|
93
98
|
async waitForConnection() {
|
|
@@ -108,7 +113,8 @@ exports.DeviceAgentCloudConnection = DeviceAgentCloudConnection;
|
|
|
108
113
|
async function runDeviceAgentCloudInterface() {
|
|
109
114
|
logger_1.logger.info(`Starting alwaysAI Device Agent v${await (0, check_for_updates_1.getDeviceAgentVersion)()}`);
|
|
110
115
|
if ((0, fs_1.existsSync)((0, device_certificate_1.getBootstrapPrivateKeyFilePath)())) {
|
|
111
|
-
|
|
116
|
+
const bootstrapAgent = new bootstrap_agent_1.BootstrapAgent();
|
|
117
|
+
await bootstrapAgent.bootstrapProvision();
|
|
112
118
|
return;
|
|
113
119
|
}
|
|
114
120
|
const filesAlreadyMigrated = await (0, required_config_checks_1.requiredConfigFilesPresentAndValid)();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-agent-cloud-connection.js","sourceRoot":"","sources":["../../src/cloud-connection/device-agent-cloud-connection.ts"],"names":[],"mappings":";;;AAAA,yEAIwC;AACxC,2BAAgC;AAEhC,6EAAsF;AACtF,0FAAsG;AACtG,qFAA8F;AAC9F,iDAA+D;AAC/D,2EAAoF;AACpF,qGAA+F;AAC/F,iEAAkE;AAClE,yDAAsD;AACtD,2CAAwC;AACxC,yCAAkC;AAClC
|
|
1
|
+
{"version":3,"file":"device-agent-cloud-connection.js","sourceRoot":"","sources":["../../src/cloud-connection/device-agent-cloud-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passthrough-handler.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/passthrough-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAahC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"passthrough-handler.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/passthrough-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAahC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AASjD,qBAAa,kBAAkB;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IACxC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;IACtB,WAAW,MAAC;gBAEP,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa;YAKhD,yBAAyB;YA6EzB,wBAAwB;YAwExB,8BAA8B;IAetC,GAAG;CAoCV"}
|
|
@@ -8,8 +8,6 @@ const constants_1 = require("../local-connection/constants");
|
|
|
8
8
|
const rabbitmq_container_1 = require("../local-connection/rabbitmq-container");
|
|
9
9
|
const logger_1 = require("../util/logger");
|
|
10
10
|
const sleep_1 = require("../util/sleep");
|
|
11
|
-
const messageQueue = [];
|
|
12
|
-
const ackQueue = [];
|
|
13
11
|
const MAX_LOCAL_CONNECTION_ATTEMPTS = 10;
|
|
14
12
|
/*
|
|
15
13
|
Responsible for managing the lifecycle of the Local Connection container
|
|
@@ -23,58 +21,64 @@ class PassthroughHandler {
|
|
|
23
21
|
}
|
|
24
22
|
async runLocalConnectionChannel() {
|
|
25
23
|
logger_1.logger.debug('Beginning to consume packets from Local Connection');
|
|
26
|
-
await this.channel.consume(this.packetQueue, (msg) => {
|
|
27
|
-
|
|
28
|
-
if ((msg === null || msg === void 0 ? void 0 : msg.content)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
await this.channel.consume(this.packetQueue, async (msg) => {
|
|
25
|
+
var _a;
|
|
26
|
+
if (!(msg === null || msg === void 0 ? void 0 : msg.content))
|
|
27
|
+
return;
|
|
28
|
+
let packet;
|
|
29
|
+
try {
|
|
30
|
+
const raw = msg.content.toString();
|
|
31
|
+
// Currently, edgeIQ is calling json.dumps twice, so a single JSON.parse
|
|
32
|
+
// results in a string return value, which is needed by publishToCloudWithAck.
|
|
33
|
+
// We will update the edgeIQ implementation in the future.
|
|
34
|
+
packet = JSON.parse(raw);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
logger_1.logger.error(`Error parsing RabbitMQ packet: ${(0, util_1.stringifyError)(err)}`);
|
|
38
|
+
this.channel.ack(msg);
|
|
39
|
+
logger_1.logger.debug('Problematic packet was acknowledged');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// We do a second call to JSON.parse here only to retrieve the 'action' field
|
|
43
|
+
// NOTE: this second call to JSON.parse seems to alter the packet contents
|
|
44
|
+
// (at least when a rounded floating point value is included)
|
|
45
|
+
const action = (_a = JSON.parse(packet)) === null || _a === void 0 ? void 0 : _a['action'];
|
|
46
|
+
switch (action) {
|
|
47
|
+
case 'status':
|
|
48
|
+
case 'analytics': {
|
|
34
49
|
try {
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
case 'analytics':
|
|
39
|
-
ackQueue.push(msg);
|
|
40
|
-
// FIXME: put real topic here
|
|
41
|
-
this.publisher.publishToCloudWithAck(packet, (errOrResp) => {
|
|
42
|
-
while (ackQueue.length > 0) {
|
|
43
|
-
const msg = ackQueue.shift();
|
|
44
|
-
if (errOrResp === true) {
|
|
45
|
-
this.channel.ack(msg); // acknowledge, allow queue to discard
|
|
46
|
-
}
|
|
47
|
-
else if (errOrResp === false) {
|
|
48
|
-
this.channel.reject(msg, true); // reject and requeue
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
break;
|
|
53
|
-
case 'heartbeat':
|
|
54
|
-
this.channel.ack(msg);
|
|
55
|
-
logger_1.logger.silly(`Heartbeat package received & acknowledged: ${packet}`);
|
|
56
|
-
break;
|
|
57
|
-
default:
|
|
58
|
-
this.channel.ack(msg);
|
|
59
|
-
logger_1.logger.debug(`Unknown 'action' package received & acknowledged: ${packet}`);
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
50
|
+
const success = await this.publisher.publishToCloudWithAck(packet);
|
|
51
|
+
if (success) {
|
|
52
|
+
this.channel.ack(msg);
|
|
62
53
|
}
|
|
63
54
|
else {
|
|
64
|
-
this.channel.
|
|
65
|
-
logger_1.logger.debug(`Received & acknowledged a RabbitMQ packet of unknown structure: ${parsedPacket}`);
|
|
55
|
+
this.channel.reject(msg, true); // requeue on failure
|
|
66
56
|
}
|
|
67
57
|
}
|
|
68
|
-
catch (
|
|
69
|
-
logger_1.logger.error(`
|
|
70
|
-
this.channel.
|
|
71
|
-
|
|
58
|
+
catch (err) {
|
|
59
|
+
logger_1.logger.error(`Error publishing analytics packet: ${(0, util_1.stringifyError)(err)}`);
|
|
60
|
+
this.channel.reject(msg, true);
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case 'heartbeat': {
|
|
65
|
+
this.channel.ack(msg);
|
|
66
|
+
logger_1.logger.silly(`Heartbeat packet received & acknowledged:\n${packet}`);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
default: {
|
|
70
|
+
this.channel.ack(msg);
|
|
71
|
+
if (action) {
|
|
72
|
+
logger_1.logger.debug(`Unknown 'action' packet received & acknowledged:\n${packet}`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
logger_1.logger.debug(`Received & acknowledged a RabbitMQ packet of unknown structure:\n${packet}`);
|
|
72
76
|
}
|
|
77
|
+
break;
|
|
73
78
|
}
|
|
74
79
|
}
|
|
75
|
-
}, {
|
|
76
|
-
|
|
77
|
-
});
|
|
80
|
+
}, { noAck: false } // message must be explicitly acked/rejected
|
|
81
|
+
);
|
|
78
82
|
}
|
|
79
83
|
async establishLocalConnection() {
|
|
80
84
|
let connectAttempts = 0;
|