node-red-contrib-smartnora
Version:
Google Smart Home integration via Smart Nora https://smart-nora.eu/
59 lines (58 loc) • 3.48 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FirebaseMediaDevice = void 0;
const nora_firebase_common_1 = require("@andrei-tatar/nora-firebase-common");
const database_1 = require("firebase/database");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const __1 = require("..");
const device_1 = require("./device");
const TRANSPORT_CONTROL_COMMAND_PREFIX = 'action.devices.commands.media';
const CHANNEL_COMMAND = /^action\.devices\.commands\.(?:return|relative|select)Channel$/;
const APP_SELECTOR_COMMAND = /^action\.devices\.commands\.app(?:Search|Install)$/;
class FirebaseMediaDevice extends device_1.FirebaseDevice {
constructor(cloudId, sync, device, logger, disableValidationErrors) {
super(cloudId, sync, device, logger, disableValidationErrors);
this.transportControlCommand = (0, database_1.child)(this.noraSpecific, 'pendingTransportControlCommand');
this.channelChangeCommand = (0, database_1.child)(this.noraSpecific, 'pendingChannelChangeCommand');
this.appSelectorCommand = (0, database_1.child)(this.noraSpecific, 'pendingAppSelectorCommand');
this.localCommand$ = new rxjs_1.Subject();
this.mediaCommand$ = (0, rxjs_1.merge)(FirebaseMediaDevice.command(this.transportControlCommand), FirebaseMediaDevice.command(this.channelChangeCommand), FirebaseMediaDevice.command(this.appSelectorCommand), this.localCommand$).pipe((0, __1.singleton)());
}
static command(reference) {
return new rxjs_1.Observable(observer => (0, database_1.onValue)(reference, (snapshot) => {
const value = snapshot.val();
if (value) {
observer.next(value);
}
})).pipe((0, operators_1.switchMap)(async (v) => {
await (0, database_1.remove)(reference);
return v;
}));
}
async executeCommand(command, params) {
if (command.startsWith(TRANSPORT_CONTROL_COMMAND_PREFIX)) {
const mediaCommand = command.substring(TRANSPORT_CONTROL_COMMAND_PREFIX.length);
this.localCommand$.next(Object.assign({ command: mediaCommand.toUpperCase() }, params));
return this.device.state;
}
else if (CHANNEL_COMMAND.test(command)) {
const handler = nora_firebase_common_1.COMMAND_HANDLERS.get(command);
const result = handler === null || handler === void 0 ? void 0 : handler(this.device, params);
if ((result === null || result === void 0 ? void 0 : result.updateNoraSpecific) && 'pendingChannelChangeCommand' in result.updateNoraSpecific) {
this.localCommand$.next(result.updateNoraSpecific.pendingChannelChangeCommand);
return this.device.state;
}
}
else if (APP_SELECTOR_COMMAND.test(command)) {
const handler = nora_firebase_common_1.COMMAND_HANDLERS.get(command);
const result = handler === null || handler === void 0 ? void 0 : handler(this.device, params);
if ((result === null || result === void 0 ? void 0 : result.updateNoraSpecific) && 'pendingAppSelectorCommand' in result.updateNoraSpecific) {
this.localCommand$.next(result.updateNoraSpecific.pendingAppSelectorCommand);
return this.device.state;
}
}
return await super.executeCommand(command, params);
}
}
exports.FirebaseMediaDevice = FirebaseMediaDevice;