UNPKG

@constructorfleet/ultimate-govee

Version:

Library for interacting with Govee devices written in Typescript.

121 lines 5.28 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 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; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var DevicesService_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.DevicesService = void 0; const common_1 = require("@nestjs/common"); const cqrs_1 = require("@nestjs/cqrs"); const rxjs_1 = require("rxjs"); const _ultimate_govee_common_1 = require("../../common"); const model_product_query_1 = require("../channels/rest/queries/model-product.query"); const events_1 = require("./cqrs/events"); const devices_factory_1 = require("./devices.factory"); const devices_model_1 = require("./devices.model"); const version_info_1 = require("./version.info"); const refresh_device_command_1 = require("./cqrs/commands/refresh-device.command"); let DevicesService = DevicesService_1 = class DevicesService { constructor(factory, eventBus, queryBus) { this.factory = factory; this.eventBus = eventBus; this.queryBus = queryBus; this.logger = new common_1.Logger(DevicesService_1.name); this.deviceMap = new _ultimate_govee_common_1.DeltaMap({ isModified: (current, previous) => current.name !== previous.name, }); this.deviceMap.delta$ .pipe((0, rxjs_1.map)((delta) => [ ...Array.from(delta.modified.values()).map((device) => new events_1.DeviceUpdatedEvent(device)), ])) .subscribe((events) => this.eventBus.publishAll(events)); } handle(event) { this.logger.verbose('Received event', JSON.stringify(event, null, 2)); const device = this.getDevice(event.deviceStatus.id); if (!device) { this.logger.warn(`Unknown device id ${event.deviceStatus.id}`); return; } device.deviceStatus(event.deviceStatus); } getByModel(model) { return Array.from(this.deviceMap.values()).filter((device) => device.model === model); } getDevice(deviceId) { return this.deviceMap.get(deviceId); } getDeviceIds() { return Array.from(this.deviceMap.keys()); } setDevice(device) { const existingDevice = this.getDevice(device.id); if (existingDevice !== undefined) { return existingDevice; } this.deviceMap.set(device.id, device); return device; } async execute(command) { await this.getDevice(command.deviceId)?.refresh(); return; } async discoverDevice(goveeDevice) { const device = this.getDevice(goveeDevice.id); if (device === undefined) { const deviceModel = await this.createDeviceModel(goveeDevice); return this.createDeviceFromModel(deviceModel); } return device; } createDeviceFromModel(deviceModel) { let device = this.getDevice(deviceModel.id); if (device !== undefined) { return device; } device = this.setDevice(this.factory.create(deviceModel)); this.eventBus.publish(new events_1.DeviceDiscoveredEvent(device)); return device; } async getProduct(device) { const product = await this.queryBus.execute(new model_product_query_1.ModelProductQuery(device)); return product; } async createDeviceModel(device, product) { product = product ?? (await this.getProduct(device)); let constructor = devices_model_1.DeviceModel; if (device.blueTooth) { constructor = (0, devices_model_1.BLEDevice)(constructor); } if (device.wifi) { constructor = (0, devices_model_1.WiFiDevice)(constructor); } if (device.iotTopic) { constructor = (0, devices_model_1.IoTDevice)(constructor); } const newDevice = new constructor({ ...device, version: new version_info_1.Version(device.hardwareVersion, device.softwareVersion), category: product?.category || 'unknown', categoryGroup: product?.group || 'unknown', modelName: product?.modelName || 'unknown', }); return newDevice; } }; exports.DevicesService = DevicesService; exports.DevicesService = DevicesService = DevicesService_1 = __decorate([ (0, common_1.Injectable)(), (0, cqrs_1.EventsHandler)(events_1.DeviceStatusReceivedEvent), (0, cqrs_1.CommandHandler)(refresh_device_command_1.RefreshDeviceCommand), __metadata("design:paramtypes", [devices_factory_1.DevicesFactory, cqrs_1.EventBus, cqrs_1.QueryBus]) ], DevicesService); //# sourceMappingURL=devices.service.js.map