From af0fbeb25cde09961a6f721ceffdd8e1366e1f27 Mon Sep 17 00:00:00 2001 From: Robbert Klarenbeek Date: Thu, 14 Mar 2024 17:56:01 +0100 Subject: [PATCH] Include build --- .gitignore | 5 - dist/bold/api/api.d.ts | 28 ++ dist/bold/api/api.d.ts.map | 1 + dist/bold/api/api.js | 153 +++++++ dist/bold/api/api.js.map | 1 + dist/bold/api/index.d.ts | 3 + dist/bold/api/index.d.ts.map | 1 + dist/bold/api/index.js | 15 + dist/bold/api/index.js.map | 1 + dist/bold/api/types.d.ts | 157 +++++++ dist/bold/api/types.d.ts.map | 1 + dist/bold/api/types.js | 8 + dist/bold/api/types.js.map | 1 + dist/bold/ble/ble.d.ts | 14 + dist/bold/ble/ble.d.ts.map | 1 + dist/bold/ble/ble.js | 320 ++++++++++++++ dist/bold/ble/ble.js.map | 1 + dist/bold/ble/cryptor.d.ts | 10 + dist/bold/ble/cryptor.d.ts.map | 1 + dist/bold/ble/cryptor.js | 24 + dist/bold/ble/cryptor.js.map | 1 + dist/bold/ble/index.d.ts | 3 + dist/bold/ble/index.d.ts.map | 1 + dist/bold/ble/index.js | 15 + dist/bold/ble/index.js.map | 1 + dist/bold/ble/types.d.ts | 32 ++ dist/bold/ble/types.d.ts.map | 1 + dist/bold/ble/types.js | 32 ++ dist/bold/ble/types.js.map | 1 + dist/bold/index.d.ts | 3 + dist/bold/index.d.ts.map | 1 + dist/bold/index.js | 15 + dist/bold/index.js.map | 1 + dist/index.d.ts | 4 + dist/index.d.ts.map | 1 + dist/index.js | 417 ++++++++++++++++++ dist/index.js.map | 1 + homebridge-ui/public/assets/index-a195e368.js | 42 ++ homebridge-ui/public/index.html | 2 + 39 files changed, 1315 insertions(+), 5 deletions(-) create mode 100644 dist/bold/api/api.d.ts create mode 100644 dist/bold/api/api.d.ts.map create mode 100644 dist/bold/api/api.js create mode 100644 dist/bold/api/api.js.map create mode 100644 dist/bold/api/index.d.ts create mode 100644 dist/bold/api/index.d.ts.map create mode 100644 dist/bold/api/index.js create mode 100644 dist/bold/api/index.js.map create mode 100644 dist/bold/api/types.d.ts create mode 100644 dist/bold/api/types.d.ts.map create mode 100644 dist/bold/api/types.js create mode 100644 dist/bold/api/types.js.map create mode 100644 dist/bold/ble/ble.d.ts create mode 100644 dist/bold/ble/ble.d.ts.map create mode 100644 dist/bold/ble/ble.js create mode 100644 dist/bold/ble/ble.js.map create mode 100644 dist/bold/ble/cryptor.d.ts create mode 100644 dist/bold/ble/cryptor.d.ts.map create mode 100644 dist/bold/ble/cryptor.js create mode 100644 dist/bold/ble/cryptor.js.map create mode 100644 dist/bold/ble/index.d.ts create mode 100644 dist/bold/ble/index.d.ts.map create mode 100644 dist/bold/ble/index.js create mode 100644 dist/bold/ble/index.js.map create mode 100644 dist/bold/ble/types.d.ts create mode 100644 dist/bold/ble/types.d.ts.map create mode 100644 dist/bold/ble/types.js create mode 100644 dist/bold/ble/types.js.map create mode 100644 dist/bold/index.d.ts create mode 100644 dist/bold/index.d.ts.map create mode 100644 dist/bold/index.js create mode 100644 dist/bold/index.js.map create mode 100644 dist/index.d.ts create mode 100644 dist/index.d.ts.map create mode 100644 dist/index.js create mode 100644 dist/index.js.map create mode 100644 homebridge-ui/public/assets/index-a195e368.js create mode 100644 homebridge-ui/public/index.html diff --git a/.gitignore b/.gitignore index 2d0bc9a..580d67c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,3 @@ -# Ignore compiled code -dist -homebridge-ui/public - # ------------- Defaults ------------- # # Logs @@ -87,7 +83,6 @@ web_modules/ # Nuxt.js build / generate output .nuxt -dist # Gatsby files .cache/ diff --git a/dist/bold/api/api.d.ts b/dist/bold/api/api.d.ts new file mode 100644 index 0000000..58f81b0 --- /dev/null +++ b/dist/bold/api/api.d.ts @@ -0,0 +1,28 @@ +/// +import { EventEmitter } from 'node:events'; +import type { BoldApiAuthentication, BoldApiCommand, BoldApiDevice, BoldApiHandshake } from './types'; +export declare type BoldApiEvent = { + refresh: (newAuth: BoldApiAuthentication, oldAuth?: BoldApiAuthentication) => void; +}; +export declare interface BoldApi { + on(event: U, listener: BoldApiEvent[U]): this; + off(event: U, listener: BoldApiEvent[U]): this; + emit(event: U, ...args: Parameters): boolean; +} +export declare class BoldApi extends EventEmitter { + private auth?; + private tokenExpiry?; + constructor(auth?: Readonly | undefined); + private updateAuth; + call>(method: 'GET' | 'POST', endpoint: string, payload?: Record, needsAuth?: boolean, asFormData?: boolean): Promise; + requestVerificationCode(phoneNumber: string): Promise; + verifyVerificationCode(phoneNumber: string, verificationCode: string): Promise; + private processLegacyAuthResponse; + private processDefaultAuthResponse; + login(phoneNumber: string, password: string, verificationToken: string): Promise; + refresh(): Promise; + getEffectiveDevicePermissions(): Promise; + getHandshakes(deviceId: number): Promise; + getActivateCommands(deviceId: number): Promise; +} +//# sourceMappingURL=api.d.ts.map \ No newline at end of file diff --git a/dist/bold/api/api.d.ts.map b/dist/bold/api/api.d.ts.map new file mode 100644 index 0000000..7d9af9d --- /dev/null +++ b/dist/bold/api/api.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/bold/api/api.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EAEd,aAAa,EAGb,gBAAgB,EAKjB,MAAM,SAAS,CAAC;AAQjB,oBAAY,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACpF,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,OAAO;IAC9B,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5E,GAAG,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7E,IAAI,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAC7F;AAED,qBAAa,OAAQ,SAAQ,YAAY;IAG3B,OAAO,CAAC,IAAI,CAAC;IAFzB,OAAO,CAAC,WAAW,CAAC,CAAO;gBAEP,IAAI,CAAC,6CAAiC;IAI1D,OAAO,CAAC,UAAU;IAML,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACpD,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,EAC1D,SAAS,UAAO,EAChB,UAAU,UAAQ,GACjB,OAAO,CAAC,YAAY,CAAC;IAmDX,uBAAuB,CAAC,WAAW,EAAE,MAAM;IAa3C,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAcjF,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,0BAA0B;IAoBrB,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoBvG,OAAO,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAwCzC,6BAA6B,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAIzD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO5D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAM9E"} \ No newline at end of file diff --git a/dist/bold/api/api.js b/dist/bold/api/api.js new file mode 100644 index 0000000..bb82615 --- /dev/null +++ b/dist/bold/api/api.js @@ -0,0 +1,153 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BoldApi = void 0; +const node_events_1 = require("node:events"); +const node_fetch_1 = __importDefault(require("node-fetch")); +const BASE_URL = 'https://api.boldsmartlock.com/'; +const DEFAULT_AUTH_REFRESH_URL = 'https://bold.nienhuisdevelopment.com/oauth/refresh'; +const LEGACY_AUTH_CLIENT_ID = 'BoldApp'; +const LEGACY_CLIENT_SECRET = 'pgJFgnGB87f9ednFiiHygCbf'; +class BoldApi extends node_events_1.EventEmitter { + constructor(auth) { + super(); + this.auth = auth; + } + updateAuth(newAuth) { + const oldAuth = this.auth; + this.auth = newAuth; + this.emit('refresh', newAuth, oldAuth); + } + async call(method, endpoint, payload, needsAuth = true, asFormData = false) { + var _a, _b, _c, _d, _e, _f; + const url = `${BASE_URL}${endpoint.replace(/^\//, '')}`; + const headers = {}; + if (needsAuth) { + if (!this.auth) { + throw new Error('Missing access token'); + } + if (!this.tokenExpiry || new Date() > this.tokenExpiry) { + await this.refresh(); + } + headers['Authorization'] = `Bearer ${this.auth.accessToken}`; + } + if (payload) { + headers['ContentType'] = asFormData ? 'application/x-www-form-urlencoded' : 'application/json'; + } + const response = await (0, node_fetch_1.default)(url, { + method, + headers, + body: payload && + (asFormData ? new URLSearchParams(payload).toString() : JSON.stringify(payload)), + }); + let body; + try { + body = (await response.json()); + } + catch (error) { + throw new Error(await response.text()); + } + if (!response.ok) { + const error = body; + throw new Error((_f = (_e = (_d = (_c = (_b = (_a = error.error_description) !== null && _a !== void 0 ? _a : error.errorMessage) !== null && _b !== void 0 ? _b : error.message) !== null && _c !== void 0 ? _c : error.error) !== null && _d !== void 0 ? _d : error.errorCode) !== null && _e !== void 0 ? _e : error.code) !== null && _f !== void 0 ? _f : 'Unknown API response'); + } + return body; + } + async requestVerificationCode(phoneNumber) { + await this.call('POST', 'v2/verification/request-code', { + phoneNumber, + language: 'en', + destination: 'Phone', + }, false); + } + async verifyVerificationCode(phoneNumber, verificationCode) { + const { verificationToken } = await this.call('POST', 'v2/verification/verify-code', { + phoneNumber, + verificationCode, + }, false); + return verificationToken; + } + processLegacyAuthResponse(response, requestTime = new Date()) { + var _a; + const auth = { + accessToken: response.access_token, + refreshToken: response.refresh_token, + legacyAuthentication: true, + }; + this.updateAuth(auth); + this.tokenExpiry = new Date(requestTime.getTime() + ((_a = response.expires_in) !== null && _a !== void 0 ? _a : 86400) * 1000); + return auth; + } + processDefaultAuthResponse(response, requestTime = new Date()) { + var _a; + if (!response.success) { + throw new Error(response.error.message); + } + const auth = { + accessToken: response.data.accessToken, + refreshToken: response.data.refreshToken, + legacyAuthentication: false, + ...(((_a = this.auth) === null || _a === void 0 ? void 0 : _a.refreshURL) && { refreshURL: this.auth.refreshURL }), + }; + this.updateAuth(auth); + this.tokenExpiry = new Date(requestTime.getTime() + 86400 * 1000); + return auth; + } + async login(phoneNumber, password, verificationToken) { + const now = new Date(); + const response = await this.call('POST', 'v2/oauth/token', { + grant_type: 'password', + username: phoneNumber, + password, + mfa_token: verificationToken, + client_id: LEGACY_AUTH_CLIENT_ID, + client_secret: LEGACY_CLIENT_SECRET, + }, false, true); + return this.processLegacyAuthResponse(response, now); + } + async refresh() { + var _a; + if (!this.auth) { + throw new Error('Missing refresh token'); + } + if (this.auth.legacyAuthentication) { + const now = new Date(); + const response = await this.call('POST', 'v2/oauth/token', { + grant_type: 'refresh_token', + refresh_token: this.auth.refreshToken, + client_id: LEGACY_AUTH_CLIENT_ID, + client_secret: LEGACY_CLIENT_SECRET, + }, false, true); + return this.processLegacyAuthResponse(response, now); + } + else { + const now = new Date(); + const response = await (0, node_fetch_1.default)((_a = this.auth.refreshURL) !== null && _a !== void 0 ? _a : DEFAULT_AUTH_REFRESH_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ refreshToken: this.auth.refreshToken }), + }); + let body; + try { + body = (await response.json()); + } + catch (error) { + throw new Error('Token refresh failed'); + } + return this.processDefaultAuthResponse(body, now); + } + } + async getEffectiveDevicePermissions() { + return await this.call('GET', 'v1/effective-device-permissions'); + } + async getHandshakes(deviceId) { + return await this.call('GET', `v1/controller/v0/handshakes?deviceId=${encodeURIComponent(deviceId)}`); + } + async getActivateCommands(deviceId) { + return await this.call('GET', `v1/controller/v0/commands/activate-device?deviceId=${encodeURIComponent(deviceId)}`); + } +} +exports.BoldApi = BoldApi; +//# sourceMappingURL=api.js.map \ No newline at end of file diff --git a/dist/bold/api/api.js.map b/dist/bold/api/api.js.map new file mode 100644 index 0000000..a2ba220 --- /dev/null +++ b/dist/bold/api/api.js.map @@ -0,0 +1 @@ +{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/bold/api/api.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/bold/api/index.d.ts b/dist/bold/api/index.d.ts new file mode 100644 index 0000000..dc32713 --- /dev/null +++ b/dist/bold/api/index.d.ts @@ -0,0 +1,3 @@ +export * from './api.js'; +export * from './types.js'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/bold/api/index.d.ts.map b/dist/bold/api/index.d.ts.map new file mode 100644 index 0000000..c2c003f --- /dev/null +++ b/dist/bold/api/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bold/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC"} \ No newline at end of file diff --git a/dist/bold/api/index.js b/dist/bold/api/index.js new file mode 100644 index 0000000..3547f8a --- /dev/null +++ b/dist/bold/api/index.js @@ -0,0 +1,15 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./api.js"), exports); +__exportStar(require("./types.js"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/bold/api/index.js.map b/dist/bold/api/index.js.map new file mode 100644 index 0000000..bdeefc1 --- /dev/null +++ b/dist/bold/api/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bold/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B"} \ No newline at end of file diff --git a/dist/bold/api/types.d.ts b/dist/bold/api/types.d.ts new file mode 100644 index 0000000..ca4fc6c --- /dev/null +++ b/dist/bold/api/types.d.ts @@ -0,0 +1,157 @@ +declare type Base64String = string; +declare type IsoDateTimeString = string; +export declare type BoldApiAuthentication = { + accessToken: string; + refreshToken: string; + legacyAuthentication: boolean; + refreshURL?: string; +}; +export declare type BoldApiDeviceOwner = { + organizationId: number; + accountId: number; + name: string; + firstName: string; + lastName: string; +}; +export declare type BoldApiDeviceModel = { + id: number; + make: string; + model: string; + name: string; + isCertified: boolean; + deviceType: BoldApiDeviceType; +}; +export declare type BoldApiDeviceType = { + id: number; + name: string; + description: string; +}; +export declare type BoldApiDevicePermissionSchedule = { + dayOfWeek: 'Monday' | 'Tuesday' | 'Wednesday' | 'Thursday' | 'Friday' | 'Saturday' | 'Sunday'; + period: { + startTime: string; + endTime: string; + }; + recurrence: 'Weekly'; +}; +export declare type BoldApiDevicePermission = { + devicePermission: 'UseDevice' | string; + schedule: BoldApiDevicePermissionSchedule[]; + startDate?: string; + endDate?: string; + startTime?: string; + endTime?: string; +}; +export declare type BoldApiDeviceSettings = { + deviceId: number; + activationTime: number; + soundVolume: number; + pressButtonActivation: boolean; + controllerFunctionality: boolean; + backupPin1: number; + backupPin2: number; + backupPin3: number; + backupPinsConfigured: boolean; + acknowledged: boolean; + dateCreated: IsoDateTimeString; + dateModified: IsoDateTimeString; + backupPin1Name?: string; + backupPin2Name?: string; + backupPin3Name?: string; + dateLastExternalSync: IsoDateTimeString; + relayNormallyOpen: boolean; + vibrationTamperDetection: boolean; + vibrationTamperSensitivity: number; + rotationsTamperDetection: boolean; +}; +export declare type BoldApiDeviceFeatureSet = { + isActivatable: boolean; + storeDeviceEvents: boolean; +}; +export declare type BoldApiDevice = { + id: number; + deviceId: number; + serial?: string; + owner: BoldApiDeviceOwner; + name: string; + personalName: string; + organizationId: number; + model: BoldApiDeviceModel; + type: BoldApiDeviceType; + actualFirmwareVersion: number; + requiredFirmwareVersion: number; + dateCreated: IsoDateTimeString; + dateModified: IsoDateTimeString; + timeZone: string; + batteryLevel: 'Excellent' | string; + batteryLastMeasurement: IsoDateTimeString; + settingsAcknowledged: boolean; + permissions: BoldApiDevicePermission[]; + permissionAdministrate: boolean; + permissionRemoteActivate: boolean; + permissionAssignKeyfob: boolean; + organizationSuperUser: boolean; + permissionHash: Base64String; + settings: BoldApiDeviceSettings; + featureSet: BoldApiDeviceFeatureSet; + synced: boolean; + secure: boolean; + carouselImageUrl: string; +}; +export declare type BoldApiHandshake = { + deviceId: number; + clientId: number; + expiration: IsoDateTimeString; + handshakeKey: Base64String; + permissionHash: Base64String; + payload: Base64String; +}; +declare const BoldApiCommandTypes: { + readonly Activate: 1; + readonly ActivateWithKeepActive: 2; + readonly Deactivate: 3; +}; +export declare type BoldApiCommandType = typeof BoldApiCommandTypes[keyof typeof BoldApiCommandTypes]; +export declare type BoldApiCommand = { + deviceId: number; + commandType: BoldApiCommandType; + expiration: IsoDateTimeString; + permissionHash: Base64String; + payload: Base64String; +}; +export declare type BoldApiErrorResponse = { + error?: string; + error_description?: string; + message?: string; + code?: string; + errorMessage?: string; + errorCode?: string; +}; +export declare type BoldApiVerifyCodeResponse = { + verificationToken: string; +}; +export declare type BoldApiOAuthResponse = { + access_token: string; + refresh_token: string; + token_type: 'Bearer'; + expires_in: number; + account_id: number; +}; +export declare type BoldDefaultAuthResponse = { + success: true; + data: { + accessToken: string; + refreshToken: string; + }; +} | { + success: false; + error: { + code: number; + message: string; + }; +}; +export declare type BoldApiEffectiveDevicePermissionsResponse = BoldApiDevice[]; +export declare type BoldApiHandshakesResponse = BoldApiHandshake[]; +export declare type BoldApiCommandsResponse = BoldApiCommand[]; +export {}; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/bold/api/types.d.ts.map b/dist/bold/api/types.d.ts.map new file mode 100644 index 0000000..61df4ac --- /dev/null +++ b/dist/bold/api/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/bold/api/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/bold/api/types.js b/dist/bold/api/types.js new file mode 100644 index 0000000..b0862b4 --- /dev/null +++ b/dist/bold/api/types.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const BoldApiCommandTypes = { + Activate: 1, + ActivateWithKeepActive: 2, + Deactivate: 3, +}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/bold/api/types.js.map b/dist/bold/api/types.js.map new file mode 100644 index 0000000..d0f42bf --- /dev/null +++ b/dist/bold/api/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/bold/api/types.ts"],"names":[],"mappings":";;AAuHA,MAAM,mBAAmB,GAAG;IAC1B,QAAQ,EAAE,CAAC;IACX,sBAAsB,EAAE,CAAC;IACzB,UAAU,EAAE,CAAC;CACL,CAAC"} \ No newline at end of file diff --git a/dist/bold/ble/ble.d.ts b/dist/bold/ble/ble.d.ts new file mode 100644 index 0000000..bccc3e0 --- /dev/null +++ b/dist/bold/ble/ble.d.ts @@ -0,0 +1,14 @@ +import { Peripheral } from '@abandonware/noble'; +import { Logger } from 'homebridge'; +import { BoldApiCommand, BoldApiHandshake } from '../api'; +import { BoldBleDeviceInfo } from './types'; +export declare class BoldBle { + private readonly log; + constructor(log: Logger); + private waitForBluetooth; + discoverBoldPeripherals(deviceIds?: number[], timeout?: number): Promise>; + getDeviceInfo(peripheral: Peripheral): BoldBleDeviceInfo; + private withEncryptedConnection; + activateLock(peripheral: Peripheral, handshake: BoldApiHandshake, activateCommand: BoldApiCommand, timeout?: number): Promise; +} +//# sourceMappingURL=ble.d.ts.map \ No newline at end of file diff --git a/dist/bold/ble/ble.d.ts.map b/dist/bold/ble/ble.d.ts.map new file mode 100644 index 0000000..1ed0f09 --- /dev/null +++ b/dist/bold/ble/ble.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ble.d.ts","sourceRoot":"","sources":["../../../src/bold/ble/ble.ts"],"names":[],"mappings":"AAAA,OAAc,EAAkB,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAyC,MAAM,SAAS,CAAC;AAmPnF,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;YAE1B,gBAAgB;IAoCjB,uBAAuB,CAClC,SAAS,CAAC,EAAE,MAAM,EAAE,EACpB,OAAO,SAA2B,GACjC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;IA4CnC,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,iBAAiB;YA2BjD,uBAAuB;IA2BxB,YAAY,CACvB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EAAE,cAAc,EAC/B,OAAO,GAAE,MAAiC,GACzC,OAAO,CAAC,MAAM,CAAC;CAsBnB"} \ No newline at end of file diff --git a/dist/bold/ble/ble.js b/dist/bold/ble/ble.js new file mode 100644 index 0000000..b3381b5 --- /dev/null +++ b/dist/bold/ble/ble.js @@ -0,0 +1,320 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BoldBle = void 0; +const noble_1 = __importDefault(require("@abandonware/noble")); +const cryptor_1 = require("./cryptor"); +const types_1 = require("./types"); +const SESAM_MANUFACTURER_ID = 0x065b; +const SESAM_SERVICE_UUID = 'fd30'; +const NORDIC_UART_RX_CHARACTERISTIC_UUID = '6e400002-b5a3-f393-e0a9-e50e24dcca9e'; +const NORDIC_UART_TX_CHARACTERISTIC_UUID = '6e400003-b5a3-f393-e0a9-e50e24dcca9e'; +const DEFAULT_DISCOVER_TIMEOUT = 30 * 1000; +const DEFAULT_ACTIVATE_TIMEOUT = 30 * 1000; +const runWithTimeout = async (timeout, func, log) => { + log.info(`runWithTimeout(${timeout})`); + const abortController = new AbortController(); + const timer = setTimeout(() => { + abortController.abort(); + }, timeout); + return func(abortController.signal).finally(() => { + clearTimeout(timer); + }); +}; +class BoldBleConnection { + constructor(peripheral, writeCharacteristic, readCharacteristic, signal, log) { + this.peripheral = peripheral; + this.writeCharacteristic = writeCharacteristic; + this.readCharacteristic = readCharacteristic; + this.signal = signal; + this.log = log; + this.receiveBuffer = Buffer.alloc(0); + if (peripheral.state !== 'connected') { + throw new Error('Peripheral is not connected'); + } + this.readCharacteristic.on('read', this.onBytesReceived.bind(this)); + } + static async create(peripheral, signal, log) { + log.info(`BoldBleConnection.create(), peripheral.state=${peripheral.state}`); + if (peripheral.state !== 'disconnected') { + throw new Error('Cannot connect peripheral while it is not yet disconnected'); + } + await new Promise((resolve, reject) => { + const cleanup = () => { + peripheral.removeListener('connect', onConnect); + signal.removeEventListener('abort', onAbort); + }; + const onConnect = () => { + cleanup(); + resolve(); + }; + const onAbort = () => { + log.info('BoldBleConnection.create -> onAbort'); + // Skip cancelling because cancelConnect() seems broken in noble! :-( + // peripheral.cancelConnect(); + cleanup(); + reject(new Error('Timed out while connecting')); + }; + peripheral.on('connect', onConnect); + peripheral.connect(); + if (signal.aborted) { + onAbort(); + } + signal.addEventListener('abort', onAbort); + }); + const { characteristics } = await peripheral.discoverAllServicesAndCharacteristicsAsync(); + let writeCharacteristic; + let readCharacteristic; + for (const characteristic of characteristics) { + if (characteristic.uuid === NORDIC_UART_RX_CHARACTERISTIC_UUID.replace(/-/g, '').toLowerCase()) { + writeCharacteristic = characteristic; + } + else if (characteristic.uuid === NORDIC_UART_TX_CHARACTERISTIC_UUID.replace(/-/g, '').toLowerCase()) { + readCharacteristic = characteristic; + } + } + if (!writeCharacteristic || !readCharacteristic) { + throw new Error('Could not find Nordic UART characteristics on peripheral'); + } + await readCharacteristic.notifyAsync(true); + return new this(peripheral, writeCharacteristic, readCharacteristic, signal, log); + } + async disconnect() { + this.log.info(`BoldBleConnection.disconnect(), peripheral.state=${this.peripheral.state}`); + if (this.peripheral.state === 'disconnected') { + return; + } + await this.peripheral.disconnectAsync(); + } + onBytesReceived(data, isNotification) { + if (!isNotification) { + return; + } + this.log.info(`BoldBleConnection.onBytesReceived(<${data.byteLength}>), peripheral.state=${this.peripheral.state}`); + this.receiveBuffer = this.receiveBuffer.length > 0 ? Buffer.concat([this.receiveBuffer, data]) : data; + while (this.receiveBuffer.length > 0) { + const type = this.receiveBuffer[0]; + let payload; + if (type >= 0xf0) { + payload = Buffer.alloc(0); + this.receiveBuffer = this.receiveBuffer.subarray(1); + } + else { + if (this.receiveBuffer.length < 3) { + break; + } + const size = this.receiveBuffer[1] | (this.receiveBuffer[2] << 8); + if (this.receiveBuffer.length < size + 3) { + break; + } + payload = this.receiveBuffer.subarray(3, size + 3); + this.receiveBuffer = this.receiveBuffer.subarray(size + 3); + } + if (this.onPacketReceived) { + this.onPacketReceived(type, payload); + } + } + } + async call(type, payload, replyType) { + this.log.info(`BoldBleConnection.onPacketReceived(${type}, <${payload.byteLength}>, ${replyType}), peripheral.state=${this.peripheral.state}`); + let processReply = (reply) => reply; + if (type < types_1.BoldBlePacketTypes.StartHandshake || type > types_1.BoldBlePacketTypes.HandshakeFinishedResponse) { + // For non-handshake packets we need to encrypt the payload and decrypt the reply. + if (!this.cryptor) { + throw new Error(`Call of type ${type} requires encryption, please perform handshake first`); + } + const cryptor = this.cryptor; + payload = await cryptor.process(payload); + processReply = reply => cryptor.process(reply); + } + if (this.signal.aborted) { + throw new Error(`Timed out before making call of type ${type}`); + } + return new Promise((resolve, reject) => { + const cleanup = () => { + this.onPacketReceived = undefined; + this.signal.removeEventListener('abort', onAbort); + }; + this.onPacketReceived = (type, payload) => { + this.log.info(`BoldBleConnection.onPacketReceived(${type}, <${payload.byteLength}>), peripheral.state=${this.peripheral.state}`); + if (type === types_1.BoldBlePacketTypes.Event) { + // Ignore event packets that can come in the middle of a conversation. + return; + } + cleanup(); + switch (type) { + case replyType: + resolve(payload); + break; + case types_1.BoldBlePacketTypes.ClientBlocked: + reject(new Error('Received error from peripheral: Client blocked')); + break; + case types_1.BoldBlePacketTypes.HandshakeExpired: + reject(new Error('Received error from peripheral: Handshake expired')); + break; + case types_1.BoldBlePacketTypes.EncryptionError: + reject(new Error('Received error from peripheral: Encryption error')); + break; + default: + reject(new Error(`Unexpected reply from peripheral (received ${type} instead of ${replyType})`)); + } + }; + const onAbort = () => { + this.log.info('BoldBleConnection.call -> onAbort'); + cleanup(); + reject(new Error(`Timed out while waiting for reply packet of type ${replyType}`)); + }; + const packet = Buffer.from([type, payload.length & 0xff, (payload.length >> 8) & 0xff, ...payload]); + this.writeCharacteristic.write(packet, false); + if (this.signal.aborted) { + onAbort(); + } + this.signal.addEventListener('abort', onAbort); + }).then(processReply); + } + async performHandshake(handshake) { + this.log.info(`BoldBleConnection.performHandshake(), peripheral.state=${this.peripheral.state}`); + const handshakePayload = Buffer.from(handshake.payload, 'base64'); + const handshakeKey = Buffer.from(handshake.handshakeKey, 'base64'); + const handshakeResponse = await this.call(types_1.BoldBlePacketTypes.StartHandshake, handshakePayload, types_1.BoldBlePacketTypes.HandshakeResponse); + const nonce = handshakeResponse.subarray(0, 13); + const serverChallenge = handshakeResponse.subarray(13); + const handshakeCryptor = new cryptor_1.BoldCryptor(handshakeKey, nonce); + const encryptedChallenge = await handshakeCryptor.process(serverChallenge); + const clientChallenge = await cryptor_1.BoldCryptor.random(8); + const clientResponse = Buffer.concat([encryptedChallenge, clientChallenge]); + const encryptedClientResponse = await handshakeCryptor.process(clientResponse); + const handshakeFinishedResponse = await this.call(types_1.BoldBlePacketTypes.HandshakeClientResponse, encryptedClientResponse, types_1.BoldBlePacketTypes.HandshakeFinishedResponse); + this.cryptor = new cryptor_1.BoldCryptor(clientResponse, nonce); + const serverResponse = await this.cryptor.process(handshakeFinishedResponse); + if (serverResponse[0] !== 0 || Buffer.compare(serverResponse.subarray(1), clientChallenge) !== 0) { + throw new Error('Handshake failed'); + } + } +} +class BoldBle { + constructor(log) { + this.log = log; + } + async waitForBluetooth(signal) { + this.log.info('BoldBle.waitForBluetooth()'); + if (noble_1.default.state === 'poweredOn') { + return; + } + return new Promise((resolve, reject) => { + const cleanup = () => { + noble_1.default.removeListener('stateChange', onStateChange); + signal.removeEventListener('abort', onAbort); + }; + const onStateChange = (state) => { + if (state === 'poweredOn') { + cleanup(); + resolve(); + } + }; + const onAbort = () => { + this.log.info('BoldBle.waitForBluetooth -> onAbort'); + cleanup(); + reject(new Error('Timed out while waiting for Bluetooth to turn on')); + }; + noble_1.default.on('stateChange', onStateChange); + if (signal.aborted) { + onAbort(); + } + signal.addEventListener('abort', onAbort); + }); + } + async discoverBoldPeripherals(deviceIds, timeout = DEFAULT_DISCOVER_TIMEOUT) { + this.log.info(`BoldBle.discoverBoldPeripherals(${deviceIds}, ${timeout})`); + const peripherals = new Map(deviceIds && deviceIds.map(deviceId => [deviceId, null])); + if (deviceIds && deviceIds.length === 0) { + return peripherals; + } + return runWithTimeout(timeout, async (signal) => { + await this.waitForBluetooth(signal); + return new Promise(resolve => { + const done = () => { + noble_1.default.stopScanning(); + noble_1.default.removeListener('discover', onDiscover); + resolve(peripherals); + }; + const onDiscover = (peripheral) => { + try { + const deviceInfo = this.getDeviceInfo(peripheral); + peripherals.set(deviceInfo.deviceId, peripheral); + if (deviceIds && !deviceIds.some(deviceId => !peripherals.get(deviceId))) { + done(); + } + } + catch (error) { + // Ignore Bold peripheral with invalid manufacturer data. + } + }; + if (signal.aborted) { + done(); + } + signal.addEventListener('abort', done); + noble_1.default.on('discover', onDiscover); + noble_1.default.startScanning([SESAM_SERVICE_UUID], false); + }); + }, this.log); + } + getDeviceInfo(peripheral) { + this.log.info('BoldBle.getDeviceInfo()'); + const data = peripheral.advertisement.manufacturerData; + if (data.length !== 14) { + throw new Error('Incorrect length of manufacturer data'); + } + const manufacturerId = data.readUInt16LE(0); + if (manufacturerId !== SESAM_MANUFACTURER_ID) { + throw new Error('Incorrect manufacturer ID'); + } + const flags = data.readUInt8(13); + return { + protocolVersion: data.readUInt8(2), + type: data.readUInt8(3), + model: data.readUInt8(4), + deviceId: Number(data.readBigUInt64LE(5)), + isInstallable: (flags & 1) > 0, + eventsAvailable: (flags & 2) > 0, + shouldTimeSync: (flags & 4) > 0, + isInDFUMode: (flags & 8) > 0, + }; + } + async withEncryptedConnection(peripheral, handshake, timeout, func) { + this.log.info('BoldBle.withEncryptedConnection()'); + return runWithTimeout(timeout, async (signal) => { + const connection = await BoldBleConnection.create(peripheral, signal, this.log); + await connection.performHandshake(handshake); + try { + if (signal.aborted) { + throw new Error('Timed out after handshake'); + } + return await func(connection); + } + finally { + await connection.disconnect(); + } + }, this.log); + } + async activateLock(peripheral, handshake, activateCommand, timeout = DEFAULT_ACTIVATE_TIMEOUT) { + this.log.info('BoldBle.activateLock()'); + return this.withEncryptedConnection(peripheral, handshake, timeout, async (connection) => { + const commandPayload = Buffer.from(activateCommand.payload, 'base64'); + const commandAck = await connection.call(types_1.BoldBlePacketTypes.Command, commandPayload, types_1.BoldBlePacketTypes.CommandAck); + const commandResult = commandAck.readUInt8(0); + if (commandResult === 0xf0) { + throw new Error('Access denied'); + } + else if (commandResult !== 0) { + throw new Error('Unexpected result from activate command'); + } + const activationTime = commandAck.readUInt16LE(1); + return activationTime; + }); + } +} +exports.BoldBle = BoldBle; +//# sourceMappingURL=ble.js.map \ No newline at end of file diff --git a/dist/bold/ble/ble.js.map b/dist/bold/ble/ble.js.map new file mode 100644 index 0000000..7f43f37 --- /dev/null +++ b/dist/bold/ble/ble.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ble.js","sourceRoot":"","sources":["../../../src/bold/ble/ble.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/bold/ble/cryptor.d.ts b/dist/bold/ble/cryptor.d.ts new file mode 100644 index 0000000..155a089 --- /dev/null +++ b/dist/bold/ble/cryptor.d.ts @@ -0,0 +1,10 @@ +/// +export declare class BoldCryptor { + private key; + private nonce; + private counter; + constructor(key: Buffer, nonce: Buffer); + static random(size: number): Promise; + process(bytes: Buffer): Promise; +} +//# sourceMappingURL=cryptor.d.ts.map \ No newline at end of file diff --git a/dist/bold/ble/cryptor.d.ts.map b/dist/bold/ble/cryptor.d.ts.map new file mode 100644 index 0000000..357a9b3 --- /dev/null +++ b/dist/bold/ble/cryptor.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"cryptor.d.ts","sourceRoot":"","sources":["../../../src/bold/ble/cryptor.ts"],"names":[],"mappings":";AAKA,qBAAa,WAAW;IAGV,OAAO,CAAC,GAAG;IAAU,OAAO,CAAC,KAAK;IAF9C,OAAO,CAAC,OAAO,CAAK;gBAEA,GAAG,EAAE,MAAM,EAAU,KAAK,EAAE,MAAM;WAElC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAMrD"} \ No newline at end of file diff --git a/dist/bold/ble/cryptor.js b/dist/bold/ble/cryptor.js new file mode 100644 index 0000000..04be875 --- /dev/null +++ b/dist/bold/ble/cryptor.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BoldCryptor = void 0; +const node_crypto_1 = require("node:crypto"); +const node_util_1 = require("node:util"); +const randomBytesAsync = (0, node_util_1.promisify)(node_crypto_1.randomBytes); +class BoldCryptor { + constructor(key, nonce) { + this.key = key; + this.nonce = nonce; + this.counter = 0; + } + static async random(size) { + return await randomBytesAsync(size); + } + async process(bytes) { + const iv = Buffer.concat([this.nonce, Buffer.from([0, 0, this.counter])]); + const cipher = (0, node_crypto_1.createCipheriv)('aes-128-ctr', this.key, iv); + this.counter += Math.ceil(bytes.length / 16); + return Buffer.concat([cipher.update(bytes), cipher.final()]); + } +} +exports.BoldCryptor = BoldCryptor; +//# sourceMappingURL=cryptor.js.map \ No newline at end of file diff --git a/dist/bold/ble/cryptor.js.map b/dist/bold/ble/cryptor.js.map new file mode 100644 index 0000000..ec1ebf4 --- /dev/null +++ b/dist/bold/ble/cryptor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cryptor.js","sourceRoot":"","sources":["../../../src/bold/ble/cryptor.ts"],"names":[],"mappings":";;;AAAA,6CAA0D;AAC1D,yCAAsC;AAEtC,MAAM,gBAAgB,GAAG,IAAA,qBAAS,EAAC,yBAAW,CAAC,CAAC;AAEhD,MAAa,WAAW;IAGtB,YAAoB,GAAW,EAAU,KAAa;QAAlC,QAAG,GAAH,GAAG,CAAQ;QAAU,UAAK,GAAL,KAAK,CAAQ;QAF9C,YAAO,GAAG,CAAC,CAAC;IAEqC,CAAC;IAEnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAY;QACrC,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,KAAa;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAA,4BAAc,EAAC,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;CACF;AAfD,kCAeC"} \ No newline at end of file diff --git a/dist/bold/ble/index.d.ts b/dist/bold/ble/index.d.ts new file mode 100644 index 0000000..d324563 --- /dev/null +++ b/dist/bold/ble/index.d.ts @@ -0,0 +1,3 @@ +export * from './ble.js'; +export * from './types.js'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/bold/ble/index.d.ts.map b/dist/bold/ble/index.d.ts.map new file mode 100644 index 0000000..aa38575 --- /dev/null +++ b/dist/bold/ble/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bold/ble/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC"} \ No newline at end of file diff --git a/dist/bold/ble/index.js b/dist/bold/ble/index.js new file mode 100644 index 0000000..4a18fa3 --- /dev/null +++ b/dist/bold/ble/index.js @@ -0,0 +1,15 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./ble.js"), exports); +__exportStar(require("./types.js"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/bold/ble/index.js.map b/dist/bold/ble/index.js.map new file mode 100644 index 0000000..99adec9 --- /dev/null +++ b/dist/bold/ble/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bold/ble/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B"} \ No newline at end of file diff --git a/dist/bold/ble/types.d.ts b/dist/bold/ble/types.d.ts new file mode 100644 index 0000000..ca065a5 --- /dev/null +++ b/dist/bold/ble/types.d.ts @@ -0,0 +1,32 @@ +export declare type BoldBleDeviceInfo = { + protocolVersion: number; + type: number; + model: number; + deviceId: number; + isInstallable: boolean; + eventsAvailable: boolean; + shouldTimeSync: boolean; + isInDFUMode: boolean; +}; +export declare const BoldBlePacketTypes: { + readonly ResultSuccess: 0; + readonly StartHandshake: 160; + readonly HandshakeResponse: 161; + readonly HandshakeClientResponse: 162; + readonly HandshakeFinishedResponse: 163; + readonly Command: 164; + readonly CommandAck: 165; + readonly LocalCommand: 166; + readonly LocalCommandResponse: 167; + readonly DeliverMessages: 176; + readonly DialogServer: 192; + readonly DialogDevice: 193; + readonly Event: 208; + readonly EventAck: 209; + readonly EventAckResponse: 210; + readonly ClientBlocked: 253; + readonly HandshakeExpired: 254; + readonly EncryptionError: 255; +}; +export declare type BoldBlePacketType = typeof BoldBlePacketTypes[keyof typeof BoldBlePacketTypes]; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/bold/ble/types.d.ts.map b/dist/bold/ble/types.d.ts.map new file mode 100644 index 0000000..618e5e3 --- /dev/null +++ b/dist/bold/ble/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/bold/ble/types.ts"],"names":[],"mappings":"AAAA,oBAAY,iBAAiB,GAAG;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;CAkCrB,CAAC;AAEX,oBAAY,iBAAiB,GAAG,OAAO,kBAAkB,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/bold/ble/types.js b/dist/bold/ble/types.js new file mode 100644 index 0000000..f484bf5 --- /dev/null +++ b/dist/bold/ble/types.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BoldBlePacketTypes = void 0; +exports.BoldBlePacketTypes = { + // Generic success packet. + ResultSuccess: 0x00, + // Handshake packets. + StartHandshake: 0xa0, + HandshakeResponse: 0xa1, + HandshakeClientResponse: 0xa2, + HandshakeFinishedResponse: 0xa3, + // Command packets. + Command: 0xa4, + CommandAck: 0xa5, + // Local packets (Connect Hub getting APs and setting wifi credentials). + LocalCommand: 0xa6, + LocalCommandResponse: 0xa7, + // Message packets. + DeliverMessages: 0xb0, + // Dialog packets (pairing for installation, time sync). + DialogServer: 0xc0, + DialogDevice: 0xc1, + // Event packets. + Event: 0xd0, + EventAck: 0xd1, + EventAckResponse: 0xd2, + // Error packets (single-byte packets, no payload). + ClientBlocked: 0xfd, + HandshakeExpired: 0xfe, + EncryptionError: 0xff, // lock => app +}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/bold/ble/types.js.map b/dist/bold/ble/types.js.map new file mode 100644 index 0000000..a9d9bd9 --- /dev/null +++ b/dist/bold/ble/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/bold/ble/types.ts"],"names":[],"mappings":";;;AAWa,QAAA,kBAAkB,GAAG;IAChC,0BAA0B;IAC1B,aAAa,EAAE,IAAI;IAEnB,qBAAqB;IACrB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,uBAAuB,EAAE,IAAI;IAC7B,yBAAyB,EAAE,IAAI;IAE/B,mBAAmB;IACnB,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,IAAI;IAEhB,wEAAwE;IACxE,YAAY,EAAE,IAAI;IAClB,oBAAoB,EAAE,IAAI;IAE1B,mBAAmB;IACnB,eAAe,EAAE,IAAI;IAErB,wDAAwD;IACxD,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAElB,iBAAiB;IACjB,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;IACd,gBAAgB,EAAE,IAAI;IAEtB,mDAAmD;IACnD,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IACtB,eAAe,EAAE,IAAI,EAAE,cAAc;CAC7B,CAAC"} \ No newline at end of file diff --git a/dist/bold/index.d.ts b/dist/bold/index.d.ts new file mode 100644 index 0000000..486f420 --- /dev/null +++ b/dist/bold/index.d.ts @@ -0,0 +1,3 @@ +export * from './api'; +export * from './ble'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/bold/index.d.ts.map b/dist/bold/index.d.ts.map new file mode 100644 index 0000000..24f9155 --- /dev/null +++ b/dist/bold/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bold/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC"} \ No newline at end of file diff --git a/dist/bold/index.js b/dist/bold/index.js new file mode 100644 index 0000000..0f68f2e --- /dev/null +++ b/dist/bold/index.js @@ -0,0 +1,15 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./api"), exports); +__exportStar(require("./ble"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/bold/index.js.map b/dist/bold/index.js.map new file mode 100644 index 0000000..a85ef39 --- /dev/null +++ b/dist/bold/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bold/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAsB;AACtB,wCAAsB"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..d907e9f --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,4 @@ +import { API } from 'homebridge'; +declare const _default: (homebridge: API) => void; +export default _default; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map new file mode 100644 index 0000000..2469945 --- /dev/null +++ b/dist/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,GAAG,EAWJ,MAAM,YAAY,CAAC;qCAmCQ,GAAG;AAA/B,wBAEE"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..93796f9 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,417 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __importStar(require("node:fs/promises")); +const PLATFORM_NAME = 'BoldBLE'; +const PLUGIN_NAME = 'homebridge-bold-ble'; +const HOUR = 60 * 60 * 1000; +const UPDATE_INTERVAL = 1 * HOUR; +const DEVICES_UDPATE_INTERVAL = 24 * HOUR; +const HANDSHAKE_UPDATE_MARGIN = 24 * HOUR; +const COMMAND_UPDATE_MARGIN = 24 * HOUR; +const BOLD_SMART_CYLINDER_DEVICE_TYPE = 1; +exports.default = (homebridge) => { + homebridge.registerPlatform(PLATFORM_NAME, BoldBlePlatform); +}; +class BoldBlePlatform { + constructor(log, config, homebridge) { + this.log = log; + this.homebridge = homebridge; + this.Characteristic = this.homebridge.hap.Characteristic; + this.locks = new Map(); + let updateTimer; + homebridge.on("didFinishLaunching" /* DID_FINISH_LAUNCHING */, async () => { + try { + try { + await Promise.resolve().then(() => __importStar(require('@abandonware/noble'))); + } + catch (error) { + throw new Error('Could not load Bluetooth library; possibly unsupported on your platform'); + } + const { BoldApi, BoldBle } = await Promise.resolve().then(() => __importStar(require('./bold'))); + this.api = new BoldApi(config); + this.ble = new BoldBle(log); + this.api.on('refresh', this.onApiTokenRefresh.bind(this)); + await this.update(true); + updateTimer = setInterval(this.update.bind(this), UPDATE_INTERVAL); + } + catch (error) { + this.log.error(error.message); + } + }); + homebridge.on("shutdown" /* SHUTDOWN */, () => { + if (updateTimer) { + clearInterval(updateTimer); + } + }); + } + configureAccessory(accessory) { + const device = accessory.context; + if (!device.id || !device.name) { + this.log.warn(`Device not found for accessory ${accessory.UUID}. Removing...`); + this.homebridge.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]); + return; + } + this.log.info(`Configuring accessory for device ${device.id} (${device.name})`); + this.locks.set(device.id, { + accessory, + state: 'deactivated', + }); + let lockService = accessory.getService(this.homebridge.hap.Service.LockMechanism); + if (!lockService) { + lockService = accessory.addService(this.homebridge.hap.Service.LockMechanism); + } + const currentState = lockService.getCharacteristic(this.Characteristic.LockCurrentState); + const targetState = lockService.getCharacteristic(this.Characteristic.LockTargetState); + currentState.onGet(this.getCurrentLockState.bind(this, device.id)); + targetState.onGet(this.getTargetLockState.bind(this, device.id)); + targetState.onSet(this.setTargetLockState.bind(this, device.id)); + let informationService = accessory.getService(this.homebridge.hap.Service.AccessoryInformation); + if (!informationService) { + informationService = accessory.addService(this.homebridge.hap.Service.AccessoryInformation); + } + informationService.getCharacteristic(this.Characteristic.Name).onGet(() => device.name || 'Bold Lock'); + informationService.getCharacteristic(this.Characteristic.Manufacturer).onGet(() => device.model.make || 'Bold'); + informationService.getCharacteristic(this.Characteristic.Model).onGet(() => device.model.model || 'Lock'); + informationService + .getCharacteristic(this.Characteristic.SerialNumber) + .onGet(() => { var _a; return (_a = device.serial) !== null && _a !== void 0 ? _a : `${device.type.id}-${device.model.id}-${device.owner.organizationId}-${device.id}`; }); + informationService + .getCharacteristic(this.Characteristic.FirmwareRevision) + .onGet(() => `${device.actualFirmwareVersion || 'Unknown'}`); + } + getCurrentLockState(deviceId) { + const lock = this.locks.get(deviceId); + if (!lock) { + this.log.warn(`GetCurrentLockState requested for device ${deviceId}, but no such accessory`); + throw new this.homebridge.hap.HapStatusError(-70409 /* RESOURCE_DOES_NOT_EXIST */); + } + switch (lock.state) { + case 'deactivated': + return this.Characteristic.LockCurrentState.SECURED; + case 'activating': + return this.Characteristic.LockCurrentState.SECURED; + case 'activated': + return this.Characteristic.LockCurrentState.UNSECURED; + default: + return this.Characteristic.LockCurrentState.UNKNOWN; + } + } + getTargetLockState(deviceId) { + const lock = this.locks.get(deviceId); + if (!lock) { + this.log.warn(`GetTargetLockState requested for device ${deviceId}, but no such accessory`); + throw new this.homebridge.hap.HapStatusError(-70409 /* RESOURCE_DOES_NOT_EXIST */); + } + switch (lock.state) { + case 'deactivated': + return this.Characteristic.LockTargetState.SECURED; + case 'activating': + return this.Characteristic.LockTargetState.UNSECURED; + case 'activated': + return this.Characteristic.LockTargetState.UNSECURED; + default: + return this.Characteristic.LockTargetState.SECURED; + } + } + async setTargetLockState(deviceId, value) { + this.log.info(`setTargetLockState(${deviceId}, ${value})`); + const lock = this.locks.get(deviceId); + if (!lock) { + this.log.warn(`SetTargetLockState requested for device ${deviceId}, but no such accessory`); + throw new this.homebridge.hap.HapStatusError(-70409 /* RESOURCE_DOES_NOT_EXIST */); + } + const service = lock.accessory.getService(this.homebridge.hap.Service.LockMechanism); + const currentState = service === null || service === void 0 ? void 0 : service.getCharacteristic(this.Characteristic.LockCurrentState); + const targetState = service === null || service === void 0 ? void 0 : service.getCharacteristic(this.Characteristic.LockTargetState); + if (value === this.Characteristic.LockTargetState.SECURED) { + // The lock deactivates by itself, so there's no way to "secure" a lock on command. + targetState === null || targetState === void 0 ? void 0 : targetState.updateValue(this.Characteristic.LockTargetState.SECURED); + return; + } + if (!lock.handshake || !lock.activateCommand) { + this.log.error(`Cannot activate lock for device ${deviceId} due to missing handshake or command`); + throw new this.homebridge.hap.HapStatusError(-70402 /* SERVICE_COMMUNICATION_FAILURE */); + } + if (!lock.peripheral) { + this.log.error(`Cannot activate lock for undiscovered device ${deviceId} (out of Bluetooth range?)`); + throw new this.homebridge.hap.HapStatusError(-70402 /* SERVICE_COMMUNICATION_FAILURE */); + } + if (lock.state === 'activating' || lock.state === 'activated') { + this.log.warn(`Skipping lock activation for device ${deviceId}, it's already ${lock.state}`); + throw new this.homebridge.hap.HapStatusError(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */); + } + this.log.info('lock.state = activating'); + lock.state = 'activating'; + targetState === null || targetState === void 0 ? void 0 : targetState.updateValue(this.Characteristic.LockTargetState.UNSECURED); + if (!this.ble) { + this.log.error(`Cannot activate lock for device ${deviceId} because Bluetooth library was not loaded`); + throw new this.homebridge.hap.HapStatusError(-70402 /* SERVICE_COMMUNICATION_FAILURE */); + } + let activationTime; + try { + this.log.info('Activating lock...'); + activationTime = await this.ble.activateLock(lock.peripheral, lock.handshake, lock.activateCommand); + this.log.info(`Activated lock for device ${deviceId}, will auto-deactivate after ${activationTime}s`); + } + catch (error) { + let hapStatus = -70402 /* SERVICE_COMMUNICATION_FAILURE */; + if (error instanceof Error) { + const message = error.message; + this.log.error(`Could not activate lock for device ${deviceId}: ${message}`); + if (message.match(/time(d )?out/i)) { + hapStatus = -70408 /* OPERATION_TIMED_OUT */; + } + else if (message.match(/not yet disconnected/i)) { + hapStatus = -70403 /* RESOURCE_BUSY */; + } + } + else { + this.log.error(`Could not activate lock for device ${deviceId}`); + } + throw new this.homebridge.hap.HapStatusError(hapStatus); + } + this.log.info('lock.state = activated'); + lock.state = 'activated'; + currentState === null || currentState === void 0 ? void 0 : currentState.updateValue(this.Characteristic.LockTargetState.UNSECURED); + setTimeout(() => { + this.log.info('lock.state = deactivated'); + lock.state = 'deactivated'; + currentState === null || currentState === void 0 ? void 0 : currentState.updateValue(this.Characteristic.LockTargetState.SECURED); + targetState === null || targetState === void 0 ? void 0 : targetState.updateValue(this.Characteristic.LockTargetState.SECURED); + }, activationTime * 1000); + } + async fetchCompatibleDevices() { + var _a, _b; + const potentialDevices = (_b = (await ((_a = this.api) === null || _a === void 0 ? void 0 : _a.getEffectiveDevicePermissions()))) !== null && _b !== void 0 ? _b : []; + const devices = new Map(); + for (const device of potentialDevices) { + if (!device.id) { + this.log.warn('Skipping device without device ID'); + } + else if (!device.name) { + this.log.warn(`Skipping device ${device.id}: missing device name`); + } + else if (device.type.id !== BOLD_SMART_CYLINDER_DEVICE_TYPE) { + this.log.warn(`Skipping device ${device.id}: not a Bold Smart Cylinder`); + } + else if (!device.permissions.some(permission => permission.devicePermission === 'UseDevice')) { + this.log.warn(`Skipping device ${device.id}: no permission to use`); + } + else { + devices.set(device.id, device); + } + } + return devices; + } + async discoverCompatiblePeripherals(deviceIds) { + const peripherals = new Map(); + if (!this.ble) { + return peripherals; + } + const potentialPeripherals = await this.ble.discoverBoldPeripherals(deviceIds); + for (const [deviceId, peripheral] of potentialPeripherals) { + if (!peripheral) { + this.log.warn(`Unable to discover peripheral for device ${deviceId}`); + continue; + } + let deviceInfo; + try { + deviceInfo = this.ble.getDeviceInfo(peripheral); + } + catch (error) { + this.log.warn(`Skipping discovered peripheral for device ${deviceId}: invalid manufacturer data`); + continue; + } + if (deviceInfo.type !== BOLD_SMART_CYLINDER_DEVICE_TYPE) { + this.log.warn(`Skipping discovered peripheral for device ${deviceId}: Device is not a Bold Smart Cylinder`); + } + else if (deviceInfo.isInDFUMode) { + this.log.warn(`Skipping discovered peripheral for device ${deviceId}: Device is in DFU mode`); + } + else if (deviceInfo.isInstallable) { + this.log.warn(`Skipping discovered peripheral for device ${deviceId}: Device is not yet installed`); + } + else { + this.log.info(`Discovered peripheral for device ${deviceId} with ${peripheral.rssi} dBm RSSI`); + peripherals.set(deviceId, peripheral); + } + } + return peripherals; + } + async onApiTokenRefresh(newAuth, oldAuth) { + this.log.debug('Refreshed API tokens'); + try { + const buffer = await fs.readFile(this.homebridge.user.configPath()); + const json = buffer.toString('utf8'); + const fullConfig = JSON.parse(json); + let platformIndex = fullConfig.platforms.findIndex(platform => platform.platform === PLATFORM_NAME && platform.accessToken === (oldAuth === null || oldAuth === void 0 ? void 0 : oldAuth.accessToken)); + if (platformIndex < 0) { + this.log.warn(`Could not find platform with current access token; using first ${PLATFORM_NAME} entry`); + platformIndex = fullConfig.platforms.findIndex(platform => platform.platform === PLATFORM_NAME); + } + if (platformIndex < 0) { + this.log.error(`Could not find ${PLATFORM_NAME} entry in config; not writing refreshed tokens`); + return; + } + const currentConfig = fullConfig.platforms[platformIndex]; + delete currentConfig.refreshURL; + fullConfig.platforms[platformIndex] = { ...currentConfig, ...newAuth }; + await fs.writeFile(this.homebridge.user.configPath(), JSON.stringify(fullConfig, null, 4)); + } + catch (error) { + this.log.error('Error writing refreshed tokens to config'); + } + } + async update(force = false) { + try { + await this.updateDevices(force); + } + catch (error) { + this.log.error(error.message); + } + try { + await this.updateHandshakes(force); + } + catch (error) { + this.log.error(error.message); + } + try { + await this.updateCommands(force); + } + catch (error) { + this.log.error(error.message); + } + try { + await this.discoverPeripherals(); + } + catch (error) { + this.log.error(error.message); + } + } + async updateDevices(forceUpdate = false) { + if (!forceUpdate && + this.lastDevicesCheck && + new Date().getTime() - this.lastDevicesCheck.getTime() < DEVICES_UDPATE_INTERVAL) { + return; + } + const devices = await this.fetchCompatibleDevices(); + const newDeviceIds = Array.from(devices.keys()); + const oldDeviceIds = Array.from(this.locks.keys()); + const deviceIdsToRemove = oldDeviceIds.filter(id => !newDeviceIds.includes(id)); + const deviceIdsToAdd = newDeviceIds.filter(id => !oldDeviceIds.includes(id)); + const deviceIdsToUpdate = oldDeviceIds.filter(id => newDeviceIds.includes(id)); + const accessoriesToUnregister = []; + for (const deviceId of deviceIdsToRemove) { + this.log.info(`Removing accessory for device ${deviceId}`); + const lock = this.locks.get(deviceId); + this.locks.delete(deviceId); + accessoriesToUnregister.push(lock.accessory); + } + this.homebridge.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, accessoriesToUnregister); + const peripherals = await this.discoverCompatiblePeripherals(deviceIdsToAdd); + const accessoriesToRegister = []; + for (const deviceId of deviceIdsToAdd) { + // We're only going to add accessories for devices that are in Bluetooth range. + const peripheral = peripherals.get(deviceId); + if (!peripheral) { + continue; + } + const device = devices.get(deviceId); + const uuid = this.homebridge.hap.uuid.generate(`BoldSmartLock-BLE-${device.id}`); + const accessory = new this.homebridge.platformAccessory(device.name, uuid, 6 /* DOOR_LOCK */); + accessory.context = device; + this.configureAccessory(accessory); + this.locks.get(deviceId).peripheral = peripheral; + accessoriesToRegister.push(accessory); + } + this.homebridge.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, accessoriesToRegister); + const accessoriesToUpdate = []; + for (const deviceId of deviceIdsToUpdate) { + const lock = this.locks.get(deviceId); + lock.accessory.context = devices.get(deviceId); + accessoriesToUpdate.push(lock.accessory); + } + this.homebridge.updatePlatformAccessories(accessoriesToUpdate); + } + async discoverPeripherals() { + // Discovered peripherals for configured accessories for which we don't have a peripheral. + // This happens when Homebridge starts and restores previously added accessories from cache. + const deviceIds = Array.from(this.locks.entries()) + .filter(([, lock]) => !lock.peripheral) + .map(([deviceId]) => deviceId); + const peripherals = await this.discoverCompatiblePeripherals(deviceIds); + for (const deviceId of deviceIds) { + const lock = this.locks.get(deviceId); + const peripheral = peripherals.get(deviceId); + if (lock && peripheral) { + lock.peripheral = peripheral; + } + } + } + async updateHandshakes(forceUpdate = false) { + var _a, _b; + for (const [deviceId, lock] of this.locks) { + if (forceUpdate || + !lock.handshake || + new Date(lock.handshake.expiration).getTime() - new Date().getTime() < HANDSHAKE_UPDATE_MARGIN) { + try { + const handshakes = (_b = (await ((_a = this.api) === null || _a === void 0 ? void 0 : _a.getHandshakes(deviceId)))) !== null && _b !== void 0 ? _b : []; + const handshake = handshakes.shift(); + if (handshake) { + this.log.debug(`Updated handshake for device ${deviceId}`); + lock.handshake = handshake; + } + else { + this.log.warn(`Did not receive any handshake for device ${deviceId}`); + } + } + catch (error) { + this.log.error(error.message); + } + } + } + } + async updateCommands(forceUpdate = false) { + var _a, _b; + for (const [deviceId, lock] of this.locks) { + if (forceUpdate || + !lock.activateCommand || + new Date(lock.activateCommand.expiration).getTime() - new Date().getTime() < COMMAND_UPDATE_MARGIN) { + try { + const commands = (_b = (await ((_a = this.api) === null || _a === void 0 ? void 0 : _a.getActivateCommands(deviceId)))) !== null && _b !== void 0 ? _b : []; + const command = commands.shift(); + if (command) { + this.log.debug(`Updated activate-command for device ${deviceId}`); + lock.activateCommand = command; + } + else { + this.log.warn(`Did not receive any activate-command for device ${deviceId}`); + } + } + catch (error) { + this.log.error(error.message); + } + } + } + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..e10f357 --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/homebridge-ui/public/assets/index-a195e368.js b/homebridge-ui/public/assets/index-a195e368.js new file mode 100644 index 0000000..b383082 --- /dev/null +++ b/homebridge-ui/public/assets/index-a195e368.js @@ -0,0 +1,42 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const u of o.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&r(u)}).observe(document,{childList:!0,subtree:!0});function n(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(l){if(l.ep)return;l.ep=!0;const o=n(l);fetch(l.href,o)}})();var H=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Ts(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Kr={},Ac={get exports(){return Kr},set exports(e){Kr=e}},_l={},le={},$c={get exports(){return le},set exports(e){le=e}},x={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ar=Symbol.for("react.element"),Wc=Symbol.for("react.portal"),Vc=Symbol.for("react.fragment"),Hc=Symbol.for("react.strict_mode"),Bc=Symbol.for("react.profiler"),Qc=Symbol.for("react.provider"),Kc=Symbol.for("react.context"),Gc=Symbol.for("react.forward_ref"),Yc=Symbol.for("react.suspense"),Jc=Symbol.for("react.memo"),Xc=Symbol.for("react.lazy"),pi=Symbol.iterator;function Zc(e){return e===null||typeof e!="object"?null:(e=pi&&e[pi]||e["@@iterator"],typeof e=="function"?e:null)}var Ls={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},xs=Object.assign,zs={};function Sn(e,t,n){this.props=e,this.context=t,this.refs=zs,this.updater=n||Ls}Sn.prototype.isReactComponent={};Sn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Sn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Is(){}Is.prototype=Sn.prototype;function Su(e,t,n){this.props=e,this.context=t,this.refs=zs,this.updater=n||Ls}var wu=Su.prototype=new Is;wu.constructor=Su;xs(wu,Sn.prototype);wu.isPureReactComponent=!0;var vi=Array.isArray,Ms=Object.prototype.hasOwnProperty,ku={current:null},Rs={key:!0,ref:!0,__self:!0,__source:!0};function Ds(e,t,n){var r,l={},o=null,u=null;if(t!=null)for(r in t.ref!==void 0&&(u=t.ref),t.key!==void 0&&(o=""+t.key),t)Ms.call(t,r)&&!Rs.hasOwnProperty(r)&&(l[r]=t[r]);var i=arguments.length-2;if(i===1)l.children=n;else if(1>>1,X=N[B];if(0>>1;Bl(Jl,L))Ptl(hr,Jl)?(N[B]=hr,N[Pt]=L,B=Pt):(N[B]=Jl,N[Ot]=L,B=Ot);else if(Ptl(hr,L))N[B]=hr,N[Pt]=L,B=Pt;else break e}}return P}function l(N,P){var L=N.sortIndex-P.sortIndex;return L!==0?L:N.id-P.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var u=Date,i=u.now();e.unstable_now=function(){return u.now()-i}}var s=[],a=[],p=1,v=null,h=3,w=!1,g=!1,S=!1,I=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,c=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(N){for(var P=n(a);P!==null;){if(P.callback===null)r(a);else if(P.startTime<=N)r(a),P.sortIndex=P.expirationTime,t(s,P);else break;P=n(a)}}function m(N){if(S=!1,d(N),!g)if(n(s)!==null)g=!0,Nt(_);else{var P=n(a);P!==null&&Yl(m,P.startTime-N)}}function _(N,P){g=!1,S&&(S=!1,f(O),O=-1),w=!0;var L=h;try{for(d(P),v=n(s);v!==null&&(!(v.expirationTime>P)||N&&!J());){var B=v.callback;if(typeof B=="function"){v.callback=null,h=v.priorityLevel;var X=B(v.expirationTime<=P);P=e.unstable_now(),typeof X=="function"?v.callback=X:v===n(s)&&r(s),d(P)}else r(s);v=n(s)}if(v!==null)var vr=!0;else{var Ot=n(a);Ot!==null&&Yl(m,Ot.startTime-P),vr=!1}return vr}finally{v=null,h=L,w=!1}}var k=!1,E=null,O=-1,U=5,T=-1;function J(){return!(e.unstable_now()-TN||125B?(N.sortIndex=L,t(a,N),n(s)===null&&N===n(a)&&(S?(f(O),O=-1):S=!0,Yl(m,L-B))):(N.sortIndex=X,t(s,N),g||w||(g=!0,Nt(_))),N},e.unstable_shouldYield=J,e.unstable_wrapCallback=function(N){var P=h;return function(){var L=h;h=P;try{return N.apply(this,arguments)}finally{h=L}}}})(Us);(function(e){e.exports=Us})(ff);/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Fs=le,we=No;function y(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Oo=Object.prototype.hasOwnProperty,df=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,mi={},yi={};function pf(e){return Oo.call(yi,e)?!0:Oo.call(mi,e)?!1:df.test(e)?yi[e]=!0:(mi[e]=!0,!1)}function vf(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function hf(e,t,n,r){if(t===null||typeof t>"u"||vf(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function fe(e,t,n,r,l,o,u){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=u}var te={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){te[e]=new fe(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];te[t]=new fe(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){te[e]=new fe(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){te[e]=new fe(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){te[e]=new fe(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){te[e]=new fe(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){te[e]=new fe(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){te[e]=new fe(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){te[e]=new fe(e,5,!1,e.toLowerCase(),null,!1,!1)});var _u=/[\-:]([a-z])/g;function Cu(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(_u,Cu);te[t]=new fe(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(_u,Cu);te[t]=new fe(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(_u,Cu);te[t]=new fe(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){te[e]=new fe(e,1,!1,e.toLowerCase(),null,!1,!1)});te.xlinkHref=new fe("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){te[e]=new fe(e,1,!1,e.toLowerCase(),null,!0,!0)});function Nu(e,t,n,r){var l=te.hasOwnProperty(t)?te[t]:null;(l!==null?l.type!==0:r||!(2i||l[u]!==o[i]){var s=` +`+l[u].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=u&&0<=i);break}}}finally{ql=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?zn(e):""}function mf(e){switch(e.tag){case 5:return zn(e.type);case 16:return zn("Lazy");case 13:return zn("Suspense");case 19:return zn("SuspenseList");case 0:case 2:case 15:return e=bl(e.type,!1),e;case 11:return e=bl(e.type.render,!1),e;case 1:return e=bl(e.type,!0),e;default:return""}}function xo(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Gt:return"Fragment";case Kt:return"Portal";case Po:return"Profiler";case Ou:return"StrictMode";case To:return"Suspense";case Lo:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Ws:return(e.displayName||"Context")+".Consumer";case $s:return(e._context.displayName||"Context")+".Provider";case Pu:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Tu:return t=e.displayName||null,t!==null?t:xo(e.type)||"Memo";case lt:t=e._payload,e=e._init;try{return xo(e(t))}catch{}}return null}function yf(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return xo(t);case 8:return t===Ou?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function St(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Hs(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function gf(e){var t=Hs(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(u){r=""+u,o.call(this,u)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(u){r=""+u},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Sr(e){e._valueTracker||(e._valueTracker=gf(e))}function Bs(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Hs(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Yr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function zo(e,t){var n=t.checked;return W({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Si(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=St(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Qs(e,t){t=t.checked,t!=null&&Nu(e,"checked",t,!1)}function Io(e,t){Qs(e,t);var n=St(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Mo(e,t.type,n):t.hasOwnProperty("defaultValue")&&Mo(e,t.type,St(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function wi(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Mo(e,t,n){(t!=="number"||Yr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var In=Array.isArray;function on(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=wr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Kn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var jn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sf=["Webkit","ms","Moz","O"];Object.keys(jn).forEach(function(e){Sf.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),jn[t]=jn[e]})});function Js(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||jn.hasOwnProperty(e)&&jn[e]?(""+t).trim():t+"px"}function Xs(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=Js(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var wf=W({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function jo(e,t){if(t){if(wf[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(y(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(y(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(y(61))}if(t.style!=null&&typeof t.style!="object")throw Error(y(62))}}function Uo(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Fo=null;function Lu(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ao=null,un=null,sn=null;function _i(e){if(e=dr(e)){if(typeof Ao!="function")throw Error(y(280));var t=e.stateNode;t&&(t=Tl(t),Ao(e.stateNode,e.type,t))}}function Zs(e){un?sn?sn.push(e):sn=[e]:un=e}function qs(){if(un){var e=un,t=sn;if(sn=un=null,_i(e),t)for(e=0;e>>=0,e===0?32:31-(zf(e)/If|0)|0}var kr=64,Er=4194304;function Mn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function qr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,u=n&268435455;if(u!==0){var i=u&~l;i!==0?r=Mn(i):(o&=u,o!==0&&(r=Mn(o)))}else u=n&~l,u!==0?r=Mn(u):o!==0&&(r=Mn(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function cr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Me(t),e[t]=n}function jf(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Fn),Ii=String.fromCharCode(32),Mi=!1;function ga(e,t){switch(e){case"keyup":return cd.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Sa(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Yt=!1;function dd(e,t){switch(e){case"compositionend":return Sa(t);case"keypress":return t.which!==32?null:(Mi=!0,Ii);case"textInput":return e=t.data,e===Ii&&Mi?null:e;default:return null}}function pd(e,t){if(Yt)return e==="compositionend"||!Uu&&ga(e,t)?(e=ma(),Ur=Ru=at=null,Yt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ui(n)}}function _a(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?_a(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ca(){for(var e=window,t=Yr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Yr(e.document)}return t}function Fu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Ed(e){var t=Ca(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&_a(n.ownerDocument.documentElement,n)){if(r!==null&&Fu(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=Fi(n,o);var u=Fi(n,r);l&&u&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==u.node||e.focusOffset!==u.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(u.node,u.offset)):(t.setEnd(u.node,u.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Jt=null,Qo=null,$n=null,Ko=!1;function Ai(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ko||Jt==null||Jt!==Yr(r)||(r=Jt,"selectionStart"in r&&Fu(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),$n&&qn($n,r)||($n=r,r=tl(Qo,"onSelect"),0qt||(e.current=qo[qt],qo[qt]=null,qt--)}function R(e,t){qt++,qo[qt]=e.current,e.current=t}var wt={},ue=_t(wt),ve=_t(!1),jt=wt;function pn(e,t){var n=e.type.contextTypes;if(!n)return wt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function he(e){return e=e.childContextTypes,e!=null}function rl(){j(ve),j(ue)}function Ki(e,t,n){if(ue.current!==wt)throw Error(y(168));R(ue,t),R(ve,n)}function Ma(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(y(108,yf(e)||"Unknown",l));return W({},n,r)}function ll(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||wt,jt=ue.current,R(ue,e),R(ve,ve.current),!0}function Gi(e,t,n){var r=e.stateNode;if(!r)throw Error(y(169));n?(e=Ma(e,t,jt),r.__reactInternalMemoizedMergedChildContext=e,j(ve),j(ue),R(ue,e)):j(ve),R(ve,n)}var Qe=null,Ll=!1,vo=!1;function Ra(e){Qe===null?Qe=[e]:Qe.push(e)}function Rd(e){Ll=!0,Ra(e)}function Ct(){if(!vo&&Qe!==null){vo=!0;var e=0,t=M;try{var n=Qe;for(M=1;e>=u,l-=u,Ke=1<<32-Me(t)+l|n<O?(U=E,E=null):U=E.sibling;var T=h(f,E,d[O],m);if(T===null){E===null&&(E=U);break}e&&E&&T.alternate===null&&t(f,E),c=o(T,c,O),k===null?_=T:k.sibling=T,k=T,E=U}if(O===d.length)return n(f,E),F&&Tt(f,O),_;if(E===null){for(;OO?(U=E,E=null):U=E.sibling;var J=h(f,E,T.value,m);if(J===null){E===null&&(E=U);break}e&&E&&J.alternate===null&&t(f,E),c=o(J,c,O),k===null?_=J:k.sibling=J,k=J,E=U}if(T.done)return n(f,E),F&&Tt(f,O),_;if(E===null){for(;!T.done;O++,T=d.next())T=v(f,T.value,m),T!==null&&(c=o(T,c,O),k===null?_=T:k.sibling=T,k=T);return F&&Tt(f,O),_}for(E=r(f,E);!T.done;O++,T=d.next())T=w(E,f,O,T.value,m),T!==null&&(e&&T.alternate!==null&&E.delete(T.key===null?O:T.key),c=o(T,c,O),k===null?_=T:k.sibling=T,k=T);return e&&E.forEach(function(tt){return t(f,tt)}),F&&Tt(f,O),_}function I(f,c,d,m){if(typeof d=="object"&&d!==null&&d.type===Gt&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case gr:e:{for(var _=d.key,k=c;k!==null;){if(k.key===_){if(_=d.type,_===Gt){if(k.tag===7){n(f,k.sibling),c=l(k,d.props.children),c.return=f,f=c;break e}}else if(k.elementType===_||typeof _=="object"&&_!==null&&_.$$typeof===lt&&es(_)===k.type){n(f,k.sibling),c=l(k,d.props),c.ref=Tn(f,k,d),c.return=f,f=c;break e}n(f,k);break}else t(f,k);k=k.sibling}d.type===Gt?(c=Rt(d.props.children,f.mode,m,d.key),c.return=f,f=c):(m=Qr(d.type,d.key,d.props,null,f.mode,m),m.ref=Tn(f,c,d),m.return=f,f=m)}return u(f);case Kt:e:{for(k=d.key;c!==null;){if(c.key===k)if(c.tag===4&&c.stateNode.containerInfo===d.containerInfo&&c.stateNode.implementation===d.implementation){n(f,c.sibling),c=l(c,d.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=Eo(d,f.mode,m),c.return=f,f=c}return u(f);case lt:return k=d._init,I(f,c,k(d._payload),m)}if(In(d))return g(f,c,d,m);if(_n(d))return S(f,c,d,m);Lr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,c!==null&&c.tag===6?(n(f,c.sibling),c=l(c,d),c.return=f,f=c):(n(f,c),c=ko(d,f.mode,m),c.return=f,f=c),u(f)):n(f,c)}return I}var hn=Va(!0),Ha=Va(!1),pr={},We=_t(pr),nr=_t(pr),rr=_t(pr);function It(e){if(e===pr)throw Error(y(174));return e}function Gu(e,t){switch(R(rr,t),R(nr,e),R(We,pr),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Do(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Do(t,e)}j(We),R(We,t)}function mn(){j(We),j(nr),j(rr)}function Ba(e){It(rr.current);var t=It(We.current),n=Do(t,e.type);t!==n&&(R(nr,e),R(We,n))}function Yu(e){nr.current===e&&(j(We),j(nr))}var A=_t(0);function cl(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ho=[];function Ju(){for(var e=0;en?n:4,e(!0);var r=mo.transition;mo.transition={};try{e(!1),t()}finally{M=n,mo.transition=r}}function uc(){return Te().memoizedState}function Fd(e,t,n){var r=yt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},ic(e))sc(t,n);else if(n=Fa(e,t,n,r),n!==null){var l=ae();Re(n,e,r,l),ac(n,t,r)}}function Ad(e,t,n){var r=yt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(ic(e))sc(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var u=t.lastRenderedState,i=o(u,n);if(l.hasEagerState=!0,l.eagerState=i,De(i,u)){var s=t.interleaved;s===null?(l.next=l,Qu(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=Fa(e,t,l,r),n!==null&&(l=ae(),Re(n,e,r,l),ac(n,t,r))}}function ic(e){var t=e.alternate;return e===$||t!==null&&t===$}function sc(e,t){Wn=fl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function ac(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,zu(e,n)}}var dl={readContext:Pe,useCallback:ne,useContext:ne,useEffect:ne,useImperativeHandle:ne,useInsertionEffect:ne,useLayoutEffect:ne,useMemo:ne,useReducer:ne,useRef:ne,useState:ne,useDebugValue:ne,useDeferredValue:ne,useTransition:ne,useMutableSource:ne,useSyncExternalStore:ne,useId:ne,unstable_isNewReconciler:!1},$d={readContext:Pe,useCallback:function(e,t){return Ue().memoizedState=[e,t===void 0?null:t],e},useContext:Pe,useEffect:ns,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Wr(4194308,4,tc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Wr(4194308,4,e,t)},useInsertionEffect:function(e,t){return Wr(4,2,e,t)},useMemo:function(e,t){var n=Ue();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ue();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Fd.bind(null,$,e),[r.memoizedState,e]},useRef:function(e){var t=Ue();return e={current:e},t.memoizedState=e},useState:ts,useDebugValue:ei,useDeferredValue:function(e){return Ue().memoizedState=e},useTransition:function(){var e=ts(!1),t=e[0];return e=Ud.bind(null,e[1]),Ue().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=$,l=Ue();if(F){if(n===void 0)throw Error(y(407));n=n()}else{if(n=t(),q===null)throw Error(y(349));Ft&30||Ga(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,ns(Ja.bind(null,r,o,e),[e]),r.flags|=2048,ur(9,Ya.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Ue(),t=q.identifierPrefix;if(F){var n=Ge,r=Ke;n=(r&~(1<<32-Me(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=lr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=u.createElement(n,{is:r.is}):(e=u.createElement(n),n==="select"&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,n),e[Fe]=t,e[tr]=r,gc(e,t,!1,!1),t.stateNode=e;e:{switch(u=Uo(n,r),n){case"dialog":D("cancel",e),D("close",e),l=r;break;case"iframe":case"object":case"embed":D("load",e),l=r;break;case"video":case"audio":for(l=0;lgn&&(t.flags|=128,r=!0,Ln(o,!1),t.lanes=4194304)}else{if(!r)if(e=cl(u),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Ln(o,!0),o.tail===null&&o.tailMode==="hidden"&&!u.alternate&&!F)return re(t),null}else 2*Q()-o.renderingStartTime>gn&&n!==1073741824&&(t.flags|=128,r=!0,Ln(o,!1),t.lanes=4194304);o.isBackwards?(u.sibling=t.child,t.child=u):(n=o.last,n!==null?n.sibling=u:t.child=u,o.last=u)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Q(),t.sibling=null,n=A.current,R(A,r?n&1|2:n&1),t):(re(t),null);case 22:case 23:return ui(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ye&1073741824&&(re(t),t.subtreeFlags&6&&(t.flags|=8192)):re(t),null;case 24:return null;case 25:return null}throw Error(y(156,t.tag))}function Yd(e,t){switch($u(t),t.tag){case 1:return he(t.type)&&rl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return mn(),j(ve),j(ue),Ju(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Yu(t),null;case 13:if(j(A),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(y(340));vn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return j(A),null;case 4:return mn(),null;case 10:return Bu(t.type._context),null;case 22:case 23:return ui(),null;case 24:return null;default:return null}}var zr=!1,oe=!1,Jd=typeof WeakSet=="function"?WeakSet:Set,C=null;function nn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){V(e,t,r)}else n.current=null}function cu(e,t,n){try{n()}catch(r){V(e,t,r)}}var fs=!1;function Xd(e,t){if(Go=br,e=Ca(),Fu(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var u=0,i=-1,s=-1,a=0,p=0,v=e,h=null;t:for(;;){for(var w;v!==n||l!==0&&v.nodeType!==3||(i=u+l),v!==o||r!==0&&v.nodeType!==3||(s=u+r),v.nodeType===3&&(u+=v.nodeValue.length),(w=v.firstChild)!==null;)h=v,v=w;for(;;){if(v===e)break t;if(h===n&&++a===l&&(i=u),h===o&&++p===r&&(s=u),(w=v.nextSibling)!==null)break;v=h,h=v.parentNode}v=w}n=i===-1||s===-1?null:{start:i,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(Yo={focusedElem:e,selectionRange:n},br=!1,C=t;C!==null;)if(t=C,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,C=e;else for(;C!==null;){t=C;try{var g=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(g!==null){var S=g.memoizedProps,I=g.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?S:xe(t.type,S),I);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(y(163))}}catch(m){V(t,t.return,m)}if(e=t.sibling,e!==null){e.return=t.return,C=e;break}C=t.return}return g=fs,fs=!1,g}function Vn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&cu(t,n,o)}l=l.next}while(l!==r)}}function Il(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function fu(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function kc(e){var t=e.alternate;t!==null&&(e.alternate=null,kc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Fe],delete t[tr],delete t[Zo],delete t[Id],delete t[Md])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ec(e){return e.tag===5||e.tag===3||e.tag===4}function ds(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ec(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function du(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=nl));else if(r!==4&&(e=e.child,e!==null))for(du(e,t,n),e=e.sibling;e!==null;)du(e,t,n),e=e.sibling}function pu(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(pu(e,t,n),e=e.sibling;e!==null;)pu(e,t,n),e=e.sibling}var b=null,ze=!1;function rt(e,t,n){for(n=n.child;n!==null;)_c(e,t,n),n=n.sibling}function _c(e,t,n){if($e&&typeof $e.onCommitFiberUnmount=="function")try{$e.onCommitFiberUnmount(Cl,n)}catch{}switch(n.tag){case 5:oe||nn(n,t);case 6:var r=b,l=ze;b=null,rt(e,t,n),b=r,ze=l,b!==null&&(ze?(e=b,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):b.removeChild(n.stateNode));break;case 18:b!==null&&(ze?(e=b,n=n.stateNode,e.nodeType===8?po(e.parentNode,n):e.nodeType===1&&po(e,n),Xn(e)):po(b,n.stateNode));break;case 4:r=b,l=ze,b=n.stateNode.containerInfo,ze=!0,rt(e,t,n),b=r,ze=l;break;case 0:case 11:case 14:case 15:if(!oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,u=o.destroy;o=o.tag,u!==void 0&&(o&2||o&4)&&cu(n,t,u),l=l.next}while(l!==r)}rt(e,t,n);break;case 1:if(!oe&&(nn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(i){V(n,t,i)}rt(e,t,n);break;case 21:rt(e,t,n);break;case 22:n.mode&1?(oe=(r=oe)||n.memoizedState!==null,rt(e,t,n),oe=r):rt(e,t,n);break;default:rt(e,t,n)}}function ps(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Jd),t.forEach(function(r){var l=op.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Le(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=u),r&=~o}if(r=l,r=Q()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*qd(r/1960))-r,10e?16:e,ct===null)var r=!1;else{if(e=ct,ct=null,hl=0,z&6)throw Error(y(331));var l=z;for(z|=4,C=e.current;C!==null;){var o=C,u=o.child;if(C.flags&16){var i=o.deletions;if(i!==null){for(var s=0;sQ()-li?Mt(e,0):ri|=n),me(e,t)}function zc(e,t){t===0&&(e.mode&1?(t=Er,Er<<=1,!(Er&130023424)&&(Er=4194304)):t=1);var n=ae();e=Ze(e,t),e!==null&&(cr(e,t,n),me(e,n))}function lp(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),zc(e,n)}function op(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(y(314))}r!==null&&r.delete(t),zc(e,n)}var Ic;Ic=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||ve.current)pe=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return pe=!1,Kd(e,t,n);pe=!!(e.flags&131072)}else pe=!1,F&&t.flags&1048576&&Da(t,ul,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Vr(e,t),e=t.pendingProps;var l=pn(t,ue.current);cn(t,n),l=Zu(null,t,r,e,l,n);var o=qu();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,he(r)?(o=!0,ll(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Ku(t),l.updater=xl,t.stateNode=l,l._reactInternals=t,ru(t,r,e,n),t=uu(null,t,r,!0,o,n)):(t.tag=0,F&&o&&Au(t),se(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Vr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=ip(r),e=xe(r,e),l){case 0:t=ou(null,t,r,e,n);break e;case 1:t=ss(null,t,r,e,n);break e;case 11:t=us(null,t,r,e,n);break e;case 14:t=is(null,t,r,xe(r.type,e),n);break e}throw Error(y(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:xe(r,l),ou(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:xe(r,l),ss(e,t,r,l,n);case 3:e:{if(hc(t),e===null)throw Error(y(387));r=t.pendingProps,o=t.memoizedState,l=o.element,Aa(e,t),al(t,r,null,n);var u=t.memoizedState;if(r=u.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:u.cache,pendingSuspenseBoundaries:u.pendingSuspenseBoundaries,transitions:u.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=yn(Error(y(423)),t),t=as(e,t,r,n,l);break e}else if(r!==l){l=yn(Error(y(424)),t),t=as(e,t,r,n,l);break e}else for(ge=vt(t.stateNode.containerInfo.firstChild),Se=t,F=!0,Ie=null,n=Ha(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(vn(),r===l){t=qe(e,t,n);break e}se(e,t,r,n)}t=t.child}return t;case 5:return Ba(t),e===null&&eu(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,u=l.children,Jo(r,l)?u=null:o!==null&&Jo(r,o)&&(t.flags|=32),vc(e,t),se(e,t,u,n),t.child;case 6:return e===null&&eu(t),null;case 13:return mc(e,t,n);case 4:return Gu(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=hn(t,null,r,n):se(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:xe(r,l),us(e,t,r,l,n);case 7:return se(e,t,t.pendingProps,n),t.child;case 8:return se(e,t,t.pendingProps.children,n),t.child;case 12:return se(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,u=l.value,R(il,r._currentValue),r._currentValue=u,o!==null)if(De(o.value,u)){if(o.children===l.children&&!ve.current){t=qe(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var i=o.dependencies;if(i!==null){u=o.child;for(var s=i.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=Ye(-1,n&-n),s.tag=2;var a=o.updateQueue;if(a!==null){a=a.shared;var p=a.pending;p===null?s.next=s:(s.next=p.next,p.next=s),a.pending=s}}o.lanes|=n,s=o.alternate,s!==null&&(s.lanes|=n),tu(o.return,n,t),i.lanes|=n;break}s=s.next}}else if(o.tag===10)u=o.type===t.type?null:o.child;else if(o.tag===18){if(u=o.return,u===null)throw Error(y(341));u.lanes|=n,i=u.alternate,i!==null&&(i.lanes|=n),tu(u,n,t),u=o.sibling}else u=o.child;if(u!==null)u.return=o;else for(u=o;u!==null;){if(u===t){u=null;break}if(o=u.sibling,o!==null){o.return=u.return,u=o;break}u=u.return}o=u}se(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,cn(t,n),l=Pe(l),r=r(l),t.flags|=1,se(e,t,r,n),t.child;case 14:return r=t.type,l=xe(r,t.pendingProps),l=xe(r.type,l),is(e,t,r,l,n);case 15:return dc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:xe(r,l),Vr(e,t),t.tag=1,he(r)?(e=!0,ll(t)):e=!1,cn(t,n),Wa(t,r,l),ru(t,r,l,n),uu(null,t,r,!0,e,n);case 19:return yc(e,t,n);case 22:return pc(e,t,n)}throw Error(y(156,t.tag))};function Mc(e,t){return oa(e,t)}function up(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ne(e,t,n,r){return new up(e,t,n,r)}function si(e){return e=e.prototype,!(!e||!e.isReactComponent)}function ip(e){if(typeof e=="function")return si(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Pu)return 11;if(e===Tu)return 14}return 2}function gt(e,t){var n=e.alternate;return n===null?(n=Ne(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Qr(e,t,n,r,l,o){var u=2;if(r=e,typeof e=="function")si(e)&&(u=1);else if(typeof e=="string")u=5;else e:switch(e){case Gt:return Rt(n.children,l,o,t);case Ou:u=8,l|=8;break;case Po:return e=Ne(12,n,t,l|2),e.elementType=Po,e.lanes=o,e;case To:return e=Ne(13,n,t,l),e.elementType=To,e.lanes=o,e;case Lo:return e=Ne(19,n,t,l),e.elementType=Lo,e.lanes=o,e;case Vs:return Rl(n,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case $s:u=10;break e;case Ws:u=9;break e;case Pu:u=11;break e;case Tu:u=14;break e;case lt:u=16,r=null;break e}throw Error(y(130,e==null?e:typeof e,""))}return t=Ne(u,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function Rt(e,t,n,r){return e=Ne(7,e,r,t),e.lanes=n,e}function Rl(e,t,n,r){return e=Ne(22,e,r,t),e.elementType=Vs,e.lanes=n,e.stateNode={isHidden:!1},e}function ko(e,t,n){return e=Ne(6,e,null,t),e.lanes=n,e}function Eo(e,t,n){return t=Ne(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function sp(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=to(0),this.expirationTimes=to(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=to(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function ai(e,t,n,r,l,o,u,i,s){return e=new sp(e,t,n,i,s),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Ne(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ku(o),e}function ap(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(n){console.error(n)}}t(),e.exports=ke})(cf);var ks=Gr;Co.createRoot=ks.createRoot,Co.hydrateRoot=ks.hydrateRoot;var Uc={},En={},et={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isEventSourceSupported=e.isReactNative=e.ReadyState=e.UNPARSABLE_JSON_OBJECT=e.DEFAULT_RECONNECT_INTERVAL_MS=e.DEFAULT_RECONNECT_LIMIT=e.SOCKET_IO_PING_CODE=e.SOCKET_IO_PATH=e.SOCKET_IO_PING_INTERVAL=e.DEFAULT_EVENT_SOURCE_OPTIONS=e.EMPTY_EVENT_HANDLERS=e.DEFAULT_OPTIONS=void 0;var t=1,n=1e3*t;e.DEFAULT_OPTIONS={},e.EMPTY_EVENT_HANDLERS={},e.DEFAULT_EVENT_SOURCE_OPTIONS={withCredentials:!1,events:e.EMPTY_EVENT_HANDLERS},e.SOCKET_IO_PING_INTERVAL=25*n,e.SOCKET_IO_PATH="/socket.io/?EIO=3&transport=websocket",e.SOCKET_IO_PING_CODE="2",e.DEFAULT_RECONNECT_LIMIT=20,e.DEFAULT_RECONNECT_INTERVAL_MS=5e3,e.UNPARSABLE_JSON_OBJECT={},function(l){l[l.UNINSTANTIATED=-1]="UNINSTANTIATED",l[l.CONNECTING=0]="CONNECTING",l[l.OPEN=1]="OPEN",l[l.CLOSING=2]="CLOSING",l[l.CLOSED=3]="CLOSED"}(e.ReadyState||(e.ReadyState={}));var r=function(){try{return"EventSource"in globalThis}catch{return!1}};e.isReactNative=typeof navigator<"u"&&navigator.product==="ReactNative",e.isEventSourceSupported=!e.isReactNative&&r()})(et);var Al={},$l={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.resetWebSockets=e.sharedWebSockets=void 0,e.sharedWebSockets={};var t=function(n){if(n&&e.sharedWebSockets.hasOwnProperty(n))delete e.sharedWebSockets[n];else for(var r in e.sharedWebSockets)e.sharedWebSockets.hasOwnProperty(r)&&delete e.sharedWebSockets[r]};e.resetWebSockets=t})($l);var Wl={},Ve={};Object.defineProperty(Ve,"__esModule",{value:!0});Ve.setUpSocketIOPing=Ve.appendQueryParams=Ve.parseSocketIOUrl=void 0;var gl=et,vp=function(e){if(e){var t=/^https|wss/.test(e),n=e.replace(/^(https?|wss?)(:\/\/)?/,""),r=n.replace(/\/$/,""),l=t?"wss":"ws";return"".concat(l,"://").concat(r).concat(gl.SOCKET_IO_PATH)}else if(e===""){var t=/^https/.test(window.location.protocol),l=t?"wss":"ws",o=window.location.port?":".concat(window.location.port):"";return"".concat(l,"://").concat(window.location.hostname).concat(o).concat(gl.SOCKET_IO_PATH)}return e};Ve.parseSocketIOUrl=vp;var hp=function(e,t){t===void 0&&(t={});var n=/\?([\w]+=[\w]+)/,r=n.test(e),l="".concat(Object.entries(t).reduce(function(o,u){var i=u[0],s=u[1];return o+"".concat(i,"=").concat(s,"&")},"").slice(0,-1));return"".concat(e).concat(r?"&":"?").concat(l)};Ve.appendQueryParams=hp;var mp=function(e,t){t===void 0&&(t=gl.SOCKET_IO_PING_INTERVAL);var n=function(){return e(gl.SOCKET_IO_PING_CODE)};return window.setInterval(n,t)};Ve.setUpSocketIOPing=mp;var kt={},Vl={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.resetSubscribers=e.removeSubscriber=e.addSubscriber=e.hasSubscribers=e.getSubscribers=void 0;var t={},n=[],r=function(s){return(0,e.hasSubscribers)(s)?Array.from(t[s]):n};e.getSubscribers=r;var l=function(s){var a;return((a=t[s])===null||a===void 0?void 0:a.size)>0};e.hasSubscribers=l;var o=function(s,a){t[s]=t[s]||new Set,t[s].add(a)};e.addSubscriber=o;var u=function(s,a){t[s].delete(a)};e.removeSubscriber=u;var i=function(s){if(s&&t.hasOwnProperty(s))delete t[s];else for(var a in t)t.hasOwnProperty(a)&&delete t[a]};e.resetSubscribers=i})(Vl);Object.defineProperty(kt,"__esModule",{value:!0});kt.resetGlobalState=kt.assertIsWebSocket=void 0;var yp=$l,gp=Vl;function Sp(e,t){if(!t&&!(e instanceof WebSocket))throw new Error("")}kt.assertIsWebSocket=Sp;function wp(e){(0,gp.resetSubscribers)(e),(0,yp.resetWebSockets)(e)}kt.resetGlobalState=wp;var Sl=H&&H.__assign||function(){return Sl=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])&&(a[0]===6||a[0]===2)){n=0;continue}if(a[0]===3&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(a[0]===6||a[0]===2)){n=0;continue}if(a[0]===3&&(!o||a[1]>o[0]&&a[1]{const[e,t]=le.useState(!1),[n,r]=le.useState(),[l,o]=le.useState(!1),[u,i]=le.useState(),{sendJsonMessage:s,lastJsonMessage:a}=nv(l?rv:null,{onError(){r(new Error("Could not connect WebSocket"))}});le.useEffect(()=>{(async()=>{const g=await homebridge.getPluginConfig();g&&g.length>0&&g[0].accessToken&&g[0].refreshToken&&t(!0)})()},[]),le.useEffect(()=>{e?homebridge.showSchemaForm():homebridge.hideSchemaForm()},[e]),le.useEffect(()=>{n&&(o(!1),i(void 0))},[n]),le.useEffect(()=>{if(!a||!("action"in a))return;const g=a;if(g.action==="oauthBegin"){const S=g.payload.callbackId;i(`${ov}?response_type=code&client_id=HomeBridge&redirect_uri=${encodeURIComponent(lv)}&state=${encodeURIComponent(S)}`)}else g.action==="oauthCallback"&&(async()=>{let S=await homebridge.getPluginConfig();(!S||S.length==0)&&(S=[{platform:"BoldBLE"}]),S[0].accessToken=g.payload.accessToken,S[0].refreshToken=g.payload.refreshToken,S[0].legacyAuthentication=!1,delete S[0].refreshURL,await homebridge.updatePluginConfig(S),o(!1),t(!0)})()},[a]);let p="",v="",h=!1,w;return l?u?(p="Click the button below to sign into your Bold account in a new tab.",v="Sign in at Bold",w=()=>{window.open(u)}):(h=!0,v="Initializing..."):(n?(p="Click the button below to retry the authentication process.",v="Retry Authentication"):e?(p=`Plugin configured! +Click the button below if you wish to redo the authentication process.`,v="Re-Authenticate"):(p="Click the button below to start the process of authenticating your Bold account.",v="Authenticate"),w=()=>{r(void 0),o(!0),i(void 0),s({action:"oauthBegin"})}),yr("div",{className:"d-flex flex-column align-items-center text-center",children:[n&&yr("div",{className:"alert alert-danger align-self-stretch",role:"alert",children:[Qt("b",{children:"Error:"})," ",n.message]}),p&&p.split(` +`).map(g=>Qt("div",{className:"mb-2",children:g})),yr("button",{className:"btn btn-primary",type:"button",disabled:h,onClick:w,children:[h&&Qt("span",{className:"spinner-border spinner-border-sm mr-2",role:"status","aria-hidden":"true"}),v]}),!l&&yr("div",{className:"mt-2",children:["Click"," ",Qt("a",{href:"https://github.com/robbertkl/homebridge-bold-ble#configuration",target:"_blank",children:"here"})," ","for more info on the plugin configuration."]})]})};Co.createRoot(document.getElementById("root")).render(Qt(nf.StrictMode,{children:Qt(uv,{})})); diff --git a/homebridge-ui/public/index.html b/homebridge-ui/public/index.html new file mode 100644 index 0000000..557101e --- /dev/null +++ b/homebridge-ui/public/index.html @@ -0,0 +1,2 @@ + +