@@ -6,7 +6,7 @@ const descriptor = (value: string): Descriptor => ({ value } as Descriptor);
66
77function device ( overrides : Partial < Device > = { } ) : Device {
88 const base : Record < string , unknown > = {
9- id : 'ble-1' , name : null , mtu : 185 , rssi : - 42 ,
9+ id : 'ble-1' , name : null , localName : null , mtu : 185 , rssi : - 42 ,
1010 isConnected : jest . fn ( async ( ) => true ) , cancelConnection : jest . fn ( async ( ) => null as unknown as Device ) ,
1111 requestConnectionPriority : jest . fn ( async ( ) => base ) ,
1212 requestMTU : jest . fn ( async ( ) => ( { ...base , mtu : 517 } ) ) ,
@@ -410,7 +410,7 @@ describe('ReactNativeBleTransport', () => {
410410
411411 it ( 'publishes the actual Windows Bluetooth device name' , async ( ) => {
412412 let scanCallback ! : ( error : Error | null , value : Device | null ) => void ;
413- const advertised = device ( { name : 'Oliver Laptop' } ) ;
413+ const advertised = device ( { name : 'Oliver Laptop' , localName : 'Switchify PC' } ) ;
414414 const native = manager ( { startDeviceScan : jest . fn ( ( _uuids , _options , callback ) => { scanCallback = callback ; } ) } ) ;
415415 const transport = new ReactNativeBleTransport ( native , 'android' ) ;
416416 const found = jest . fn ( ) ;
@@ -422,6 +422,45 @@ describe('ReactNativeBleTransport', () => {
422422 stop ( ) ;
423423 } ) ;
424424
425+ it ( 'publishes the advertised Windows local name on iOS' , async ( ) => {
426+ let scanCallback ! : ( error : Error | null , value : Device | null ) => void ;
427+ const advertised = device ( { name : 'Switchify PC' , localName : 'Owen’s Windows PC' } ) ;
428+ const native = manager ( { startDeviceScan : jest . fn ( ( _uuids , _options , callback ) => { scanCallback = callback ; } ) } ) ;
429+ const transport = new ReactNativeBleTransport ( native , 'ios' ) ;
430+ const found = jest . fn ( ) ;
431+ const stop = transport . scan ( found , jest . fn ( ) ) ;
432+
433+ scanCallback ( null , advertised ) ;
434+ await waitFor ( ( ) => found . mock . calls . length === 1 ) ;
435+
436+ expect ( found ) . toHaveBeenCalledWith ( expect . objectContaining ( { displayName : 'Owen’s Windows PC' , platform : 'windows' } ) ) ;
437+ stop ( ) ;
438+ } ) ;
439+
440+ it ( 'discovers multiple Windows PCs with a generic iOS device name' , async ( ) => {
441+ let scanCallback ! : ( error : Error | null , value : Device | null ) => void ;
442+ const makeWindowsPc = ( id : string , desktopId : string , localName : string ) => device ( {
443+ id,
444+ name : 'Switchify PC' ,
445+ localName,
446+ readCharacteristicForService : jest . fn ( async ( ) => ( { value : fromByteArray ( new TextEncoder ( ) . encode ( JSON . stringify ( { protocolVersion : 1 , desktopId, displayName : 'Switchify PC' , platform : 'windows' } ) ) ) } as Characteristic ) ) ,
447+ } ) ;
448+ const first = makeWindowsPc ( 'windows-1' , 'pc-1' , 'Office PC' ) ;
449+ const second = makeWindowsPc ( 'windows-2' , 'pc-2' , 'Living Room PC' ) ;
450+ const native = manager ( { startDeviceScan : jest . fn ( ( _uuids , _options , callback ) => { scanCallback = callback ; } ) } ) ;
451+ const transport = new ReactNativeBleTransport ( native , 'ios' ) ;
452+ const found = jest . fn ( ) ;
453+ const stop = transport . scan ( found , jest . fn ( ) ) ;
454+
455+ scanCallback ( null , first ) ;
456+ await waitFor ( ( ) => found . mock . calls . some ( ( [ desktop ] ) => desktop . desktopId === 'pc-1' ) ) ;
457+ scanCallback ( null , second ) ;
458+ await waitFor ( ( ) => found . mock . calls . some ( ( [ desktop ] ) => desktop . desktopId === 'pc-2' ) ) ;
459+
460+ expect ( found . mock . calls . map ( ( [ desktop ] ) => desktop . displayName ) ) . toEqual ( [ 'Office PC' , 'Living Room PC' ] ) ;
461+ stop ( ) ;
462+ } ) ;
463+
425464 it ( 'hands a matching discovery connection directly to the authenticated session' , async ( ) => {
426465 let scanCallback ! : ( error : Error | null , value : Device | null ) => void ;
427466 const configured = device ( { isConnected : jest . fn ( async ( ) => true ) , mtu : 517 } ) ;
0 commit comments