@@ -5,6 +5,7 @@ import { sleep } from "../utils.js";
5
5
import { ErrorWithCause } from "pony-cause" ;
6
6
import { MdnsDeviceInfo } from "../common/infrastructure/Atomic.js" ;
7
7
import { Browser , Service , ServiceType } from "@astronautlabs/mdns" ;
8
+ import { debounce , DebouncedFunction } from "./debounce.js" ;
8
9
9
10
export interface AvahiService {
10
11
service_name : string
@@ -19,7 +20,7 @@ export interface AvahiService {
19
20
20
21
export interface DiscoveryOptions < T > {
21
22
sanity ?: boolean
22
- onDiscover ?: ( service : MdnsDeviceInfo , raw : T ) => void
23
+ onDiscover ?: ( service : MdnsDeviceInfo ) => void
23
24
onDnsError ?: ( err : Error ) => void
24
25
duration ?: number ,
25
26
logger ?: Logger
@@ -38,17 +39,42 @@ export const discoveryAvahi = async (service: string, options?: DiscoveryOptions
38
39
maybeLogger . debug ( `Starting mDNS discovery with Avahi => Listening for ${ ( duration / 1000 ) . toFixed ( 2 ) } s` ) ;
39
40
let anyDiscovered = false ;
40
41
42
+ let services = new Map < string , MdnsDeviceInfo > ( ) ;
43
+
44
+ const triggerDiscovery = ( ) => {
45
+ for ( const [ k , v ] of services . entries ( ) ) {
46
+ maybeLogger . debug ( `Discovered device "${ v . name } " with ${ v . addresses . length } interfaces - first host seen: ${ v . addresses [ 0 ] } ` ) ;
47
+ onDiscover ( v ) ;
48
+ services . delete ( k ) ;
49
+ }
50
+ }
51
+
52
+ let debouncedFunc : DebouncedFunction ;
53
+
41
54
try {
42
55
const browser = new AvahiBrowser ( service ) ;
43
56
browser . on ( AvahiBrowser . EVENT_SERVICE_UP , async ( service : AvahiService ) => {
44
57
anyDiscovered = true ;
45
- maybeLogger . debug ( `Discovered device "${ service . service_name } " at ${ service . target . host } ` ) ;
46
- if ( onDiscover !== undefined ) {
47
- onDiscover ( {
48
- name : service . service_name ,
49
- addresses : [ service . target . host ] ,
50
- type : service . target . service_type
51
- } , service )
58
+
59
+ if ( onDiscover !== undefined ) {
60
+
61
+ let foundService = services . get ( service . service_name ) ;
62
+ if ( foundService === undefined ) {
63
+ foundService = {
64
+ name : service . service_name ,
65
+ addresses : [ service . target . host ] ,
66
+ type : service . target . service_type ,
67
+ }
68
+ } else {
69
+ foundService . addresses . push ( service . target . host ) ;
70
+ }
71
+ services . set ( foundService . name , foundService ) ;
72
+
73
+ if ( debouncedFunc === undefined ) {
74
+ debouncedFunc = debounce ( ( ) => triggerDiscovery ( ) , 1000 ) ;
75
+ } else {
76
+ await debouncedFunc ( ) ;
77
+ }
52
78
}
53
79
} ) ;
54
80
browser . on ( AvahiBrowser . EVENT_DNSSD_ERROR , ( err ) => {
@@ -109,9 +135,9 @@ export const discoveryNative = async (service: string, options?: DiscoveryOption
109
135
110
136
const browser = new Browser ( service , { resolve : true } )
111
137
. on ( 'serviceUp' , async ( service ) => {
112
- maybeLogger . debug ( `Discovered device "${ service . name } " at ${ service . addresses ?. [ 0 ] } ` ) ;
138
+ maybeLogger . debug ( `Discovered device "${ service . name } " with ${ service . addresses . length } interfaces -- first host seen: ${ service . addresses ?. [ 0 ] } ` ) ;
113
139
if ( onDiscover ) {
114
- onDiscover ( { name : service . name , addresses : service . addresses , type : service . service_type } , service ) ;
140
+ onDiscover ( { name : service . name , addresses : service . addresses , type : service . service_type } ) ;
115
141
}
116
142
} )
117
143
browser . on ( 'error' , ( err ) => {
0 commit comments