UNPKG

react-native-androidtv-remote

Version:

Port of AndroidTV Remote to react native

140 lines (113 loc) 4.5 kB
import { CertificateGenerator } from "./certificate/CertificateGenerator.js" import { PairingManager } from "./pairing/PairingManager.js" import { RemoteManager } from "./remote/RemoteManager.js"; import { RemoteMessageManager } from "./remote/RemoteMessageManager.js"; import EventEmitter from "events"; export class AndroidRemote extends EventEmitter { constructor(host, options) { console.log('AndroidRemote.constructor'); super(); this.host = host this.cert = { key: options.cert?.key, cert: options.cert?.cert, androidKeyStore: options.cert?.androidKeyStore ? options.cert?.androidKeyStore : '', certAlias: options.cert?.certAlias ? options.cert?.certAlias : '', keyAlias: options.cert?.keyAlias ? options.cert?.keyAlias : '', }; this.pairing_port = options.pairing_port ? options.pairing_port : 6467; this.remote_port = options.remote_port ? options.remote_port : 6466; this.service_name = options.service_name ? options.service_name : "Service Name"; this.systeminfo = options.systeminfo ? options.systeminfo : { manufacturer: "default manufacturer", model: "default model" }; this.remoteManager = null; this.pairingManager = null; } async start() { if (this.remoteManager) { console.log('AndroidRemote.start() has already been started...'); return; } console.log('AndroidRemote.start()'); if (!this.cert || !this.cert.key || !this.cert.cert) { this.cert = CertificateGenerator.generateFull(this.service_name); console.log('Before creating PairingManager'); // Clean up any existing pairing manager if (this.pairingManager) { this.pairingManager.removeAllListeners(); this.pairingManager = null; } this.pairingManager = new PairingManager( this.host, this.pairing_port, this.cert, this.service_name, this.systeminfo); this.pairingManager.on('secret', () => this.emit('secret')); let paired = await this.pairingManager.start(); if (!paired) { return; } } this.remoteManager = new RemoteManager(this.host, this.remote_port, this.cert, this.systeminfo); this.remoteManager.on('powered', (powered) => this.emit('powered', powered)); this.remoteManager.on('volume', (volume) => this.emit('volume', volume)); this.remoteManager.on('current_app', (current_app) => this.emit('current_app', current_app)); this.remoteManager.on('ready', () => this.emit('ready')); this.remoteManager.on('unpaired', () => this.emit('unpaired')); await new Promise(resolve => setTimeout(resolve, 1000)); let started = await this.remoteManager.start().catch((error) => { console.error(error); }); return started; } sendPairingCode(code) { return this.pairingManager?.sendCode(code); } cancelPairing() { return this.pairingManager?.cancelPairing(); } sendPower() { return this.remoteManager?.sendPower(); } sendAppLink(app_link) { return this.remoteManager?.sendAppLink(app_link); } sendKey(key, direction) { return this.remoteManager?.sendKey(key, direction); } getCertificate() { return { key: this.cert.key, cert: this.cert.cert, } } stop() { // Remove event listeners from remoteManager if (this.remoteManager) { this.remoteManager.removeAllListeners(); // Use removeAllListeners() instead of individual removes this.remoteManager.stop(); this.remoteManager = null; } // Remove event listeners from pairingManager if (this.pairingManager) { this.pairingManager.removeAllListeners(); this.pairingManager = null; } } } const remoteMessageManager = new RemoteMessageManager(); let RemoteKeyCode = remoteMessageManager.RemoteKeyCode; let RemoteDirection = remoteMessageManager.RemoteDirection; export { RemoteKeyCode, RemoteDirection, } export default { AndroidRemote, CertificateGenerator, RemoteKeyCode, RemoteDirection, }