mpd-avr-client
Version:
AVR as a MPD client
71 lines (55 loc) • 1.69 kB
JavaScript
const { spawn } = require('child_process');
const { defer, Observable } = require('rxjs');
const { share } = require('rxjs/operators');
const CecClient = function () {
return (() => {
let cecClientProcess;
const publishedCecClientEvent$ =
/** @type Observable<CecClientEvent>*/ defer(() => {
cecClientProcess = spawn('cec-client', ['-o', 'Loading...']);
return new Observable((subscriber) => {
const source = 'cecClient';
const onData = (data) =>
subscriber.next({
source,
data,
});
const onClose = (exitCode) => {
console.log(`cec-client exited with code ${exitCode}\n`);
if (exitCode === 0) {
return subscriber.complete();
}
subscriber.error(exitCode);
};
const onUnsubscribe = () => {};
// emit next event
cecClientProcess.stdout.on('data', onData);
cecClientProcess.stderr.on('data', onData);
// emit complete and error event
cecClientProcess.on('close', onClose);
return onUnsubscribe;
});
}).pipe(share());
const publisher = () => publishedCecClientEvent$;
const terminate = () => {
if (cecClientProcess) {
cecClientProcess.kill();
}
};
const write = (command) => {
if (cecClientProcess) {
cecClientProcess.stdin.write(command);
}
};
return { publisher, terminate, write };
})();
};
let instance;
module.exports = {
getInstance: () => {
if (!instance) {
instance = new CecClient();
}
return instance;
},
};