@alwaysai/device-agent 1.3.1 → 1.4.0

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 (91) hide show
  1. package/lib/application-control/environment-variables.d.ts.map +1 -1
  2. package/lib/application-control/environment-variables.js +9 -4
  3. package/lib/application-control/environment-variables.js.map +1 -1
  4. package/lib/application-control/environment-variables.test.js +1 -1
  5. package/lib/application-control/environment-variables.test.js.map +1 -1
  6. package/lib/application-control/install.d.ts.map +1 -1
  7. package/lib/application-control/install.js +6 -2
  8. package/lib/application-control/install.js.map +1 -1
  9. package/lib/application-control/models.d.ts.map +1 -1
  10. package/lib/application-control/models.js +4 -2
  11. package/lib/application-control/models.js.map +1 -1
  12. package/lib/application-control/status.js +4 -5
  13. package/lib/application-control/status.js.map +1 -1
  14. package/lib/cloud-connection/device-agent-cloud-connection.d.ts +3 -3
  15. package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
  16. package/lib/cloud-connection/device-agent-cloud-connection.js +114 -99
  17. package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
  18. package/lib/cloud-connection/live-updates-handler.d.ts +1 -0
  19. package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
  20. package/lib/cloud-connection/live-updates-handler.js +22 -4
  21. package/lib/cloud-connection/live-updates-handler.js.map +1 -1
  22. package/lib/cloud-connection/messages.d.ts.map +1 -1
  23. package/lib/cloud-connection/messages.js +3 -4
  24. package/lib/cloud-connection/messages.js.map +1 -1
  25. package/lib/cloud-connection/shadow-handler.d.ts +14 -21
  26. package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
  27. package/lib/cloud-connection/shadow-handler.js +162 -108
  28. package/lib/cloud-connection/shadow-handler.js.map +1 -1
  29. package/lib/cloud-connection/shadow-handler.test.js +100 -83
  30. package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
  31. package/lib/device-control/device-control.d.ts +7 -14
  32. package/lib/device-control/device-control.d.ts.map +1 -1
  33. package/lib/device-control/device-control.js +37 -14
  34. package/lib/device-control/device-control.js.map +1 -1
  35. package/lib/secure-tunneling/secure-tunneling.d.ts +105 -0
  36. package/lib/secure-tunneling/secure-tunneling.d.ts.map +1 -0
  37. package/lib/secure-tunneling/secure-tunneling.js +435 -0
  38. package/lib/secure-tunneling/secure-tunneling.js.map +1 -0
  39. package/lib/secure-tunneling/secure-tunneling.test.d.ts +2 -0
  40. package/lib/secure-tunneling/secure-tunneling.test.d.ts.map +1 -0
  41. package/lib/secure-tunneling/secure-tunneling.test.js +1070 -0
  42. package/lib/secure-tunneling/secure-tunneling.test.js.map +1 -0
  43. package/lib/secure-tunneling/spawner-detached.d.ts +6 -0
  44. package/lib/secure-tunneling/spawner-detached.d.ts.map +1 -0
  45. package/lib/secure-tunneling/spawner-detached.js +107 -0
  46. package/lib/secure-tunneling/spawner-detached.js.map +1 -0
  47. package/lib/subcommands/app/analytics.d.ts.map +1 -1
  48. package/lib/subcommands/app/analytics.js +9 -13
  49. package/lib/subcommands/app/analytics.js.map +1 -1
  50. package/lib/subcommands/app/env-vars.d.ts.map +1 -1
  51. package/lib/subcommands/app/env-vars.js +11 -16
  52. package/lib/subcommands/app/env-vars.js.map +1 -1
  53. package/lib/subcommands/app/models.d.ts.map +1 -1
  54. package/lib/subcommands/app/models.js +12 -16
  55. package/lib/subcommands/app/models.js.map +1 -1
  56. package/lib/subcommands/device/clean.d.ts.map +1 -1
  57. package/lib/subcommands/device/clean.js +3 -1
  58. package/lib/subcommands/device/clean.js.map +1 -1
  59. package/lib/subcommands/device/device.d.ts.map +1 -1
  60. package/lib/subcommands/device/device.js +14 -6
  61. package/lib/subcommands/device/device.js.map +1 -1
  62. package/lib/util/cloud-mode-ready.d.ts +1 -0
  63. package/lib/util/cloud-mode-ready.d.ts.map +1 -1
  64. package/lib/util/cloud-mode-ready.js +36 -1
  65. package/lib/util/cloud-mode-ready.js.map +1 -1
  66. package/package.json +2 -2
  67. package/src/application-control/environment-variables.test.ts +1 -1
  68. package/src/application-control/environment-variables.ts +9 -6
  69. package/src/application-control/install.ts +7 -3
  70. package/src/application-control/models.ts +11 -6
  71. package/src/application-control/status.ts +8 -8
  72. package/src/cloud-connection/device-agent-cloud-connection.ts +161 -131
  73. package/src/cloud-connection/live-updates-handler.ts +34 -6
  74. package/src/cloud-connection/messages.ts +3 -4
  75. package/src/cloud-connection/shadow-handler.test.ts +101 -84
  76. package/src/cloud-connection/shadow-handler.ts +275 -133
  77. package/src/device-control/device-control.ts +46 -19
  78. package/src/secure-tunneling/secure-tunneling.test.ts +1239 -0
  79. package/src/secure-tunneling/secure-tunneling.ts +606 -0
  80. package/src/secure-tunneling/spawner-detached.ts +123 -0
  81. package/src/subcommands/app/analytics.ts +16 -13
  82. package/src/subcommands/app/env-vars.ts +18 -16
  83. package/src/subcommands/app/models.ts +20 -16
  84. package/src/subcommands/device/clean.ts +4 -1
  85. package/src/subcommands/device/device.ts +26 -10
  86. package/src/util/cloud-mode-ready.ts +36 -0
  87. package/lib/secure-tunneling/index.d.ts +0 -5
  88. package/lib/secure-tunneling/index.d.ts.map +0 -1
  89. package/lib/secure-tunneling/index.js +0 -64
  90. package/lib/secure-tunneling/index.js.map +0 -1
  91. package/src/secure-tunneling/index.ts +0 -74
@@ -4,6 +4,7 @@ import { Publisher } from './publisher';
4
4
  import { ShadowHandler } from './shadow-handler';
5
5
  import { Logger } from 'winston';
6
6
  import { logger } from '../util/logger';
7
+ import { getShadowTopic } from '@alwaysai/device-agent-schemas';
7
8
 
8
9
  jest.mock('../application-control');
9
10
  jest.mock('./publisher');
@@ -24,8 +25,8 @@ describe('Test Shadow Handler', () => {
24
25
  test.skip('reject buffer payload', async () => {
25
26
  //FIXME: Invalid input is silently ignored, need input validation
26
27
  expect(async () => {
27
- await shadowHandler.handleShadowTopic({
28
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
28
+ await shadowHandler.handleProjectShadow({
29
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
29
30
  payload: Buffer.from('test-payload'),
30
31
  clientToken: ''
31
32
  });
@@ -57,8 +58,8 @@ describe('Test Shadow Handler', () => {
57
58
  }
58
59
  };
59
60
 
60
- const updates = await shadowHandler.handleShadowTopic({
61
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
61
+ const updates = await shadowHandler.handleProjectShadow({
62
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
62
63
  payload,
63
64
  clientToken: clientId
64
65
  });
@@ -72,8 +73,8 @@ describe('Test Shadow Handler', () => {
72
73
  }
73
74
  };
74
75
 
75
- const updates = await shadowHandler.handleShadowTopic({
76
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
76
+ const updates = await shadowHandler.handleProjectShadow({
77
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
77
78
  payload,
78
79
  clientToken: ''
79
80
  });
@@ -102,15 +103,17 @@ describe('Test Shadow Handler', () => {
102
103
  };
103
104
 
104
105
  const payload = {
105
- delta: {
106
- [projectId1]: {
107
- appConfig: JSON.stringify(appCfg1)
106
+ state: {
107
+ desired: {
108
+ [projectId1]: {
109
+ appConfig: JSON.stringify(appCfg1)
110
+ }
108
111
  }
109
112
  }
110
113
  };
111
114
 
112
- const updates = await shadowHandler.handleShadowTopic({
113
- topic: shadowHandler.shadowTopics.projects.getAccepted,
115
+ const updates = await shadowHandler.handleProjectShadow({
116
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
114
117
  payload,
115
118
  clientToken: ''
116
119
  });
@@ -149,15 +152,17 @@ describe('Test Shadow Handler', () => {
149
152
  };
150
153
 
151
154
  const payload = {
152
- desired: {
153
- [projectId1]: {
154
- appConfig: JSON.stringify(appCfg1)
155
+ state: {
156
+ desired: {
157
+ [projectId1]: {
158
+ appConfig: JSON.stringify(appCfg1)
159
+ }
155
160
  }
156
161
  }
157
162
  };
158
163
 
159
- const updates = await shadowHandler.handleShadowTopic({
160
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
164
+ const updates = await shadowHandler.handleProjectShadow({
165
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
161
166
  payload,
162
167
  clientToken: ''
163
168
  });
@@ -214,18 +219,20 @@ describe('Test Shadow Handler', () => {
214
219
  }
215
220
  };
216
221
  const payload = {
217
- desired: {
218
- [projectId1]: {
219
- appConfig: JSON.stringify(appCfg1)
220
- },
221
- [projectId2]: {
222
- appConfig: JSON.stringify(appCfg2)
222
+ state: {
223
+ desired: {
224
+ [projectId1]: {
225
+ appConfig: JSON.stringify(appCfg1)
226
+ },
227
+ [projectId2]: {
228
+ appConfig: JSON.stringify(appCfg2)
229
+ }
223
230
  }
224
231
  }
225
232
  };
226
233
 
227
- const updates = await shadowHandler.handleShadowTopic({
228
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
234
+ const updates = await shadowHandler.handleProjectShadow({
235
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
229
236
  payload,
230
237
  clientToken: ''
231
238
  });
@@ -273,15 +280,17 @@ describe('Test Shadow Handler', () => {
273
280
  };
274
281
 
275
282
  const payload = {
276
- desired: {
277
- [projectId1]: {
278
- appConfig: JSON.stringify(appCfg1)
283
+ state: {
284
+ desired: {
285
+ [projectId1]: {
286
+ appConfig: JSON.stringify(appCfg1)
287
+ }
279
288
  }
280
289
  }
281
290
  };
282
291
 
283
- const updates = await shadowHandler.handleShadowTopic({
284
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
292
+ const updates = await shadowHandler.handleProjectShadow({
293
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
285
294
  payload,
286
295
  clientToken: ''
287
296
  });
@@ -317,15 +326,17 @@ describe('Test Shadow Handler', () => {
317
326
  };
318
327
 
319
328
  const payload = {
320
- desired: {
321
- [projectId1]: {
322
- appConfig: JSON.stringify(appCfg1)
329
+ state: {
330
+ desired: {
331
+ [projectId1]: {
332
+ appConfig: JSON.stringify(appCfg1)
333
+ }
323
334
  }
324
335
  }
325
336
  };
326
337
 
327
- const updates = await shadowHandler.handleShadowTopic({
328
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
338
+ const updates = await shadowHandler.handleProjectShadow({
339
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
329
340
  payload,
330
341
  clientToken: ''
331
342
  });
@@ -353,9 +364,11 @@ describe('Test Shadow Handler', () => {
353
364
  };
354
365
 
355
366
  const payload = {
356
- desired: {
357
- [projectId1]: {
358
- appConfig: appCfg1 // This is missing JSON.stringify() making this an unparsable object.
367
+ state: {
368
+ desired: {
369
+ [projectId1]: {
370
+ appConfig: appCfg1 // This is missing JSON.stringify() making this an unparsable object.
371
+ }
359
372
  }
360
373
  }
361
374
  };
@@ -364,61 +377,59 @@ describe('Test Shadow Handler', () => {
364
377
  .spyOn(logger, 'error')
365
378
  .mockReturnValue({} as unknown as Logger);
366
379
 
367
- const updates = await shadowHandler.handleShadowTopic({
368
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
380
+ const updates = await shadowHandler.handleProjectShadow({
381
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
369
382
  payload,
370
383
  clientToken: ''
371
384
  });
372
385
 
373
386
  expect(updates.length).toBe(0);
374
387
  expect(loggerSpy).toHaveBeenCalledWith(
375
- expect.stringContaining('Could not parse the appConfig')
388
+ expect.stringContaining('Error validating shadow update')
376
389
  );
377
390
  });
378
391
  });
379
392
 
380
393
  describe('handle project shadow env vars', () => {
381
- test('handle project shadow env vars get response with delta', async () => {
394
+ test('handle a response from the getAccepted from the cloud', async () => {
382
395
  const envVars1 = {
383
396
  VAR0: 'value0'
384
397
  };
385
398
  const payload = {
386
- delta: {
387
- [projectId1]: {
388
- envVars: envVars1
399
+ state: {
400
+ reported: {
401
+ [projectId1]: {
402
+ envVars: { service: envVars1 }
403
+ }
389
404
  }
390
405
  }
391
406
  };
392
407
 
393
- const updates = await shadowHandler.handleShadowTopic({
394
- topic: shadowHandler.shadowTopics.projects.getAccepted,
408
+ const updates = await shadowHandler.handleProjectShadow({
409
+ topic: getShadowTopic(clientId, 'projects', 'get/accepted'),
395
410
  payload,
396
- clientToken: ''
397
- });
398
- expect(updates.length).toBe(1);
399
- expect(updates[0]).toEqual({
400
- projectId: projectId1,
401
- txId: expect.any(String),
402
- envVarUpdate: {
403
- envVars: envVars1
404
- }
411
+ clientToken: clientId
405
412
  });
413
+ expect(updates.length).toBe(0);
406
414
  });
407
-
408
415
  test('handle project shadow env vars update delta', async () => {
409
416
  const envVars1 = {
410
417
  VAR1: 'value1'
411
418
  };
412
419
  const payload = {
413
- desired: {
414
- [projectId1]: {
415
- envVars: envVars1
420
+ state: {
421
+ desired: {
422
+ [projectId1]: {
423
+ envVars: {
424
+ service: envVars1
425
+ }
426
+ }
416
427
  }
417
428
  }
418
429
  };
419
430
 
420
- const updates = await shadowHandler.handleShadowTopic({
421
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
431
+ const updates = await shadowHandler.handleProjectShadow({
432
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
422
433
  payload,
423
434
  clientToken: ''
424
435
  });
@@ -427,31 +438,36 @@ describe('Test Shadow Handler', () => {
427
438
  projectId: projectId1,
428
439
  txId: expect.any(String),
429
440
  envVarUpdate: {
430
- envVars: envVars1
441
+ envVars: { service: envVars1 }
431
442
  }
432
443
  });
433
444
  });
434
445
 
435
446
  test('handle project shadow env vars update delta for two projects', async () => {
436
- const envVars1 = {
447
+ const service1 = {
437
448
  VAR1: 'value1'
438
449
  };
439
- const envVars2 = {
440
- VAR2: null
450
+ const service2 = {
451
+ VAR2: 'value2'
441
452
  };
453
+
442
454
  const payload = {
443
- desired: {
444
- [projectId1]: {
445
- envVars: envVars1
446
- },
447
- [projectId2]: {
448
- envVars: envVars2
455
+ state: {
456
+ desired: {
457
+ [projectId1]: {
458
+ envVars: {
459
+ service: service1
460
+ }
461
+ },
462
+ [projectId2]: {
463
+ envVars: { service: service2 }
464
+ }
449
465
  }
450
466
  }
451
467
  };
452
468
 
453
- const updates = await shadowHandler.handleShadowTopic({
454
- topic: shadowHandler.shadowTopics.projects.updateAccepted,
469
+ const updates = await shadowHandler.handleProjectShadow({
470
+ topic: getShadowTopic(clientId, 'projects', 'update/accepted'),
455
471
  payload,
456
472
  clientToken: ''
457
473
  });
@@ -460,34 +476,35 @@ describe('Test Shadow Handler', () => {
460
476
  projectId: projectId1,
461
477
  txId: expect.any(String),
462
478
  envVarUpdate: {
463
- envVars: envVars1
479
+ envVars: { service: service1 }
464
480
  }
465
481
  });
466
482
  expect(updates[1]).toEqual({
467
483
  projectId: projectId2,
468
484
  txId: expect.any(String),
469
485
  envVarUpdate: {
470
- envVars: envVars2
486
+ envVars: { service: service2 }
471
487
  }
472
488
  });
473
489
  });
474
490
  });
475
491
 
476
492
  test('clear project shadow', async () => {
477
- shadowHandler.clearAppConfig(projectId1);
493
+ await shadowHandler.clearProjectShadow(projectId1);
494
+ // The order of reported and desired in the packet does not matter for the device agent, but the test is checking literal equality of expected output, and therefore the order matters here with reported being first.
478
495
  const packet = {
496
+ clientToken: clientId,
479
497
  state: {
480
- desired: {
498
+ reported: {
481
499
  [projectId1]: null
482
500
  },
483
- reported: {
501
+ desired: {
484
502
  [projectId1]: null
485
503
  }
486
- },
487
- clientToken: clientId
504
+ }
488
505
  };
489
506
  expect(jest.mocked(publisher.publish)).toBeCalledWith(
490
- shadowHandler.shadowTopics.projects.update,
507
+ getShadowTopic(clientId, 'projects', 'update'),
491
508
  JSON.stringify(packet)
492
509
  );
493
510
  });
@@ -513,15 +530,15 @@ describe('Test Shadow Handler', () => {
513
530
  clientToken: clientId
514
531
  };
515
532
  expect(jest.mocked(publisher.publish)).toBeCalledWith(
516
- shadowHandler.shadowTopics.projects.update,
533
+ getShadowTopic(clientId, 'projects', 'update'),
517
534
  JSON.stringify(packet)
518
535
  );
519
536
  });
520
537
 
521
538
  test('get shadow updates', async () => {
522
- shadowHandler.getShadowUpdates();
539
+ shadowHandler.getProjectShadowUpdates();
523
540
  expect(jest.mocked(publisher.publish)).toBeCalledWith(
524
- shadowHandler.shadowTopics.projects.get,
541
+ getShadowTopic(clientId, 'projects', 'get'),
525
542
  JSON.stringify({
526
543
  clientToken: clientId
527
544
  })