steelseries-sonar-sdk 0.1.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/dist/consts/fetch-options-put.d.ts +3 -0
  2. package/{src/enums.ts → dist/enums.d.ts} +34 -41
  3. package/dist/exceptions.d.ts +32 -0
  4. package/dist/functions/audio/get-audio-data-classic.d.ts +7 -0
  5. package/dist/functions/audio/get-audio-data-stream.d.ts +7 -0
  6. package/dist/functions/audio/get-audio-mode.d.ts +7 -0
  7. package/dist/functions/audio/set-audio-mode.d.ts +8 -0
  8. package/dist/functions/audio/set-channel-mute-classic.d.ts +9 -0
  9. package/dist/functions/audio/set-channel-mute-streamer.d.ts +10 -0
  10. package/dist/functions/audio/set-channel-volume-classic.d.ts +9 -0
  11. package/dist/functions/audio/set-channel-volume-streamer.d.ts +10 -0
  12. package/dist/functions/chatmix/get-chat-mix-state.d.ts +7 -0
  13. package/dist/functions/chatmix/set-chat-mix-balance.d.ts +7 -0
  14. package/dist/functions/converters/convert-channel-to-api.d.ts +3 -0
  15. package/dist/functions/converters/convert-chat-mix-balance-to-api.d.ts +2 -0
  16. package/dist/functions/converters/convert-chat-mix-balance-to-user.d.ts +2 -0
  17. package/dist/functions/converters/convert-profile-channel-to-api.d.ts +3 -0
  18. package/dist/functions/converters/convert-profile-channel-to-user.d.ts +3 -0
  19. package/dist/functions/converters/convert-volume-to-api.d.ts +1 -0
  20. package/dist/functions/converters/convert-volume-to-user.d.ts +1 -0
  21. package/dist/functions/devices/get-audio-devices.d.ts +3 -0
  22. package/dist/functions/devices/set-audio-device.d.ts +3 -0
  23. package/dist/functions/endpoint/get-app-endpoint.d.ts +14 -0
  24. package/dist/functions/endpoint/get-sonar-endpoint-cached.d.ts +1 -0
  25. package/dist/functions/endpoint/get-sonar-endpoint.d.ts +14 -0
  26. package/dist/functions/profile/get-channel-profiles.d.ts +3 -0
  27. package/dist/functions/profile/get-selected-profiles.d.ts +2 -0
  28. package/dist/functions/profile/set-selected-profile.d.ts +2 -0
  29. package/dist/index.d.ts +29 -0
  30. package/dist/index.js +874 -0
  31. package/{src/sonar/models/audio-settings/chatmix-data.ts → dist/sonar/models/audio-settings/chatmix-data.d.ts} +4 -5
  32. package/dist/sonar/models/audio-settings/enums/audio-mode.d.ts +4 -0
  33. package/dist/sonar/models/audio-settings/enums/chat-mix-state.d.ts +6 -0
  34. package/dist/sonar/models/audio-settings/enums/device-data-flow.d.ts +5 -0
  35. package/dist/sonar/models/audio-settings/enums/device-default-roles.d.ts +6 -0
  36. package/dist/sonar/models/audio-settings/enums/device-role.d.ts +9 -0
  37. package/dist/sonar/models/audio-settings/enums/device-state.d.ts +8 -0
  38. package/dist/sonar/models/audio-settings/enums/sonar-channel.d.ts +8 -0
  39. package/dist/sonar/models/audio-settings/enums/streaming-path.d.ts +4 -0
  40. package/dist/sonar/models/audio-settings/volume-info-classic.d.ts +4 -0
  41. package/dist/sonar/models/audio-settings/volume-info-streamer.d.ts +10 -0
  42. package/dist/sonar/models/audio-settings/volume-settings-classic.d.ts +9 -0
  43. package/dist/sonar/models/audio-settings/volume-settings-streamer.d.ts +9 -0
  44. package/dist/sonar/models/config/config.d.ts +8 -0
  45. package/dist/sonar/models/config/enums/VirtualAudioDevice.d.ts +7 -0
  46. package/dist/sonar/models/devices/audio-device.d.ts +16 -0
  47. package/dist/sonar/models/devices/changed-device.d.ts +6 -0
  48. package/dist/sonar/requests/audio-devices/change-audio-device.d.ts +3 -0
  49. package/dist/sonar/requests/audio-devices/request-audio-devices.d.ts +9 -0
  50. package/dist/sonar/requests/chatmix/change-chat-mix-balance.d.ts +2 -0
  51. package/dist/sonar/requests/chatmix/request-chat-mix-state.d.ts +2 -0
  52. package/dist/sonar/requests/mode/change-audio-mode.d.ts +2 -0
  53. package/dist/sonar/requests/mode/request-audio-mode.d.ts +2 -0
  54. package/dist/sonar/requests/profiles/change-selected-config.d.ts +2 -0
  55. package/dist/sonar/requests/profiles/request-configs.d.ts +3 -0
  56. package/dist/sonar/requests/profiles/request-selected-configs.d.ts +2 -0
  57. package/dist/sonar/requests/volume-settings/change-volume-level-classic.d.ts +3 -0
  58. package/dist/sonar/requests/volume-settings/change-volume-level-streamer.d.ts +4 -0
  59. package/dist/sonar/requests/volume-settings/change-volume-mute-classic.d.ts +3 -0
  60. package/dist/sonar/requests/volume-settings/change-volume-mute-streamer.d.ts +4 -0
  61. package/dist/sonar/requests/volume-settings/request-volume-settings-classic.d.ts +2 -0
  62. package/dist/sonar/requests/volume-settings/request-volume-settings-streamer.d.ts +2 -0
  63. package/dist/types/audio-device.d.ts +6 -0
  64. package/dist/types/changed-device.d.ts +6 -0
  65. package/dist/types/channel-volume-classic.d.ts +4 -0
  66. package/dist/types/channel-volume-streamer-path.d.ts +4 -0
  67. package/dist/types/channel-volume-streamer.d.ts +5 -0
  68. package/dist/types/channel-volumes-classic.d.ts +7 -0
  69. package/dist/types/channel-volumes-streamer.d.ts +7 -0
  70. package/dist/types/chat-mix-data.d.ts +6 -0
  71. package/dist/types/profile-option.d.ts +8 -0
  72. package/package.json +7 -3
  73. package/.gitattributes +0 -8
  74. package/.github/workflows/tests.yml +0 -18
  75. package/.vscode/extensions.json +0 -8
  76. package/.vscode/settings.json +0 -33
  77. package/_.todo +0 -4
  78. package/biome.json +0 -62
  79. package/http/sonar.http +0 -104
  80. package/src/consts/fetch-options-put.ts +0 -3
  81. package/src/exceptions.ts +0 -45
  82. package/src/functions/audio/get-audio-data-classic.ts +0 -31
  83. package/src/functions/audio/get-audio-data-stream.ts +0 -37
  84. package/src/functions/audio/get-audio-mode.ts +0 -11
  85. package/src/functions/audio/set-audio-mode.ts +0 -12
  86. package/src/functions/audio/set-channel-mute-classic.ts +0 -35
  87. package/src/functions/audio/set-channel-mute-streamer.ts +0 -41
  88. package/src/functions/audio/set-channel-volume-classic.ts +0 -37
  89. package/src/functions/audio/set-channel-volume-streamer.ts +0 -43
  90. package/src/functions/chatmix/get-chat-mix-state.ts +0 -20
  91. package/src/functions/chatmix/set-chat-mix-balance.ts +0 -22
  92. package/src/functions/converters/convert-channel-to-api.ts +0 -19
  93. package/src/functions/converters/convert-chat-mix-balance-to-api.ts +0 -6
  94. package/src/functions/converters/convert-chat-mix-balance-to-user.ts +0 -7
  95. package/src/functions/converters/convert-profile-channel-to-api.ts +0 -19
  96. package/src/functions/converters/convert-profile-channel-to-user.ts +0 -19
  97. package/src/functions/converters/convert-volume-to-api.ts +0 -5
  98. package/src/functions/converters/convert-volume-to-user.ts +0 -6
  99. package/src/functions/devices/get-audio-devices.ts +0 -40
  100. package/src/functions/devices/set-audio-device.ts +0 -19
  101. package/src/functions/endpoint/get-app-endpoint.ts +0 -73
  102. package/src/functions/endpoint/get-sonar-endpoint-cached.ts +0 -28
  103. package/src/functions/endpoint/get-sonar-endpoint.ts +0 -88
  104. package/src/functions/profile/get-channel-profiles.ts +0 -26
  105. package/src/functions/profile/get-selected-profiles.ts +0 -17
  106. package/src/functions/profile/set-selected-profile.ts +0 -17
  107. package/src/index.ts +0 -41
  108. package/src/sonar/models/audio-settings/enums/audio-mode.ts +0 -4
  109. package/src/sonar/models/audio-settings/enums/chat-mix-state.ts +0 -6
  110. package/src/sonar/models/audio-settings/enums/device-data-flow.ts +0 -5
  111. package/src/sonar/models/audio-settings/enums/device-default-roles.ts +0 -6
  112. package/src/sonar/models/audio-settings/enums/device-role.ts +0 -9
  113. package/src/sonar/models/audio-settings/enums/device-state.ts +0 -8
  114. package/src/sonar/models/audio-settings/enums/sonar-channel.ts +0 -8
  115. package/src/sonar/models/audio-settings/enums/streaming-path.ts +0 -4
  116. package/src/sonar/models/audio-settings/volume-info-classic.ts +0 -4
  117. package/src/sonar/models/audio-settings/volume-info-streamer.ts +0 -10
  118. package/src/sonar/models/audio-settings/volume-settings-classic.ts +0 -13
  119. package/src/sonar/models/audio-settings/volume-settings-streamer.ts +0 -13
  120. package/src/sonar/models/config/config.ts +0 -9
  121. package/src/sonar/models/config/enums/VirtualAudioDevice.ts +0 -7
  122. package/src/sonar/models/devices/audio-device.ts +0 -17
  123. package/src/sonar/models/devices/changed-device.ts +0 -7
  124. package/src/sonar/requests/audio-devices/change-audio-device.ts +0 -37
  125. package/src/sonar/requests/audio-devices/request-audio-devices.ts +0 -42
  126. package/src/sonar/requests/chatmix/change-chat-mix-balance.ts +0 -25
  127. package/src/sonar/requests/chatmix/request-chat-mix-state.ts +0 -24
  128. package/src/sonar/requests/mode/change-audio-mode.ts +0 -24
  129. package/src/sonar/requests/mode/request-audio-mode.ts +0 -24
  130. package/src/sonar/requests/profiles/change-selected-config.ts +0 -25
  131. package/src/sonar/requests/profiles/request-configs.ts +0 -24
  132. package/src/sonar/requests/profiles/request-selected-configs.ts +0 -22
  133. package/src/sonar/requests/volume-settings/change-volume-level-classic.ts +0 -27
  134. package/src/sonar/requests/volume-settings/change-volume-level-streamer.ts +0 -29
  135. package/src/sonar/requests/volume-settings/change-volume-mute-classic.ts +0 -27
  136. package/src/sonar/requests/volume-settings/change-volume-mute-streamer.ts +0 -29
  137. package/src/sonar/requests/volume-settings/request-volume-settings-classic.ts +0 -22
  138. package/src/sonar/requests/volume-settings/request-volume-settings-streamer.ts +0 -22
  139. package/src/types/audio-device.ts +0 -7
  140. package/src/types/changed-device.ts +0 -7
  141. package/src/types/channel-volume-classic.ts +0 -4
  142. package/src/types/channel-volume-streamer-path.ts +0 -4
  143. package/src/types/channel-volume-streamer.ts +0 -6
  144. package/src/types/channel-volumes-classic.ts +0 -8
  145. package/src/types/channel-volumes-streamer.ts +0 -8
  146. package/src/types/chat-mix-data.ts +0 -7
  147. package/src/types/profile-option.ts +0 -9
  148. package/tests/e2e/audio/get-audio-data-classic.real.test.ts +0 -11
  149. package/tests/e2e/audio/get-audio-data-stream.real.test.ts +0 -11
  150. package/tests/e2e/audio/get-audio-mode.real.test.ts +0 -12
  151. package/tests/e2e/audio/set-audio-mode.real.test.ts +0 -20
  152. package/tests/e2e/audio/set-channel-mute-classic.real.test.ts +0 -18
  153. package/tests/e2e/audio/set-channel-mute-streamer.real.test.ts +0 -18
  154. package/tests/e2e/audio/set-channel-volume-classic.real.test.ts +0 -17
  155. package/tests/e2e/audio/set-channel-volume-streamer.real.test.ts +0 -22
  156. package/tests/e2e/chatmix/get-chat-mix-state.real.test.ts +0 -25
  157. package/tests/e2e/chatmix/set-chat-mix-balance.real.test.ts +0 -25
  158. package/tests/e2e/devices/get-audio-devices.real.test.ts +0 -29
  159. package/tests/e2e/devices/set-audio-device.real.test.ts +0 -32
  160. package/tests/e2e/enpoint/get-app-endpoint.real.test.ts +0 -19
  161. package/tests/e2e/enpoint/get-sonar-endpoint-cached.real.test.ts +0 -32
  162. package/tests/e2e/enpoint/get-sonar-endpoint.real.test.ts +0 -21
  163. package/tests/e2e/profiles/get-channel-profiles.real.test.ts +0 -21
  164. package/tests/e2e/profiles/get-selected-profiles.real.test.ts +0 -11
  165. package/tests/e2e/profiles/set-selected-profile.real.test.ts +0 -17
  166. package/tests/helpers/get-endpoint-e2e.ts +0 -8
  167. package/tests/unit/audio/get-audio-data-classic.test.ts +0 -57
  168. package/tests/unit/audio/get-audio-data-stream.test.ts +0 -65
  169. package/tests/unit/audio/get-audio-mode.test.ts +0 -58
  170. package/tests/unit/audio/set-audio-mode.test.ts +0 -66
  171. package/tests/unit/audio/set-channel-mute-classic.test.ts +0 -58
  172. package/tests/unit/audio/set-channel-mute-streamer.test.ts +0 -64
  173. package/tests/unit/audio/set-channel-volume-classic.test.ts +0 -58
  174. package/tests/unit/audio/set-channel-volume-streamer.test.ts +0 -64
  175. package/tests/unit/chatmix/get-chat-mix-state.test.ts +0 -70
  176. package/tests/unit/chatmix/set-chat-mix-balance.test.ts +0 -58
  177. package/tests/unit/devices/get-audio-devices.test.ts +0 -59
  178. package/tests/unit/devices/set-audio-devices.test.ts +0 -62
  179. package/tests/unit/endpoint/get-app-endpoint.test.ts +0 -72
  180. package/tests/unit/endpoint/get-sonar-endpoint-cached.test.ts +0 -93
  181. package/tests/unit/endpoint/get-sonar-endpoint.test.ts +0 -140
  182. package/tests/unit/profiles/get-channel-profiles.test.ts +0 -91
  183. package/tests/unit/profiles/get-selected-profiles.test.ts +0 -64
  184. package/tests/unit/profiles/set-selected-profile.test.ts +0 -55
  185. package/tsconfig.json +0 -36
@@ -1,31 +0,0 @@
1
- import { AudioChannel } from '@/enums'
2
- import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
3
- import type { VolumeInfoClassic } from '@/sonar/models/audio-settings/volume-info-classic'
4
- import { requestVolumeSettingsClassic } from '@/sonar/requests/volume-settings/request-volume-settings-classic'
5
- import type { ChannelVolumeClassic } from '@/types/channel-volume-classic'
6
- import type { ChannelVolumesClassic } from '@/types/channel-volumes-classic'
7
-
8
- /**
9
- * Gets audio data for all channels.
10
- * @param sonarEndpoint Sonar endpoint URL
11
- * @returns volume in the range of 0 to 100,
12
- */
13
- export async function getAudioDataClassic(sonarEndpoint: string): Promise<ChannelVolumesClassic> {
14
- const data = await requestVolumeSettingsClassic(sonarEndpoint)
15
- const volumeData: ChannelVolumesClassic = {
16
- [AudioChannel.Master]: createResponseVolumeData(data.masters.classic),
17
- [AudioChannel.Game]: data.devices.game && createResponseVolumeData(data.devices.game.classic),
18
- [AudioChannel.Chat]: data.devices.chatRender && createResponseVolumeData(data.devices.chatRender.classic),
19
- [AudioChannel.Media]: data.devices.media && createResponseVolumeData(data.devices.media.classic),
20
- [AudioChannel.Aux]: data.devices.aux && createResponseVolumeData(data.devices.aux.classic),
21
- [AudioChannel.Mic]: data.devices.chatCapture && createResponseVolumeData(data.devices.chatCapture.classic)
22
- }
23
- return volumeData
24
- }
25
-
26
- function createResponseVolumeData(volumeData: VolumeInfoClassic): ChannelVolumeClassic {
27
- return {
28
- volume: convertVolumeToUser(volumeData.volume),
29
- isMuted: volumeData.muted
30
- }
31
- }
@@ -1,37 +0,0 @@
1
- import { AudioChannel, StreamerPath } from '@/enums'
2
- import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
3
- import type { VolumeInfoStreamer } from '@/sonar/models/audio-settings/volume-info-streamer'
4
- import { requestVolumeSettingsStreamer } from '@/sonar/requests/volume-settings/request-volume-settings-streamer'
5
- import type { ChannelVolumeStreamer } from '@/types/channel-volume-streamer'
6
- import type { ChannelVolumesStreamer } from '@/types/channel-volumes-streamer'
7
-
8
- /**
9
- * Gets audio data for all channels.
10
- * @param sonarEndpoint Sonar endpoint URL
11
- * @returns volume in the range of 0 to 100,
12
- */
13
- export async function getAudioDataStream(sonarEndpoint: string): Promise<ChannelVolumesStreamer> {
14
- const data = await requestVolumeSettingsStreamer(sonarEndpoint)
15
- const volumeData: ChannelVolumesStreamer = {
16
- [AudioChannel.Master]: createResponseVolumeData(data.masters.stream),
17
- [AudioChannel.Game]: data.devices.game && createResponseVolumeData(data.devices.game.stream),
18
- [AudioChannel.Chat]: data.devices.chatRender && createResponseVolumeData(data.devices.chatRender.stream),
19
- [AudioChannel.Media]: data.devices.media && createResponseVolumeData(data.devices.media.stream),
20
- [AudioChannel.Aux]: data.devices.aux && createResponseVolumeData(data.devices.aux.stream),
21
- [AudioChannel.Mic]: data.devices.chatCapture && createResponseVolumeData(data.devices.chatCapture.stream)
22
- }
23
- return volumeData
24
- }
25
-
26
- function createResponseVolumeData(volumeData: VolumeInfoStreamer): ChannelVolumeStreamer {
27
- return {
28
- [StreamerPath.Streaming]: {
29
- volume: convertVolumeToUser(volumeData.streaming.volume),
30
- isMuted: volumeData.streaming.muted
31
- },
32
- [StreamerPath.Monitoring]: {
33
- volume: convertVolumeToUser(volumeData.monitoring.volume),
34
- isMuted: volumeData.monitoring.muted
35
- }
36
- }
37
- }
@@ -1,11 +0,0 @@
1
- import type { AudioMode } from '@/enums'
2
- import { requestAudioMode } from '@/sonar/requests/mode/request-audio-mode'
3
-
4
- /**
5
- * Gets audio data for all channels.
6
- * @param sonarEndpoint Sonar endpoint URL
7
- * @returns classic or streamer mode
8
- */
9
- export async function getAudioMode(sonarEndpoint: string): Promise<AudioMode> {
10
- return await requestAudioMode(sonarEndpoint)
11
- }
@@ -1,12 +0,0 @@
1
- import type { AudioMode } from '@/enums'
2
- import { changeAudioMode } from '@/sonar/requests/mode/change-audio-mode'
3
-
4
- /**
5
- * Gets audio data for all channels.
6
- * @param sonarEndpoint Sonar endpoint URL
7
- * @param audioMode Target audio mode
8
- * @returns classic or streamer mode
9
- */
10
- export async function setAudioMode(sonarEndpoint: string, audioMode: AudioMode): Promise<AudioMode> {
11
- return await changeAudioMode(sonarEndpoint, audioMode)
12
- }
@@ -1,35 +0,0 @@
1
- import type { AudioChannel } from '@/enums'
2
- import { SonarRequestException } from '@/exceptions'
3
- import { convertChannelToApi } from '@/functions/converters/convert-channel-to-api'
4
- import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
5
- import { SonarChannel } from '@/sonar/models/audio-settings/enums/sonar-channel'
6
- import { changeVolumeMuteClassic } from '@/sonar/requests/volume-settings/change-volume-mute-classic'
7
- import type { ChannelVolumeClassic } from '@/types/channel-volume-classic'
8
-
9
- /**
10
- * Sets audio data for target channel.
11
- * @param sonarEndpoint Sonar endpoint URL
12
- * @param isMuted Will mute if true.
13
- * @param channel Target audio channel
14
- */
15
- export async function setChannelMuteClassic(
16
- sonarEndpoint: string,
17
- isMuted: boolean,
18
- channel: AudioChannel
19
- ): Promise<ChannelVolumeClassic> {
20
- const sonarChannel = convertChannelToApi(channel)
21
- const data = await changeVolumeMuteClassic(sonarEndpoint, isMuted, sonarChannel)
22
-
23
- const device = sonarChannel === SonarChannel.Master ? data.masters.classic : data.devices[sonarChannel]?.classic
24
-
25
- if (!device) {
26
- throw new SonarRequestException({ message: `Missing device data in response.` })
27
- }
28
-
29
- const result: ChannelVolumeClassic = {
30
- volume: convertVolumeToUser(device.volume),
31
- isMuted: device.muted
32
- }
33
-
34
- return result
35
- }
@@ -1,41 +0,0 @@
1
- import { type AudioChannel, StreamerPath } from '@/enums'
2
- import { SonarRequestException } from '@/exceptions'
3
- import { convertChannelToApi } from '@/functions/converters/convert-channel-to-api'
4
- import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
5
- import { SonarChannel } from '@/sonar/models/audio-settings/enums/sonar-channel'
6
- import { StreamingPath } from '@/sonar/models/audio-settings/enums/streaming-path'
7
- import { changeVolumeMuteStreamer } from '@/sonar/requests/volume-settings/change-volume-mute-streamer'
8
- import type { ChannelVolumeStreamerPath } from '@/types/channel-volume-streamer-path'
9
-
10
- /**
11
- * Sets audio data for target channel.
12
- * @param sonarEndpoint Sonar endpoint URL
13
- * @param isMuted Will mute if true.
14
- * @param channel Target audio channel
15
- * @param path Target streamer path
16
- */
17
- export async function setChannelMuteStreamer(
18
- sonarEndpoint: string,
19
- isMuted: boolean,
20
- channel: AudioChannel,
21
- path: StreamerPath
22
- ): Promise<ChannelVolumeStreamerPath> {
23
- const sonarChannel = convertChannelToApi(channel)
24
- const streamPath = path === StreamerPath.Streaming ? StreamingPath.Streaming : StreamingPath.Monitoring
25
- const data = await changeVolumeMuteStreamer(sonarEndpoint, isMuted, sonarChannel, streamPath)
26
-
27
- const device = sonarChannel === SonarChannel.Master ? data.masters.stream : data.devices[sonarChannel]?.stream
28
-
29
- if (!device) {
30
- throw new SonarRequestException({ message: `Missing device data in response.` })
31
- }
32
-
33
- const devicePath = path === StreamerPath.Streaming ? device.streaming : device.monitoring
34
-
35
- const result: ChannelVolumeStreamerPath = {
36
- volume: convertVolumeToUser(devicePath.volume),
37
- isMuted: devicePath.muted
38
- }
39
-
40
- return result
41
- }
@@ -1,37 +0,0 @@
1
- import type { AudioChannel } from '@/enums'
2
- import { SonarRequestException } from '@/exceptions'
3
- import { convertChannelToApi } from '@/functions/converters/convert-channel-to-api'
4
- import { convertVolumeToApi } from '@/functions/converters/convert-volume-to-api'
5
- import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
6
- import { SonarChannel } from '@/sonar/models/audio-settings/enums/sonar-channel'
7
- import { changeVolumeLevelClassic } from '@/sonar/requests/volume-settings/change-volume-level-classic'
8
- import type { ChannelVolumeClassic } from '@/types/channel-volume-classic'
9
-
10
- /**
11
- * Sets audio data for target channel.
12
- * @param sonarEndpoint Sonar endpoint URL
13
- * @param volumePercent Volume in the range of 0 to 100
14
- * @param channel Target audio channel
15
- */
16
- export async function setChannelVolumeClassic(
17
- sonarEndpoint: string,
18
- volumePercent: number,
19
- channel: AudioChannel
20
- ): Promise<ChannelVolumeClassic> {
21
- const sonarChannel = convertChannelToApi(channel)
22
- const formattedVolume = convertVolumeToApi(volumePercent)
23
- const data = await changeVolumeLevelClassic(sonarEndpoint, formattedVolume, sonarChannel)
24
-
25
- const device = sonarChannel === SonarChannel.Master ? data.masters.classic : data.devices[sonarChannel]?.classic
26
-
27
- if (!device) {
28
- throw new SonarRequestException({ message: `Missing device data in response.` })
29
- }
30
-
31
- const result: ChannelVolumeClassic = {
32
- volume: convertVolumeToUser(device.volume),
33
- isMuted: device.muted
34
- }
35
-
36
- return result
37
- }
@@ -1,43 +0,0 @@
1
- import { type AudioChannel, StreamerPath } from '@/enums'
2
- import { SonarRequestException } from '@/exceptions'
3
- import { convertChannelToApi } from '@/functions/converters/convert-channel-to-api'
4
- import { convertVolumeToApi } from '@/functions/converters/convert-volume-to-api'
5
- import { convertVolumeToUser } from '@/functions/converters/convert-volume-to-user'
6
- import { SonarChannel } from '@/sonar/models/audio-settings/enums/sonar-channel'
7
- import { StreamingPath } from '@/sonar/models/audio-settings/enums/streaming-path'
8
- import { changeVolumeLevelStreamer } from '@/sonar/requests/volume-settings/change-volume-level-streamer'
9
- import type { ChannelVolumeStreamerPath } from '@/types/channel-volume-streamer-path'
10
-
11
- /**
12
- * Sets audio data for target channel.
13
- * @param sonarEndpoint Sonar endpoint URL
14
- * @param volumePercent Volume in the range of 0 to 100
15
- * @param channel Target audio channel
16
- * @param path Target streamer path
17
- */
18
- export async function setChannelVolumeStreamer(
19
- sonarEndpoint: string,
20
- volumePercent: number,
21
- channel: AudioChannel,
22
- path: StreamerPath
23
- ): Promise<ChannelVolumeStreamerPath> {
24
- const sonarChannel = convertChannelToApi(channel)
25
- const formattedVolume = convertVolumeToApi(volumePercent)
26
- const streamPath = path === StreamerPath.Streaming ? StreamingPath.Streaming : StreamingPath.Monitoring
27
- const data = await changeVolumeLevelStreamer(sonarEndpoint, formattedVolume, sonarChannel, streamPath)
28
-
29
- const device = sonarChannel === SonarChannel.Master ? data.masters.stream : data.devices[sonarChannel]?.stream
30
-
31
- if (!device) {
32
- throw new SonarRequestException({ message: `Missing device data in response.` })
33
- }
34
-
35
- const devicePath = path === StreamerPath.Streaming ? device.streaming : device.monitoring
36
-
37
- const result: ChannelVolumeStreamerPath = {
38
- volume: convertVolumeToUser(devicePath.volume),
39
- isMuted: devicePath.muted
40
- }
41
-
42
- return result
43
- }
@@ -1,20 +0,0 @@
1
- import { ChatMixState } from '@/enums'
2
- import { convertChatMixBalanceToUser } from '@/functions/converters/convert-chat-mix-balance-to-user'
3
- import { requestChatMixState } from '@/sonar/requests/chatmix/request-chat-mix-state'
4
- import type { ChatMixData } from '@/types/chat-mix-data'
5
-
6
- /**
7
- * Gets CHATMIX state and data.
8
- * @param sonarEndpoint Sonar endpoint URL
9
- * @returns balance as 0 - 100,
10
- */
11
- export async function getChatMixState(sonarEndpoint: string): Promise<ChatMixData> {
12
- const data = await requestChatMixState(sonarEndpoint)
13
-
14
- const chatMixData: ChatMixData = {
15
- chatBalance: convertChatMixBalanceToUser(data.balance),
16
- state: data.state,
17
- isEnabled: data.state === ChatMixState.Enabled
18
- }
19
- return chatMixData
20
- }
@@ -1,22 +0,0 @@
1
- import { ChatMixState } from '@/enums'
2
- import { convertChatMixBalanceToApi } from '@/functions/converters/convert-chat-mix-balance-to-api'
3
- import { convertChatMixBalanceToUser } from '@/functions/converters/convert-chat-mix-balance-to-user'
4
- import { changeChatMixBalance } from '@/sonar/requests/chatmix/change-chat-mix-balance'
5
- import type { ChatMixData } from '@/types/chat-mix-data'
6
-
7
- /**
8
- * Set CHATMIX balance between audio(0%) and chat(100%).
9
- * @param sonarEndpoint Sonar endpoint URL
10
- * @param chatBalance Balance as 0 - 100,
11
- */
12
- export async function setChatMixBalance(sonarEndpoint: string, chatBalance: number): Promise<ChatMixData> {
13
- const balance = convertChatMixBalanceToApi(chatBalance)
14
- const data = await changeChatMixBalance(sonarEndpoint, balance)
15
-
16
- const chatMixData: ChatMixData = {
17
- chatBalance: convertChatMixBalanceToUser(data.balance),
18
- state: data.state,
19
- isEnabled: data.state === ChatMixState.Enabled
20
- }
21
- return chatMixData
22
- }
@@ -1,19 +0,0 @@
1
- import { AudioChannel } from '@/enums'
2
- import { SonarChannel } from '@/sonar/models/audio-settings/enums/sonar-channel'
3
-
4
- export function convertChannelToApi(channel: AudioChannel): SonarChannel {
5
- switch (channel) {
6
- case AudioChannel.Master:
7
- return SonarChannel.Master
8
- case AudioChannel.Game:
9
- return SonarChannel.ChatRender
10
- case AudioChannel.Media:
11
- return SonarChannel.Media
12
- case AudioChannel.Aux:
13
- return SonarChannel.Aux
14
- case AudioChannel.Mic:
15
- return SonarChannel.ChatCapture
16
- default:
17
- throw new Error(`Unsupported AudioChannel: ${channel}`)
18
- }
19
- }
@@ -1,6 +0,0 @@
1
- /** convert [0 to 100] to [-1 to 1] */
2
- export function convertChatMixBalanceToApi(balance: number): number {
3
- let result = (balance / 100) * 2 - 1
4
- result = Math.min(Math.max(result, -1), 1)
5
- return result
6
- }
@@ -1,7 +0,0 @@
1
- /** convert [-1 to 1] to [0 to 100] */
2
- export function convertChatMixBalanceToUser(balance: number): number {
3
- let result = ((balance + 1) / 2) * 100
4
- result = Math.floor(result)
5
- result = Math.min(Math.max(result, 0), 100)
6
- return result
7
- }
@@ -1,19 +0,0 @@
1
- import { ProfileChannel } from '@/enums'
2
- import { VirtualAudioDevice } from '@/sonar/models/config/enums/VirtualAudioDevice'
3
-
4
- export function convertProfileChannelToApi(channel: ProfileChannel): VirtualAudioDevice {
5
- switch (channel) {
6
- case ProfileChannel.Game:
7
- return VirtualAudioDevice.Game
8
- case ProfileChannel.Chat:
9
- return VirtualAudioDevice.ChatRender
10
- case ProfileChannel.Media:
11
- return VirtualAudioDevice.Media
12
- case ProfileChannel.Aux:
13
- return VirtualAudioDevice.Aux
14
- case ProfileChannel.Mic:
15
- return VirtualAudioDevice.ChatCapture
16
- default:
17
- throw new Error(`Unsupported ProfileChannel: ${channel}`)
18
- }
19
- }
@@ -1,19 +0,0 @@
1
- import { ProfileChannel } from '@/enums'
2
- import { VirtualAudioDevice } from '@/sonar/models/config/enums/VirtualAudioDevice'
3
-
4
- export function convertProfileChannelToUser(channel: VirtualAudioDevice): ProfileChannel {
5
- switch (channel) {
6
- case VirtualAudioDevice.Game:
7
- return ProfileChannel.Game
8
- case VirtualAudioDevice.ChatRender:
9
- return ProfileChannel.Chat
10
- case VirtualAudioDevice.Media:
11
- return ProfileChannel.Media
12
- case VirtualAudioDevice.Aux:
13
- return ProfileChannel.Aux
14
- case VirtualAudioDevice.ChatCapture:
15
- return ProfileChannel.Mic
16
- default:
17
- throw new Error(`Unsupported ProfileChannel: ${channel}`)
18
- }
19
- }
@@ -1,5 +0,0 @@
1
- export function convertVolumeToApi(value: number): number {
2
- let result = value / 100
3
- result = Math.min(Math.max(result, 0), 1)
4
- return result
5
- }
@@ -1,6 +0,0 @@
1
- export function convertVolumeToUser(value: number): number {
2
- let result = value * 100
3
- result = Math.min(Math.max(result, 0), 100)
4
- result = Math.floor(result)
5
- return result
6
- }
@@ -1,40 +0,0 @@
1
- import { DeviceFlow } from '@/enums'
2
- import { SonarRequestException } from '@/exceptions'
3
- import { DeviceDataFlow } from '@/sonar/models/audio-settings/enums/device-data-flow'
4
- import { requestAudioDevices } from '@/sonar/requests/audio-devices/request-audio-devices'
5
- import type { AudioDevice } from '@/types/audio-device'
6
-
7
- export async function getAudioDevices(sonarEndpoint: string, deviceType?: DeviceFlow): Promise<AudioDevice[]> {
8
- let deviceDataFlow: DeviceDataFlow
9
- switch (deviceType) {
10
- case DeviceFlow.Input:
11
- deviceDataFlow = DeviceDataFlow.Capture
12
- break
13
- case DeviceFlow.Output:
14
- deviceDataFlow = DeviceDataFlow.Render
15
- break
16
- case undefined:
17
- deviceDataFlow = DeviceDataFlow.All
18
- break
19
- }
20
- const data = await requestAudioDevices(sonarEndpoint, { deviceDataFlow, removeSteelSeriesVAD: true })
21
-
22
- const audioDevices: AudioDevice[] = data.map((device) => ({
23
- id: device.id,
24
- name: device.friendlyName,
25
- type: getDeviceTypeFromDataFlow(device.dataFlow)
26
- }))
27
-
28
- return audioDevices
29
- }
30
-
31
- function getDeviceTypeFromDataFlow(dataFlow: DeviceDataFlow): DeviceFlow {
32
- switch (dataFlow) {
33
- case DeviceDataFlow.Capture:
34
- return DeviceFlow.Input
35
- case DeviceDataFlow.Render:
36
- return DeviceFlow.Output
37
- default:
38
- throw new SonarRequestException({ message: `Unknown device data flow: ${dataFlow}` })
39
- }
40
- }
@@ -1,19 +0,0 @@
1
- import type { DeviceChannel } from '@/enums'
2
- import { changeAudioDevice } from '@/sonar/requests/audio-devices/change-audio-device'
3
- import type { ChangedDevice } from '@/types/changed-device'
4
-
5
- export async function setAudioDevice(
6
- sonarEndpoint: string,
7
- deviceChannel: DeviceChannel,
8
- deviceId: string
9
- ): Promise<ChangedDevice[]> {
10
- const data = await changeAudioDevice(sonarEndpoint, deviceChannel, deviceId)
11
-
12
- const result: ChangedDevice[] = data.map((x) => ({
13
- deviceId: x.deviceId,
14
- deviceChannel: x.id,
15
- isRunning: x.isRunning
16
- }))
17
-
18
- return result
19
- }
@@ -1,73 +0,0 @@
1
- import { promises as fsAsync } from 'node:fs'
2
- import { platform as getPlatform } from 'node:os'
3
- import { join as joinPath } from 'node:path'
4
- import { InitializeErrorReason, SonarInitializationException } from '@/exceptions'
5
-
6
- const WINDOWS_PATHS = ['SteelSeries', 'SteelSeries Engine 3', 'coreProps.json']
7
-
8
- type CoreProps = {
9
- ggEncryptedAddress: string
10
- }
11
-
12
- /**
13
- * Retrieves the SteelSeries GG application's encrypted address from the coreProps.json file.
14
- *
15
- * @returns A promise that resolves to the GG application's secure address string (e.g., "https://..."),
16
- * as found in the ggEncryptedAddress property of coreProps.json.
17
- *
18
- * @throws {SonarInitializationException} If the GG server cannot be determined.
19
- *
20
- * @remarks
21
- * - Only supports Windows OS; throws on other platforms.
22
- * - Locates coreProps.json in the ProgramData directory under SteelSeries folders.
23
- * - Reads and parses the file, returning the encrypted address as a secure URL.
24
- */
25
- export async function getAppEndpoint(): Promise<string> {
26
- const appDataPath = getPath()
27
- const fileContents = await getContents(appDataPath)
28
- const data = parseContents(fileContents)
29
-
30
- if (data.ggEncryptedAddress) {
31
- return `https://${data.ggEncryptedAddress}`
32
- }
33
-
34
- throw new SonarInitializationException({
35
- reason: InitializeErrorReason.BadConfig
36
- })
37
- }
38
-
39
- function getPath(): string {
40
- const os = getPlatform()
41
- switch (os) {
42
- case 'win32': {
43
- const programData = process.env.ProgramData ?? 'C:\\ProgramData'
44
- return joinPath(programData, ...WINDOWS_PATHS)
45
- }
46
- default:
47
- throw new SonarInitializationException({
48
- reason: InitializeErrorReason.OSUnsupported
49
- })
50
- }
51
- }
52
-
53
- async function getContents(path: string): Promise<string> {
54
- try {
55
- return await fsAsync.readFile(path, 'utf8')
56
- } catch (error) {
57
- throw new SonarInitializationException({
58
- reason: InitializeErrorReason.BadConfig,
59
- innerException: error as Error
60
- })
61
- }
62
- }
63
-
64
- function parseContents(contents: string): CoreProps {
65
- try {
66
- return JSON.parse(contents) as CoreProps
67
- } catch (error) {
68
- throw new SonarInitializationException({
69
- reason: InitializeErrorReason.BadConfig,
70
- innerException: error as Error
71
- })
72
- }
73
- }
@@ -1,28 +0,0 @@
1
- import { getSonarEndpoint } from '@/functions/endpoint/get-sonar-endpoint'
2
-
3
- const cache = {
4
- appAddress: null as string | null,
5
- sonarAddress: null as string | null,
6
- timestamp: 0
7
- }
8
-
9
- export async function getSonarEndpointCached(appAddress: string, seconds: number = 60): Promise<string> {
10
- const now = Date.now()
11
-
12
- if (cache.appAddress === appAddress && cache.sonarAddress && now - cache.timestamp < seconds * 1000) {
13
- return cache.sonarAddress
14
- }
15
-
16
- try {
17
- const sonarAddress = await getSonarEndpoint(appAddress)
18
- cache.appAddress = appAddress
19
- cache.sonarAddress = sonarAddress
20
- cache.timestamp = now
21
- return sonarAddress
22
- } catch (error) {
23
- cache.appAddress = null
24
- cache.sonarAddress = null
25
- cache.timestamp = 0
26
- throw error
27
- }
28
- }
@@ -1,88 +0,0 @@
1
- import { InitializeErrorReason, SonarInitializationException } from '@/exceptions'
2
-
3
- type SubAppsResponse = {
4
- subApps: {
5
- sonar?: {
6
- isEnabled: boolean
7
- isReady: boolean
8
- isRunning: boolean
9
- metadata: {
10
- webServerAddress: string
11
- }
12
- }
13
- }
14
- }
15
-
16
- /**
17
- * Retrieves the Sonar web server address from an application server's /subApps endpoint.
18
- *
19
- * @param appEndpoint - The base URL of the application server (e.g. "https://localhost:1234").
20
- * @returns A promise that resolves to the Sonar web server address.
21
- *
22
- * @throws {SonarInitializationException} If the sonar server cannot be determined.
23
- *
24
- * @remarks
25
- * - Performs a GET request to `${appAddress}/subApps`.
26
- * - The response body is expected to conform to the SubAppsResponse shape and contain `subApps.sonar`.
27
- * - Uses a fetch TLS option that disables certificate verification (rejectUnauthorized: false).
28
- */
29
- export async function getSonarEndpoint(appEndpoint: string): Promise<string> {
30
- let response: Response
31
-
32
- try {
33
- response = await fetch(`${appEndpoint}/subApps`, {
34
- tls: {
35
- rejectUnauthorized: false
36
- }
37
- })
38
- } catch (error) {
39
- throw new SonarInitializationException({
40
- reason: InitializeErrorReason.NotResponding,
41
- innerException: error as Error
42
- })
43
- }
44
-
45
- if (!response.ok) {
46
- throw new SonarInitializationException({
47
- reason: InitializeErrorReason.NotResponding
48
- })
49
- }
50
-
51
- const result: SubAppsResponse = (await response.json()) as SubAppsResponse
52
-
53
- const sonar = result?.subApps?.sonar
54
-
55
- if (!sonar) {
56
- throw new SonarInitializationException({
57
- reason: InitializeErrorReason.NotAvailable
58
- })
59
- }
60
-
61
- if (!sonar.isEnabled) {
62
- throw new SonarInitializationException({
63
- reason: InitializeErrorReason.NotEnabled
64
- })
65
- }
66
-
67
- if (!sonar.isRunning) {
68
- throw new SonarInitializationException({
69
- reason: InitializeErrorReason.NotRunning
70
- })
71
- }
72
-
73
- if (!sonar.isReady) {
74
- throw new SonarInitializationException({
75
- reason: InitializeErrorReason.NotReady
76
- })
77
- }
78
-
79
- const sonarAddress = sonar.metadata?.webServerAddress
80
-
81
- if (!sonarAddress) {
82
- throw new SonarInitializationException({
83
- reason: InitializeErrorReason.NotAvailable
84
- })
85
- }
86
-
87
- return sonarAddress
88
- }