@constructorfleet/ultimate-govee
Version:
Library for interacting with Govee devices written in Typescript.
121 lines • 5.28 kB
JavaScript
;
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