@alwaysai/device-agent 0.0.13 → 0.0.15

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.
Files changed (151) hide show
  1. package/lib/application-control/backup.js +3 -3
  2. package/lib/application-control/backup.js.map +1 -1
  3. package/lib/application-control/index.d.ts +4 -4
  4. package/lib/application-control/index.d.ts.map +1 -1
  5. package/lib/application-control/index.js +1 -4
  6. package/lib/application-control/index.js.map +1 -1
  7. package/lib/application-control/install.d.ts +1 -1
  8. package/lib/application-control/install.d.ts.map +1 -1
  9. package/lib/application-control/install.js +41 -54
  10. package/lib/application-control/install.js.map +1 -1
  11. package/lib/application-control/models.d.ts +0 -4
  12. package/lib/application-control/models.d.ts.map +1 -1
  13. package/lib/application-control/models.js +13 -22
  14. package/lib/application-control/models.js.map +1 -1
  15. package/lib/application-control/status.d.ts +0 -6
  16. package/lib/application-control/status.d.ts.map +1 -1
  17. package/lib/application-control/status.js +3 -19
  18. package/lib/application-control/status.js.map +1 -1
  19. package/lib/application-control/utils.d.ts +3 -0
  20. package/lib/application-control/utils.d.ts.map +1 -1
  21. package/lib/application-control/utils.js +50 -21
  22. package/lib/application-control/utils.js.map +1 -1
  23. package/lib/cloud-connection/bootstrap-provision.d.ts +1 -1
  24. package/lib/cloud-connection/bootstrap-provision.d.ts.map +1 -1
  25. package/lib/cloud-connection/bootstrap-provision.js +9 -9
  26. package/lib/cloud-connection/bootstrap-provision.js.map +1 -1
  27. package/lib/cloud-connection/cmd-status.d.ts +8 -0
  28. package/lib/cloud-connection/cmd-status.d.ts.map +1 -0
  29. package/lib/cloud-connection/cmd-status.js +62 -0
  30. package/lib/cloud-connection/cmd-status.js.map +1 -0
  31. package/lib/cloud-connection/device-agent-cloud-connection.d.ts +10 -2
  32. package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
  33. package/lib/cloud-connection/device-agent-cloud-connection.js +156 -66
  34. package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
  35. package/lib/cloud-connection/device-agent.d.ts.map +1 -1
  36. package/lib/cloud-connection/device-agent.js +4 -3
  37. package/lib/cloud-connection/device-agent.js.map +1 -1
  38. package/lib/cloud-connection/live-updates-handler.d.ts +10 -18
  39. package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
  40. package/lib/cloud-connection/live-updates-handler.js +50 -50
  41. package/lib/cloud-connection/live-updates-handler.js.map +1 -1
  42. package/lib/cloud-connection/messages.d.ts +3 -1
  43. package/lib/cloud-connection/messages.d.ts.map +1 -1
  44. package/lib/cloud-connection/messages.js +13 -1
  45. package/lib/cloud-connection/messages.js.map +1 -1
  46. package/lib/cloud-connection/passthrough-handler.d.ts +11 -0
  47. package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -0
  48. package/lib/cloud-connection/passthrough-handler.js +59 -0
  49. package/lib/cloud-connection/passthrough-handler.js.map +1 -0
  50. package/lib/cloud-connection/publisher.d.ts +1 -0
  51. package/lib/cloud-connection/publisher.d.ts.map +1 -1
  52. package/lib/cloud-connection/publisher.js +14 -0
  53. package/lib/cloud-connection/publisher.js.map +1 -1
  54. package/lib/cloud-connection/shadow-handler.d.ts +2 -3
  55. package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
  56. package/lib/cloud-connection/shadow-handler.js +18 -4
  57. package/lib/cloud-connection/shadow-handler.js.map +1 -1
  58. package/lib/cloud-connection/shadow-handler.test.d.ts +2 -0
  59. package/lib/cloud-connection/shadow-handler.test.d.ts.map +1 -0
  60. package/lib/cloud-connection/shadow-handler.test.js +321 -0
  61. package/lib/cloud-connection/shadow-handler.test.js.map +1 -0
  62. package/lib/environment.d.ts +1 -0
  63. package/lib/environment.d.ts.map +1 -1
  64. package/lib/environment.js +3 -2
  65. package/lib/environment.js.map +1 -1
  66. package/lib/index.js +2 -2
  67. package/lib/index.js.map +1 -1
  68. package/lib/infrastructure/agent-config.d.ts +15 -48
  69. package/lib/infrastructure/agent-config.d.ts.map +1 -1
  70. package/lib/infrastructure/agent-config.js.map +1 -1
  71. package/lib/infrastructure/agent-config.test.js +0 -6
  72. package/lib/infrastructure/agent-config.test.js.map +1 -1
  73. package/lib/infrastructure/system-id.js +2 -2
  74. package/lib/infrastructure/system-id.js.map +1 -1
  75. package/lib/infrastructure/tokens-and-device-cfg.d.ts.map +1 -1
  76. package/lib/infrastructure/tokens-and-device-cfg.js +5 -9
  77. package/lib/infrastructure/tokens-and-device-cfg.js.map +1 -1
  78. package/lib/local-connection/rabbitmq-connection.d.ts +4 -0
  79. package/lib/local-connection/rabbitmq-connection.d.ts.map +1 -0
  80. package/lib/local-connection/rabbitmq-connection.js +58 -0
  81. package/lib/local-connection/rabbitmq-connection.js.map +1 -0
  82. package/lib/subcommands/app/app.d.ts +4 -3
  83. package/lib/subcommands/app/app.d.ts.map +1 -1
  84. package/lib/subcommands/app/app.js +78 -27
  85. package/lib/subcommands/app/app.js.map +1 -1
  86. package/lib/subcommands/app/index.js +2 -2
  87. package/lib/subcommands/device/clean.js +4 -4
  88. package/lib/subcommands/device/clean.js.map +1 -1
  89. package/lib/subcommands/device/device.d.ts +1 -1
  90. package/lib/subcommands/device/device.d.ts.map +1 -1
  91. package/lib/subcommands/device/device.js +9 -10
  92. package/lib/subcommands/device/device.js.map +1 -1
  93. package/lib/subcommands/index.d.ts +0 -1
  94. package/lib/subcommands/index.d.ts.map +1 -1
  95. package/lib/subcommands/login.d.ts +0 -1
  96. package/lib/subcommands/login.d.ts.map +1 -1
  97. package/lib/subcommands/login.js +1 -9
  98. package/lib/subcommands/login.js.map +1 -1
  99. package/lib/util/directories.d.ts +11 -12
  100. package/lib/util/directories.d.ts.map +1 -1
  101. package/lib/util/directories.js +24 -29
  102. package/lib/util/directories.js.map +1 -1
  103. package/lib/util/fetch-with-timeout.d.ts +4 -0
  104. package/lib/util/fetch-with-timeout.d.ts.map +1 -0
  105. package/lib/util/fetch-with-timeout.js +15 -0
  106. package/lib/util/fetch-with-timeout.js.map +1 -0
  107. package/lib/util/logger.js +1 -0
  108. package/lib/util/logger.js.map +1 -1
  109. package/lib/util/require-logged-in-and-paid-plan.d.ts +2 -0
  110. package/lib/util/require-logged-in-and-paid-plan.d.ts.map +1 -0
  111. package/lib/util/require-logged-in-and-paid-plan.js +18 -0
  112. package/lib/util/require-logged-in-and-paid-plan.js.map +1 -0
  113. package/package.json +20 -32
  114. package/readme.md +100 -89
  115. package/src/application-control/backup.ts +3 -3
  116. package/src/application-control/index.ts +0 -6
  117. package/src/application-control/install.ts +53 -73
  118. package/src/application-control/models.ts +7 -19
  119. package/src/application-control/status.ts +3 -19
  120. package/src/application-control/utils.ts +61 -22
  121. package/src/cloud-connection/bootstrap-provision.ts +13 -10
  122. package/src/cloud-connection/cmd-status.ts +71 -0
  123. package/src/cloud-connection/device-agent-cloud-connection.ts +211 -102
  124. package/src/cloud-connection/device-agent.ts +7 -4
  125. package/src/cloud-connection/live-updates-handler.ts +79 -86
  126. package/src/cloud-connection/messages.ts +22 -1
  127. package/src/cloud-connection/passthrough-handler.ts +67 -0
  128. package/src/cloud-connection/publisher.ts +21 -0
  129. package/src/cloud-connection/shadow-handler.test.ts +361 -0
  130. package/src/cloud-connection/shadow-handler.ts +28 -7
  131. package/src/environment.ts +4 -1
  132. package/src/index.ts +2 -2
  133. package/src/infrastructure/agent-config.test.ts +0 -7
  134. package/src/infrastructure/agent-config.ts +24 -2
  135. package/src/infrastructure/system-id.ts +1 -1
  136. package/src/infrastructure/tokens-and-device-cfg.ts +8 -13
  137. package/src/local-connection/rabbitmq-connection.ts +53 -0
  138. package/src/subcommands/app/app.ts +82 -31
  139. package/src/subcommands/app/index.ts +4 -4
  140. package/src/subcommands/device/clean.ts +4 -4
  141. package/src/subcommands/device/device.ts +13 -13
  142. package/src/subcommands/login.ts +1 -9
  143. package/src/util/directories.ts +31 -29
  144. package/src/util/fetch-with-timeout.ts +18 -0
  145. package/src/util/logger.ts +2 -0
  146. package/src/util/require-logged-in-and-paid-plan.ts +16 -0
  147. package/lib/cloud-connection/app-install-status.d.ts +0 -16
  148. package/lib/cloud-connection/app-install-status.d.ts.map +0 -1
  149. package/lib/cloud-connection/app-install-status.js +0 -53
  150. package/lib/cloud-connection/app-install-status.js.map +0 -1
  151. package/src/cloud-connection/app-install-status.ts +0 -62
@@ -1,17 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.downloadPackageUsingPresignedUrl = exports.buildApp = exports.requireAppInstalled = exports.getAppDir = void 0;
3
+ exports.downloadPackageUsingPresignedUrl = exports.buildApp = exports.requireAppReady = exports.requireAppInstalled = exports.getAppDir = void 0;
4
4
  const docker_compose_1 = require("docker-compose");
5
5
  const path = require("path");
6
6
  const fs = require("fs");
7
7
  const constants_1 = require("alwaysai/lib/constants");
8
8
  const agent_config_1 = require("../infrastructure/agent-config");
9
- const node_fetch_1 = require("node-fetch");
9
+ const fetch_with_timeout_1 = require("../util/fetch-with-timeout");
10
10
  const app_1 = require("alwaysai/lib/core/app");
11
- const app_2 = require("alwaysai/lib/components/app");
12
11
  const run_in_dir_1 = require("../util/run-in-dir");
13
12
  const logger_1 = require("../util/logger");
14
13
  const directories_1 = require("../util/directories");
14
+ const spawner_1 = require("alwaysai/lib/util/spawner");
15
15
  function getAppDir(projectId) {
16
16
  return path.join(directories_1.APP_ROOT, projectId);
17
17
  }
@@ -22,29 +22,40 @@ async function requireAppInstalled(props) {
22
22
  if (!(await (0, agent_config_1.AgentConfigFile)().isAppPresent({ projectId }))) {
23
23
  throw new Error('Application is not installed');
24
24
  }
25
+ }
26
+ exports.requireAppInstalled = requireAppInstalled;
27
+ async function requireAppReady(props) {
28
+ const { projectId } = props;
29
+ await requireAppInstalled({ projectId });
25
30
  if (!(await (0, agent_config_1.AgentConfigFile)().isAppReady({ projectId }))) {
26
31
  throw new Error('Application is not done installing or updating');
27
32
  }
28
33
  }
29
- exports.requireAppInstalled = requireAppInstalled;
34
+ exports.requireAppReady = requireAppReady;
30
35
  async function buildApp(props) {
31
36
  const { appDir } = props;
32
37
  // Build standalone image and docker-compose
33
- const targetJson = (0, app_1.TargetJsonFile)(appDir);
34
- const targetConfig = targetJson.read();
35
- if (targetConfig.targetProtocol !== 'docker:') {
38
+ const targetJsonFile = (0, app_1.TargetJsonFile)(appDir);
39
+ const targetCfg = targetJsonFile.read();
40
+ if (targetCfg.targetProtocol !== 'docker:') {
36
41
  throw new Error(`${constants_1.TARGET_JSON_FILE_NAME} is not properly configured!`);
37
42
  }
38
- await (0, run_in_dir_1.runInDir)(app_2.appDeployLinuxAndRemoteDevice, [
39
- {
40
- yes: true,
41
- generateDockerCompose: true,
42
- logs: false,
43
- stop: false,
44
- targetJson,
45
- targetConfig
43
+ await (0, run_in_dir_1.runInDir)(async () => {
44
+ await (0, app_1.writeStandaloneDockerfile)();
45
+ const spawner = (0, spawner_1.JsSpawner)();
46
+ const targetHardware = targetCfg.targetHardware;
47
+ if (await spawner.exists(constants_1.DOCKER_COMPOSE_FILE)) {
48
+ await (0, app_1.updateDockerComposeTargetHw)({
49
+ targetHardware
50
+ });
51
+ }
52
+ else {
53
+ await (0, app_1.writeDockerComposeFile)({
54
+ spawner: (0, spawner_1.JsSpawner)(),
55
+ cmd: await (0, app_1.getDockerComposeCmdForApp)({ targetHardware })
56
+ });
46
57
  }
47
- ], appDir);
58
+ }, [], appDir);
48
59
  const buildOut = await docker_compose_1.default.buildAll({ cwd: appDir });
49
60
  logger_1.logger.debug(`docker-compose build: ${JSON.stringify(buildOut, null, 2)}`);
50
61
  if (buildOut.exitCode !== 0) {
@@ -52,13 +63,31 @@ async function buildApp(props) {
52
63
  }
53
64
  }
54
65
  exports.buildApp = buildApp;
66
+ class HTTPResponseError extends Error {
67
+ constructor(response) {
68
+ super(`HTTP Error Response: ${response.status} ${response.statusText}`);
69
+ this.response = response;
70
+ }
71
+ }
72
+ const checkStatus = (response) => {
73
+ if (response.ok) {
74
+ // response.status >= 200 && response.status < 300
75
+ return response;
76
+ }
77
+ else {
78
+ throw new HTTPResponseError(response);
79
+ }
80
+ };
55
81
  async function downloadPackageUsingPresignedUrl(props) {
56
82
  const { localDest, presignedUrl } = props;
57
- logger_1.logger.info(`Downloading app package from ${presignedUrl}`);
58
- const response = await (0, node_fetch_1.default)(presignedUrl);
59
- if (response.status !== 200) {
60
- // If the URL is invalid; I think we shouldn't get here with the new changes
61
- throw new Error(`Status Code: ${response.status}, ${response.statusText}. Response: ${response.body}`);
83
+ logger_1.logger.debug(`Downloading package from ${presignedUrl}`);
84
+ let response;
85
+ try {
86
+ response = await (0, fetch_with_timeout_1.fetchWithTimeout)(presignedUrl);
87
+ }
88
+ catch (error) {
89
+ const errorBody = error.type === 'aborted' ? error : await error.response.text();
90
+ throw new Error(`downloadPackageUsingPresignedUrl: Error=${error}\n${errorBody}`);
62
91
  }
63
92
  /**
64
93
  * Write the app package to the hash directory
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/application-control/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/application-control/utils.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare function bootstrapProvision(): void;
1
+ export declare function bootstrapProvision(): Promise<void>;
2
2
  //# sourceMappingURL=bootstrap-provision.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-provision.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/bootstrap-provision.ts"],"names":[],"mappings":"AAWA,wBAAgB,kBAAkB,SA4BjC"}
1
+ {"version":3,"file":"bootstrap-provision.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/bootstrap-provision.ts"],"names":[],"mappings":"AAWA,wBAAsB,kBAAkB,kBA+BvC"}
@@ -1,33 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bootstrapProvision = void 0;
4
- const util_1 = require("alwaysai/lib/util");
5
4
  const urls_1 = require("../infrastructure/urls");
6
5
  const clean_certs_1 = require("../util/clean-certs");
7
6
  const directories_1 = require("../util/directories");
8
7
  const get_device_id_1 = require("../util/get-device-id");
8
+ const logger_1 = require("../util/logger");
9
9
  const device_agent_1 = require("./device-agent");
10
- function bootstrapProvision() {
10
+ async function bootstrapProvision() {
11
11
  setTimeout(clean_certs_1.rmBootstrapCertsAndClose, 60000);
12
12
  const clientId = (0, get_device_id_1.getDeviceUuid)();
13
13
  const bootstrapConfig = {
14
- keyPath: (0, directories_1.BOOTSTRAP_DEVICE_PRIVATE_KEY_FILE_PATH)(),
15
- certPath: (0, directories_1.BOOTSTRAP_DEVICE_CERTIFICATE_FILE_PATH)(),
14
+ keyPath: (0, directories_1.BOOTSTRAP_PRIVATE_KEY_FILE_PATH)(),
15
+ certPath: (0, directories_1.BOOTSTRAP_CERTIFICATE_FILE_PATH)(),
16
16
  caPath: directories_1.AWS_ROOT_CERTIFICATE_FILE_PATH,
17
17
  clientId,
18
18
  host: (0, urls_1.getIoTCoreEndpointUrl)()
19
19
  };
20
20
  const bootstrapAgent = new device_agent_1.BootstrapAgent(bootstrapConfig);
21
- bootstrapAgent.subscribeToAllTopics();
21
+ await bootstrapAgent.subscribeToAllTopics();
22
22
  bootstrapAgent.publishMessage('$aws/certificates/create/json', '');
23
23
  bootstrapAgent.device.on('connect', () => {
24
- util_1.logger.info('Your device is being provisioned');
24
+ logger_1.logger.info('Your device is being provisioned');
25
25
  });
26
- bootstrapAgent.device.on('message', (topic, payload) => {
27
- bootstrapAgent.handleAwsCertificateTopics(topic, payload);
26
+ bootstrapAgent.device.on('message', async (topic, payload) => {
27
+ await bootstrapAgent.handleAwsCertificateTopics(topic, payload);
28
28
  });
29
29
  bootstrapAgent.device.on('packetsend', (packet) => {
30
- util_1.logger.debug(`Sending packet: ${JSON.stringify({ packet }, null, 2)}`);
30
+ logger_1.logger.debug(`Sending packet: ${JSON.stringify({ packet }, null, 2)}`);
31
31
  });
32
32
  }
33
33
  exports.bootstrapProvision = bootstrapProvision;
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-provision.js","sourceRoot":"","sources":["../../src/cloud-connection/bootstrap-provision.ts"],"names":[],"mappings":";;;AAAA,4CAA2C;AAC3C,iDAA+D;AAC/D,qDAA+D;AAC/D,qDAI6B;AAC7B,yDAAsD;AACtD,iDAAgD;AAEhD,SAAgB,kBAAkB;IAChC,UAAU,CAAC,sCAAwB,EAAE,KAAK,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,IAAA,6BAAa,GAAE,CAAC;IACjC,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE,IAAA,oDAAsC,GAAE;QACjD,QAAQ,EAAE,IAAA,oDAAsC,GAAE;QAClD,MAAM,EAAE,4CAA8B;QACtC,QAAQ;QACR,IAAI,EAAE,IAAA,4BAAqB,GAAE;KAC9B,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,6BAAc,CAAC,eAAe,CAAC,CAAC;IAC3D,cAAc,CAAC,oBAAoB,EAAE,CAAC;IAEtC,cAAc,CAAC,cAAc,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;IAEnE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACvC,aAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAa,EAAE,OAAe,EAAE,EAAE;QACrE,cAAc,CAAC,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAW,EAAE,EAAE;QACrD,aAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AA5BD,gDA4BC"}
1
+ {"version":3,"file":"bootstrap-provision.js","sourceRoot":"","sources":["../../src/cloud-connection/bootstrap-provision.ts"],"names":[],"mappings":";;;AAAA,iDAA+D;AAC/D,qDAA+D;AAC/D,qDAI6B;AAC7B,yDAAsD;AACtD,2CAAwC;AACxC,iDAAgD;AAEzC,KAAK,UAAU,kBAAkB;IACtC,UAAU,CAAC,sCAAwB,EAAE,KAAK,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,IAAA,6BAAa,GAAE,CAAC;IACjC,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE,IAAA,6CAA+B,GAAE;QAC1C,QAAQ,EAAE,IAAA,6CAA+B,GAAE;QAC3C,MAAM,EAAE,4CAA8B;QACtC,QAAQ;QACR,IAAI,EAAE,IAAA,4BAAqB,GAAE;KAC9B,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,6BAAc,CAAC,eAAe,CAAC,CAAC;IAC3D,MAAM,cAAc,CAAC,oBAAoB,EAAE,CAAC;IAE5C,cAAc,CAAC,cAAc,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;IAEnE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACvC,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,cAAc,CAAC,MAAM,CAAC,EAAE,CACtB,SAAS,EACT,KAAK,EAAE,KAAa,EAAE,OAAe,EAAE,EAAE;QACvC,MAAM,cAAc,CAAC,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC,CACF,CAAC;IAEF,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAW,EAAE,EAAE;QACrD,eAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AA/BD,gDA+BC"}
@@ -0,0 +1,8 @@
1
+ export declare class CmdStatusManager {
2
+ private apps;
3
+ start(projectId: string): Promise<void>;
4
+ stop(projectId: string): Promise<void>;
5
+ isCmdInProgress(projectId: string): boolean;
6
+ anyCmdInProgress(): boolean;
7
+ }
8
+ //# sourceMappingURL=cmd-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-status.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/cmd-status.ts"],"names":[],"mappings":"AA0BA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAA0C;IAEzC,KAAK,CAAC,SAAS,EAAE,MAAM;IAevB,IAAI,CAAC,SAAS,EAAE,MAAM;IAW5B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAO3C,gBAAgB;CAQxB"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CmdStatusManager = void 0;
4
+ const logger_1 = require("../util/logger");
5
+ class CmdStatus {
6
+ constructor(projectId, status) {
7
+ this.projectId = projectId;
8
+ this.status = status;
9
+ }
10
+ getProjectId() {
11
+ return this.projectId;
12
+ }
13
+ update(status) {
14
+ this.status = status;
15
+ }
16
+ getStatus() {
17
+ return this.status;
18
+ }
19
+ }
20
+ class CmdStatusManager {
21
+ constructor() {
22
+ this.apps = {};
23
+ }
24
+ async start(projectId) {
25
+ if (!(projectId in this.apps)) {
26
+ const cmdStatus = new CmdStatus(projectId, 'in_progress');
27
+ this.apps[projectId] = cmdStatus;
28
+ }
29
+ else if (this.apps[projectId].getStatus() !== 'in_progress') {
30
+ this.apps[projectId].update('in_progress');
31
+ }
32
+ else {
33
+ logger_1.logger.debug(`Ignoring start for ${projectId} since it already has a command in progress`);
34
+ return;
35
+ }
36
+ logger_1.logger.debug(`Started command for ${projectId}`);
37
+ }
38
+ async stop(projectId) {
39
+ if (!(projectId in this.apps) ||
40
+ this.apps[projectId].getStatus() === 'idle') {
41
+ throw new Error(`No ongoing command to stop for ${projectId}`);
42
+ }
43
+ this.apps[projectId].update('idle');
44
+ logger_1.logger.debug(`Stopped command for ${projectId}`);
45
+ }
46
+ isCmdInProgress(projectId) {
47
+ if (!(projectId in this.apps)) {
48
+ return false;
49
+ }
50
+ return this.apps[projectId].getStatus() === 'in_progress';
51
+ }
52
+ anyCmdInProgress() {
53
+ for (const projectId in this.apps) {
54
+ if (this.apps[projectId].getStatus() === 'in_progress') {
55
+ return true;
56
+ }
57
+ }
58
+ return false;
59
+ }
60
+ }
61
+ exports.CmdStatusManager = CmdStatusManager;
62
+ //# sourceMappingURL=cmd-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-status.js","sourceRoot":"","sources":["../../src/cloud-connection/cmd-status.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAIxC,MAAM,SAAS;IAIb,YAAY,SAAiB,EAAE,MAAqB;QAClD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,MAAqB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,MAAa,gBAAgB;IAA7B;QACU,SAAI,GAAuC,EAAE,CAAC;IA2CxD,CAAC;IAzCQ,KAAK,CAAC,KAAK,CAAC,SAAiB;QAClC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;SAClC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,KAAK,aAAa,EAAE;YAC7D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;SAC5C;aAAM;YACL,eAAM,CAAC,KAAK,CACV,sBAAsB,SAAS,6CAA6C,CAC7E,CAAC;YACF,OAAO;SACR;QACD,eAAM,CAAC,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,SAAiB;QACjC,IACE,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,KAAK,MAAM,EAC3C;YACA,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;SAChE;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,eAAM,CAAC,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAEM,eAAe,CAAC,SAAiB;QACtC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7B,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,KAAK,aAAa,CAAC;IAC5D,CAAC;IAEM,gBAAgB;QACrB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE;YACjC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,KAAK,aAAa,EAAE;gBACtD,OAAO,IAAI,CAAC;aACb;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA5CD,4CA4CC"}
@@ -1,9 +1,11 @@
1
1
  import { ClientMessage } from '@alwaysai/device-agent-schemas';
2
+ import { ShadowTopics } from './shadow-handler';
3
+ import { Publisher } from './publisher';
2
4
  export declare class DeviceAgentCloudConnection {
3
5
  private shadowHandler;
4
- private publisher;
6
+ publisher: Publisher;
7
+ private cmdStatusMgr;
5
8
  private liveUpdatesHandler;
6
- private appInstallStatusMgr;
7
9
  private device;
8
10
  private clientId;
9
11
  private host;
@@ -15,15 +17,21 @@ export declare class DeviceAgentCloudConnection {
15
17
  private handleAgentCommand;
16
18
  private publishCloudRequest;
17
19
  private subscribe;
20
+ private atomicApplicationUninstall;
18
21
  private atomicApplicationUpdate;
19
22
  private handleAppConfigUpdates;
20
23
  constructor();
21
24
  getClientId(): string;
25
+ getToDeviceTopic(): string;
26
+ getShadowTopics(): ShadowTopics;
27
+ isCmdInProgress(projectId: string): boolean;
22
28
  handleClientMessage({ topic, message }: {
23
29
  topic: string;
24
30
  message: ClientMessage;
25
31
  }): Promise<void>;
32
+ handleMessage(topic: string, message: ClientMessage | any): Promise<void>;
26
33
  setupHandlers(): Promise<void>;
34
+ stop(): void;
27
35
  }
28
36
  export declare function runDeviceAgentCloudInterface(): Promise<void>;
29
37
  //# sourceMappingURL=device-agent-cloud-connection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"device-agent-cloud-connection.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/device-agent-cloud-connection.ts"],"names":[],"mappings":"AAWA,OAAO,EAOL,aAAa,EAEd,MAAM,gCAAgC,CAAC;AAoBxC,qBAAa,0BAA0B;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,mBAAmB,CAA0B;IACrD,OAAO,CAAC,MAAM,CAAiB;IAE/B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;IAE/D,OAAO,CAAC,cAAc,CAAmB;IAEzC,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,mBAAmB,CAEzB;IAEF,OAAO,CAAC,kBAAkB;YAYZ,mBAAmB;IAIjC,OAAO,CAAC,SAAS;YAMH,uBAAuB;YAkDvB,sBAAsB;;IAmE7B,WAAW,IAAI,MAAM;IAIf,mBAAmB,CAAC,EAC/B,KAAK,EACL,OAAO,EACR,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,aAAa,CAAC;KACxB;IA2EY,aAAa;CAoE3B;AAED,wBAAsB,4BAA4B,kBAgBjD"}
1
+ {"version":3,"file":"device-agent-cloud-connection.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/device-agent-cloud-connection.ts"],"names":[],"mappings":"AAWA,OAAO,EAOL,aAAa,EAEd,MAAM,gCAAgC,CAAC;AAaxC,OAAO,EAAkC,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AASxC,qBAAa,0BAA0B;IACrC,OAAO,CAAC,aAAa,CAAgB;IAC9B,SAAS,EAAE,SAAS,CAAC;IAC5B,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,MAAM,CAAiB;IAE/B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;IAE/D,OAAO,CAAC,cAAc,CAAmB;YAE3B,qBAAqB;YAerB,uBAAuB;IAiCrC,OAAO,CAAC,mBAAmB,CAEzB;YAEY,kBAAkB;YAYlB,mBAAmB;IAIjC,OAAO,CAAC,SAAS;YAKH,0BAA0B;YA4C1B,uBAAuB;YAuDvB,sBAAsB;;IA2E7B,WAAW,IAAI,MAAM;IAIrB,gBAAgB;IAIhB,eAAe,IAAI,YAAY;IAI/B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIrC,mBAAmB,CAAC,EAC/B,KAAK,EACL,OAAO,EACR,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,aAAa,CAAC;KACxB;IAuFY,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,GAAG;IAyBzD,aAAa;IAoCnB,IAAI;CAGZ;AAED,wBAAsB,4BAA4B,kBAsBjD"}