@fastybird/smart-panel-backend 1.1.0-alpha.0 → 1.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/app.module.js +7 -0
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/modules/devices/services/property-command.service.d.ts +8 -0
  4. package/dist/modules/devices/services/property-command.service.js +115 -0
  5. package/dist/modules/devices/services/property-command.service.js.map +1 -1
  6. package/dist/modules/mcp/oauth/mcp-oauth-provider.factory.js.map +1 -1
  7. package/dist/modules/remote-access/services/remote-access-proxy-contribution.service.js +4 -0
  8. package/dist/modules/remote-access/services/remote-access-proxy-contribution.service.js.map +1 -1
  9. package/dist/modules/remote-access/services/remote-access-status.service.d.ts +5 -1
  10. package/dist/modules/remote-access/services/remote-access-status.service.js +38 -4
  11. package/dist/modules/remote-access/services/remote-access-status.service.js.map +1 -1
  12. package/dist/modules/remote-access/services/remote-access-url.service.js +4 -0
  13. package/dist/modules/remote-access/services/remote-access-url.service.js.map +1 -1
  14. package/dist/modules/system/commands/command.utils.d.ts +2 -0
  15. package/dist/modules/system/commands/command.utils.js +14 -0
  16. package/dist/modules/system/commands/command.utils.js.map +1 -1
  17. package/dist/modules/system/commands/update-check.command.js +2 -3
  18. package/dist/modules/system/commands/update-check.command.js.map +1 -1
  19. package/dist/modules/system/commands/update-panel.command.js +2 -2
  20. package/dist/modules/system/commands/update-panel.command.js.map +1 -1
  21. package/dist/modules/system/commands/update-server.command.d.ts +1 -0
  22. package/dist/modules/system/commands/update-server.command.js +36 -11
  23. package/dist/modules/system/commands/update-server.command.js.map +1 -1
  24. package/dist/modules/system/dto/update-config.dto.d.ts +2 -1
  25. package/dist/modules/system/dto/update-config.dto.js +15 -0
  26. package/dist/modules/system/dto/update-config.dto.js.map +1 -1
  27. package/dist/modules/system/models/config.model.d.ts +2 -1
  28. package/dist/modules/system/models/config.model.js +13 -0
  29. package/dist/modules/system/models/config.model.js.map +1 -1
  30. package/dist/modules/system/services/update.service.d.ts +11 -1
  31. package/dist/modules/system/services/update.service.js +97 -35
  32. package/dist/modules/system/services/update.service.js.map +1 -1
  33. package/dist/modules/system/system.constants.d.ts +6 -0
  34. package/dist/modules/system/system.constants.js +8 -1
  35. package/dist/modules/system/system.constants.js.map +1 -1
  36. package/dist/modules/websocket/gateway/websocket.gateway.d.ts +3 -0
  37. package/dist/modules/websocket/gateway/websocket.gateway.js +39 -4
  38. package/dist/modules/websocket/gateway/websocket.gateway.js.map +1 -1
  39. package/dist/plugins/devices-homekit/controllers/homekit-bridge.controller.d.ts +14 -0
  40. package/dist/plugins/devices-homekit/controllers/homekit-bridge.controller.js +125 -0
  41. package/dist/plugins/devices-homekit/controllers/homekit-bridge.controller.js.map +1 -0
  42. package/dist/plugins/devices-homekit/devices-homekit.constants.d.ts +16 -0
  43. package/dist/plugins/devices-homekit/devices-homekit.constants.js +57 -0
  44. package/dist/plugins/devices-homekit/devices-homekit.constants.js.map +1 -0
  45. package/dist/plugins/devices-homekit/devices-homekit.exceptions.d.ts +12 -0
  46. package/dist/plugins/devices-homekit/devices-homekit.exceptions.js +32 -0
  47. package/dist/plugins/devices-homekit/devices-homekit.exceptions.js.map +1 -0
  48. package/dist/plugins/devices-homekit/devices-homekit.openapi.d.ts +6 -0
  49. package/dist/plugins/devices-homekit/devices-homekit.openapi.js +19 -0
  50. package/dist/plugins/devices-homekit/devices-homekit.openapi.js.map +1 -0
  51. package/dist/plugins/devices-homekit/devices-homekit.plugin.d.ts +24 -0
  52. package/dist/plugins/devices-homekit/devices-homekit.plugin.js +183 -0
  53. package/dist/plugins/devices-homekit/devices-homekit.plugin.js.map +1 -0
  54. package/dist/plugins/devices-homekit/dto/bridge-map.dto.d.ts +6 -0
  55. package/dist/plugins/devices-homekit/dto/bridge-map.dto.js +50 -0
  56. package/dist/plugins/devices-homekit/dto/bridge-map.dto.js.map +1 -0
  57. package/dist/plugins/devices-homekit/dto/update-config.dto.d.ts +11 -0
  58. package/dist/plugins/devices-homekit/dto/update-config.dto.js +138 -0
  59. package/dist/plugins/devices-homekit/dto/update-config.dto.js.map +1 -0
  60. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.d.ts +8 -0
  61. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js +72 -0
  62. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js.map +1 -0
  63. package/dist/plugins/devices-homekit/mappers/base.mapper.d.ts +15 -0
  64. package/dist/plugins/devices-homekit/mappers/base.mapper.js +74 -0
  65. package/dist/plugins/devices-homekit/mappers/base.mapper.js.map +1 -0
  66. package/dist/plugins/devices-homekit/mappers/battery.mapper.d.ts +6 -0
  67. package/dist/plugins/devices-homekit/mappers/battery.mapper.js +130 -0
  68. package/dist/plugins/devices-homekit/mappers/battery.mapper.js.map +1 -0
  69. package/dist/plugins/devices-homekit/mappers/homekit-mapper.interface.d.ts +28 -0
  70. package/dist/plugins/devices-homekit/mappers/homekit-mapper.interface.js +3 -0
  71. package/dist/plugins/devices-homekit/mappers/homekit-mapper.interface.js.map +1 -0
  72. package/dist/plugins/devices-homekit/mappers/lightbulb.mapper.d.ts +9 -0
  73. package/dist/plugins/devices-homekit/mappers/lightbulb.mapper.js +115 -0
  74. package/dist/plugins/devices-homekit/mappers/lightbulb.mapper.js.map +1 -0
  75. package/dist/plugins/devices-homekit/mappers/lock.mapper.d.ts +10 -0
  76. package/dist/plugins/devices-homekit/mappers/lock.mapper.js +59 -0
  77. package/dist/plugins/devices-homekit/mappers/lock.mapper.js.map +1 -0
  78. package/dist/plugins/devices-homekit/mappers/outlet.mapper.d.ts +9 -0
  79. package/dist/plugins/devices-homekit/mappers/outlet.mapper.js +44 -0
  80. package/dist/plugins/devices-homekit/mappers/outlet.mapper.js.map +1 -0
  81. package/dist/plugins/devices-homekit/mappers/sensor.mapper.d.ts +10 -0
  82. package/dist/plugins/devices-homekit/mappers/sensor.mapper.js +168 -0
  83. package/dist/plugins/devices-homekit/mappers/sensor.mapper.js.map +1 -0
  84. package/dist/plugins/devices-homekit/mappers/switch.mapper.d.ts +9 -0
  85. package/dist/plugins/devices-homekit/mappers/switch.mapper.js +35 -0
  86. package/dist/plugins/devices-homekit/mappers/switch.mapper.js.map +1 -0
  87. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.d.ts +43 -0
  88. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.js +430 -0
  89. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.js.map +1 -0
  90. package/dist/plugins/devices-homekit/mappers/thermostat.mapper.d.ts +11 -0
  91. package/dist/plugins/devices-homekit/mappers/thermostat.mapper.js +97 -0
  92. package/dist/plugins/devices-homekit/mappers/thermostat.mapper.js.map +1 -0
  93. package/dist/plugins/devices-homekit/mappers/window-covering.mapper.d.ts +10 -0
  94. package/dist/plugins/devices-homekit/mappers/window-covering.mapper.js +94 -0
  95. package/dist/plugins/devices-homekit/mappers/window-covering.mapper.js.map +1 -0
  96. package/dist/plugins/devices-homekit/models/bridge-candidate.model.d.ts +15 -0
  97. package/dist/plugins/devices-homekit/models/bridge-candidate.model.js +150 -0
  98. package/dist/plugins/devices-homekit/models/bridge-candidate.model.js.map +1 -0
  99. package/dist/plugins/devices-homekit/models/bridge-status.model.d.ts +16 -0
  100. package/dist/plugins/devices-homekit/models/bridge-status.model.js +156 -0
  101. package/dist/plugins/devices-homekit/models/bridge-status.model.js.map +1 -0
  102. package/dist/plugins/devices-homekit/models/config.model.d.ts +12 -0
  103. package/dist/plugins/devices-homekit/models/config.model.js +134 -0
  104. package/dist/plugins/devices-homekit/models/config.model.js.map +1 -0
  105. package/dist/plugins/devices-homekit/services/homekit-actions.service.d.ts +14 -0
  106. package/dist/plugins/devices-homekit/services/homekit-actions.service.js +92 -0
  107. package/dist/plugins/devices-homekit/services/homekit-actions.service.js.map +1 -0
  108. package/dist/plugins/devices-homekit/services/homekit-bridge.service.d.ts +43 -0
  109. package/dist/plugins/devices-homekit/services/homekit-bridge.service.js +497 -0
  110. package/dist/plugins/devices-homekit/services/homekit-bridge.service.js.map +1 -0
  111. package/dist/plugins/devices-homekit/services/homekit-command.dispatcher.d.ts +11 -0
  112. package/dist/plugins/devices-homekit/services/homekit-command.dispatcher.js +68 -0
  113. package/dist/plugins/devices-homekit/services/homekit-command.dispatcher.js.map +1 -0
  114. package/dist/plugins/devices-homekit/services/homekit-mapper-registry.service.d.ts +34 -0
  115. package/dist/plugins/devices-homekit/services/homekit-mapper-registry.service.js +179 -0
  116. package/dist/plugins/devices-homekit/services/homekit-mapper-registry.service.js.map +1 -0
  117. package/dist/plugins/devices-homekit/services/homekit-wizard.service.d.ts +15 -0
  118. package/dist/plugins/devices-homekit/services/homekit-wizard.service.js +75 -0
  119. package/dist/plugins/devices-homekit/services/homekit-wizard.service.js.map +1 -0
  120. package/dist/plugins/devices-homekit/validators/is-not-forbidden-homekit-pin.validator.d.ts +2 -0
  121. package/dist/plugins/devices-homekit/validators/is-not-forbidden-homekit-pin.validator.js +30 -0
  122. package/dist/plugins/devices-homekit/validators/is-not-forbidden-homekit-pin.validator.js.map +1 -0
  123. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js +5 -0
  124. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js.map +1 -1
  125. package/dist/tsconfig.build.tsbuildinfo +1 -1
  126. package/package.json +5 -2
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.HomeKitActionsService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const logger_1 = require("../../../common/logger");
15
+ const extension_action_registry_service_1 = require("../../../modules/extensions/services/extension-action-registry.service");
16
+ const extension_action_interface_1 = require("../../../modules/extensions/services/extension-action.interface");
17
+ const managed_service_manager_service_1 = require("../../../modules/extensions/services/managed-service-manager.service");
18
+ const devices_homekit_constants_1 = require("../devices-homekit.constants");
19
+ const homekit_bridge_service_1 = require("./homekit-bridge.service");
20
+ let HomeKitActionsService = class HomeKitActionsService {
21
+ constructor(actionRegistry, bridgeService, managedServiceManager) {
22
+ this.actionRegistry = actionRegistry;
23
+ this.bridgeService = bridgeService;
24
+ this.managedServiceManager = managedServiceManager;
25
+ this.logger = (0, logger_1.createExtensionLogger)(devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME, 'HomeKitActionsService');
26
+ }
27
+ onModuleInit() {
28
+ this.actionRegistry.register(devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME, this.createRestartBridgeAction());
29
+ this.actionRegistry.register(devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME, this.createResetPairingAction());
30
+ }
31
+ createRestartBridgeAction() {
32
+ return {
33
+ id: 'restart-bridge',
34
+ label: 'Restart Bridge',
35
+ description: 'Restarts the HomeKit bridge service and re-publishes mDNS advertisements.',
36
+ icon: 'mdi:restart',
37
+ category: extension_action_interface_1.ActionCategory.MAINTENANCE,
38
+ mode: 'immediate',
39
+ execute: async () => {
40
+ try {
41
+ const restarted = await this.managedServiceManager.restartService(this.bridgeService.owner.kind, this.bridgeService.owner.type, this.bridgeService.serviceId);
42
+ if (!restarted) {
43
+ this.logger.warn('Failed to restart Apple HomeKit Bridge: service manager returned false');
44
+ return {
45
+ success: false,
46
+ message: 'Failed to restart bridge. Ensure the plugin is enabled and bridge service is running.',
47
+ };
48
+ }
49
+ return { success: true, message: 'Apple HomeKit Bridge restarted successfully.' };
50
+ }
51
+ catch (error) {
52
+ const message = error instanceof Error ? error.message : String(error);
53
+ this.logger.warn(`Failed to restart Apple HomeKit Bridge: ${message}`);
54
+ return { success: false, message: `Failed to restart bridge: ${message}` };
55
+ }
56
+ },
57
+ };
58
+ }
59
+ createResetPairingAction() {
60
+ return {
61
+ id: 'reset-pairing',
62
+ label: 'Reset Pairing',
63
+ description: 'Clears all HomeKit pairing records and generates fresh bridge credentials. Existing paired Apple devices will need to be re-paired.',
64
+ icon: 'mdi:link-variant-off',
65
+ category: extension_action_interface_1.ActionCategory.MAINTENANCE,
66
+ mode: 'immediate',
67
+ dangerous: true,
68
+ execute: async () => {
69
+ try {
70
+ await this.bridgeService.resetPairing();
71
+ return {
72
+ success: true,
73
+ message: 'Apple HomeKit Bridge pairing reset successfully. New setup code generated.',
74
+ };
75
+ }
76
+ catch (error) {
77
+ const message = error instanceof Error ? error.message : String(error);
78
+ this.logger.warn(`Failed to reset Apple HomeKit Bridge pairing: ${message}`);
79
+ return { success: false, message: `Failed to reset pairing: ${message}` };
80
+ }
81
+ },
82
+ };
83
+ }
84
+ };
85
+ exports.HomeKitActionsService = HomeKitActionsService;
86
+ exports.HomeKitActionsService = HomeKitActionsService = __decorate([
87
+ (0, common_1.Injectable)(),
88
+ __metadata("design:paramtypes", [extension_action_registry_service_1.ExtensionActionRegistryService,
89
+ homekit_bridge_service_1.HomeKitBridgeService,
90
+ managed_service_manager_service_1.ManagedServiceManagerService])
91
+ ], HomeKitActionsService);
92
+ //# sourceMappingURL=homekit-actions.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homekit-actions.service.js","sourceRoot":"","sources":["../../../../src/plugins/devices-homekit/services/homekit-actions.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { EventEmitter2 } from '@nestjs/event-emitter';
2
+ import { ConfigService } from '../../../modules/config/services/config.service';
3
+ import { DevicesService } from '../../../modules/devices/services/devices.service';
4
+ import { ConfigChangeResult, IManagedExtensionService, ManagedServiceOwner, ServiceState } from '../../../modules/extensions/services/managed-extension-service.interface';
5
+ import { ManagedServiceManagerService } from '../../../modules/extensions/services/managed-service-manager.service';
6
+ import { HomeKitBridgeStatusModel } from '../models/bridge-status.model';
7
+ import { HomeKitConfigModel } from '../models/config.model';
8
+ import { HomeKitCommandDispatcher } from './homekit-command.dispatcher';
9
+ import { HomeKitMapperRegistryService } from './homekit-mapper-registry.service';
10
+ export declare class HomeKitBridgeService implements IManagedExtensionService {
11
+ private readonly configService;
12
+ private readonly devicesService;
13
+ private readonly mapperRegistry;
14
+ private readonly commandDispatcher;
15
+ private readonly eventEmitter;
16
+ private readonly managedServiceManager?;
17
+ private readonly logger;
18
+ readonly owner: ManagedServiceOwner;
19
+ readonly serviceId = "homekit-gateway";
20
+ private state;
21
+ private bridge;
22
+ private activeConfig;
23
+ private storageInitialized;
24
+ private lifecycleQueue;
25
+ constructor(configService: ConfigService, devicesService: DevicesService, mapperRegistry: HomeKitMapperRegistryService, commandDispatcher: HomeKitCommandDispatcher, eventEmitter: EventEmitter2, managedServiceManager?: ManagedServiceManagerService);
26
+ private emitBridgeStatusChanged;
27
+ private enqueueLifecycleOperation;
28
+ getConfig(): HomeKitConfigModel;
29
+ getState(): ServiceState;
30
+ private getStoragePath;
31
+ private initHapStorage;
32
+ start(): Promise<void>;
33
+ stop(): Promise<void>;
34
+ reconcileLatestMapping(): Promise<void>;
35
+ onConfigChanged(): Promise<ConfigChangeResult | void>;
36
+ private startUnlocked;
37
+ private stopUnlocked;
38
+ private reconcileLatestMappingUnlocked;
39
+ private populateBridgedAccessories;
40
+ getStatus(): Promise<HomeKitBridgeStatusModel>;
41
+ resetPairing(): Promise<void>;
42
+ updateMappedDevices(deviceIds: string[]): Promise<void>;
43
+ }
@@ -0,0 +1,497 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ var HomeKitBridgeService_1;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.HomeKitBridgeService = void 0;
20
+ const fs_1 = __importDefault(require("fs"));
21
+ const path_1 = __importDefault(require("path"));
22
+ const qrcode_1 = __importDefault(require("qrcode"));
23
+ const hap_nodejs_1 = require("@homebridge/hap-nodejs");
24
+ const common_1 = require("@nestjs/common");
25
+ const event_emitter_1 = require("@nestjs/event-emitter");
26
+ const transform_utils_1 = require("../../../common/utils/transform.utils");
27
+ const config_service_1 = require("../../../modules/config/services/config.service");
28
+ const devices_service_1 = require("../../../modules/devices/services/devices.service");
29
+ const managed_service_manager_service_1 = require("../../../modules/extensions/services/managed-service-manager.service");
30
+ const devices_homekit_constants_1 = require("../devices-homekit.constants");
31
+ const update_config_dto_1 = require("../dto/update-config.dto");
32
+ const bridge_status_model_1 = require("../models/bridge-status.model");
33
+ const config_model_1 = require("../models/config.model");
34
+ const homekit_command_dispatcher_1 = require("./homekit-command.dispatcher");
35
+ const homekit_mapper_registry_service_1 = require("./homekit-mapper-registry.service");
36
+ let HomeKitBridgeService = HomeKitBridgeService_1 = class HomeKitBridgeService {
37
+ constructor(configService, devicesService, mapperRegistry, commandDispatcher, eventEmitter, managedServiceManager) {
38
+ this.configService = configService;
39
+ this.devicesService = devicesService;
40
+ this.mapperRegistry = mapperRegistry;
41
+ this.commandDispatcher = commandDispatcher;
42
+ this.eventEmitter = eventEmitter;
43
+ this.managedServiceManager = managedServiceManager;
44
+ this.logger = new common_1.Logger(HomeKitBridgeService_1.name);
45
+ this.owner = {
46
+ kind: 'plugin',
47
+ type: devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME,
48
+ };
49
+ this.serviceId = 'homekit-gateway';
50
+ this.state = 'stopped';
51
+ this.bridge = null;
52
+ this.activeConfig = null;
53
+ this.storageInitialized = false;
54
+ this.lifecycleQueue = Promise.resolve();
55
+ }
56
+ async emitBridgeStatusChanged() {
57
+ try {
58
+ const status = await this.getStatus();
59
+ this.eventEmitter.emit(devices_homekit_constants_1.EventType.BRIDGE_STATUS_CHANGED, status);
60
+ }
61
+ catch (error) {
62
+ this.logger.warn(`Failed to emit bridge status event: ${error.message}`);
63
+ }
64
+ }
65
+ enqueueLifecycleOperation(operation) {
66
+ const next = this.lifecycleQueue.then(operation, operation);
67
+ this.lifecycleQueue = next;
68
+ return next;
69
+ }
70
+ getConfig() {
71
+ const config = this.configService.getPluginConfig(devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME);
72
+ if (!config) {
73
+ const fallback = new config_model_1.HomeKitConfigModel();
74
+ fallback.type = devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME;
75
+ fallback.enabled = false;
76
+ fallback.bridgeName = devices_homekit_constants_1.DEFAULT_HOMEKIT_BRIDGE_NAME;
77
+ fallback.port = devices_homekit_constants_1.DEFAULT_HOMEKIT_PORT;
78
+ fallback.pincode = (0, devices_homekit_constants_1.generateRandomHomeKitPin)();
79
+ fallback.username = (0, devices_homekit_constants_1.generateRandomMacAddress)();
80
+ fallback.setupId = (0, devices_homekit_constants_1.generateRandomSetupId)();
81
+ fallback.mappedDeviceIds = [];
82
+ try {
83
+ this.configService.setPluginConfig(devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME, fallback);
84
+ }
85
+ catch (err) {
86
+ this.logger.warn(`Could not persist initial HomeKit configuration: ${err.message}`);
87
+ }
88
+ return fallback;
89
+ }
90
+ return config;
91
+ }
92
+ getState() {
93
+ return this.state;
94
+ }
95
+ getStoragePath() {
96
+ const baseDir = process.env.FB_CONFIG_PATH || path_1.default.resolve(process.cwd(), 'var/data');
97
+ const storageDir = path_1.default.join(baseDir, devices_homekit_constants_1.HOMEKIT_PAIRING_STORAGE_DIR);
98
+ if (!fs_1.default.existsSync(storageDir)) {
99
+ fs_1.default.mkdirSync(storageDir, { recursive: true, mode: 0o700 });
100
+ }
101
+ if (process.platform !== 'win32') {
102
+ try {
103
+ const stat = fs_1.default.statSync(storageDir);
104
+ if ((stat.mode & 0o777) !== 0o700) {
105
+ fs_1.default.chmodSync(storageDir, 0o700);
106
+ }
107
+ const verifiedStat = fs_1.default.statSync(storageDir);
108
+ if ((verifiedStat.mode & 0o777) !== 0o700) {
109
+ throw new Error(`HomeKit storage directory '${storageDir}' permissions could not be verified as 0700 (actual: 0${(verifiedStat.mode & 0o777).toString(8)}).`);
110
+ }
111
+ const files = fs_1.default.readdirSync(storageDir);
112
+ for (const file of files) {
113
+ const fullPath = path_1.default.join(storageDir, file);
114
+ try {
115
+ const fileStat = fs_1.default.statSync(fullPath);
116
+ if (fileStat.isFile() && (fileStat.mode & 0o077) !== 0) {
117
+ fs_1.default.chmodSync(fullPath, 0o600);
118
+ }
119
+ }
120
+ catch {
121
+ }
122
+ }
123
+ }
124
+ catch (error) {
125
+ this.logger.error(`Failed to secure HomeKit pairing storage directory '${storageDir}': ${error.message}`);
126
+ throw error;
127
+ }
128
+ }
129
+ return storageDir;
130
+ }
131
+ initHapStorage() {
132
+ if (this.storageInitialized) {
133
+ return;
134
+ }
135
+ const storagePath = this.getStoragePath();
136
+ this.logger.log(`Initializing HomeKit pairing storage at: ${storagePath}`);
137
+ hap_nodejs_1.HAPStorage.setCustomStoragePath(storagePath);
138
+ this.storageInitialized = true;
139
+ }
140
+ async start() {
141
+ return this.enqueueLifecycleOperation(() => this.startUnlocked());
142
+ }
143
+ async stop() {
144
+ return this.enqueueLifecycleOperation(() => this.stopUnlocked());
145
+ }
146
+ async reconcileLatestMapping() {
147
+ return this.enqueueLifecycleOperation(() => this.reconcileLatestMappingUnlocked());
148
+ }
149
+ async onConfigChanged() {
150
+ return this.enqueueLifecycleOperation(async () => {
151
+ const newConfig = this.getConfig();
152
+ if (!this.activeConfig || this.state !== 'started') {
153
+ return { restartRequired: false };
154
+ }
155
+ const coreChanged = this.activeConfig.bridgeName !== newConfig.bridgeName ||
156
+ this.activeConfig.port !== newConfig.port ||
157
+ this.activeConfig.pincode !== newConfig.pincode ||
158
+ this.activeConfig.username !== newConfig.username ||
159
+ this.activeConfig.setupId !== newConfig.setupId ||
160
+ this.activeConfig.enabled !== newConfig.enabled;
161
+ if (coreChanged) {
162
+ return { restartRequired: true };
163
+ }
164
+ await this.reconcileLatestMappingUnlocked();
165
+ return { restartRequired: false };
166
+ });
167
+ }
168
+ async startUnlocked() {
169
+ const config = this.getConfig();
170
+ if (!config.enabled) {
171
+ this.logger.log('HomeKit Gateway is disabled in plugin configuration.');
172
+ this.state = 'stopped';
173
+ return;
174
+ }
175
+ if (this.bridge !== null && this.state === 'started') {
176
+ this.logger.debug('HomeKit Gateway is already running with current configuration.');
177
+ return;
178
+ }
179
+ this.state = 'starting';
180
+ this.logger.log(`Starting HomeKit Gateway bridge '${config.bridgeName}' on port ${config.port}...`);
181
+ try {
182
+ if (this.bridge) {
183
+ await this.stopUnlocked();
184
+ if (this.bridge) {
185
+ throw new Error('Could not stop the previous HomeKit Gateway bridge.');
186
+ }
187
+ }
188
+ this.initHapStorage();
189
+ const bridgeUuid = hap_nodejs_1.uuid.generate(`fastybird.smart-panel.homekit.bridge.${config.username}`);
190
+ this.bridge = new hap_nodejs_1.Bridge(config.bridgeName, bridgeUuid);
191
+ const infoService = this.bridge.getService(hap_nodejs_1.Service.AccessoryInformation) ?? this.bridge.addService(hap_nodejs_1.Service.AccessoryInformation);
192
+ infoService
193
+ .setCharacteristic(hap_nodejs_1.Characteristic.Name, config.bridgeName)
194
+ .setCharacteristic(hap_nodejs_1.Characteristic.Manufacturer, 'FastyBird')
195
+ .setCharacteristic(hap_nodejs_1.Characteristic.Model, 'Smart Panel HomeKit Bridge')
196
+ .setCharacteristic(hap_nodejs_1.Characteristic.SerialNumber, config.username)
197
+ .setCharacteristic(hap_nodejs_1.Characteristic.FirmwareRevision, '1.0.0');
198
+ this.bridge.on("paired", () => {
199
+ this.logger.log('HomeKit client paired with bridge');
200
+ void this.emitBridgeStatusChanged();
201
+ });
202
+ this.bridge.on("unpaired", () => {
203
+ this.logger.log('HomeKit client unpaired from bridge');
204
+ void this.emitBridgeStatusChanged();
205
+ });
206
+ await this.populateBridgedAccessories(config.mappedDeviceIds);
207
+ await this.bridge.publish({
208
+ username: config.username,
209
+ pincode: config.pincode,
210
+ port: config.port,
211
+ category: 2,
212
+ setupID: config.setupId,
213
+ advertiser: "ciao",
214
+ });
215
+ this.activeConfig = {
216
+ ...config,
217
+ mappedDeviceIds: [...config.mappedDeviceIds],
218
+ };
219
+ this.state = 'started';
220
+ this.logger.log(`HomeKit Bridge published successfully. Port: ${config.port}, Username: ${config.username}`);
221
+ await this.emitBridgeStatusChanged();
222
+ }
223
+ catch (error) {
224
+ this.state = 'error';
225
+ await this.emitBridgeStatusChanged();
226
+ const err = error;
227
+ this.logger.error(`Failed to start HomeKit Bridge: ${err.message}`, err.stack);
228
+ throw error;
229
+ }
230
+ }
231
+ async stopUnlocked() {
232
+ this.state = 'stopping';
233
+ this.logger.log('Stopping HomeKit Bridge...');
234
+ try {
235
+ if (this.bridge) {
236
+ await this.bridge.unpublish();
237
+ this.bridge = null;
238
+ }
239
+ this.mapperRegistry.clearAllBindings();
240
+ this.activeConfig = null;
241
+ this.state = 'stopped';
242
+ this.logger.log('HomeKit Bridge stopped cleanly.');
243
+ await this.emitBridgeStatusChanged();
244
+ }
245
+ catch (error) {
246
+ this.state = 'error';
247
+ await this.emitBridgeStatusChanged();
248
+ const err = error;
249
+ this.logger.error(`Error stopping HomeKit Bridge: ${err.message}`, err.stack);
250
+ }
251
+ }
252
+ async reconcileLatestMappingUnlocked() {
253
+ if (!this.bridge || this.state !== 'started') {
254
+ return;
255
+ }
256
+ const config = this.getConfig();
257
+ const targetDeviceIds = config.mappedDeviceIds ?? [];
258
+ const targetSet = new Set(targetDeviceIds);
259
+ const currentBridgedMap = new Map();
260
+ for (const acc of this.bridge.bridgedAccessories) {
261
+ const serial = acc
262
+ .getService(hap_nodejs_1.Service.AccessoryInformation)
263
+ ?.getCharacteristic(hap_nodejs_1.Characteristic.SerialNumber)?.value;
264
+ const serialStr = typeof serial === 'string' ? serial : '';
265
+ if (serialStr) {
266
+ currentBridgedMap.set(serialStr, acc);
267
+ }
268
+ }
269
+ const currentDeviceIds = new Set(currentBridgedMap.keys());
270
+ const toAddIds = targetDeviceIds.filter((id) => !currentDeviceIds.has(id));
271
+ const toRemoveSerials = Array.from(currentDeviceIds).filter((id) => !targetSet.has(id));
272
+ if (toAddIds.length === 0 && toRemoveSerials.length === 0) {
273
+ return;
274
+ }
275
+ this.logger.log(`Reconciling HomeKit bridged accessories: adding ${toAddIds.length}, removing ${toRemoveSerials.length}...`);
276
+ const stagedAccessories = [];
277
+ for (const deviceId of toAddIds) {
278
+ const device = await this.devicesService.findOne(deviceId);
279
+ if (!device) {
280
+ const msg = `Device ${deviceId} not found in database during reconciliation.`;
281
+ this.logger.error(msg);
282
+ throw new Error(msg);
283
+ }
284
+ let staged;
285
+ try {
286
+ staged = this.mapperRegistry.buildAccessory(device, this.commandDispatcher);
287
+ }
288
+ catch (err) {
289
+ const msg = `Failed to build accessory for device ${deviceId}: ${err.message}`;
290
+ this.logger.error(msg);
291
+ throw new Error(msg, { cause: err });
292
+ }
293
+ if (!staged) {
294
+ const msg = `Device ${deviceId} could not be mapped to any supported HomeKit accessory.`;
295
+ this.logger.error(msg);
296
+ throw new Error(msg);
297
+ }
298
+ stagedAccessories.push(staged);
299
+ }
300
+ const snapshot = this.mapperRegistry.getSnapshot();
301
+ const originalAccessories = [...this.bridge.bridgedAccessories];
302
+ const originalAccessoriesMap = new Map(originalAccessories.map((a) => [a.UUID, a]));
303
+ try {
304
+ for (const serial of toRemoveSerials) {
305
+ const acc = currentBridgedMap.get(serial);
306
+ if (acc) {
307
+ this.bridge.removeBridgedAccessory(acc);
308
+ this.mapperRegistry.clearDeviceBindings(serial);
309
+ }
310
+ }
311
+ for (const staged of stagedAccessories) {
312
+ this.bridge.addBridgedAccessory(staged.accessory);
313
+ }
314
+ for (const staged of stagedAccessories) {
315
+ this.mapperRegistry.commitStaged(staged);
316
+ }
317
+ if (this.activeConfig) {
318
+ this.activeConfig.mappedDeviceIds = [...targetDeviceIds];
319
+ }
320
+ this.logger.log(`Successfully reconciled accessories. Active count: ${this.bridge.bridgedAccessories.length}`);
321
+ await this.emitBridgeStatusChanged();
322
+ }
323
+ catch (mutationError) {
324
+ this.logger.error(`Failed to mutate bridged accessories, rolling back: ${mutationError.message}`);
325
+ let rollbackSuccess = true;
326
+ try {
327
+ const currentOnBridge = [...this.bridge.bridgedAccessories];
328
+ for (const acc of currentOnBridge) {
329
+ if (!originalAccessoriesMap.has(acc.UUID)) {
330
+ try {
331
+ this.bridge.removeBridgedAccessory(acc);
332
+ }
333
+ catch (e) {
334
+ rollbackSuccess = false;
335
+ this.logger.warn(`Failed to remove accessory during rollback: ${e.message}`);
336
+ }
337
+ }
338
+ }
339
+ const remainingOnBridgeMap = new Map(this.bridge.bridgedAccessories.map((a) => [a.UUID, a]));
340
+ for (const acc of originalAccessories) {
341
+ if (!remainingOnBridgeMap.has(acc.UUID)) {
342
+ try {
343
+ this.bridge.addBridgedAccessory(acc);
344
+ }
345
+ catch (e) {
346
+ rollbackSuccess = false;
347
+ this.logger.warn(`Failed to restore original accessory during rollback: ${e.message}`);
348
+ }
349
+ }
350
+ }
351
+ if (this.bridge.bridgedAccessories.length !== originalAccessories.length) {
352
+ rollbackSuccess = false;
353
+ }
354
+ }
355
+ catch (rollbackError) {
356
+ rollbackSuccess = false;
357
+ this.logger.error(`Critical error during bridge rollback: ${rollbackError.message}`);
358
+ }
359
+ finally {
360
+ this.mapperRegistry.restoreSnapshot(snapshot);
361
+ }
362
+ if (!rollbackSuccess) {
363
+ this.state = 'error';
364
+ this.logger.error('HomeKit Bridge entered error state because bridge rollback could not be fully completed.');
365
+ await this.emitBridgeStatusChanged();
366
+ }
367
+ throw mutationError;
368
+ }
369
+ }
370
+ async populateBridgedAccessories(mappedDeviceIds) {
371
+ if (!this.bridge) {
372
+ return;
373
+ }
374
+ let addedCount = 0;
375
+ for (const deviceId of mappedDeviceIds) {
376
+ try {
377
+ const device = await this.devicesService.findOne(deviceId);
378
+ if (!device) {
379
+ this.logger.warn(`Mapped device ID not found in database: ${deviceId}`);
380
+ continue;
381
+ }
382
+ const staged = this.mapperRegistry.buildAccessory(device, this.commandDispatcher);
383
+ if (staged) {
384
+ this.bridge.addBridgedAccessory(staged.accessory);
385
+ this.mapperRegistry.commitStaged(staged);
386
+ addedCount++;
387
+ }
388
+ }
389
+ catch (error) {
390
+ const err = error;
391
+ this.logger.warn(`Failed to bridge device ${deviceId}: ${err.message}`);
392
+ }
393
+ }
394
+ this.logger.log(`Bridged ${addedCount} accessories into HomeKit Bridge.`);
395
+ }
396
+ async getStatus() {
397
+ const config = this.getConfig();
398
+ const isRunning = this.state === 'started' && this.bridge !== null;
399
+ let isPaired = false;
400
+ let pairedClientsCount = 0;
401
+ let setupUri = '';
402
+ let qrCodeDataUri = '';
403
+ if (isRunning && this.bridge) {
404
+ try {
405
+ setupUri = this.bridge.setupURI();
406
+ if (setupUri) {
407
+ qrCodeDataUri = await qrcode_1.default.toDataURL(setupUri, {
408
+ margin: 1,
409
+ width: 256,
410
+ errorCorrectionLevel: 'M',
411
+ });
412
+ }
413
+ const server = this.bridge._server;
414
+ if (server?.accessoryInfo) {
415
+ isPaired = Boolean(server.accessoryInfo.paired());
416
+ const pairings = server.accessoryInfo.listPairings();
417
+ pairedClientsCount = Array.isArray(pairings) ? pairings.length : 0;
418
+ }
419
+ }
420
+ catch (err) {
421
+ this.logger.warn(`Could not extract pairing metadata: ${err.message}`);
422
+ }
423
+ }
424
+ const status = new bridge_status_model_1.HomeKitBridgeStatusModel();
425
+ status.running = isRunning;
426
+ status.paired = isPaired;
427
+ status.pairedClientsCount = pairedClientsCount;
428
+ status.bridgeName = config.bridgeName;
429
+ status.port = config.port;
430
+ status.pincode = config.pincode;
431
+ status.username = config.username;
432
+ status.setupUri = setupUri;
433
+ status.qrCodeDataUri = qrCodeDataUri;
434
+ status.exposedDevicesCount = this.bridge?.bridgedAccessories.length ?? config.mappedDeviceIds.length;
435
+ return status;
436
+ }
437
+ async resetPairing() {
438
+ await this.enqueueLifecycleOperation(async () => {
439
+ this.logger.log('Resetting HomeKit pairing credentials (Phase 1: destructive teardown)...');
440
+ const bridge = this.bridge;
441
+ await this.stopUnlocked();
442
+ if (bridge) {
443
+ await bridge.destroy();
444
+ }
445
+ const storagePath = this.getStoragePath();
446
+ try {
447
+ if (fs_1.default.existsSync(storagePath)) {
448
+ const files = fs_1.default.readdirSync(storagePath);
449
+ for (const file of files) {
450
+ const fullPath = path_1.default.join(storagePath, file);
451
+ fs_1.default.rmSync(fullPath, { recursive: true, force: true });
452
+ }
453
+ this.logger.log(`Cleared pairing storage files in: ${storagePath}`);
454
+ }
455
+ }
456
+ catch (error) {
457
+ this.logger.warn(`Failed to delete pairing storage files: ${error.message}`);
458
+ }
459
+ this.mapperRegistry.clearAllBindings();
460
+ });
461
+ this.logger.log('Resetting HomeKit pairing credentials (Phase 2: rotating credentials)...');
462
+ const pincode = (0, devices_homekit_constants_1.generateRandomHomeKitPin)();
463
+ const username = (0, devices_homekit_constants_1.generateRandomMacAddress)();
464
+ const setup_id = (0, devices_homekit_constants_1.generateRandomSetupId)();
465
+ const updateDto = (0, transform_utils_1.toInstance)(update_config_dto_1.HomeKitUpdatePluginConfigDto, {
466
+ type: devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME,
467
+ pincode,
468
+ username,
469
+ setup_id,
470
+ });
471
+ await this.configService.updatePluginConfig(devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME, updateDto);
472
+ await this.enqueueLifecycleOperation(async () => {
473
+ this.logger.log('Resetting HomeKit pairing credentials (Phase 3: starting bridge)...');
474
+ await this.startUnlocked();
475
+ });
476
+ }
477
+ async updateMappedDevices(deviceIds) {
478
+ const updateDto = (0, transform_utils_1.toInstance)(update_config_dto_1.HomeKitUpdatePluginConfigDto, {
479
+ type: devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME,
480
+ mapped_device_ids: deviceIds,
481
+ });
482
+ await this.configService.updatePluginConfig(devices_homekit_constants_1.DEVICES_HOMEKIT_PLUGIN_NAME, updateDto);
483
+ await this.reconcileLatestMapping();
484
+ }
485
+ };
486
+ exports.HomeKitBridgeService = HomeKitBridgeService;
487
+ exports.HomeKitBridgeService = HomeKitBridgeService = HomeKitBridgeService_1 = __decorate([
488
+ (0, common_1.Injectable)(),
489
+ __param(5, (0, common_1.Optional)()),
490
+ __metadata("design:paramtypes", [config_service_1.ConfigService,
491
+ devices_service_1.DevicesService,
492
+ homekit_mapper_registry_service_1.HomeKitMapperRegistryService,
493
+ homekit_command_dispatcher_1.HomeKitCommandDispatcher,
494
+ event_emitter_1.EventEmitter2,
495
+ managed_service_manager_service_1.ManagedServiceManagerService])
496
+ ], HomeKitBridgeService);
497
+ //# sourceMappingURL=homekit-bridge.service.js.map