@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.
- package/lib/application-control/config.d.ts.map +1 -1
- package/lib/application-control/config.js +8 -3
- package/lib/application-control/config.js.map +1 -1
- package/lib/application-control/environment-variables.d.ts +5 -5
- package/lib/application-control/environment-variables.d.ts.map +1 -1
- package/lib/application-control/environment-variables.js +25 -38
- package/lib/application-control/environment-variables.js.map +1 -1
- package/lib/application-control/environment-variables.test.js +27 -7
- package/lib/application-control/environment-variables.test.js.map +1 -1
- package/lib/application-control/index.d.ts +4 -4
- package/lib/application-control/index.d.ts.map +1 -1
- package/lib/application-control/index.js +1 -4
- package/lib/application-control/index.js.map +1 -1
- package/lib/application-control/install.d.ts +4 -1
- package/lib/application-control/install.d.ts.map +1 -1
- package/lib/application-control/install.js +24 -8
- package/lib/application-control/install.js.map +1 -1
- package/lib/application-control/models.d.ts +0 -11
- package/lib/application-control/models.d.ts.map +1 -1
- package/lib/application-control/models.js +5 -54
- package/lib/application-control/models.js.map +1 -1
- package/lib/application-control/utils.d.ts +0 -4
- package/lib/application-control/utils.d.ts.map +1 -1
- package/lib/application-control/utils.js +12 -22
- package/lib/application-control/utils.js.map +1 -1
- package/lib/cloud-connection/base-message-handler.d.ts +27 -0
- package/lib/cloud-connection/base-message-handler.d.ts.map +1 -0
- package/lib/cloud-connection/base-message-handler.js +72 -0
- package/lib/cloud-connection/base-message-handler.js.map +1 -0
- package/lib/cloud-connection/bootstrap-provision.js +3 -2
- package/lib/cloud-connection/bootstrap-provision.js.map +1 -1
- package/lib/cloud-connection/connection-manager.d.ts +21 -0
- package/lib/cloud-connection/connection-manager.d.ts.map +1 -0
- package/lib/cloud-connection/connection-manager.js +158 -0
- package/lib/cloud-connection/connection-manager.js.map +1 -0
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +9 -30
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +69 -508
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/cloud-connection/device-agent-message-handler.d.ts +22 -0
- package/lib/cloud-connection/device-agent-message-handler.d.ts.map +1 -0
- package/lib/cloud-connection/device-agent-message-handler.js +357 -0
- package/lib/cloud-connection/device-agent-message-handler.js.map +1 -0
- package/lib/cloud-connection/device-agent.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent.js +11 -9
- package/lib/cloud-connection/device-agent.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.d.ts +19 -28
- package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
- package/lib/cloud-connection/live-updates-handler.js +60 -172
- package/lib/cloud-connection/live-updates-handler.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.test.js +71 -165
- package/lib/cloud-connection/live-updates-handler.test.js.map +1 -1
- package/lib/cloud-connection/message-dispatcher.d.ts +10 -0
- package/lib/cloud-connection/message-dispatcher.d.ts.map +1 -0
- package/lib/cloud-connection/message-dispatcher.js +27 -0
- package/lib/cloud-connection/message-dispatcher.js.map +1 -0
- package/lib/cloud-connection/passthrough-handler.d.ts +4 -1
- package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -1
- package/lib/cloud-connection/passthrough-handler.js +30 -11
- package/lib/cloud-connection/passthrough-handler.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.d.ts +11 -3
- package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
- package/lib/cloud-connection/shadow-handler.js +133 -28
- package/lib/cloud-connection/shadow-handler.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.test.js +45 -57
- package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
- package/lib/cloud-connection/shadow.d.ts.map +1 -1
- package/lib/cloud-connection/shadow.js +2 -1
- package/lib/cloud-connection/shadow.js.map +1 -1
- package/lib/cloud-connection/transaction-manager.d.ts +12 -3
- package/lib/cloud-connection/transaction-manager.d.ts.map +1 -1
- package/lib/cloud-connection/transaction-manager.js +29 -28
- package/lib/cloud-connection/transaction-manager.js.map +1 -1
- package/lib/cloud-connection/transaction-manager.test.js +46 -5
- package/lib/cloud-connection/transaction-manager.test.js.map +1 -1
- package/lib/device-control/device-control.d.ts +8 -8
- package/lib/device-control/device-control.d.ts.map +1 -1
- package/lib/device-control/device-control.js +95 -71
- package/lib/device-control/device-control.js.map +1 -1
- package/lib/docker/docker-compose.d.ts.map +1 -1
- package/lib/docker/docker-compose.js +2 -1
- package/lib/docker/docker-compose.js.map +1 -1
- package/lib/infrastructure/agent-config.d.ts +2 -1
- package/lib/infrastructure/agent-config.d.ts.map +1 -1
- package/lib/infrastructure/agent-config.js +7 -7
- package/lib/infrastructure/agent-config.js.map +1 -1
- package/lib/infrastructure/agent-config.test.js +3 -1
- package/lib/infrastructure/agent-config.test.js.map +1 -1
- package/lib/infrastructure/config-check-utility.d.ts +6 -0
- package/lib/infrastructure/config-check-utility.d.ts.map +1 -0
- package/lib/infrastructure/config-check-utility.js +67 -0
- package/lib/infrastructure/config-check-utility.js.map +1 -0
- package/lib/infrastructure/config-check-utility.test.d.ts +2 -0
- package/lib/infrastructure/config-check-utility.test.d.ts.map +1 -0
- package/lib/infrastructure/config-check-utility.test.js +109 -0
- package/lib/infrastructure/config-check-utility.test.js.map +1 -0
- package/lib/infrastructure/device-certificate.d.ts +10 -0
- package/lib/infrastructure/device-certificate.d.ts.map +1 -0
- package/lib/infrastructure/device-certificate.js +47 -0
- package/lib/infrastructure/device-certificate.js.map +1 -0
- package/lib/infrastructure/device-certificate.test.d.ts +2 -0
- package/lib/infrastructure/device-certificate.test.d.ts.map +1 -0
- package/lib/infrastructure/device-certificate.test.js +24 -0
- package/lib/infrastructure/device-certificate.test.js.map +1 -0
- package/lib/infrastructure/legacy-migration/legacy-file.test.d.ts +2 -0
- package/lib/infrastructure/legacy-migration/legacy-file.test.d.ts.map +1 -0
- package/lib/infrastructure/legacy-migration/legacy-file.test.js +61 -0
- package/lib/infrastructure/legacy-migration/legacy-file.test.js.map +1 -0
- package/lib/infrastructure/legacy-migration/legacy-files.d.ts +75 -0
- package/lib/infrastructure/legacy-migration/legacy-files.d.ts.map +1 -0
- package/lib/infrastructure/legacy-migration/legacy-files.js +75 -0
- package/lib/infrastructure/legacy-migration/legacy-files.js.map +1 -0
- package/lib/infrastructure/legacy-migration/legacy-migration.d.ts +6 -0
- package/lib/infrastructure/legacy-migration/legacy-migration.d.ts.map +1 -0
- package/lib/infrastructure/legacy-migration/legacy-migration.js +149 -0
- package/lib/infrastructure/legacy-migration/legacy-migration.js.map +1 -0
- package/lib/infrastructure/legacy-migration/legacy-migration.test.d.ts +2 -0
- package/lib/infrastructure/legacy-migration/legacy-migration.test.d.ts.map +1 -0
- package/lib/infrastructure/legacy-migration/legacy-migration.test.js +226 -0
- package/lib/infrastructure/legacy-migration/legacy-migration.test.js.map +1 -0
- package/lib/infrastructure/require-files-present-ready.test.d.ts +2 -0
- package/lib/infrastructure/require-files-present-ready.test.d.ts.map +1 -0
- package/lib/infrastructure/require-files-present-ready.test.js +44 -0
- package/lib/infrastructure/require-files-present-ready.test.js.map +1 -0
- package/lib/infrastructure/required-config-checks.d.ts +2 -0
- package/lib/infrastructure/required-config-checks.d.ts.map +1 -0
- package/lib/infrastructure/required-config-checks.js +30 -0
- package/lib/infrastructure/required-config-checks.js.map +1 -0
- package/lib/infrastructure/tokens-and-device-cfg.d.ts.map +1 -1
- package/lib/infrastructure/tokens-and-device-cfg.js +11 -8
- package/lib/infrastructure/tokens-and-device-cfg.js.map +1 -1
- package/lib/jobs/job-handler.d.ts +23 -0
- package/lib/jobs/job-handler.d.ts.map +1 -0
- package/lib/jobs/job-handler.js +131 -0
- package/lib/jobs/job-handler.js.map +1 -0
- package/lib/local-connection/rabbitmq-connection.d.ts.map +1 -1
- package/lib/local-connection/rabbitmq-connection.js +14 -14
- package/lib/local-connection/rabbitmq-connection.js.map +1 -1
- package/lib/secure-tunneling/secure-tunnel-message-handler.d.ts +8 -0
- package/lib/secure-tunneling/secure-tunnel-message-handler.d.ts.map +1 -0
- package/lib/secure-tunneling/secure-tunnel-message-handler.js +42 -0
- package/lib/secure-tunneling/secure-tunnel-message-handler.js.map +1 -0
- package/lib/secure-tunneling/secure-tunneling.d.ts +9 -9
- package/lib/secure-tunneling/secure-tunneling.d.ts.map +1 -1
- package/lib/secure-tunneling/secure-tunneling.js +21 -16
- package/lib/secure-tunneling/secure-tunneling.js.map +1 -1
- package/lib/secure-tunneling/secure-tunneling.test.js +11 -13
- package/lib/secure-tunneling/secure-tunneling.test.js.map +1 -1
- package/lib/subcommands/app/analytics.d.ts.map +1 -1
- package/lib/subcommands/app/analytics.js +1 -2
- package/lib/subcommands/app/analytics.js.map +1 -1
- package/lib/subcommands/app/env-vars.d.ts +4 -0
- package/lib/subcommands/app/env-vars.d.ts.map +1 -1
- package/lib/subcommands/app/env-vars.js +52 -6
- package/lib/subcommands/app/env-vars.js.map +1 -1
- package/lib/subcommands/app/index.d.ts.map +1 -1
- package/lib/subcommands/app/index.js +1 -3
- package/lib/subcommands/app/index.js.map +1 -1
- package/lib/subcommands/app/models.d.ts +0 -11
- package/lib/subcommands/app/models.d.ts.map +1 -1
- package/lib/subcommands/app/models.js +2 -58
- package/lib/subcommands/app/models.js.map +1 -1
- package/lib/subcommands/app/shadow.d.ts.map +1 -1
- package/lib/subcommands/app/shadow.js +6 -5
- package/lib/subcommands/app/shadow.js.map +1 -1
- package/lib/subcommands/app/version.d.ts +2 -0
- package/lib/subcommands/app/version.d.ts.map +1 -1
- package/lib/subcommands/app/version.js +16 -6
- package/lib/subcommands/app/version.js.map +1 -1
- package/lib/subcommands/config.d.ts +2 -0
- package/lib/subcommands/config.d.ts.map +1 -0
- package/lib/subcommands/config.js +39 -0
- package/lib/subcommands/config.js.map +1 -0
- package/lib/subcommands/device/clean.d.ts +1 -1
- package/lib/subcommands/device/clean.d.ts.map +1 -1
- package/lib/subcommands/device/clean.js +23 -13
- package/lib/subcommands/device/clean.js.map +1 -1
- package/lib/subcommands/device/index.d.ts.map +1 -1
- package/lib/subcommands/device/index.js +3 -1
- package/lib/subcommands/device/index.js.map +1 -1
- package/lib/subcommands/device/init.js +8 -8
- package/lib/subcommands/device/init.js.map +1 -1
- package/lib/subcommands/device/migrate.d.ts +2 -0
- package/lib/subcommands/device/migrate.d.ts.map +1 -0
- package/lib/subcommands/device/migrate.js +24 -0
- package/lib/subcommands/device/migrate.js.map +1 -0
- package/lib/subcommands/device/refresh.d.ts.map +1 -1
- package/lib/subcommands/device/refresh.js +1 -0
- package/lib/subcommands/device/refresh.js.map +1 -1
- package/lib/subcommands/index.d.ts +1 -1
- package/lib/subcommands/index.d.ts.map +1 -1
- package/lib/subcommands/index.js +3 -1
- package/lib/subcommands/index.js.map +1 -1
- package/lib/subcommands/rabbitmq-connection.d.ts +1 -1
- package/lib/subcommands/rabbitmq-connection.d.ts.map +1 -1
- package/lib/util/aai-error.d.ts +12 -0
- package/lib/util/aai-error.d.ts.map +1 -0
- package/lib/util/aai-error.js +11 -0
- package/lib/util/aai-error.js.map +1 -0
- package/lib/util/aws-regions.d.ts +2 -0
- package/lib/util/aws-regions.d.ts.map +1 -0
- package/lib/util/{cloud-mode-ready.js → aws-regions.js} +2 -20
- package/lib/util/aws-regions.js.map +1 -0
- package/lib/util/check-for-updates.d.ts.map +1 -1
- package/lib/util/check-for-updates.js +5 -28
- package/lib/util/check-for-updates.js.map +1 -1
- package/lib/util/clean-certs.d.ts.map +1 -1
- package/lib/util/clean-certs.js +5 -4
- package/lib/util/clean-certs.js.map +1 -1
- package/lib/util/directories.d.ts +4 -18
- package/lib/util/directories.d.ts.map +1 -1
- package/lib/util/directories.js +18 -32
- package/lib/util/directories.js.map +1 -1
- package/lib/util/file.d.ts +4 -0
- package/lib/util/file.d.ts.map +1 -1
- package/lib/util/file.js +65 -4
- package/lib/util/file.js.map +1 -1
- package/lib/util/get-device-id.d.ts.map +1 -1
- package/lib/util/get-device-id.js +7 -1
- package/lib/util/get-device-id.js.map +1 -1
- package/lib/util/http-client.js +3 -3
- package/lib/util/http-client.js.map +1 -1
- package/package.json +19 -17
- package/readme.md +12 -32
- package/src/application-control/config.ts +9 -12
- package/src/application-control/environment-variables.test.ts +28 -7
- package/src/application-control/environment-variables.ts +42 -59
- package/src/application-control/index.ts +3 -16
- package/src/application-control/install.ts +39 -13
- package/src/application-control/models.ts +6 -87
- package/src/application-control/utils.ts +10 -25
- package/src/cloud-connection/base-message-handler.ts +118 -0
- package/src/cloud-connection/bootstrap-provision.ts +7 -7
- package/src/cloud-connection/connection-manager.ts +187 -0
- package/src/cloud-connection/device-agent-cloud-connection.ts +130 -723
- package/src/cloud-connection/device-agent-message-handler.ts +642 -0
- package/src/cloud-connection/device-agent.ts +16 -7
- package/src/cloud-connection/live-updates-handler.test.ts +121 -189
- package/src/cloud-connection/live-updates-handler.ts +105 -232
- package/src/cloud-connection/message-dispatcher.ts +33 -0
- package/src/cloud-connection/passthrough-handler.ts +55 -18
- package/src/cloud-connection/shadow-handler.test.ts +45 -57
- package/src/cloud-connection/shadow-handler.ts +224 -54
- package/src/cloud-connection/shadow.ts +4 -1
- package/src/cloud-connection/transaction-manager.test.ts +68 -6
- package/src/cloud-connection/transaction-manager.ts +69 -41
- package/src/device-control/device-control.ts +102 -70
- package/src/docker/docker-compose.ts +3 -2
- package/src/infrastructure/agent-config.test.ts +6 -2
- package/src/infrastructure/agent-config.ts +8 -7
- package/src/infrastructure/config-check-utility.test.ts +154 -0
- package/src/infrastructure/config-check-utility.ts +77 -0
- package/src/infrastructure/device-certificate.test.ts +40 -0
- package/src/infrastructure/device-certificate.ts +58 -0
- package/src/infrastructure/legacy-migration/legacy-file.test.ts +88 -0
- package/src/infrastructure/legacy-migration/legacy-files.ts +101 -0
- package/src/infrastructure/legacy-migration/legacy-migration.test.ts +396 -0
- package/src/infrastructure/legacy-migration/legacy-migration.ts +229 -0
- package/src/infrastructure/require-files-present-ready.test.ts +53 -0
- package/src/infrastructure/required-config-checks.ts +33 -0
- package/src/infrastructure/tokens-and-device-cfg.ts +12 -10
- package/src/jobs/job-handler.ts +146 -0
- package/src/local-connection/rabbitmq-connection.ts +22 -17
- package/src/secure-tunneling/secure-tunnel-message-handler.ts +56 -0
- package/src/secure-tunneling/secure-tunneling.test.ts +20 -22
- package/src/secure-tunneling/secure-tunneling.ts +41 -29
- package/src/subcommands/app/analytics.ts +2 -4
- package/src/subcommands/app/env-vars.ts +72 -9
- package/src/subcommands/app/index.ts +3 -11
- package/src/subcommands/app/models.ts +5 -81
- package/src/subcommands/app/shadow.ts +6 -5
- package/src/subcommands/app/version.ts +23 -6
- package/src/subcommands/config.ts +42 -0
- package/src/subcommands/device/clean.ts +31 -17
- package/src/subcommands/device/index.ts +3 -1
- package/src/subcommands/device/init.ts +11 -11
- package/src/subcommands/device/migrate.ts +20 -0
- package/src/subcommands/device/refresh.ts +1 -0
- package/src/subcommands/index.ts +3 -1
- package/src/util/aai-error.ts +20 -0
- package/src/util/{cloud-mode-ready.ts → aws-regions.ts} +0 -24
- package/src/util/check-for-updates.ts +14 -30
- package/src/util/clean-certs.ts +8 -4
- package/src/util/directories.ts +23 -67
- package/src/util/file.ts +83 -3
- package/src/util/get-device-id.ts +7 -7
- package/src/util/http-client.ts +2 -2
- package/lib/util/cloud-mode-ready.d.ts +0 -3
- package/lib/util/cloud-mode-ready.d.ts.map +0 -1
- package/lib/util/cloud-mode-ready.js.map +0 -1
- package/lib/util/download-file.d.ts +0 -6
- package/lib/util/download-file.d.ts.map +0 -1
- package/lib/util/download-file.js +0 -25
- package/lib/util/download-file.js.map +0 -1
- package/lib/util/fetch-with-timeout.d.ts +0 -4
- package/lib/util/fetch-with-timeout.d.ts.map +0 -1
- package/lib/util/fetch-with-timeout.js +0 -30
- package/lib/util/fetch-with-timeout.js.map +0 -1
- package/lib/util/parsing.d.ts +0 -2
- package/lib/util/parsing.d.ts.map +0 -1
- package/lib/util/parsing.js +0 -17
- package/lib/util/parsing.js.map +0 -1
- package/src/util/download-file.ts +0 -25
- package/src/util/fetch-with-timeout.ts +0 -35
- 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
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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.
|
|
56
|
-
const readable = await this.
|
|
31
|
+
this.livingStreams.add(projectId);
|
|
32
|
+
const readable = await this.getStreamWithRetry(projectId, streamGetter);
|
|
57
33
|
if (readable === null) {
|
|
58
|
-
logger_1.logger.info(`
|
|
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.
|
|
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(`
|
|
42
|
+
logger_1.logger.info(`Stream terminated. ProjectId: ${projectId}`);
|
|
67
43
|
return;
|
|
68
44
|
}
|
|
69
|
-
|
|
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(`
|
|
48
|
+
logger_1.logger.error(`Stream terminated. ProjectId: ${projectId} - ${error}`);
|
|
79
49
|
});
|
|
80
50
|
readable.on('finished', () => {
|
|
81
|
-
logger_1.logger.info(`
|
|
51
|
+
logger_1.logger.info(`Strean complete. ProjectId: ${projectId}`);
|
|
82
52
|
});
|
|
83
53
|
}
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
this.
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
204
|
-
|
|
81
|
+
catch (e) {
|
|
82
|
+
logger_1.logger.error(`Error getting live updates: ${JSON.stringify(e)}: intervalKey: ${key}. Continuing...`);
|
|
205
83
|
}
|
|
206
|
-
}
|
|
207
|
-
|
|
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":";;;
|
|
1
|
+
{"version":3,"file":"live-updates-handler.js","sourceRoot":"","sources":["../../src/cloud-connection/live-updates-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
5
|
-
const
|
|
6
|
-
const
|
|
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.
|
|
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
|
|
16
|
-
|
|
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
|
-
|
|
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
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
expect(
|
|
48
|
-
expect(
|
|
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
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
expect(
|
|
59
|
-
expect(
|
|
60
|
-
expect(
|
|
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
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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.
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
let
|
|
136
|
-
|
|
137
|
-
|
|
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(
|
|
156
|
-
expect(
|
|
157
|
-
|
|
158
|
-
|
|
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(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
.mockImplementationOnce(
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
await
|
|
182
|
-
|
|
183
|
-
expect(
|
|
184
|
-
expect(
|
|
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":";;AAAA,
|
|
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
|