homebridge-ttlock-accesscode 1.0.1 → 2.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +5 -5
  2. package/config.schema.json +31 -4
  3. package/dist/api/ttlockApi.d.ts +9 -8
  4. package/dist/api/ttlockApi.js +128 -67
  5. package/dist/api/ttlockApi.js.map +1 -1
  6. package/dist/api/usageTracker.d.ts +37 -0
  7. package/dist/api/usageTracker.js +276 -0
  8. package/dist/api/usageTracker.js.map +1 -0
  9. package/dist/config.d.ts +6 -0
  10. package/dist/config.js +23 -11
  11. package/dist/config.js.map +1 -1
  12. package/dist/devices/accessoryInformation.d.ts +3 -0
  13. package/dist/devices/accessoryInformation.js +28 -0
  14. package/dist/devices/accessoryInformation.js.map +1 -0
  15. package/dist/devices/baseDevice.d.ts +58 -0
  16. package/dist/devices/baseDevice.js +376 -0
  17. package/dist/devices/baseDevice.js.map +1 -0
  18. package/dist/devices/create.d.ts +4 -0
  19. package/dist/devices/create.js +27 -0
  20. package/dist/devices/create.js.map +1 -0
  21. package/dist/devices/descriptorHelpers.d.ts +5 -0
  22. package/dist/devices/descriptorHelpers.js +82 -0
  23. package/dist/devices/descriptorHelpers.js.map +1 -0
  24. package/dist/devices/deviceManager.d.ts +19 -0
  25. package/dist/devices/deviceManager.js +74 -0
  26. package/dist/devices/deviceManager.js.map +1 -0
  27. package/dist/devices/deviceTypes.d.ts +44 -0
  28. package/dist/devices/deviceTypes.js +2 -0
  29. package/dist/devices/deviceTypes.js.map +1 -0
  30. package/dist/devices/homekitLock.d.ts +18 -0
  31. package/dist/devices/homekitLock.js +191 -0
  32. package/dist/devices/homekitLock.js.map +1 -0
  33. package/dist/index.js +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/platform.d.ts +45 -19
  36. package/dist/platform.js +397 -234
  37. package/dist/platform.js.map +1 -1
  38. package/dist/taskQueue.d.ts +12 -0
  39. package/dist/taskQueue.js +50 -0
  40. package/dist/taskQueue.js.map +1 -0
  41. package/dist/utils.d.ts +10 -2
  42. package/dist/utils.js +50 -5
  43. package/dist/utils.js.map +1 -1
  44. package/package.json +32 -21
  45. package/dist/homekitDevice.d.ts +0 -44
  46. package/dist/homekitDevice.js +0 -502
  47. package/dist/homekitDevice.js.map +0 -1
  48. package/dist/platformAccessoryInformation.d.ts +0 -3
  49. package/dist/platformAccessoryInformation.js +0 -35
  50. package/dist/platformAccessoryInformation.js.map +0 -1
  51. package/dist/types/index.d.ts +0 -39
  52. package/dist/types/index.js +0 -2
  53. package/dist/types/index.js.map +0 -1
package/README.md CHANGED
@@ -11,11 +11,11 @@
11
11
  </span>
12
12
 
13
13
  <p align="center">
14
- <a href="https://github.com/ZeliardM/homebridge-ttlock-accesscode/blob/latest/LICENSE"><img src="https://badgen.net/npm/license/homebridge-ttlock-accesscode" alt="mit license"></a>
15
- <a href="https://www.npmjs.com/package/homebridge-ttlock-accesscode/v/latest"><img src="https://badgen.net/npm/v/homebridge-ttlock-accesscode/latest?label=npm@latest" alt="latest npm version"></a>
16
- <a href="https://www.npmjs.com/package/homebridge-ttlock-accesscode/v/latest"><img src="https://badgen.net/npm/dt/homebridge-ttlock-accesscode" alt="npm downloads total"></a>
17
- <a href="https://www.paypal.me/ZeliardM/USD/"><img src="https://badgen.net/badge/donate/paypal?color=orange" alt="donate"></a>
18
- <a href="https://github.com/sponsors/ZeliardM"><img src="https://badgen.net/badge/donate/github?color=orange" alt="donate"></a>
14
+ <a href="https://github.com/ZeliardM/homebridge-ttlock-accesscode/blob/latest/LICENSE"><img src="https://img.shields.io/npm/l/homebridge-ttlock-accesscode?color=yellow" alt="mit license"></a>
15
+ <a href="https://www.npmjs.com/package/homebridge-ttlock-accesscode/v/latest"><img src="https://img.shields.io/npm/v/homebridge-ttlock-accesscode/latest?label=npm%40latest&color=blue" alt="latest npm version"></a>
16
+ <a href="https://www.npmjs.com/package/homebridge-ttlock-accesscode/v/latest"><img src="https://img.shields.io/npm/dt/homebridge-ttlock-accesscode?color=brightgreen" alt="npm downloads total"></a>
17
+ <a href="https://www.paypal.me/ZeliardM/USD/"><img src="https://img.shields.io/badge/donate-paypal-orange" alt="donate"></a>
18
+ <a href="https://github.com/sponsors/ZeliardM"><img src="https://img.shields.io/badge/donate-github-orange" alt="donate"></a>
19
19
  </p>
20
20
 
21
21
  <div align="center">
@@ -17,6 +17,7 @@
17
17
  "clientId": {
18
18
  "title": "Client ID",
19
19
  "type": "string",
20
+ "required": true,
20
21
  "description": "Client ID for TTLock Cloud API.",
21
22
  "placeholder": "Client ID",
22
23
  "minLength": 1
@@ -24,6 +25,7 @@
24
25
  "clientSecret": {
25
26
  "title": "Client Secret",
26
27
  "type": "string",
28
+ "required": true,
27
29
  "description": "Client Secret for TTLock Cloud API.",
28
30
  "placeholder": "Client Secret",
29
31
  "minLength": 1
@@ -31,6 +33,7 @@
31
33
  "username": {
32
34
  "title": "Username",
33
35
  "type": "string",
36
+ "required": true,
34
37
  "description": "Username for TTLock App Account.",
35
38
  "placeholder": "Username",
36
39
  "minLength": 1
@@ -38,27 +41,41 @@
38
41
  "password": {
39
42
  "title": "Password",
40
43
  "type": "string",
44
+ "required": true,
41
45
  "description": "Password for TTLock App Account.",
42
46
  "placeholder": "Password",
43
47
  "minLength": 1
44
48
  },
49
+ "totalApiCallsPerMonth": {
50
+ "title": "Total API Calls Per Month",
51
+ "type": "integer",
52
+ "description": "Total number of TTLock API calls allowed per month (used to automatically adjust polling).",
53
+ "default": 100000,
54
+ "minimum": 100000
55
+ },
45
56
  "pollingInterval": {
46
57
  "title": "Polling Interval (seconds)",
47
58
  "type": "integer",
48
59
  "description": "How often to check device status in the background (seconds)",
49
- "default": 5
60
+ "default": 90
50
61
  },
51
62
  "discoveryPollingInterval": {
52
- "title": "Discovery Polling Interval (seconds)",
63
+ "title": "Discovery Polling Interval (hours)",
53
64
  "type": "integer",
54
- "description": "How often to discover new devices in the background (seconds)",
55
- "default": 300
65
+ "description": "How often to discover new devices in the background (hours)",
66
+ "default": 6
56
67
  },
57
68
  "offlineInterval": {
58
69
  "title": "Offline Interval (days)",
59
70
  "type": "integer",
60
71
  "description": "How often to remove offline devices in the background (days)",
61
72
  "default": 7
73
+ },
74
+ "waitTimeUpdate": {
75
+ "title": "Wait Time Update (milliseconds)",
76
+ "type": "integer",
77
+ "description": "The time to wait to combine similar commands for a device before sending a command to a device (milliseconds). Default: 100.",
78
+ "default": 100
62
79
  }
63
80
  }
64
81
  },
@@ -68,6 +85,7 @@
68
85
  "clientSecret",
69
86
  "username",
70
87
  "password",
88
+ "totalApiCallsPerMonth",
71
89
  {
72
90
  "type": "fieldset",
73
91
  "title": "Device Discovery (Optional)",
@@ -78,6 +96,15 @@
78
96
  "discoveryPollingInterval",
79
97
  "offlineInterval"
80
98
  ]
99
+ },
100
+ {
101
+ "type": "fieldset",
102
+ "title": "Advanced Settings (Optional)",
103
+ "description": "Don't change these, unless you understand what you're doing.",
104
+ "expandable": true,
105
+ "items": [
106
+ "waitTimeUpdate"
107
+ ]
81
108
  }
82
109
  ]
83
110
  }
@@ -1,5 +1,6 @@
1
1
  import type { Logging } from 'homebridge';
2
- import { BatteryLevel, Lock, LockDetails, LockIdList, LockState, PasscodeList } from '../types/index.js';
2
+ import { UsageTracker } from './usageTracker.js';
3
+ import { FeatureInfo, Passcode, SysInfo, TTLockDevice } from '../devices/deviceTypes.js';
3
4
  export declare class TTLockApi {
4
5
  private log;
5
6
  private clientId;
@@ -8,20 +9,20 @@ export declare class TTLockApi {
8
9
  accessToken: string | null;
9
10
  refreshToken: string | null;
10
11
  private tokenMutex;
11
- constructor(log: Logging, clientId: string, clientSecret: string);
12
+ private usageTracker;
13
+ constructor(log: Logging, clientId: string, clientSecret: string, usageTracker?: UsageTracker);
12
14
  private encryptPassword;
13
15
  authenticate(username: string, password: string): Promise<void>;
14
16
  private refreshTokenIfNeeded;
15
17
  private makeAuthenticatedRequest;
16
18
  private handleError;
17
- getLocks(): Promise<LockIdList>;
18
- getLockDetails(lockId: string): Promise<LockDetails>;
19
- getLockState(lockId: string): Promise<LockState>;
20
- mapToLock(lockDetails: LockDetails, lockState: LockState, lockBattery: BatteryLevel, lockPasscodes: PasscodeList): Promise<Lock>;
19
+ getDevices(): Promise<TTLockDevice[]>;
20
+ getDeviceDetails(lockId: string): Promise<Partial<SysInfo>>;
21
+ getSysInfo(lockId: string): Promise<Partial<SysInfo>>;
22
+ getFeatureInfo(featureValue: string): Promise<FeatureInfo>;
21
23
  lock(lockId: string): Promise<void>;
22
24
  unlock(lockId: string): Promise<void>;
23
- getBatteryLevel(lockId: string): Promise<BatteryLevel>;
24
- getPasscodes(lockId: string): Promise<PasscodeList>;
25
+ getPasscodes(lockId: string): Promise<Passcode[]>;
25
26
  addPasscode(lockId: string, passcode: string): Promise<{
26
27
  keyboardPwdId: string;
27
28
  }>;
@@ -1,7 +1,7 @@
1
1
  import axios from 'axios';
2
- import { Mutex } from 'async-mutex';
3
2
  import crypto from 'crypto';
4
3
  import qs from 'qs';
4
+ import { Mutex } from 'async-mutex';
5
5
  class RequestFailed extends Error {
6
6
  constructor(message) {
7
7
  super(message);
@@ -16,7 +16,8 @@ export class TTLockApi {
16
16
  accessToken = null;
17
17
  refreshToken = null;
18
18
  tokenMutex = new Mutex();
19
- constructor(log, clientId, clientSecret) {
19
+ usageTracker;
20
+ constructor(log, clientId, clientSecret, usageTracker) {
20
21
  this.log = log;
21
22
  this.clientId = clientId;
22
23
  this.clientSecret = clientSecret;
@@ -26,22 +27,32 @@ export class TTLockApi {
26
27
  'Content-Type': 'application/x-www-form-urlencoded',
27
28
  },
28
29
  });
29
- this.log.debug('TTLockApi instance created');
30
+ this.log.debug('TTLockApi initialized');
31
+ this.usageTracker = usageTracker;
30
32
  }
31
33
  encryptPassword(password) {
32
34
  return crypto.createHash('md5').update(password).digest('hex');
33
35
  }
34
36
  async authenticate(username, password) {
35
- this.log.debug('Authenticating with TTLock API');
37
+ this.log.debug('Authenticating with TTLock API...');
36
38
  try {
37
39
  const encryptedPassword = this.encryptPassword(password);
38
- const response = await this.apiClient.post('oauth2/token', qs.stringify({
39
- client_id: this.clientId,
40
- client_secret: this.clientSecret,
41
- grant_type: 'password',
42
- username,
43
- password: encryptedPassword,
44
- }));
40
+ if (this.usageTracker) {
41
+ const ok = await this.usageTracker.tryReserve(1, 'authenticate');
42
+ if (!ok) {
43
+ throw new Error('API usage budget exhausted (authenticate)');
44
+ }
45
+ }
46
+ const response = await Promise.race([
47
+ this.apiClient.post('oauth2/token', qs.stringify({
48
+ client_id: this.clientId,
49
+ client_secret: this.clientSecret,
50
+ grant_type: 'password',
51
+ username,
52
+ password: encryptedPassword,
53
+ })),
54
+ new Promise((_, reject) => setTimeout(() => reject(new Error('TTLock API authentication timed out')), 15000)),
55
+ ]);
45
56
  if (response.data.access_token && response.data.refresh_token) {
46
57
  this.accessToken = response.data.access_token;
47
58
  this.refreshToken = response.data.refresh_token;
@@ -63,7 +74,13 @@ export class TTLockApi {
63
74
  }
64
75
  const release = await this.tokenMutex.acquire();
65
76
  try {
66
- this.log.debug('Refreshing access token');
77
+ this.log.debug('Refreshing access token...');
78
+ if (this.usageTracker) {
79
+ const ok = await this.usageTracker.tryReserve(1, 'refreshToken');
80
+ if (!ok) {
81
+ throw new Error('API usage budget exhausted (refreshToken)');
82
+ }
83
+ }
67
84
  const response = await this.apiClient.post('oauth2/token', qs.stringify({
68
85
  client_id: this.clientId,
69
86
  client_secret: this.clientSecret,
@@ -99,6 +116,7 @@ export class TTLockApi {
99
116
  date: Date.now(),
100
117
  };
101
118
  const fullEndpoint = `v3/${endpoint}`;
119
+ let lastError = new Error('Unknown request error');
102
120
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
103
121
  try {
104
122
  const response = await this.apiClient.request({
@@ -110,12 +128,13 @@ export class TTLockApi {
110
128
  params: method === 'GET' ? requestData : undefined,
111
129
  data: method === 'POST' ? qs.stringify(requestData) : undefined,
112
130
  });
113
- if (response.data.errcode && response.data.errcode !== 0) {
131
+ if ('errcode' in response.data && response.data.errcode !== 0) {
114
132
  throw new RequestFailed(`API returned error: ${response.data.errmsg || 'Unknown error'}`);
115
133
  }
116
134
  return response.data;
117
135
  }
118
136
  catch (error) {
137
+ lastError = error;
119
138
  if (error instanceof RequestFailed) {
120
139
  const errorMsg = error.message;
121
140
  this.log.debug(`Attempt ${attempt + 1} failed: ${errorMsg}`);
@@ -125,20 +144,48 @@ export class TTLockApi {
125
144
  await new Promise(resolve => setTimeout(resolve, delay));
126
145
  continue;
127
146
  }
147
+ break;
128
148
  }
129
- else if (axios.isAxiosError(error) && error.response) {
130
- if (error.response.status === 401) {
131
- this.log.debug('Access token expired, refreshing token...');
132
- await this.refreshTokenIfNeeded();
149
+ if (axios.isAxiosError(error)) {
150
+ if (error.response) {
151
+ if (error.response.status === 401) {
152
+ this.log.debug('Access token expired, refreshing token...');
153
+ try {
154
+ await this.refreshTokenIfNeeded();
155
+ continue;
156
+ }
157
+ catch (error) {
158
+ lastError = error;
159
+ break;
160
+ }
161
+ }
162
+ const rf = new RequestFailed(`Request failed: status=${error.response.status}, body=${JSON.stringify(error.response.data)}`);
163
+ this.log.error(rf.message);
164
+ if (error.response.status >= 500 && attempt < maxRetries) {
165
+ const delay = Math.pow(2, attempt) * 1000;
166
+ this.log.debug(`Server error, retrying in ${delay / 1000} seconds...`);
167
+ await new Promise(resolve => setTimeout(resolve, delay));
168
+ lastError = rf;
169
+ continue;
170
+ }
171
+ lastError = rf;
172
+ break;
173
+ }
174
+ this.log.debug(`Network error on attempt ${attempt + 1}: ${error.message}`);
175
+ if (attempt < maxRetries) {
176
+ const delay = Math.pow(2, attempt) * 1000;
177
+ await new Promise(resolve => setTimeout(resolve, delay));
133
178
  continue;
134
179
  }
135
- this.log.error(`Request failed: status=${error.response.status}, body=${JSON.stringify(error.response.data)}`);
136
- throw new RequestFailed(`Request failed: status=${error.response.status}, body=${JSON.stringify(error.response.data)}`);
180
+ break;
137
181
  }
138
182
  this.handleError('Request failed', error);
139
- throw error;
183
+ break;
140
184
  }
141
185
  }
186
+ if (lastError instanceof Error) {
187
+ throw lastError;
188
+ }
142
189
  throw new Error('Max retries reached');
143
190
  }
144
191
  handleError(message, error) {
@@ -152,52 +199,73 @@ export class TTLockApi {
152
199
  this.log.error(`${message}: ${JSON.stringify(error)}`);
153
200
  }
154
201
  }
155
- async getLocks() {
156
- this.log.debug('Fetching list of locks');
202
+ async getDevices() {
157
203
  const response = await this.makeAuthenticatedRequest('lock/list', 'GET', { pageNo: 1, pageSize: 1000 });
158
204
  if (!response.list || !Array.isArray(response.list)) {
159
205
  this.log.error('Invalid response format: expected list of locks');
160
206
  throw new Error('Invalid response format: expected list of locks');
161
207
  }
162
- this.log.info(`Found ${response.list.length} locks`);
163
- return response.list.map((item) => ({
164
- lockId: item.lockId.toString(),
165
- }));
208
+ const lockList = [];
209
+ for (const lock of response.list) {
210
+ try {
211
+ const ttlockDevice = {};
212
+ ttlockDevice.feature_info = await this.getFeatureInfo(lock.featureValue);
213
+ ttlockDevice.sys_info = await this.getDeviceDetails(lock.lockId);
214
+ ttlockDevice.sys_info.alias = lock.lockAlias;
215
+ ttlockDevice.sys_info.battery = lock.electricQuantity;
216
+ ttlockDevice.sys_info.device_id = lock.lockId.toString();
217
+ ttlockDevice.sys_info.mac = lock.lockMac;
218
+ if (ttlockDevice.feature_info.passcode) {
219
+ ttlockDevice.sys_info.passcodes = await this.getPasscodes(lock.lockId);
220
+ }
221
+ ttlockDevice.offline = false;
222
+ ttlockDevice.last_seen = new Date();
223
+ lockList.push(ttlockDevice);
224
+ }
225
+ catch (error) {
226
+ this.handleError(`Failed to fetch details for lock ${lock.lockId}`, error);
227
+ continue;
228
+ }
229
+ }
230
+ return lockList;
166
231
  }
167
- async getLockDetails(lockId) {
168
- this.log.debug(`Fetching details for lock: ${lockId}`);
169
- const data = await this.makeAuthenticatedRequest('lock/detail', 'GET', { lockId });
170
- return {
171
- lockId: data.lockId.toString(),
172
- lockAlias: data.lockAlias,
173
- lockMac: data.lockMac,
174
- modelNum: data.modelNum,
175
- hardwareRevision: data.hardwareRevision,
176
- firmwareRevision: data.firmwareRevision,
177
- };
232
+ async getDeviceDetails(lockId) {
233
+ const sysInfo = {};
234
+ const detailResponse = await this.makeAuthenticatedRequest('lock/detail', 'GET', { lockId });
235
+ const stateResponse = await this.makeAuthenticatedRequest('lock/queryOpenState', 'GET', { lockId });
236
+ sysInfo.fw_ver = detailResponse.firmwareRevision.split('.').slice(0, 3).join('.');
237
+ sysInfo.hw_ver = detailResponse.hardwareRevision;
238
+ sysInfo.model = detailResponse.modelNum;
239
+ sysInfo.state = stateResponse.state === 0 ? 1 : stateResponse.state === 1 ? 0 : stateResponse.state;
240
+ return sysInfo;
178
241
  }
179
- async getLockState(lockId) {
180
- this.log.debug(`Fetching state for lock: ${lockId}`);
181
- const data = await this.makeAuthenticatedRequest('lock/queryOpenState', 'GET', { lockId });
182
- return {
183
- state: data.state === 0 ? 1 : data.state === 1 ? 0 : data.state,
184
- };
242
+ async getSysInfo(lockId) {
243
+ this.log.debug(`Fetching sys_info for lock: ${lockId}`);
244
+ const sysInfo = {};
245
+ const stateResponse = await this.makeAuthenticatedRequest('lock/queryOpenState', 'GET', { lockId });
246
+ const batteryResponse = await this.makeAuthenticatedRequest('lock/queryElectricQuantity', 'GET', { lockId });
247
+ sysInfo.state = stateResponse.state === 0 ? 1 : stateResponse.state === 1 ? 0 : stateResponse.state;
248
+ sysInfo.battery = batteryResponse.electricQuantity;
249
+ return sysInfo;
185
250
  }
186
- async mapToLock(lockDetails, lockState, lockBattery, lockPasscodes) {
187
- this.log.debug(`Mapping lock details to Lock object for lock: ${lockDetails.lockId}`);
188
- return {
189
- id: lockDetails.lockId.toString(),
190
- alias: lockDetails.lockAlias,
191
- mac: lockDetails.lockMac,
192
- model: lockDetails.modelNum,
193
- hardwareRevision: lockDetails.hardwareRevision,
194
- firmwareRevision: lockDetails.firmwareRevision,
195
- state: lockState.state,
196
- battery: lockBattery.battery,
197
- passCodes: lockPasscodes,
198
- offline: false,
199
- lastSeen: new Date(),
200
- };
251
+ async getFeatureInfo(featureValue) {
252
+ this.log.debug('Calculating feature info');
253
+ const featureInfo = {};
254
+ try {
255
+ if (!featureValue || typeof featureValue !== 'string') {
256
+ featureInfo.passcode = false;
257
+ return featureInfo;
258
+ }
259
+ const hex = featureValue.replace(/[^0-9a-fA-F]/g, '') || '0';
260
+ const value = BigInt(`0x${hex}`);
261
+ featureInfo.passcode = ((value >> 0n) & 1n) === 1n;
262
+ return featureInfo;
263
+ }
264
+ catch (error) {
265
+ this.handleError('Failed to parse featureValue', error);
266
+ featureInfo.passcode = false;
267
+ return featureInfo;
268
+ }
201
269
  }
202
270
  async lock(lockId) {
203
271
  this.log.debug(`Locking lock: ${lockId}`);
@@ -209,13 +277,6 @@ export class TTLockApi {
209
277
  await this.makeAuthenticatedRequest('lock/unlock', 'POST', { lockId });
210
278
  this.log.debug(`Lock ${lockId} unlocked`);
211
279
  }
212
- async getBatteryLevel(lockId) {
213
- this.log.debug(`Fetching battery level for lock: ${lockId}`);
214
- const data = await this.makeAuthenticatedRequest('lock/queryElectricQuantity', 'GET', { lockId });
215
- return {
216
- battery: data.electricQuantity,
217
- };
218
- }
219
280
  async getPasscodes(lockId) {
220
281
  this.log.debug(`Fetching passcodes for lock: ${lockId}`);
221
282
  const response = await this.makeAuthenticatedRequest('lock/listKeyboardPwd', 'GET', { lockId, pageNo: 1, pageSize: 1000, orderBy: 0 });
@@ -225,9 +286,9 @@ export class TTLockApi {
225
286
  }
226
287
  this.log.debug(`Found ${response.list.length} passcodes for lock: ${lockId}`);
227
288
  return response.list.map((item, index) => ({
228
- id: item.keyboardPwdId.toString(),
289
+ passcode_id: item.keyboardPwdId.toString(),
229
290
  index: (index).toString(),
230
- lockId: item.lockId.toString(),
291
+ lock_id: item.lockId.toString(),
231
292
  passcode: item.keyboardPwd,
232
293
  }));
233
294
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ttlockApi.js","sourceRoot":"","sources":["../../src/api/ttlockApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ttlockApi.js","sourceRoot":"","sources":["../../src/api/ttlockApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { API, Logging } from 'homebridge';
2
+ import { EventEmitter } from 'node:events';
3
+ export declare class UsageTracker extends EventEmitter {
4
+ private totalAllowed;
5
+ private storageFilePath?;
6
+ private state;
7
+ private log;
8
+ private api;
9
+ private mutex;
10
+ private rolloverInterval?;
11
+ private currentTier;
12
+ private pendingReserved;
13
+ constructor(api: API, log: Logging, totalAllowed: number);
14
+ init(): Promise<void>;
15
+ private loadOrInit;
16
+ private persist;
17
+ getUsage(): {
18
+ used: number;
19
+ totalAllowed: number;
20
+ daysInMonth: number;
21
+ remaining: number;
22
+ daysRemaining: number;
23
+ remainingDailyAllowance: number;
24
+ lastUpdatedISO: string | undefined;
25
+ };
26
+ increment(n?: number, reason?: string): Promise<void>;
27
+ tryReserve(n?: number, reason?: string): Promise<boolean>;
28
+ beginBatch(n?: number, reason?: string): Promise<boolean>;
29
+ consumePendingReservation(n?: number): Promise<boolean>;
30
+ private computeTier;
31
+ canReserve(n?: number): boolean;
32
+ resetForNewMonth(): Promise<void>;
33
+ private scheduleRolloverCheck;
34
+ private checkRollover;
35
+ updateTotalAllowed(newTotal: number): Promise<void>;
36
+ stop(): void;
37
+ }