@phystack/hub-device 4.5.13-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":"AAiaA,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',
@@ -301,10 +306,7 @@ function createDeviceLabel(device, ports, isInput, formFactor, bus, isDefault, a
301
306
  if (available !== undefined) {
302
307
  statusParts.push(available ? 'Available' : 'Unavailable');
303
308
  }
304
- if (statusParts.length > 0) {
305
- return `${baseLabel} (${statusParts.join(', ')})`;
306
- }
307
- return baseLabel;
309
+ return statusParts.length > 0 ? `${baseLabel} (${statusParts.join(', ')})` : baseLabel;
308
310
  }
309
311
  function discoverPulseAudioSocket() {
310
312
  try {
@@ -488,7 +490,7 @@ function loadAlsaDevicesIntoPulseAudio() {
488
490
  let outputDevices = [];
489
491
  let inputDevices = [];
490
492
  try {
491
- const aplayOutput = (0, child_process_1.execSync)('aplay -l 2>/dev/null', {
493
+ const aplayOutput = (0, child_process_1.execSync)(ALSA_COMMANDS.APLAY_LIST, {
492
494
  encoding: 'utf-8',
493
495
  timeout: 3000,
494
496
  });
@@ -499,7 +501,7 @@ function loadAlsaDevicesIntoPulseAudio() {
499
501
  console.log(' No ALSA output devices found or aplay failed');
500
502
  }
501
503
  try {
502
- const arecordOutput = (0, child_process_1.execSync)('arecord -l 2>/dev/null', {
504
+ const arecordOutput = (0, child_process_1.execSync)(ALSA_COMMANDS.ARECORD_LIST, {
503
505
  encoding: 'utf-8',
504
506
  timeout: 3000,
505
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.13-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.13-dev",
16
- "@phystack/socket.io-proxy": "4.5.13-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": "469c51374160dfe0625ab8285946b53d086b3d67"
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,37 +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
268
+ // Card lookup failed, continue without card name
281
269
  }
282
270
  }
283
271
  }
284
272
  }
285
273
  }
286
274
 
287
- // Create human-readable label with device info (formFactor, bus, available, activePort)
288
- // 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
289
277
  device.label = createDeviceLabel(
290
278
  device,
291
279
  ports,
292
280
  isInput,
293
281
  (device as any).formFactor,
294
282
  (device as any).bus,
295
- false, // isDefault will be updated later
283
+ false,
296
284
  deviceAvailable,
297
285
  (device as any).activePort
298
286
  );
299
287
 
300
- // Clean up temporary fields used only for label generation - don't include in reported properties
301
- // Remove: cardNameRaw, cardNumber, productName, formFactor, bus, activePort, cardName, displayName
302
- // 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
303
290
  const cleanDevice: Partial<AudioDevice> = {
304
291
  identifier: device.identifier,
305
292
  volume: device.volume,
@@ -312,8 +299,18 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
312
299
  }
313
300
 
314
301
  /**
315
- * Create a human-readable label for an audio device with device info
316
- * 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
317
314
  */
318
315
  function createDeviceLabel(
319
316
  device: Partial<AudioDevice>,
@@ -328,15 +325,12 @@ function createDeviceLabel(
328
325
  const productName = (device as any).productName;
329
326
  let baseLabel = '';
330
327
 
331
- // Find the active port in the ports list
332
328
  const activePortInfo = activePort ? ports.find(p => p.name === activePort) : undefined;
333
329
 
334
- // Priority 1: Use product name if available (e.g., "LG ULTRAFINE")
330
+ // Label generation priority: product name > active port > display name > identifier
335
331
  if (productName) {
336
332
  baseLabel = `${productName} (${isInput ? 'Microphone' : 'Speaker'})`;
337
- }
338
- // Priority 2: Use active port description if available
339
- else if (activePortInfo && activePortInfo.description) {
333
+ } else if (activePortInfo && activePortInfo.description) {
340
334
  const portDesc = activePortInfo.description;
341
335
 
342
336
  // Map common port descriptions to user-friendly names
@@ -357,20 +351,15 @@ function createDeviceLabel(
357
351
  } else if (portDesc.toLowerCase().includes('speaker')) {
358
352
  baseLabel = 'Speakers';
359
353
  } else {
360
- // Use port description with device type
361
354
  baseLabel = `${portDesc} (${isInput ? 'Input' : 'Output'})`;
362
355
  }
363
- }
364
- // Priority 3: Use display name with device type
365
- else if (device.displayName) {
356
+ } else if (device.displayName) {
366
357
  baseLabel = `${device.displayName} (${isInput ? 'Input' : 'Output'})`;
367
- }
368
- // Fallback: Use identifier
369
- else {
358
+ } else {
370
359
  baseLabel = device.identifier || 'Unknown Audio Device';
371
360
  }
372
361
 
373
- // Concatenate displayName if available and not already used
362
+ // Append display name if not already included
374
363
  if (
375
364
  device.displayName &&
376
365
  baseLabel !== device.displayName &&
@@ -379,45 +368,38 @@ function createDeviceLabel(
379
368
  baseLabel = `${device.displayName} - ${baseLabel}`;
380
369
  }
381
370
 
382
- // Concatenate formFactor if available and not internal
371
+ // Append form factor if external device
383
372
  if (formFactor && formFactor !== 'internal' && !baseLabel.includes(formFactor)) {
384
373
  baseLabel = `${baseLabel} (${formFactor.charAt(0).toUpperCase() + formFactor.slice(1)})`;
385
374
  }
386
375
 
387
- // Concatenate bus if available and not PCI
376
+ // Append bus type if non-PCI
388
377
  if (bus && bus.toLowerCase() !== 'pci' && !baseLabel.includes(bus.toUpperCase())) {
389
378
  baseLabel = `${baseLabel} (${bus.toUpperCase()})`;
390
379
  }
391
380
 
392
- // Add status indicators
381
+ // Append status indicators
393
382
  const statusParts: string[] = [];
394
-
395
- // Add default status
396
383
  if (isDefault) {
397
384
  statusParts.push('Default');
398
385
  }
399
-
400
- // Add availability status
401
386
  if (available !== undefined) {
402
387
  statusParts.push(available ? 'Available' : 'Unavailable');
403
388
  }
404
389
 
405
- // Combine base label with status
406
- if (statusParts.length > 0) {
407
- return `${baseLabel} (${statusParts.join(', ')})`;
408
- }
409
-
410
- return baseLabel;
390
+ return statusParts.length > 0 ? `${baseLabel} (${statusParts.join(', ')})` : baseLabel;
411
391
  }
412
392
 
413
393
  /**
414
- * Discover PulseAudio socket path by finding the socket file
394
+ * Discovers the PulseAudio socket path by locating the socket file
395
+ *
415
396
  * @internal
416
- * 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
417
400
  */
418
401
  export function discoverPulseAudioSocket(): string | undefined {
419
402
  try {
420
- // Find PulseAudio socket directories in /tmp
421
403
  const findOutput = execSync(
422
404
  'find /tmp -maxdepth 2 -type d -name "pulse-*" 2>/dev/null | head -1',
423
405
  {
@@ -429,7 +411,6 @@ export function discoverPulseAudioSocket(): string | undefined {
429
411
 
430
412
  if (findOutput) {
431
413
  const socketPath = `${findOutput}/native`;
432
- // Verify the socket file exists
433
414
  try {
434
415
  execSync(`test -S "${socketPath}"`, { stdio: 'pipe' });
435
416
  return socketPath;
@@ -438,18 +419,20 @@ export function discoverPulseAudioSocket(): string | undefined {
438
419
  }
439
420
  }
440
421
  } catch (error) {
441
- // Socket discovery failed, will try without it
422
+ // Socket discovery failed
442
423
  }
443
424
  return undefined;
444
425
  }
445
426
 
446
427
  /**
447
- * 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
+ *
448
430
  * @internal
449
- * 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
450
434
  */
451
435
  export function getPulseAudioEnv(): NodeJS.ProcessEnv {
452
- // Try to discover socket if not already discovered
453
436
  if (!pulseAudioServerPath) {
454
437
  pulseAudioServerPath = discoverPulseAudioSocket();
455
438
  if (pulseAudioServerPath) {
@@ -465,11 +448,12 @@ export function getPulseAudioEnv(): NodeJS.ProcessEnv {
465
448
  }
466
449
 
467
450
  /**
468
- * Start PulseAudio daemon if not running
469
- * 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
470
455
  */
471
456
  function startPulseAudio(): boolean {
472
- // If we don't have the socket path yet, try to discover it
473
457
  if (!pulseAudioServerPath) {
474
458
  pulseAudioServerPath = discoverPulseAudioSocket();
475
459
  if (pulseAudioServerPath) {
@@ -477,7 +461,7 @@ function startPulseAudio(): boolean {
477
461
  }
478
462
  }
479
463
 
480
- // Check if already running and accessible
464
+ // Verify PulseAudio is running and accessible
481
465
  try {
482
466
  const env = getPulseAudioEnv();
483
467
  execSync(PULSEAUDIO_COMMANDS.INFO, {
@@ -488,9 +472,7 @@ function startPulseAudio(): boolean {
488
472
  });
489
473
  console.log('PulseAudio is running and accessible');
490
474
 
491
- // Ensure ALSA devices (especially inputs) are loaded
492
475
  loadAlsaDevicesIntoPulseAudio();
493
-
494
476
  return true;
495
477
  } catch (error) {
496
478
  const errorMsg = error instanceof Error ? error.message : String(error);
@@ -498,27 +480,22 @@ function startPulseAudio(): boolean {
498
480
  console.log('Attempting to start PulseAudio...');
499
481
  }
500
482
 
501
- // Kill any existing instances and start fresh as the current user (root)
483
+ // Start fresh PulseAudio instance as current user (root)
502
484
  try {
503
- // Kill existing instances
504
485
  execSync(PULSEAUDIO_COMMANDS.KILL, {
505
486
  timeout: PULSEAUDIO_TIMEOUTS.KILL,
506
487
  stdio: 'pipe',
507
488
  });
508
489
 
509
- // Wait for cleanup
510
490
  execSync(PULSEAUDIO_COMMANDS.WAIT, { stdio: 'pipe' });
511
491
 
512
- // Start new daemon
513
492
  execSync(PULSEAUDIO_COMMANDS.START_DAEMON, {
514
493
  timeout: PULSEAUDIO_TIMEOUTS.START,
515
494
  stdio: 'pipe',
516
495
  });
517
496
 
518
- // Wait for startup
519
497
  execSync(PULSEAUDIO_COMMANDS.WAIT, { stdio: 'pipe' });
520
498
 
521
- // Discover the socket path
522
499
  pulseAudioServerPath = discoverPulseAudioSocket();
523
500
  if (pulseAudioServerPath) {
524
501
  console.log(`Discovered PulseAudio socket: ${pulseAudioServerPath}`);
@@ -526,7 +503,6 @@ function startPulseAudio(): boolean {
526
503
  console.log('Warning: Could not discover PulseAudio socket path');
527
504
  }
528
505
 
529
- // Verify it's running
530
506
  const env = getPulseAudioEnv();
531
507
  execSync(PULSEAUDIO_COMMANDS.INFO, {
532
508
  timeout: PULSEAUDIO_TIMEOUTS.INFO_CHECK,
@@ -536,7 +512,6 @@ function startPulseAudio(): boolean {
536
512
 
537
513
  console.log('✓ PulseAudio started successfully');
538
514
 
539
- // Load ALSA devices (including input sources)
540
515
  loadAlsaDevicesIntoPulseAudio();
541
516
 
542
517
  return true;
@@ -551,7 +526,7 @@ function startPulseAudio(): boolean {
551
526
  }
552
527
 
553
528
  /**
554
- * Parse ALSA device list to extract available hardware devices
529
+ * ALSA hardware device information
555
530
  */
556
531
  interface AlsaDevice {
557
532
  card: number;
@@ -560,17 +535,23 @@ interface AlsaDevice {
560
535
  hwString: string; // e.g., "hw:0,0"
561
536
  }
562
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
+ */
563
544
  function parseAlsaDevices(aplayOutput: string): AlsaDevice[] {
564
545
  const devices: AlsaDevice[] = [];
565
546
 
566
- // 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]"
567
548
  const regex = /card (\d+): ([^,]+), device (\d+): ([^\[]+)\[([^\]]+)\]/g;
568
549
  let match;
569
550
 
570
551
  while ((match = regex.exec(aplayOutput)) !== null) {
571
552
  const card = parseInt(match[1], 10);
572
553
  const device = parseInt(match[3], 10);
573
- const name = match[5].trim(); // Use the name in brackets
554
+ const name = match[5].trim();
574
555
 
575
556
  devices.push({
576
557
  card,
@@ -584,7 +565,11 @@ function parseAlsaDevices(aplayOutput: string): AlsaDevice[] {
584
565
  }
585
566
 
586
567
  /**
587
- * 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
588
573
  */
589
574
  function checkExistingSink(hwString: string, isInput: boolean): boolean {
590
575
  try {
@@ -596,15 +581,10 @@ function checkExistingSink(hwString: string, isInput: boolean): boolean {
596
581
  env,
597
582
  });
598
583
 
599
- // Check if any sink/source references this ALSA device
600
- // Look for patterns like "alsa.device = "0"" and "alsa.card = "0""
601
584
  const [card, device] = hwString.replace('hw:', '').split(',');
602
-
603
- // Check for exact device match (most specific)
604
585
  const devicePattern = new RegExp(`alsa\\.device\\s*=\\s*"${device}"`, 'i');
605
586
  const cardPattern = new RegExp(`alsa\\.card\\s*=\\s*"${card}"`, 'i');
606
587
 
607
- // Split into blocks and check if any block has both card and device match
608
588
  const blocks = output.split(/^(Sink|Source) #/m);
609
589
  for (const block of blocks) {
610
590
  if (cardPattern.test(block) && devicePattern.test(block)) {
@@ -619,7 +599,11 @@ function checkExistingSink(hwString: string, isInput: boolean): boolean {
619
599
  }
620
600
 
621
601
  /**
622
- * 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
623
607
  */
624
608
  function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean {
625
609
  try {
@@ -627,8 +611,7 @@ function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean
627
611
  ? `alsa_input_${alsaDevice.card}_${alsaDevice.device}`
628
612
  : `alsa_output_${alsaDevice.card}_${alsaDevice.device}`;
629
613
 
630
- // Simplify description to avoid quoting/escaping issues with PulseAudio
631
- // Replace spaces and special chars with underscores
614
+ // Sanitize description to avoid quoting/escaping issues
632
615
  const safeDescription = `${alsaDevice.name}_${alsaDevice.hwString}`.replace(
633
616
  /[^a-zA-Z0-9_-]/g,
634
617
  '_'
@@ -660,8 +643,9 @@ function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean
660
643
  }
661
644
 
662
645
  /**
663
- * Ensure PulseAudio loads all ALSA devices (including input devices)
664
- * This function:
646
+ * Ensures PulseAudio loads all ALSA devices (including input devices)
647
+ *
648
+ * Process:
665
649
  * 1. Queries ALSA hardware to find all available devices
666
650
  * 2. Checks what PulseAudio has already detected
667
651
  * 3. Creates missing sinks/sources dynamically
@@ -671,7 +655,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
671
655
  try {
672
656
  console.log('Detecting ALSA hardware and ensuring PulseAudio coverage...');
673
657
 
674
- // Step 1: Load the base ALSA card module (for auto-detection)
658
+ // Load base ALSA card module for auto-detection
675
659
  try {
676
660
  const env = getPulseAudioEnv();
677
661
  const modules = execSync(PULSEAUDIO_COMMANDS.LIST_MODULES, {
@@ -692,12 +676,12 @@ function loadAlsaDevicesIntoPulseAudio(): void {
692
676
  console.log(' Note: Base ALSA module load failed (will create sinks manually)');
693
677
  }
694
678
 
695
- // Step 2: Query ALSA for actual hardware devices
679
+ // Query ALSA for hardware devices
696
680
  let outputDevices: AlsaDevice[] = [];
697
681
  let inputDevices: AlsaDevice[] = [];
698
682
 
699
683
  try {
700
- const aplayOutput = execSync('aplay -l 2>/dev/null', {
684
+ const aplayOutput = execSync(ALSA_COMMANDS.APLAY_LIST, {
701
685
  encoding: 'utf-8',
702
686
  timeout: 3000,
703
687
  });
@@ -708,7 +692,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
708
692
  }
709
693
 
710
694
  try {
711
- const arecordOutput = execSync('arecord -l 2>/dev/null', {
695
+ const arecordOutput = execSync(ALSA_COMMANDS.ARECORD_LIST, {
712
696
  encoding: 'utf-8',
713
697
  timeout: 3000,
714
698
  });
@@ -718,7 +702,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
718
702
  console.log(' No ALSA input devices found or arecord failed');
719
703
  }
720
704
 
721
- // 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
722
706
  let createdCount = 0;
723
707
 
724
708
  for (const device of outputDevices) {
@@ -755,7 +739,9 @@ function loadAlsaDevicesIntoPulseAudio(): void {
755
739
  }
756
740
 
757
741
  /**
758
- * 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
759
745
  */
760
746
  function getDefaultDevices(): { defaultSink?: string; defaultSource?: string } {
761
747
  try {
@@ -780,7 +766,9 @@ function getDefaultDevices(): { defaultSink?: string; defaultSource?: string } {
780
766
  }
781
767
 
782
768
  /**
783
- * 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
784
772
  */
785
773
  function getAudioDevices(): AudioDevices | undefined {
786
774
  if (!startPulseAudio()) {
@@ -788,7 +776,6 @@ function getAudioDevices(): AudioDevices | undefined {
788
776
  return undefined;
789
777
  }
790
778
 
791
- // Get default devices first
792
779
  const { defaultSink, defaultSource } = getDefaultDevices();
793
780
  console.log(`Default sink: ${defaultSink}, Default source: ${defaultSource}`);
794
781
 
@@ -809,11 +796,9 @@ function getAudioDevices(): AudioDevices | undefined {
809
796
  .forEach(block => {
810
797
  const device = parseAudioDevice(block, false);
811
798
  if (device) {
812
- // Check if this is the default sink and update label
813
799
  const isDefault = device.identifier === defaultSink;
814
800
 
815
801
  if (isDefault && device.label) {
816
- // Update label to include Default status
817
802
  if (!device.label.includes('Default')) {
818
803
  if (device.label.includes('(')) {
819
804
  device.label = device.label.replace(')', ', Default)');
@@ -848,11 +833,9 @@ function getAudioDevices(): AudioDevices | undefined {
848
833
  .forEach(block => {
849
834
  const device = parseAudioDevice(block, true);
850
835
  if (device) {
851
- // Check if this is the default source and update label
852
836
  const isDefault = device.identifier === defaultSource;
853
837
 
854
838
  if (isDefault && device.label) {
855
- // Update label to include Default status
856
839
  if (!device.label.includes('Default')) {
857
840
  if (device.label.includes('(')) {
858
841
  device.label = device.label.replace(')', ', Default)');
@@ -873,7 +856,6 @@ function getAudioDevices(): AudioDevices | undefined {
873
856
  );
874
857
  }
875
858
 
876
- // Return undefined if no devices found
877
859
  if (outputs.length === 0 && inputs.length === 0) {
878
860
  console.log('No audio devices detected');
879
861
  return undefined;
@@ -916,17 +898,15 @@ export async function getSystemInformation() {
916
898
  };
917
899
 
918
900
  const info = await si.get(valueObject);
919
- // console.log('getAllData3', {info});
920
901
 
921
- // Now get all network interfaces (this call reliably returns disabled interfaces as well).
902
+ // Retrieve network interfaces (includes disabled interfaces)
922
903
  let netIfaces = await si.networkInterfaces();
923
904
 
924
- // Ensure netIfaces is always an array
925
905
  if (!Array.isArray(netIfaces)) {
926
906
  netIfaces = [netIfaces];
927
907
  }
928
908
 
929
- // Map through the interfaces and assign a type if missing.
909
+ // Assign type to interfaces missing type information
930
910
  netIfaces = netIfaces.map((iface: any) => ({
931
911
  ...iface,
932
912
  type:
@@ -936,16 +916,14 @@ export async function getSystemInformation() {
936
916
  : 'unknown'),
937
917
  }));
938
918
 
939
- // Inject the full list of network interfaces into our system info.
940
919
  info.networkInterfaces = netIfaces;
941
920
 
942
- // Get audio devices using PulseAudio
943
921
  const audioDevices = getAudioDevices();
944
922
  if (audioDevices) {
945
923
  info.audioDevices = audioDevices;
946
924
  }
947
925
 
948
- // 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
949
927
  const systemInfo = JSON.parse(JSON.stringify(info));
950
928
 
951
929
  return systemInfo;