@alwaysai/device-agent 1.5.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/lib/application-control/config.d.ts.map +1 -1
  2. package/lib/application-control/config.js +8 -3
  3. package/lib/application-control/config.js.map +1 -1
  4. package/lib/application-control/environment-variables.d.ts +5 -5
  5. package/lib/application-control/environment-variables.d.ts.map +1 -1
  6. package/lib/application-control/environment-variables.js +25 -38
  7. package/lib/application-control/environment-variables.js.map +1 -1
  8. package/lib/application-control/environment-variables.test.js +27 -7
  9. package/lib/application-control/environment-variables.test.js.map +1 -1
  10. package/lib/application-control/index.d.ts +4 -4
  11. package/lib/application-control/index.d.ts.map +1 -1
  12. package/lib/application-control/index.js +1 -4
  13. package/lib/application-control/index.js.map +1 -1
  14. package/lib/application-control/install.d.ts +4 -1
  15. package/lib/application-control/install.d.ts.map +1 -1
  16. package/lib/application-control/install.js +24 -8
  17. package/lib/application-control/install.js.map +1 -1
  18. package/lib/application-control/models.d.ts +0 -11
  19. package/lib/application-control/models.d.ts.map +1 -1
  20. package/lib/application-control/models.js +5 -54
  21. package/lib/application-control/models.js.map +1 -1
  22. package/lib/application-control/utils.d.ts +0 -4
  23. package/lib/application-control/utils.d.ts.map +1 -1
  24. package/lib/application-control/utils.js +12 -22
  25. package/lib/application-control/utils.js.map +1 -1
  26. package/lib/cloud-connection/base-message-handler.d.ts +27 -0
  27. package/lib/cloud-connection/base-message-handler.d.ts.map +1 -0
  28. package/lib/cloud-connection/base-message-handler.js +72 -0
  29. package/lib/cloud-connection/base-message-handler.js.map +1 -0
  30. package/lib/cloud-connection/bootstrap-provision.js +3 -2
  31. package/lib/cloud-connection/bootstrap-provision.js.map +1 -1
  32. package/lib/cloud-connection/connection-manager.d.ts +21 -0
  33. package/lib/cloud-connection/connection-manager.d.ts.map +1 -0
  34. package/lib/cloud-connection/connection-manager.js +158 -0
  35. package/lib/cloud-connection/connection-manager.js.map +1 -0
  36. package/lib/cloud-connection/device-agent-cloud-connection.d.ts +9 -30
  37. package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
  38. package/lib/cloud-connection/device-agent-cloud-connection.js +69 -508
  39. package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
  40. package/lib/cloud-connection/device-agent-message-handler.d.ts +22 -0
  41. package/lib/cloud-connection/device-agent-message-handler.d.ts.map +1 -0
  42. package/lib/cloud-connection/device-agent-message-handler.js +357 -0
  43. package/lib/cloud-connection/device-agent-message-handler.js.map +1 -0
  44. package/lib/cloud-connection/device-agent.d.ts.map +1 -1
  45. package/lib/cloud-connection/device-agent.js +11 -9
  46. package/lib/cloud-connection/device-agent.js.map +1 -1
  47. package/lib/cloud-connection/live-updates-handler.d.ts +19 -28
  48. package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
  49. package/lib/cloud-connection/live-updates-handler.js +60 -172
  50. package/lib/cloud-connection/live-updates-handler.js.map +1 -1
  51. package/lib/cloud-connection/live-updates-handler.test.js +71 -165
  52. package/lib/cloud-connection/live-updates-handler.test.js.map +1 -1
  53. package/lib/cloud-connection/message-dispatcher.d.ts +10 -0
  54. package/lib/cloud-connection/message-dispatcher.d.ts.map +1 -0
  55. package/lib/cloud-connection/message-dispatcher.js +27 -0
  56. package/lib/cloud-connection/message-dispatcher.js.map +1 -0
  57. package/lib/cloud-connection/passthrough-handler.d.ts +4 -1
  58. package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -1
  59. package/lib/cloud-connection/passthrough-handler.js +30 -11
  60. package/lib/cloud-connection/passthrough-handler.js.map +1 -1
  61. package/lib/cloud-connection/shadow-handler.d.ts +11 -3
  62. package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
  63. package/lib/cloud-connection/shadow-handler.js +133 -28
  64. package/lib/cloud-connection/shadow-handler.js.map +1 -1
  65. package/lib/cloud-connection/shadow-handler.test.js +45 -57
  66. package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
  67. package/lib/cloud-connection/shadow.d.ts.map +1 -1
  68. package/lib/cloud-connection/shadow.js +2 -1
  69. package/lib/cloud-connection/shadow.js.map +1 -1
  70. package/lib/cloud-connection/transaction-manager.d.ts +12 -3
  71. package/lib/cloud-connection/transaction-manager.d.ts.map +1 -1
  72. package/lib/cloud-connection/transaction-manager.js +29 -28
  73. package/lib/cloud-connection/transaction-manager.js.map +1 -1
  74. package/lib/cloud-connection/transaction-manager.test.js +46 -5
  75. package/lib/cloud-connection/transaction-manager.test.js.map +1 -1
  76. package/lib/device-control/device-control.d.ts +8 -8
  77. package/lib/device-control/device-control.d.ts.map +1 -1
  78. package/lib/device-control/device-control.js +95 -71
  79. package/lib/device-control/device-control.js.map +1 -1
  80. package/lib/docker/docker-compose.d.ts.map +1 -1
  81. package/lib/docker/docker-compose.js +2 -1
  82. package/lib/docker/docker-compose.js.map +1 -1
  83. package/lib/infrastructure/agent-config.d.ts +2 -1
  84. package/lib/infrastructure/agent-config.d.ts.map +1 -1
  85. package/lib/infrastructure/agent-config.js +7 -7
  86. package/lib/infrastructure/agent-config.js.map +1 -1
  87. package/lib/infrastructure/agent-config.test.js +3 -1
  88. package/lib/infrastructure/agent-config.test.js.map +1 -1
  89. package/lib/infrastructure/config-check-utility.d.ts +6 -0
  90. package/lib/infrastructure/config-check-utility.d.ts.map +1 -0
  91. package/lib/infrastructure/config-check-utility.js +67 -0
  92. package/lib/infrastructure/config-check-utility.js.map +1 -0
  93. package/lib/infrastructure/config-check-utility.test.d.ts +2 -0
  94. package/lib/infrastructure/config-check-utility.test.d.ts.map +1 -0
  95. package/lib/infrastructure/config-check-utility.test.js +109 -0
  96. package/lib/infrastructure/config-check-utility.test.js.map +1 -0
  97. package/lib/infrastructure/device-certificate.d.ts +10 -0
  98. package/lib/infrastructure/device-certificate.d.ts.map +1 -0
  99. package/lib/infrastructure/device-certificate.js +47 -0
  100. package/lib/infrastructure/device-certificate.js.map +1 -0
  101. package/lib/infrastructure/device-certificate.test.d.ts +2 -0
  102. package/lib/infrastructure/device-certificate.test.d.ts.map +1 -0
  103. package/lib/infrastructure/device-certificate.test.js +24 -0
  104. package/lib/infrastructure/device-certificate.test.js.map +1 -0
  105. package/lib/infrastructure/legacy-migration/legacy-file.test.d.ts +2 -0
  106. package/lib/infrastructure/legacy-migration/legacy-file.test.d.ts.map +1 -0
  107. package/lib/infrastructure/legacy-migration/legacy-file.test.js +61 -0
  108. package/lib/infrastructure/legacy-migration/legacy-file.test.js.map +1 -0
  109. package/lib/infrastructure/legacy-migration/legacy-files.d.ts +75 -0
  110. package/lib/infrastructure/legacy-migration/legacy-files.d.ts.map +1 -0
  111. package/lib/infrastructure/legacy-migration/legacy-files.js +75 -0
  112. package/lib/infrastructure/legacy-migration/legacy-files.js.map +1 -0
  113. package/lib/infrastructure/legacy-migration/legacy-migration.d.ts +6 -0
  114. package/lib/infrastructure/legacy-migration/legacy-migration.d.ts.map +1 -0
  115. package/lib/infrastructure/legacy-migration/legacy-migration.js +149 -0
  116. package/lib/infrastructure/legacy-migration/legacy-migration.js.map +1 -0
  117. package/lib/infrastructure/legacy-migration/legacy-migration.test.d.ts +2 -0
  118. package/lib/infrastructure/legacy-migration/legacy-migration.test.d.ts.map +1 -0
  119. package/lib/infrastructure/legacy-migration/legacy-migration.test.js +226 -0
  120. package/lib/infrastructure/legacy-migration/legacy-migration.test.js.map +1 -0
  121. package/lib/infrastructure/require-files-present-ready.test.d.ts +2 -0
  122. package/lib/infrastructure/require-files-present-ready.test.d.ts.map +1 -0
  123. package/lib/infrastructure/require-files-present-ready.test.js +44 -0
  124. package/lib/infrastructure/require-files-present-ready.test.js.map +1 -0
  125. package/lib/infrastructure/required-config-checks.d.ts +2 -0
  126. package/lib/infrastructure/required-config-checks.d.ts.map +1 -0
  127. package/lib/infrastructure/required-config-checks.js +30 -0
  128. package/lib/infrastructure/required-config-checks.js.map +1 -0
  129. package/lib/infrastructure/tokens-and-device-cfg.d.ts.map +1 -1
  130. package/lib/infrastructure/tokens-and-device-cfg.js +11 -8
  131. package/lib/infrastructure/tokens-and-device-cfg.js.map +1 -1
  132. package/lib/jobs/job-handler.d.ts +23 -0
  133. package/lib/jobs/job-handler.d.ts.map +1 -0
  134. package/lib/jobs/job-handler.js +131 -0
  135. package/lib/jobs/job-handler.js.map +1 -0
  136. package/lib/local-connection/rabbitmq-connection.d.ts.map +1 -1
  137. package/lib/local-connection/rabbitmq-connection.js +14 -14
  138. package/lib/local-connection/rabbitmq-connection.js.map +1 -1
  139. package/lib/secure-tunneling/secure-tunnel-message-handler.d.ts +8 -0
  140. package/lib/secure-tunneling/secure-tunnel-message-handler.d.ts.map +1 -0
  141. package/lib/secure-tunneling/secure-tunnel-message-handler.js +42 -0
  142. package/lib/secure-tunneling/secure-tunnel-message-handler.js.map +1 -0
  143. package/lib/secure-tunneling/secure-tunneling.d.ts +9 -9
  144. package/lib/secure-tunneling/secure-tunneling.d.ts.map +1 -1
  145. package/lib/secure-tunneling/secure-tunneling.js +21 -16
  146. package/lib/secure-tunneling/secure-tunneling.js.map +1 -1
  147. package/lib/secure-tunneling/secure-tunneling.test.js +11 -13
  148. package/lib/secure-tunneling/secure-tunneling.test.js.map +1 -1
  149. package/lib/subcommands/app/analytics.d.ts.map +1 -1
  150. package/lib/subcommands/app/analytics.js +1 -2
  151. package/lib/subcommands/app/analytics.js.map +1 -1
  152. package/lib/subcommands/app/env-vars.d.ts +4 -0
  153. package/lib/subcommands/app/env-vars.d.ts.map +1 -1
  154. package/lib/subcommands/app/env-vars.js +52 -6
  155. package/lib/subcommands/app/env-vars.js.map +1 -1
  156. package/lib/subcommands/app/index.d.ts.map +1 -1
  157. package/lib/subcommands/app/index.js +1 -3
  158. package/lib/subcommands/app/index.js.map +1 -1
  159. package/lib/subcommands/app/models.d.ts +0 -11
  160. package/lib/subcommands/app/models.d.ts.map +1 -1
  161. package/lib/subcommands/app/models.js +2 -58
  162. package/lib/subcommands/app/models.js.map +1 -1
  163. package/lib/subcommands/app/shadow.d.ts.map +1 -1
  164. package/lib/subcommands/app/shadow.js +6 -5
  165. package/lib/subcommands/app/shadow.js.map +1 -1
  166. package/lib/subcommands/app/version.d.ts +2 -0
  167. package/lib/subcommands/app/version.d.ts.map +1 -1
  168. package/lib/subcommands/app/version.js +16 -6
  169. package/lib/subcommands/app/version.js.map +1 -1
  170. package/lib/subcommands/config.d.ts +2 -0
  171. package/lib/subcommands/config.d.ts.map +1 -0
  172. package/lib/subcommands/config.js +39 -0
  173. package/lib/subcommands/config.js.map +1 -0
  174. package/lib/subcommands/device/clean.d.ts +1 -1
  175. package/lib/subcommands/device/clean.d.ts.map +1 -1
  176. package/lib/subcommands/device/clean.js +23 -13
  177. package/lib/subcommands/device/clean.js.map +1 -1
  178. package/lib/subcommands/device/index.d.ts.map +1 -1
  179. package/lib/subcommands/device/index.js +3 -1
  180. package/lib/subcommands/device/index.js.map +1 -1
  181. package/lib/subcommands/device/init.js +8 -8
  182. package/lib/subcommands/device/init.js.map +1 -1
  183. package/lib/subcommands/device/migrate.d.ts +2 -0
  184. package/lib/subcommands/device/migrate.d.ts.map +1 -0
  185. package/lib/subcommands/device/migrate.js +24 -0
  186. package/lib/subcommands/device/migrate.js.map +1 -0
  187. package/lib/subcommands/device/refresh.d.ts.map +1 -1
  188. package/lib/subcommands/device/refresh.js +1 -0
  189. package/lib/subcommands/device/refresh.js.map +1 -1
  190. package/lib/subcommands/index.d.ts +1 -1
  191. package/lib/subcommands/index.d.ts.map +1 -1
  192. package/lib/subcommands/index.js +3 -1
  193. package/lib/subcommands/index.js.map +1 -1
  194. package/lib/subcommands/rabbitmq-connection.d.ts +1 -1
  195. package/lib/subcommands/rabbitmq-connection.d.ts.map +1 -1
  196. package/lib/util/aai-error.d.ts +12 -0
  197. package/lib/util/aai-error.d.ts.map +1 -0
  198. package/lib/util/aai-error.js +11 -0
  199. package/lib/util/aai-error.js.map +1 -0
  200. package/lib/util/aws-regions.d.ts +2 -0
  201. package/lib/util/aws-regions.d.ts.map +1 -0
  202. package/lib/util/{cloud-mode-ready.js → aws-regions.js} +2 -20
  203. package/lib/util/aws-regions.js.map +1 -0
  204. package/lib/util/check-for-updates.d.ts.map +1 -1
  205. package/lib/util/check-for-updates.js +5 -28
  206. package/lib/util/check-for-updates.js.map +1 -1
  207. package/lib/util/clean-certs.d.ts.map +1 -1
  208. package/lib/util/clean-certs.js +5 -4
  209. package/lib/util/clean-certs.js.map +1 -1
  210. package/lib/util/directories.d.ts +4 -18
  211. package/lib/util/directories.d.ts.map +1 -1
  212. package/lib/util/directories.js +18 -32
  213. package/lib/util/directories.js.map +1 -1
  214. package/lib/util/file.d.ts +4 -0
  215. package/lib/util/file.d.ts.map +1 -1
  216. package/lib/util/file.js +65 -4
  217. package/lib/util/file.js.map +1 -1
  218. package/lib/util/get-device-id.d.ts.map +1 -1
  219. package/lib/util/get-device-id.js +7 -1
  220. package/lib/util/get-device-id.js.map +1 -1
  221. package/lib/util/http-client.js +3 -3
  222. package/lib/util/http-client.js.map +1 -1
  223. package/package.json +19 -17
  224. package/readme.md +12 -32
  225. package/src/application-control/config.ts +9 -12
  226. package/src/application-control/environment-variables.test.ts +28 -7
  227. package/src/application-control/environment-variables.ts +42 -59
  228. package/src/application-control/index.ts +3 -16
  229. package/src/application-control/install.ts +39 -13
  230. package/src/application-control/models.ts +6 -87
  231. package/src/application-control/utils.ts +10 -25
  232. package/src/cloud-connection/base-message-handler.ts +118 -0
  233. package/src/cloud-connection/bootstrap-provision.ts +7 -7
  234. package/src/cloud-connection/connection-manager.ts +187 -0
  235. package/src/cloud-connection/device-agent-cloud-connection.ts +130 -723
  236. package/src/cloud-connection/device-agent-message-handler.ts +642 -0
  237. package/src/cloud-connection/device-agent.ts +16 -7
  238. package/src/cloud-connection/live-updates-handler.test.ts +121 -189
  239. package/src/cloud-connection/live-updates-handler.ts +105 -232
  240. package/src/cloud-connection/message-dispatcher.ts +33 -0
  241. package/src/cloud-connection/passthrough-handler.ts +55 -18
  242. package/src/cloud-connection/shadow-handler.test.ts +45 -57
  243. package/src/cloud-connection/shadow-handler.ts +224 -54
  244. package/src/cloud-connection/shadow.ts +4 -1
  245. package/src/cloud-connection/transaction-manager.test.ts +68 -6
  246. package/src/cloud-connection/transaction-manager.ts +69 -41
  247. package/src/device-control/device-control.ts +102 -70
  248. package/src/docker/docker-compose.ts +3 -2
  249. package/src/infrastructure/agent-config.test.ts +6 -2
  250. package/src/infrastructure/agent-config.ts +8 -7
  251. package/src/infrastructure/config-check-utility.test.ts +154 -0
  252. package/src/infrastructure/config-check-utility.ts +77 -0
  253. package/src/infrastructure/device-certificate.test.ts +40 -0
  254. package/src/infrastructure/device-certificate.ts +58 -0
  255. package/src/infrastructure/legacy-migration/legacy-file.test.ts +88 -0
  256. package/src/infrastructure/legacy-migration/legacy-files.ts +101 -0
  257. package/src/infrastructure/legacy-migration/legacy-migration.test.ts +396 -0
  258. package/src/infrastructure/legacy-migration/legacy-migration.ts +229 -0
  259. package/src/infrastructure/require-files-present-ready.test.ts +53 -0
  260. package/src/infrastructure/required-config-checks.ts +33 -0
  261. package/src/infrastructure/tokens-and-device-cfg.ts +12 -10
  262. package/src/jobs/job-handler.ts +146 -0
  263. package/src/local-connection/rabbitmq-connection.ts +22 -17
  264. package/src/secure-tunneling/secure-tunnel-message-handler.ts +56 -0
  265. package/src/secure-tunneling/secure-tunneling.test.ts +20 -22
  266. package/src/secure-tunneling/secure-tunneling.ts +41 -29
  267. package/src/subcommands/app/analytics.ts +2 -4
  268. package/src/subcommands/app/env-vars.ts +72 -9
  269. package/src/subcommands/app/index.ts +3 -11
  270. package/src/subcommands/app/models.ts +5 -81
  271. package/src/subcommands/app/shadow.ts +6 -5
  272. package/src/subcommands/app/version.ts +23 -6
  273. package/src/subcommands/config.ts +42 -0
  274. package/src/subcommands/device/clean.ts +31 -17
  275. package/src/subcommands/device/index.ts +3 -1
  276. package/src/subcommands/device/init.ts +11 -11
  277. package/src/subcommands/device/migrate.ts +20 -0
  278. package/src/subcommands/device/refresh.ts +1 -0
  279. package/src/subcommands/index.ts +3 -1
  280. package/src/util/aai-error.ts +20 -0
  281. package/src/util/{cloud-mode-ready.ts → aws-regions.ts} +0 -24
  282. package/src/util/check-for-updates.ts +14 -30
  283. package/src/util/clean-certs.ts +8 -4
  284. package/src/util/directories.ts +23 -67
  285. package/src/util/file.ts +83 -3
  286. package/src/util/get-device-id.ts +7 -7
  287. package/src/util/http-client.ts +2 -2
  288. package/lib/util/cloud-mode-ready.d.ts +0 -3
  289. package/lib/util/cloud-mode-ready.d.ts.map +0 -1
  290. package/lib/util/cloud-mode-ready.js.map +0 -1
  291. package/lib/util/download-file.d.ts +0 -6
  292. package/lib/util/download-file.d.ts.map +0 -1
  293. package/lib/util/download-file.js +0 -25
  294. package/lib/util/download-file.js.map +0 -1
  295. package/lib/util/fetch-with-timeout.d.ts +0 -4
  296. package/lib/util/fetch-with-timeout.d.ts.map +0 -1
  297. package/lib/util/fetch-with-timeout.js +0 -30
  298. package/lib/util/fetch-with-timeout.js.map +0 -1
  299. package/lib/util/parsing.d.ts +0 -2
  300. package/lib/util/parsing.d.ts.map +0 -1
  301. package/lib/util/parsing.js +0 -17
  302. package/lib/util/parsing.js.map +0 -1
  303. package/src/util/download-file.ts +0 -25
  304. package/src/util/fetch-with-timeout.ts +0 -35
  305. package/src/util/parsing.ts +0 -11
@@ -1,16 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SECURE_TUNNEL_BIN_PATH = exports.SECURE_TUNNEL_BIN_DIR = exports.SECURE_TUNNEL_BIN_NAME = exports.DEVICE_CERTIFICATE_FILE_PATH = exports.DEVICE_PRIVATE_KEY_FILE_PATH = exports.DEVICE_ID_FILE_NAME = exports.DEVICE_CERTIFICATE_FILE_NAME = exports.DEVICE_PRIVATE_KEY_FILE_NAME = exports.BOOTSTRAP_ID_FILE_PATH = exports.BOOTSTRAP_CERTIFICATE_FILE_PATH = exports.BOOTSTRAP_PRIVATE_KEY_FILE_PATH = exports.BOOTSTRAP_CERTIFICATES_DIR_PATH = exports.CERTIFICATE_OWNERSHIP_TOKEN_FILE_NAME = exports.BOOTSTRAP_ID_FILE_NAME = exports.BOOTSTRAP_CERTIFICATE_FILE_NAME = exports.BOOTSTRAP_PRIVATE_KEY_FILE_NAME = exports.BOOTSTRAP_DIR_NAME = exports.shortenSystemId = exports.AWS_ROOT_CERTIFICATE_FILE_PATH = exports.AWS_ROOT_CERTIFICATE_FILE_NAME = exports.CREDENTIALS_FILE_PATH = exports.DEVICE_AGENT_DOCKER_COMPOSE_PATH = exports.DEVICE_AGENT_CFG_PATH = exports.DEVICE_AGENT_CFG_DIR = exports.APP_ROOT = void 0;
3
+ exports.SECURE_TUNNEL_BIN_PATH = exports.SECURE_TUNNEL_BIN_DIR = exports.SECURE_TUNNEL_BIN_NAME = exports.shortenSystemId = exports.AWS_ROOT_CERTIFICATE_FILE_NAME = exports.AWS_ROOT_CERTIFICATE_FILE_PATH = exports.CREDENTIALS_FILE_PATH = exports.getDeviceAgentDockerComposePath = exports.getDeviceAgentConfigPath = exports.DEVICE_AGENT_CFG_DIR = exports.APP_ROOT = void 0;
4
+ const infrastructure_1 = require("alwaysai/lib/infrastructure");
4
5
  const paths_1 = require("alwaysai/lib/paths");
5
6
  const path_1 = require("path");
6
7
  const system_id_1 = require("../infrastructure/system-id");
7
8
  exports.APP_ROOT = (0, path_1.join)(paths_1.AAI_DIR, 'applications');
8
9
  exports.DEVICE_AGENT_CFG_DIR = 'device-agent';
9
- exports.DEVICE_AGENT_CFG_PATH = (0, path_1.join)(paths_1.LOCAL_AAI_CFG_DIR, exports.DEVICE_AGENT_CFG_DIR);
10
- exports.DEVICE_AGENT_DOCKER_COMPOSE_PATH = (0, path_1.join)(exports.DEVICE_AGENT_CFG_PATH, paths_1.DOCKER_COMPOSE_FILE);
10
+ function getDeviceAgentConfigPath(baseDir) {
11
+ if (baseDir) {
12
+ return (0, path_1.join)(baseDir, (0, infrastructure_1.getDeviceConfigPath)(), exports.DEVICE_AGENT_CFG_DIR);
13
+ }
14
+ return (0, path_1.join)(paths_1.LOCAL_AAI_CFG_DIR, (0, infrastructure_1.getDeviceConfigPath)(), exports.DEVICE_AGENT_CFG_DIR);
15
+ }
16
+ exports.getDeviceAgentConfigPath = getDeviceAgentConfigPath;
17
+ function getDeviceAgentDockerComposePath(baseDir) {
18
+ return (0, path_1.join)(getDeviceAgentConfigPath(baseDir), paths_1.DOCKER_COMPOSE_FILE);
19
+ }
20
+ exports.getDeviceAgentDockerComposePath = getDeviceAgentDockerComposePath;
11
21
  exports.CREDENTIALS_FILE_PATH = (0, path_1.join)(paths_1.LOCAL_AAI_CFG_DIR, paths_1.DEVICE_TOKEN_FILE_NAME);
12
- exports.AWS_ROOT_CERTIFICATE_FILE_NAME = 'AmazonRootCA1.pem';
13
- exports.AWS_ROOT_CERTIFICATE_FILE_PATH = (0, path_1.join)(paths_1.LOCAL_CERT_AND_KEY_DIR, exports.AWS_ROOT_CERTIFICATE_FILE_NAME);
22
+ const localDeviceCertificates = new infrastructure_1.LocalDeviceCertificates();
23
+ exports.AWS_ROOT_CERTIFICATE_FILE_PATH = localDeviceCertificates.getRootCertificateFilePath();
24
+ exports.AWS_ROOT_CERTIFICATE_FILE_NAME = localDeviceCertificates.getRootCertificateFileName();
14
25
  const shortenSystemId = () => {
15
26
  const id = (0, system_id_1.getSystemId)();
16
27
  switch (id) {
@@ -20,36 +31,11 @@ const shortenSystemId = () => {
20
31
  return 'qa';
21
32
  case 'production':
22
33
  return 'prod';
34
+ default:
35
+ return 'prod';
23
36
  }
24
37
  };
25
38
  exports.shortenSystemId = shortenSystemId;
26
- /*===================================================================
27
- Bootstrap Certificates
28
- ===================================================================*/
29
- exports.BOOTSTRAP_DIR_NAME = 'bootstrap-certificates';
30
- const BOOTSTRAP_PRIVATE_KEY_FILE_NAME = () => `aai-claim-private-key_${(0, exports.shortenSystemId)()}.pem.key`;
31
- exports.BOOTSTRAP_PRIVATE_KEY_FILE_NAME = BOOTSTRAP_PRIVATE_KEY_FILE_NAME;
32
- const BOOTSTRAP_CERTIFICATE_FILE_NAME = () => `aai-claim-cert_${(0, exports.shortenSystemId)()}.pem.crt`;
33
- exports.BOOTSTRAP_CERTIFICATE_FILE_NAME = BOOTSTRAP_CERTIFICATE_FILE_NAME;
34
- const BOOTSTRAP_ID_FILE_NAME = () => `aai-claim-cert-id_${(0, exports.shortenSystemId)()}.txt`;
35
- exports.BOOTSTRAP_ID_FILE_NAME = BOOTSTRAP_ID_FILE_NAME;
36
- exports.CERTIFICATE_OWNERSHIP_TOKEN_FILE_NAME = 'certificate-ownership-token.txt';
37
- const BOOTSTRAP_CERTIFICATES_DIR_PATH = () => (0, path_1.join)(paths_1.LOCAL_CERT_AND_KEY_DIR, exports.BOOTSTRAP_DIR_NAME);
38
- exports.BOOTSTRAP_CERTIFICATES_DIR_PATH = BOOTSTRAP_CERTIFICATES_DIR_PATH;
39
- const BOOTSTRAP_PRIVATE_KEY_FILE_PATH = () => (0, path_1.join)(paths_1.LOCAL_CERT_AND_KEY_DIR, exports.BOOTSTRAP_DIR_NAME, (0, exports.BOOTSTRAP_PRIVATE_KEY_FILE_NAME)());
40
- exports.BOOTSTRAP_PRIVATE_KEY_FILE_PATH = BOOTSTRAP_PRIVATE_KEY_FILE_PATH;
41
- const BOOTSTRAP_CERTIFICATE_FILE_PATH = () => (0, path_1.join)(paths_1.LOCAL_CERT_AND_KEY_DIR, exports.BOOTSTRAP_DIR_NAME, (0, exports.BOOTSTRAP_CERTIFICATE_FILE_NAME)());
42
- exports.BOOTSTRAP_CERTIFICATE_FILE_PATH = BOOTSTRAP_CERTIFICATE_FILE_PATH;
43
- const BOOTSTRAP_ID_FILE_PATH = () => (0, path_1.join)(paths_1.LOCAL_CERT_AND_KEY_DIR, exports.BOOTSTRAP_DIR_NAME, (0, exports.BOOTSTRAP_ID_FILE_NAME)());
44
- exports.BOOTSTRAP_ID_FILE_PATH = BOOTSTRAP_ID_FILE_PATH;
45
- /*===================================================================
46
- Device Certificates
47
- ===================================================================*/
48
- exports.DEVICE_PRIVATE_KEY_FILE_NAME = 'aai-device-private-key.pem.key';
49
- exports.DEVICE_CERTIFICATE_FILE_NAME = 'aai-device-cert.pem.crt';
50
- exports.DEVICE_ID_FILE_NAME = 'aai-device-cert-id.txt';
51
- exports.DEVICE_PRIVATE_KEY_FILE_PATH = (0, path_1.join)(paths_1.LOCAL_CERT_AND_KEY_DIR, exports.DEVICE_PRIVATE_KEY_FILE_NAME);
52
- exports.DEVICE_CERTIFICATE_FILE_PATH = (0, path_1.join)(paths_1.LOCAL_CERT_AND_KEY_DIR, exports.DEVICE_CERTIFICATE_FILE_NAME);
53
39
  /*===================================================================
54
40
  Secure Tunnel bin directory
55
41
  ===================================================================*/
@@ -1 +1 @@
1
- {"version":3,"file":"directories.js","sourceRoot":"","sources":["../../src/util/directories.ts"],"names":[],"mappings":";;;AAAA,8CAM4B;AAC5B,+BAA4B;AAC5B,2DAA0D;AAE7C,QAAA,QAAQ,GAAG,IAAA,WAAI,EAAC,eAAO,EAAE,cAAc,CAAC,CAAC;AAEzC,QAAA,oBAAoB,GAAG,cAAc,CAAC;AACtC,QAAA,qBAAqB,GAAG,IAAA,WAAI,EACvC,yBAAiB,EACjB,4BAAoB,CACrB,CAAC;AACW,QAAA,gCAAgC,GAAG,IAAA,WAAI,EAClD,6BAAqB,EACrB,2BAAmB,CACpB,CAAC;AAEW,QAAA,qBAAqB,GAAG,IAAA,WAAI,EACvC,yBAAiB,EACjB,8BAAsB,CACvB,CAAC;AAEW,QAAA,8BAA8B,GAAG,mBAAmB,CAAC;AACrD,QAAA,8BAA8B,GAAG,IAAA,WAAI,EAChD,8BAAsB,EACtB,sCAA8B,CAC/B,CAAC;AAEK,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,GAAG,IAAA,uBAAW,GAAE,CAAC;IACzB,QAAQ,EAAE,EAAE;QACV,KAAK,aAAa;YAChB,OAAO,KAAK,CAAC;QACf,KAAK,IAAI;YACP,OAAO,IAAI,CAAC;QACd,KAAK,YAAY;YACf,OAAO,MAAM,CAAC;KACjB;AACH,CAAC,CAAC;AAVW,QAAA,eAAe,mBAU1B;AAEF;;qEAEqE;AAExD,QAAA,kBAAkB,GAAG,wBAAwB,CAAC;AACpD,MAAM,+BAA+B,GAAG,GAAG,EAAE,CAClD,yBAAyB,IAAA,uBAAe,GAAE,UAAU,CAAC;AAD1C,QAAA,+BAA+B,mCACW;AAChD,MAAM,+BAA+B,GAAG,GAAG,EAAE,CAClD,kBAAkB,IAAA,uBAAe,GAAE,UAAU,CAAC;AADnC,QAAA,+BAA+B,mCACI;AACzC,MAAM,sBAAsB,GAAG,GAAG,EAAE,CACzC,qBAAqB,IAAA,uBAAe,GAAE,MAAM,CAAC;AADlC,QAAA,sBAAsB,0BACY;AAClC,QAAA,qCAAqC,GAChD,iCAAiC,CAAC;AAE7B,MAAM,+BAA+B,GAAG,GAAG,EAAE,CAClD,IAAA,WAAI,EAAC,8BAAsB,EAAE,0BAAkB,CAAC,CAAC;AADtC,QAAA,+BAA+B,mCACO;AAE5C,MAAM,+BAA+B,GAAG,GAAG,EAAE,CAClD,IAAA,WAAI,EACF,8BAAsB,EACtB,0BAAkB,EAClB,IAAA,uCAA+B,GAAE,CAClC,CAAC;AALS,QAAA,+BAA+B,mCAKxC;AAEG,MAAM,+BAA+B,GAAG,GAAG,EAAE,CAClD,IAAA,WAAI,EACF,8BAAsB,EACtB,0BAAkB,EAClB,IAAA,uCAA+B,GAAE,CAClC,CAAC;AALS,QAAA,+BAA+B,mCAKxC;AAEG,MAAM,sBAAsB,GAAG,GAAG,EAAE,CACzC,IAAA,WAAI,EAAC,8BAAsB,EAAE,0BAAkB,EAAE,IAAA,8BAAsB,GAAE,CAAC,CAAC;AADhE,QAAA,sBAAsB,0BAC0C;AAE7E;;qEAEqE;AAExD,QAAA,4BAA4B,GAAG,gCAAgC,CAAC;AAChE,QAAA,4BAA4B,GAAG,yBAAyB,CAAC;AACzD,QAAA,mBAAmB,GAAG,wBAAwB,CAAC;AAE/C,QAAA,4BAA4B,GAAG,IAAA,WAAI,EAC9C,8BAAsB,EACtB,oCAA4B,CAC7B,CAAC;AAEW,QAAA,4BAA4B,GAAG,IAAA,WAAI,EAC9C,8BAAsB,EACtB,oCAA4B,CAC7B,CAAC;AAEF;;qEAEqE;AACxD,QAAA,sBAAsB,GAAG,YAAY,CAAC;AACtC,QAAA,qBAAqB,GAAG,eAAe,CAAC;AACxC,QAAA,sBAAsB,GAAG,IAAA,WAAI,EACxC,eAAO,EACP,6BAAqB,EACrB,8BAAsB,CACvB,CAAC"}
1
+ {"version":3,"file":"directories.js","sourceRoot":"","sources":["../../src/util/directories.ts"],"names":[],"mappings":";;;AAAA,gEAGqC;AACrC,8CAK4B;AAC5B,+BAA4B;AAC5B,2DAA0D;AAE7C,QAAA,QAAQ,GAAG,IAAA,WAAI,EAAC,eAAO,EAAE,cAAc,CAAC,CAAC;AAEzC,QAAA,oBAAoB,GAAG,cAAc,CAAC;AAEnD,SAAgB,wBAAwB,CAAC,OAAQ;IAC/C,IAAI,OAAO,EAAE;QACX,OAAO,IAAA,WAAI,EAAC,OAAO,EAAE,IAAA,oCAAmB,GAAE,EAAE,4BAAoB,CAAC,CAAC;KACnE;IACD,OAAO,IAAA,WAAI,EAAC,yBAAiB,EAAE,IAAA,oCAAmB,GAAE,EAAE,4BAAoB,CAAC,CAAC;AAC9E,CAAC;AALD,4DAKC;AAED,SAAgB,+BAA+B,CAAC,OAAQ;IACtD,OAAO,IAAA,WAAI,EAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,2BAAmB,CAAC,CAAC;AACtE,CAAC;AAFD,0EAEC;AAEY,QAAA,qBAAqB,GAAG,IAAA,WAAI,EACvC,yBAAiB,EACjB,8BAAsB,CACvB,CAAC;AAEF,MAAM,uBAAuB,GAAG,IAAI,wCAAuB,EAAE,CAAC;AACjD,QAAA,8BAA8B,GACzC,uBAAuB,CAAC,0BAA0B,EAAE,CAAC;AAC1C,QAAA,8BAA8B,GACzC,uBAAuB,CAAC,0BAA0B,EAAE,CAAC;AAEhD,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,GAAG,IAAA,uBAAW,GAAE,CAAC;IACzB,QAAQ,EAAE,EAAE;QACV,KAAK,aAAa;YAChB,OAAO,KAAK,CAAC;QACf,KAAK,IAAI;YACP,OAAO,IAAI,CAAC;QACd,KAAK,YAAY;YACf,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,MAAM,CAAC;KACjB;AACH,CAAC,CAAC;AAZW,QAAA,eAAe,mBAY1B;AAEF;;qEAEqE;AACxD,QAAA,sBAAsB,GAAG,YAAY,CAAC;AACtC,QAAA,qBAAqB,GAAG,eAAe,CAAC;AACxC,QAAA,sBAAsB,GAAG,IAAA,WAAI,EACxC,eAAO,EACP,6BAAqB,EACrB,8BAAsB,CACvB,CAAC"}
@@ -4,4 +4,8 @@ export declare function pruneDir({ path, exclude, recurse }: {
4
4
  exclude?: string[];
5
5
  recurse?: boolean;
6
6
  }): Promise<boolean>;
7
+ export declare function downloadToFile({ path, url }: {
8
+ path: string;
9
+ url: string;
10
+ }): Promise<void>;
7
11
  //# sourceMappingURL=file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/util/file.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,iBAU5C;AAED,wBAAsB,QAAQ,CAAC,EAC7B,IAAI,EACJ,OAAO,EACP,OAAO,EACR,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,oBAkDA"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/util/file.ts"],"names":[],"mappings":"AAOA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,iBAU5C;AAED,wBAAsB,QAAQ,CAAC,EAC7B,IAAI,EACJ,OAAO,EACP,OAAO,EACR,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,oBAkDA;AAED,wBAAsB,cAAc,CAAC,EACnC,IAAI,EACJ,GAAG,EACJ,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,iBAsEA"}
package/lib/util/file.js CHANGED
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pruneDir = exports.safeRimraf = void 0;
3
+ exports.downloadToFile = exports.pruneDir = exports.safeRimraf = void 0;
4
4
  const rimraf_1 = require("rimraf");
5
5
  const logger_1 = require("../util/logger");
6
6
  const promises_1 = require("fs/promises");
7
7
  const path_1 = require("path");
8
+ const util_1 = require("alwaysai/lib/util");
9
+ const fs_1 = require("fs");
8
10
  async function safeRimraf(path) {
9
11
  logger_1.logger.debug(`Removing ${path}`);
10
12
  try {
@@ -12,7 +14,7 @@ async function safeRimraf(path) {
12
14
  }
13
15
  catch (e) {
14
16
  logger_1.logger.error(`Failed to remove ${path}. Please manually delete the file or directory.`);
15
- logger_1.logger.debug(`Error removing ${path}: ${e}`);
17
+ logger_1.logger.debug(`Error removing ${path}:\n${(0, util_1.stringifyError)(e)}`);
16
18
  }
17
19
  }
18
20
  exports.safeRimraf = safeRimraf;
@@ -57,10 +59,69 @@ async function pruneDir({ path, exclude, recurse }) {
57
59
  }
58
60
  return canPruneParent;
59
61
  }
60
- catch (error) {
61
- logger_1.logger.error(`Error pruning directory ${path}: ${JSON.stringify(error)}`);
62
+ catch (e) {
63
+ logger_1.logger.error(`Error pruning directory ${path}!\n${(0, util_1.stringifyError)(e)}`);
62
64
  return false;
63
65
  }
64
66
  }
65
67
  exports.pruneDir = pruneDir;
68
+ async function downloadToFile({ path, url }) {
69
+ var _a;
70
+ const response = await fetch(url);
71
+ if (!response.ok) {
72
+ throw new Error(`Failed to fetch ${url}: ${response.statusText}`);
73
+ }
74
+ const contentLength = response.headers.get('content-length');
75
+ const reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader();
76
+ if (reader) {
77
+ const chunks = [];
78
+ const totalSize = contentLength ? parseInt(contentLength) : undefined;
79
+ const PROGRESS_PERC_LOG_INCREMENT = 5;
80
+ const BYTE_DOWNLOAD_LOG_INCREMENT = 5000000;
81
+ const [baseUrl, urlParams] = url.split('?');
82
+ const urlForLog = `${baseUrl}${(urlParams === null || urlParams === void 0 ? void 0 : urlParams.length) ? `...(${urlParams.length} more characters)` : ''}`;
83
+ let totalDownloadedBytes = 0;
84
+ let downloadedSize = 0;
85
+ let totalProgressPerc = 0;
86
+ // eslint-disable-next-line
87
+ while (true) {
88
+ const { done, value } = await reader.read();
89
+ if (done) {
90
+ logger_1.logger.info(`Download complete - ${urlForLog}`);
91
+ break;
92
+ }
93
+ if (value) {
94
+ chunks.push(value);
95
+ downloadedSize += value.length;
96
+ if (totalSize) {
97
+ const progress = (downloadedSize / totalSize) * 100;
98
+ if (progress > totalProgressPerc + PROGRESS_PERC_LOG_INCREMENT) {
99
+ totalProgressPerc += PROGRESS_PERC_LOG_INCREMENT;
100
+ logger_1.logger.debug(`Download progress: ${progress.toFixed(2)}% - ${urlForLog}`);
101
+ }
102
+ }
103
+ else {
104
+ if (downloadedSize >
105
+ totalDownloadedBytes + BYTE_DOWNLOAD_LOG_INCREMENT) {
106
+ totalDownloadedBytes += BYTE_DOWNLOAD_LOG_INCREMENT;
107
+ logger_1.logger.debug(`Download progress: ${downloadedSize} total bytes - ${urlForLog}`);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ logger_1.logger.debug(`Writing downloaded chunks to file ${path}`);
113
+ const combinedSize = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
114
+ const combinedChunks = new Uint8Array(combinedSize);
115
+ let offset = 0;
116
+ for (const chunk of chunks) {
117
+ combinedChunks.set(chunk, offset);
118
+ offset += chunk.length;
119
+ }
120
+ (0, fs_1.writeFileSync)(path, combinedChunks);
121
+ }
122
+ else {
123
+ throw new Error('Unable to access response body when downloading file.');
124
+ }
125
+ }
126
+ exports.downloadToFile = downloadToFile;
66
127
  //# sourceMappingURL=file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/util/file.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,2CAAwC;AACxC,0CAA2D;AAC3D,+BAA4B;AAErB,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,eAAM,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI;QACF,MAAM,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC;KACpB;IAAC,OAAO,CAAC,EAAE;QACV,eAAM,CAAC,KAAK,CACV,oBAAoB,IAAI,iDAAiD,CAC1E,CAAC;QACF,eAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;KAC9C;AACH,CAAC;AAVD,gCAUC;AAEM,KAAK,UAAU,QAAQ,CAAC,EAC7B,IAAI,EACJ,OAAO,EACP,OAAO,EAKR;IACC;;;;;;OAMG;IACH,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC;QAElC,IAAI,cAAc,GAAG,IAAI,CAAC;QAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAElC,MAAM,UAAU,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAC/C,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC/B,CAAC;YAEF,IAAI,UAAU,EAAE;gBACd,eAAM,CAAC,KAAK,CAAC,kBAAkB,QAAQ,kBAAkB,CAAC,CAAC;gBAC3D,cAAc,GAAG,KAAK,CAAC;gBACvB,SAAS;aACV;YAED,MAAM,SAAS,GAAG,MAAM,IAAA,eAAI,EAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE;gBAC3B,IAAI,OAAO,EAAE;oBACX,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC;wBAChC,IAAI,EAAE,QAAQ;wBACd,OAAO;wBACP,OAAO;qBACR,CAAC,CAAC;oBAEH,IAAI,UAAU,EAAE;wBACd,MAAM,IAAA,gBAAK,EAAC,QAAQ,CAAC,CAAC;qBACvB;yBAAM;wBACL,cAAc,GAAG,KAAK,CAAC;qBACxB;iBACF;aACF;iBAAM;gBACL,MAAM,IAAA,iBAAM,EAAC,QAAQ,CAAC,CAAC;aACxB;SACF;QACD,OAAO,cAAc,CAAC;KACvB;IAAC,OAAO,KAAK,EAAE;QACd,eAAM,CAAC,KAAK,CAAC,2BAA2B,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AA1DD,4BA0DC"}
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/util/file.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-device-id.d.ts","sourceRoot":"","sources":["../../src/util/get-device-id.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,WAiB5B"}
1
+ {"version":3,"file":"get-device-id.d.ts","sourceRoot":"","sources":["../../src/util/get-device-id.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,WAc5B"}
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDeviceUuid = void 0;
4
4
  const device_1 = require("alwaysai/lib/core/device");
5
+ const logger_1 = require("./logger");
6
+ const util_1 = require("alwaysai/lib/util");
7
+ const aai_error_1 = require("./aai-error");
5
8
  function getDeviceUuid() {
6
9
  const deviceCfgFile = (0, device_1.DeviceConfigFile)();
7
10
  if (!deviceCfgFile.exists()) {
@@ -12,7 +15,10 @@ function getDeviceUuid() {
12
15
  return cfg.deviceUuid;
13
16
  }
14
17
  catch (e) {
15
- throw new Error(`Failed to read device configuration: ${JSON.stringify(deviceCfgFile.getErrors(), null, 2)}`);
18
+ logger_1.logger.error(`Failed to read device configuration!\n${(0, util_1.stringifyError)(e)}`);
19
+ throw new aai_error_1.default('Failed to read device configuration', {
20
+ cause: deviceCfgFile.getErrors()
21
+ });
16
22
  }
17
23
  }
18
24
  exports.getDeviceUuid = getDeviceUuid;
@@ -1 +1 @@
1
- {"version":3,"file":"get-device-id.js","sourceRoot":"","sources":["../../src/util/get-device-id.ts"],"names":[],"mappings":";;;AAAA,qDAA4D;AAE5D,SAAgB,aAAa;IAC3B,MAAM,aAAa,GAAG,IAAA,yBAAgB,GAAE,CAAC;IACzC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;KACpD;IACD,IAAI;QACF,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,UAAU,CAAC;KACvB;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,SAAS,CACpD,aAAa,CAAC,SAAS,EAAE,EACzB,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;KACH;AACH,CAAC;AAjBD,sCAiBC"}
1
+ {"version":3,"file":"get-device-id.js","sourceRoot":"","sources":["../../src/util/get-device-id.ts"],"names":[],"mappings":";;;AAAA,qDAA4D;AAC5D,qCAAkC;AAClC,4CAAmD;AACnD,2CAAmC;AAEnC,SAAgB,aAAa;IAC3B,MAAM,aAAa,GAAG,IAAA,yBAAgB,GAAE,CAAC;IACzC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;KACpD;IACD,IAAI;QACF,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,UAAU,CAAC;KACvB;IAAC,OAAO,CAAC,EAAE;QACV,eAAM,CAAC,KAAK,CAAC,yCAAyC,IAAA,qBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAI,mBAAQ,CAAC,qCAAqC,EAAE;YACxD,KAAK,EAAE,aAAa,CAAC,SAAS,EAAE;SACjC,CAAC,CAAC;KACJ;AACH,CAAC;AAdD,sCAcC"}
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.microServiceHttpClient = exports.httpClient = void 0;
4
- const node_fetch_1 = require("node-fetch");
5
4
  const endpoints_1 = require("../endpoints");
6
5
  const infrastructure_1 = require("alwaysai/lib/infrastructure");
7
6
  const logger_1 = require("../util/logger");
7
+ const util_1 = require("alwaysai/lib/util");
8
8
  async function httpClient(url, method, headers, data) {
9
9
  const options = Object.assign({ method }, (data ? { body: data, headers } : { headers }));
10
10
  try {
11
- const response = await (0, node_fetch_1.default)(url, options);
11
+ const response = await fetch(url, options);
12
12
  const contentType = response.headers.get('content-type');
13
13
  if (contentType === 'application/json') {
14
14
  return await response.json();
@@ -18,7 +18,7 @@ async function httpClient(url, method, headers, data) {
18
18
  }
19
19
  }
20
20
  catch (e) {
21
- logger_1.logger.error(`HTTP Client error for ${url}: ${e.message}`);
21
+ logger_1.logger.error(`HTTP Client error for ${url}:\n${(0, util_1.stringifyError)(e)}`);
22
22
  }
23
23
  }
24
24
  exports.httpClient = httpClient;
@@ -1 +1 @@
1
- {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/util/http-client.ts"],"names":[],"mappings":";;;AAAA,2CAA+B;AAC/B,4CAAsD;AACtD,gEAAsE;AACtE,2CAAwC;AAEjC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,MAAc,EACd,OAAY,EACZ,IAAa;IAEb,MAAM,OAAO,mBACX,MAAM,IACH,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAClD,CAAC;IACF,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,WAAW,KAAK,kBAAkB,EAAE;YACtC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;QACD,IAAI,WAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;YACvC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;KACF;IAAC,OAAO,CAAC,EAAE;QACV,eAAM,CAAC,KAAK,CAAC,yBAAyB,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KAC5D;AACH,CAAC;AAtBD,gCAsBC;AAEM,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,IAAY,EACZ,MAAc,EACd,IAAa;IAEb,MAAM,QAAQ,GAAG,IAAA,kCAAsB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,EAAE,wBAAwB,EAAE,GAAG,IAAA,wCAAuB,GAAE,CAAC;IAC/D,MAAM,mBAAmB,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAC7D,OAAO,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAVD,wDAUC"}
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/util/http-client.ts"],"names":[],"mappings":";;;AAAA,4CAAsD;AACtD,gEAAsE;AACtE,2CAAwC;AACxC,4CAAmD;AAE5C,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,MAAc,EACd,OAAY,EACZ,IAAa;IAEb,MAAM,OAAO,mBACX,MAAM,IACH,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAClD,CAAC;IACF,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,WAAW,KAAK,kBAAkB,EAAE;YACtC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;QACD,IAAI,WAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;YACvC,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;KACF;IAAC,OAAO,CAAC,EAAE;QACV,eAAM,CAAC,KAAK,CAAC,yBAAyB,GAAG,MAAM,IAAA,qBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KACrE;AACH,CAAC;AAtBD,gCAsBC;AAEM,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,IAAY,EACZ,MAAc,EACd,IAAa;IAEb,MAAM,QAAQ,GAAG,IAAA,kCAAsB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,EAAE,wBAAwB,EAAE,GAAG,IAAA,wCAAuB,GAAE,CAAC;IAC/D,MAAM,mBAAmB,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAC7D,OAAO,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAVD,wDAUC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@alwaysai/device-agent",
3
3
  "description": "The alwaysAI Device Agent",
4
- "version": "1.5.0",
4
+ "version": "2.0.1",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
7
7
  "publishConfig": {
@@ -13,7 +13,7 @@
13
13
  },
14
14
  "engines": {
15
15
  "npm": ">=7.0.0",
16
- "node": ">=16.0.0"
16
+ "node": ">=18.0.0"
17
17
  },
18
18
  "scripts": {
19
19
  "build": "tsc --project tsconfig.build.json",
@@ -34,44 +34,46 @@
34
34
  "publish-provisioning:prod": "node ./scripts/publish-provisioning-scripts.js prod"
35
35
  },
36
36
  "dependencies": {
37
- "@alwaysai/alwayscli": "0.3.2",
38
- "@alwaysai/app-configuration-schemas": "0.1.0",
39
- "@alwaysai/config-nodejs": "0.3.0",
40
- "@alwaysai/device-agent-schemas": "2.3.3",
37
+ "@alwaysai/alwayscli": "0.3.3",
38
+ "@alwaysai/app-configuration-schemas": "0.2.0",
39
+ "@alwaysai/config-nodejs": "0.3.3",
40
+ "@alwaysai/device-agent-schemas": "3.3.0",
41
41
  "@carnesen/coded-error": "0.4.0",
42
42
  "ajv": "8.11.0",
43
- "alwaysai": "2.5.3",
43
+ "alwaysai": "2.6.1",
44
44
  "amqplib": "0.10.3",
45
- "aws-iot-device-sdk": "2.2.12",
46
- "docker-compose": "0.24.3",
45
+ "aws-iot-device-sdk": "2.2.15",
46
+ "docker-compose": "0.24.8",
47
47
  "lodash": "4.17.21",
48
- "node-fetch": "2.6.1",
49
48
  "node-os-utils": "1.3.7",
50
49
  "rimraf": "4.4.0",
50
+ "serialize-error": "8.1.0",
51
51
  "systeminformation": "5.21.13",
52
52
  "uuid": "9.0.0",
53
53
  "winston": "3.13.0",
54
54
  "winston-daily-rotate-file": "5.0.0",
55
- "yaml": "2.2.1"
55
+ "yaml": "2.5.0"
56
56
  },
57
57
  "devDependencies": {
58
- "@alwaysai/eslint-config": "0.1.0",
58
+ "@alwaysai/eslint-config": "0.1.3",
59
59
  "@alwaysai/tsconfig": "0.0.1",
60
60
  "@types/amqplib": "0.10.5",
61
61
  "@types/destroy": "1.0.0",
62
- "@types/jest": "28.1.2",
63
- "@types/node": "16.11.12",
62
+ "@types/jest": "29.1.2",
63
+ "@types/node": "18.11.9",
64
64
  "@types/node-os-utils": "^1.3.4",
65
+ "@types/rimraf": "3.0.2",
65
66
  "@types/sinon": "10.0.6",
67
+ "@types/tar": "6.1.2",
66
68
  "@typescript-eslint/eslint-plugin": "^5.48.0",
67
69
  "@typescript-eslint/parser": "^5.48.0",
68
- "aws-sdk": "^2.1046.0",
70
+ "aws-sdk": "^2.1663.0",
69
71
  "cp-cli": "2.0.0",
70
72
  "get-stream": "6.0.1",
71
- "jest": "28.1.1",
73
+ "jest": "29.7.0",
72
74
  "sinon": "12.0.1",
73
75
  "tempy": "0.7.1",
74
- "ts-jest": "28.0.5",
76
+ "ts-jest": "29.2.3",
75
77
  "ts-mock-imports": "1.3.8",
76
78
  "ts-node": "10.8.1",
77
79
  "typescript": "4.6.4"
package/readme.md CHANGED
@@ -28,7 +28,6 @@ change.
28
28
  - [Control the application](#control-the-application)
29
29
  - [Manage application models](#manage-application-models)
30
30
  - [Update models to new version of the same model ID](#update-models-to-new-version-of-the-same-model-id)
31
- - [Replace models for an application for new ID](#replace-models-for-an-application-for-new-id)
32
31
  - [Manually download a model package](#manually-download-a-model-package)
33
32
  - [Set and update environment variables](#set-and-update-environment-variables)
34
33
  - [Device Cleaning and Uninstalling](#device-cleaning-and-uninstalling)
@@ -86,15 +85,18 @@ Provisioning the device performs the following:
86
85
  Run the following command on the target device to provision it:
87
86
 
88
87
  ```bash
89
- $ curl -fsSL https://artifacts.alwaysai.co/device-agent/provision.sh | bash -s -- --email <email> --password <password> [--device-name <device_name>]
88
+ $ curl -fsSL https://artifacts.alwaysai.co/device-agent/provision.sh | bash -s -- --email <email> --password <password> [--device-name <device_name>] [--pm2-overwrite] [--agent-tag <agent_tag>]
90
89
  ```
91
90
 
92
- Where:
93
- * `email` is the email associated with your alwaysAI account.
94
- * `password` is the password for your alwaysAI account.
95
- * `device_name` is an optional device name, which will be displayed on the
96
- devices page of the alwaysAI Dashboard. If a device name is not provided, one
97
- will be generated for you and logged to the console for reference.
91
+
92
+ | Options | Details |
93
+ |:----------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
94
+ | --email | [REQUIRED] The email associated with your alwaysAI account. |
95
+ | --password | [REQUIRED] The password associated with your alwaysAI account |
96
+ | --device-name | [OPTIONAL] A device name to be associated with this device. It will be displayed on the devices page of the alwaysAI Dashboard. If a device name is not provided, one will be generated for you and logged to the console for reference. |
97
+ | --pm2-overwrite | [OPTIONAL] Overwrite any existing pm2 configuration with the latest provided by the script. The default behavior is to leave existing pm2 configurations as-is. |
98
+ | --agent-tag | [OPTIONAL] Select a specific release tag for the alwaysAI Device Agent. The default option is latest, which tracks the latest production release from alwaysAI. |
99
+
98
100
 
99
101
  **Important note**: If your password contains one or more special characters and you receive an error message that your password does not match your username but you are sure that it is correctly entered, please try preceding every special character in your password with a backslash, and re-running the provisioning command. You can also reset your password at https://console.alwaysai.co/dashboard by logging out, navigating to the sign in page, and clicking '`Forgot Password?`'.
100
102
 
@@ -303,7 +305,6 @@ Subcommands:
303
305
  app uninstall : Remove an alwaysAI app
304
306
  app show-models : Show the application models
305
307
  app add-model : Add a model to an alwaysAI app
306
- app remove-model : Remove a model from an alwaysAI app
307
308
  app get-all-envs : Get environment variables for an application
308
309
  app set-env : Set environment variables for a service
309
310
  app get-analytics-cfg : Get analytics configuration for an application
@@ -362,32 +363,11 @@ There are several ways to manage the models for your application.
362
363
  #### Update models to new version of the same model ID
363
364
 
364
365
  If a new version of a model is published for an existing model ID, and an
365
- application is already configured to be using that model ID, updating to the
366
+ application is already configured to be using that model ID, updating the
366
367
  new model can simply be done with:
367
368
 
368
369
  ```bash
369
- $ aai-agent app stop --project <project_id>
370
- $ aai-agent app update-models --project <project_id>
371
- $ aai-agent app start --project <project_id>
372
- ```
373
-
374
- #### Replace models for an application for new ID
375
-
376
- If you'd like to install an entirely new model to an application, replacing the
377
- model the app was originally configured with, run the following command:
378
-
379
- ```bash
380
- $ aai-agent app stop --project <project_id>
381
- $ aai-agent app replace-models --project <project_id> --models <model_id_1> [<model_id_2> ...]
382
- $ aai-agent app start --project <project_id>
383
- ```
384
-
385
- If you plan on using this method, you can make your application source model ID
386
- agnostic by providing the model ID to edgeIQ in the following way:
387
-
388
- Select the first model in the config list:
389
- ```python
390
- obj_detect = edgeiq.ObjectDetection(edgeiq._globals.MODEL_ID_LIST[0])
370
+ $ aai-agent app add-model --project <ProjectID> --model <ModelID> --version <ModelVersion>
391
371
  ```
392
372
 
393
373
  #### Manually download a model package
@@ -6,13 +6,14 @@ import {
6
6
  requireAppInstalled,
7
7
  requireAppReady
8
8
  } from './utils';
9
- import { JsSpawner } from 'alwaysai/lib/util';
9
+ import { JsSpawner, stringifyError } from 'alwaysai/lib/util';
10
10
  import { compose } from '../docker/docker-compose';
11
11
  import { assign, merge } from 'lodash';
12
12
  import { AppJsonFile } from 'alwaysai/lib/core/app';
13
13
  import { AppConfig } from '@alwaysai/app-configuration-schemas';
14
14
  import { isAppStarted, restartApp } from './status';
15
15
  import { logger } from '../util/logger';
16
+ import AaiError from '../util/aai-error';
16
17
 
17
18
  export async function readAppCfgFile(props: {
18
19
  projectId: string;
@@ -27,11 +28,9 @@ export async function readAppCfgFile(props: {
27
28
  try {
28
29
  return appJson.read();
29
30
  } catch (e) {
30
- throw new Error(
31
- `Error reading app config for ${projectId}:\n${
32
- e.message
33
- }\n${appJson.getErrors()}`
34
- );
31
+ throw new AaiError(`Error reading app config for ${projectId}`, {
32
+ cause: appJson.getErrors()
33
+ });
35
34
  }
36
35
  }
37
36
 
@@ -45,11 +44,9 @@ export async function writeAppCfgFile(props: {
45
44
  try {
46
45
  appJson.write(appCfg);
47
46
  } catch (e) {
48
- throw new Error(
49
- `Error writing app config for ${projectId}:\n${
50
- e.message
51
- }\n${appJson.getErrors()}`
52
- );
47
+ throw new AaiError(`Error writing app config for ${projectId}`, {
48
+ cause: appJson.getErrors()
49
+ });
53
50
  }
54
51
  }
55
52
 
@@ -124,7 +121,7 @@ export async function writeDockerCompose(props: {
124
121
  try {
125
122
  await compose.config({ cwd: appDir, configAsString: composeOutput });
126
123
  } catch (e) {
127
- logger.error(JSON.stringify(e));
124
+ logger.error(stringifyError(e));
128
125
  }
129
126
  await spawner.writeFile('docker-compose.yaml', composeOutput);
130
127
  }
@@ -91,6 +91,24 @@ describe('Test environment variable get and set', () => {
91
91
  edgeiq: { TEST3: '5', TEST4: '6' }
92
92
  });
93
93
  });
94
+ test('get all envs with one service and one cleared env', async () => {
95
+ const compose = {
96
+ services: {
97
+ alwaysai: {
98
+ environment: ['TEST=', 'TEST2=2']
99
+ }
100
+ }
101
+ };
102
+ jest.mocked(readDockerCompose).mockResolvedValue(compose);
103
+
104
+ const envVars = await getAllEnvs({ projectId: projectId1 });
105
+ expect(jest.mocked(readDockerCompose)).toBeCalledWith({
106
+ projectId: projectId1
107
+ });
108
+ expect(envVars).toEqual({
109
+ alwaysai: { TEST: '', TEST2: '2' }
110
+ });
111
+ });
94
112
  });
95
113
  describe('Test setEnv()', () => {
96
114
  test('Set one env', async () => {
@@ -126,7 +144,7 @@ describe('Test environment variable get and set', () => {
126
144
  };
127
145
  jest.mocked(readDockerCompose).mockResolvedValue(compose);
128
146
 
129
- const envVars = { alwaysai: { TEST1: '2' } };
147
+ const envVars = { alwaysai: { TEST1: '2', TEST2: '2' } };
130
148
  await setEnv({ projectId: projectId1, envVars });
131
149
  expect(jest.mocked(readDockerCompose)).toBeCalledWith({
132
150
  projectId: projectId1
@@ -152,7 +170,10 @@ describe('Test environment variable get and set', () => {
152
170
  };
153
171
  jest.mocked(readDockerCompose).mockResolvedValue(compose);
154
172
 
155
- const envVars = { alwaysai: { TEST1: '2' } };
173
+ const envVars = {
174
+ alwaysai: { TEST1: '2', TEST2: '4' },
175
+ other: { OTHER_TEST: '1' }
176
+ };
156
177
  await setEnv({ projectId: projectId1, envVars });
157
178
  expect(jest.mocked(readDockerCompose)).toBeCalledWith({
158
179
  projectId: projectId1
@@ -171,7 +192,7 @@ describe('Test environment variable get and set', () => {
171
192
  }
172
193
  });
173
194
  });
174
- test('Remove one env', async () => {
195
+ test('Unset an envvar', async () => {
175
196
  const environment = ['TEST1=1', 'TEST2=2'];
176
197
  const compose = {
177
198
  services: {
@@ -180,7 +201,7 @@ describe('Test environment variable get and set', () => {
180
201
  };
181
202
  jest.mocked(readDockerCompose).mockResolvedValue(compose);
182
203
 
183
- const envVars = { alwaysai: { TEST1: null } };
204
+ const envVars = { alwaysai: { TEST1: '', TEST2: '2' } };
184
205
  await setEnv({ projectId: projectId1, envVars });
185
206
  expect(jest.mocked(readDockerCompose)).toBeCalledWith({
186
207
  projectId: projectId1
@@ -190,7 +211,7 @@ describe('Test environment variable get and set', () => {
190
211
  dockerCompose: {
191
212
  services: {
192
213
  alwaysai: {
193
- environment: ['TEST2=2']
214
+ environment: ['TEST1=', 'TEST2=2']
194
215
  }
195
216
  }
196
217
  }
@@ -199,12 +220,12 @@ describe('Test environment variable get and set', () => {
199
220
  });
200
221
  describe('Test helpers', () => {
201
222
  test('convertStringEnvsToKeyVal', () => {
202
- const stringEnvs: string[] = ['TEST1=', 'TEST2=test2', 'TEST3=null'];
223
+ const stringEnvs: string[] = ['TEST1=', 'TEST2=test2', 'TEST3='];
203
224
  const envVars = convertStringEnvsToKeyVal(stringEnvs);
204
225
  expect(envVars).toEqual({
205
226
  TEST1: '',
206
227
  TEST2: 'test2',
207
- TEST3: 'null'
228
+ TEST3: ''
208
229
  });
209
230
  });
210
231
  });