@alwaysai/device-agent 1.3.0 → 1.3.1-2
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 +1 -0
- package/lib/application-control/environment-variables.d.ts.map +1 -1
- package/lib/application-control/environment-variables.js +22 -20
- package/lib/application-control/environment-variables.js.map +1 -1
- package/lib/application-control/environment-variables.test.js +37 -2
- package/lib/application-control/environment-variables.test.js.map +1 -1
- package/lib/application-control/install.js +1 -1
- package/lib/application-control/install.js.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +5 -5
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +203 -178
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
- package/lib/cloud-connection/live-updates-handler.js +30 -25
- package/lib/cloud-connection/live-updates-handler.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.test.js +15 -0
- package/lib/cloud-connection/live-updates-handler.test.js.map +1 -1
- package/lib/cloud-connection/messages.d.ts +1 -3
- package/lib/cloud-connection/messages.d.ts.map +1 -1
- package/lib/cloud-connection/messages.js +1 -9
- package/lib/cloud-connection/messages.js.map +1 -1
- package/lib/cloud-connection/publisher.d.ts +1 -0
- package/lib/cloud-connection/publisher.d.ts.map +1 -1
- package/lib/cloud-connection/publisher.js +3 -0
- package/lib/cloud-connection/publisher.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.d.ts +10 -21
- package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
- package/lib/cloud-connection/shadow-handler.js +154 -100
- package/lib/cloud-connection/shadow-handler.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.test.js +140 -72
- package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
- package/lib/cloud-connection/transaction-manager.d.ts +26 -6
- package/lib/cloud-connection/transaction-manager.d.ts.map +1 -1
- package/lib/cloud-connection/transaction-manager.js +103 -22
- package/lib/cloud-connection/transaction-manager.js.map +1 -1
- package/lib/cloud-connection/transaction-manager.test.js +179 -13
- package/lib/cloud-connection/transaction-manager.test.js.map +1 -1
- package/lib/device-control/device-control.d.ts +2 -2
- package/lib/device-control/device-control.d.ts.map +1 -1
- 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 +10 -0
- package/lib/subcommands/app/analytics.d.ts.map +1 -0
- package/lib/subcommands/app/analytics.js +79 -0
- package/lib/subcommands/app/analytics.js.map +1 -0
- 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/index.d.ts.map +1 -1
- package/lib/subcommands/app/index.js +3 -1
- package/lib/subcommands/app/index.js.map +1 -1
- package/lib/subcommands/app/models.d.ts +0 -5
- package/lib/subcommands/app/models.d.ts.map +1 -1
- package/lib/subcommands/app/models.js +16 -56
- package/lib/subcommands/app/models.js.map +1 -1
- package/lib/subcommands/app/status.d.ts +1 -0
- package/lib/subcommands/app/status.d.ts.map +1 -1
- package/lib/subcommands/app/status.js +14 -3
- package/lib/subcommands/app/status.js.map +1 -1
- package/lib/subcommands/app/version.d.ts +2 -1
- package/lib/subcommands/app/version.d.ts.map +1 -1
- package/lib/subcommands/app/version.js +16 -3
- package/lib/subcommands/app/version.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/lib/util/parsing.d.ts +2 -0
- package/lib/util/parsing.d.ts.map +1 -0
- package/lib/util/parsing.js +17 -0
- package/lib/util/parsing.js.map +1 -0
- package/package.json +4 -6
- package/readme.md +146 -92
- package/src/application-control/environment-variables.test.ts +43 -3
- package/src/application-control/environment-variables.ts +29 -19
- package/src/application-control/install.ts +1 -1
- package/src/cloud-connection/device-agent-cloud-connection.ts +272 -247
- package/src/cloud-connection/live-updates-handler.test.ts +20 -0
- package/src/cloud-connection/live-updates-handler.ts +45 -52
- package/src/cloud-connection/messages.ts +1 -14
- package/src/cloud-connection/publisher.ts +4 -0
- package/src/cloud-connection/shadow-handler.test.ts +150 -73
- package/src/cloud-connection/shadow-handler.ts +247 -126
- package/src/cloud-connection/transaction-manager.test.ts +193 -18
- package/src/cloud-connection/transaction-manager.ts +174 -26
- package/src/device-control/device-control.ts +3 -3
- 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 +102 -0
- package/src/subcommands/app/env-vars.ts +18 -16
- package/src/subcommands/app/index.ts +4 -3
- package/src/subcommands/app/models.ts +25 -57
- package/src/subcommands/app/status.ts +20 -3
- package/src/subcommands/app/version.ts +19 -4
- package/src/util/cloud-mode-ready.ts +36 -0
- package/src/util/parsing.ts +11 -0
- package/lib/cloud-connection/cmd-status.d.ts +0 -8
- package/lib/cloud-connection/cmd-status.d.ts.map +0 -1
- package/lib/cloud-connection/cmd-status.js +0 -62
- package/lib/cloud-connection/cmd-status.js.map +0 -1
- package/lib/cloud-connection/message-builder.d.ts +0 -7
- package/lib/cloud-connection/message-builder.d.ts.map +0 -1
- package/lib/cloud-connection/message-builder.js +0 -63
- package/lib/cloud-connection/message-builder.js.map +0 -1
- 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/cloud-connection/cmd-status.ts +0 -71
- package/src/cloud-connection/message-builder.ts +0 -117
- package/src/secure-tunneling/index.ts +0 -74
|
@@ -3,27 +3,22 @@ import {
|
|
|
3
3
|
validateAppConfig
|
|
4
4
|
} from '@alwaysai/app-configuration-schemas';
|
|
5
5
|
import { EnvVars, getAllEnvs, readAppCfgFile } from '../application-control';
|
|
6
|
+
import { getSystemInformation } from '../device-control/device-control';
|
|
6
7
|
import { logger } from '../util/logger';
|
|
7
8
|
import { Publisher } from './publisher';
|
|
8
9
|
import { AppConfigModels, getAppCfgModelsDiff } from './shadow';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
delete: string;
|
|
22
|
-
};
|
|
23
|
-
systemInfo: {
|
|
24
|
-
update: string;
|
|
25
|
-
};
|
|
26
|
-
}
|
|
10
|
+
import {
|
|
11
|
+
generateTxId,
|
|
12
|
+
validateProjectShadowUpdate,
|
|
13
|
+
buildBaseShadowMessage,
|
|
14
|
+
buildUpdateProjectShadowMessage,
|
|
15
|
+
buildUpdateSystemInfoShadowMessage,
|
|
16
|
+
getShadowTopic,
|
|
17
|
+
ShadowProjectsUpdateAll,
|
|
18
|
+
getDesiredFromMessage,
|
|
19
|
+
ShadowTopics,
|
|
20
|
+
ProjectShadowUpdate
|
|
21
|
+
} from '@alwaysai/device-agent-schemas';
|
|
27
22
|
|
|
28
23
|
export type AppConfigUpdate = {
|
|
29
24
|
newAppCfg: AppConfig;
|
|
@@ -44,92 +39,191 @@ export type ShadowUpdate = {
|
|
|
44
39
|
export class ShadowHandler {
|
|
45
40
|
private clientId: string;
|
|
46
41
|
private publisher: Publisher;
|
|
47
|
-
public
|
|
48
|
-
public readonly shadowTopics:
|
|
49
|
-
|
|
42
|
+
public projectShadowTopics: string[] = [];
|
|
43
|
+
public readonly shadowTopics: { [key: string]: any };
|
|
50
44
|
constructor(clientId: string, publisher: Publisher) {
|
|
51
45
|
this.clientId = clientId;
|
|
52
46
|
this.publisher = publisher;
|
|
53
|
-
this.shadowPrefix = `$aws/things/${this.clientId}/shadow/name/`;
|
|
54
47
|
this.shadowTopics = {
|
|
55
|
-
|
|
56
|
-
get:
|
|
57
|
-
getAccepted:
|
|
58
|
-
getRejected:
|
|
59
|
-
update:
|
|
60
|
-
updateDelta:
|
|
61
|
-
updateAccepted:
|
|
62
|
-
updateRejected:
|
|
63
|
-
delete: `${this.shadowPrefix}projects/delete`
|
|
48
|
+
project: {
|
|
49
|
+
get: getShadowTopic(clientId, 'projects', 'get'),
|
|
50
|
+
getAccepted: getShadowTopic(clientId, 'projects', 'get/accepted'),
|
|
51
|
+
getRejected: getShadowTopic(clientId, 'projects', 'get/rejected'),
|
|
52
|
+
update: getShadowTopic(clientId, 'projects', 'update'),
|
|
53
|
+
updateDelta: getShadowTopic(clientId, 'projects', 'update/delta'),
|
|
54
|
+
updateAccepted: getShadowTopic(clientId, 'projects', 'update/accepted'),
|
|
55
|
+
updateRejected: getShadowTopic(clientId, 'projects', 'update/rejected')
|
|
64
56
|
},
|
|
65
57
|
systemInfo: {
|
|
66
|
-
update:
|
|
58
|
+
update: getShadowTopic(clientId, 'system-info', 'update')
|
|
59
|
+
},
|
|
60
|
+
secureTunnel: {
|
|
61
|
+
get: getShadowTopic(clientId, 'secure-tunnel', 'get'),
|
|
62
|
+
getAccepted: getShadowTopic(clientId, 'secure-tunnel', 'get/accepted'),
|
|
63
|
+
getRejected: getShadowTopic(clientId, 'secure-tunnel', 'get/rejected'),
|
|
64
|
+
update: getShadowTopic(clientId, 'secure-tunnel', 'update'),
|
|
65
|
+
updateDelta: getShadowTopic(clientId, 'secure-tunnel', 'update/delta'),
|
|
66
|
+
updateAccepted: getShadowTopic(
|
|
67
|
+
clientId,
|
|
68
|
+
'secure-tunnel',
|
|
69
|
+
'update/accepted'
|
|
70
|
+
),
|
|
71
|
+
updateRejected: getShadowTopic(
|
|
72
|
+
clientId,
|
|
73
|
+
'secure-tunnel',
|
|
74
|
+
'update/rejected'
|
|
75
|
+
),
|
|
76
|
+
delete: getShadowTopic(clientId, 'secure-tunnel', 'delete'),
|
|
77
|
+
deleteAccepted: getShadowTopic(
|
|
78
|
+
clientId,
|
|
79
|
+
'secure-tunnel',
|
|
80
|
+
'delete/accepted'
|
|
81
|
+
),
|
|
82
|
+
deleteRejected: getShadowTopic(
|
|
83
|
+
clientId,
|
|
84
|
+
'secure-tunnel',
|
|
85
|
+
'delete/rejected'
|
|
86
|
+
)
|
|
67
87
|
}
|
|
68
88
|
};
|
|
89
|
+
this.projectShadowTopics.push(this.shadowTopics.project.getAccepted);
|
|
90
|
+
this.projectShadowTopics.push(this.shadowTopics.project.getRejected);
|
|
91
|
+
this.projectShadowTopics.push(this.shadowTopics.project.updateDelta);
|
|
92
|
+
this.projectShadowTopics.push(this.shadowTopics.project.updateAccepted);
|
|
93
|
+
this.projectShadowTopics.push(this.shadowTopics.project.updateRejected);
|
|
69
94
|
}
|
|
70
95
|
|
|
71
|
-
private async
|
|
96
|
+
private async generateAppConfigUpdate({
|
|
97
|
+
appConfig,
|
|
98
|
+
txId,
|
|
99
|
+
projectId
|
|
100
|
+
}: {
|
|
101
|
+
appConfig: string;
|
|
102
|
+
txId: string;
|
|
103
|
+
projectId: string;
|
|
104
|
+
}): Promise<AppConfigUpdate | null> {
|
|
105
|
+
let appCfgUpdate: any;
|
|
106
|
+
let newAppCfg: any;
|
|
107
|
+
|
|
108
|
+
// Handle errors and validation
|
|
109
|
+
try {
|
|
110
|
+
newAppCfg = JSON.parse(appConfig);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
logger.error(
|
|
113
|
+
`Could not parse the appConfig for transaction ${txId}!\n${error}`
|
|
114
|
+
);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (!validateAppConfig(newAppCfg)) {
|
|
119
|
+
// FIXME: Raise an exception to be handled at higher layer
|
|
120
|
+
logger.error(
|
|
121
|
+
`Received invalid app config for ${projectId}!\n${JSON.stringify(
|
|
122
|
+
validateAppConfig.errors,
|
|
123
|
+
null,
|
|
124
|
+
2
|
|
125
|
+
)}`
|
|
126
|
+
);
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// If all ok, return the AppConfigUpdate
|
|
131
|
+
logger.info(`Found a delta for app config shadow. Updating ${projectId}`);
|
|
132
|
+
const { updatedModels } = await getAppCfgModelsDiff({
|
|
133
|
+
newAppCfg,
|
|
134
|
+
projectId
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
if (updatedModels && Object.keys(updatedModels).length) {
|
|
138
|
+
appCfgUpdate = { newAppCfg, updatedModels };
|
|
139
|
+
} else {
|
|
140
|
+
appCfgUpdate = { newAppCfg };
|
|
141
|
+
}
|
|
142
|
+
return appCfgUpdate;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private async processProjectShadowUpdates({
|
|
72
146
|
delta
|
|
73
147
|
}: {
|
|
74
148
|
delta: any;
|
|
75
149
|
}): Promise<ShadowUpdate[]> {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
const deltaKeys = Object.keys(delta);
|
|
150
|
+
const shadowUpdates: ShadowUpdate[] = [];
|
|
79
151
|
|
|
80
|
-
for (const projectId of
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const shadowUpdate: ShadowUpdate = { projectId, txId };
|
|
85
|
-
|
|
86
|
-
if (projectShadow.appConfig) {
|
|
87
|
-
const newAppCfg = JSON.parse(projectShadow.appConfig);
|
|
88
|
-
if (!validateAppConfig(newAppCfg)) {
|
|
89
|
-
// FIXME: Raise an exception to be handled at higher layer
|
|
152
|
+
for (const [projectId, projectDelta] of Object.entries(delta)) {
|
|
153
|
+
if (projectDelta) {
|
|
154
|
+
const valid = validateProjectShadowUpdate(projectDelta);
|
|
155
|
+
if (!valid) {
|
|
90
156
|
logger.error(
|
|
91
|
-
`
|
|
92
|
-
|
|
157
|
+
`Error validating shadow update: ${JSON.stringify(
|
|
158
|
+
{ projectDelta, errors: validateProjectShadowUpdate.errors },
|
|
93
159
|
null,
|
|
94
160
|
2
|
|
95
161
|
)}`
|
|
96
162
|
);
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
const { updatedModels } = await getAppCfgModelsDiff({
|
|
100
|
-
newAppCfg,
|
|
101
|
-
projectId
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
if (updatedModels && Object.keys(updatedModels).length) {
|
|
105
|
-
shadowUpdate.appCfgUpdate = { newAppCfg, updatedModels };
|
|
106
163
|
} else {
|
|
107
|
-
shadowUpdate
|
|
164
|
+
const shadowUpdate = await this.processProjectShadowUpdate({
|
|
165
|
+
projectId,
|
|
166
|
+
projectDelta
|
|
167
|
+
});
|
|
168
|
+
if (shadowUpdate) {
|
|
169
|
+
shadowUpdates.push(shadowUpdate);
|
|
170
|
+
}
|
|
108
171
|
}
|
|
109
|
-
} else {
|
|
110
|
-
logger.info(
|
|
111
|
-
`Ignoring app config shadow update for ${projectId} due to no delta`
|
|
112
|
-
);
|
|
113
172
|
}
|
|
173
|
+
}
|
|
174
|
+
return shadowUpdates;
|
|
175
|
+
}
|
|
114
176
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
177
|
+
private async processProjectShadowUpdate({
|
|
178
|
+
projectId,
|
|
179
|
+
projectDelta
|
|
180
|
+
}: {
|
|
181
|
+
projectId: string;
|
|
182
|
+
projectDelta: ProjectShadowUpdate;
|
|
183
|
+
}): Promise<ShadowUpdate | null> {
|
|
184
|
+
const txId = generateTxId();
|
|
185
|
+
const shadowUpdate: ShadowUpdate = { projectId, txId };
|
|
186
|
+
|
|
187
|
+
// Handle appConfig Updates
|
|
188
|
+
if (!projectDelta.appConfig) {
|
|
189
|
+
logger.info(
|
|
190
|
+
`Ignoring app config shadow update for ${projectId} due to no delta`
|
|
191
|
+
);
|
|
192
|
+
} else {
|
|
193
|
+
logger.info(`Found a delta for app config shadow. Updating ${projectId}`);
|
|
194
|
+
const appConfig = projectDelta.appConfig;
|
|
195
|
+
const appCfgUpdate = await this.generateAppConfigUpdate({
|
|
196
|
+
appConfig,
|
|
197
|
+
txId,
|
|
198
|
+
projectId
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
if (appCfgUpdate) {
|
|
202
|
+
shadowUpdate.appCfgUpdate = appCfgUpdate;
|
|
125
203
|
}
|
|
126
204
|
}
|
|
127
|
-
|
|
205
|
+
|
|
206
|
+
// Handle envVars Updates
|
|
207
|
+
if (!projectDelta.envVars) {
|
|
208
|
+
logger.info(
|
|
209
|
+
`Ignoring app environment variable shadow update for ${projectId} due to no delta`
|
|
210
|
+
);
|
|
211
|
+
} else {
|
|
212
|
+
logger.info(
|
|
213
|
+
`Found a delta for app environment variable shadow. Updating ${projectId}`
|
|
214
|
+
);
|
|
215
|
+
const envVars = projectDelta.envVars;
|
|
216
|
+
shadowUpdate.envVarUpdate = { envVars };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return shadowUpdate.appCfgUpdate || shadowUpdate.envVarUpdate
|
|
220
|
+
? shadowUpdate
|
|
221
|
+
: null;
|
|
128
222
|
}
|
|
129
223
|
|
|
130
224
|
// Public interface
|
|
131
225
|
|
|
132
|
-
public async
|
|
226
|
+
public async handleProjectShadow({
|
|
133
227
|
topic,
|
|
134
228
|
payload,
|
|
135
229
|
clientToken
|
|
@@ -139,12 +233,35 @@ export class ShadowHandler {
|
|
|
139
233
|
clientToken: string;
|
|
140
234
|
}): Promise<ShadowUpdate[]> {
|
|
141
235
|
// TODO: make use a function like the other topic getters
|
|
142
|
-
|
|
236
|
+
if (!this.projectShadowTopics.includes(topic)) {
|
|
237
|
+
throw Error(`Topic ${topic} is not in the ${this.projectShadowTopics}`);
|
|
238
|
+
}
|
|
143
239
|
switch (topic) {
|
|
144
|
-
case this.shadowTopics.
|
|
240
|
+
case this.shadowTopics.project.updateAccepted: {
|
|
145
241
|
if (clientToken === this.clientId) {
|
|
146
242
|
logger.debug(
|
|
147
|
-
`Ignoring
|
|
243
|
+
`Ignoring message as it was caused by Device Agent itself: ${JSON.stringify(
|
|
244
|
+
{ topic, payload },
|
|
245
|
+
null,
|
|
246
|
+
2
|
|
247
|
+
)}`
|
|
248
|
+
);
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
const desired = getDesiredFromMessage(payload);
|
|
252
|
+
if (!desired) {
|
|
253
|
+
logger.debug(
|
|
254
|
+
`No desired state found in message: ${JSON.stringify(payload)}`
|
|
255
|
+
);
|
|
256
|
+
} else {
|
|
257
|
+
return await this.processProjectShadowUpdates({ delta: desired });
|
|
258
|
+
}
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case this.shadowTopics.project.getAccepted: {
|
|
262
|
+
if (clientToken !== this.clientId) {
|
|
263
|
+
logger.debug(
|
|
264
|
+
`Ignoring message as it was caused by Device Agent itself: ${JSON.stringify(
|
|
148
265
|
{ topic, payload },
|
|
149
266
|
null,
|
|
150
267
|
2
|
|
@@ -152,19 +269,28 @@ export class ShadowHandler {
|
|
|
152
269
|
);
|
|
153
270
|
break;
|
|
154
271
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
return await this.handleNamedShadowUpdate({
|
|
159
|
-
delta: payload['delta']
|
|
272
|
+
if (payload.state.delta) {
|
|
273
|
+
return await this.processProjectShadowUpdates({
|
|
274
|
+
delta: payload.state.delta
|
|
160
275
|
});
|
|
161
276
|
} else {
|
|
162
|
-
logger.info(
|
|
277
|
+
logger.info(
|
|
278
|
+
`No delta in projects.getAccepted in named shadow '${
|
|
279
|
+
topic.split('/')[5]
|
|
280
|
+
}'`
|
|
281
|
+
);
|
|
163
282
|
}
|
|
164
283
|
break;
|
|
284
|
+
}
|
|
285
|
+
case this.shadowTopics.project.getRejected:
|
|
286
|
+
case this.shadowTopics.project.updateDelta:
|
|
287
|
+
case this.shadowTopics.project.updateRejected: {
|
|
288
|
+
// Not handling these for now
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
165
291
|
default:
|
|
166
292
|
logger.info(
|
|
167
|
-
`Ignoring shadow message: ${JSON.stringify(
|
|
293
|
+
`Did not match a correct topic. Ignoring shadow message: ${JSON.stringify(
|
|
168
294
|
{ topic, payload },
|
|
169
295
|
null,
|
|
170
296
|
2
|
|
@@ -176,57 +302,52 @@ export class ShadowHandler {
|
|
|
176
302
|
|
|
177
303
|
public async updateSystemInfoShadow() {
|
|
178
304
|
const systemInfo = await getSystemInformation();
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
const topic = this.shadowTopics.systemInfo.update;
|
|
186
|
-
this.publisher.publish(topic, JSON.stringify(packet));
|
|
305
|
+
this.publisher.publish(
|
|
306
|
+
getShadowTopic(this.clientId, 'system-info', 'update'),
|
|
307
|
+
JSON.stringify(
|
|
308
|
+
buildUpdateSystemInfoShadowMessage(this.clientId, systemInfo)
|
|
309
|
+
)
|
|
310
|
+
);
|
|
187
311
|
}
|
|
188
312
|
|
|
189
313
|
public async updateProjectShadow(projectId: string) {
|
|
190
314
|
const appCfg = await readAppCfgFile({ projectId });
|
|
191
315
|
const envVars = await getAllEnvs({ projectId });
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
},
|
|
201
|
-
clientToken: this.clientId
|
|
316
|
+
|
|
317
|
+
const toReport: ShadowProjectsUpdateAll = {
|
|
318
|
+
[projectId]: {
|
|
319
|
+
appConfig: JSON.stringify(appCfg),
|
|
320
|
+
envVars
|
|
321
|
+
}
|
|
202
322
|
};
|
|
203
|
-
|
|
204
|
-
|
|
323
|
+
this.publisher.publish(
|
|
324
|
+
getShadowTopic(this.clientId, 'projects', 'update'),
|
|
325
|
+
JSON.stringify(
|
|
326
|
+
buildUpdateProjectShadowMessage({
|
|
327
|
+
clientId: this.clientId,
|
|
328
|
+
reported: toReport
|
|
329
|
+
})
|
|
330
|
+
)
|
|
331
|
+
);
|
|
205
332
|
}
|
|
206
333
|
|
|
207
|
-
public
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
this.publisher.publish(topic, JSON.stringify(packet));
|
|
334
|
+
public getProjectShadowUpdates() {
|
|
335
|
+
this.publisher.publish(
|
|
336
|
+
getShadowTopic(this.clientId, 'projects', 'get'),
|
|
337
|
+
JSON.stringify(buildBaseShadowMessage(this.clientId))
|
|
338
|
+
);
|
|
213
339
|
}
|
|
214
340
|
|
|
215
|
-
public
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
[projectId]: null
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
}
|
|
227
|
-
},
|
|
228
|
-
clientToken: this.clientId
|
|
229
|
-
};
|
|
230
|
-
this.publisher.publish(topic, JSON.stringify(packet));
|
|
341
|
+
public clearProjectShadow(projectId: string) {
|
|
342
|
+
this.publisher.publish(
|
|
343
|
+
getShadowTopic(this.clientId, 'projects', 'update'),
|
|
344
|
+
JSON.stringify(
|
|
345
|
+
buildUpdateProjectShadowMessage({
|
|
346
|
+
clientId: this.clientId,
|
|
347
|
+
reported: { [projectId]: null },
|
|
348
|
+
desired: { [projectId]: null }
|
|
349
|
+
})
|
|
350
|
+
)
|
|
351
|
+
);
|
|
231
352
|
}
|
|
232
353
|
}
|