UNPKG

node-red-contrib-smartnora

Version:

Google Smart Home integration via Smart Nora https://smart-nora.eu/

59 lines (58 loc) 3.48 kB
"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;