UNPKG

@darrellvs/node-wave-link-sdk

Version:
1 lines 42.4 kB
{"version":3,"sources":["../src/Helpers/EventEmitterHelpers.ts","../src/Base/BaseController.ts","../src/Base/BaseWaveLinkController.ts","../src/Utils/constants.ts","../src/index.ts","../src/Base/WaveLinkFilterController.ts","../src/Base/WaveLinkInputController.ts","../src/Base/WaveLinkOutputController.ts"],"sourcesContent":["import { EventEmitter } from 'events';\r\nimport { EmitterEvents } from '../Types/ControllerTypes';\r\n\r\nexport class TypedEventEmitter<T extends EmitterEvents> {\r\n private eventEmitter: EventEmitter = new EventEmitter();\r\n\r\n constructor() {}\r\n\r\n public emit(event: keyof T, ...args: Parameters<T[keyof T]>) {\r\n this.eventEmitter.emit(event as string, ...args);\r\n }\r\n\r\n public on(event: keyof T, listener: T[keyof T]) {\r\n this.eventEmitter.on(event as string, listener);\r\n }\r\n\r\n public off(event: keyof T, listener: T[keyof T]) {\r\n this.eventEmitter.off(event as string, listener);\r\n }\r\n\r\n public removeAllListeners(event: keyof T) {\r\n this.eventEmitter.removeAllListeners(event as string);\r\n }\r\n\r\n public setMaxListeners(n: number) {\r\n this.eventEmitter.setMaxListeners(n);\r\n }\r\n}\r\n","import { TypedEventEmitter } from '../Helpers/EventEmitterHelpers';\r\nimport { EmitterEvents } from '../Types/ControllerTypes';\r\n\r\nexport class BaseController<\r\n T extends EmitterEvents | null\r\n> extends TypedEventEmitter<T extends null ? {} : T> {\r\n constructor() {\r\n super();\r\n }\r\n}\r\n","import { BaseController } from './BaseController';\r\nimport simple_jsonrpc from 'simple-jsonrpc-js';\r\nimport { WebSocket } from 'ws';\r\nimport { getWaveLinkEventData } from '../Utils/constants';\r\nimport {\r\n GetInputConfigsResponse,\r\n GetOutputConfigResponse,\r\n GetOutputsResponse,\r\n WaveLinkEvents,\r\n} from '../Types/WaveLink';\r\n\r\ntype ExtendedWebsocket = WebSocket & { rpc: simple_jsonrpc };\r\n\r\nexport class BaseWaveLinkController extends BaseController<WaveLinkEvents> {\r\n private websocket: ExtendedWebsocket;\r\n private minPort = 1824;\r\n private currentPort = this.minPort;\r\n private isConnecting: boolean = false;\r\n private lastId = 0;\r\n private emittedIdsMap = new Map<number, (data: unknown) => void>();\r\n private selectedOutput: string;\r\n\r\n constructor(\r\n private readonly rpc: simple_jsonrpc,\r\n private readonly host: string\r\n ) {\r\n super();\r\n }\r\n\r\n public connect(isAutoTry: boolean = false) {\r\n return new Promise((resolve, reject) => {\r\n if (!this.currentPort || this.isConnecting) {\r\n reject('Already connecting');\r\n return;\r\n }\r\n\r\n this.isConnecting = true;\r\n setTimeout(async () => {\r\n await this.tryToConnect(isAutoTry, () => resolve('Initialised'));\r\n }, 1000);\r\n });\r\n }\r\n\r\n public getWaveLinkEmmiter() {\r\n return this;\r\n }\r\n\r\n private async tryToConnect(isAutoTry: boolean = false, callback: () => void) {\r\n if (this.websocket) this.websocket.close();\r\n\r\n this.websocket = new WebSocket(\r\n `ws://${this.host}:${this.currentPort}`\r\n ) as ExtendedWebsocket;\r\n this.websocket.rpc = this.rpc;\r\n\r\n this.websocket.onopen = async () => {\r\n this.isConnecting = false;\r\n this.initRPC();\r\n this.emit('websocketOpen');\r\n\r\n const { selectedOutput } = await this.sendRPC<GetOutputsResponse>(\r\n 'getOutputs',\r\n {\r\n mixerID: 'com.elgato.mix.local',\r\n }\r\n );\r\n\r\n this.selectedOutput = selectedOutput;\r\n\r\n const { localMixer, streamMixer } =\r\n await this.sendRPC<GetOutputConfigResponse>('getOutputConfig');\r\n\r\n const inputs = await this.sendRPC<GetInputConfigsResponse>(\r\n 'getInputConfigs'\r\n );\r\n\r\n this.emit('initialiseChannels', {\r\n inputs,\r\n outputs: { localMixer, streamMixer },\r\n selectedOutput,\r\n });\r\n\r\n callback();\r\n };\r\n\r\n this.websocket.onclose = () => {\r\n this.isConnecting = false;\r\n this.emit('websocketClose');\r\n\r\n setTimeout(async () => {\r\n try {\r\n await this.connect(true);\r\n } catch (err) {}\r\n }, 5000);\r\n };\r\n\r\n this.websocket.onerror = (evt: any) => {\r\n setTimeout(async () => {\r\n try {\r\n await this.connect(true);\r\n } catch (err) {}\r\n }, 5000);\r\n };\r\n\r\n this.websocket.onmessage = async (evt: any) => {\r\n if (typeof evt.data === 'string') {\r\n const data = JSON.parse(evt.data);\r\n\r\n switch (data.method) {\r\n case 'inputsChanged':\r\n const newInputs = await this.sendRPC<GetInputConfigsResponse>(\r\n 'getInputConfigs'\r\n );\r\n this.emit('inputsChanged', newInputs);\r\n break;\r\n\r\n case 'selectedOutputChanged':\r\n this.selectedOutput = data.params.value;\r\n this.emit('selectedOutputChanged', data.params.value);\r\n break;\r\n\r\n default:\r\n if (data.method === 'realTimeChanges') return;\r\n\r\n const eventData = getWaveLinkEventData(\r\n data.method,\r\n data.params,\r\n this.selectedOutput\r\n );\r\n if (eventData) {\r\n this.emit(data.method, eventData);\r\n }\r\n break;\r\n }\r\n\r\n if (data.id) {\r\n const callback = this.emittedIdsMap.get(data.id);\r\n if (callback) {\r\n callback(data.result);\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n private initRPC() {\r\n this.rpc.toStream = (msg: any) => {\r\n try {\r\n const { id } = JSON.parse(msg);\r\n this.lastId = id;\r\n this.websocket.send(msg);\r\n } catch (error) {\r\n console.log('ERROR:', error);\r\n }\r\n };\r\n }\r\n\r\n private async sendRPC<T>(method: string, params: any = {}): Promise<T> {\r\n return new Promise((resolve) => {\r\n this.sendRPCProxy(method, params, resolve);\r\n });\r\n }\r\n\r\n private sendRPCProxy(\r\n method: string,\r\n params: any,\r\n callback: (data: unknown) => void\r\n ) {\r\n const id = ++this.lastId;\r\n this.emittedIdsMap.set(id, callback);\r\n this.rpc.call(method, params, id);\r\n }\r\n}\r\n","import {\r\n WaveLinkEvents,\r\n WaveLinkFilterEvents,\r\n WaveLinkInputChannelEvents,\r\n WaveLinkOutputChannelEvents,\r\n} from '../Types/WaveLink';\r\n\r\nconst mixerIDSelectedOutputAndValueTransformer = ({\r\n mixerID,\r\n value,\r\n selectedOutput,\r\n}) => ({\r\n mixerID,\r\n value,\r\n selectedOutput,\r\n});\r\n\r\nconst identifierAndFilterIDTransformer = ({ identifier, filterID }) => ({\r\n identifier,\r\n filterID,\r\n});\r\n\r\nconst identifierAndFilterTransformer = ({ identifier, filter }) => ({\r\n identifier,\r\n filter,\r\n});\r\n\r\nconst identifierMixerIDAndValueTransformer = ({\r\n identifier,\r\n mixerID,\r\n value,\r\n}) => ({\r\n identifier,\r\n mixerID,\r\n value,\r\n});\r\n\r\nconst identifierFilterIDAndValueTransformer = ({\r\n identifier,\r\n filterID,\r\n value,\r\n}) => ({\r\n identifier,\r\n filterID,\r\n value,\r\n});\r\n\r\nconst WaveLinkEventMap = {\r\n outputMuteChanged: mixerIDSelectedOutputAndValueTransformer,\r\n outputVolumeChanged: mixerIDSelectedOutputAndValueTransformer,\r\n inputNameChanged: identifierMixerIDAndValueTransformer,\r\n inputMuteChanged: identifierMixerIDAndValueTransformer,\r\n inputVolumeChanged: identifierMixerIDAndValueTransformer,\r\n filterBypassStateChanged: identifierMixerIDAndValueTransformer,\r\n filterAdded: identifierAndFilterTransformer,\r\n filterRemoved: identifierAndFilterIDTransformer,\r\n filterChanged: identifierFilterIDAndValueTransformer,\r\n};\r\n\r\nexport const getWaveLinkEventData = (\r\n method: string,\r\n params: {\r\n identifier: string;\r\n mixerID: string;\r\n value: boolean;\r\n },\r\n selectedOutput: string\r\n) => {\r\n if (WaveLinkEventMap[method]) {\r\n return WaveLinkEventMap[method]({\r\n ...params,\r\n selectedOutput,\r\n });\r\n }\r\n return null;\r\n};\r\n\r\nexport const waveLinkInternalEventsToBeRemoved: Array<keyof WaveLinkEvents> = [\r\n 'websocketClose',\r\n 'outputMuteChanged',\r\n 'outputVolumeChanged',\r\n 'selectedOutputChanged',\r\n 'inputNameChanged',\r\n 'inputMuteChanged',\r\n 'inputVolumeChanged',\r\n 'filterBypassStateChanged',\r\n 'filterAdded',\r\n 'filterRemoved',\r\n 'filterChanged',\r\n 'inputsChanged',\r\n];\r\n\r\nexport const waveLinkInternalEvents: Array<keyof WaveLinkEvents> = [\r\n 'websocketOpen',\r\n 'websocketClose',\r\n 'initialiseChannels',\r\n 'outputMuteChanged',\r\n 'outputVolumeChanged',\r\n 'selectedOutputChanged',\r\n 'inputNameChanged',\r\n 'inputMuteChanged',\r\n 'inputVolumeChanged',\r\n 'filterBypassStateChanged',\r\n 'filterAdded',\r\n 'filterRemoved',\r\n 'filterChanged',\r\n 'inputsChanged',\r\n];\r\n\r\nexport const waveLinkInputEvents: Array<keyof WaveLinkInputChannelEvents> = [\r\n 'localVolumeChanged',\r\n 'streamVolumeChanged',\r\n 'volumeChanged',\r\n 'localMuteChanged',\r\n 'streamMuteChanged',\r\n 'muteChanged',\r\n 'streamFiltersMuteChanged',\r\n 'localFiltersMuteChanged',\r\n 'nameChanged',\r\n];\r\n\r\nexport const waveLinkOutputEvents: Array<keyof WaveLinkOutputChannelEvents> = [\r\n 'localVolumeChanged',\r\n 'streamVolumeChanged',\r\n 'volumeChanged',\r\n 'localMuteChanged',\r\n 'streamMuteChanged',\r\n 'muteChanged',\r\n 'selectedOutputChanged',\r\n];\r\n\r\nexport const waveLinkFilterEvents: Array<keyof WaveLinkFilterEvents> = [\r\n 'muteChanged',\r\n 'mute',\r\n 'unmute',\r\n];\r\n","import { BaseController } from './Base/BaseController';\r\nimport { BaseWaveLinkController } from './Base/BaseWaveLinkController';\r\nimport simple_jsonrpc from 'simple-jsonrpc-js';\r\nimport { WaveLinkInputController } from './Base/WaveLinkInputController';\r\nimport { WaveLinkOutputController } from './Base/WaveLinkOutputController';\r\nimport {\r\n GetInputConfigsResponse,\r\n GetOutputConfigResponse,\r\n GetOutputsResponse,\r\n} from './Types/WaveLink';\r\nimport { waveLinkInternalEventsToBeRemoved } from './Utils/constants';\r\n\r\nexport class WaveLinkController extends BaseController<{\r\n websocketOpen: () => void;\r\n websocketClose: () => void;\r\n ready: () => void;\r\n}> {\r\n private waveLinkController: BaseWaveLinkController | null = null;\r\n private INPUTS: WaveLinkInputController[] = [];\r\n private OUTPUT: WaveLinkOutputController;\r\n private rpc = new simple_jsonrpc();\r\n\r\n constructor(host: string = '127.0.0.1') {\r\n super();\r\n this.waveLinkController = new BaseWaveLinkController(this.rpc, host);\r\n this.waveLinkController.setMaxListeners(16);\r\n\r\n this.waveLinkController.on(\r\n 'initialiseChannels',\r\n ({ inputs, outputs, selectedOutput }) => {\r\n this.initialiseInputs(inputs);\r\n this.initialiseOutputs(outputs, selectedOutput);\r\n\r\n this.emit('ready');\r\n }\r\n );\r\n\r\n this.waveLinkController.on('websocketOpen', () => {\r\n this.attachCloseListener();\r\n this.emit('websocketOpen');\r\n });\r\n }\r\n\r\n private initialiseInputs(inputs: GetInputConfigsResponse) {\r\n inputs.forEach((input) => {\r\n this.INPUTS.push(\r\n new WaveLinkInputController(\r\n this.rpc,\r\n this.waveLinkController.getWaveLinkEmmiter(),\r\n input\r\n )\r\n );\r\n });\r\n }\r\n\r\n private initialiseOutputs(\r\n outputs: GetOutputConfigResponse,\r\n selectedOutput: GetOutputsResponse['selectedOutput']\r\n ) {\r\n this.OUTPUT = new WaveLinkOutputController(\r\n this.rpc,\r\n this.waveLinkController.getWaveLinkEmmiter(),\r\n selectedOutput,\r\n [...outputs.localMixer, false],\r\n [...outputs.streamMixer, false]\r\n );\r\n }\r\n\r\n private attachCloseListener() {\r\n this.waveLinkController.on('websocketClose', () => {\r\n setTimeout(() => {\r\n waveLinkInternalEventsToBeRemoved.forEach((eventName) => {\r\n this.waveLinkController.removeAllListeners(eventName);\r\n });\r\n\r\n this.INPUTS = [];\r\n this.OUTPUT = null;\r\n\r\n this.emit('websocketClose');\r\n }, 100);\r\n });\r\n }\r\n\r\n async connect() {\r\n await this.waveLinkController.connect();\r\n }\r\n\r\n public getOutput() {\r\n return this.OUTPUT;\r\n }\r\n\r\n public getInputs() {\r\n return this.INPUTS;\r\n }\r\n\r\n public getInput({\r\n name,\r\n identifier,\r\n }: {\r\n name?: string;\r\n identifier?: string;\r\n }) {\r\n return this.INPUTS.find(\r\n (input) => input.identifier === identifier || input.name === name\r\n );\r\n }\r\n}\r\n\r\nexport { WaveLinkInputController, WaveLinkOutputController };\r\n","import { BaseController } from './BaseController';\r\nimport simple_jsonrpc from 'simple-jsonrpc-js';\r\nimport { BaseWaveLinkController } from './BaseWaveLinkController';\r\nimport { GetInputConfigFilter, WaveLinkFilterEvents } from '../Types/WaveLink';\r\n\r\nexport class WaveLinkFilterController extends BaseController<WaveLinkFilterEvents> {\r\n #id: string = '';\r\n #name: string = '';\r\n #muted: boolean = true;\r\n #pluginID: string = '';\r\n #channelIdentifier: string = '';\r\n\r\n constructor(\r\n private readonly rpc: simple_jsonrpc,\r\n waveLinkEmitter: BaseWaveLinkController,\r\n filter: GetInputConfigFilter,\r\n channelIdentifier: string\r\n ) {\r\n super();\r\n\r\n this.#id = filter.filterID;\r\n this.#name = filter.name;\r\n this.#muted = !filter.isActive;\r\n this.#pluginID = filter.pluginID;\r\n this.#channelIdentifier = channelIdentifier;\r\n\r\n waveLinkEmitter.on('filterChanged', ({ identifier, filterID, value }) => {\r\n if (identifier === this.#channelIdentifier && filterID === this.#id) {\r\n this.#muted = !value;\r\n this.emit('muteChanged', this.#muted);\r\n this.emit(value ? 'unmute' : 'mute');\r\n }\r\n });\r\n }\r\n\r\n public get id() {\r\n return this.#id;\r\n }\r\n\r\n public get name() {\r\n return this.#name;\r\n }\r\n\r\n public get muted() {\r\n return this.#muted;\r\n }\r\n\r\n public get pluginID() {\r\n return this.#pluginID;\r\n }\r\n\r\n public set muted(shouldMute: boolean) {\r\n shouldMute ? this.mute() : this.unmute();\r\n }\r\n\r\n public mute() {\r\n this.rpc.call('setFilter', {\r\n filterID: this.id,\r\n identifier: this.#channelIdentifier,\r\n value: false,\r\n });\r\n }\r\n\r\n public unmute() {\r\n this.rpc.call('setFilter', {\r\n filterID: this.id,\r\n identifier: this.#channelIdentifier,\r\n value: true,\r\n });\r\n }\r\n}\r\n","import simple_jsonrpc from 'simple-jsonrpc-js';\r\nimport { WaveLinkFilterController } from './WaveLinkFilterController';\r\nimport { BaseWaveLinkController } from './BaseWaveLinkController';\r\nimport {\r\n GetInputConfig,\r\n GetInputConfigsResponse,\r\n WaveLinkInputChannelEvents,\r\n} from '../Types/WaveLink';\r\nimport { BaseController } from './BaseController';\r\nimport { waveLinkFilterEvents } from '../Utils/constants';\r\n\r\nexport class WaveLinkInputController extends BaseController<WaveLinkInputChannelEvents> {\r\n #rpc: simple_jsonrpc;\r\n #waveLinkEmitter: BaseWaveLinkController;\r\n #FILTERS: WaveLinkFilterController[] = [];\r\n\r\n #name = '';\r\n #bgColor = '';\r\n #iconData = '';\r\n #inputType = 0;\r\n #identifier = '';\r\n #isAvailable = false;\r\n\r\n #localVolume: number = 0;\r\n #localMute: boolean = false;\r\n #streamVolume: number = 0;\r\n #streamMute: boolean = false;\r\n #localFiltersMuted: boolean = false;\r\n #streamFiltersMuted: boolean = false;\r\n\r\n constructor(\r\n rpc: simple_jsonrpc,\r\n waveLinkEmitter: BaseWaveLinkController,\r\n input: GetInputConfig\r\n ) {\r\n super();\r\n\r\n input.filters?.forEach((filter) => {\r\n this.#FILTERS.push(\r\n new WaveLinkFilterController(\r\n rpc,\r\n waveLinkEmitter,\r\n filter,\r\n input.identifier\r\n )\r\n );\r\n });\r\n\r\n this.#rpc = rpc;\r\n this.#identifier = input.identifier;\r\n this.#bgColor = input.bgColor;\r\n this.#iconData = input.iconData;\r\n this.#inputType = input.inputType;\r\n this.#isAvailable = input.isAvailable;\r\n this.#name = input.name;\r\n this.#waveLinkEmitter = waveLinkEmitter;\r\n this.#localMute = input.localMixer[0];\r\n this.#localVolume = input.localMixer[1];\r\n this.#streamMute = input.streamMixer[0];\r\n this.#streamVolume = input.streamMixer[1];\r\n\r\n this.#waveLinkEmitter.on(\r\n 'filterBypassStateChanged',\r\n ({ identifier, mixerID, value }) => {\r\n if (identifier === this.#identifier) {\r\n if (mixerID === 'com.elgato.mix.local') {\r\n this.#localFiltersMuted = value;\r\n this.emit('localFiltersMuteChanged', value);\r\n } else if (mixerID === 'com.elgato.mix.stream') {\r\n this.#streamFiltersMuted = value;\r\n this.emit('streamFiltersMuteChanged', value);\r\n }\r\n }\r\n }\r\n );\r\n\r\n this.#waveLinkEmitter.on(\r\n 'inputVolumeChanged',\r\n ({ identifier, mixerID, value }) => {\r\n if (identifier === this.#identifier) {\r\n if (mixerID === 'com.elgato.mix.local') {\r\n this.#localVolume = value;\r\n this.emit('localVolumeChanged', value);\r\n this.emit('volumeChanged', {\r\n localVolume: this.#localVolume,\r\n streamVolume: this.#streamVolume,\r\n localMute: this.#localMute,\r\n streamMute: this.#streamMute,\r\n });\r\n } else if (mixerID === 'com.elgato.mix.stream') {\r\n this.#streamVolume = value;\r\n this.emit('streamVolumeChanged', value);\r\n this.emit('volumeChanged', {\r\n localVolume: this.#localVolume,\r\n streamVolume: this.#streamVolume,\r\n localMute: this.#localMute,\r\n streamMute: this.#streamMute,\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n this.#waveLinkEmitter.on(\r\n 'inputMuteChanged',\r\n ({ identifier, mixerID, value }) => {\r\n if (identifier === this.#identifier) {\r\n if (mixerID === 'com.elgato.mix.local') {\r\n this.#localMute = value;\r\n this.emit('localMuteChanged', value);\r\n this.emit('muteChanged', {\r\n localMute: this.#localMute,\r\n streamMute: this.#streamMute,\r\n streamVolume: this.#streamVolume,\r\n localVolume: this.#localVolume,\r\n });\r\n } else if (mixerID === 'com.elgato.mix.stream') {\r\n this.#streamMute = value;\r\n this.emit('streamMuteChanged', value);\r\n this.emit('muteChanged', {\r\n localMute: this.#localMute,\r\n streamMute: this.#streamMute,\r\n streamVolume: this.#streamVolume,\r\n localVolume: this.#localVolume,\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n this.#waveLinkEmitter.on(\r\n 'inputsChanged',\r\n (inputs: GetInputConfigsResponse) => {\r\n const newInput = inputs.find(\r\n (input) => input.identifier === this.#identifier\r\n );\r\n\r\n if (!newInput) {\r\n return;\r\n }\r\n\r\n this.#name = newInput.name;\r\n this.#bgColor = newInput.bgColor;\r\n this.#iconData = newInput.iconData;\r\n this.#inputType = newInput.inputType;\r\n this.#isAvailable = newInput.isAvailable;\r\n }\r\n );\r\n\r\n this.#waveLinkEmitter.on(\r\n 'inputNameChanged',\r\n ({ identifier, value }: { identifier: string; value: string }) => {\r\n if (identifier === this.#identifier) {\r\n this.#name = value;\r\n this.emit('nameChanged', value);\r\n }\r\n }\r\n );\r\n\r\n this.#waveLinkEmitter.on('websocketClose', () => {\r\n this.#FILTERS.forEach((filter) => {\r\n for (const filterEvent of waveLinkFilterEvents) {\r\n filter.removeAllListeners(filterEvent);\r\n }\r\n\r\n filter = null;\r\n });\r\n\r\n this.#FILTERS = [];\r\n });\r\n }\r\n\r\n public getFilter({ name, filterID }: { name?: string; filterID?: string }) {\r\n return this.#FILTERS.find(\r\n (filter) =>\r\n (name && filter.name === name) || (filterID && filter.id === filterID)\r\n );\r\n }\r\n\r\n public get identifier() {\r\n return this.#identifier;\r\n }\r\n\r\n public get filters() {\r\n return this.#FILTERS;\r\n }\r\n\r\n public get bgColor() {\r\n return this.#bgColor;\r\n }\r\n\r\n public get iconData() {\r\n return this.#iconData;\r\n }\r\n\r\n public get inputType() {\r\n return this.#inputType;\r\n }\r\n\r\n public get isAvailable() {\r\n return this.#isAvailable;\r\n }\r\n\r\n public get name() {\r\n return this.#name;\r\n }\r\n\r\n public get localFiltersMute() {\r\n return this.#localFiltersMuted;\r\n }\r\n\r\n public get streamFiltersMute() {\r\n return this.#streamFiltersMuted;\r\n }\r\n\r\n public get localVolume() {\r\n return this.#localVolume;\r\n }\r\n\r\n public get streamVolume() {\r\n return this.#streamVolume;\r\n }\r\n\r\n public get localMute() {\r\n return this.#localMute;\r\n }\r\n\r\n public get streamMute() {\r\n return this.#streamMute;\r\n }\r\n\r\n public set localVolume(volume: number) {\r\n this.#rpc.call('setInputConfig', {\r\n identifier: this.#identifier,\r\n mixerID: 'com.elgato.mix.local',\r\n property: 'Volume',\r\n value: volume,\r\n });\r\n }\r\n\r\n public set streamVolume(volume: number) {\r\n this.#rpc.call('setInputConfig', {\r\n identifier: this.#identifier,\r\n mixerID: 'com.elgato.mix.stream',\r\n property: 'Volume',\r\n value: volume,\r\n });\r\n }\r\n\r\n public set localMute(isMuted: boolean) {\r\n this.#rpc.call('setInputConfig', {\r\n identifier: this.#identifier,\r\n mixerID: 'com.elgato.mix.local',\r\n property: 'Mute',\r\n value: isMuted,\r\n });\r\n }\r\n\r\n public set streamMute(isMuted: boolean) {\r\n this.#rpc.call('setInputConfig', {\r\n identifier: this.#identifier,\r\n mixerID: 'com.elgato.mix.stream',\r\n property: 'Mute',\r\n value: isMuted,\r\n });\r\n }\r\n\r\n public set localFiltersMute(isMuted: boolean) {\r\n this.#rpc.call('setFilterBypass', {\r\n identifier: this.#identifier,\r\n mixerID: 'com.elgato.mix.local',\r\n value: isMuted,\r\n });\r\n }\r\n\r\n public set streamFiltersMute(isMuted: boolean) {\r\n this.#rpc.call('setFilterBypass', {\r\n identifier: this.#identifier,\r\n mixerID: 'com.elgato.mix.stream',\r\n value: isMuted,\r\n });\r\n }\r\n\r\n public muteLocal() {\r\n this.localMute = true;\r\n }\r\n\r\n public unmuteLocal() {\r\n this.localMute = false;\r\n }\r\n\r\n public muteStream() {\r\n this.streamMute = true;\r\n }\r\n\r\n public unmuteStream() {\r\n this.streamMute = false;\r\n }\r\n}\r\n","import { BaseController } from './BaseController';\r\nimport { WaveLinkOutputChannelEvents } from '../Types/WaveLink';\r\nimport { BaseWaveLinkController } from './BaseWaveLinkController';\r\nimport simple_jsonrpc from 'simple-jsonrpc-js';\r\nimport { waveLinkOutputEvents } from '../Utils/constants';\r\n\r\nexport class WaveLinkOutputController extends BaseController<WaveLinkOutputChannelEvents> {\r\n #rpc: simple_jsonrpc;\r\n #waveLinkEmitter: BaseWaveLinkController;\r\n #identifier: string = '';\r\n #localVolume: number = 0;\r\n #localMute: boolean = false;\r\n #streamVolume: number = 0;\r\n #streamMute: boolean = false;\r\n\r\n constructor(\r\n rpc: simple_jsonrpc,\r\n waveLinkEmitter: BaseWaveLinkController,\r\n identifier: string,\r\n localMixer: [boolean, number, boolean],\r\n streamMixer: [boolean, number, boolean]\r\n ) {\r\n super();\r\n\r\n this.#rpc = rpc;\r\n this.#waveLinkEmitter = waveLinkEmitter;\r\n this.#identifier = identifier;\r\n\r\n this.#localMute = localMixer[0];\r\n this.#localVolume = localMixer[1];\r\n this.#streamMute = streamMixer[0];\r\n this.#streamVolume = streamMixer[1];\r\n\r\n this.#waveLinkEmitter.on(\r\n 'outputVolumeChanged',\r\n async ({ selectedOutput, mixerID, value }) => {\r\n if (this.#identifier === selectedOutput) {\r\n if (mixerID === 'com.elgato.mix.local') {\r\n this.#localVolume = value;\r\n this.emit('localVolumeChanged', value);\r\n this.emit('volumeChanged', {\r\n localVolume: this.#localVolume,\r\n streamVolume: this.#streamVolume,\r\n localMute: this.#localMute,\r\n streamMute: this.#streamMute,\r\n });\r\n } else if (mixerID === 'com.elgato.mix.stream') {\r\n this.#streamVolume = value;\r\n this.emit('streamVolumeChanged', value);\r\n this.emit('volumeChanged', {\r\n localVolume: this.#localVolume,\r\n streamVolume: this.#streamVolume,\r\n localMute: this.#localMute,\r\n streamMute: this.#streamMute,\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n this.#waveLinkEmitter.on(\r\n 'outputMuteChanged',\r\n ({ selectedOutput, mixerID, value }) => {\r\n if (this.#identifier === selectedOutput) {\r\n if (mixerID === 'com.elgato.mix.local') {\r\n this.#localMute = value;\r\n this.emit('localMuteChanged', value);\r\n this.emit('muteChanged', {\r\n localMute: this.#localMute,\r\n streamMute: this.#streamMute,\r\n streamVolume: this.#streamVolume,\r\n localVolume: this.#localVolume,\r\n });\r\n } else if (mixerID === 'com.elgato.mix.stream') {\r\n this.#streamMute = value;\r\n this.emit('streamMuteChanged', value);\r\n this.emit('muteChanged', {\r\n localMute: this.#localMute,\r\n streamMute: this.#streamMute,\r\n streamVolume: this.#streamVolume,\r\n localVolume: this.#localVolume,\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n this.#waveLinkEmitter.on('selectedOutputChanged', (selectedOutput) => {\r\n this.#identifier = selectedOutput;\r\n this.emit('selectedOutputChanged', selectedOutput);\r\n });\r\n\r\n waveLinkEmitter.on('websocketClose', () => {\r\n for (const eventName of waveLinkOutputEvents) {\r\n this.removeAllListeners(eventName);\r\n }\r\n });\r\n }\r\n\r\n public get identifier() {\r\n return this.#identifier;\r\n }\r\n\r\n public get localVolume(): number {\r\n return this.#localVolume;\r\n }\r\n\r\n public get streamVolume(): number {\r\n return this.#streamVolume;\r\n }\r\n\r\n public get localMute() {\r\n return this.#localMute;\r\n }\r\n\r\n public get streamMute() {\r\n return this.#streamMute;\r\n }\r\n\r\n public set localVolume(volume: number) {\r\n this.#rpc.call('setOutputConfig', {\r\n mixerID: 'com.elgato.mix.local',\r\n property: 'Output Level',\r\n value: volume,\r\n });\r\n }\r\n\r\n public set streamVolume(volume: number) {\r\n this.#rpc.call('setOutputConfig', {\r\n mixerID: 'com.elgato.mix.stream',\r\n property: 'Output Level',\r\n value: volume,\r\n });\r\n }\r\n\r\n public set localMute(isMuted: boolean) {\r\n this.#rpc.call('setOutputConfig', {\r\n mixerID: 'com.elgato.mix.local',\r\n property: 'Mute',\r\n value: isMuted,\r\n });\r\n }\r\n\r\n public set streamMute(isMuted: boolean) {\r\n this.#rpc.call('setOutputConfig', {\r\n mixerID: 'com.elgato.mix.stream',\r\n property: 'Mute',\r\n value: isMuted,\r\n });\r\n }\r\n\r\n public muteLocal() {\r\n this.localMute = true;\r\n }\r\n\r\n public unmuteLocal() {\r\n this.localMute = false;\r\n }\r\n\r\n public muteStream() {\r\n this.streamMute = true;\r\n }\r\n\r\n public unmuteStream() {\r\n this.streamMute = false;\r\n }\r\n}\r\n"],"mappings":"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","names":["callback","input"]}