const nativeCode = require('bindings')('miccontrol.node'); const {promisify} = require("util"); let connectionStarted = false; let connected = false; let queuedRequests = []; let aAddon = [ "connectToPulse", //"getSources" ].reduce((obj, fn) => { obj[fn] = promisify(nativeCode[fn]); return obj; }, {}); module.exports = () => { console.log("Starting connection"); if(!connectionStarted) { nativeCode.connectToPulse((e) => { console.log("CONNECTED!"); if(e) { connectionStarted = false; } else { connected = true; } queuedRequests.forEach(f => f(e)); queuedRequests = []; }); connectionStarted = true; } const miccontrol = { getSources: () => { return new Promise(async (res, rej) => { if(!connected) { return queuedRequests.push(e => e ? rej(e) : res(miccontrol.getSources())); } const sources = await aAddon.getSources(); const sourceControllers = sources.map((source) => { let {id, description, isDefault} = source; return { id, description, isDefault, mute: async () => { return aAddon.muteSource(id); }, unmute: async () => { return aAddon.unmuteSource(id); }, isMuted: async () => { return aAddon.isSourceMuted(id); }, toggleMute: async () => { if(await aAddon.isSourceMuted(id)) { return aAddon.unmuteSource(id); } return aAddon.muteSource(id); } }; }); res(sourceControllers) }); } }; return miccontrol; }