@phystack/hub-device 4.5.12-dev → 4.5.14-dev

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.
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/sysinfo/node.ts"],"names":[],"mappings":"AA4eA,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,SAAS,CA0B7D;AAOD,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,UAAU,CAcpD;AAoaD,wBAAsB,oBAAoB,iBAmEzC;AAaD,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/sysinfo/node.ts"],"names":[],"mappings":"AAgZA,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAwB7D;AAUD,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,UAAU,CAapD;AAmaD,wBAAsB,oBAAoB,iBA+DzC;AAaD,eAAe,oBAAoB,CAAC"}
@@ -18,9 +18,14 @@ const PULSEAUDIO_COMMANDS = {
18
18
  LIST_SINKS: 'pactl list sinks',
19
19
  LIST_SOURCES: 'pactl list sources',
20
20
  LIST_CARDS: 'pactl list cards',
21
+ LIST_CARDS_SHORT: 'pactl list cards short',
21
22
  LOAD_ALSA_SINK: (hwDevice, sinkName, description) => `pactl load-module module-alsa-sink device=${hwDevice} sink_name=${sinkName} sink_properties="device.description=${description}"`,
22
23
  LOAD_ALSA_SOURCE: (hwDevice, sourceName, description) => `pactl load-module module-alsa-source device=${hwDevice} source_name=${sourceName} source_properties="device.description=${description}"`,
23
24
  };
25
+ const ALSA_COMMANDS = {
26
+ APLAY_LIST: 'aplay -l 2>/dev/null',
27
+ ARECORD_LIST: 'arecord -l 2>/dev/null',
28
+ };
24
29
  const PULSEAUDIO_TIMEOUTS = {
25
30
  INFO_CHECK: 2000,
26
31
  KILL: 2000,
@@ -154,7 +159,7 @@ function parseAudioDevice(block, isInput) {
154
159
  else {
155
160
  try {
156
161
  const env = getPulseAudioEnv();
157
- const cardsOutput = (0, child_process_1.execSync)('pactl list cards', {
162
+ const cardsOutput = (0, child_process_1.execSync)(PULSEAUDIO_COMMANDS.LIST_CARDS, {
158
163
  encoding: 'utf-8',
159
164
  timeout: 2000,
160
165
  stdio: 'pipe',
@@ -193,7 +198,7 @@ function parseAudioDevice(block, isInput) {
193
198
  const cardNumber = altMatch[3];
194
199
  try {
195
200
  const env = getPulseAudioEnv();
196
- const cardsOutput = (0, child_process_1.execSync)('pactl list cards short', {
201
+ const cardsOutput = (0, child_process_1.execSync)(PULSEAUDIO_COMMANDS.LIST_CARDS_SHORT, {
197
202
  encoding: 'utf-8',
198
203
  timeout: 2000,
199
204
  stdio: 'pipe',
@@ -215,7 +220,7 @@ function parseAudioDevice(block, isInput) {
215
220
  if (cardNumber !== undefined) {
216
221
  try {
217
222
  const env = getPulseAudioEnv();
218
- const cardsOutput = (0, child_process_1.execSync)('pactl list cards short', {
223
+ const cardsOutput = (0, child_process_1.execSync)(PULSEAUDIO_COMMANDS.LIST_CARDS_SHORT, {
219
224
  encoding: 'utf-8',
220
225
  timeout: 2000,
221
226
  stdio: 'pipe',
@@ -237,58 +242,6 @@ function parseAudioDevice(block, isInput) {
237
242
  }
238
243
  }
239
244
  }
240
- if (device.identifier && device.cardName) {
241
- const cardName = device.cardName;
242
- const hasProfile = device.identifier.match(/\.(hdmi-|analog-|stereo|mono|surround|a2dp|sco)/);
243
- if (!hasProfile) {
244
- try {
245
- const env = getPulseAudioEnv();
246
- const cardInfo = (0, child_process_1.execSync)(`pactl list cards | grep -A 100 "Name: ${cardName}"`, {
247
- encoding: 'utf-8',
248
- timeout: 2000,
249
- stdio: 'pipe',
250
- env,
251
- });
252
- const cardIdMatch = cardName.match(/^[^_]+_card\.(.+)$/);
253
- if (cardIdMatch) {
254
- const cardId = cardIdMatch[1];
255
- const isInputDevice = isInput || device.identifier.includes('input') || device.identifier.includes('source');
256
- const profileType = isInputDevice ? 'input' : 'output';
257
- const activeProfileMatch = cardInfo.match(new RegExp(`^\\s+(${profileType}:[^:]+):[^\\n]*\\*[^\\n]*$`, 'm'));
258
- if (activeProfileMatch) {
259
- const profile = activeProfileMatch[1];
260
- const profileSuffix = profile.replace(new RegExp(`^${profileType}:`), '');
261
- const prefixMatch = device.identifier.match(/^([^_]+)_(output|input|sink|source)/);
262
- if (prefixMatch) {
263
- const prefix = prefixMatch[1];
264
- const type = prefixMatch[2];
265
- device.identifier = `${prefix}_${type}.${cardId}.${profileSuffix}`;
266
- }
267
- }
268
- else {
269
- const anyProfileMatch = cardInfo.match(new RegExp(`^\\s+(${profileType}:[^:]+):`, 'm'));
270
- if (anyProfileMatch) {
271
- const profile = anyProfileMatch[1];
272
- const profileSuffix = profile.replace(new RegExp(`^${profileType}:`), '');
273
- const prefixMatch = device.identifier.match(/^([^_]+)_(output|input|sink|source)/);
274
- if (prefixMatch) {
275
- const prefix = prefixMatch[1];
276
- const type = prefixMatch[2];
277
- const cardIdMatch = cardName.match(/^[^_]+_card\.(.+)$/);
278
- if (cardIdMatch) {
279
- const cardId = cardIdMatch[1];
280
- device.identifier = `${prefix}_${type}.${cardId}.${profileSuffix}`;
281
- }
282
- }
283
- }
284
- }
285
- }
286
- }
287
- catch (error) {
288
- console.log(`[Audio] Failed to convert identifier to flat format: ${error}`);
289
- }
290
- }
291
- }
292
245
  device.label = createDeviceLabel(device, ports, isInput, device.formFactor, device.bus, false, deviceAvailable, device.activePort);
293
246
  const cleanDevice = {
294
247
  identifier: device.identifier,
@@ -353,10 +306,7 @@ function createDeviceLabel(device, ports, isInput, formFactor, bus, isDefault, a
353
306
  if (available !== undefined) {
354
307
  statusParts.push(available ? 'Available' : 'Unavailable');
355
308
  }
356
- if (statusParts.length > 0) {
357
- return `${baseLabel} (${statusParts.join(', ')})`;
358
- }
359
- return baseLabel;
309
+ return statusParts.length > 0 ? `${baseLabel} (${statusParts.join(', ')})` : baseLabel;
360
310
  }
361
311
  function discoverPulseAudioSocket() {
362
312
  try {
@@ -540,7 +490,7 @@ function loadAlsaDevicesIntoPulseAudio() {
540
490
  let outputDevices = [];
541
491
  let inputDevices = [];
542
492
  try {
543
- const aplayOutput = (0, child_process_1.execSync)('aplay -l 2>/dev/null', {
493
+ const aplayOutput = (0, child_process_1.execSync)(ALSA_COMMANDS.APLAY_LIST, {
544
494
  encoding: 'utf-8',
545
495
  timeout: 3000,
546
496
  });
@@ -551,7 +501,7 @@ function loadAlsaDevicesIntoPulseAudio() {
551
501
  console.log(' No ALSA output devices found or aplay failed');
552
502
  }
553
503
  try {
554
- const arecordOutput = (0, child_process_1.execSync)('arecord -l 2>/dev/null', {
504
+ const arecordOutput = (0, child_process_1.execSync)(ALSA_COMMANDS.ARECORD_LIST, {
555
505
  encoding: 'utf-8',
556
506
  timeout: 3000,
557
507
  });
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/sysinfo/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/sysinfo/node.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phystack/hub-device",
3
- "version": "4.5.12-dev",
3
+ "version": "4.5.14-dev",
4
4
  "main": "dist/index.js",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -12,8 +12,8 @@
12
12
  "format:check": "prettier --check \"src/**/*.{ts,js,json,md}\""
13
13
  },
14
14
  "dependencies": {
15
- "@phystack/axios-proxy": "4.5.12-dev",
16
- "@phystack/socket.io-proxy": "4.5.12-dev",
15
+ "@phystack/axios-proxy": "4.5.14-dev",
16
+ "@phystack/socket.io-proxy": "4.5.14-dev",
17
17
  "async-mutex": "^0.5.0",
18
18
  "axios-retry": "^4.4.1",
19
19
  "bufferutil": "^4.0.8",
@@ -35,5 +35,5 @@
35
35
  },
36
36
  "test": "react-scripts test",
37
37
  "test:coverage": "npm run test -- --coverage --watchAll=false",
38
- "gitHead": "e46c2e36f1cd7e020e46c353f2f2c5b0290f5cf5"
38
+ "gitHead": "f96a9182afec6ff6f12db80313dcb663b44feee0"
39
39
  }
@@ -2,9 +2,9 @@ import si from 'systeminformation';
2
2
  import { execSync } from 'child_process';
3
3
  import { AudioDevice, AudioDevices, AudioPort } from '../types/twin.types';
4
4
 
5
- // ============================================================================
6
- // PULSEAUDIO COMMANDS
7
- // ============================================================================
5
+ /**
6
+ * PulseAudio commands
7
+ */
8
8
  const PULSEAUDIO_COMMANDS = {
9
9
  INFO: 'pactl info',
10
10
  KILL: 'pulseaudio -k 2>/dev/null || true',
@@ -15,12 +15,18 @@ const PULSEAUDIO_COMMANDS = {
15
15
  LIST_SINKS: 'pactl list sinks',
16
16
  LIST_SOURCES: 'pactl list sources',
17
17
  LIST_CARDS: 'pactl list cards',
18
+ LIST_CARDS_SHORT: 'pactl list cards short',
18
19
  LOAD_ALSA_SINK: (hwDevice: string, sinkName: string, description: string) =>
19
20
  `pactl load-module module-alsa-sink device=${hwDevice} sink_name=${sinkName} sink_properties="device.description=${description}"`,
20
21
  LOAD_ALSA_SOURCE: (hwDevice: string, sourceName: string, description: string) =>
21
22
  `pactl load-module module-alsa-source device=${hwDevice} source_name=${sourceName} source_properties="device.description=${description}"`,
22
23
  } as const;
23
24
 
25
+ const ALSA_COMMANDS = {
26
+ APLAY_LIST: 'aplay -l 2>/dev/null',
27
+ ARECORD_LIST: 'arecord -l 2>/dev/null',
28
+ } as const;
29
+
24
30
  const PULSEAUDIO_TIMEOUTS = {
25
31
  INFO_CHECK: 2000,
26
32
  KILL: 2000,
@@ -30,11 +36,15 @@ const PULSEAUDIO_TIMEOUTS = {
30
36
  LIST_DEVICES: 5000,
31
37
  } as const;
32
38
 
33
- // Store discovered PulseAudio server socket path
39
+ /** Cached PulseAudio server socket path discovered at runtime */
34
40
  let pulseAudioServerPath: string | undefined;
35
41
 
36
42
  /**
37
- * Parse PulseAudio device block and extract metadata
43
+ * Parses a PulseAudio device block and extracts device metadata
44
+ *
45
+ * @param block - Raw PulseAudio device block text from `pactl list sinks` or `pactl list sources`
46
+ * @param isInput - Whether this is an input device (source) or output device (sink)
47
+ * @returns Parsed AudioDevice object or null if device should be skipped
38
48
  */
39
49
  function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
40
50
  const lines = block.split('\n');
@@ -51,13 +61,11 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
51
61
  } else if (trimmed.startsWith('Description:')) {
52
62
  device.displayName = trimmed.split('Description:')[1].trim();
53
63
  } else if (trimmed.includes('alsa.card =')) {
54
- // Extract card number for later card name construction
55
64
  const cardMatch = trimmed.match(/alsa\.card\s*=\s*"(\d+)"/);
56
65
  if (cardMatch) {
57
66
  (device as any).cardNumber = cardMatch[1];
58
67
  }
59
68
  } else if (trimmed.includes('alsa.card_name =')) {
60
- // Extract card name
61
69
  const cardNameMatch = trimmed.match(/alsa\.card_name\s*=\s*"([^"]+)"/);
62
70
  if (cardNameMatch) {
63
71
  (device as any).cardNameRaw = cardNameMatch[1];
@@ -74,13 +82,12 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
74
82
  inPortsSection = true;
75
83
  console.log(`[Audio] Entering ports section for device`);
76
84
  } else if (inPortsSection) {
77
- // Check if we've left the ports section (next section starts with capital letter and no indentation)
85
+ // Detect section boundary: next section starts with capital letter and no indentation
78
86
  if (trimmed.match(/^[A-Z][a-z]+:/) && !line.match(/^\s/)) {
79
87
  inPortsSection = false;
80
88
  console.log(`[Audio] Exiting ports section, found ${ports.length} ports`);
81
89
  } else if (trimmed.length > 0 && line.match(/^\s+\S/)) {
82
- // Port line has indentation (spaces or tabs) followed by content
83
- // Parse port line: "analog-output-headphones: Headphones (type: Headphones, priority: 9900, availability unknown)"
90
+ // Parse port line format: "analog-output-headphones: Headphones (type: Headphones, priority: 9900, availability unknown)"
84
91
  const portMatch = trimmed.match(/^([^:]+):\s*(.+?)(?:\s*\((.+)\))?$/);
85
92
  if (portMatch) {
86
93
  const portName = portMatch[1].trim();
@@ -92,11 +99,10 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
92
99
  description: portDescription,
93
100
  };
94
101
 
95
- // Parse additional details if present
102
+ // Parse optional port metadata: type, priority, and availability
96
103
  if (portDetails) {
97
104
  const typeMatch = portDetails.match(/type:\s*([^,]+)/);
98
105
  const priorityMatch = portDetails.match(/priority:\s*(\d+)/);
99
- // Parse availability: "available", "available: yes", "not available", "availability unknown"
100
106
  const availableMatch = portDetails.match(
101
107
  /available(?::\s*(yes|no))?|not available|availability unknown/i
102
108
  );
@@ -104,7 +110,7 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
104
110
  if (typeMatch) port.type = typeMatch[1].trim();
105
111
  if (priorityMatch) port.priority = parseInt(priorityMatch[1], 10);
106
112
 
107
- // Determine availability: true if "available" or "available: yes", false otherwise
113
+ // Parse availability: true for "available" or "available: yes", false otherwise
108
114
  if (availableMatch) {
109
115
  const availStr = availableMatch[0].toLowerCase();
110
116
  if (availStr.includes('not available') || availStr.includes('availability unknown')) {
@@ -112,7 +118,7 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
112
118
  } else if (availStr.includes('available: no')) {
113
119
  port.available = false;
114
120
  } else {
115
- port.available = true; // "available" or "available: yes"
121
+ port.available = true;
116
122
  }
117
123
  }
118
124
  }
@@ -122,7 +128,6 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
122
128
  }
123
129
  }
124
130
  } else if (trimmed.includes('device.product.name =')) {
125
- // Extract product name (e.g., "LG ULTRAFINE" for HDMI displays)
126
131
  const match = trimmed.match(/"([^"]+)"/);
127
132
  if (match) {
128
133
  (device as any).productName = match[1];
@@ -136,14 +141,13 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
136
141
  }
137
142
  }
138
143
 
139
- // Skip monitor sources (virtual recording outputs)
144
+ // Filter out monitor sources (virtual recording outputs)
140
145
  if (isInput && device.identifier?.includes('.monitor')) {
141
146
  return null;
142
147
  }
143
148
 
144
149
  if (!device.identifier) return null;
145
150
 
146
- // Add ports if any were found
147
151
  if (ports.length > 0) {
148
152
  device.availablePorts = ports;
149
153
  console.log(
@@ -153,13 +157,13 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
153
157
  console.log(`[Audio] Device ${device.identifier} has NO ports detected`);
154
158
  }
155
159
 
156
- // Determine overall device availability
157
- // Priority 1: Check if any ports are available
158
- // Priority 2: If no ports, check sink/source state (RUNNING = available) or card port availability
160
+ // Determine device availability using priority-based detection:
161
+ // 1. Check if any ports are available
162
+ // 2. If no ports, check sink/source state (RUNNING = available) or card port availability
159
163
  const availablePorts = ports.filter(p => p.available === true);
160
164
  let deviceAvailable = availablePorts.length > 0;
161
165
 
162
- // If no ports detected, try to determine availability from sink/source state or card ports
166
+ // Fallback: determine availability from sink/source state or card ports when no ports detected
163
167
  if (ports.length === 0 && device.identifier) {
164
168
  const stateMatch = block.match(/State:\s*(\w+)/i);
165
169
  if (stateMatch) {
@@ -170,18 +174,17 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
170
174
  // Check card port availability using pactl list cards
171
175
  try {
172
176
  const env = getPulseAudioEnv();
173
- const cardsOutput = execSync('pactl list cards', {
177
+ const cardsOutput = execSync(PULSEAUDIO_COMMANDS.LIST_CARDS, {
174
178
  encoding: 'utf-8',
175
179
  timeout: 2000,
176
180
  stdio: 'pipe',
177
181
  env,
178
182
  });
179
183
 
180
- // Extract device number from identifier (e.g., "alsa_output_0_9" -> device 9)
181
184
  const deviceMatch = device.identifier.match(/[^_]+_(\d+)_(\d+)$/);
182
185
  if (deviceMatch) {
183
186
  const deviceNum = deviceMatch[2];
184
- // Check if port for this device is available (e.g., "hdmi-output-2" for device 9)
187
+ // Map device number to HDMI port index (e.g., device 9 -> hdmi-output-2)
185
188
  const portMatch = cardsOutput.match(
186
189
  new RegExp(
187
190
  `hdmi-output-${deviceNum === '9' ? '2' : deviceNum === '8' ? '1' : deviceNum === '7' ? '1' : '0'}[^\\n]*available`,
@@ -193,48 +196,39 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
193
196
  }
194
197
  }
195
198
  } catch (error) {
196
- // Card check failed, keep deviceAvailable as false
199
+ // Card availability check failed, device remains unavailable
197
200
  }
198
201
  }
199
202
  }
200
203
  }
201
204
 
202
- // Extract card information from device identifier
203
- // Format 1: "alsa_output.pci-0000_00_1f.3.analog-stereo" (standard PulseAudio ALSA format)
204
- // Format 2: "bluez_sink.XX_XX_XX_XX_XX_XX" (Bluetooth - no profile suffix)
205
- // Format 3: "alsa_output.usb-046d_08d9-01.analog-stereo" (USB audio)
206
- // Format 4: "alsa_output_0_3" (manually created sinks)
207
- //
205
+ // Extract card name from device identifier using multiple format patterns:
206
+ // Format 1: alsa_output.pci-0000_00_1f.3.analog-stereo (standard PulseAudio ALSA format)
207
+ // Format 2: bluez_sink.XX_XX_XX_XX_XX_XX (Bluetooth - no profile suffix)
208
+ // Format 3: alsa_output.usb-046d_08d9-01.analog-stereo (USB audio)
209
+ // Format 4: alsa_output_0_3 (manually created sinks)
208
210
  // Generic pattern: {prefix}_{type}.{card_id}[.{profile}] or {prefix}_{type}_{card}_{device}
209
- // Where prefix can be: alsa, bluez, or other PulseAudio modules
210
- // Note: Some devices (like Bluetooth) may not have a profile suffix
211
211
 
212
- // Try standard format with profile: {prefix}_{type}.{card_id}.{profile}
213
212
  let cardMatch = device.identifier?.match(
214
213
  /^([^_]+)_(output|input|sink|source)\.([^.]+(?:\.[^.]+)*)\.(.+)$/
215
214
  );
216
215
  if (cardMatch) {
217
- const prefix = cardMatch[1]; // e.g., "alsa", "bluez"
218
- const cardId = cardMatch[3]; // e.g., "pci-0000_00_1f.3", "usb-046d_08d9-01", "XX_XX_XX_XX_XX_XX"
219
- // Card name is extracted but not stored (used internally for label generation)
216
+ const prefix = cardMatch[1];
217
+ const cardId = cardMatch[3];
220
218
  (device as any).cardName = `${prefix}_card.${cardId}`;
221
219
  } else {
222
- // Try format without profile: {prefix}_{type}.{card_id} (e.g., Bluetooth)
223
220
  cardMatch = device.identifier?.match(/^([^_]+)_(output|input|sink|source)\.(.+)$/);
224
221
  if (cardMatch) {
225
- const prefix = cardMatch[1]; // e.g., "bluez"
226
- const cardId = cardMatch[3]; // e.g., "XX_XX_XX_XX_XX_XX"
227
- // Card name is extracted but not stored (used internally for label generation)
222
+ const prefix = cardMatch[1];
223
+ const cardId = cardMatch[3];
228
224
  (device as any).cardName = `${prefix}_card.${cardId}`;
229
225
  } else {
230
- // Fallback: Try to extract card number from identifier format "alsa_output_0_3"
231
226
  const altMatch = device.identifier?.match(/^([^_]+)_(output|input|sink|source)_(\d+)_(\d+)$/);
232
227
  if (altMatch) {
233
228
  const cardNumber = altMatch[3];
234
- // Try to find card name from pactl list cards (supports any card type)
235
229
  try {
236
230
  const env = getPulseAudioEnv();
237
- const cardsOutput = execSync('pactl list cards short', {
231
+ const cardsOutput = execSync(PULSEAUDIO_COMMANDS.LIST_CARDS_SHORT, {
238
232
  encoding: 'utf-8',
239
233
  timeout: 2000,
240
234
  stdio: 'pipe',
@@ -242,24 +236,20 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
242
236
  });
243
237
  const cardLine = cardsOutput.split('\n').find(line => line.includes(`card${cardNumber}`));
244
238
  if (cardLine) {
245
- // Match any card name format: {prefix}_card.{identifier}
246
- // e.g., "alsa_card.pci-0000_00_1f.3", "bluez_card.XX_XX_XX_XX_XX_XX"
247
239
  const cardNameMatch = cardLine.match(/([^_\s]+_card\.[^\s]+)/);
248
240
  if (cardNameMatch) {
249
- // Card name is extracted but not stored (used internally for label generation)
250
241
  (device as any).cardName = cardNameMatch[1];
251
242
  }
252
243
  }
253
244
  } catch (error) {
254
- // Card lookup failed, continue without it
245
+ // Card lookup failed, continue without card name
255
246
  }
256
247
  } else {
257
- // Final fallback: use card number from device properties
258
248
  const cardNumber = (device as any).cardNumber;
259
249
  if (cardNumber !== undefined) {
260
250
  try {
261
251
  const env = getPulseAudioEnv();
262
- const cardsOutput = execSync('pactl list cards short', {
252
+ const cardsOutput = execSync(PULSEAUDIO_COMMANDS.LIST_CARDS_SHORT, {
263
253
  encoding: 'utf-8',
264
254
  timeout: 2000,
265
255
  stdio: 'pipe',
@@ -269,112 +259,34 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
269
259
  .split('\n')
270
260
  .find(line => line.includes(`card${cardNumber}`));
271
261
  if (cardLine) {
272
- // Match any card name format: {prefix}_card.{identifier}
273
262
  const cardNameMatch = cardLine.match(/([^_\s]+_card\.[^\s]+)/);
274
263
  if (cardNameMatch) {
275
- // Card name is extracted but not stored (used internally for label generation)
276
264
  (device as any).cardName = cardNameMatch[1];
277
265
  }
278
266
  }
279
267
  } catch (error) {
280
- // Card lookup failed, continue without it
281
- }
282
- }
283
- }
284
- }
285
- }
286
-
287
- // Convert simple identifier to flat identifier with profile (if needed)
288
- // If identifier already has profile (e.g., alsa_output.pci-0000_00_1f.3.hdmi-stereo), use as-is
289
- // If identifier is simple (e.g., alsa_output_0_3), convert to flat format with active profile
290
- if (device.identifier && (device as any).cardName) {
291
- const cardName = (device as any).cardName;
292
-
293
- // Check if identifier already has profile suffix
294
- const hasProfile = device.identifier.match(/\.(hdmi-|analog-|stereo|mono|surround|a2dp|sco)/);
295
-
296
- if (!hasProfile) {
297
- // Simple identifier format - need to get active profile and convert to flat format
298
- try {
299
- const env = getPulseAudioEnv();
300
- const cardInfo = execSync(`pactl list cards | grep -A 100 "Name: ${cardName}"`, {
301
- encoding: 'utf-8',
302
- timeout: 2000,
303
- stdio: 'pipe',
304
- env,
305
- });
306
-
307
- // Extract card ID from card name (e.g., "pci-0000_00_1f.3" from "alsa_card.pci-0000_00_1f.3")
308
- const cardIdMatch = cardName.match(/^[^_]+_card\.(.+)$/);
309
- if (cardIdMatch) {
310
- const cardId = cardIdMatch[1];
311
-
312
- // Determine profile type (output or input) from identifier
313
- const isInputDevice =
314
- isInput || device.identifier.includes('input') || device.identifier.includes('source');
315
- const profileType = isInputDevice ? 'input' : 'output';
316
-
317
- // Find active profile (marked with *)
318
- // Format: " output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes) *"
319
- const activeProfileMatch = cardInfo.match(
320
- new RegExp(`^\\s+(${profileType}:[^:]+):[^\\n]*\\*[^\\n]*$`, 'm')
321
- );
322
- if (activeProfileMatch) {
323
- const profile = activeProfileMatch[1]; // e.g., "output:hdmi-stereo" or "input:analog-stereo"
324
- const profileSuffix = profile.replace(new RegExp(`^${profileType}:`), ''); // e.g., "hdmi-stereo"
325
-
326
- // Extract prefix and type from original identifier
327
- const prefixMatch = device.identifier.match(/^([^_]+)_(output|input|sink|source)/);
328
- if (prefixMatch) {
329
- const prefix = prefixMatch[1]; // e.g., "alsa"
330
- const type = prefixMatch[2]; // e.g., "output" or "input"
331
-
332
- // Construct flat identifier: {prefix}_{type}.{cardId}.{profileSuffix}
333
- device.identifier = `${prefix}_${type}.${cardId}.${profileSuffix}`;
334
- }
335
- } else {
336
- // No active profile found, try to find any profile of the correct type
337
- const anyProfileMatch = cardInfo.match(new RegExp(`^\\s+(${profileType}:[^:]+):`, 'm'));
338
- if (anyProfileMatch) {
339
- const profile = anyProfileMatch[1];
340
- const profileSuffix = profile.replace(new RegExp(`^${profileType}:`), '');
341
-
342
- const prefixMatch = device.identifier.match(/^([^_]+)_(output|input|sink|source)/);
343
- if (prefixMatch) {
344
- const prefix = prefixMatch[1];
345
- const type = prefixMatch[2];
346
- const cardIdMatch = cardName.match(/^[^_]+_card\.(.+)$/);
347
- if (cardIdMatch) {
348
- const cardId = cardIdMatch[1];
349
- device.identifier = `${prefix}_${type}.${cardId}.${profileSuffix}`;
350
- }
351
- }
352
- }
268
+ // Card lookup failed, continue without card name
353
269
  }
354
270
  }
355
- } catch (error) {
356
- // Profile lookup failed, keep original identifier
357
- console.log(`[Audio] Failed to convert identifier to flat format: ${error}`);
358
271
  }
359
272
  }
360
273
  }
361
274
 
362
- // Create human-readable label with device info (formFactor, bus, available, activePort)
363
- // Note: isDefault will be set later when we know the default device
275
+ // Generate human-readable label incorporating device metadata
276
+ // Note: isDefault status will be set later when default devices are known
364
277
  device.label = createDeviceLabel(
365
278
  device,
366
279
  ports,
367
280
  isInput,
368
281
  (device as any).formFactor,
369
282
  (device as any).bus,
370
- false, // isDefault will be updated later
283
+ false,
371
284
  deviceAvailable,
372
285
  (device as any).activePort
373
286
  );
374
287
 
375
- // Clean up temporary fields used only for label generation - don't include in reported properties
376
- // Remove: cardNameRaw, cardNumber, productName, formFactor, bus, activePort, cardName, displayName
377
- // All info is consolidated in the label field
288
+ // Remove temporary fields used only for label generation
289
+ // All metadata is consolidated in the label field
378
290
  const cleanDevice: Partial<AudioDevice> = {
379
291
  identifier: device.identifier,
380
292
  volume: device.volume,
@@ -387,8 +299,18 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
387
299
  }
388
300
 
389
301
  /**
390
- * Create a human-readable label for an audio device with device info
391
- * Incorporates: formFactor, bus, isDefault, available, activePort information
302
+ * Generates a human-readable label for an audio device
303
+ * Incorporates device metadata: formFactor, bus, isDefault, available, and activePort
304
+ *
305
+ * @param device - Partial AudioDevice object containing device properties
306
+ * @param ports - Array of available audio ports for this device
307
+ * @param isInput - Whether this is an input device (source) or output device (sink)
308
+ * @param formFactor - Device form factor (e.g., "internal", "external")
309
+ * @param bus - Device bus type (e.g., "pci", "usb")
310
+ * @param isDefault - Whether this device is the default device
311
+ * @param available - Whether the device is currently available
312
+ * @param activePort - The currently active port identifier
313
+ * @returns Human-readable label string
392
314
  */
393
315
  function createDeviceLabel(
394
316
  device: Partial<AudioDevice>,
@@ -403,15 +325,12 @@ function createDeviceLabel(
403
325
  const productName = (device as any).productName;
404
326
  let baseLabel = '';
405
327
 
406
- // Find the active port in the ports list
407
328
  const activePortInfo = activePort ? ports.find(p => p.name === activePort) : undefined;
408
329
 
409
- // Priority 1: Use product name if available (e.g., "LG ULTRAFINE")
330
+ // Label generation priority: product name > active port > display name > identifier
410
331
  if (productName) {
411
332
  baseLabel = `${productName} (${isInput ? 'Microphone' : 'Speaker'})`;
412
- }
413
- // Priority 2: Use active port description if available
414
- else if (activePortInfo && activePortInfo.description) {
333
+ } else if (activePortInfo && activePortInfo.description) {
415
334
  const portDesc = activePortInfo.description;
416
335
 
417
336
  // Map common port descriptions to user-friendly names
@@ -432,20 +351,15 @@ function createDeviceLabel(
432
351
  } else if (portDesc.toLowerCase().includes('speaker')) {
433
352
  baseLabel = 'Speakers';
434
353
  } else {
435
- // Use port description with device type
436
354
  baseLabel = `${portDesc} (${isInput ? 'Input' : 'Output'})`;
437
355
  }
438
- }
439
- // Priority 3: Use display name with device type
440
- else if (device.displayName) {
356
+ } else if (device.displayName) {
441
357
  baseLabel = `${device.displayName} (${isInput ? 'Input' : 'Output'})`;
442
- }
443
- // Fallback: Use identifier
444
- else {
358
+ } else {
445
359
  baseLabel = device.identifier || 'Unknown Audio Device';
446
360
  }
447
361
 
448
- // Concatenate displayName if available and not already used
362
+ // Append display name if not already included
449
363
  if (
450
364
  device.displayName &&
451
365
  baseLabel !== device.displayName &&
@@ -454,45 +368,38 @@ function createDeviceLabel(
454
368
  baseLabel = `${device.displayName} - ${baseLabel}`;
455
369
  }
456
370
 
457
- // Concatenate formFactor if available and not internal
371
+ // Append form factor if external device
458
372
  if (formFactor && formFactor !== 'internal' && !baseLabel.includes(formFactor)) {
459
373
  baseLabel = `${baseLabel} (${formFactor.charAt(0).toUpperCase() + formFactor.slice(1)})`;
460
374
  }
461
375
 
462
- // Concatenate bus if available and not PCI
376
+ // Append bus type if non-PCI
463
377
  if (bus && bus.toLowerCase() !== 'pci' && !baseLabel.includes(bus.toUpperCase())) {
464
378
  baseLabel = `${baseLabel} (${bus.toUpperCase()})`;
465
379
  }
466
380
 
467
- // Add status indicators
381
+ // Append status indicators
468
382
  const statusParts: string[] = [];
469
-
470
- // Add default status
471
383
  if (isDefault) {
472
384
  statusParts.push('Default');
473
385
  }
474
-
475
- // Add availability status
476
386
  if (available !== undefined) {
477
387
  statusParts.push(available ? 'Available' : 'Unavailable');
478
388
  }
479
389
 
480
- // Combine base label with status
481
- if (statusParts.length > 0) {
482
- return `${baseLabel} (${statusParts.join(', ')})`;
483
- }
484
-
485
- return baseLabel;
390
+ return statusParts.length > 0 ? `${baseLabel} (${statusParts.join(', ')})` : baseLabel;
486
391
  }
487
392
 
488
393
  /**
489
- * Discover PulseAudio socket path by finding the socket file
394
+ * Discovers the PulseAudio socket path by locating the socket file
395
+ *
490
396
  * @internal
491
- * Exported for use in device-phyos audio control
397
+ * Exported for use in device-phyos audio control module
398
+ *
399
+ * @returns The socket path if found, undefined otherwise
492
400
  */
493
401
  export function discoverPulseAudioSocket(): string | undefined {
494
402
  try {
495
- // Find PulseAudio socket directories in /tmp
496
403
  const findOutput = execSync(
497
404
  'find /tmp -maxdepth 2 -type d -name "pulse-*" 2>/dev/null | head -1',
498
405
  {
@@ -504,7 +411,6 @@ export function discoverPulseAudioSocket(): string | undefined {
504
411
 
505
412
  if (findOutput) {
506
413
  const socketPath = `${findOutput}/native`;
507
- // Verify the socket file exists
508
414
  try {
509
415
  execSync(`test -S "${socketPath}"`, { stdio: 'pipe' });
510
416
  return socketPath;
@@ -513,18 +419,20 @@ export function discoverPulseAudioSocket(): string | undefined {
513
419
  }
514
420
  }
515
421
  } catch (error) {
516
- // Socket discovery failed, will try without it
422
+ // Socket discovery failed
517
423
  }
518
424
  return undefined;
519
425
  }
520
426
 
521
427
  /**
522
- * Get environment variables for execSync calls to include PULSE_SERVER if discovered
428
+ * Retrieves environment variables for execSync calls, including PULSE_SERVER if socket is discovered
429
+ *
523
430
  * @internal
524
- * Exported for use in device-phyos audio control
431
+ * Exported for use in device-phyos audio control module
432
+ *
433
+ * @returns Process environment with PULSE_SERVER set if socket was discovered
525
434
  */
526
435
  export function getPulseAudioEnv(): NodeJS.ProcessEnv {
527
- // Try to discover socket if not already discovered
528
436
  if (!pulseAudioServerPath) {
529
437
  pulseAudioServerPath = discoverPulseAudioSocket();
530
438
  if (pulseAudioServerPath) {
@@ -540,11 +448,12 @@ export function getPulseAudioEnv(): NodeJS.ProcessEnv {
540
448
  }
541
449
 
542
450
  /**
543
- * Start PulseAudio daemon if not running
544
- * Service runs as root, so user mode has full hardware access
451
+ * Starts the PulseAudio daemon if not already running
452
+ * Service runs as root, providing full hardware access in user mode
453
+ *
454
+ * @returns true if PulseAudio is running and accessible, false otherwise
545
455
  */
546
456
  function startPulseAudio(): boolean {
547
- // If we don't have the socket path yet, try to discover it
548
457
  if (!pulseAudioServerPath) {
549
458
  pulseAudioServerPath = discoverPulseAudioSocket();
550
459
  if (pulseAudioServerPath) {
@@ -552,7 +461,7 @@ function startPulseAudio(): boolean {
552
461
  }
553
462
  }
554
463
 
555
- // Check if already running and accessible
464
+ // Verify PulseAudio is running and accessible
556
465
  try {
557
466
  const env = getPulseAudioEnv();
558
467
  execSync(PULSEAUDIO_COMMANDS.INFO, {
@@ -563,9 +472,7 @@ function startPulseAudio(): boolean {
563
472
  });
564
473
  console.log('PulseAudio is running and accessible');
565
474
 
566
- // Ensure ALSA devices (especially inputs) are loaded
567
475
  loadAlsaDevicesIntoPulseAudio();
568
-
569
476
  return true;
570
477
  } catch (error) {
571
478
  const errorMsg = error instanceof Error ? error.message : String(error);
@@ -573,27 +480,22 @@ function startPulseAudio(): boolean {
573
480
  console.log('Attempting to start PulseAudio...');
574
481
  }
575
482
 
576
- // Kill any existing instances and start fresh as the current user (root)
483
+ // Start fresh PulseAudio instance as current user (root)
577
484
  try {
578
- // Kill existing instances
579
485
  execSync(PULSEAUDIO_COMMANDS.KILL, {
580
486
  timeout: PULSEAUDIO_TIMEOUTS.KILL,
581
487
  stdio: 'pipe',
582
488
  });
583
489
 
584
- // Wait for cleanup
585
490
  execSync(PULSEAUDIO_COMMANDS.WAIT, { stdio: 'pipe' });
586
491
 
587
- // Start new daemon
588
492
  execSync(PULSEAUDIO_COMMANDS.START_DAEMON, {
589
493
  timeout: PULSEAUDIO_TIMEOUTS.START,
590
494
  stdio: 'pipe',
591
495
  });
592
496
 
593
- // Wait for startup
594
497
  execSync(PULSEAUDIO_COMMANDS.WAIT, { stdio: 'pipe' });
595
498
 
596
- // Discover the socket path
597
499
  pulseAudioServerPath = discoverPulseAudioSocket();
598
500
  if (pulseAudioServerPath) {
599
501
  console.log(`Discovered PulseAudio socket: ${pulseAudioServerPath}`);
@@ -601,7 +503,6 @@ function startPulseAudio(): boolean {
601
503
  console.log('Warning: Could not discover PulseAudio socket path');
602
504
  }
603
505
 
604
- // Verify it's running
605
506
  const env = getPulseAudioEnv();
606
507
  execSync(PULSEAUDIO_COMMANDS.INFO, {
607
508
  timeout: PULSEAUDIO_TIMEOUTS.INFO_CHECK,
@@ -611,7 +512,6 @@ function startPulseAudio(): boolean {
611
512
 
612
513
  console.log('✓ PulseAudio started successfully');
613
514
 
614
- // Load ALSA devices (including input sources)
615
515
  loadAlsaDevicesIntoPulseAudio();
616
516
 
617
517
  return true;
@@ -626,7 +526,7 @@ function startPulseAudio(): boolean {
626
526
  }
627
527
 
628
528
  /**
629
- * Parse ALSA device list to extract available hardware devices
529
+ * ALSA hardware device information
630
530
  */
631
531
  interface AlsaDevice {
632
532
  card: number;
@@ -635,17 +535,23 @@ interface AlsaDevice {
635
535
  hwString: string; // e.g., "hw:0,0"
636
536
  }
637
537
 
538
+ /**
539
+ * Parses ALSA device list output and extracts hardware device information
540
+ *
541
+ * @param aplayOutput - Raw output from `aplay -l` or `arecord -l` command
542
+ * @returns Array of parsed ALSA device objects
543
+ */
638
544
  function parseAlsaDevices(aplayOutput: string): AlsaDevice[] {
639
545
  const devices: AlsaDevice[] = [];
640
546
 
641
- // Parse lines like: "card 0: PCH [HDA Intel PCH], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]"
547
+ // Parse format: "card 0: PCH [HDA Intel PCH], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]"
642
548
  const regex = /card (\d+): ([^,]+), device (\d+): ([^\[]+)\[([^\]]+)\]/g;
643
549
  let match;
644
550
 
645
551
  while ((match = regex.exec(aplayOutput)) !== null) {
646
552
  const card = parseInt(match[1], 10);
647
553
  const device = parseInt(match[3], 10);
648
- const name = match[5].trim(); // Use the name in brackets
554
+ const name = match[5].trim();
649
555
 
650
556
  devices.push({
651
557
  card,
@@ -659,7 +565,11 @@ function parseAlsaDevices(aplayOutput: string): AlsaDevice[] {
659
565
  }
660
566
 
661
567
  /**
662
- * Check if a PulseAudio sink/source already exists for an ALSA device
568
+ * Checks if a PulseAudio sink/source already exists for the specified ALSA device
569
+ *
570
+ * @param hwString - ALSA hardware string (e.g., "hw:0,0")
571
+ * @param isInput - Whether to check for source (input) or sink (output)
572
+ * @returns true if a matching sink/source exists, false otherwise
663
573
  */
664
574
  function checkExistingSink(hwString: string, isInput: boolean): boolean {
665
575
  try {
@@ -671,15 +581,10 @@ function checkExistingSink(hwString: string, isInput: boolean): boolean {
671
581
  env,
672
582
  });
673
583
 
674
- // Check if any sink/source references this ALSA device
675
- // Look for patterns like "alsa.device = "0"" and "alsa.card = "0""
676
584
  const [card, device] = hwString.replace('hw:', '').split(',');
677
-
678
- // Check for exact device match (most specific)
679
585
  const devicePattern = new RegExp(`alsa\\.device\\s*=\\s*"${device}"`, 'i');
680
586
  const cardPattern = new RegExp(`alsa\\.card\\s*=\\s*"${card}"`, 'i');
681
587
 
682
- // Split into blocks and check if any block has both card and device match
683
588
  const blocks = output.split(/^(Sink|Source) #/m);
684
589
  for (const block of blocks) {
685
590
  if (cardPattern.test(block) && devicePattern.test(block)) {
@@ -694,7 +599,11 @@ function checkExistingSink(hwString: string, isInput: boolean): boolean {
694
599
  }
695
600
 
696
601
  /**
697
- * Create PulseAudio sink for an ALSA device
602
+ * Creates a PulseAudio sink or source for the specified ALSA device
603
+ *
604
+ * @param alsaDevice - ALSA device information
605
+ * @param isInput - Whether to create a source (input) or sink (output)
606
+ * @returns true if creation succeeded, false otherwise
698
607
  */
699
608
  function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean {
700
609
  try {
@@ -702,8 +611,7 @@ function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean
702
611
  ? `alsa_input_${alsaDevice.card}_${alsaDevice.device}`
703
612
  : `alsa_output_${alsaDevice.card}_${alsaDevice.device}`;
704
613
 
705
- // Simplify description to avoid quoting/escaping issues with PulseAudio
706
- // Replace spaces and special chars with underscores
614
+ // Sanitize description to avoid quoting/escaping issues
707
615
  const safeDescription = `${alsaDevice.name}_${alsaDevice.hwString}`.replace(
708
616
  /[^a-zA-Z0-9_-]/g,
709
617
  '_'
@@ -735,8 +643,9 @@ function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean
735
643
  }
736
644
 
737
645
  /**
738
- * Ensure PulseAudio loads all ALSA devices (including input devices)
739
- * This function:
646
+ * Ensures PulseAudio loads all ALSA devices (including input devices)
647
+ *
648
+ * Process:
740
649
  * 1. Queries ALSA hardware to find all available devices
741
650
  * 2. Checks what PulseAudio has already detected
742
651
  * 3. Creates missing sinks/sources dynamically
@@ -746,7 +655,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
746
655
  try {
747
656
  console.log('Detecting ALSA hardware and ensuring PulseAudio coverage...');
748
657
 
749
- // Step 1: Load the base ALSA card module (for auto-detection)
658
+ // Load base ALSA card module for auto-detection
750
659
  try {
751
660
  const env = getPulseAudioEnv();
752
661
  const modules = execSync(PULSEAUDIO_COMMANDS.LIST_MODULES, {
@@ -767,12 +676,12 @@ function loadAlsaDevicesIntoPulseAudio(): void {
767
676
  console.log(' Note: Base ALSA module load failed (will create sinks manually)');
768
677
  }
769
678
 
770
- // Step 2: Query ALSA for actual hardware devices
679
+ // Query ALSA for hardware devices
771
680
  let outputDevices: AlsaDevice[] = [];
772
681
  let inputDevices: AlsaDevice[] = [];
773
682
 
774
683
  try {
775
- const aplayOutput = execSync('aplay -l 2>/dev/null', {
684
+ const aplayOutput = execSync(ALSA_COMMANDS.APLAY_LIST, {
776
685
  encoding: 'utf-8',
777
686
  timeout: 3000,
778
687
  });
@@ -783,7 +692,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
783
692
  }
784
693
 
785
694
  try {
786
- const arecordOutput = execSync('arecord -l 2>/dev/null', {
695
+ const arecordOutput = execSync(ALSA_COMMANDS.ARECORD_LIST, {
787
696
  encoding: 'utf-8',
788
697
  timeout: 3000,
789
698
  });
@@ -793,7 +702,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
793
702
  console.log(' No ALSA input devices found or arecord failed');
794
703
  }
795
704
 
796
- // Step 3: For each ALSA device, check if PA has a sink/source, if not create one
705
+ // Create missing PulseAudio sinks/sources for each ALSA device
797
706
  let createdCount = 0;
798
707
 
799
708
  for (const device of outputDevices) {
@@ -830,7 +739,9 @@ function loadAlsaDevicesIntoPulseAudio(): void {
830
739
  }
831
740
 
832
741
  /**
833
- * Get default sink and source from PulseAudio
742
+ * Retrieves the default sink and source identifiers from PulseAudio
743
+ *
744
+ * @returns Object containing defaultSink and defaultSource identifiers, or empty object on failure
834
745
  */
835
746
  function getDefaultDevices(): { defaultSink?: string; defaultSource?: string } {
836
747
  try {
@@ -855,7 +766,9 @@ function getDefaultDevices(): { defaultSink?: string; defaultSource?: string } {
855
766
  }
856
767
 
857
768
  /**
858
- * Get available audio input/output devices using PulseAudio
769
+ * Retrieves available audio input and output devices using PulseAudio
770
+ *
771
+ * @returns AudioDevices object containing outputs and inputs arrays, or undefined on failure
859
772
  */
860
773
  function getAudioDevices(): AudioDevices | undefined {
861
774
  if (!startPulseAudio()) {
@@ -863,7 +776,6 @@ function getAudioDevices(): AudioDevices | undefined {
863
776
  return undefined;
864
777
  }
865
778
 
866
- // Get default devices first
867
779
  const { defaultSink, defaultSource } = getDefaultDevices();
868
780
  console.log(`Default sink: ${defaultSink}, Default source: ${defaultSource}`);
869
781
 
@@ -884,11 +796,9 @@ function getAudioDevices(): AudioDevices | undefined {
884
796
  .forEach(block => {
885
797
  const device = parseAudioDevice(block, false);
886
798
  if (device) {
887
- // Check if this is the default sink and update label
888
799
  const isDefault = device.identifier === defaultSink;
889
800
 
890
801
  if (isDefault && device.label) {
891
- // Update label to include Default status
892
802
  if (!device.label.includes('Default')) {
893
803
  if (device.label.includes('(')) {
894
804
  device.label = device.label.replace(')', ', Default)');
@@ -923,11 +833,9 @@ function getAudioDevices(): AudioDevices | undefined {
923
833
  .forEach(block => {
924
834
  const device = parseAudioDevice(block, true);
925
835
  if (device) {
926
- // Check if this is the default source and update label
927
836
  const isDefault = device.identifier === defaultSource;
928
837
 
929
838
  if (isDefault && device.label) {
930
- // Update label to include Default status
931
839
  if (!device.label.includes('Default')) {
932
840
  if (device.label.includes('(')) {
933
841
  device.label = device.label.replace(')', ', Default)');
@@ -948,7 +856,6 @@ function getAudioDevices(): AudioDevices | undefined {
948
856
  );
949
857
  }
950
858
 
951
- // Return undefined if no devices found
952
859
  if (outputs.length === 0 && inputs.length === 0) {
953
860
  console.log('No audio devices detected');
954
861
  return undefined;
@@ -991,17 +898,15 @@ export async function getSystemInformation() {
991
898
  };
992
899
 
993
900
  const info = await si.get(valueObject);
994
- // console.log('getAllData3', {info});
995
901
 
996
- // Now get all network interfaces (this call reliably returns disabled interfaces as well).
902
+ // Retrieve network interfaces (includes disabled interfaces)
997
903
  let netIfaces = await si.networkInterfaces();
998
904
 
999
- // Ensure netIfaces is always an array
1000
905
  if (!Array.isArray(netIfaces)) {
1001
906
  netIfaces = [netIfaces];
1002
907
  }
1003
908
 
1004
- // Map through the interfaces and assign a type if missing.
909
+ // Assign type to interfaces missing type information
1005
910
  netIfaces = netIfaces.map((iface: any) => ({
1006
911
  ...iface,
1007
912
  type:
@@ -1011,16 +916,14 @@ export async function getSystemInformation() {
1011
916
  : 'unknown'),
1012
917
  }));
1013
918
 
1014
- // Inject the full list of network interfaces into our system info.
1015
919
  info.networkInterfaces = netIfaces;
1016
920
 
1017
- // Get audio devices using PulseAudio
1018
921
  const audioDevices = getAudioDevices();
1019
922
  if (audioDevices) {
1020
923
  info.audioDevices = audioDevices;
1021
924
  }
1022
925
 
1023
- // TODO: update so structure is aligned with what the browser version will output. Create a type.
926
+ // TODO: Align structure with browser version output and create proper type definition
1024
927
  const systemInfo = JSON.parse(JSON.stringify(info));
1025
928
 
1026
929
  return systemInfo;