UNPKG

homebridge

Version:
85 lines 3.25 kB
/** * Commissioning Manager * * Handles passcode generation, discriminator generation, credential persistence, * QR code rendering, commissioning event listeners, and commissioning file updates. */ import type { ServerNode } from '@matter/main'; import type { EventEmitter } from 'node:events'; import type { MatterServerConfig } from '../sharedTypes.js'; import type { CommissioningSnapshot, FabricManager } from './FabricManager.js'; export interface CommissioningInfo { qrCode?: string; manualPairingCode?: string; qrCodeUrl?: string; } export interface CommissioningDeps { config: MatterServerConfig; serverNode: ServerNode | null; matterStoragePath?: string; serialNumber?: string; emitter: EventEmitter; fabricManager: FabricManager; } export declare class CommissioningManager { passcode: number; discriminator: number; readonly vendorId: number; readonly productId: number; commissioningInfo: CommissioningInfo; private onFabricsChanged; private onCommissioned; private onDecommissioned; constructor(); /** * Generate a secure random passcode * According to Matter spec, passcode must be: * - 8 digits (00000001 to 99999998) * - Not in the invalid list * - Not sequential or repeating patterns */ generateSecurePasscode(): number; /** * Validate a passcode according to Matter specifications */ isValidPasscode(passcode: number): boolean; /** * Generate a random discriminator * According to Matter spec, discriminator must be: * - 12 bits (0-4095) * - Should be random for security */ generateRandomDiscriminator(): number; /** * Load or generate commissioning credentials (passcode and discriminator) * Reads/writes a simple credentials.json file in the bridge storage directory. */ loadOrGenerateCredentials(matterStoragePath: string): Promise<void>; /** * Generate and display commissioning information */ generateCommissioningInfo(deps: CommissioningDeps): Promise<void>; /** * Set up Matter.js commissioning event listeners */ setupCommissioningEventListeners(deps: CommissioningDeps): void; /** * Remove Matter.js commissioning event listeners. * * Called from ServerLifecycle.cleanup() to release the closures that capture * deps (serverNode, fabricManager, emitter, matterStoragePath) and `this`. * Without this, the matter.js Observable retains the observer across stop() * cycles, holding the entire CommissioningDeps graph from GC. */ teardownCommissioningEventListeners(serverNode: ServerNode | null): void; /** * Update commissioning info file when commissioning state changes. * * Pass a precomputed `snapshot` to avoid redundant fabric reads — each of * isCommissioned(), getCommissionedFabricCount(), and getFabricInfo() may * scan the matter storage directory synchronously, and they're called in * tight succession from the commissioning event handlers. */ updateCommissioningFile(deps: CommissioningDeps, snapshot?: CommissioningSnapshot): Promise<void>; } //# sourceMappingURL=CommissioningManager.d.ts.map