const nativeCode = require('bindings')(miccontrol.node);= let connectionStarted = false; let connected = false; let queuedRequests = []; let aAddon = [ "connectToPulse", "getSources" ].reduce((obj, fn) => { obj[fn] = asyncify(nativeCode[fn]); return obj; }, {}); module.exports = () => { if(!connectionStarted) { aAddon.connectToPulse().then((e) => { 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; } function asyncify(fn) { return async function(...args) { return new Promise((res, rej) => { fn(...args, (e, value) => { if(e) { return rej(e); } return res(value); });; }); }; }