feat(devicemanager): Introduce a UniversalDevice architecture with composable Feature system; add extensive new device/protocol support and discovery/refactors

This commit is contained in:
2026-01-09 09:03:42 +00:00
parent 05e1f94c79
commit 206b4b5ae0
33 changed files with 8254 additions and 87 deletions

View File

@@ -19,6 +19,13 @@ const SERVICE_TYPES = {
IPP: '_ipp._tcp', // IPP printers
IPPS: '_ipps._tcp', // IPP over TLS
PDL: '_pdl-datastream._tcp', // Raw/JetDirect printers
// Speakers / Audio
AIRPLAY: '_airplay._tcp', // AirPlay devices (Apple TV, HomePod, etc.)
RAOP: '_raop._tcp', // Remote Audio Output Protocol (AirPlay audio)
SONOS: '_sonos._tcp', // Sonos speakers
GOOGLECAST: '_googlecast._tcp', // Chromecast / Google Cast devices
SPOTIFY: '_spotify-connect._tcp', // Spotify Connect devices
} as const;
/**
@@ -26,11 +33,18 @@ const SERVICE_TYPES = {
*/
const DEFAULT_OPTIONS: Required<IDiscoveryOptions> = {
serviceTypes: [
// Scanners
SERVICE_TYPES.ESCL,
SERVICE_TYPES.ESCL_SECURE,
SERVICE_TYPES.SANE,
// Printers
SERVICE_TYPES.IPP,
SERVICE_TYPES.IPPS,
// Speakers
SERVICE_TYPES.AIRPLAY,
SERVICE_TYPES.RAOP,
SERVICE_TYPES.SONOS,
SERVICE_TYPES.GOOGLECAST,
],
timeout: 10000,
};
@@ -281,11 +295,22 @@ export class MdnsDiscovery extends plugins.events.EventEmitter {
case SERVICE_TYPES.IPPS:
case SERVICE_TYPES.PDL:
return 'printer';
case SERVICE_TYPES.AIRPLAY:
case SERVICE_TYPES.RAOP:
case SERVICE_TYPES.SONOS:
case SERVICE_TYPES.GOOGLECAST:
case SERVICE_TYPES.SPOTIFY:
return 'speaker';
default:
// Check if it's a scanner or printer based on service type pattern
if (serviceType.includes('scan') || serviceType.includes('scanner')) {
return 'scanner';
}
if (serviceType.includes('airplay') || serviceType.includes('raop') ||
serviceType.includes('sonos') || serviceType.includes('cast') ||
serviceType.includes('spotify')) {
return 'speaker';
}
return 'printer';
}
}
@@ -293,7 +318,7 @@ export class MdnsDiscovery extends plugins.events.EventEmitter {
/**
* Determine protocol from service type
*/
private getProtocol(serviceType: string): TScannerProtocol | 'ipp' {
private getProtocol(serviceType: string): string {
switch (serviceType) {
case SERVICE_TYPES.ESCL:
case SERVICE_TYPES.ESCL_SECURE:
@@ -304,8 +329,17 @@ export class MdnsDiscovery extends plugins.events.EventEmitter {
case SERVICE_TYPES.IPPS:
case SERVICE_TYPES.PDL:
return 'ipp';
case SERVICE_TYPES.AIRPLAY:
case SERVICE_TYPES.RAOP:
return 'airplay';
case SERVICE_TYPES.SONOS:
return 'sonos';
case SERVICE_TYPES.GOOGLECAST:
return 'chromecast';
case SERVICE_TYPES.SPOTIFY:
return 'spotify';
default:
return 'ipp';
return 'unknown';
}
}
}