react-native-zeroconf 0.15.1 → 0.16.0
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.
- package/README.md +27 -536
- package/android/build.gradle +2 -2
- package/android/src/main/java/com/balthazargronon/RCTZeroconf/Zeroconf.java +16 -4
- package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroconfModule.java +95 -13
- package/android/src/main/java/com/balthazargronon/RCTZeroconf/nsd/NsdServiceImpl.java +184 -64
- package/android/src/main/java/com/balthazargronon/RCTZeroconf/nsd/ServiceInfoCallbacks.java +89 -0
- package/android/src/main/java/com/balthazargronon/RCTZeroconf/rx2dnssd/DnssdImpl.java +114 -39
- package/android/src/main/jni/Android.mk +1 -24
- package/android/src/main/jni/Application.mk +1 -1
- package/dist/index.js +244 -27
- package/index.d.ts +95 -9
- package/ios/RNZeroconf/RNNetServiceSerializer.h +10 -2
- package/ios/RNZeroconf/RNNetServiceSerializer.m +51 -59
- package/ios/RNZeroconf/RNZeroconf.h +1 -3
- package/ios/RNZeroconf/RNZeroconf.m +648 -142
- package/package.json +39 -1
- package/react-native-zeroconf.podspec +12 -6
- package/src/index.js +222 -31
- package/android/src/main/java/com/github/druk/dnssd/DNSSDBindable.java +0 -67
- package/android/src/main/java/com/github/druk/rx2dnssd/Rx2DnssdBindable.java +0 -35
- package/android/src/main/jni/mdnsresponder/Android.bp +0 -215
- package/android/src/main/jni/mdnsresponder/Clients/ClientCommon.c +0 -75
- package/android/src/main/jni/mdnsresponder/Clients/ClientCommon.h +0 -41
- package/android/src/main/jni/mdnsresponder/Clients/Makefile +0 -54
- package/android/src/main/jni/mdnsresponder/Clients/ReadMe.txt +0 -25
- package/android/src/main/jni/mdnsresponder/Clients/dns-sd.c +0 -1351
- package/android/src/main/jni/mdnsresponder/Makefile +0 -41
- package/android/src/main/jni/mdnsresponder/PrivateDNS.txt +0 -275
- package/android/src/main/jni/mdnsresponder/android/caseMapping/Iphlpapi.h +0 -1
- package/android/src/main/jni/mdnsresponder/android/caseMapping/README +0 -3
- package/android/src/main/jni/mdnsresponder/android/caseMapping/Resource.h +0 -1
- package/android/src/main/jni/mdnsresponder/android/caseMapping/Ws2tcpip.h +0 -1
- package/android/src/main/jni/mdnsresponder/android/caseMapping/ipExport.h +0 -1
- package/android/src/main/jni/mdnsresponder/android/windows_firewall_dummy.c +0 -10
- package/android/src/main/jni/mdnsresponder/mDNSCore/Implementer Notes.txt +0 -66
- package/android/src/main/jni/mdnsresponder/mDNSPosix/Client.c +0 -223
- package/android/src/main/jni/mdnsresponder/mDNSPosix/ExampleClientApp.c +0 -91
- package/android/src/main/jni/mdnsresponder/mDNSPosix/ExampleClientApp.h +0 -18
- package/android/src/main/jni/mdnsresponder/mDNSPosix/Identify.c +0 -378
- package/android/src/main/jni/mdnsresponder/mDNSPosix/Makefile +0 -520
- package/android/src/main/jni/mdnsresponder/mDNSPosix/NetMonitor.c +0 -1010
- package/android/src/main/jni/mdnsresponder/mDNSPosix/ProxyResponder.c +0 -300
- package/android/src/main/jni/mdnsresponder/mDNSPosix/ReadMe.txt +0 -314
- package/android/src/main/jni/mdnsresponder/mDNSPosix/Responder.c +0 -792
- package/android/src/main/jni/mdnsresponder/mDNSPosix/Services.txt +0 -36
- package/android/src/main/jni/mdnsresponder/mDNSPosix/libnss_mdns.8 +0 -148
- package/android/src/main/jni/mdnsresponder/mDNSPosix/mdnsd.sh +0 -73
- package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_ReadMe.txt +0 -125
- package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.c +0 -2723
- package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.conf +0 -13
- package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.conf.5 +0 -135
- package/android/src/main/jni/mdnsresponder/mDNSPosix/parselog.py +0 -247
- package/android/src/main/jni/mdnsresponder/mDNSResponder.sln +0 -400
- package/android/src/main/jni/mdnsresponder/mDNSShared/DebugServices.c +0 -3075
- package/android/src/main/jni/mdnsresponder/mDNSShared/dns-sd.1 +0 -194
- package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.8 +0 -69
- package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.c +0 -3146
- package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.conf +0 -60
- package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd_lexer.l +0 -84
- package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd_parser.y +0 -585
- package/android/src/main/jni/mdnsresponder/mDNSShared/mDNS.1 +0 -198
- package/android/src/main/jni/mdnsresponder/mDNSShared/mDNSResponder.8 +0 -116
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/BrowsingPage.cpp +0 -441
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/BrowsingPage.h +0 -156
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigDialog.cpp +0 -59
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigDialog.h +0 -48
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigPropertySheet.cpp +0 -301
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigPropertySheet.h +0 -105
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.cpp +0 -380
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.def +0 -20
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.h +0 -84
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.rc +0 -141
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.vcproj +0 -727
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelDll.rc +0 -123
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.cpp +0 -373
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.h +0 -48
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.rc +0 -123
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.vcproj +0 -764
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelLocRes.rc +0 -270
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelLocRes.vcproj +0 -487
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelRes.rc +0 -134
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelRes.vcproj +0 -518
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/FourthPage.cpp +0 -197
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/FourthPage.h +0 -87
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/RegistrationPage.cpp +0 -387
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/RegistrationPage.h +0 -75
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SecondPage.cpp +0 -544
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SecondPage.h +0 -107
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ServicesPage.cpp +0 -273
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ServicesPage.h +0 -123
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SharedSecret.cpp +0 -115
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SharedSecret.h +0 -54
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.dll.manifest +0 -10
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.exe.manifest +0 -17
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.manifest +0 -17
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.rc2 +0 -13
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel64.manifest +0 -17
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/EnergySaver.ico +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/controlpanel.ico +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/failure.ico +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/success.ico +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/resource.h +0 -56
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/stdafx.cpp +0 -20
- package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/stdafx.h +0 -64
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dll.aps +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dll.rc +0 -102
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dllmain.c +0 -112
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dnssd.def +0 -48
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dnssd.vcproj +0 -472
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/resource.h +0 -27
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/AssemblyInfo.cpp +0 -84
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/PString.h +0 -70
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/Stdafx.cpp +0 -22
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/Stdafx.h +0 -33
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.cpp +0 -1234
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.h +0 -1392
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.ico +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.rc +0 -113
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.vcproj +0 -446
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/resource.h +0 -3
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.cpp +0 -693
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.h +0 -52
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.vcproj +0 -324
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.cpp +0 -208
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.def +0 -35
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.idl +0 -491
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.rc +0 -126
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.rgs +0 -11
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.vcproj +0 -625
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSD.cpp +0 -892
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.cpp +0 -31
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.h +0 -133
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.rgs +0 -27
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.cpp +0 -101
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.h +0 -185
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.rgs +0 -27
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.cpp +0 -2095
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.h +0 -429
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.rgs +0 -27
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/StringServices.cpp +0 -344
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/StringServices.h +0 -102
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.cpp +0 -381
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.h +0 -203
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.rgs +0 -27
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/_IDNSSDEvents_CP.h +0 -358
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/dlldatax.c +0 -51
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/dlldatax.h +0 -49
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/resource.h +0 -30
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/stdafx.h +0 -88
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2002.sln +0 -21
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2002.vcproj +0 -253
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2003.sln +0 -21
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2003.vcproj +0 -267
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.ico +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.rc +0 -323
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.rc2 +0 -20
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Resource.h +0 -53
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/AboutDialog.cpp +0 -71
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/AboutDialog.h +0 -62
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/Application.cpp +0 -111
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/Application.h +0 -68
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/ChooserDialog.cpp +0 -1426
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/ChooserDialog.h +0 -131
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/LoginDialog.cpp +0 -109
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/LoginDialog.h +0 -53
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/StdAfx.cpp +0 -18
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/StdAfx.h +0 -48
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcc +0 -37
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcp +0 -868
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcw +0 -29
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.ico +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.rc +0 -194
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.rc2 +0 -13
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/newres.h +0 -28
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/resource.h +0 -22
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/Application.cpp +0 -92
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/Application.h +0 -57
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/BrowserDialog.cpp +0 -394
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/BrowserDialog.h +0 -84
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/StdAfx.cpp +0 -18
- package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/StdAfx.h +0 -46
- package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/Java.vcproj +0 -111
- package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/jdns_sd.rc +0 -62
- package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/makefile +0 -143
- package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/makefile64 +0 -143
- package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.aps +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.c +0 -581
- package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.rc +0 -103
- package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.vcproj +0 -409
- package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/Prefix.h +0 -28
- package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/resource.h +0 -27
- package/android/src/main/jni/mdnsresponder/mDNSWindows/PosixCompat.c +0 -128
- package/android/src/main/jni/mdnsresponder/mDNSWindows/PosixCompat.h +0 -70
- package/android/src/main/jni/mdnsresponder/mDNSWindows/README.txt +0 -85
- package/android/src/main/jni/mdnsresponder/mDNSWindows/RegNames.h +0 -57
- package/android/src/main/jni/mdnsresponder/mDNSWindows/Secret.c +0 -338
- package/android/src/main/jni/mdnsresponder/mDNSWindows/Secret.h +0 -42
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/EventLog.mc +0 -11
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/EventLogMessages.bin +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Firewall.cpp +0 -484
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Firewall.h +0 -79
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Prefix.h +0 -30
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.aps +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.c +0 -2669
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.h +0 -30
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.mcp +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.rc +0 -114
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.vcproj +0 -562
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/main.c +0 -32
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/res/mDNSResponder.manifest +0 -12
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/res/mDNSResponder64.manifest +0 -12
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/resource.h +0 -17
- package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/resrc1.h +0 -15
- package/android/src/main/jni/mdnsresponder/mDNSWindows/VPCDetect.cpp +0 -165
- package/android/src/main/jni/mdnsresponder/mDNSWindows/VPCDetect.h +0 -36
- package/android/src/main/jni/mdnsresponder/mDNSWindows/WinServices.cpp +0 -93
- package/android/src/main/jni/mdnsresponder/mDNSWindows/WinServices.h +0 -34
- package/android/src/main/jni/mdnsresponder/mDNSWindows/WinVersRes.h +0 -35
- package/android/src/main/jni/mdnsresponder/mDNSWindows/isocode.h +0 -135
- package/android/src/main/jni/mdnsresponder/mDNSWindows/loclibrary.c +0 -268
- package/android/src/main/jni/mdnsresponder/mDNSWindows/loclibrary.h +0 -54
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mDNSWin32.c +0 -5200
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mDNSWin32.h +0 -208
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/ReadMe.txt +0 -15
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.aps +0 -0
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.c +0 -2430
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.def +0 -24
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.rc +0 -104
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.vcproj +0 -457
- package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/resource.h +0 -27
- package/android/src/main/jni/mdnsresponder/mdnsd.rc +0 -7
package/dist/index.js
CHANGED
|
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.ImplType = void 0;
|
|
7
|
+
exports.useZeroconf = useZeroconf;
|
|
8
|
+
var _react = require("react");
|
|
7
9
|
var _reactNative = require("react-native");
|
|
8
10
|
var _events = require("events");
|
|
9
11
|
const RNZeroconf = _reactNative.NativeModules.RNZeroconf;
|
|
@@ -11,6 +13,70 @@ const ImplType = exports.ImplType = {
|
|
|
11
13
|
NSD: 'NSD',
|
|
12
14
|
DNSSD: 'DNSSD'
|
|
13
15
|
};
|
|
16
|
+
const SCAN_DEFAULTS = {
|
|
17
|
+
type: 'http',
|
|
18
|
+
protocol: 'tcp',
|
|
19
|
+
domain: 'local.',
|
|
20
|
+
implType: ImplType.NSD,
|
|
21
|
+
resolveTimeout: 5
|
|
22
|
+
};
|
|
23
|
+
const PUBLISH_DEFAULTS = {
|
|
24
|
+
domain: 'local.',
|
|
25
|
+
txt: {},
|
|
26
|
+
implType: ImplType.NSD
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Merge options over defaults, ignoring undefined values
|
|
31
|
+
*/
|
|
32
|
+
const withDefaults = (defaults, options) => {
|
|
33
|
+
const merged = {
|
|
34
|
+
...defaults
|
|
35
|
+
};
|
|
36
|
+
Object.entries(options).forEach(([key, value]) => {
|
|
37
|
+
if (value !== undefined) {
|
|
38
|
+
merged[key] = value;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return merged;
|
|
42
|
+
};
|
|
43
|
+
const isOptionsObject = value => value !== null && typeof value === 'object';
|
|
44
|
+
|
|
45
|
+
// Each instance runs its own scan, identified by this id in native events
|
|
46
|
+
let instanceCount = 0;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Error from a native { message, code, domain, serviceName } payload
|
|
50
|
+
*/
|
|
51
|
+
const toError = payload => {
|
|
52
|
+
if (!payload || typeof payload !== 'object') {
|
|
53
|
+
return new Error(payload);
|
|
54
|
+
}
|
|
55
|
+
const error = new Error(payload.message);
|
|
56
|
+
error.code = payload.code;
|
|
57
|
+
error.domain = payload.domain;
|
|
58
|
+
if (payload.serviceName) {
|
|
59
|
+
error.serviceName = payload.serviceName;
|
|
60
|
+
}
|
|
61
|
+
return error;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Promise rejections carry the same payload as error events in userInfo
|
|
66
|
+
*/
|
|
67
|
+
const toRejection = error => error && error.userInfo && error.userInfo.domain ? toError(error.userInfo) : error;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Normalizes rejections, and marks the promise handled so callers that don't await it
|
|
71
|
+
* don't get unhandled rejection warnings (errors are also emitted as error events)
|
|
72
|
+
*/
|
|
73
|
+
const asPromise = nativePromise => {
|
|
74
|
+
const promise = Promise.resolve(nativePromise).catch(error => {
|
|
75
|
+
throw toRejection(error);
|
|
76
|
+
});
|
|
77
|
+
promise.catch(() => {});
|
|
78
|
+
return promise;
|
|
79
|
+
};
|
|
14
80
|
const isIPv6 = address => address.includes(':');
|
|
15
81
|
|
|
16
82
|
/**
|
|
@@ -45,6 +111,8 @@ class Zeroconf extends _events.EventEmitter {
|
|
|
45
111
|
this._publishedServices = {};
|
|
46
112
|
this._publishedImplTypes = {};
|
|
47
113
|
this._scanImplType = null;
|
|
114
|
+
this._scanId = `zeroconf-${++instanceCount}`;
|
|
115
|
+
this._hasScanned = false;
|
|
48
116
|
this._dListeners = {};
|
|
49
117
|
this.addDeviceListeners();
|
|
50
118
|
}
|
|
@@ -56,26 +124,36 @@ class Zeroconf extends _events.EventEmitter {
|
|
|
56
124
|
if (Object.keys(this._dListeners).length) {
|
|
57
125
|
return this.emit('error', new Error('RNZeroconf listeners already in place.'));
|
|
58
126
|
}
|
|
59
|
-
this._dListeners.start = _reactNative.DeviceEventEmitter.addListener('RNZeroconfStart',
|
|
60
|
-
|
|
127
|
+
this._dListeners.start = _reactNative.DeviceEventEmitter.addListener('RNZeroconfStart', payload => {
|
|
128
|
+
if (this._isOwnEvent(payload)) {
|
|
129
|
+
this.emit('start');
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
this._dListeners.stop = _reactNative.DeviceEventEmitter.addListener('RNZeroconfStop', payload => {
|
|
133
|
+
if (this._isOwnEvent(payload)) {
|
|
134
|
+
this.emit('stop');
|
|
135
|
+
}
|
|
136
|
+
});
|
|
61
137
|
this._dListeners.error = _reactNative.DeviceEventEmitter.addListener('RNZeroconfError', err => {
|
|
62
|
-
if (this.listenerCount('error') > 0) {
|
|
63
|
-
this.emit('error',
|
|
138
|
+
if (this._isOwnEvent(err) && this.listenerCount('error') > 0) {
|
|
139
|
+
this.emit('error', toError(err));
|
|
64
140
|
}
|
|
65
141
|
});
|
|
66
142
|
this._dListeners.found = _reactNative.DeviceEventEmitter.addListener('RNZeroconfFound', service => {
|
|
67
|
-
if (!service || !service.name) {
|
|
143
|
+
if (!service || !service.name || !this._isOwnEvent(service)) {
|
|
68
144
|
return;
|
|
69
145
|
}
|
|
70
146
|
const {
|
|
71
147
|
name
|
|
72
148
|
} = service;
|
|
73
|
-
this._services[name] =
|
|
149
|
+
this._services[name] = {
|
|
150
|
+
name
|
|
151
|
+
};
|
|
74
152
|
this.emit('found', name);
|
|
75
153
|
this.emit('update');
|
|
76
154
|
});
|
|
77
155
|
this._dListeners.remove = _reactNative.DeviceEventEmitter.addListener('RNZeroconfRemove', service => {
|
|
78
|
-
if (!service || !service.name) {
|
|
156
|
+
if (!service || !service.name || !this._isOwnEvent(service)) {
|
|
79
157
|
return;
|
|
80
158
|
}
|
|
81
159
|
const {
|
|
@@ -86,10 +164,14 @@ class Zeroconf extends _events.EventEmitter {
|
|
|
86
164
|
this.emit('update');
|
|
87
165
|
});
|
|
88
166
|
this._dListeners.resolved = _reactNative.DeviceEventEmitter.addListener('RNZeroconfResolved', data => {
|
|
89
|
-
if (!data || !data.name) {
|
|
167
|
+
if (!data || !data.name || !this._isOwnEvent(data)) {
|
|
90
168
|
return;
|
|
91
169
|
}
|
|
92
|
-
const
|
|
170
|
+
const resolved = {
|
|
171
|
+
...data
|
|
172
|
+
};
|
|
173
|
+
delete resolved.scanId;
|
|
174
|
+
const service = withAddressFamilies(resolved);
|
|
93
175
|
this._services[service.name] = service;
|
|
94
176
|
this.emit('resolved', service);
|
|
95
177
|
this.emit('update');
|
|
@@ -110,6 +192,25 @@ class Zeroconf extends _events.EventEmitter {
|
|
|
110
192
|
});
|
|
111
193
|
}
|
|
112
194
|
|
|
195
|
+
/**
|
|
196
|
+
* Add a listener and get a function that removes it, handy in useEffect cleanups
|
|
197
|
+
*/
|
|
198
|
+
subscribe(event, listener) {
|
|
199
|
+
this.on(event, listener);
|
|
200
|
+
return () => this.removeListener(event, listener);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Scan events belong to the instance that started the scan. Instances that never scanned still receive
|
|
205
|
+
* every scan's events, as before multiple scans, and events without a scan id (publishing) go to everyone.
|
|
206
|
+
*/
|
|
207
|
+
_isOwnEvent(payload) {
|
|
208
|
+
if (!payload || typeof payload !== 'object' || payload.scanId == null || !this._hasScanned) {
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
return payload.scanId === this._scanId;
|
|
212
|
+
}
|
|
213
|
+
|
|
113
214
|
/**
|
|
114
215
|
* Remove all event listeners and clean map
|
|
115
216
|
*/
|
|
@@ -126,21 +227,36 @@ class Zeroconf extends _events.EventEmitter {
|
|
|
126
227
|
}
|
|
127
228
|
|
|
128
229
|
/**
|
|
129
|
-
* Scan for Zeroconf services,
|
|
130
|
-
*
|
|
230
|
+
* Scan for Zeroconf services, defaults to _http._tcp. on the local. domain
|
|
231
|
+
*
|
|
232
|
+
* scan({ type, protocol, domain, implType, resolveTimeout })
|
|
233
|
+
* scan(type, protocol, domain, implType) is deprecated
|
|
131
234
|
*/
|
|
132
|
-
scan(
|
|
235
|
+
scan(options, protocolArg, domainArg, implTypeArg) {
|
|
236
|
+
const {
|
|
237
|
+
type,
|
|
238
|
+
protocol,
|
|
239
|
+
domain,
|
|
240
|
+
implType,
|
|
241
|
+
resolveTimeout
|
|
242
|
+
} = withDefaults(SCAN_DEFAULTS, isOptionsObject(options) ? options : {
|
|
243
|
+
type: options,
|
|
244
|
+
protocol: protocolArg,
|
|
245
|
+
domain: domainArg,
|
|
246
|
+
implType: implTypeArg
|
|
247
|
+
});
|
|
133
248
|
this._services = {};
|
|
249
|
+
this._hasScanned = true;
|
|
134
250
|
this.emit('update');
|
|
135
251
|
if (_reactNative.Platform.OS === 'android') {
|
|
136
252
|
if (this._scanImplType && implType !== this._scanImplType) {
|
|
137
|
-
//
|
|
138
|
-
RNZeroconf.stop(this._scanImplType);
|
|
253
|
+
// This instance's scan moves to the other implementation
|
|
254
|
+
RNZeroconf.stop(this._scanId, this._scanImplType);
|
|
139
255
|
}
|
|
140
256
|
this._scanImplType = implType;
|
|
141
|
-
RNZeroconf.scan(type, protocol, domain, implType);
|
|
257
|
+
RNZeroconf.scan(this._scanId, type, protocol, domain, implType);
|
|
142
258
|
} else {
|
|
143
|
-
RNZeroconf.scan(type, protocol, domain);
|
|
259
|
+
RNZeroconf.scan(this._scanId, type, protocol, domain, resolveTimeout);
|
|
144
260
|
}
|
|
145
261
|
}
|
|
146
262
|
|
|
@@ -150,36 +266,137 @@ class Zeroconf extends _events.EventEmitter {
|
|
|
150
266
|
*/
|
|
151
267
|
stop(implType = this._scanImplType || ImplType.NSD) {
|
|
152
268
|
if (_reactNative.Platform.OS === 'android') {
|
|
153
|
-
RNZeroconf.stop(implType);
|
|
269
|
+
RNZeroconf.stop(this._scanId, implType);
|
|
154
270
|
} else {
|
|
155
|
-
RNZeroconf.stop();
|
|
271
|
+
RNZeroconf.stop(this._scanId);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Checks the iOS Local Network permission, resolves 'granted', 'denied' or 'unknown'.
|
|
277
|
+
* Uses a service type from NSBonjourServices (the first one by default) and can show the permission prompt.
|
|
278
|
+
* Android has no equivalent permission to check and resolves 'unknown'.
|
|
279
|
+
*/
|
|
280
|
+
checkLocalNetworkAccess({
|
|
281
|
+
type,
|
|
282
|
+
protocol = 'tcp',
|
|
283
|
+
timeout = 5
|
|
284
|
+
} = {}) {
|
|
285
|
+
if (_reactNative.Platform.OS === 'android') {
|
|
286
|
+
return Promise.resolve('unknown');
|
|
156
287
|
}
|
|
288
|
+
const serviceType = type ? `_${type}._${protocol}` : null;
|
|
289
|
+
return asPromise(RNZeroconf.checkLocalNetworkAccess(serviceType, timeout));
|
|
157
290
|
}
|
|
158
291
|
|
|
159
292
|
/**
|
|
160
|
-
* Publish a service
|
|
293
|
+
* Publish a service, resolves with the published service once it is advertised.
|
|
294
|
+
* Its name can differ from the requested one when that name is already taken.
|
|
295
|
+
*
|
|
296
|
+
* publishService({ type, protocol, domain, name, port, txt, implType })
|
|
297
|
+
* publishService(type, protocol, domain, name, port, txt, implType) is deprecated
|
|
161
298
|
*/
|
|
162
|
-
publishService(
|
|
299
|
+
publishService(options, protocolArg, domainArg, nameArg, portArg, txtArg, implTypeArg) {
|
|
300
|
+
const {
|
|
301
|
+
type,
|
|
302
|
+
protocol,
|
|
303
|
+
domain,
|
|
304
|
+
name,
|
|
305
|
+
port,
|
|
306
|
+
txt,
|
|
307
|
+
implType
|
|
308
|
+
} = withDefaults(PUBLISH_DEFAULTS, isOptionsObject(options) ? options : {
|
|
309
|
+
type: options,
|
|
310
|
+
protocol: protocolArg,
|
|
311
|
+
domain: domainArg,
|
|
312
|
+
name: nameArg,
|
|
313
|
+
port: portArg,
|
|
314
|
+
txt: txtArg,
|
|
315
|
+
implType: implTypeArg
|
|
316
|
+
});
|
|
163
317
|
const txtRecord = toTxtPairs(txt);
|
|
164
318
|
if (_reactNative.Platform.OS === 'android') {
|
|
165
319
|
this._publishedImplTypes[name] = implType;
|
|
166
|
-
RNZeroconf.registerService(type, protocol, domain, name, port, txtRecord, implType);
|
|
167
|
-
} else {
|
|
168
|
-
RNZeroconf.registerService(type, protocol, domain, name, port, txtRecord);
|
|
320
|
+
return asPromise(RNZeroconf.registerService(type, protocol, domain, name, port, txtRecord, implType));
|
|
169
321
|
}
|
|
322
|
+
return asPromise(RNZeroconf.registerService(type, protocol, domain, name, port, txtRecord));
|
|
170
323
|
}
|
|
171
324
|
|
|
172
325
|
/**
|
|
173
|
-
* Unpublish a service,
|
|
326
|
+
* Unpublish a service, resolves once it is no longer advertised.
|
|
174
327
|
* Defaults to the implementation the service was published with
|
|
175
328
|
*/
|
|
176
329
|
unpublishService(name, implType = this._publishedImplTypes[name] || ImplType.NSD) {
|
|
177
330
|
if (_reactNative.Platform.OS === 'android') {
|
|
178
331
|
delete this._publishedImplTypes[name];
|
|
179
|
-
RNZeroconf.unregisterService(name, implType);
|
|
180
|
-
} else {
|
|
181
|
-
RNZeroconf.unregisterService(name);
|
|
332
|
+
return asPromise(RNZeroconf.unregisterService(name, implType));
|
|
182
333
|
}
|
|
334
|
+
return asPromise(RNZeroconf.unregisterService(name));
|
|
183
335
|
}
|
|
184
336
|
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Scans while mounted and returns the resolved services.
|
|
340
|
+
* Scans again when the options change, stops and cleans up on unmount.
|
|
341
|
+
* Each hook runs its own scan, several can run at once.
|
|
342
|
+
*
|
|
343
|
+
* const { services, isScanning, error, stop, restart } = useZeroconf({ type: 'http' })
|
|
344
|
+
*/
|
|
185
345
|
exports.default = Zeroconf;
|
|
346
|
+
function useZeroconf(options = {}) {
|
|
347
|
+
const {
|
|
348
|
+
type,
|
|
349
|
+
protocol,
|
|
350
|
+
domain,
|
|
351
|
+
implType,
|
|
352
|
+
resolveTimeout,
|
|
353
|
+
enabled = true
|
|
354
|
+
} = options;
|
|
355
|
+
const zeroconfRef = (0, _react.useRef)(null);
|
|
356
|
+
const [services, setServices] = (0, _react.useState)([]);
|
|
357
|
+
const [isScanning, setIsScanning] = (0, _react.useState)(false);
|
|
358
|
+
const [error, setError] = (0, _react.useState)(null);
|
|
359
|
+
const [scanCount, setScanCount] = (0, _react.useState)(0);
|
|
360
|
+
(0, _react.useEffect)(() => {
|
|
361
|
+
const zeroconf = new Zeroconf();
|
|
362
|
+
zeroconfRef.current = zeroconf;
|
|
363
|
+
// Found services only have a name until they are resolved
|
|
364
|
+
const updateServices = () => setServices(Object.values(zeroconf.getServices()).filter(service => service.addresses));
|
|
365
|
+
const unsubscribes = [zeroconf.subscribe('start', () => setIsScanning(true)), zeroconf.subscribe('stop', () => setIsScanning(false)), zeroconf.subscribe('update', updateServices), zeroconf.subscribe('error', setError)];
|
|
366
|
+
return () => {
|
|
367
|
+
unsubscribes.forEach(unsubscribe => unsubscribe());
|
|
368
|
+
zeroconf.stop();
|
|
369
|
+
zeroconf.removeDeviceListeners();
|
|
370
|
+
zeroconfRef.current = null;
|
|
371
|
+
};
|
|
372
|
+
}, []);
|
|
373
|
+
(0, _react.useEffect)(() => {
|
|
374
|
+
const zeroconf = zeroconfRef.current;
|
|
375
|
+
if (!zeroconf || !enabled) {
|
|
376
|
+
return undefined;
|
|
377
|
+
}
|
|
378
|
+
setServices([]);
|
|
379
|
+
setError(null);
|
|
380
|
+
zeroconf.scan({
|
|
381
|
+
type,
|
|
382
|
+
protocol,
|
|
383
|
+
domain,
|
|
384
|
+
implType,
|
|
385
|
+
resolveTimeout
|
|
386
|
+
});
|
|
387
|
+
return () => zeroconf.stop();
|
|
388
|
+
}, [enabled, type, protocol, domain, implType, resolveTimeout, scanCount]);
|
|
389
|
+
const stop = (0, _react.useCallback)(() => {
|
|
390
|
+
if (zeroconfRef.current) {
|
|
391
|
+
zeroconfRef.current.stop();
|
|
392
|
+
}
|
|
393
|
+
}, []);
|
|
394
|
+
const restart = (0, _react.useCallback)(() => setScanCount(count => count + 1), []);
|
|
395
|
+
return {
|
|
396
|
+
services,
|
|
397
|
+
isScanning,
|
|
398
|
+
error,
|
|
399
|
+
stop,
|
|
400
|
+
restart
|
|
401
|
+
};
|
|
402
|
+
}
|
package/index.d.ts
CHANGED
|
@@ -27,6 +27,58 @@ type TxtValue = string | number | boolean
|
|
|
27
27
|
/** TXT records as an object, or as [key, value] pairs to control the order */
|
|
28
28
|
export type TxtRecord = Record<string, TxtValue> | Array<[string, TxtValue]>
|
|
29
29
|
|
|
30
|
+
export interface ScanOptions {
|
|
31
|
+
/** Service type without underscore, e.g. `'http'`. Defaults to `'http'` */
|
|
32
|
+
type?: string
|
|
33
|
+
/** `'tcp'` or `'udp'`. Defaults to `'tcp'` */
|
|
34
|
+
protocol?: string
|
|
35
|
+
/** Defaults to `'local.'` */
|
|
36
|
+
domain?: string
|
|
37
|
+
/** Android only, defaults to `NSD` */
|
|
38
|
+
implType?: ImplType
|
|
39
|
+
/** iOS only, seconds to try resolving a service before retrying once and giving up. Defaults to `5` */
|
|
40
|
+
resolveTimeout?: number
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface PublishOptions {
|
|
44
|
+
/** Service type without underscore, e.g. `'http'` */
|
|
45
|
+
type: string
|
|
46
|
+
/** `'tcp'` or `'udp'` */
|
|
47
|
+
protocol: string
|
|
48
|
+
/** Defaults to `'local.'` */
|
|
49
|
+
domain?: string
|
|
50
|
+
/** Service name, should be unique on the network */
|
|
51
|
+
name: string
|
|
52
|
+
port: number
|
|
53
|
+
txt?: TxtRecord
|
|
54
|
+
/** Android only, defaults to `NSD` */
|
|
55
|
+
implType?: ImplType
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Errors emitted by the `error` event
|
|
60
|
+
*
|
|
61
|
+
* - `DNSSD`: DNSServiceErrorType, on iOS and from Android's embedded mDNSResponder,
|
|
62
|
+
* e.g. `-65555` type missing from NSBonjourServices, `-65570` Local Network access denied
|
|
63
|
+
* - `NsdManager`: Android NsdManager failure code
|
|
64
|
+
* - `RNZeroconf`: the library's own errors, e.g. `'EXCEPTION'`
|
|
65
|
+
*/
|
|
66
|
+
export interface ZeroconfError extends Error {
|
|
67
|
+
code: number | string
|
|
68
|
+
domain: 'DNSSD' | 'NsdManager' | 'RNZeroconf'
|
|
69
|
+
/** The service the error is about, when there is one */
|
|
70
|
+
serviceName?: string
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface LocalNetworkAccessOptions {
|
|
74
|
+
/** Service type without underscore, must be listed in `NSBonjourServices`. Defaults to the first one listed */
|
|
75
|
+
type?: string
|
|
76
|
+
/** Defaults to `'tcp'` */
|
|
77
|
+
protocol?: string
|
|
78
|
+
/** Seconds to wait for an answer, defaults to `5` */
|
|
79
|
+
timeout?: number
|
|
80
|
+
}
|
|
81
|
+
|
|
30
82
|
/** Published services don't carry the address family fields */
|
|
31
83
|
export type PublishedService = Omit<Service, 'ipv4' | 'ipv6'>
|
|
32
84
|
|
|
@@ -41,7 +93,7 @@ export interface ZeroconfEvents {
|
|
|
41
93
|
remove: (name: string) => void
|
|
42
94
|
/** Services list changed */
|
|
43
95
|
update: () => void
|
|
44
|
-
error: (error:
|
|
96
|
+
error: (error: ZeroconfError) => void
|
|
45
97
|
published: (service: PublishedService) => void
|
|
46
98
|
unpublished: (service: PublishedService) => void
|
|
47
99
|
}
|
|
@@ -56,6 +108,8 @@ export default class Zeroconf {
|
|
|
56
108
|
removeListener<E extends keyof ZeroconfEvents>(event: E, listener: ZeroconfEvents[E]): this
|
|
57
109
|
off<E extends keyof ZeroconfEvents>(event: E, listener: ZeroconfEvents[E]): this
|
|
58
110
|
removeAllListeners(event?: keyof ZeroconfEvents): this
|
|
111
|
+
/** Adds a listener and returns a function that removes it */
|
|
112
|
+
subscribe<E extends keyof ZeroconfEvents>(event: E, listener: ZeroconfEvents[E]): () => void
|
|
59
113
|
listenerCount(event: keyof ZeroconfEvents): number
|
|
60
114
|
|
|
61
115
|
/** Add the native event listeners (called automatically in the constructor) */
|
|
@@ -67,11 +121,18 @@ export default class Zeroconf {
|
|
|
67
121
|
/** All the services found so far, keyed by name */
|
|
68
122
|
getServices(): Record<string, Service>
|
|
69
123
|
|
|
124
|
+
/** Scan for services, defaults to `_http._tcp.` on the `local.` domain */
|
|
125
|
+
scan(options?: ScanOptions): void
|
|
126
|
+
/** @deprecated Use `scan({ type, protocol, domain, implType })` */
|
|
127
|
+
scan(type?: string, protocol?: string, domain?: string, implType?: ImplType): void
|
|
128
|
+
|
|
70
129
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
130
|
+
* Checks the iOS Local Network permission. Can show the permission prompt when it hasn't been answered yet.
|
|
131
|
+
* Resolves `'unknown'` on Android, which has no equivalent permission to check.
|
|
73
132
|
*/
|
|
74
|
-
|
|
133
|
+
checkLocalNetworkAccess(
|
|
134
|
+
options?: LocalNetworkAccessOptions,
|
|
135
|
+
): Promise<'granted' | 'denied' | 'unknown'>
|
|
75
136
|
|
|
76
137
|
/**
|
|
77
138
|
* Stop the current scan
|
|
@@ -80,9 +141,11 @@ export default class Zeroconf {
|
|
|
80
141
|
stop(implType?: ImplType): void
|
|
81
142
|
|
|
82
143
|
/**
|
|
83
|
-
* Publish a service.
|
|
84
|
-
*
|
|
144
|
+
* Publish a service. Resolves with the published service once it is advertised, its name can differ
|
|
145
|
+
* from the requested one when that name is already taken. Rejects with a `ZeroconfError`.
|
|
85
146
|
*/
|
|
147
|
+
publishService(options: PublishOptions): Promise<PublishedService>
|
|
148
|
+
/** @deprecated Use `publishService({ type, protocol, domain, name, port, txt, implType })` */
|
|
86
149
|
publishService(
|
|
87
150
|
type: string,
|
|
88
151
|
protocol: string,
|
|
@@ -91,11 +154,34 @@ export default class Zeroconf {
|
|
|
91
154
|
port: number,
|
|
92
155
|
txt?: TxtRecord,
|
|
93
156
|
implType?: ImplType,
|
|
94
|
-
):
|
|
157
|
+
): Promise<PublishedService>
|
|
95
158
|
|
|
96
159
|
/**
|
|
97
|
-
* Unpublish a service
|
|
160
|
+
* Unpublish a service. Resolves once it is no longer advertised, rejects with a `ZeroconfError`
|
|
161
|
+
* (e.g. code `'NOT_PUBLISHED'`).
|
|
98
162
|
* @param implType Android only, defaults to the implementation the service was published with
|
|
99
163
|
*/
|
|
100
|
-
unpublishService(name: string, implType?: ImplType):
|
|
164
|
+
unpublishService(name: string, implType?: ImplType): Promise<PublishedService | null>
|
|
101
165
|
}
|
|
166
|
+
|
|
167
|
+
export interface UseZeroconfOptions extends ScanOptions {
|
|
168
|
+
/** Scan only while true, defaults to `true` */
|
|
169
|
+
enabled?: boolean
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface UseZeroconfResult {
|
|
173
|
+
/** Resolved services, updated as they are found, resolved and removed */
|
|
174
|
+
services: Service[]
|
|
175
|
+
isScanning: boolean
|
|
176
|
+
/** Last error, reset when a new scan starts */
|
|
177
|
+
error: ZeroconfError | null
|
|
178
|
+
stop(): void
|
|
179
|
+
/** Clears the services and scans again */
|
|
180
|
+
restart(): void
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Scans while mounted and returns the resolved services. Scans again when the options change,
|
|
185
|
+
* stops and cleans up on unmount. Each hook runs its own scan, several can run at once.
|
|
186
|
+
*/
|
|
187
|
+
export function useZeroconf(options?: UseZeroconfOptions): UseZeroconfResult
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
//
|
|
8
8
|
|
|
9
9
|
#import <Foundation/Foundation.h>
|
|
10
|
+
#include <sys/socket.h>
|
|
10
11
|
|
|
11
12
|
FOUNDATION_EXPORT const NSString *kRNServiceKeysName;
|
|
12
13
|
FOUNDATION_EXPORT const NSString *kRNServiceKeysFullName;
|
|
@@ -15,9 +16,16 @@ FOUNDATION_EXPORT const NSString *kRNServiceKeysHost;
|
|
|
15
16
|
FOUNDATION_EXPORT const NSString *kRNServiceKeysPort;
|
|
16
17
|
FOUNDATION_EXPORT const NSString *kRNServiceTxtRecords;
|
|
17
18
|
|
|
19
|
+
// Converts dns_sd results to the service dictionaries sent to JS
|
|
18
20
|
@interface RNNetServiceSerializer : NSObject
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
// "192.168.1.2" or "fe80::1", nil for other address families
|
|
23
|
+
+ (NSString *) stringFromAddress:(const struct sockaddr *)address;
|
|
24
|
+
|
|
25
|
+
// TXT record bytes to { key: value }, values decoded as UTF-8 (Latin-1 when not valid UTF-8)
|
|
26
|
+
+ (NSDictionary<NSString *, NSString *> *) dictionaryFromTXTRecord:(const void *)record length:(uint16_t)length;
|
|
27
|
+
|
|
28
|
+
// Ordered [key, value] pairs to TXT record bytes, keys of entries longer than 255 bytes are skipped and added to tooLong
|
|
29
|
+
+ (NSData *) TXTRecordFromPairs:(NSArray<NSArray<NSString *> *> *)pairs tooLong:(NSMutableArray<NSString *> *)tooLong;
|
|
22
30
|
|
|
23
31
|
@end
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
#import "RNNetServiceSerializer.h"
|
|
10
10
|
#include <arpa/inet.h>
|
|
11
|
+
#include <dns_sd.h>
|
|
11
12
|
|
|
12
13
|
const NSString *kRNServiceKeysName = @"name";
|
|
13
14
|
const NSString *kRNServiceKeysFullName = @"fullName";
|
|
@@ -18,75 +19,66 @@ const NSString *kRNServiceTxtRecords = @"txt";
|
|
|
18
19
|
|
|
19
20
|
@implementation RNNetServiceSerializer
|
|
20
21
|
|
|
21
|
-
+ (
|
|
22
|
-
resolved:(BOOL)resolved
|
|
22
|
+
+ (NSString *) stringFromAddress:(const struct sockaddr *)address
|
|
23
23
|
{
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (resolved) {
|
|
28
|
-
serviceInfo[kRNServiceKeysFullName] = [NSString stringWithFormat:@"%@%@", service.hostName, service.type];
|
|
29
|
-
serviceInfo[kRNServiceKeysAddresses] = [self addressesFromService:service];
|
|
30
|
-
serviceInfo[kRNServiceKeysHost] = service.hostName;
|
|
31
|
-
serviceInfo[kRNServiceKeysPort] = @(service.port);
|
|
32
|
-
|
|
33
|
-
NSDictionary<NSString *, NSData *> *txtRecordDict = [NSNetService dictionaryFromTXTRecordData:service.TXTRecordData];
|
|
34
|
-
|
|
35
|
-
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
|
|
36
|
-
for (NSString *key in txtRecordDict) {
|
|
37
|
-
@try{
|
|
38
|
-
NSData *value = txtRecordDict[key];
|
|
39
|
-
NSString *string = [[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding];
|
|
40
|
-
if (string == nil) {
|
|
41
|
-
// Not valid UTF-8, fall back to a lossless 8-bit decoding
|
|
42
|
-
string = [[NSString alloc] initWithData:value encoding:NSISOLatin1StringEncoding];
|
|
43
|
-
}
|
|
44
|
-
dict[key] = string;
|
|
45
|
-
}
|
|
46
|
-
@catch(NSException *exception){
|
|
47
|
-
NSLog(@"%@", exception);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
serviceInfo[kRNServiceTxtRecords] = dict;
|
|
24
|
+
if (address == NULL) {
|
|
25
|
+
return nil;
|
|
51
26
|
}
|
|
52
27
|
|
|
53
|
-
|
|
28
|
+
char buffer[INET6_ADDRSTRLEN];
|
|
29
|
+
const char *result = NULL;
|
|
30
|
+
if (address->sa_family == AF_INET) {
|
|
31
|
+
result = inet_ntop(AF_INET, &((const struct sockaddr_in *)address)->sin_addr, buffer, sizeof(buffer));
|
|
32
|
+
} else if (address->sa_family == AF_INET6) {
|
|
33
|
+
result = inet_ntop(AF_INET6, &((const struct sockaddr_in6 *)address)->sin6_addr, buffer, sizeof(buffer));
|
|
34
|
+
}
|
|
35
|
+
return result ? [NSString stringWithUTF8String:result] : nil;
|
|
54
36
|
}
|
|
55
37
|
|
|
56
|
-
+ (
|
|
38
|
+
+ (NSDictionary<NSString *, NSString *> *) dictionaryFromTXTRecord:(const void *)record length:(uint16_t)length
|
|
57
39
|
{
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
struct sockaddr sa;
|
|
68
|
-
struct sockaddr_in ipv4;
|
|
69
|
-
struct sockaddr_in6 ipv6;
|
|
70
|
-
} ip_socket_address;
|
|
71
|
-
|
|
72
|
-
ip_socket_address *socketAddress = (ip_socket_address *)[data bytes];
|
|
73
|
-
|
|
74
|
-
if (socketAddress && (socketAddress->sa.sa_family == AF_INET || socketAddress->sa.sa_family == AF_INET6)) {
|
|
75
|
-
const char *addressStr = inet_ntop(
|
|
76
|
-
socketAddress->sa.sa_family,
|
|
77
|
-
(socketAddress->sa.sa_family == AF_INET ? (void *)&(socketAddress->ipv4.sin_addr) : (void *)&(socketAddress->ipv6.sin6_addr)),
|
|
78
|
-
addressBuffer,
|
|
79
|
-
sizeof(addressBuffer)
|
|
80
|
-
);
|
|
40
|
+
NSMutableDictionary *txt = [[NSMutableDictionary alloc] init];
|
|
41
|
+
uint16_t count = TXTRecordGetCount(length, record);
|
|
42
|
+
for (uint16_t i = 0; i < count; i++) {
|
|
43
|
+
char key[256];
|
|
44
|
+
uint8_t valueLength = 0;
|
|
45
|
+
const void *value = NULL;
|
|
46
|
+
if (TXTRecordGetItemAtIndex(length, record, i, sizeof(key), key, &valueLength, &value) != kDNSServiceErr_NoError || key[0] == '\0') {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
81
49
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
50
|
+
NSString *string = @"";
|
|
51
|
+
if (value != NULL && valueLength > 0) {
|
|
52
|
+
NSData *data = [NSData dataWithBytes:value length:valueLength];
|
|
53
|
+
string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]
|
|
54
|
+
?: [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding]
|
|
55
|
+
?: @"";
|
|
56
|
+
}
|
|
57
|
+
NSString *keyString = [NSString stringWithUTF8String:key];
|
|
58
|
+
if (keyString) {
|
|
59
|
+
txt[keyString] = string;
|
|
86
60
|
}
|
|
87
61
|
}
|
|
62
|
+
return txt;
|
|
63
|
+
}
|
|
88
64
|
|
|
89
|
-
|
|
65
|
+
+ (NSData *) TXTRecordFromPairs:(NSArray<NSArray<NSString *> *> *)pairs tooLong:(NSMutableArray<NSString *> *)tooLong
|
|
66
|
+
{
|
|
67
|
+
NSMutableData *data = [NSMutableData data];
|
|
68
|
+
for (NSArray<NSString *> *pair in pairs) {
|
|
69
|
+
if (pair.count != 2) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
NSData *entry = [[NSString stringWithFormat:@"%@=%@", pair[0], pair[1]] dataUsingEncoding:NSUTF8StringEncoding];
|
|
73
|
+
if (entry.length > 255) {
|
|
74
|
+
[tooLong addObject:pair[0]];
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
uint8_t entryLength = (uint8_t)entry.length;
|
|
78
|
+
[data appendBytes:&entryLength length:1];
|
|
79
|
+
[data appendData:entry];
|
|
80
|
+
}
|
|
81
|
+
return data;
|
|
90
82
|
}
|
|
91
83
|
|
|
92
84
|
@end
|
|
@@ -12,8 +12,6 @@
|
|
|
12
12
|
#import <React/RCTEventDispatcher.h>
|
|
13
13
|
#import <React/RCTInvalidating.h>
|
|
14
14
|
|
|
15
|
-
@interface RNZeroconf : NSObject <RCTBridgeModule, RCTInvalidating
|
|
16
|
-
|
|
17
|
-
@property (nonatomic, strong) NSNetServiceBrowser *browser;
|
|
15
|
+
@interface RNZeroconf : NSObject <RCTBridgeModule, RCTInvalidating>
|
|
18
16
|
|
|
19
17
|
@end
|