@alwaysai/device-agent 1.3.0 → 1.3.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 (89) hide show
  1. package/lib/application-control/environment-variables.d.ts +1 -0
  2. package/lib/application-control/environment-variables.d.ts.map +1 -1
  3. package/lib/application-control/environment-variables.js +22 -20
  4. package/lib/application-control/environment-variables.js.map +1 -1
  5. package/lib/application-control/environment-variables.test.js +37 -2
  6. package/lib/application-control/environment-variables.test.js.map +1 -1
  7. package/lib/application-control/install.js +1 -1
  8. package/lib/application-control/install.js.map +1 -1
  9. package/lib/cloud-connection/device-agent-cloud-connection.d.ts +2 -2
  10. package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
  11. package/lib/cloud-connection/device-agent-cloud-connection.js +116 -99
  12. package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
  13. package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
  14. package/lib/cloud-connection/live-updates-handler.js +30 -25
  15. package/lib/cloud-connection/live-updates-handler.js.map +1 -1
  16. package/lib/cloud-connection/live-updates-handler.test.js +15 -0
  17. package/lib/cloud-connection/live-updates-handler.test.js.map +1 -1
  18. package/lib/cloud-connection/messages.d.ts +1 -3
  19. package/lib/cloud-connection/messages.d.ts.map +1 -1
  20. package/lib/cloud-connection/messages.js +1 -9
  21. package/lib/cloud-connection/messages.js.map +1 -1
  22. package/lib/cloud-connection/publisher.d.ts +1 -0
  23. package/lib/cloud-connection/publisher.d.ts.map +1 -1
  24. package/lib/cloud-connection/publisher.js +3 -0
  25. package/lib/cloud-connection/publisher.js.map +1 -1
  26. package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
  27. package/lib/cloud-connection/shadow-handler.js +10 -3
  28. package/lib/cloud-connection/shadow-handler.js.map +1 -1
  29. package/lib/cloud-connection/shadow-handler.test.js +79 -28
  30. package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
  31. package/lib/cloud-connection/transaction-manager.d.ts +26 -6
  32. package/lib/cloud-connection/transaction-manager.d.ts.map +1 -1
  33. package/lib/cloud-connection/transaction-manager.js +103 -22
  34. package/lib/cloud-connection/transaction-manager.js.map +1 -1
  35. package/lib/cloud-connection/transaction-manager.test.js +179 -13
  36. package/lib/cloud-connection/transaction-manager.test.js.map +1 -1
  37. package/lib/subcommands/app/analytics.d.ts +10 -0
  38. package/lib/subcommands/app/analytics.d.ts.map +1 -0
  39. package/lib/subcommands/app/analytics.js +83 -0
  40. package/lib/subcommands/app/analytics.js.map +1 -0
  41. package/lib/subcommands/app/index.d.ts.map +1 -1
  42. package/lib/subcommands/app/index.js +3 -1
  43. package/lib/subcommands/app/index.js.map +1 -1
  44. package/lib/subcommands/app/models.d.ts +0 -5
  45. package/lib/subcommands/app/models.d.ts.map +1 -1
  46. package/lib/subcommands/app/models.js +11 -47
  47. package/lib/subcommands/app/models.js.map +1 -1
  48. package/lib/subcommands/app/status.d.ts +1 -0
  49. package/lib/subcommands/app/status.d.ts.map +1 -1
  50. package/lib/subcommands/app/status.js +14 -3
  51. package/lib/subcommands/app/status.js.map +1 -1
  52. package/lib/subcommands/app/version.d.ts +2 -1
  53. package/lib/subcommands/app/version.d.ts.map +1 -1
  54. package/lib/subcommands/app/version.js +16 -3
  55. package/lib/subcommands/app/version.js.map +1 -1
  56. package/lib/util/parsing.d.ts +2 -0
  57. package/lib/util/parsing.d.ts.map +1 -0
  58. package/lib/util/parsing.js +17 -0
  59. package/lib/util/parsing.js.map +1 -0
  60. package/package.json +4 -6
  61. package/readme.md +146 -92
  62. package/src/application-control/environment-variables.test.ts +43 -3
  63. package/src/application-control/environment-variables.ts +29 -19
  64. package/src/application-control/install.ts +1 -1
  65. package/src/cloud-connection/device-agent-cloud-connection.ts +155 -141
  66. package/src/cloud-connection/live-updates-handler.test.ts +20 -0
  67. package/src/cloud-connection/live-updates-handler.ts +45 -52
  68. package/src/cloud-connection/messages.ts +1 -14
  69. package/src/cloud-connection/publisher.ts +4 -0
  70. package/src/cloud-connection/shadow-handler.test.ts +88 -28
  71. package/src/cloud-connection/shadow-handler.ts +13 -3
  72. package/src/cloud-connection/transaction-manager.test.ts +193 -18
  73. package/src/cloud-connection/transaction-manager.ts +174 -26
  74. package/src/subcommands/app/analytics.ts +99 -0
  75. package/src/subcommands/app/index.ts +4 -3
  76. package/src/subcommands/app/models.ts +13 -49
  77. package/src/subcommands/app/status.ts +20 -3
  78. package/src/subcommands/app/version.ts +19 -4
  79. package/src/util/parsing.ts +11 -0
  80. package/lib/cloud-connection/cmd-status.d.ts +0 -8
  81. package/lib/cloud-connection/cmd-status.d.ts.map +0 -1
  82. package/lib/cloud-connection/cmd-status.js +0 -62
  83. package/lib/cloud-connection/cmd-status.js.map +0 -1
  84. package/lib/cloud-connection/message-builder.d.ts +0 -7
  85. package/lib/cloud-connection/message-builder.d.ts.map +0 -1
  86. package/lib/cloud-connection/message-builder.js +0 -63
  87. package/lib/cloud-connection/message-builder.js.map +0 -1
  88. package/src/cloud-connection/cmd-status.ts +0 -71
  89. package/src/cloud-connection/message-builder.ts +0 -117
@@ -32,13 +32,30 @@ export const startAppCliLeaf = CliLeaf({
32
32
  description: 'Project ID',
33
33
  required: true
34
34
  }),
35
- dockerLoginToken: CliStringInput({
35
+ 'docker-login-token': CliStringInput({
36
36
  description: 'Docker login token'
37
+ }),
38
+ dockerLoginToken: CliStringInput({
39
+ description: 'Docker login token',
40
+ hidden: true
37
41
  })
38
42
  },
39
43
  async action(_, opts) {
40
- const { project, dockerLoginToken } = opts;
41
- await startApp({ projectId: project, dockerLoginToken });
44
+ const {
45
+ project,
46
+ dockerLoginToken,
47
+ 'docker-login-token': dockerLoginTokenNew
48
+ } = opts;
49
+ if (dockerLoginToken) {
50
+ logger.warn(
51
+ `--dockerLoginToken is deprecated and will be removed in a future release. Please switch to --docker-login-token`
52
+ );
53
+ }
54
+ const dockerLoginTokenResolved = dockerLoginTokenNew || dockerLoginToken;
55
+ await startApp({
56
+ projectId: project,
57
+ dockerLoginToken: dockerLoginTokenResolved
58
+ });
42
59
  }
43
60
  });
44
61
 
@@ -1,4 +1,4 @@
1
- import { CliLeaf, CliStringInput } from '@alwaysai/alwayscli';
1
+ import { CliLeaf, CliStringInput, CliTerseError } from '@alwaysai/alwayscli';
2
2
  import {
3
3
  AppVersionControlMessage,
4
4
  generateTxId,
@@ -8,6 +8,7 @@ import { rollbackApp } from '../../application-control';
8
8
  import { DeviceAgentCloudConnection } from '../../cloud-connection/device-agent-cloud-connection';
9
9
  import { AgentConfigFile } from '../../infrastructure/agent-config';
10
10
  import sleep from '../../util/sleep';
11
+ import { logger } from '../../util/logger';
11
12
 
12
13
  export const listAppsCliLeaf = CliLeaf({
13
14
  name: 'list',
@@ -27,13 +28,27 @@ export const installAppCliLeaf = CliLeaf({
27
28
  description: 'Project ID',
28
29
  required: true
29
30
  }),
31
+ 'release-hash': CliStringInput({
32
+ description: 'Release Hash',
33
+ required: false
34
+ }),
30
35
  releaseHash: CliStringInput({
31
36
  description: 'Release Hash',
32
- required: true
37
+ required: false,
38
+ hidden: true
33
39
  })
34
40
  },
35
41
  async action(_, opts) {
36
- const { project, releaseHash } = opts;
42
+ const { project, releaseHash, 'release-hash': releaseHashNew } = opts;
43
+ if (releaseHash) {
44
+ logger.warn(
45
+ `--releaseHash is deprecated and will be removed in a future release. Please switch to --release-hash`
46
+ );
47
+ }
48
+ const releaseHashResolved = releaseHashNew || releaseHash;
49
+ if (releaseHashResolved === undefined) {
50
+ throw new CliTerseError('--release-hash flag is required!');
51
+ }
37
52
  const deviceAgent = new DeviceAgentCloudConnection();
38
53
  await deviceAgent.setupHandlers();
39
54
  const topic = deviceAgent.getToDeviceTopic();
@@ -45,7 +60,7 @@ export const installAppCliLeaf = CliLeaf({
45
60
  payload: {
46
61
  baseCommand: keyMirrors.appVersionControl.install,
47
62
  projectId: project,
48
- appReleaseHash: releaseHash
63
+ appReleaseHash: releaseHashResolved
49
64
  }
50
65
  };
51
66
  await deviceAgent.handleMessage(topic, message);
@@ -0,0 +1,11 @@
1
+ export function replaceFalseyWithNull(object: object, recurse?: boolean) {
2
+ if (typeof object === 'string' || object instanceof String) return;
3
+
4
+ object &&
5
+ Object.keys(object).forEach((key: string) => {
6
+ if (recurse) {
7
+ replaceFalseyWithNull(object[key], recurse);
8
+ }
9
+ if (!object[key]) object[key] = null;
10
+ });
11
+ }
@@ -1,8 +0,0 @@
1
- export declare class CmdStatusManager {
2
- private apps;
3
- start(projectId: string): Promise<void>;
4
- stop(projectId: string): Promise<void>;
5
- isCmdInProgress(projectId: string): boolean;
6
- anyCmdInProgress(): boolean;
7
- }
8
- //# sourceMappingURL=cmd-status.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cmd-status.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/cmd-status.ts"],"names":[],"mappings":"AA0BA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAA0C;IAEzC,KAAK,CAAC,SAAS,EAAE,MAAM;IAevB,IAAI,CAAC,SAAS,EAAE,MAAM;IAW5B,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAO3C,gBAAgB;CAQxB"}
@@ -1,62 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CmdStatusManager = void 0;
4
- const logger_1 = require("../util/logger");
5
- class CmdStatus {
6
- constructor(projectId, status) {
7
- this.projectId = projectId;
8
- this.status = status;
9
- }
10
- getProjectId() {
11
- return this.projectId;
12
- }
13
- update(status) {
14
- this.status = status;
15
- }
16
- getStatus() {
17
- return this.status;
18
- }
19
- }
20
- class CmdStatusManager {
21
- constructor() {
22
- this.apps = {};
23
- }
24
- async start(projectId) {
25
- if (!(projectId in this.apps)) {
26
- const cmdStatus = new CmdStatus(projectId, 'in_progress');
27
- this.apps[projectId] = cmdStatus;
28
- }
29
- else if (this.apps[projectId].getStatus() !== 'in_progress') {
30
- this.apps[projectId].update('in_progress');
31
- }
32
- else {
33
- logger_1.logger.debug(`Ignoring start for ${projectId} since it already has a command in progress`);
34
- return;
35
- }
36
- logger_1.logger.debug(`Started command for ${projectId}`);
37
- }
38
- async stop(projectId) {
39
- if (!(projectId in this.apps) ||
40
- this.apps[projectId].getStatus() === 'idle') {
41
- throw new Error(`No ongoing command to stop for ${projectId}`);
42
- }
43
- this.apps[projectId].update('idle');
44
- logger_1.logger.debug(`Stopped command for ${projectId}`);
45
- }
46
- isCmdInProgress(projectId) {
47
- if (!(projectId in this.apps)) {
48
- return false;
49
- }
50
- return this.apps[projectId].getStatus() === 'in_progress';
51
- }
52
- anyCmdInProgress() {
53
- for (const projectId in this.apps) {
54
- if (this.apps[projectId].getStatus() === 'in_progress') {
55
- return true;
56
- }
57
- }
58
- return false;
59
- }
60
- }
61
- exports.CmdStatusManager = CmdStatusManager;
62
- //# sourceMappingURL=cmd-status.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cmd-status.js","sourceRoot":"","sources":["../../src/cloud-connection/cmd-status.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAIxC,MAAM,SAAS;IAIb,YAAY,SAAiB,EAAE,MAAqB;QAClD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,MAAqB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,MAAa,gBAAgB;IAA7B;QACU,SAAI,GAAuC,EAAE,CAAC;IA2CxD,CAAC;IAzCQ,KAAK,CAAC,KAAK,CAAC,SAAiB;QAClC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;SAClC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,KAAK,aAAa,EAAE;YAC7D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;SAC5C;aAAM;YACL,eAAM,CAAC,KAAK,CACV,sBAAsB,SAAS,6CAA6C,CAC7E,CAAC;YACF,OAAO;SACR;QACD,eAAM,CAAC,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,SAAiB;QACjC,IACE,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,KAAK,MAAM,EAC3C;YACA,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;SAChE;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,eAAM,CAAC,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAEM,eAAe,CAAC,SAAiB;QACtC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7B,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,KAAK,aAAa,CAAC;IAC5D,CAAC;IAEM,gBAAgB;QACrB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE;YACjC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,KAAK,aAAa,EAAE;gBACtD,OAAO,IAAI,CAAC;aACb;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA5CD,4CA4CC"}
@@ -1,7 +0,0 @@
1
- import { AppLogsMessage, AppLogsPayload, AppStateMessage, AppStatePayload, DeviceStatsMessage, DeviceStatsPayload, SignedUrlsRequestMessage, SignedUrlsRequestPayload, StatusResponseMessage, StatusResponsePayload } from '@alwaysai/device-agent-schemas';
2
- export declare function buildAppLogsMessage(payload: AppLogsPayload, txId?: string): Promise<AppLogsMessage>;
3
- export declare function buildAppStateMessage(payload: AppStatePayload, txId?: string): Promise<AppStateMessage>;
4
- export declare function buildSignedUrlsRequestMessage(payload: SignedUrlsRequestPayload, txId?: string): Promise<SignedUrlsRequestMessage>;
5
- export declare function buildStatusResponseMessage(payload: StatusResponsePayload, txId?: string): Promise<StatusResponseMessage>;
6
- export declare function buildDeviceStatsMessage(payload: DeviceStatsPayload, txId?: string): Promise<DeviceStatsMessage>;
7
- //# sourceMappingURL=message-builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-builder.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/message-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,cAAc,EACd,eAAe,EAEf,eAAe,EAEf,kBAAkB,EAElB,kBAAkB,EAClB,wBAAwB,EAExB,wBAAwB,EACxB,qBAAqB,EAErB,qBAAqB,EAKtB,MAAM,gCAAgC,CAAC;AAiBxC,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,EACvB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAUzB;AAGD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAU1B;AAGD,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,wBAAwB,EACjC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,wBAAwB,CAAC,CAUnC;AAGD,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,qBAAqB,EAC9B,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC,CAWhC;AAGD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,kBAAkB,EAC3B,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,CAAC,CAU7B"}
@@ -1,63 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildDeviceStatsMessage = exports.buildStatusResponseMessage = exports.buildSignedUrlsRequestMessage = exports.buildAppStateMessage = exports.buildAppLogsMessage = void 0;
4
- const device_agent_schemas_1 = require("@alwaysai/device-agent-schemas");
5
- const get_device_id_1 = require("../util/get-device-id");
6
- function buildBaseClientMessage(txId) {
7
- const clientId = (0, get_device_id_1.getDeviceUuid)();
8
- const baseClientMessage = {
9
- timestamp: new Date().toUTCString(),
10
- deviceId: clientId,
11
- topic: (0, device_agent_schemas_1.getToClientTopic)(clientId),
12
- txId: txId || (0, device_agent_schemas_1.generateTxId)()
13
- };
14
- return baseClientMessage;
15
- }
16
- // Public Message Builders
17
- // app logs
18
- async function buildAppLogsMessage(payload, txId) {
19
- const baseMessage = buildBaseClientMessage(txId);
20
- const messageType = device_agent_schemas_1.keyMirrors.toClientMessageType.app_logs;
21
- const message = Object.assign(Object.assign({}, baseMessage), { messageType,
22
- payload });
23
- return message;
24
- }
25
- exports.buildAppLogsMessage = buildAppLogsMessage;
26
- // app state
27
- async function buildAppStateMessage(payload, txId) {
28
- const baseMessage = buildBaseClientMessage(txId);
29
- const messageType = device_agent_schemas_1.keyMirrors.toClientMessageType.app_state;
30
- const message = Object.assign(Object.assign({}, baseMessage), { messageType,
31
- payload });
32
- return message;
33
- }
34
- exports.buildAppStateMessage = buildAppStateMessage;
35
- // signed URLs
36
- async function buildSignedUrlsRequestMessage(payload, txId) {
37
- const baseMessage = buildBaseClientMessage(txId);
38
- const messageType = device_agent_schemas_1.keyMirrors.toCloudMessageType.signed_urls_request;
39
- const message = Object.assign(Object.assign({}, baseMessage), { messageType,
40
- payload });
41
- return message;
42
- }
43
- exports.buildSignedUrlsRequestMessage = buildSignedUrlsRequestMessage;
44
- // status response
45
- async function buildStatusResponseMessage(payload, txId) {
46
- const baseMessage = buildBaseClientMessage(txId);
47
- const messageType = device_agent_schemas_1.keyMirrors.toClientMessageType.status_response;
48
- const message = Object.assign(Object.assign({}, baseMessage), { messageType,
49
- payload });
50
- const valid = (0, device_agent_schemas_1.validateToDeviceAgentMessage)(message);
51
- return message;
52
- }
53
- exports.buildStatusResponseMessage = buildStatusResponseMessage;
54
- // device stats
55
- async function buildDeviceStatsMessage(payload, txId) {
56
- const messageType = device_agent_schemas_1.keyMirrors.toClientMessageType.device_stats;
57
- const baseMessage = buildBaseClientMessage(txId);
58
- const message = Object.assign(Object.assign({}, baseMessage), { messageType,
59
- payload });
60
- return message;
61
- }
62
- exports.buildDeviceStatsMessage = buildDeviceStatsMessage;
63
- //# sourceMappingURL=message-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-builder.js","sourceRoot":"","sources":["../../src/cloud-connection/message-builder.ts"],"names":[],"mappings":";;;AAAA,yEAqBwC;AACxC,yDAAsD;AAEtD,SAAS,sBAAsB,CAAC,IAAa;IAC3C,MAAM,QAAQ,GAAG,IAAA,6BAAa,GAAE,CAAC;IACjC,MAAM,iBAAiB,GAAG;QACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,IAAA,uCAAgB,EAAC,QAAQ,CAAC;QACjC,IAAI,EAAE,IAAI,IAAI,IAAA,mCAAY,GAAE;KAC7B,CAAC;IACF,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,0BAA0B;AAE1B,WAAW;AACJ,KAAK,UAAU,mBAAmB,CACvC,OAAuB,EACvB,IAAa;IAEb,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,WAAW,GACf,iCAAU,CAAC,mBAAmB,CAAC,QAAQ,CAAC;IAC1C,MAAM,OAAO,mCACR,WAAW,KACd,WAAW;QACX,OAAO,GACR,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAbD,kDAaC;AAED,YAAY;AACL,KAAK,UAAU,oBAAoB,CACxC,OAAwB,EACxB,IAAa;IAEb,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,WAAW,GACf,iCAAU,CAAC,mBAAmB,CAAC,SAAS,CAAC;IAC3C,MAAM,OAAO,mCACR,WAAW,KACd,WAAW;QACX,OAAO,GACR,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAbD,oDAaC;AAED,cAAc;AACP,KAAK,UAAU,6BAA6B,CACjD,OAAiC,EACjC,IAAa;IAEb,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,WAAW,GACf,iCAAU,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;IACpD,MAAM,OAAO,mCACR,WAAW,KACd,WAAW;QACX,OAAO,GACR,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAbD,sEAaC;AAED,kBAAkB;AACX,KAAK,UAAU,0BAA0B,CAC9C,OAA8B,EAC9B,IAAa;IAEb,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,WAAW,GACf,iCAAU,CAAC,mBAAmB,CAAC,eAAe,CAAC;IACjD,MAAM,OAAO,mCACR,WAAW,KACd,WAAW;QACX,OAAO,GACR,CAAC;IACF,MAAM,KAAK,GAAG,IAAA,mDAA4B,EAAC,OAAO,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC;AACjB,CAAC;AAdD,gEAcC;AAED,eAAe;AACR,KAAK,UAAU,uBAAuB,CAC3C,OAA2B,EAC3B,IAAa;IAEb,MAAM,WAAW,GACf,iCAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC;IAC9C,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,OAAO,mCACR,WAAW,KACd,WAAW;QACX,OAAO,GACR,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAbD,0DAaC"}
@@ -1,71 +0,0 @@
1
- import { logger } from '../util/logger';
2
-
3
- type CmdStatusType = 'idle' | 'in_progress';
4
-
5
- class CmdStatus {
6
- private projectId: string;
7
- private status: CmdStatusType;
8
-
9
- constructor(projectId: string, status: CmdStatusType) {
10
- this.projectId = projectId;
11
- this.status = status;
12
- }
13
-
14
- public getProjectId() {
15
- return this.projectId;
16
- }
17
-
18
- public update(status: CmdStatusType) {
19
- this.status = status;
20
- }
21
-
22
- public getStatus(): CmdStatusType {
23
- return this.status;
24
- }
25
- }
26
-
27
- export class CmdStatusManager {
28
- private apps: { [projectId: string]: CmdStatus } = {};
29
-
30
- public async start(projectId: string) {
31
- if (!(projectId in this.apps)) {
32
- const cmdStatus = new CmdStatus(projectId, 'in_progress');
33
- this.apps[projectId] = cmdStatus;
34
- } else if (this.apps[projectId].getStatus() !== 'in_progress') {
35
- this.apps[projectId].update('in_progress');
36
- } else {
37
- logger.debug(
38
- `Ignoring start for ${projectId} since it already has a command in progress`
39
- );
40
- return;
41
- }
42
- logger.debug(`Started command for ${projectId}`);
43
- }
44
-
45
- public async stop(projectId: string) {
46
- if (
47
- !(projectId in this.apps) ||
48
- this.apps[projectId].getStatus() === 'idle'
49
- ) {
50
- throw new Error(`No ongoing command to stop for ${projectId}`);
51
- }
52
- this.apps[projectId].update('idle');
53
- logger.debug(`Stopped command for ${projectId}`);
54
- }
55
-
56
- public isCmdInProgress(projectId: string): boolean {
57
- if (!(projectId in this.apps)) {
58
- return false;
59
- }
60
- return this.apps[projectId].getStatus() === 'in_progress';
61
- }
62
-
63
- public anyCmdInProgress() {
64
- for (const projectId in this.apps) {
65
- if (this.apps[projectId].getStatus() === 'in_progress') {
66
- return true;
67
- }
68
- }
69
- return false;
70
- }
71
- }
@@ -1,117 +0,0 @@
1
- import {
2
- AppLogsMessage,
3
- AppLogsMessageType,
4
- AppLogsPayload,
5
- AppStateMessage,
6
- AppStateMessageType,
7
- AppStatePayload,
8
- BaseToClientMessage,
9
- DeviceStatsMessage,
10
- DeviceStatsMessageType,
11
- DeviceStatsPayload,
12
- SignedUrlsRequestMessage,
13
- SignedUrlsRequestMessageType,
14
- SignedUrlsRequestPayload,
15
- StatusResponseMessage,
16
- StatusResponseMessageType,
17
- StatusResponsePayload,
18
- generateTxId,
19
- getToClientTopic,
20
- keyMirrors,
21
- validateToDeviceAgentMessage
22
- } from '@alwaysai/device-agent-schemas';
23
- import { getDeviceUuid } from '../util/get-device-id';
24
-
25
- function buildBaseClientMessage(txId?: string): BaseToClientMessage {
26
- const clientId = getDeviceUuid();
27
- const baseClientMessage = {
28
- timestamp: new Date().toUTCString(),
29
- deviceId: clientId,
30
- topic: getToClientTopic(clientId),
31
- txId: txId || generateTxId()
32
- };
33
- return baseClientMessage;
34
- }
35
-
36
- // Public Message Builders
37
-
38
- // app logs
39
- export async function buildAppLogsMessage(
40
- payload: AppLogsPayload,
41
- txId?: string
42
- ): Promise<AppLogsMessage> {
43
- const baseMessage = buildBaseClientMessage(txId);
44
- const messageType: AppLogsMessageType =
45
- keyMirrors.toClientMessageType.app_logs;
46
- const message = {
47
- ...baseMessage,
48
- messageType,
49
- payload
50
- };
51
- return message;
52
- }
53
-
54
- // app state
55
- export async function buildAppStateMessage(
56
- payload: AppStatePayload,
57
- txId?: string
58
- ): Promise<AppStateMessage> {
59
- const baseMessage = buildBaseClientMessage(txId);
60
- const messageType: AppStateMessageType =
61
- keyMirrors.toClientMessageType.app_state;
62
- const message = {
63
- ...baseMessage,
64
- messageType,
65
- payload
66
- };
67
- return message;
68
- }
69
-
70
- // signed URLs
71
- export async function buildSignedUrlsRequestMessage(
72
- payload: SignedUrlsRequestPayload,
73
- txId?: string
74
- ): Promise<SignedUrlsRequestMessage> {
75
- const baseMessage = buildBaseClientMessage(txId);
76
- const messageType: SignedUrlsRequestMessageType =
77
- keyMirrors.toCloudMessageType.signed_urls_request;
78
- const message = {
79
- ...baseMessage,
80
- messageType,
81
- payload
82
- };
83
- return message;
84
- }
85
-
86
- // status response
87
- export async function buildStatusResponseMessage(
88
- payload: StatusResponsePayload,
89
- txId?: string
90
- ): Promise<StatusResponseMessage> {
91
- const baseMessage = buildBaseClientMessage(txId);
92
- const messageType: StatusResponseMessageType =
93
- keyMirrors.toClientMessageType.status_response;
94
- const message = {
95
- ...baseMessage,
96
- messageType,
97
- payload
98
- };
99
- const valid = validateToDeviceAgentMessage(message);
100
- return message;
101
- }
102
-
103
- // device stats
104
- export async function buildDeviceStatsMessage(
105
- payload: DeviceStatsPayload,
106
- txId?: string
107
- ): Promise<DeviceStatsMessage> {
108
- const messageType: DeviceStatsMessageType =
109
- keyMirrors.toClientMessageType.device_stats;
110
- const baseMessage = buildBaseClientMessage(txId);
111
- const message = {
112
- ...baseMessage,
113
- messageType,
114
- payload
115
- };
116
- return message;
117
- }