homebridge-adt-pulse 3.3.1 → 3.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.
@@ -0,0 +1,255 @@
1
+ import { HomebridgePluginUiServer, RequestError } from '@homebridge/plugin-ui-utils';
2
+ import _ from 'lodash';
3
+ import { serializeError } from 'serialize-error';
4
+ import { ADTPulseAuth } from '../lib/auth.js';
5
+ import { configServerLogin, configServerRequestCode, configServerValidate } from '../lib/schema.js';
6
+ import { debugLog } from '../lib/utility.js';
7
+ class ADTPulseConfigServer extends HomebridgePluginUiServer {
8
+ #auth;
9
+ #userInput;
10
+ startBackend() {
11
+ this.onRequest('/initialize', this.initialize.bind(this));
12
+ this.onRequest('/get-methods', this.getMethods.bind(this));
13
+ this.onRequest('/request-code', this.requestCode.bind(this));
14
+ this.onRequest('/validate', this.validate.bind(this));
15
+ this.onRequest('/generate-config', this.generateConfig.bind(this));
16
+ this.ready();
17
+ }
18
+ async initialize(payload) {
19
+ const parsedPayload = configServerLogin.safeParse(payload);
20
+ if (!parsedPayload.success) {
21
+ debugLog(null, 'server.ts / ADTPulseConfigServer.initialize()', 'error', 'Invalid payload');
22
+ return {
23
+ action: 'UI_INITIALIZE',
24
+ success: false,
25
+ info: {
26
+ message: 'Invalid payload',
27
+ },
28
+ };
29
+ }
30
+ this.#auth = new ADTPulseAuth({
31
+ subdomain: parsedPayload.data.subdomain,
32
+ username: parsedPayload.data.username,
33
+ password: parsedPayload.data.password,
34
+ }, {
35
+ debug: false,
36
+ });
37
+ this.#userInput = {
38
+ subdomain: parsedPayload.data.subdomain,
39
+ username: parsedPayload.data.username,
40
+ password: parsedPayload.data.password,
41
+ };
42
+ return {
43
+ action: 'UI_INITIALIZE',
44
+ success: true,
45
+ info: null,
46
+ };
47
+ }
48
+ async getMethods() {
49
+ if (this.#auth === undefined || this.#userInput === undefined) {
50
+ debugLog(null, 'server.ts / ADTPulseConfigServer.getMethods()', 'error', 'Auth API has not been initialized');
51
+ return {
52
+ action: 'UI_GET_METHODS',
53
+ success: false,
54
+ info: {
55
+ message: 'Auth API has not been initialized',
56
+ },
57
+ };
58
+ }
59
+ try {
60
+ const response = await this.#auth.getVerificationMethods();
61
+ if (!response.success) {
62
+ if (response.info.message) {
63
+ debugLog(null, 'server.ts / ADTPulseConfigServer.getMethods()', 'error', response.info.message);
64
+ }
65
+ return {
66
+ action: 'UI_GET_METHODS',
67
+ success: false,
68
+ info: response.info,
69
+ };
70
+ }
71
+ return {
72
+ action: 'UI_GET_METHODS',
73
+ success: true,
74
+ info: response.info,
75
+ };
76
+ }
77
+ catch (error) {
78
+ throw new RequestError('Failed to get methods', {
79
+ message: error,
80
+ });
81
+ }
82
+ }
83
+ async requestCode(payload) {
84
+ if (this.#auth === undefined || this.#userInput === undefined) {
85
+ debugLog(null, 'server.ts / ADTPulseConfigServer.requestCode()', 'error', 'Auth API has not been initialized');
86
+ return {
87
+ action: 'UI_REQUEST_CODE',
88
+ success: false,
89
+ info: {
90
+ message: 'Auth API has not been initialized',
91
+ },
92
+ };
93
+ }
94
+ const parsedPayload = configServerRequestCode.safeParse(payload);
95
+ if (!parsedPayload.success) {
96
+ debugLog(null, 'server.ts / ADTPulseConfigServer.requestCode()', 'error', 'Invalid payload');
97
+ return {
98
+ action: 'UI_REQUEST_CODE',
99
+ success: false,
100
+ info: {
101
+ message: 'Invalid payload',
102
+ },
103
+ };
104
+ }
105
+ try {
106
+ const response = await this.#auth.requestCode(parsedPayload.data.methodId);
107
+ if (!response.success) {
108
+ if (response.info.message) {
109
+ debugLog(null, 'server.ts / ADTPulseConfigServer.requestCode()', 'error', response.info.message);
110
+ }
111
+ return {
112
+ action: 'UI_REQUEST_CODE',
113
+ success: false,
114
+ info: response.info,
115
+ };
116
+ }
117
+ return {
118
+ action: 'UI_REQUEST_CODE',
119
+ success: true,
120
+ info: response.info,
121
+ };
122
+ }
123
+ catch (error) {
124
+ const serializedError = serializeError(error);
125
+ debugLog(null, 'server.ts / ADTPulseConfigServer.requestCode()', 'error', 'Method encountered an error during execution');
126
+ return {
127
+ action: 'UI_REQUEST_CODE',
128
+ success: false,
129
+ info: {
130
+ error: serializedError,
131
+ },
132
+ };
133
+ }
134
+ }
135
+ async validate(payload) {
136
+ if (this.#auth === undefined || this.#userInput === undefined) {
137
+ debugLog(null, 'server.ts / ADTPulseConfigServer.validate()', 'error', 'Auth API has not been initialized');
138
+ return {
139
+ action: 'UI_VALIDATE',
140
+ success: false,
141
+ info: {
142
+ message: 'Auth API has not been initialized',
143
+ },
144
+ };
145
+ }
146
+ const parsedPayload = configServerValidate.safeParse(payload);
147
+ if (!parsedPayload.success) {
148
+ debugLog(null, 'server.ts / ADTPulseConfigServer.validate()', 'error', 'Invalid payload');
149
+ return {
150
+ action: 'UI_VALIDATE',
151
+ success: false,
152
+ info: {
153
+ message: 'Invalid payload',
154
+ },
155
+ };
156
+ }
157
+ try {
158
+ const requests = [
159
+ this.#auth.validateCode.bind(this.#auth, parsedPayload.data.otpCode),
160
+ this.#auth.getTrustedDevices.bind(this.#auth),
161
+ this.#auth.addTrustedDevice.bind(this.#auth, parsedPayload.data.deviceName),
162
+ this.#auth.completeSignIn.bind(this.#auth),
163
+ ];
164
+ for (let i = 0; i < requests.length; i += 1) {
165
+ const response = await requests[i]();
166
+ if (!response.success) {
167
+ if (response.info.message) {
168
+ debugLog(null, 'server.ts / ADTPulseConfigServer.validate()', 'error', response.info.message);
169
+ }
170
+ return {
171
+ action: 'UI_VALIDATE',
172
+ success: false,
173
+ info: response.info,
174
+ };
175
+ }
176
+ }
177
+ return {
178
+ action: 'UI_VALIDATE',
179
+ success: true,
180
+ info: null,
181
+ };
182
+ }
183
+ catch (error) {
184
+ const serializedError = serializeError(error);
185
+ debugLog(null, 'server.ts / ADTPulseConfigServer.validate()', 'error', 'Method encountered an error during execution');
186
+ return {
187
+ action: 'UI_VALIDATE',
188
+ success: false,
189
+ info: {
190
+ error: serializedError,
191
+ },
192
+ };
193
+ }
194
+ }
195
+ async generateConfig(payload) {
196
+ if (this.#auth === undefined || this.#userInput === undefined) {
197
+ debugLog(null, 'server.ts / ADTPulseConfigServer.generateConfig()', 'error', 'Auth API has not been initialized');
198
+ return {
199
+ action: 'UI_GENERATE_CONFIG',
200
+ success: false,
201
+ info: {
202
+ message: 'Auth API has not been initialized',
203
+ },
204
+ };
205
+ }
206
+ try {
207
+ let payloadSensors = payload.oldConfig.sensors ?? [];
208
+ if (payload.updateSensors === true) {
209
+ const response = await this.#auth.getSensors();
210
+ if (!response.success) {
211
+ return {
212
+ action: 'UI_GENERATE_CONFIG',
213
+ success: false,
214
+ info: {
215
+ message: 'Failed to get new sensors',
216
+ },
217
+ };
218
+ }
219
+ payloadSensors = _.merge(payloadSensors, response.info.sensors);
220
+ }
221
+ return {
222
+ action: 'UI_GENERATE_CONFIG',
223
+ success: true,
224
+ info: {
225
+ config: {
226
+ platform: payload.oldConfig.platform ?? 'ADTPulse',
227
+ name: payload.oldConfig.name ?? 'ADT Pulse',
228
+ subdomain: this.#userInput.subdomain,
229
+ username: this.#userInput.username,
230
+ password: this.#userInput.password,
231
+ fingerprint: this.#auth.getFingerprint(),
232
+ mode: payload.oldConfig.mode ?? 'normal',
233
+ speed: payload.oldConfig.speed ?? 1,
234
+ options: payload.oldConfig.options ?? [],
235
+ sensors: payloadSensors,
236
+ },
237
+ },
238
+ };
239
+ }
240
+ catch (error) {
241
+ const serializedError = serializeError(error);
242
+ debugLog(null, 'server.ts / ADTPulseConfigServer.generateConfig()', 'error', 'Method encountered an error during execution');
243
+ return {
244
+ action: 'UI_GENERATE_CONFIG',
245
+ success: false,
246
+ info: {
247
+ error: serializedError,
248
+ },
249
+ };
250
+ }
251
+ }
252
+ }
253
+ const instance = new ADTPulseConfigServer();
254
+ instance.startBackend();
255
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/config-ui/server.ts"],"names":[],"mappings":"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"}