@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.
- package/lib/application-control/environment-variables.d.ts.map +1 -1
- package/lib/application-control/environment-variables.js +9 -4
- package/lib/application-control/environment-variables.js.map +1 -1
- package/lib/application-control/environment-variables.test.js +1 -1
- package/lib/application-control/environment-variables.test.js.map +1 -1
- package/lib/application-control/install.d.ts.map +1 -1
- package/lib/application-control/install.js +6 -2
- package/lib/application-control/install.js.map +1 -1
- package/lib/application-control/models.d.ts.map +1 -1
- package/lib/application-control/models.js +4 -2
- package/lib/application-control/models.js.map +1 -1
- package/lib/application-control/status.js +4 -5
- package/lib/application-control/status.js.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +3 -3
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +114 -99
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.d.ts +1 -0
- package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
- package/lib/cloud-connection/live-updates-handler.js +22 -4
- package/lib/cloud-connection/live-updates-handler.js.map +1 -1
- package/lib/cloud-connection/messages.d.ts.map +1 -1
- package/lib/cloud-connection/messages.js +3 -4
- package/lib/cloud-connection/messages.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.d.ts +14 -21
- package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
- package/lib/cloud-connection/shadow-handler.js +162 -108
- package/lib/cloud-connection/shadow-handler.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.test.js +100 -83
- package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
- package/lib/device-control/device-control.d.ts +7 -14
- package/lib/device-control/device-control.d.ts.map +1 -1
- package/lib/device-control/device-control.js +37 -14
- package/lib/device-control/device-control.js.map +1 -1
- package/lib/secure-tunneling/secure-tunneling.d.ts +105 -0
- package/lib/secure-tunneling/secure-tunneling.d.ts.map +1 -0
- package/lib/secure-tunneling/secure-tunneling.js +435 -0
- package/lib/secure-tunneling/secure-tunneling.js.map +1 -0
- package/lib/secure-tunneling/secure-tunneling.test.d.ts +2 -0
- package/lib/secure-tunneling/secure-tunneling.test.d.ts.map +1 -0
- package/lib/secure-tunneling/secure-tunneling.test.js +1070 -0
- package/lib/secure-tunneling/secure-tunneling.test.js.map +1 -0
- package/lib/secure-tunneling/spawner-detached.d.ts +6 -0
- package/lib/secure-tunneling/spawner-detached.d.ts.map +1 -0
- package/lib/secure-tunneling/spawner-detached.js +107 -0
- package/lib/secure-tunneling/spawner-detached.js.map +1 -0
- package/lib/subcommands/app/analytics.d.ts.map +1 -1
- package/lib/subcommands/app/analytics.js +9 -13
- package/lib/subcommands/app/analytics.js.map +1 -1
- package/lib/subcommands/app/env-vars.d.ts.map +1 -1
- package/lib/subcommands/app/env-vars.js +11 -16
- package/lib/subcommands/app/env-vars.js.map +1 -1
- package/lib/subcommands/app/models.d.ts.map +1 -1
- package/lib/subcommands/app/models.js +12 -16
- package/lib/subcommands/app/models.js.map +1 -1
- package/lib/subcommands/device/clean.d.ts.map +1 -1
- package/lib/subcommands/device/clean.js +3 -1
- package/lib/subcommands/device/clean.js.map +1 -1
- package/lib/subcommands/device/device.d.ts.map +1 -1
- package/lib/subcommands/device/device.js +14 -6
- package/lib/subcommands/device/device.js.map +1 -1
- package/lib/util/cloud-mode-ready.d.ts +1 -0
- package/lib/util/cloud-mode-ready.d.ts.map +1 -1
- package/lib/util/cloud-mode-ready.js +36 -1
- package/lib/util/cloud-mode-ready.js.map +1 -1
- package/package.json +2 -2
- package/src/application-control/environment-variables.test.ts +1 -1
- package/src/application-control/environment-variables.ts +9 -6
- package/src/application-control/install.ts +7 -3
- package/src/application-control/models.ts +11 -6
- package/src/application-control/status.ts +8 -8
- package/src/cloud-connection/device-agent-cloud-connection.ts +161 -131
- package/src/cloud-connection/live-updates-handler.ts +34 -6
- package/src/cloud-connection/messages.ts +3 -4
- package/src/cloud-connection/shadow-handler.test.ts +101 -84
- package/src/cloud-connection/shadow-handler.ts +275 -133
- package/src/device-control/device-control.ts +46 -19
- package/src/secure-tunneling/secure-tunneling.test.ts +1239 -0
- package/src/secure-tunneling/secure-tunneling.ts +606 -0
- package/src/secure-tunneling/spawner-detached.ts +123 -0
- package/src/subcommands/app/analytics.ts +16 -13
- package/src/subcommands/app/env-vars.ts +18 -16
- package/src/subcommands/app/models.ts +20 -16
- package/src/subcommands/device/clean.ts +4 -1
- package/src/subcommands/device/device.ts +26 -10
- package/src/util/cloud-mode-ready.ts +36 -0
- package/lib/secure-tunneling/index.d.ts +0 -5
- package/lib/secure-tunneling/index.d.ts.map +0 -1
- package/lib/secure-tunneling/index.js +0 -64
- package/lib/secure-tunneling/index.js.map +0 -1
- 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.
|
|
28
|
-
topic:
|
|
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.
|
|
61
|
-
topic:
|
|
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.
|
|
76
|
-
topic:
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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.
|
|
113
|
-
topic:
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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.
|
|
160
|
-
topic:
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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.
|
|
228
|
-
topic:
|
|
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
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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.
|
|
284
|
-
topic:
|
|
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
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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.
|
|
328
|
-
topic:
|
|
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
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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.
|
|
368
|
-
topic:
|
|
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('
|
|
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
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
399
|
+
state: {
|
|
400
|
+
reported: {
|
|
401
|
+
[projectId1]: {
|
|
402
|
+
envVars: { service: envVars1 }
|
|
403
|
+
}
|
|
389
404
|
}
|
|
390
405
|
}
|
|
391
406
|
};
|
|
392
407
|
|
|
393
|
-
const updates = await shadowHandler.
|
|
394
|
-
topic:
|
|
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
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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.
|
|
421
|
-
topic:
|
|
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
|
|
447
|
+
const service1 = {
|
|
437
448
|
VAR1: 'value1'
|
|
438
449
|
};
|
|
439
|
-
const
|
|
440
|
-
VAR2:
|
|
450
|
+
const service2 = {
|
|
451
|
+
VAR2: 'value2'
|
|
441
452
|
};
|
|
453
|
+
|
|
442
454
|
const payload = {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
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.
|
|
454
|
-
topic:
|
|
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:
|
|
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:
|
|
486
|
+
envVars: { service: service2 }
|
|
471
487
|
}
|
|
472
488
|
});
|
|
473
489
|
});
|
|
474
490
|
});
|
|
475
491
|
|
|
476
492
|
test('clear project shadow', async () => {
|
|
477
|
-
shadowHandler.
|
|
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
|
-
|
|
498
|
+
reported: {
|
|
481
499
|
[projectId1]: null
|
|
482
500
|
},
|
|
483
|
-
|
|
501
|
+
desired: {
|
|
484
502
|
[projectId1]: null
|
|
485
503
|
}
|
|
486
|
-
}
|
|
487
|
-
clientToken: clientId
|
|
504
|
+
}
|
|
488
505
|
};
|
|
489
506
|
expect(jest.mocked(publisher.publish)).toBeCalledWith(
|
|
490
|
-
|
|
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
|
-
|
|
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.
|
|
539
|
+
shadowHandler.getProjectShadowUpdates();
|
|
523
540
|
expect(jest.mocked(publisher.publish)).toBeCalledWith(
|
|
524
|
-
|
|
541
|
+
getShadowTopic(clientId, 'projects', 'get'),
|
|
525
542
|
JSON.stringify({
|
|
526
543
|
clientToken: clientId
|
|
527
544
|
})
|