@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,210 +1,98 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LiveUpdatesHandler = void 0;
4
- const device_agent_schemas_1 = require("@alwaysai/device-agent-schemas");
5
- const application_control_1 = require("../application-control");
3
+ exports.LiveUpdatesHandler = exports.DEFAULT_INTERVALS_MS = void 0;
6
4
  const logger_1 = require("../util/logger");
7
5
  const sleep_1 = require("../util/sleep");
8
- const messages_1 = require("./messages");
9
6
  const environment_1 = require("../environment");
10
- const LIVE_UPDATES_TIMEOUT = environment_1.ALWAYSAI_LIVE_UPDATES_TIMEOUT_MS
7
+ const util_1 = require("alwaysai/lib/util");
8
+ const KILL_ALL_TIMEOUT_MS = environment_1.ALWAYSAI_LIVE_UPDATES_TIMEOUT_MS
11
9
  ? parseInt(environment_1.ALWAYSAI_LIVE_UPDATES_TIMEOUT_MS)
12
10
  : 80000;
11
+ exports.DEFAULT_INTERVALS_MS = 5000;
13
12
  class LiveUpdatesHandler {
14
- /*=================================================================
15
- Public interface
16
- =================================================================*/
17
- constructor(publisher, clientId) {
18
- this.liveUpdatesAlive = {
19
- [device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats]: false,
20
- [device_agent_schemas_1.keyMirrors.toClientMessageType.app_state]: false,
21
- [device_agent_schemas_1.keyMirrors.toClientMessageType.app_logs]: false,
22
- [device_agent_schemas_1.keyMirrors.toClientMessageType.status_response]: false
23
- };
24
- this.liveUpdatesSleepIntervals = {
25
- [device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats]: 5000,
26
- [device_agent_schemas_1.keyMirrors.toClientMessageType.app_state]: 5000,
27
- [device_agent_schemas_1.keyMirrors.toClientMessageType.app_logs]: 5000,
28
- [device_agent_schemas_1.keyMirrors.toClientMessageType.status_response]: 5000
29
- };
30
- this.appLogStreams = new Set();
31
- this.transactionStatuses = new Set();
32
- this.publisher = publisher;
33
- this.clientId = clientId;
34
- logger_1.logger.debug(`Toggle live updates timeout set to ${LIVE_UPDATES_TIMEOUT} ms`);
13
+ constructor() {
14
+ this.livingIntervals = {};
15
+ this.livingStreams = new Set();
16
+ logger_1.logger.debug(`Toggle live updates timeout set to ${KILL_ALL_TIMEOUT_MS} ms`);
35
17
  }
36
- async getAppLogsWithRetry(projectId) {
37
- // Retry starting logs until it starts successfully or is terminated
38
- while (this.appLogStreams.has(projectId)) {
39
- try {
40
- return await (0, application_control_1.getAppLogs)({
41
- projectId,
42
- args: ['--tail', '100', '--no-log-prefix']
43
- });
44
- }
45
- catch (e) {
46
- logger_1.logger.info(`Failed to start app logs, retrying in 1 second. Error: ${e}`);
47
- await (0, sleep_1.default)(1000);
48
- }
49
- }
50
- // Case where logs were disabled prior to connecting
51
- return null;
18
+ async enable(intervalType, publishingFn, transactionId, options) {
19
+ this.restartKillAllTimeout();
20
+ const key = this.generateIntervalKey(intervalType, transactionId);
21
+ this.safeSetInterval(key, publishingFn, options);
22
+ await publishingFn();
52
23
  }
53
- async startAppLogStream(projectId, txId) {
24
+ disable(intervalType, transactionId) {
25
+ const key = this.generateIntervalKey(intervalType, transactionId);
26
+ clearInterval(this.livingIntervals[key]);
27
+ delete this.livingIntervals[key];
28
+ }
29
+ async startStream(projectId, streamGetter, publishingFn) {
54
30
  logger_1.logger.info(`Starting log stream for ${projectId}`);
55
- this.appLogStreams.add(projectId);
56
- const readable = await this.getAppLogsWithRetry(projectId);
31
+ this.livingStreams.add(projectId);
32
+ const readable = await this.getStreamWithRetry(projectId, streamGetter);
57
33
  if (readable === null) {
58
- logger_1.logger.info(`App log stream terminated for project ${projectId} prior to starting`);
34
+ logger_1.logger.info(`Stream terminated prior to starting. Readable stream is null. ProjectId: ${projectId}`);
59
35
  return;
60
36
  }
61
37
  readable.on('data', async (chunk) => {
62
- if (!this.appLogStreams.has(projectId)) {
38
+ if (!this.livingStreams.has(projectId)) {
63
39
  // why doesn't typescript know about this function?
64
40
  // @ts-ignore
65
41
  readable.destroy();
66
- logger_1.logger.info(`App log stream terminated for project ${projectId}`);
42
+ logger_1.logger.info(`Stream terminated. ProjectId: ${projectId}`);
67
43
  return;
68
44
  }
69
- const logStr = chunk.toString();
70
- const payload = {
71
- projectId,
72
- logChunk: logStr
73
- };
74
- const message = (0, device_agent_schemas_1.buildAppLogsMessage)(this.clientId, payload, txId);
75
- this.publisher.publishToClient(message, logger_1.logger.silly);
45
+ publishingFn(chunk.toString());
76
46
  });
77
47
  readable.on('error', (error) => {
78
- logger_1.logger.error(`App log stream terminated for project ${projectId}: ${error}`);
48
+ logger_1.logger.error(`Stream terminated. ProjectId: ${projectId} - ${error}`);
79
49
  });
80
50
  readable.on('finished', () => {
81
- logger_1.logger.info(`App logs finished piping for project ${projectId}`);
51
+ logger_1.logger.info(`Strean complete. ProjectId: ${projectId}`);
82
52
  });
83
53
  }
84
- continuePublishing(flag, txId) {
85
- switch (flag) {
86
- case device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats:
87
- case device_agent_schemas_1.keyMirrors.toClientMessageType.app_state:
88
- return this.liveUpdatesAlive[flag];
89
- case device_agent_schemas_1.keyMirrors.toClientMessageType.status_response: {
90
- if (!txId) {
91
- throw new Error(`Transaction ID not provided to continuePublishing!`);
92
- }
93
- return this.transactionStatuses.has(txId);
94
- }
95
- default:
96
- logger_1.logger.error(`Unrecognized publishable flag ${flag}`);
97
- return false;
98
- }
99
- }
100
- getLiveUpdatesInterval(flag) {
101
- const exists = this.liveUpdatesSleepIntervals[flag];
102
- if (exists) {
103
- return exists;
104
- }
105
- logger_1.logger.error(`Unrecognized live updates flag ${flag}`);
106
- return -1;
107
- }
108
- restartLiveUpdatesTimeout() {
109
- clearTimeout(this.liveUpdatesTimeout);
110
- this.liveUpdatesTimeout = setTimeout(() => {
111
- this.disableAppStateLiveUpdates();
112
- this.disableDeviceStatsLiveUpdates();
113
- this.appLogStreams.clear();
114
- }, LIVE_UPDATES_TIMEOUT);
54
+ stopStream(streamId) {
55
+ this.livingStreams.delete(streamId);
115
56
  }
116
- async startPublishingLiveUpdates(messageType, getMessage, txId) {
117
- logger_1.logger.info(`Turned on live updates for ${messageType}`);
118
- while (this.continuePublishing(messageType, txId)) {
57
+ /*=================================================================
58
+ Private interface
59
+ =================================================================*/
60
+ async getStreamWithRetry(streamId, streamGetter) {
61
+ // Retry starting logs until it starts successfully or is terminated
62
+ while (this.livingStreams.has(streamId)) {
119
63
  try {
120
- const message = await getMessage();
121
- this.publisher.publishToClient(message, logger_1.logger.silly);
122
- await (0, sleep_1.default)(this.getLiveUpdatesInterval(messageType));
64
+ return await streamGetter();
123
65
  }
124
66
  catch (e) {
125
- logger_1.logger.error(`Error publishing live updates for ${messageType}: ${e.message}`);
67
+ logger_1.logger.info(`Failed to start app logs, retrying in 1 second.\n${(0, util_1.stringifyError)(e)}`);
68
+ await (0, sleep_1.default)(1000);
126
69
  }
127
70
  }
128
- logger_1.logger.info(`Turned off live updates for ${messageType}`);
129
- }
130
- getDeviceStatsLiveUpdates() {
131
- return this.liveUpdatesAlive.device_stats;
132
- }
133
- disableDeviceStatsLiveUpdates() {
134
- logger_1.logger.info('Disabled live updates for device_stats');
135
- this.liveUpdatesAlive.device_stats = false;
136
- }
137
- getAppStateLiveUpdates() {
138
- return this.liveUpdatesAlive.app_state;
139
- }
140
- disableAppStateLiveUpdates() {
141
- logger_1.logger.info('Disabled live updates for app_state');
142
- this.liveUpdatesAlive.app_state = false;
143
- }
144
- getAppLogsLiveUpdates() {
145
- return this.liveUpdatesAlive.app_logs;
146
- }
147
- async enableTransactionStatus(props) {
148
- const { txId } = props;
149
- this.liveUpdatesAlive.status_response = true;
150
- if (!this.transactionStatuses.has(txId)) {
151
- this.transactionStatuses.add(txId);
152
- // Don't wait for this call to finish since it loops until disabled
153
- void this.startPublishingLiveUpdates(device_agent_schemas_1.keyMirrors.toClientMessageType.status_response, async () => {
154
- const payload = {
155
- status: device_agent_schemas_1.keyMirrors.statusResponse.in_progress
156
- };
157
- return (0, device_agent_schemas_1.buildToClientStatusResponseMessage)(this.clientId, payload, txId);
158
- }, txId);
159
- }
160
- }
161
- async disableTransactionStatus(props) {
162
- const { txId } = props;
163
- this.transactionStatuses.delete(txId);
164
- if (this.transactionStatuses.size === 0) {
165
- this.liveUpdatesAlive.status_response = false;
166
- }
71
+ // Case where logs were disabled prior to connecting
72
+ return null;
167
73
  }
168
- async handleToggles(toggles, txId) {
169
- const { deviceStats, appState, appLogs } = toggles;
170
- this.restartLiveUpdatesTimeout();
171
- const promises = [];
172
- if (deviceStats !== undefined) {
173
- const currentDeviceStats = this.getDeviceStatsLiveUpdates();
174
- this.liveUpdatesAlive.device_stats = deviceStats;
175
- if (deviceStats && currentDeviceStats !== true) {
176
- // Don't wait for this call to finish since it loops until disabled
177
- const deviceStatsPromise = this.startPublishingLiveUpdates(device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats, async () => {
178
- const payload = await (0, messages_1.getDeviceStatsPayload)();
179
- return (0, device_agent_schemas_1.buildDeviceStatsMessage)(this.clientId, payload, txId);
180
- }, txId);
181
- promises.push(deviceStatsPromise);
182
- }
183
- }
184
- if (appState !== undefined) {
185
- const currentAppState = this.getAppStateLiveUpdates();
186
- this.liveUpdatesAlive.app_state = appState;
187
- if (appState && currentAppState !== true) {
188
- // Don't wait for this call to finish since it loops until disabled
189
- const appStatePromise = this.startPublishingLiveUpdates(device_agent_schemas_1.keyMirrors.toClientMessageType.app_state, async () => {
190
- const payload = await (0, messages_1.getAppStatePayload)();
191
- return (0, device_agent_schemas_1.buildAppStateMessage)(this.clientId, payload, txId);
192
- }, txId);
193
- promises.push(appStatePromise);
194
- }
195
- }
196
- if (appLogs !== undefined) {
197
- const currentAppLogs = this.getAppLogsLiveUpdates();
198
- if (appLogs.toggle && currentAppLogs !== true) {
199
- // Don't wait for this call to finish since it loops until disabled
200
- const appLogPromise = this.startAppLogStream(appLogs.projectId, txId);
201
- promises.push(appLogPromise);
74
+ // do not await any functions in the setSafeInterval other than inside setInterval() as per EI-1694.
75
+ safeSetInterval(key, publishingFn, options) {
76
+ clearInterval(this.livingIntervals[key]);
77
+ this.livingIntervals[key] = setInterval(async () => {
78
+ try {
79
+ await publishingFn();
202
80
  }
203
- else {
204
- this.appLogStreams.delete(appLogs.projectId);
81
+ catch (e) {
82
+ logger_1.logger.error(`Error getting live updates: ${JSON.stringify(e)}: intervalKey: ${key}. Continuing...`);
205
83
  }
206
- }
207
- return promises;
84
+ }, (options === null || options === void 0 ? void 0 : options.ms) ? options.ms : exports.DEFAULT_INTERVALS_MS);
85
+ }
86
+ restartKillAllTimeout() {
87
+ clearTimeout(this.killAllTimeout);
88
+ this.killAllTimeout = setTimeout(() => {
89
+ Object.values(this.livingIntervals).forEach((interval) => clearInterval(interval));
90
+ this.livingIntervals = {};
91
+ this.livingStreams.clear();
92
+ }, KILL_ALL_TIMEOUT_MS);
93
+ }
94
+ generateIntervalKey(intervalType, transactionId) {
95
+ return intervalType + `${transactionId ? ':' + transactionId : ''}`;
208
96
  }
209
97
  }
210
98
  exports.LiveUpdatesHandler = LiveUpdatesHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"live-updates-handler.js","sourceRoot":"","sources":["../../src/cloud-connection/live-updates-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-updates-handler.js","sourceRoot":"","sources":["../../src/cloud-connection/live-updates-handler.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AACxC,yCAAkC;AAClC,gDAAkE;AAClE,4CAAmD;AAEnD,MAAM,mBAAmB,GAAG,8CAAgC;IAC1D,CAAC,CAAC,QAAQ,CAAC,8CAAgC,CAAC;IAC5C,CAAC,CAAC,KAAK,CAAC;AAEG,QAAA,oBAAoB,GAAG,IAAI,CAAC;AAMzC,MAAa,kBAAkB;IAK7B;QAHQ,oBAAe,GAAmD,EAAE,CAAC;QACrE,kBAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAGxC,eAAM,CAAC,KAAK,CACV,sCAAsC,mBAAmB,KAAK,CAC/D,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,MAAM,CACjB,YAAsC,EACtC,YAAiC,EACjC,aAAsB,EACtB,OAAyB;QAEzB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAElE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAEjD,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;IAEM,OAAO,CACZ,YAAsC,EACtC,aAAsB;QAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAClE,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,SAAiB,EACjB,YAAyD,EACzD,YAAwC;QAExC,eAAM,CAAC,IAAI,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAElC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAExE,IAAI,QAAQ,KAAK,IAAI,EAAE;YACrB,eAAM,CAAC,IAAI,CACT,4EAA4E,SAAS,EAAE,CACxF,CAAC;YACF,OAAO;SACR;QAED,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;YAC1C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBACtC,mDAAmD;gBACnD,aAAa;gBACb,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACnB,eAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;gBAC1D,OAAO;aACR;YAED,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7B,eAAM,CAAC,KAAK,CAAC,iCAAiC,SAAS,MAAM,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;YAC3B,eAAM,CAAC,IAAI,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,UAAU,CAAC,QAAgB;QAChC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;uEAEmE;IAE3D,KAAK,CAAC,kBAAkB,CAC9B,QAAgB,EAChB,YAAyD;QAEzD,oEAAoE;QACpE,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACvC,IAAI;gBACF,OAAO,MAAM,YAAY,EAAE,CAAC;aAC7B;YAAC,OAAO,CAAC,EAAE;gBACV,eAAM,CAAC,IAAI,CACT,oDAAoD,IAAA,qBAAc,EAChE,CAAC,CACF,EAAE,CACJ,CAAC;gBACF,MAAM,IAAA,eAAK,EAAC,IAAI,CAAC,CAAC;aACnB;SACF;QACD,oDAAoD;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qGAAqG;IAC7F,eAAe,CACrB,GAAW,EACX,YAAiC,EACjC,OAAyB;QAEzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,WAAW,CACrC,KAAK,IAAI,EAAE;YACT,IAAI;gBACF,MAAM,YAAY,EAAE,CAAC;aACtB;YAAC,OAAO,CAAC,EAAE;gBACV,eAAM,CAAC,KAAK,CACV,+BAA+B,IAAI,CAAC,SAAS,CAC3C,CAAC,CACF,kBAAkB,GAAG,iBAAiB,CACxC,CAAC;aACH;QACH,CAAC,EACD,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,EAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,4BAAoB,CAChD,CAAC;IACJ,CAAC;IAEO,qBAAqB;QAC3B,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvD,aAAa,CAAC,QAAQ,CAAC,CACxB,CAAC;YACF,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC1B,CAAC;IAEO,mBAAmB,CACzB,YAAsC,EACtC,aAAsB;QAEtB,OAAO,YAAY,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACtE,CAAC;CACF;AAhJD,gDAgJC"}
@@ -1,189 +1,95 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const live_updates_handler_1 = require("./live-updates-handler");
4
- const publisher_1 = require("./publisher");
5
- const sleep_1 = require("../util/sleep");
6
- const messages_1 = require("./messages");
4
+ const device_agent_schemas_1 = require("@alwaysai/device-agent-schemas");
5
+ const crypto_1 = require("crypto");
6
+ const stream_1 = require("stream");
7
7
  jest.mock('../util/sleep');
8
8
  jest.mock('./messages');
9
- jest.mocked(messages_1.getDeviceStatsPayload).mockResolvedValue({});
10
- global.setTimeout = jest.fn();
9
+ jest.useFakeTimers();
11
10
  // https://github.com/facebook/react-native/issues/35701
12
11
  Object.defineProperty(global, 'performance', {
13
12
  writable: true
14
13
  });
15
- const testTrueToggles = {
16
- deviceStats: true,
17
- appState: true
18
- };
19
- const testFalseToggles = {
20
- deviceStats: false,
21
- appState: false
22
- };
23
- const mockClient = {
24
- publish: jest.fn()
25
- };
26
- const clientId = 'test-client';
27
- const emptyTxId = '';
14
+ const mockTransactionId = '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d';
15
+ const mockProjectId = '12345678-abcd-abcd-abcd-0123456789ab';
28
16
  describe('Test Live Updates Handler', () => {
29
17
  let liveUpdatesHandler;
30
- let publisher;
31
18
  beforeEach(() => {
32
- mockClient.publish = jest.fn();
33
- jest.mocked(sleep_1.default).mockImplementation(async () => {
34
- return;
35
- });
36
- publisher = new publisher_1.Publisher(mockClient, clientId);
37
- liveUpdatesHandler = new live_updates_handler_1.LiveUpdatesHandler(publisher, clientId);
19
+ liveUpdatesHandler = new live_updates_handler_1.LiveUpdatesHandler();
38
20
  jest.clearAllMocks();
39
21
  });
40
- test('enable device stats', async () => {
41
- mockClient.publish = jest.fn().mockImplementation(async () => {
42
- liveUpdatesHandler.disableDeviceStatsLiveUpdates();
43
- });
44
- const enable = { deviceStats: true };
45
- const promises = await liveUpdatesHandler.handleToggles(enable, emptyTxId);
46
- await Promise.all(promises);
47
- expect(jest.mocked(setTimeout)).toBeCalledTimes(1);
48
- expect(mockClient.publish).toBeCalledTimes(1);
49
- expect(jest.mocked(sleep_1.default)).toBeCalledTimes(1);
22
+ test('enable interval', async () => {
23
+ const mockPublishingFn = jest.fn();
24
+ const mockClearInterval = jest.spyOn(global, 'clearInterval');
25
+ const mockSetInterval = jest.spyOn(global, 'setInterval');
26
+ await liveUpdatesHandler.enable(device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats, mockPublishingFn);
27
+ jest.advanceTimersByTime(live_updates_handler_1.DEFAULT_INTERVALS_MS);
28
+ expect(mockPublishingFn).toBeCalledTimes(2);
29
+ expect(mockClearInterval).toBeCalledWith(undefined);
30
+ expect(mockSetInterval).toBeCalledTimes(1);
50
31
  });
51
- test('enable app state', async () => {
52
- mockClient.publish = jest.fn().mockImplementation(async () => {
53
- liveUpdatesHandler.disableAppStateLiveUpdates();
54
- });
55
- const enable = { appState: true };
56
- const promises = await liveUpdatesHandler.handleToggles(enable, emptyTxId);
57
- await Promise.all(promises);
58
- expect(jest.mocked(setTimeout)).toBeCalledTimes(1);
59
- expect(mockClient.publish).toBeCalledTimes(1);
60
- expect(jest.mocked(sleep_1.default)).toBeCalledTimes(1);
61
- });
62
- test('ignore subsequent enables', async () => {
63
- // Block on the first sleep call
64
- let doneWaiting;
65
- const waitPromise = new Promise(function (resolve) {
66
- doneWaiting = resolve;
67
- });
68
- let startSleeping;
69
- const sleepPromise = new Promise(function (resolve) {
70
- startSleeping = resolve;
71
- });
72
- jest.mocked(sleep_1.default).mockImplementation(async () => {
73
- startSleeping();
74
- await waitPromise;
75
- });
76
- const enable = { deviceStats: true };
77
- await liveUpdatesHandler.handleToggles(enable, emptyTxId);
78
- await sleepPromise;
79
- expect(jest.mocked(setTimeout)).toBeCalledTimes(1);
80
- expect(mockClient.publish).toBeCalledTimes(1);
81
- expect(jest.mocked(sleep_1.default)).toBeCalledTimes(1);
82
- // Second call
83
- jest.clearAllMocks();
84
- await liveUpdatesHandler.handleToggles(enable, emptyTxId);
85
- expect(jest.mocked(setTimeout)).toHaveBeenCalledTimes(1);
86
- expect(mockClient.publish).toBeCalledTimes(0);
87
- expect(jest.mocked(sleep_1.default)).toBeCalledTimes(0);
88
- // Disable and clean up
89
- liveUpdatesHandler.disableDeviceStatsLiveUpdates();
90
- doneWaiting();
32
+ test('subsequent enable resets interval with no duplicates', async () => {
33
+ const mockPublishingFn = jest.fn();
34
+ const mockSetInterval = jest.spyOn(global, 'setInterval');
35
+ const mockClearInterval = jest.spyOn(global, 'clearInterval');
36
+ await liveUpdatesHandler.enable(device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats, mockPublishingFn, mockTransactionId);
37
+ await liveUpdatesHandler.enable(device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats, mockPublishingFn, mockTransactionId);
38
+ jest.advanceTimersByTime(live_updates_handler_1.DEFAULT_INTERVALS_MS);
39
+ expect(mockClearInterval.mock.calls[0][0]).toEqual(undefined);
40
+ expect(mockClearInterval.mock.calls[1][0]).toEqual(mockSetInterval.mock.results[0].value);
41
+ expect(mockSetInterval).toBeCalledTimes(2);
42
+ expect(mockPublishingFn).toBeCalledTimes(3);
91
43
  });
92
44
  test('test disable live updates', async () => {
93
- let doneWaiting;
94
- const waitPromise = new Promise(function (resolve) {
95
- doneWaiting = resolve;
96
- });
97
- let startSleeping;
98
- const sleepPromise = new Promise(function (resolve) {
99
- startSleeping = resolve;
100
- });
101
- // Wait for two sleep calls, one for Device Stats and one for App State
102
- jest
103
- .mocked(sleep_1.default)
104
- .mockImplementationOnce(async () => {
105
- await waitPromise;
106
- })
107
- .mockImplementationOnce(async () => {
108
- startSleeping();
109
- await waitPromise;
110
- });
111
- // Test calling handleToggles one time, enabling it
112
- await liveUpdatesHandler.handleToggles(testTrueToggles, emptyTxId);
113
- await sleepPromise;
114
- expect(jest.mocked(setTimeout)).toHaveBeenCalledTimes(1);
115
- expect(jest.mocked(sleep_1.default)).toBeCalledTimes(2);
116
- expect(liveUpdatesHandler.getDeviceStatsLiveUpdates()).toBe(true);
117
- expect(liveUpdatesHandler.getAppStateLiveUpdates()).toBe(true);
118
- expect(liveUpdatesHandler.getAppLogsLiveUpdates()).toBe(false);
119
- // Check to see that attributes are properly set to false when disabled
120
- jest.clearAllMocks();
121
- await liveUpdatesHandler.handleToggles(testFalseToggles, emptyTxId);
122
- expect(jest.mocked(setTimeout)).toHaveBeenCalledTimes(1);
123
- expect(jest.mocked(sleep_1.default)).toBeCalledTimes(0);
124
- expect(liveUpdatesHandler.getDeviceStatsLiveUpdates()).toBe(false);
125
- expect(liveUpdatesHandler.getAppStateLiveUpdates()).toBe(false);
126
- expect(liveUpdatesHandler.getAppLogsLiveUpdates()).toBe(false);
127
- doneWaiting();
45
+ const mockSetInterval = jest.spyOn(global, 'setInterval');
46
+ const mockClearInterval = jest.spyOn(global, 'clearInterval');
47
+ await liveUpdatesHandler.enable(device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats, async () => undefined, mockTransactionId);
48
+ liveUpdatesHandler.disable(device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats, mockTransactionId);
49
+ expect(mockClearInterval).toHaveBeenLastCalledWith(mockSetInterval.mock.results[0].value);
128
50
  });
129
- test('timeout turns off live updates', async () => {
130
- jest.useFakeTimers({ legacyFakeTimers: true });
131
- let doneWaiting;
132
- const waitPromise = new Promise(function (resolve) {
133
- doneWaiting = resolve;
134
- });
135
- let startSleeping;
136
- const sleepPromise = new Promise(function (resolve) {
137
- startSleeping = resolve;
138
- });
139
- // Wait for two sleep calls, one for Device Stats and one for App State
140
- jest
141
- .mocked(sleep_1.default)
142
- .mockImplementationOnce(async () => {
143
- await waitPromise;
144
- })
145
- .mockImplementationOnce(async () => {
146
- startSleeping();
147
- await waitPromise;
148
- });
149
- await liveUpdatesHandler.handleToggles(testTrueToggles, emptyTxId);
150
- await sleepPromise;
151
- expect(liveUpdatesHandler.getDeviceStatsLiveUpdates()).toBe(true);
152
- expect(liveUpdatesHandler.getAppStateLiveUpdates()).toBe(true);
153
- expect(liveUpdatesHandler.getAppLogsLiveUpdates()).toBe(false);
51
+ test('kill all timeout turns off all live updates', async () => {
52
+ const mockPublishingFn = jest.fn();
53
+ const mockSetInterval = jest.spyOn(global, 'setInterval');
54
+ const mockClearInterval = jest.spyOn(global, 'clearInterval');
55
+ jest.spyOn(global, 'setTimeout');
56
+ const numLivingIntervals = 5;
57
+ for (let i = 0; i < numLivingIntervals; i++) {
58
+ await liveUpdatesHandler.enable(device_agent_schemas_1.keyMirrors.toClientMessageType.status_response, mockPublishingFn, (0, crypto_1.randomUUID)());
59
+ }
60
+ mockSetInterval.mock.results.forEach((result) => clearInterval(result.value));
154
61
  jest.runAllTimers();
155
- expect(liveUpdatesHandler.getDeviceStatsLiveUpdates()).toBe(false);
156
- expect(liveUpdatesHandler.getAppStateLiveUpdates()).toBe(false);
157
- expect(liveUpdatesHandler.getAppLogsLiveUpdates()).toBe(false);
158
- doneWaiting();
62
+ expect(mockPublishingFn).toBeCalledTimes(numLivingIntervals);
63
+ expect(mockSetInterval).toBeCalledTimes(numLivingIntervals);
64
+ for (let i = 0; i < numLivingIntervals; i++) {
65
+ expect(mockClearInterval).toHaveBeenCalledWith(mockSetInterval.mock.results[i].value);
66
+ }
159
67
  });
160
- test("failure doesn't kill publish loop", async () => {
161
- // Block on the first sleep call
162
- let doneWaiting;
163
- const waitPromise = new Promise(function (resolve) {
164
- doneWaiting = resolve;
165
- });
166
- let startSleeping;
167
- const sleepPromise = new Promise(function (resolve) {
168
- startSleeping = resolve;
169
- });
170
- jest
171
- .mocked(sleep_1.default)
172
- .mockImplementationOnce(async () => {
173
- throw new Error('Test error!');
174
- })
175
- .mockImplementationOnce(async () => {
176
- startSleeping();
177
- await waitPromise;
68
+ test('startStream streams data to publish', async () => {
69
+ const mockStream = new stream_1.PassThrough();
70
+ const mockPublishingFn = jest
71
+ .fn()
72
+ .mockImplementation((logChunk) => undefined);
73
+ await liveUpdatesHandler.startStream(mockProjectId, async () => mockStream, mockPublishingFn);
74
+ const data = 'Data for stream';
75
+ mockStream.emit('data', data);
76
+ expect(mockPublishingFn).toBeCalledWith(data);
77
+ mockStream.end();
78
+ mockStream.destroy();
79
+ });
80
+ test('failure does not disable interval', async () => {
81
+ const mockPublishingFn = jest
82
+ .fn()
83
+ .mockImplementationOnce(() => undefined)
84
+ .mockImplementation(() => {
85
+ throw new Error('Manual throw for unit test');
178
86
  });
179
- const enable = { deviceStats: true };
180
- await liveUpdatesHandler.handleToggles(enable, emptyTxId);
181
- await sleepPromise;
182
- expect(jest.mocked(setTimeout)).toBeCalledTimes(1);
183
- expect(mockClient.publish).toBeCalledTimes(2);
184
- expect(jest.mocked(sleep_1.default)).toBeCalledTimes(2);
185
- liveUpdatesHandler.disableDeviceStatsLiveUpdates();
186
- doneWaiting();
87
+ jest.spyOn(global, 'setInterval');
88
+ const mockClearInterval = jest.spyOn(global, 'clearInterval');
89
+ await liveUpdatesHandler.enable(device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats, mockPublishingFn, mockTransactionId);
90
+ jest.advanceTimersByTime(live_updates_handler_1.DEFAULT_INTERVALS_MS);
91
+ expect(mockClearInterval).toBeCalledTimes(1);
92
+ expect(mockPublishingFn).toBeCalledTimes(2);
187
93
  });
188
94
  });
189
95
  //# sourceMappingURL=live-updates-handler.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"live-updates-handler.test.js","sourceRoot":"","sources":["../../src/cloud-connection/live-updates-handler.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-updates-handler.test.js","sourceRoot":"","sources":["../../src/cloud-connection/live-updates-handler.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface MessageHandler<T = any> {
2
+ handle(payload: T, topic?: string): void;
3
+ }
4
+ export declare class MessageDispatcher<T = any> {
5
+ private handlers;
6
+ registerHandler(topic: string, handler: MessageHandler): void;
7
+ dispatch(topic: string, payload: T): void;
8
+ private handleUnknownMessage;
9
+ }
10
+ //# sourceMappingURL=message-dispatcher.d.ts.map