homebridge-ttlock-accesscode 1.0.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/LICENSE +21 -0
- package/README.md +54 -0
- package/config.schema.json +83 -0
- package/dist/api/ttlockApi.d.ts +29 -0
- package/dist/api/ttlockApi.js +255 -0
- package/dist/api/ttlockApi.js.map +1 -0
- package/dist/config.d.ts +30 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/homekitDevice.d.ts +44 -0
- package/dist/homekitDevice.js +506 -0
- package/dist/homekitDevice.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/platform.d.ts +42 -0
- package/dist/platform.js +336 -0
- package/dist/platform.js.map +1 -0
- package/dist/platformAccessoryInformation.d.ts +3 -0
- package/dist/platformAccessoryInformation.js +35 -0
- package/dist/platformAccessoryInformation.js.map +1 -0
- package/dist/settings.d.ts +2 -0
- package/dist/settings.js +3 -0
- package/dist/settings.js.map +1 -0
- package/dist/types/index.d.ts +39 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils.d.ts +6 -0
- package/dist/utils.js +57 -0
- package/dist/utils.js.map +1 -0
- package/package.json +74 -0
package/dist/platform.js
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { parseConfig } from './config.js';
|
|
3
|
+
import { TTLockHomeKitDevice } from './homekitDevice.js';
|
|
4
|
+
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
|
5
|
+
import { lookup, lookupCharacteristicNameByUUID, isObjectLike } from './utils.js';
|
|
6
|
+
import { TTLockApi } from './api/ttlockApi.js';
|
|
7
|
+
export class TTLockAccessCodePlatform {
|
|
8
|
+
log;
|
|
9
|
+
api;
|
|
10
|
+
homekitDevicesById = new Map();
|
|
11
|
+
configuredAccessories = new Map();
|
|
12
|
+
offlineAccessories = new Map();
|
|
13
|
+
config;
|
|
14
|
+
isShuttingDown = false;
|
|
15
|
+
ongoingTasks = [];
|
|
16
|
+
periodicDeviceDiscoveryEmitter = new EventEmitter();
|
|
17
|
+
periodicDeviceDiscovering = false;
|
|
18
|
+
ttLockApi;
|
|
19
|
+
constructor(log, config, api) {
|
|
20
|
+
this.log = log;
|
|
21
|
+
this.api = api;
|
|
22
|
+
this.config = parseConfig(config);
|
|
23
|
+
this.api.on('didFinishLaunching', async () => {
|
|
24
|
+
this.log.info('TTLockAccessCode Platform finished launching');
|
|
25
|
+
try {
|
|
26
|
+
await this.createAndAuthenticateApi();
|
|
27
|
+
await this.discoverDevices();
|
|
28
|
+
this.log.debug('Setting up periodic device discovery');
|
|
29
|
+
setInterval(async () => {
|
|
30
|
+
await this.periodicDeviceDiscovery();
|
|
31
|
+
}, this.config.discoveryOptions.discoveryPollingInterval);
|
|
32
|
+
this.log.debug('Periodic device discovery setup completed');
|
|
33
|
+
if (this.offlineAccessories.size > 0) {
|
|
34
|
+
this.log.debug('Unregistering offline accessories');
|
|
35
|
+
this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, Array.from(this.offlineAccessories.values()));
|
|
36
|
+
this.offlineAccessories.clear();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
this.log.error('An error occurred during startup:', error);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
this.api.on('shutdown', async () => {
|
|
44
|
+
this.log.debug('TTLockAccessCode platform shutting down');
|
|
45
|
+
this.isShuttingDown = true;
|
|
46
|
+
await Promise.all(this.ongoingTasks);
|
|
47
|
+
this.log.debug('All ongoing tasks completed. Platform is now shutting down.');
|
|
48
|
+
});
|
|
49
|
+
this.periodicDeviceDiscoveryEmitter.setMaxListeners(150);
|
|
50
|
+
}
|
|
51
|
+
async createAndAuthenticateApi() {
|
|
52
|
+
this.log.debug('Creating and authenticating TTLock API');
|
|
53
|
+
try {
|
|
54
|
+
this.ttLockApi = new TTLockApi(this.log, this.config.clientId, this.config.clientSecret);
|
|
55
|
+
await this.ttLockApi.authenticate(this.config.username, this.config.password);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
this.log.error('Failed to authenticate with TTLock API:', error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async discoverDevices() {
|
|
62
|
+
this.log.debug('Discovering devices');
|
|
63
|
+
if (!this.ttLockApi) {
|
|
64
|
+
this.log.error('TTLock API not initialized');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const locks = await this.ttLockApi.getLocks();
|
|
69
|
+
const detailedLocks = await this.getDetailedLocks(locks);
|
|
70
|
+
for (const detailedLock of detailedLocks) {
|
|
71
|
+
this.foundDevice(detailedLock);
|
|
72
|
+
}
|
|
73
|
+
this.periodicDeviceDiscoveryEmitter.setMaxListeners(detailedLocks.length + 10);
|
|
74
|
+
const maxListenerCount = this.periodicDeviceDiscoveryEmitter.getMaxListeners();
|
|
75
|
+
this.log.debug('periodicDeviceDiscoveryEmitter max listener count:', maxListenerCount);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
this.log.error('Error discovering devices:', error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async getDetailedLocks(locks) {
|
|
82
|
+
if (!this.ttLockApi) {
|
|
83
|
+
return Promise.reject(new Error('TTLock API not initialized'));
|
|
84
|
+
}
|
|
85
|
+
const detailedLocks = [];
|
|
86
|
+
for (const lock of locks) {
|
|
87
|
+
this.log.debug(`Processing lock: ${lock.lockId}`);
|
|
88
|
+
const lockDetails = await this.ttLockApi.getLockDetails(lock.lockId);
|
|
89
|
+
const lockState = await this.ttLockApi.getLockState(lock.lockId);
|
|
90
|
+
const lockBattery = await this.ttLockApi.getBatteryLevel(lock.lockId);
|
|
91
|
+
const lockPassCodes = await this.ttLockApi.getPasscodes(lock.lockId);
|
|
92
|
+
const detailedLock = await this.ttLockApi.mapToLock(lockDetails, lockState, lockBattery, lockPassCodes);
|
|
93
|
+
this.log.debug(`Detailed lock: ${JSON.stringify(detailedLock)}`);
|
|
94
|
+
detailedLocks.push(detailedLock);
|
|
95
|
+
}
|
|
96
|
+
return detailedLocks;
|
|
97
|
+
}
|
|
98
|
+
foundDevice(device) {
|
|
99
|
+
const { alias: deviceAlias, id: deviceId } = device;
|
|
100
|
+
if (!deviceId) {
|
|
101
|
+
this.log.error('Missing deviceId:', deviceAlias);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (this.homekitDevicesById.has(deviceId)) {
|
|
105
|
+
this.log.info(`HomeKit device already added: [${deviceAlias}] [${deviceId}]`);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this.log.info(`Adding HomeKit device: [${deviceAlias}] [${deviceId}]`);
|
|
109
|
+
const homekitDevice = new TTLockHomeKitDevice(this, device);
|
|
110
|
+
if (homekitDevice) {
|
|
111
|
+
this.homekitDevicesById.set(deviceId, homekitDevice);
|
|
112
|
+
this.log.debug(`HomeKit device [${deviceAlias}] [${deviceId}] successfully added`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
this.log.error(`Failed to add HomeKit device for: [${deviceAlias}] [${deviceId}]`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async periodicDeviceDiscovery() {
|
|
119
|
+
if (this.periodicDeviceDiscovering) {
|
|
120
|
+
this.log.debug('Periodic device discovery is already in progress');
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (!this.ttLockApi) {
|
|
124
|
+
this.log.error('TTLock API not initialized');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
this.periodicDeviceDiscovering = true;
|
|
128
|
+
try {
|
|
129
|
+
this.log.debug('Starting periodic device discovery');
|
|
130
|
+
const locks = await this.ttLockApi.getLocks();
|
|
131
|
+
const detailedLocks = await this.getDetailedLocks(locks);
|
|
132
|
+
const now = new Date();
|
|
133
|
+
const offlineInterval = this.config.discoveryOptions.offlineInterval;
|
|
134
|
+
this.configuredAccessories.forEach((platformAccessory, uuid) => {
|
|
135
|
+
const deviceId = platformAccessory.context.id;
|
|
136
|
+
if (deviceId) {
|
|
137
|
+
const device = this.findDiscoveredDevice(detailedLocks, platformAccessory);
|
|
138
|
+
if (device) {
|
|
139
|
+
this.updateAccessoryDeviceStatus(platformAccessory, device, now);
|
|
140
|
+
this.updateOrCreateHomeKitDevice(deviceId, device);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
this.updateAccessoryStatus(platformAccessory);
|
|
144
|
+
this.handleOfflineAccessory(platformAccessory, uuid, now, offlineInterval);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
this.periodicDeviceDiscovering = false;
|
|
151
|
+
this.log.debug('Ending periodic device discovery');
|
|
152
|
+
this.periodicDeviceDiscoveryEmitter.emit('periodicDeviceDiscoveryComplete');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
findDiscoveredDevice(discoveredDevices, platformAccessory) {
|
|
156
|
+
this.log.debug(`Finding discovered device with Platform Accessory ${platformAccessory.displayName}`);
|
|
157
|
+
try {
|
|
158
|
+
const device = discoveredDevices.find(device => device.id === platformAccessory.context.id);
|
|
159
|
+
if (device) {
|
|
160
|
+
this.log.debug(`Discovered device ${device.alias}`);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
this.log.debug(`No discovered device found with Platform Accessory ${platformAccessory.displayName}`);
|
|
164
|
+
}
|
|
165
|
+
return device;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
this.log.error(`Error finding discovered device with Platform Accessory ${platformAccessory.displayName}: ${error}`);
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
updateAccessoryDeviceStatus(platformAccessory, device, now) {
|
|
173
|
+
this.log.debug(`Updating Platform Accessory and HomeKit device statuses for ${platformAccessory.displayName}`);
|
|
174
|
+
try {
|
|
175
|
+
this.log.debug(`Setting HomeKit device ${device.alias} last seen time to now and marking as online`);
|
|
176
|
+
device.lastSeen = now;
|
|
177
|
+
device.offline = false;
|
|
178
|
+
this.log.debug(`Setting Platform Accessory ${platformAccessory.displayName} last seen time to now and marking as online`);
|
|
179
|
+
platformAccessory.context.lastSeen = now;
|
|
180
|
+
platformAccessory.context.offline = false;
|
|
181
|
+
this.log.debug(`Updating Platform Accessory ${platformAccessory.displayName}`);
|
|
182
|
+
this.api.updatePlatformAccessories([platformAccessory]);
|
|
183
|
+
this.log.debug(`Platform Accessory and HomeKit device statuses for ${platformAccessory.displayName} updated successfully`);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
this.log.error(`Error updating Platform Accessory and HomeKit device statuses for ${platformAccessory.displayName}: ${error}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
updateOrCreateHomeKitDevice(deviceId, device) {
|
|
190
|
+
this.log.debug(`Updating or creating HomeKit device ${device.alias}`);
|
|
191
|
+
try {
|
|
192
|
+
if (this.homekitDevicesById.has(deviceId)) {
|
|
193
|
+
this.log.debug(`HomeKit device ${device.alias} already exists.`);
|
|
194
|
+
const existingDevice = this.homekitDevicesById.get(deviceId);
|
|
195
|
+
if (existingDevice) {
|
|
196
|
+
if (!existingDevice.isUpdating) {
|
|
197
|
+
if (existingDevice.lock.offline === true && device.offline === false) {
|
|
198
|
+
this.log.debug(`HomeKit device ${device.alias} was offline and is now online. ` +
|
|
199
|
+
'Updating device and starting polling.');
|
|
200
|
+
existingDevice.lock = device;
|
|
201
|
+
existingDevice.startPolling();
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.log.debug(`Updating existing HomeKit device ${device.alias}`);
|
|
205
|
+
existingDevice.lock = device;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
this.log.debug(`HomeKit device ${device.alias} is currently updating. Skipping update.`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
this.log.error(`Failed to retrieve existing HomeKit device ${device.alias} from homekitDevicesById.`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
this.log.debug(`HomeKit device ${device.alias} does not exist.`);
|
|
218
|
+
this.foundDevice(device);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
this.log.error(`Error updating or creating HomeKit device ${device.alias}: ${error}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
updateAccessoryStatus(platformAccessory) {
|
|
226
|
+
try {
|
|
227
|
+
this.log.debug(`Setting Platform Accessory ${platformAccessory.displayName} offline status to true`);
|
|
228
|
+
platformAccessory.context.offline = true;
|
|
229
|
+
this.api.updatePlatformAccessories([platformAccessory]);
|
|
230
|
+
this.log.debug(`Platform Accessory ${platformAccessory.displayName} status updated successfully`);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
this.log.error(`Error updating Platform Accessory ${platformAccessory.displayName} status: ${error}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
handleOfflineAccessory(platformAccessory, uuid, now, offlineInterval) {
|
|
237
|
+
this.log.debug(`Handling offline Platform Accessory ${platformAccessory.displayName}`);
|
|
238
|
+
try {
|
|
239
|
+
const homekitDevice = this.homekitDevicesById.get(platformAccessory.context.deviceId);
|
|
240
|
+
if (homekitDevice) {
|
|
241
|
+
const timeSinceLastSeen = now.getTime() - new Date(homekitDevice.lock.lastSeen).getTime();
|
|
242
|
+
this.log.debug(`Time since last seen for Platform Accessory ${platformAccessory.displayName}: ${timeSinceLastSeen}ms, ` +
|
|
243
|
+
`offline interval: ${offlineInterval}ms`);
|
|
244
|
+
if (timeSinceLastSeen < offlineInterval) {
|
|
245
|
+
this.log.debug(`Platform Accessory ${platformAccessory.displayName} is offline and within offline interval.`);
|
|
246
|
+
homekitDevice.lock.offline = true;
|
|
247
|
+
}
|
|
248
|
+
else if (timeSinceLastSeen > offlineInterval) {
|
|
249
|
+
this.log.info(`Platform Accessory ${platformAccessory.displayName} is offline and outside the offline interval, removing.`);
|
|
250
|
+
this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [platformAccessory]);
|
|
251
|
+
this.configuredAccessories.delete(uuid);
|
|
252
|
+
this.log.debug(`Platform Accessory [${platformAccessory.displayName}] removed successfully.`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else if (platformAccessory.context.offline === true) {
|
|
256
|
+
const timeSinceLastSeen = now.getTime() - new Date(platformAccessory.context.lastSeen).getTime();
|
|
257
|
+
this.log.debug(`Time since last seen for Platform Accessory ${platformAccessory.displayName}: ${timeSinceLastSeen}ms, ` +
|
|
258
|
+
`offline interval: ${offlineInterval}ms`);
|
|
259
|
+
if (timeSinceLastSeen < offlineInterval) {
|
|
260
|
+
this.log.debug(`Platform Accessory [${platformAccessory.displayName}] is offline and within offline interval.`);
|
|
261
|
+
this.updateAccessoryStatus(platformAccessory);
|
|
262
|
+
}
|
|
263
|
+
else if (timeSinceLastSeen > offlineInterval) {
|
|
264
|
+
this.log.info(`Platform Accessory ${platformAccessory.displayName} is offline and outside the offline interval, removing.`);
|
|
265
|
+
this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [platformAccessory]);
|
|
266
|
+
this.configuredAccessories.delete(uuid);
|
|
267
|
+
this.log.debug(`Platform Accessory [${platformAccessory.displayName}] removed successfully.`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
this.log.error(`Error handling offline Platform Accessory ${platformAccessory.displayName}: ${error}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
registerPlatformAccessory(platformAccessory) {
|
|
276
|
+
this.log.debug('Registering platform platformAccessory:', platformAccessory.displayName);
|
|
277
|
+
if (!this.configuredAccessories.has(platformAccessory.UUID)) {
|
|
278
|
+
this.log.debug(`Platform Accessory ${platformAccessory.displayName} is not in configuredAccessories, adding it.`);
|
|
279
|
+
this.configuredAccessories.set(platformAccessory.UUID, platformAccessory);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
this.log.debug(`Platform Accessory ${platformAccessory.displayName} is already in configuredAccessories.`);
|
|
283
|
+
}
|
|
284
|
+
this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [platformAccessory]);
|
|
285
|
+
this.log.debug(`Platform Accessory ${platformAccessory.displayName} registered with Homebridge.`);
|
|
286
|
+
}
|
|
287
|
+
configureAccessory(platformAccessory) {
|
|
288
|
+
this.log.debug(`Configuring Platform Accessory: [${platformAccessory.displayName}] UUID: ${platformAccessory.UUID}`);
|
|
289
|
+
if (!platformAccessory.context.lastSeen && !platformAccessory.context.offline) {
|
|
290
|
+
this.log.debug(`Setting initial lastSeen and offline status for Platform Accessory: [${platformAccessory.displayName}]`);
|
|
291
|
+
platformAccessory.context.lastSeen = new Date();
|
|
292
|
+
platformAccessory.context.offline = false;
|
|
293
|
+
}
|
|
294
|
+
if (platformAccessory.context.lastSeen) {
|
|
295
|
+
const now = new Date();
|
|
296
|
+
const timeSinceLastSeen = now.getTime() - new Date(platformAccessory.context.lastSeen).getTime();
|
|
297
|
+
const offlineInterval = this.config.discoveryOptions.offlineInterval;
|
|
298
|
+
this.log.debug(`Platform Accessory [${platformAccessory.displayName}] last seen ${timeSinceLastSeen}ms ago, ` +
|
|
299
|
+
`offline interval is ${offlineInterval}ms, offline status: ${platformAccessory.context.offline}`);
|
|
300
|
+
if (timeSinceLastSeen > offlineInterval && platformAccessory.context.offline === true) {
|
|
301
|
+
this.log.info(`Platform Accessory [${platformAccessory.displayName}] is offline and outside the offline interval, ` +
|
|
302
|
+
'moving to offlineAccessories');
|
|
303
|
+
this.configuredAccessories.delete(platformAccessory.UUID);
|
|
304
|
+
this.offlineAccessories.set(platformAccessory.UUID, platformAccessory);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
else if (timeSinceLastSeen < offlineInterval && platformAccessory.context.offline === true) {
|
|
308
|
+
this.log.debug(`Platform Accessory [${platformAccessory.displayName}] is offline and within offline interval.`);
|
|
309
|
+
}
|
|
310
|
+
else if (platformAccessory.context.offline === false) {
|
|
311
|
+
this.log.debug(`Platform Accessory [${platformAccessory.displayName}] is online, updating lastSeen time.`);
|
|
312
|
+
platformAccessory.context.lastSeen = now;
|
|
313
|
+
this.api.updatePlatformAccessories([platformAccessory]);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (!this.configuredAccessories.has(platformAccessory.UUID)) {
|
|
317
|
+
this.log.debug(`Platform Accessory [${platformAccessory.displayName}] with UUID ` +
|
|
318
|
+
`[${platformAccessory.UUID}] is not in configuredAccessories, adding it.`);
|
|
319
|
+
this.configuredAccessories.set(platformAccessory.UUID, platformAccessory);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
this.log.debug(`Platform Accessory [${platformAccessory.displayName}] with UUID [${platformAccessory.UUID}] is already in configuredAccessories.`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
getServiceName(service) {
|
|
326
|
+
const serviceName = lookup(this.api.hap.Service, (thisKeyValue, value) => isObjectLike(thisKeyValue) && 'UUID' in thisKeyValue && thisKeyValue.UUID === value, service.UUID);
|
|
327
|
+
return serviceName;
|
|
328
|
+
}
|
|
329
|
+
getCharacteristicName(characteristic) {
|
|
330
|
+
const name = characteristic.name;
|
|
331
|
+
const displayName = characteristic.displayName;
|
|
332
|
+
const lookupName = lookupCharacteristicNameByUUID(this.api.hap.Characteristic, characteristic.UUID);
|
|
333
|
+
return name ?? displayName ?? lookupName;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,8BAA8B,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAU/C,MAAM,OAAO,wBAAwB;IAYjB;IAEA;IAbD,kBAAkB,GAAqC,IAAI,GAAG,EAAE,CAAC;IAClE,qBAAqB,GAA2D,IAAI,GAAG,EAAE,CAAC;IAC1F,kBAAkB,GAA2D,IAAI,GAAG,EAAE,CAAC;IAChG,MAAM,CAAyB;IAC/B,cAAc,GAAG,KAAK,CAAC;IACvB,YAAY,GAAoB,EAAE,CAAC;IACnC,8BAA8B,GAAG,IAAI,YAAY,EAAE,CAAC;IACpD,yBAAyB,GAAG,KAAK,CAAC;IAClC,SAAS,CAAwB;IAExC,YACkB,GAAY,EAC5B,MAAsB,EACN,GAAQ;QAFR,QAAG,GAAH,GAAG,CAAS;QAEZ,QAAG,GAAH,GAAG,CAAK;QAExB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAElC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YAC9D,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBACtC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBACvD,WAAW,CAAC,KAAK,IAAI,EAAE;oBACrB,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACvC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;gBAC1D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC5D,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;oBACpD,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;oBACjH,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC1D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACpC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACzF,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACzD,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;gBACzC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC;YAED,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAC/E,MAAM,gBAAgB,GAAG,IAAI,CAAC,8BAA8B,CAAC,eAAe,EAAE,CAAC;YAC/E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oDAAoD,EAAE,gBAAgB,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAAiB;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,aAAa,GAAW,EAAE,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAClD,MAAM,WAAW,GAAgB,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClF,MAAM,SAAS,GAAc,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5E,MAAM,WAAW,GAAiB,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpF,MAAM,aAAa,GAAiB,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnF,MAAM,YAAY,GAAS,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YAC9G,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjE,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,WAAW,CAAC,MAAY;QAC9B,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QAEpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kCAAkC,WAAW,MAAM,QAAQ,GAAG,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,WAAW,MAAM,QAAQ,GAAG,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,WAAW,MAAM,QAAQ,sBAAsB,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,WAAW,MAAM,QAAQ,GAAG,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACnC,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACtC,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC;YAErE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE;gBAC7D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;oBAC3E,IAAI,MAAM,EAAE,CAAC;wBACX,IAAI,CAAC,2BAA2B,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;wBACjE,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBACrD,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;wBAC9C,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;oBAC7E,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACnD,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAEO,oBAAoB,CAC1B,iBAAyB,EACzB,iBAA4D;QAE5D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qDAAqD,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC;QAErG,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE5F,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sDAAsD,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC;YACxG,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2DAA2D,iBAAiB,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC,CAAC;YACrH,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,2BAA2B,CACjC,iBAA4D,EAC5D,MAAY,EACZ,GAAS;QAET,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+DAA+D,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC;QAE/G,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,KAAK,8CAA8C,CAAC,CAAC;YACrG,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC;YACtB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;YAEvB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,iBAAiB,CAAC,WAAW,8CAA8C,CAAC,CAAC;YAC1H,iBAAiB,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC;YACzC,iBAAiB,CAAC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;YAE1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAExD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sDAAsD,iBAAiB,CAAC,WAAW,uBAAuB,CAAC,CAAC;QAC7H,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qEAAqE,iBAAiB,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC,CAAC;QACjI,CAAC;IACH,CAAC;IAEO,2BAA2B,CAAC,QAAgB,EAAE,MAAY;QAChE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,KAAK,kBAAkB,CAAC,CAAC;gBACjE,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7D,IAAI,cAAc,EAAE,CAAC;oBACnB,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;wBAC/B,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;4BACrE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,KAAK,kCAAkC;gCAC7E,uCAAuC,CAAC,CAAC;4BAC3C,cAAc,CAAC,IAAI,GAAG,MAAM,CAAC;4BAC7B,cAAc,CAAC,YAAY,EAAE,CAAC;wBAChC,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;4BACnE,cAAc,CAAC,IAAI,GAAG,MAAM,CAAC;wBAC/B,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,KAAK,0CAA0C,CAAC,CAAC;oBAC3F,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8CAA8C,MAAM,CAAC,KAAK,2BAA2B,CAAC,CAAC;gBACxG,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,KAAK,kBAAkB,CAAC,CAAC;gBACjE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6CAA6C,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,iBAAoC;QAChE,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,iBAAiB,CAAC,WAAW,yBAAyB,CAAC,CAAC;YACrG,iBAAiB,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YAEzC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAExD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,iBAAiB,CAAC,WAAW,8BAA8B,CAAC,CAAC;QACpG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,iBAAiB,CAAC,WAAW,YAAY,KAAK,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,iBAAoC,EAAE,IAAY,EAAE,GAAS,EAAE,eAAuB;QACnH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC;QAEvF,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtF,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1F,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,+CAA+C,iBAAiB,CAAC,WAAW,KAAK,iBAAiB,MAAM;oBACxG,qBAAqB,eAAe,IAAI,CACzC,CAAC;gBAEF,IAAI,iBAAiB,GAAG,eAAe,EAAE,CAAC;oBACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,iBAAiB,CAAC,WAAW,0CAA0C,CAAC,CAAC;oBAC9G,aAAa,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpC,CAAC;qBAAM,IAAI,iBAAiB,GAAG,eAAe,EAAE,CAAC;oBAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,iBAAiB,CAAC,WAAW,yDAAyD,CAAC,CAAC;oBAC5H,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBACxF,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,iBAAiB,CAAC,WAAW,yBAAyB,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;iBAAM,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtD,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;gBACjG,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,+CAA+C,iBAAiB,CAAC,WAAW,KAAK,iBAAiB,MAAM;oBACxG,qBAAqB,eAAe,IAAI,CACzC,CAAC;gBAEF,IAAI,iBAAiB,GAAG,eAAe,EAAE,CAAC;oBACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,iBAAiB,CAAC,WAAW,2CAA2C,CAAC,CAAC;oBAChH,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;gBAChD,CAAC;qBAAM,IAAI,iBAAiB,GAAG,eAAe,EAAE,CAAC;oBAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,iBAAiB,CAAC,WAAW,yDAAyD,CAAC,CAAC;oBAC5H,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBACxF,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,iBAAiB,CAAC,WAAW,yBAAyB,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6CAA6C,iBAAiB,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED,yBAAyB,CAAC,iBAA4D;QACpF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEzF,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,iBAAiB,CAAC,WAAW,8CAA8C,CAAC,CAAC;YAClH,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,iBAAiB,CAAC,WAAW,uCAAuC,CAAC,CAAC;QAC7G,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,iBAAiB,CAAC,WAAW,8BAA8B,CAAC,CAAC;IACpG,CAAC;IAED,kBAAkB,CAAC,iBAA4D;QAC7E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,iBAAiB,CAAC,WAAW,WAAW,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;QAErH,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC9E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wEAAwE,iBAAiB,CAAC,WAAW,GAAG,CAAC,CAAC;YACzH,iBAAiB,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAChD,iBAAiB,CAAC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5C,CAAC;QAED,IAAI,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;YACjG,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC;YAErE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,iBAAiB,CAAC,WAAW,eAAe,iBAAiB,UAAU;gBAC3G,uBAAuB,eAAe,uBAAuB,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAEpG,IAAI,iBAAiB,GAAG,eAAe,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,iBAAiB,CAAC,WAAW,iDAAiD;oBACjH,8BAA8B,CAAC,CAAC;gBAClC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC1D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;iBAAM,IAAI,iBAAiB,GAAG,eAAe,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,iBAAiB,CAAC,WAAW,2CAA2C,CAAC,CAAC;YAClH,CAAC;iBAAM,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBACvD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,iBAAiB,CAAC,WAAW,sCAAsC,CAAC,CAAC;gBAC3G,iBAAiB,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,uBAAuB,iBAAiB,CAAC,WAAW,cAAc;gBAClE,IAAI,iBAAiB,CAAC,IAAI,+CAA+C,CAC1E,CAAC;YACF,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,uBAAuB,iBAAiB,CAAC,WAAW,gBAAgB,iBAAiB,CAAC,IAAI,wCAAwC,CACnI,CAAC;QACJ,CAAC;IACH,CAAC;IAED,cAAc,CAAC,OAAyB;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CACvE,YAAY,CAAC,YAAY,CAAC,IAAI,MAAM,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACrG,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,qBAAqB,CAAC,cAA+E;QACnG,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC;QAC/C,MAAM,UAAU,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QACpG,OAAO,IAAI,IAAI,WAAW,IAAI,UAAU,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { HAP, PlatformAccessory, Service } from 'homebridge';
|
|
2
|
+
import type { TTLockHomeKitDevice } from './homekitDevice.js';
|
|
3
|
+
export default function platformAccessoryInformation(hap: HAP): (platformAccessory: PlatformAccessory, homekitDevice: TTLockHomeKitDevice) => Service | undefined;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export default function platformAccessoryInformation(hap) {
|
|
2
|
+
const { Characteristic, Service: { AccessoryInformation } } = hap;
|
|
3
|
+
return (platformAccessory, homekitDevice) => {
|
|
4
|
+
const existingInfoService = platformAccessory.getService(AccessoryInformation);
|
|
5
|
+
if (existingInfoService) {
|
|
6
|
+
if (existingInfoService.getCharacteristic(Characteristic.Name).value !== homekitDevice.name) {
|
|
7
|
+
existingInfoService.setCharacteristic(Characteristic.Name, homekitDevice.name);
|
|
8
|
+
}
|
|
9
|
+
else if (existingInfoService.getCharacteristic(Characteristic.Manufacturer).value !== homekitDevice.manufacturer) {
|
|
10
|
+
existingInfoService.setCharacteristic(Characteristic.Manufacturer, homekitDevice.manufacturer);
|
|
11
|
+
}
|
|
12
|
+
else if (existingInfoService.getCharacteristic(Characteristic.Model).value !== homekitDevice.model) {
|
|
13
|
+
existingInfoService.setCharacteristic(Characteristic.Model, homekitDevice.model);
|
|
14
|
+
}
|
|
15
|
+
else if (existingInfoService.getCharacteristic(Characteristic.SerialNumber).value !== homekitDevice.serialNumber) {
|
|
16
|
+
existingInfoService.setCharacteristic(Characteristic.SerialNumber, homekitDevice.serialNumber);
|
|
17
|
+
}
|
|
18
|
+
else if (existingInfoService.getCharacteristic(Characteristic.FirmwareRevision).value !== homekitDevice.firmwareRevision) {
|
|
19
|
+
existingInfoService.setCharacteristic(Characteristic.FirmwareRevision, homekitDevice.firmwareRevision);
|
|
20
|
+
}
|
|
21
|
+
return existingInfoService;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const infoService = platformAccessory.addService(AccessoryInformation);
|
|
25
|
+
infoService
|
|
26
|
+
.setCharacteristic(Characteristic.Name, homekitDevice.name)
|
|
27
|
+
.setCharacteristic(Characteristic.Manufacturer, homekitDevice.manufacturer)
|
|
28
|
+
.setCharacteristic(Characteristic.Model, homekitDevice.model)
|
|
29
|
+
.setCharacteristic(Characteristic.SerialNumber, homekitDevice.serialNumber)
|
|
30
|
+
.setCharacteristic(Characteristic.FirmwareRevision, homekitDevice.firmwareRevision);
|
|
31
|
+
return infoService;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=platformAccessoryInformation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformAccessoryInformation.js","sourceRoot":"","sources":["../src/platformAccessoryInformation.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAClD,GAAQ;IAER,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,EAAE,GAAG,GAAG,CAAC;IAElE,OAAO,CAAC,iBAAoC,EAAE,aAAkC,EAAE,EAAE;QAClF,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAC/E,IAAI,mBAAmB,EAAE,CAAC;YACxB,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;gBAC5F,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;YACjF,CAAC;iBAAM,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,YAAY,EAAE,CAAC;gBACnH,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;YACjG,CAAC;iBAAM,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;gBACrG,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;YACnF,CAAC;iBAAM,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,YAAY,EAAE,CAAC;gBACnH,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;YACjG,CAAC;iBAAM,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,gBAAgB,EAAE,CAAC;gBAC3H,mBAAmB,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;YACzG,CAAC;YACD,OAAO,mBAAmB,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;YAEvE,WAAW;iBACR,iBAAiB,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;iBAC1D,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC;iBAC1E,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;iBAC5D,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC;iBAC1E,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;YAEtF,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/settings.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface Lock {
|
|
2
|
+
id: string;
|
|
3
|
+
alias: string;
|
|
4
|
+
mac: string;
|
|
5
|
+
model: string;
|
|
6
|
+
hardwareRevision: string;
|
|
7
|
+
firmwareRevision: string;
|
|
8
|
+
state: number;
|
|
9
|
+
battery: number;
|
|
10
|
+
passCodes: Passcode[];
|
|
11
|
+
offline: boolean;
|
|
12
|
+
lastSeen: Date;
|
|
13
|
+
}
|
|
14
|
+
export interface LockId {
|
|
15
|
+
lockId: string;
|
|
16
|
+
}
|
|
17
|
+
export type LockIdList = LockId[];
|
|
18
|
+
export interface LockDetails {
|
|
19
|
+
lockId: string;
|
|
20
|
+
lockAlias: string;
|
|
21
|
+
lockMac: string;
|
|
22
|
+
modelNum: string;
|
|
23
|
+
hardwareRevision: string;
|
|
24
|
+
firmwareRevision: string;
|
|
25
|
+
}
|
|
26
|
+
export interface LockState {
|
|
27
|
+
state: number;
|
|
28
|
+
}
|
|
29
|
+
export interface BatteryLevel {
|
|
30
|
+
battery: number;
|
|
31
|
+
}
|
|
32
|
+
export interface Passcode {
|
|
33
|
+
id: string;
|
|
34
|
+
index: string;
|
|
35
|
+
lockId: string;
|
|
36
|
+
passcode: string;
|
|
37
|
+
}
|
|
38
|
+
export type PasscodeList = Passcode[];
|
|
39
|
+
export type TLV8Configuration = Record<string, Buffer>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Characteristic, Logger, Logging } from 'homebridge';
|
|
2
|
+
export declare function deferAndCombine<T, U>(fn: (args: U[]) => Promise<T>, timeout: number, runNowFn?: (arg: U) => void): (arg?: U) => Promise<T>;
|
|
3
|
+
export declare function isObjectLike(candidate: unknown): candidate is Record<string, unknown>;
|
|
4
|
+
export declare function lookup<T>(object: unknown, compareFn: undefined | ((objectProp: unknown, search: T) => boolean), value: T): string;
|
|
5
|
+
export declare function lookupCharacteristicNameByUUID(characteristic: typeof Characteristic, uuid: string): string | undefined;
|
|
6
|
+
export declare function prefixLogger(logger: Logger, prefix: string | (() => string)): Logging;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export function deferAndCombine(fn, timeout, runNowFn) {
|
|
2
|
+
let requests = [];
|
|
3
|
+
let timer = null;
|
|
4
|
+
const processRequests = () => {
|
|
5
|
+
const currentRequests = requests;
|
|
6
|
+
requests = [];
|
|
7
|
+
fn(currentRequests.map(req => req.resolve))
|
|
8
|
+
.then(value => currentRequests.forEach(req => req.resolve(value)))
|
|
9
|
+
.catch(error => currentRequests.forEach(req => req.reject(error)))
|
|
10
|
+
.finally(() => timer = null);
|
|
11
|
+
};
|
|
12
|
+
return (arg) => {
|
|
13
|
+
if (runNowFn && arg !== undefined) {
|
|
14
|
+
runNowFn(arg);
|
|
15
|
+
}
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
requests.push({ resolve, reject });
|
|
18
|
+
if (!timer) {
|
|
19
|
+
timer = setTimeout(processRequests, timeout);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function isObjectLike(candidate) {
|
|
25
|
+
return typeof candidate === 'object' && candidate !== null || typeof candidate === 'function';
|
|
26
|
+
}
|
|
27
|
+
export function lookup(object, compareFn, value) {
|
|
28
|
+
const compare = compareFn ?? ((objectProp, search) => objectProp === search);
|
|
29
|
+
if (isObjectLike(object)) {
|
|
30
|
+
const key = Object.keys(object).find(key => compare(object[key], value));
|
|
31
|
+
return key ?? ''; // Provide a default value if key is undefined
|
|
32
|
+
}
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
export function lookupCharacteristicNameByUUID(characteristic, uuid) {
|
|
36
|
+
return Object.keys(characteristic).find(key => (characteristic[key].UUID === uuid));
|
|
37
|
+
}
|
|
38
|
+
export function prefixLogger(logger, prefix) {
|
|
39
|
+
const methods = ['info', 'warn', 'error', 'debug', 'log'];
|
|
40
|
+
const clonedLogger = methods.reduce((acc, method) => {
|
|
41
|
+
acc[method] = (...args) => {
|
|
42
|
+
const prefixString = typeof prefix === 'function' ? prefix() : prefix;
|
|
43
|
+
if (method === 'log') {
|
|
44
|
+
const [level, message, ...parameters] = args;
|
|
45
|
+
logger[method](level, `${prefixString} ${message}`, ...parameters);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const [message, ...parameters] = args;
|
|
49
|
+
logger[method](`${prefixString} ${message}`, ...parameters);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return acc;
|
|
53
|
+
}, {});
|
|
54
|
+
clonedLogger.prefix = typeof logger.prefix === 'string' ? `${prefix} ${logger.prefix}` : prefix;
|
|
55
|
+
return clonedLogger;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,eAAe,CAC7B,EAA6B,EAC7B,OAAe,EACf,QAA2B;IAE3B,IAAI,QAAQ,GAA0E,EAAE,CAAC;IACzF,IAAI,KAAK,GAA0B,IAAI,CAAC;IAExC,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,eAAe,GAAG,QAAQ,CAAC;QACjC,QAAQ,GAAG,EAAE,CAAC;QACd,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAuB,CAAC,CAAC;aACxD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;aACjE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aACjE,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,OAAO,CAAC,GAAO,EAAE,EAAE;QACjB,IAAI,QAAQ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAEnC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,SAAS,KAAK,UAAU,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,MAAe,EACf,SAAoE,EACpE,KAAQ;IAER,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,CAAC,UAAmB,EAAE,MAAS,EAAW,EAAE,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;IAElG,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACzE,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC,8CAA8C;IAClE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,cAAqC,EACrC,IAAY;IAEZ,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,cAA6D,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;AACtI,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,MAA+B;IAC1E,MAAM,OAAO,GAAuD,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9G,MAAM,YAAY,GAAY,OAAO,CAAC,MAAM,CAAC,CAAC,GAAY,EAAE,MAAM,EAAE,EAAE;QACpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACnC,MAAM,YAAY,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACtE,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,KAAiB,EAAE,GAAG,YAAY,IAAI,OAAO,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,YAAY,IAAI,OAAO,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAa,CAAC,CAAC;IAEjB,YAAoD,CAAC,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAEzI,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"displayName": "Homebridge TTLock Access Code",
|
|
3
|
+
"name": "homebridge-ttlock-accesscode",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "Plugin that uses TTLock Cloud API to communicate with TTLock Devices connected to the G2 Gateway.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/ZeliardM/homebridge-ttlock-accesscode.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/ZeliardM/homebridge-ttlock-accesscode/issues"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"homebridge": "^1.11 || ^2.0",
|
|
17
|
+
"node": "^20 || ^22 || ^24"
|
|
18
|
+
},
|
|
19
|
+
"main": "dist/index.js",
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "npm ci && rimraf -I ./dist && npm run lint && tsc",
|
|
22
|
+
"lint": "eslint src/**/*.ts --max-warnings=0",
|
|
23
|
+
"prepublishOnly": "npm run lint && npm run build",
|
|
24
|
+
"watch": "npm run build && npm link && nodemon"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"access code",
|
|
28
|
+
"accesscode",
|
|
29
|
+
"homebridge-plugin",
|
|
30
|
+
"ttlock",
|
|
31
|
+
"smart-lock"
|
|
32
|
+
],
|
|
33
|
+
"files": [
|
|
34
|
+
"config.schema.json",
|
|
35
|
+
"dist",
|
|
36
|
+
"LICENSE"
|
|
37
|
+
],
|
|
38
|
+
"homepage": "https://github.com/ZeliardM/homebridge-ttlock-accesscode#readme",
|
|
39
|
+
"funding": [
|
|
40
|
+
{
|
|
41
|
+
"type": "github",
|
|
42
|
+
"url": "https://github.com/sponsors/ZeliardM"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"type": "paypal",
|
|
46
|
+
"url": "https://www.paypal.me/ZeliardM/USD"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"async-mutex": "^0.5.0",
|
|
51
|
+
"axios": "^1.11.0",
|
|
52
|
+
"ber-tlv": "^0.9.2",
|
|
53
|
+
"qs": "^6.14.0"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@eslint/eslintrc": "^3.3.1",
|
|
57
|
+
"@eslint/js": "^9.34.0",
|
|
58
|
+
"@stylistic/eslint-plugin": "^5.2.3",
|
|
59
|
+
"@types/node": "^24.3.0",
|
|
60
|
+
"@types/qs": "^6.14.0",
|
|
61
|
+
"@typescript-eslint/parser": "^8.40.0",
|
|
62
|
+
"eslint": "^9.34.0",
|
|
63
|
+
"globals": "^16.3.0",
|
|
64
|
+
"homebridge": "^2.0.0-beta.29",
|
|
65
|
+
"node-persist": "^4.0.4",
|
|
66
|
+
"nodemon": "^3.1.10",
|
|
67
|
+
"rimraf": "^6.0.1",
|
|
68
|
+
"ts-node": "^10.9.2",
|
|
69
|
+
"typescript-eslint": "^8.40.0"
|
|
70
|
+
},
|
|
71
|
+
"overrides": {
|
|
72
|
+
"node-persist": "^4.0.4"
|
|
73
|
+
}
|
|
74
|
+
}
|