@alwaysai/device-agent 2.0.2-0 → 2.0.2
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/application-control/install.d.ts.map +1 -1
- package/lib/application-control/install.js +5 -1
- package/lib/application-control/install.js.map +1 -1
- package/lib/cloud-connection/connection-manager.d.ts +3 -4
- package/lib/cloud-connection/connection-manager.d.ts.map +1 -1
- package/lib/cloud-connection/connection-manager.js +20 -38
- package/lib/cloud-connection/connection-manager.js.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +3 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +49 -38
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/environment.d.ts +3 -0
- package/lib/environment.d.ts.map +1 -1
- package/lib/environment.js +12 -1
- package/lib/environment.js.map +1 -1
- package/lib/jobs/job-handler.d.ts +1 -1
- package/lib/jobs/job-handler.d.ts.map +1 -1
- package/lib/jobs/job-handler.js +4 -4
- package/lib/jobs/job-handler.js.map +1 -1
- package/lib/subcommands/app/analytics.d.ts.map +1 -1
- package/lib/subcommands/app/analytics.js +2 -3
- package/lib/subcommands/app/analytics.js.map +1 -1
- package/lib/subcommands/app/env-vars.d.ts.map +1 -1
- package/lib/subcommands/app/env-vars.js +4 -6
- package/lib/subcommands/app/env-vars.js.map +1 -1
- package/lib/subcommands/app/models.d.ts.map +1 -1
- package/lib/subcommands/app/models.js +2 -3
- package/lib/subcommands/app/models.js.map +1 -1
- package/lib/subcommands/app/shadow.d.ts.map +1 -1
- package/lib/subcommands/app/shadow.js +4 -6
- package/lib/subcommands/app/shadow.js.map +1 -1
- package/lib/subcommands/app/version.d.ts.map +1 -1
- package/lib/subcommands/app/version.js +6 -9
- package/lib/subcommands/app/version.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +16 -4
- package/src/application-control/install.ts +8 -3
- package/src/cloud-connection/connection-manager.ts +21 -43
- package/src/cloud-connection/device-agent-cloud-connection.ts +91 -79
- package/src/environment.ts +18 -0
- package/src/jobs/job-handler.ts +4 -4
- package/src/subcommands/app/analytics.ts +2 -3
- package/src/subcommands/app/env-vars.ts +4 -6
- package/src/subcommands/app/models.ts +2 -3
- package/src/subcommands/app/shadow.ts +4 -6
- package/src/subcommands/app/version.ts +7 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../../../src/subcommands/app/env-vars.ts"],"names":[],"mappings":";;;AAAA,mDAK6B;AAC7B,mEAAuD;AACvD,wGAAkG;AAClG,4CAAqC;AACrC,yEAIwC;AAE3B,QAAA,iBAAiB,GAAG,IAAA,mBAAO,EAAC;IACvC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,8CAA8C;IAC3D,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,IAAA,gCAAU,EAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;CACF,CAAC,CAAC;AAEU,QAAA,aAAa,GAAG,IAAA,mBAAO,EAAC;IACnC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,yCAAyC;IACtD,eAAe,EAAE,IAAA,+BAAmB,EAAC;QACnC,WAAW,EAAE,iCAAiC;QAC9C,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,yDAAyD;YACtE,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI;QACrB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC7C,MAAM,WAAW,GAAG,MAAM,IAAA,gCAAU,EAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACpD,MAAM,OAAO,GAAY,EAAE,CAAC,OAAO,CAAC,oBAAO,WAAW,CAAC,OAAO,CAAC,CAAE,EAAE,CAAC;QAEpE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE;YAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBACxB,MAAM,IAAI,yBAAa,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;aACrD;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,0DAA0B,EAAE,CAAC;QAErD,MAAM,QAAQ,GAAG;YACf,CAAC,SAAS,CAAC,EAAE;gBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aACjC;SACF,CAAC;QACF,WAAW,CAAC,SAAS,CAAC,OAAO,CAC3B,IAAA,qCAAc,EAAC,WAAW,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,EAC/D,IAAI,CAAC,SAAS,CACZ,IAAA,+CAAwB,EAAC;YACvB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,QAAQ;SAClB,CAAC,CACH,CACF,CAAC;QACF,0DAA0D;QAC1D,MAAM,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;QAEnB,
|
|
1
|
+
{"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../../../src/subcommands/app/env-vars.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/models.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,oBAAoB;;4DAc/B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/models.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,oBAAoB;;4DAc/B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;4DA+C1B,CAAC"}
|
|
@@ -49,15 +49,14 @@ exports.addModelCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
|
49
49
|
appConfig: JSON.stringify(newAppCfg)
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
|
+
await deviceAgent.waitForConnection();
|
|
52
53
|
deviceAgent.publisher.publish((0, device_agent_schemas_1.getShadowTopic)(deviceAgent.getClientId(), 'projects', 'update'), JSON.stringify((0, device_agent_schemas_1.buildUpdateShadowMessage)({
|
|
53
54
|
clientId: 'client',
|
|
54
55
|
desired: toDesire
|
|
55
56
|
})));
|
|
56
57
|
// Sleep for extra time to ensure time for shadow response
|
|
57
58
|
await (0, sleep_1.default)(10000);
|
|
58
|
-
|
|
59
|
-
await (0, sleep_1.default)(1000);
|
|
60
|
-
}
|
|
59
|
+
await deviceAgent.waitForCmd(projectId);
|
|
61
60
|
await deviceAgent.stop();
|
|
62
61
|
}
|
|
63
62
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/subcommands/app/models.ts"],"names":[],"mappings":";;;AAAA,mDAA8D;AAC9D,mEAAyE;AACzE,wGAAkG;AAClG,4CAAqC;AACrC,yEAGwC;AAE3B,QAAA,oBAAoB,GAAG,IAAA,mBAAO,EAAC;IAC1C,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,IAAA,kCAAY,EAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC;AAEU,QAAA,eAAe,GAAG,IAAA,mBAAO,EAAC;IACrC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,gCAAgC;IAC7C,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,KAAK,EAAE,IAAA,0BAAc,EAAC;YACpB,WAAW,EAAE,UAAU;YACvB,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,eAAe;YAC5B,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,0DAA0B,EAAE,CAAC;QAErD,gCAAgC;QAEhC,MAAM,SAAS,GAAG,MAAM,IAAA,oCAAc,EAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACjE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG;YACf,CAAC,SAAS,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;aACrC;SACF,CAAC;QACF,WAAW,CAAC,SAAS,CAAC,OAAO,CAC3B,IAAA,qCAAc,EAAC,WAAW,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,EAC/D,IAAI,CAAC,SAAS,CACZ,IAAA,+CAAwB,EAAC;YACvB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,QAAQ;SAClB,CAAC,CACH,CACF,CAAC;QACF,0DAA0D;QAC1D,MAAM,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;QAEnB,
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/subcommands/app/models.ts"],"names":[],"mappings":";;;AAAA,mDAA8D;AAC9D,mEAAyE;AACzE,wGAAkG;AAClG,4CAAqC;AACrC,yEAGwC;AAE3B,QAAA,oBAAoB,GAAG,IAAA,mBAAO,EAAC;IAC1C,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,IAAA,kCAAY,EAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC;AAEU,QAAA,eAAe,GAAG,IAAA,mBAAO,EAAC;IACrC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,gCAAgC;IAC7C,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,KAAK,EAAE,IAAA,0BAAc,EAAC;YACpB,WAAW,EAAE,UAAU;YACvB,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,eAAe;YAC5B,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,0DAA0B,EAAE,CAAC;QAErD,gCAAgC;QAEhC,MAAM,SAAS,GAAG,MAAM,IAAA,oCAAc,EAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACjE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG;YACf,CAAC,SAAS,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;aACrC;SACF,CAAC;QACF,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACtC,WAAW,CAAC,SAAS,CAAC,OAAO,CAC3B,IAAA,qCAAc,EAAC,WAAW,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,EAC/D,IAAI,CAAC,SAAS,CACZ,IAAA,+CAAwB,EAAC;YACvB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,QAAQ;SAClB,CAAC,CACH,CACF,CAAC;QACF,0DAA0D;QAC1D,MAAM,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;QAEnB,MAAM,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/shadow.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/shadow.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB;;4DAoB3B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;4DAoB9B,CAAC"}
|
|
@@ -16,12 +16,11 @@ exports.getShadowCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
|
16
16
|
async action(_, opts) {
|
|
17
17
|
const { project } = opts;
|
|
18
18
|
const deviceAgent = new device_agent_cloud_connection_1.DeviceAgentCloudConnection();
|
|
19
|
+
await deviceAgent.waitForConnection();
|
|
19
20
|
deviceAgent.shadowHandler.getProjectShadowUpdates();
|
|
20
21
|
// 5 seconds should cover the response wait time
|
|
21
22
|
await (0, sleep_1.default)(5000);
|
|
22
|
-
|
|
23
|
-
await (0, sleep_1.default)(1000);
|
|
24
|
-
}
|
|
23
|
+
await deviceAgent.waitForCmd(project);
|
|
25
24
|
await deviceAgent.stop();
|
|
26
25
|
}
|
|
27
26
|
});
|
|
@@ -37,12 +36,11 @@ exports.updateShadowCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
|
37
36
|
async action(_, opts) {
|
|
38
37
|
const { project } = opts;
|
|
39
38
|
const deviceAgent = new device_agent_cloud_connection_1.DeviceAgentCloudConnection();
|
|
39
|
+
await deviceAgent.waitForConnection();
|
|
40
40
|
await deviceAgent.shadowHandler.updateProjectShadow(project);
|
|
41
41
|
// 5 seconds should cover the response wait time
|
|
42
42
|
await (0, sleep_1.default)(5000);
|
|
43
|
-
|
|
44
|
-
await (0, sleep_1.default)(1000);
|
|
45
|
-
}
|
|
43
|
+
await deviceAgent.waitForCmd(project);
|
|
46
44
|
await deviceAgent.stop();
|
|
47
45
|
}
|
|
48
46
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow.js","sourceRoot":"","sources":["../../../src/subcommands/app/shadow.ts"],"names":[],"mappings":";;;AAAA,mDAA8D;AAC9D,wGAAkG;AAClG,4CAAqC;AAExB,QAAA,gBAAgB,GAAG,IAAA,mBAAO,EAAC;IACtC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,wBAAwB;IACrC,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,0DAA0B,EAAE,CAAC;QACrD,WAAW,CAAC,aAAa,CAAC,uBAAuB,EAAE,CAAC;QAEpD,gDAAgD;QAChD,MAAM,IAAA,eAAK,EAAC,IAAI,CAAC,CAAC;QAClB,
|
|
1
|
+
{"version":3,"file":"shadow.js","sourceRoot":"","sources":["../../../src/subcommands/app/shadow.ts"],"names":[],"mappings":";;;AAAA,mDAA8D;AAC9D,wGAAkG;AAClG,4CAAqC;AAExB,QAAA,gBAAgB,GAAG,IAAA,mBAAO,EAAC;IACtC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,wBAAwB;IACrC,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,0DAA0B,EAAE,CAAC;QACrD,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACtC,WAAW,CAAC,aAAa,CAAC,uBAAuB,EAAE,CAAC;QAEpD,gDAAgD;QAChD,MAAM,IAAA,eAAK,EAAC,IAAI,CAAC,CAAC;QAClB,MAAM,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC;AAEU,QAAA,mBAAmB,GAAG,IAAA,mBAAO,EAAC;IACzC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,8DAA8D;IAC3E,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,0DAA0B,EAAE,CAAC;QACrD,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACtC,MAAM,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE7D,gDAAgD;QAChD,MAAM,IAAA,eAAK,EAAC,IAAI,CAAC,CAAC;QAClB,MAAM,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/version.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/subcommands/app/version.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,eAAe,yKAQ1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;4DAiE5B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;4DA4B9B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;4DAc7B,CAAC"}
|
|
@@ -6,7 +6,6 @@ const device_agent_schemas_1 = require("@alwaysai/device-agent-schemas");
|
|
|
6
6
|
const application_control_1 = require("../../application-control");
|
|
7
7
|
const device_agent_cloud_connection_1 = require("../../cloud-connection/device-agent-cloud-connection");
|
|
8
8
|
const agent_config_1 = require("../../infrastructure/agent-config");
|
|
9
|
-
const sleep_1 = require("../../util/sleep");
|
|
10
9
|
const logger_1 = require("../../util/logger");
|
|
11
10
|
exports.listAppsCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
12
11
|
name: 'list',
|
|
@@ -69,10 +68,9 @@ exports.installAppCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
|
69
68
|
envVars
|
|
70
69
|
}
|
|
71
70
|
};
|
|
72
|
-
await deviceAgent.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
71
|
+
await deviceAgent.waitForConnection();
|
|
72
|
+
await deviceAgent.sendCliCmd(topic, message);
|
|
73
|
+
await deviceAgent.waitForCmd(project);
|
|
76
74
|
await deviceAgent.stop();
|
|
77
75
|
}
|
|
78
76
|
});
|
|
@@ -99,10 +97,9 @@ exports.uninstallAppCliLeaf = (0, alwayscli_1.CliLeaf)({
|
|
|
99
97
|
projectId: project
|
|
100
98
|
}
|
|
101
99
|
};
|
|
102
|
-
await deviceAgent.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
100
|
+
await deviceAgent.waitForConnection();
|
|
101
|
+
await deviceAgent.sendCliCmd(topic, message);
|
|
102
|
+
await deviceAgent.waitForCmd(project);
|
|
106
103
|
await deviceAgent.stop();
|
|
107
104
|
}
|
|
108
105
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/subcommands/app/version.ts"],"names":[],"mappings":";;;AAAA,mDAA6E;AAC7E,yEAKwC;AACxC,mEAAwD;AACxD,wGAAkG;AAClG,oEAAoE;
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/subcommands/app/version.ts"],"names":[],"mappings":";;;AAAA,mDAA6E;AAC7E,yEAKwC;AACxC,mEAAwD;AACxD,wGAAkG;AAClG,oEAAoE;AAEpE,8CAA2C;AAG9B,QAAA,eAAe,GAAG,IAAA,mBAAO,EAAC;IACrC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,yBAAyB;IACtC,WAAW,EAAE,EAAE;IACf,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,IAAI,GAAG,MAAM,IAAA,8BAAe,GAAE,CAAC,OAAO,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;CACF,CAAC,CAAC;AAEU,QAAA,iBAAiB,GAAG,IAAA,mBAAO,EAAC;IACvC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,wCAAwC;IACrD,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,cAAc,EAAE,IAAA,0BAAc,EAAC;YAC7B,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,WAAW,EAAE,IAAA,0BAAc,EAAC;YAC1B,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,IAAI;SACb,CAAC;QACF,MAAM,EAAE,IAAA,0BAAc,EAAC;YACrB,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,IAAI;SACb,CAAC;QACF,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,qCAAqC;YAClD,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EACJ,OAAO,EACP,WAAW,EACX,cAAc,EAAE,cAAc,EAC9B,MAAM,EACN,OAAO,EACR,GAAG,IAAI,CAAC;QACT,IAAI,WAAW,EAAE;YACf,eAAM,CAAC,IAAI,CACT,sGAAsG,CACvG,CAAC;SACH;QACD,MAAM,mBAAmB,GAAG,cAAc,IAAI,WAAW,CAAC;QAC1D,IAAI,mBAAmB,KAAK,SAAS,EAAE;YACrC,MAAM,IAAI,yBAAa,CAAC,kCAAkC,CAAC,CAAC;SAC7D;QACD,MAAM,WAAW,GAAG,IAAI,0DAA0B,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,IAAA,uCAAgB,EAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAA6B;YACxC,SAAS,EAAE,EAAE;YACb,KAAK;YACL,WAAW,EAAE,iCAAU,CAAC,wBAAwB,CAAC,mBAAmB;YACpE,IAAI,EAAE,IAAA,mCAAY,GAAE;YACpB,OAAO,EAAE;gBACP,WAAW,EAAE,iCAAU,CAAC,iBAAiB,CAAC,OAAO;gBACjD,SAAS,EAAE,OAAO;gBAClB,cAAc,EAAE,mBAAmB;gBACnC,MAAM;gBACN,OAAO;aACR;SACF,CAAC;QACF,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACtC,MAAM,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC;AAEU,QAAA,mBAAmB,GAAG,IAAA,mBAAO,EAAC;IACzC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,wBAAwB;IACrC,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,0DAA0B,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,IAAA,uCAAgB,EAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAA6B;YACxC,SAAS,EAAE,EAAE;YACb,KAAK;YACL,WAAW,EAAE,iCAAU,CAAC,wBAAwB,CAAC,mBAAmB;YACpE,IAAI,EAAE,IAAA,mCAAY,GAAE;YACpB,OAAO,EAAE;gBACP,WAAW,EAAE,iCAAU,CAAC,iBAAiB,CAAC,SAAS;gBACnD,SAAS,EAAE,OAAO;aACnB;SACF,CAAC;QACF,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACtC,MAAM,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC;AAEU,QAAA,kBAAkB,GAAG,IAAA,mBAAO,EAAC;IACxC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,kDAAkD;IAC/D,WAAW,EAAE;QACX,OAAO,EAAE,IAAA,0BAAc,EAAC;YACtB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACD,MAAM,EAAE,IAAI;IACZ,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,IAAA,iCAAW,EAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC,CAAC"}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -53,14 +53,23 @@ change.
|
|
|
53
53
|
* Passwordless `sudo` for `/sbin/shutdown` for device restart functionality
|
|
54
54
|
|
|
55
55
|
To enable passwordless `sudo` for `npm` and `sbin/shutdown` for the current
|
|
56
|
-
user, run `sudo visudo` and add the following lines
|
|
56
|
+
user, run `sudo visudo` and add the following lines, where `<username>` is replaced with your username on the device:
|
|
57
|
+
|
|
58
|
+
> **Note**: It is critical that these lines be added to the **end of the file**.
|
|
57
59
|
|
|
58
60
|
```bash
|
|
59
|
-
<username>
|
|
60
|
-
<username>
|
|
61
|
+
<username> ALL = NOPASSWD: /usr/bin/pm2
|
|
62
|
+
<username> ALL = NOPASSWD: /usr/lib/node_modules/pm2/bin/pm2
|
|
63
|
+
<username> ALL = NOPASSWD: /usr/bin/npm
|
|
64
|
+
<username> ALL = NOPASSWD: /sbin/shutdown
|
|
61
65
|
```
|
|
62
66
|
|
|
63
|
-
On a linux system
|
|
67
|
+
On a linux system, the username can be obtained by typing `whoami` into the terminal. For example:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
$ whoami
|
|
71
|
+
alwaysAI
|
|
72
|
+
```
|
|
64
73
|
|
|
65
74
|
## Provision Device
|
|
66
75
|
|
|
@@ -429,6 +438,7 @@ $ pm2 delete 0
|
|
|
429
438
|
$ pm2 flush
|
|
430
439
|
$ pm2 unstartup
|
|
431
440
|
```
|
|
441
|
+
|
|
432
442
|
### Remove the device configuration
|
|
433
443
|
|
|
434
444
|
Open a new terminal and run `aai-agent device clean`.
|
|
@@ -443,3 +453,5 @@ running `aai-agent`. You should see a response similar to
|
|
|
443
453
|
|
|
444
454
|
Go to the [Devices](https://console.alwaysai.co/dashboard/devices) tab, find the
|
|
445
455
|
device in question, and remove the device using the trashcan icon.
|
|
456
|
+
|
|
457
|
+
|
|
@@ -16,7 +16,8 @@ import {
|
|
|
16
16
|
appCleanDocker,
|
|
17
17
|
getPythonVenvPaths,
|
|
18
18
|
createPythonVenv,
|
|
19
|
-
installPythonReqs
|
|
19
|
+
installPythonReqs,
|
|
20
|
+
TargetHardware
|
|
20
21
|
} from 'alwaysai/lib/core/app';
|
|
21
22
|
import { DOCKER_IMAGE_ID_INITIAL_VALUE } from 'alwaysai/lib/constants';
|
|
22
23
|
import { runInDir } from '../util/run-in-dir';
|
|
@@ -30,6 +31,7 @@ import {
|
|
|
30
31
|
} from '../local-connection/constants';
|
|
31
32
|
import { DOCKERFILE, PYTHON_REQUIREMENTS_FILE_NAME } from 'alwaysai/lib/paths';
|
|
32
33
|
import { downloadToFile } from '../util/file';
|
|
34
|
+
import { ALWAYSAI_TARGET_HW_OVERRIDE, parseTargetHW } from '../environment';
|
|
33
35
|
import { setEnvInternal } from './environment-variables';
|
|
34
36
|
import { AppConfig } from '@alwaysai/app-configuration-schemas';
|
|
35
37
|
|
|
@@ -234,15 +236,18 @@ async function checkValidProjectFiles({ appDir }) {
|
|
|
234
236
|
if (!AppJsonFile(appDir).readIfExists()) {
|
|
235
237
|
throw new Error('App JSON file does not exist!');
|
|
236
238
|
}
|
|
237
|
-
|
|
238
239
|
// write target json
|
|
239
240
|
if (!fs.existsSync(path.join(appDir, DOCKERFILE))) {
|
|
240
241
|
throw new Error('No Dockerfile found for application!');
|
|
241
242
|
}
|
|
243
|
+
const targetHw: TargetHardware =
|
|
244
|
+
parseTargetHW(ALWAYSAI_TARGET_HW_OVERRIDE) ??
|
|
245
|
+
(await getTargetHardwareType({}));
|
|
246
|
+
logger.debug(`Target Hardware selected to: ${targetHw}`);
|
|
242
247
|
TargetJsonFile(appDir).write({
|
|
243
248
|
targetProtocol: 'docker:',
|
|
244
249
|
dockerImageId: DOCKER_IMAGE_ID_INITIAL_VALUE,
|
|
245
|
-
targetHardware:
|
|
250
|
+
targetHardware: targetHw
|
|
246
251
|
});
|
|
247
252
|
}
|
|
248
253
|
|
|
@@ -16,40 +16,32 @@ export class ConnectionManager extends MessageDispatcher<any> {
|
|
|
16
16
|
private clientId: string;
|
|
17
17
|
private host: string;
|
|
18
18
|
private port: number;
|
|
19
|
-
private device: awsIot.device
|
|
19
|
+
private device: awsIot.device;
|
|
20
20
|
private subscribedTopics: Set<string> = new Set();
|
|
21
|
+
private connected = false;
|
|
21
22
|
|
|
22
23
|
constructor(clientId: string, host: string, port: number) {
|
|
23
24
|
super();
|
|
24
25
|
this.clientId = clientId;
|
|
25
26
|
this.host = host;
|
|
26
27
|
this.port = port;
|
|
28
|
+
this.device = awsIot.device({
|
|
29
|
+
keyPath: DEVICE_PRIVATE_KEY_FILE_PATH,
|
|
30
|
+
certPath: DEVICE_CERTIFICATE_FILE_PATH,
|
|
31
|
+
caPath: AWS_ROOT_CERTIFICATE_FILE_PATH,
|
|
32
|
+
clientId: this.clientId,
|
|
33
|
+
host: this.host,
|
|
34
|
+
port: this.port,
|
|
35
|
+
keepalive: 10 // time before re-connect attempt on dropped connection, default is 400 seconds
|
|
36
|
+
});
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
public getIoTDevice() {
|
|
30
40
|
return this.device;
|
|
31
41
|
}
|
|
32
42
|
|
|
33
|
-
public connect(cb): void {
|
|
34
|
-
try {
|
|
35
|
-
this.device = awsIot.device({
|
|
36
|
-
keyPath: DEVICE_PRIVATE_KEY_FILE_PATH,
|
|
37
|
-
certPath: DEVICE_CERTIFICATE_FILE_PATH,
|
|
38
|
-
caPath: AWS_ROOT_CERTIFICATE_FILE_PATH,
|
|
39
|
-
clientId: this.clientId,
|
|
40
|
-
host: this.host,
|
|
41
|
-
port: this.port,
|
|
42
|
-
keepalive: 10 // time before re-connect attempt on dropped connection, default is 400 seconds
|
|
43
|
-
});
|
|
44
|
-
this.setupHandlers(cb);
|
|
45
|
-
} catch (error) {
|
|
46
|
-
logger.error(`Error connecting to cloud!\n${stringifyError(error)}`);
|
|
47
|
-
this.handleReconnection();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
43
|
public isConnected(): boolean {
|
|
52
|
-
return this.
|
|
44
|
+
return this.connected;
|
|
53
45
|
}
|
|
54
46
|
|
|
55
47
|
public registerHandler(topic: string, handler: MessageHandler) {
|
|
@@ -58,16 +50,11 @@ export class ConnectionManager extends MessageDispatcher<any> {
|
|
|
58
50
|
}
|
|
59
51
|
|
|
60
52
|
public disconnect(): void {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
logger.debug(`Device Agent has been disconnected from the AWS IoT Core.`);
|
|
64
|
-
}
|
|
53
|
+
this.device.end();
|
|
54
|
+
logger.debug(`Device Agent has been disconnected from the AWS IoT Core.`);
|
|
65
55
|
}
|
|
66
56
|
|
|
67
57
|
public subscribe(topic: string): void {
|
|
68
|
-
if (!this.device) {
|
|
69
|
-
throw new Error('Must call connect() before subscribe()!');
|
|
70
|
-
}
|
|
71
58
|
if (!this.subscribedTopics.has(topic)) {
|
|
72
59
|
this.device.subscribe(topic);
|
|
73
60
|
this.subscribedTopics.add(topic);
|
|
@@ -76,9 +63,6 @@ export class ConnectionManager extends MessageDispatcher<any> {
|
|
|
76
63
|
}
|
|
77
64
|
|
|
78
65
|
public unsubscribe(topic: string): void {
|
|
79
|
-
if (!this.device) {
|
|
80
|
-
throw new Error('Must call connect() before unsubscribe()!');
|
|
81
|
-
}
|
|
82
66
|
if (this.subscribedTopics.has(topic)) {
|
|
83
67
|
this.device.unsubscribe(topic);
|
|
84
68
|
this.subscribedTopics.delete(topic);
|
|
@@ -86,25 +70,16 @@ export class ConnectionManager extends MessageDispatcher<any> {
|
|
|
86
70
|
}
|
|
87
71
|
}
|
|
88
72
|
|
|
89
|
-
|
|
90
|
-
logger.debug(`Attempting to reconnect to AWS IoT Core...`);
|
|
91
|
-
setTimeout(
|
|
92
|
-
() =>
|
|
93
|
-
this.connect(() => {
|
|
94
|
-
// Do nothing
|
|
95
|
-
}),
|
|
96
|
-
5000
|
|
97
|
-
); // try in 5 seconds.
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
private setupHandlers(cb): void {
|
|
73
|
+
public initConnectionHandlers(connectCallback: () => void): void {
|
|
101
74
|
this.device.on('connect', (connack: any) => {
|
|
102
75
|
logger.info('Device Agent has connected to the cloud.');
|
|
103
|
-
|
|
76
|
+
this.connected = true;
|
|
77
|
+
connectCallback();
|
|
104
78
|
});
|
|
105
79
|
|
|
106
80
|
this.device.on('disconnect', () => {
|
|
107
81
|
logger.warn('Device Agent has been disconnected from the cloud');
|
|
82
|
+
this.connected = false;
|
|
108
83
|
});
|
|
109
84
|
|
|
110
85
|
this.device.on('reconnect', () => {
|
|
@@ -117,15 +92,18 @@ export class ConnectionManager extends MessageDispatcher<any> {
|
|
|
117
92
|
logger.error(
|
|
118
93
|
`Error connecting to the AWS IoT Core!\n${stringifyError(e)}`
|
|
119
94
|
);
|
|
95
|
+
this.connected = false;
|
|
120
96
|
});
|
|
121
97
|
|
|
122
98
|
this.device.on('close', () => {
|
|
123
99
|
logger.warn('Device Agent AWS IoT Core connection closed.');
|
|
100
|
+
this.connected = false;
|
|
124
101
|
});
|
|
125
102
|
|
|
126
103
|
this.device.on('offline', () => {
|
|
127
104
|
logger.warn(`Device Agent is offline ${new Date().toLocaleString()}`);
|
|
128
105
|
void this.logConnectionInfo();
|
|
106
|
+
this.connected = false;
|
|
129
107
|
});
|
|
130
108
|
|
|
131
109
|
this.device.on('message', async (topic: string, payload: string) => {
|
|
@@ -41,8 +41,6 @@ export class DeviceAgentCloudConnection {
|
|
|
41
41
|
SecureTunnelHandlerSingleton.getInstance();
|
|
42
42
|
|
|
43
43
|
constructor() {
|
|
44
|
-
this.liveUpdatesHandler = new LiveUpdatesHandler();
|
|
45
|
-
|
|
46
44
|
// Initialize & setup the connection
|
|
47
45
|
this.connectionManager = new ConnectionManager(
|
|
48
46
|
this.clientId,
|
|
@@ -52,92 +50,91 @@ export class DeviceAgentCloudConnection {
|
|
|
52
50
|
|
|
53
51
|
this.publisher = new Publisher(this.connectionManager, this.clientId);
|
|
54
52
|
this.shadowHandler = new ShadowHandler(this.clientId, this.publisher);
|
|
55
|
-
|
|
56
|
-
this.connectionManager.connect(() => {
|
|
57
|
-
void this.shadowHandler.initShadows();
|
|
58
|
-
this.publisher.publish(JOB_HANDLER_TOPICS.START_NEXT, JSON.stringify({}));
|
|
59
|
-
});
|
|
60
|
-
|
|
53
|
+
this.liveUpdatesHandler = new LiveUpdatesHandler();
|
|
61
54
|
this.transactionManager = new TransactionManager(this.liveUpdatesHandler);
|
|
62
55
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
56
|
+
this.connectionManager.initConnectionHandlers(() => {
|
|
57
|
+
// Construct a HandlerContext used by all the message handlers
|
|
58
|
+
const handlerContext: HandlerContext = {
|
|
59
|
+
clientId: this.clientId,
|
|
60
|
+
txnMgr: this.transactionManager,
|
|
61
|
+
publisher: this.publisher,
|
|
62
|
+
shadowHandler: this.shadowHandler,
|
|
63
|
+
liveUpdatesHandler: this.liveUpdatesHandler,
|
|
64
|
+
secureTunnelHandler: this.secureTunnelHandler
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Instantiate & register message handlers for Project Shadow topics
|
|
68
|
+
const projectShadowMessageHandler = new ProjectShadowMessageHandler(
|
|
69
|
+
handlerContext
|
|
70
|
+
);
|
|
71
|
+
this.shadowHandler.projectShadowTopics.forEach((topic) => {
|
|
72
|
+
this.connectionManager.registerHandler(
|
|
73
|
+
topic,
|
|
74
|
+
projectShadowMessageHandler
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Instantiate & register message handlers for to-device and secureTunnel topics
|
|
78
79
|
this.connectionManager.registerHandler(
|
|
79
|
-
|
|
80
|
-
|
|
80
|
+
this.toDeviceTopic,
|
|
81
|
+
new DeviceAgentMessageHandler(
|
|
82
|
+
handlerContext,
|
|
83
|
+
(txId: string, errorMsg: string) => {
|
|
84
|
+
const msg = buildToClientStatusResponseMessage(
|
|
85
|
+
this.publisher.getClientId(),
|
|
86
|
+
{
|
|
87
|
+
status: keyMirrors.statusResponse.failure,
|
|
88
|
+
message: errorMsg
|
|
89
|
+
},
|
|
90
|
+
txId
|
|
91
|
+
);
|
|
92
|
+
this.publisher.publishToClient(msg);
|
|
93
|
+
},
|
|
94
|
+
(txId: string) => {
|
|
95
|
+
const msg = buildToClientStatusResponseMessage(
|
|
96
|
+
this.publisher.getClientId(),
|
|
97
|
+
{ status: keyMirrors.statusResponse.success },
|
|
98
|
+
txId
|
|
99
|
+
);
|
|
100
|
+
this.publisher.publishToClient(msg);
|
|
101
|
+
}
|
|
102
|
+
)
|
|
81
103
|
);
|
|
82
|
-
});
|
|
83
104
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
this.publisher.getClientId(),
|
|
92
|
-
{
|
|
93
|
-
status: keyMirrors.statusResponse.failure,
|
|
94
|
-
message: errorMsg
|
|
95
|
-
},
|
|
96
|
-
txId
|
|
97
|
-
);
|
|
98
|
-
this.publisher.publishToClient(msg);
|
|
99
|
-
},
|
|
100
|
-
(txId: string) => {
|
|
101
|
-
const msg = buildToClientStatusResponseMessage(
|
|
102
|
-
this.publisher.getClientId(),
|
|
103
|
-
{ status: keyMirrors.statusResponse.success },
|
|
104
|
-
txId
|
|
105
|
-
);
|
|
106
|
-
this.publisher.publishToClient(msg);
|
|
107
|
-
}
|
|
108
|
-
)
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
const secureTunnelMessageHandler = new SecureTunnelMessageHandler(
|
|
112
|
-
handlerContext
|
|
113
|
-
);
|
|
114
|
-
this.connectionManager.registerHandler(
|
|
115
|
-
secureTunnelMessageHandler.getNotifyTopic(),
|
|
116
|
-
secureTunnelMessageHandler
|
|
117
|
-
);
|
|
105
|
+
const secureTunnelMessageHandler = new SecureTunnelMessageHandler(
|
|
106
|
+
handlerContext
|
|
107
|
+
);
|
|
108
|
+
this.connectionManager.registerHandler(
|
|
109
|
+
secureTunnelMessageHandler.getNotifyTopic(),
|
|
110
|
+
secureTunnelMessageHandler
|
|
111
|
+
);
|
|
118
112
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
113
|
+
this.connectionManager.registerHandler(
|
|
114
|
+
this.shadowHandler.shadowTopics.secureTunnel.updateDelta,
|
|
115
|
+
secureTunnelMessageHandler
|
|
116
|
+
);
|
|
117
|
+
this.connectionManager.registerHandler(
|
|
118
|
+
this.shadowHandler.shadowTopics.secureTunnel.deleteAccepted,
|
|
119
|
+
secureTunnelMessageHandler
|
|
120
|
+
);
|
|
127
121
|
|
|
128
|
-
|
|
122
|
+
const jobHandler = new JobHandler(handlerContext);
|
|
123
|
+
const JOB_HANDLER_TOPICS = jobHandler.getJobTopics();
|
|
129
124
|
|
|
130
|
-
|
|
125
|
+
this.connectionManager.registerHandler(
|
|
126
|
+
JOB_HANDLER_TOPICS.NOTIFY_NEXT,
|
|
127
|
+
jobHandler
|
|
128
|
+
);
|
|
131
129
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
130
|
+
this.connectionManager.registerHandler(
|
|
131
|
+
JOB_HANDLER_TOPICS.START_NEXT_ACCEPTED,
|
|
132
|
+
jobHandler
|
|
133
|
+
);
|
|
134
|
+
this.publisher.publish(JOB_HANDLER_TOPICS.START_NEXT, JSON.stringify({}));
|
|
136
135
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
jobHandler
|
|
140
|
-
);
|
|
136
|
+
void this.shadowHandler.initShadows();
|
|
137
|
+
});
|
|
141
138
|
}
|
|
142
139
|
|
|
143
140
|
/*=================================================================
|
|
@@ -158,7 +155,22 @@ export class DeviceAgentCloudConnection {
|
|
|
158
155
|
await sleep(1000);
|
|
159
156
|
this.connectionManager.disconnect();
|
|
160
157
|
}
|
|
161
|
-
|
|
158
|
+
|
|
159
|
+
// CLI methods
|
|
160
|
+
|
|
161
|
+
public async waitForConnection() {
|
|
162
|
+
while (!this.connectionManager.isConnected()) {
|
|
163
|
+
await sleep(1000);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
public async waitForCmd(projectId: string) {
|
|
168
|
+
while (this.isCmdInProgress(projectId)) {
|
|
169
|
+
await sleep(1000);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public async sendCliCmd(topic: string, message: any) {
|
|
162
174
|
this.connectionManager.dispatch(topic, message);
|
|
163
175
|
}
|
|
164
176
|
}
|
package/src/environment.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { TargetHardware } from 'alwaysai/lib/core/app';
|
|
1
2
|
import { platform } from 'os';
|
|
3
|
+
import { logger } from './util/logger';
|
|
2
4
|
|
|
3
5
|
export const ALWAYSAI_OS_PLATFORM = parseOsPlatform(
|
|
4
6
|
process.env.ALWAYSAI_OS_PLATFORM
|
|
@@ -22,6 +24,22 @@ export const ALWAYSAI_LOCAL_CONNECTION_PORT =
|
|
|
22
24
|
process.env.ALWAYSAI_LOCAL_CONNECTION_PORT;
|
|
23
25
|
export const ALWAYSAI_LOCAL_CONNECTION_ANALYTICS_ROUTING_KEY =
|
|
24
26
|
process.env.ALWAYSAI_LOCAL_CONNECTION_ANALYTICS_ROUTING_KEY;
|
|
27
|
+
export const ALWAYSAI_TARGET_HW_OVERRIDE =
|
|
28
|
+
process.env.ALWAYSAI_TARGET_HW_OVERRIDE;
|
|
29
|
+
|
|
30
|
+
export function parseTargetHW(
|
|
31
|
+
hardwareType?: string
|
|
32
|
+
): TargetHardware | undefined {
|
|
33
|
+
const target = hardwareType ? TargetHardware[hardwareType] : undefined;
|
|
34
|
+
if (!target && hardwareType) {
|
|
35
|
+
logger.error(
|
|
36
|
+
`Incorrect TargetHardware: ${hardwareType}. Ignoring the environment variable. Allowed TargetHardware types: ${Object.keys(
|
|
37
|
+
TargetHardware
|
|
38
|
+
)}`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
return target;
|
|
42
|
+
}
|
|
25
43
|
|
|
26
44
|
function parseOsPlatform(str: string | undefined): NodeJS.Platform {
|
|
27
45
|
switch (str) {
|
package/src/jobs/job-handler.ts
CHANGED
|
@@ -36,7 +36,7 @@ export class JobHandler extends BaseHandler implements MessageHandler {
|
|
|
36
36
|
private jobId = '';
|
|
37
37
|
|
|
38
38
|
public async handle(message: any, topic: string): Promise<void> {
|
|
39
|
-
const TOPICS = this.
|
|
39
|
+
const TOPICS = this.getJobTopics();
|
|
40
40
|
|
|
41
41
|
try {
|
|
42
42
|
switch (topic) {
|
|
@@ -54,7 +54,7 @@ export class JobHandler extends BaseHandler implements MessageHandler {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
getJobTopics() {
|
|
58
58
|
const TOPICS = {
|
|
59
59
|
NOTIFY_NEXT: `$aws/things/${this.clientId}/jobs/notify-next`,
|
|
60
60
|
START_NEXT: `$aws/things/${this.clientId}/jobs/start-next`,
|
|
@@ -67,7 +67,7 @@ export class JobHandler extends BaseHandler implements MessageHandler {
|
|
|
67
67
|
private async notifyNext(message: any): Promise<void> {
|
|
68
68
|
// Triggers when a job is completed and we need to notify the next job
|
|
69
69
|
logger.info('Invoking NOTIFY_NEXT handler');
|
|
70
|
-
const TOPICS = this.
|
|
70
|
+
const TOPICS = this.getJobTopics();
|
|
71
71
|
this.publisher.publish(TOPICS.START_NEXT, JSON.stringify({}));
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -121,7 +121,7 @@ export class JobHandler extends BaseHandler implements MessageHandler {
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
private updateJobStatus(status: string, message?: string): void {
|
|
124
|
-
const { UPDATE } = this.
|
|
124
|
+
const { UPDATE } = this.getJobTopics();
|
|
125
125
|
const payload = {
|
|
126
126
|
status,
|
|
127
127
|
statusDetails: {
|