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
|
@@ -8,35 +8,136 @@
|
|
|
8
8
|
|
|
9
9
|
#import "RNZeroconf.h"
|
|
10
10
|
#import "RNNetServiceSerializer.h"
|
|
11
|
+
#import <Network/Network.h>
|
|
12
|
+
#import <dns_sd.h>
|
|
13
|
+
|
|
14
|
+
// dns_sd callbacks are delivered on the main queue, and refs must be deallocated on it
|
|
15
|
+
#define RNZ_QUEUE dispatch_get_main_queue()
|
|
16
|
+
|
|
17
|
+
#pragma mark - State
|
|
18
|
+
|
|
19
|
+
@class RNZScan;
|
|
20
|
+
|
|
21
|
+
// A found service being resolved: DNSServiceResolve for host, port and TXT, then DNSServiceGetAddrInfo for addresses
|
|
22
|
+
@interface RNZResolve : NSObject
|
|
23
|
+
@property (nonatomic, weak) RNZeroconf *module;
|
|
24
|
+
@property (nonatomic, weak) RNZScan *scan;
|
|
25
|
+
@property (nonatomic, copy) NSString *name;
|
|
26
|
+
@property (nonatomic, copy) NSString *regtype;
|
|
27
|
+
@property (nonatomic, copy) NSString *domain;
|
|
28
|
+
@property (nonatomic, assign) DNSServiceRef resolveRef;
|
|
29
|
+
@property (nonatomic, assign) DNSServiceRef addressRef;
|
|
30
|
+
@property (nonatomic, copy) NSString *host;
|
|
31
|
+
@property (nonatomic, assign) uint16_t port;
|
|
32
|
+
@property (nonatomic, strong) NSDictionary *txt;
|
|
33
|
+
@property (nonatomic, strong) NSMutableOrderedSet<NSString *> *addresses;
|
|
34
|
+
@property (nonatomic, assign) BOOL retried;
|
|
35
|
+
@property (nonatomic, assign) BOOL finished;
|
|
36
|
+
@property (nonatomic, strong) dispatch_block_t timeoutBlock;
|
|
37
|
+
@property (nonatomic, strong) dispatch_block_t emitBlock;
|
|
38
|
+
@end
|
|
39
|
+
|
|
40
|
+
@implementation RNZResolve
|
|
41
|
+
@end
|
|
42
|
+
|
|
43
|
+
// One browse, keyed by the id of the JS instance that started it, several can run at once
|
|
44
|
+
@interface RNZScan : NSObject
|
|
45
|
+
@property (nonatomic, weak) RNZeroconf *module;
|
|
46
|
+
@property (nonatomic, copy) NSString *scanId;
|
|
47
|
+
@property (nonatomic, assign) DNSServiceRef browseRef;
|
|
48
|
+
@property (nonatomic, assign) NSTimeInterval resolveTimeoutSeconds;
|
|
49
|
+
// Services are reported once per network interface, count them so found/remove are emitted once
|
|
50
|
+
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *foundInterfaces;
|
|
51
|
+
@property (nonatomic, strong) NSMutableDictionary<NSString *, RNZResolve *> *resolvingServices;
|
|
52
|
+
@end
|
|
53
|
+
|
|
54
|
+
@implementation RNZScan
|
|
55
|
+
@end
|
|
56
|
+
|
|
57
|
+
// A service registered with DNSServiceRegister
|
|
58
|
+
@interface RNZPublication : NSObject
|
|
59
|
+
@property (nonatomic, weak) RNZeroconf *module;
|
|
60
|
+
@property (nonatomic, copy) NSString *name;
|
|
61
|
+
@property (nonatomic, copy) NSString *regtype;
|
|
62
|
+
@property (nonatomic, copy) NSString *domain;
|
|
63
|
+
@property (nonatomic, assign) uint16_t port;
|
|
64
|
+
@property (nonatomic, strong) NSDictionary *txt;
|
|
65
|
+
@property (nonatomic, assign) DNSServiceRef ref;
|
|
66
|
+
@property (nonatomic, copy) RCTPromiseResolveBlock resolve;
|
|
67
|
+
@property (nonatomic, copy) RCTPromiseRejectBlock reject;
|
|
68
|
+
@end
|
|
69
|
+
|
|
70
|
+
@implementation RNZPublication
|
|
71
|
+
@end
|
|
11
72
|
|
|
12
73
|
@interface RNZeroconf ()
|
|
13
74
|
|
|
14
|
-
@property (nonatomic, strong, readonly) NSMutableDictionary *
|
|
15
|
-
|
|
75
|
+
@property (nonatomic, strong, readonly) NSMutableDictionary<NSString *, RNZScan *> *scans;
|
|
76
|
+
// Registered, keyed by the name actually used (it can differ from the requested one)
|
|
77
|
+
@property (nonatomic, strong, readonly) NSMutableDictionary<NSString *, RNZPublication *> *publishedServices;
|
|
78
|
+
// Waiting for the register callback
|
|
79
|
+
@property (nonatomic, strong, readonly) NSMutableSet<RNZPublication *> *pendingPublications;
|
|
80
|
+
|
|
81
|
+
- (void) handleBrowse:(RNZScan *)scan flags:(DNSServiceFlags)flags error:(DNSServiceErrorType)error name:(const char *)name regtype:(const char *)regtype domain:(const char *)domain;
|
|
82
|
+
- (void) handleResolve:(RNZResolve *)resolve error:(DNSServiceErrorType)error host:(const char *)host port:(uint16_t)port txtLength:(uint16_t)txtLength txt:(const unsigned char *)txt;
|
|
83
|
+
- (void) handleAddress:(RNZResolve *)resolve flags:(DNSServiceFlags)flags error:(DNSServiceErrorType)error address:(const struct sockaddr *)address;
|
|
84
|
+
- (void) handleRegister:(RNZPublication *)publication flags:(DNSServiceFlags)flags error:(DNSServiceErrorType)error name:(const char *)name;
|
|
16
85
|
|
|
17
86
|
@end
|
|
18
87
|
|
|
19
|
-
|
|
88
|
+
#pragma mark - dns_sd callbacks
|
|
20
89
|
|
|
21
|
-
|
|
90
|
+
static void RNZBrowseReply(DNSServiceRef ref, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType error,
|
|
91
|
+
const char *name, const char *regtype, const char *domain, void *context)
|
|
92
|
+
{
|
|
93
|
+
RNZScan *scan = (__bridge RNZScan *)context;
|
|
94
|
+
[scan.module handleBrowse:scan flags:flags error:error name:name regtype:regtype domain:domain];
|
|
95
|
+
}
|
|
22
96
|
|
|
23
|
-
|
|
97
|
+
static void RNZResolveReply(DNSServiceRef ref, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType error,
|
|
98
|
+
const char *fullName, const char *host, uint16_t port, uint16_t txtLength,
|
|
99
|
+
const unsigned char *txt, void *context)
|
|
100
|
+
{
|
|
101
|
+
RNZResolve *resolve = (__bridge RNZResolve *)context;
|
|
102
|
+
[resolve.module handleResolve:resolve error:error host:host port:ntohs(port) txtLength:txtLength txt:txt];
|
|
103
|
+
}
|
|
24
104
|
|
|
25
|
-
|
|
105
|
+
static void RNZAddressReply(DNSServiceRef ref, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType error,
|
|
106
|
+
const char *host, const struct sockaddr *address, uint32_t ttl, void *context)
|
|
26
107
|
{
|
|
27
|
-
|
|
28
|
-
[
|
|
108
|
+
RNZResolve *resolve = (__bridge RNZResolve *)context;
|
|
109
|
+
[resolve.module handleAddress:resolve flags:flags error:error address:address];
|
|
29
110
|
}
|
|
30
111
|
|
|
31
|
-
|
|
112
|
+
static void RNZRegisterReply(DNSServiceRef ref, DNSServiceFlags flags, DNSServiceErrorType error,
|
|
113
|
+
const char *name, const char *regtype, const char *domain, void *context)
|
|
32
114
|
{
|
|
33
|
-
|
|
34
|
-
[
|
|
115
|
+
RNZPublication *publication = (__bridge RNZPublication *)context;
|
|
116
|
+
[publication.module handleRegister:publication flags:flags error:error name:name];
|
|
35
117
|
}
|
|
36
118
|
|
|
119
|
+
// Deallocates on the next turn of the queue, for refs whose callback may currently be running.
|
|
120
|
+
// keepAlive keeps the callback context alive until then.
|
|
121
|
+
static void RNZDeallocateLater(DNSServiceRef ref, id keepAlive)
|
|
122
|
+
{
|
|
123
|
+
if (ref == NULL) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
dispatch_async(RNZ_QUEUE, ^{
|
|
127
|
+
DNSServiceRefDeallocate(ref);
|
|
128
|
+
(void)keepAlive;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@implementation RNZeroconf
|
|
133
|
+
|
|
134
|
+
@synthesize bridge = _bridge;
|
|
135
|
+
|
|
136
|
+
RCT_EXPORT_MODULE()
|
|
137
|
+
|
|
37
138
|
- (dispatch_queue_t)methodQueue
|
|
38
139
|
{
|
|
39
|
-
return
|
|
140
|
+
return RNZ_QUEUE;
|
|
40
141
|
}
|
|
41
142
|
|
|
42
143
|
+ (BOOL)requiresMainQueueSetup
|
|
@@ -44,213 +145,618 @@ RCT_EXPORT_METHOD(stop)
|
|
|
44
145
|
return YES;
|
|
45
146
|
}
|
|
46
147
|
|
|
47
|
-
|
|
48
|
-
protocol:(NSString *)protocol
|
|
49
|
-
domain:(NSString *)domain
|
|
50
|
-
name:(NSString *)name
|
|
51
|
-
port:(int)port
|
|
52
|
-
txt:(NSArray<NSArray<NSString *> *> *)txt)
|
|
148
|
+
- (instancetype) init
|
|
53
149
|
{
|
|
54
|
-
|
|
55
|
-
[svc setDelegate:self];
|
|
56
|
-
[svc scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
|
|
150
|
+
self = [super init];
|
|
57
151
|
|
|
58
|
-
if (
|
|
59
|
-
|
|
152
|
+
if (self) {
|
|
153
|
+
_scans = [[NSMutableDictionary alloc] init];
|
|
154
|
+
_publishedServices = [[NSMutableDictionary alloc] init];
|
|
155
|
+
_pendingPublications = [[NSMutableSet alloc] init];
|
|
60
156
|
}
|
|
61
157
|
|
|
62
|
-
|
|
63
|
-
self.publishedServices[svc.name] = svc;
|
|
64
|
-
NSLog(@"zeroconf publish called");
|
|
158
|
+
return self;
|
|
65
159
|
}
|
|
66
160
|
|
|
67
|
-
|
|
68
|
-
{
|
|
69
|
-
NSNetService *svc = self.publishedServices[serviceName];
|
|
161
|
+
#pragma mark - Scan
|
|
70
162
|
|
|
71
|
-
|
|
72
|
-
|
|
163
|
+
RCT_EXPORT_METHOD(scan:(NSString *)scanId
|
|
164
|
+
type:(NSString *)type
|
|
165
|
+
protocol:(NSString *)protocol
|
|
166
|
+
domain:(NSString *)domain
|
|
167
|
+
resolveTimeout:(double)resolveTimeout)
|
|
168
|
+
{
|
|
169
|
+
[self stopScan:scanId];
|
|
170
|
+
|
|
171
|
+
RNZScan *scan = [[RNZScan alloc] init];
|
|
172
|
+
scan.module = self;
|
|
173
|
+
scan.scanId = scanId;
|
|
174
|
+
scan.resolveTimeoutSeconds = resolveTimeout > 0 ? resolveTimeout : 5.0;
|
|
175
|
+
scan.foundInterfaces = [[NSMutableDictionary alloc] init];
|
|
176
|
+
scan.resolvingServices = [[NSMutableDictionary alloc] init];
|
|
177
|
+
|
|
178
|
+
NSString *regtype = [NSString stringWithFormat:@"_%@._%@", type, protocol];
|
|
179
|
+
DNSServiceRef ref = NULL;
|
|
180
|
+
DNSServiceErrorType error = DNSServiceBrowse(&ref, 0, kDNSServiceInterfaceIndexAny, regtype.UTF8String,
|
|
181
|
+
domain.length > 0 ? domain.UTF8String : NULL,
|
|
182
|
+
RNZBrowseReply, (__bridge void *)scan);
|
|
183
|
+
if (error != kDNSServiceErr_NoError) {
|
|
184
|
+
[self sendError:[self errorWithCode:error action:@"Browsing services" serviceName:nil] scan:scan];
|
|
185
|
+
return;
|
|
73
186
|
}
|
|
187
|
+
DNSServiceSetDispatchQueue(ref, RNZ_QUEUE);
|
|
188
|
+
scan.browseRef = ref;
|
|
189
|
+
self.scans[scanId] = scan;
|
|
190
|
+
[self sendEvent:@"RNZeroconfStart" scan:scan body:@{}];
|
|
74
191
|
}
|
|
75
192
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
// When a service is discovered.
|
|
79
|
-
- (void) netServiceBrowser:(NSNetServiceBrowser *)browser
|
|
80
|
-
didFindService:(NSNetService *)service
|
|
81
|
-
moreComing:(BOOL)moreComing
|
|
193
|
+
// Stops the scan with this id, or every scan without one
|
|
194
|
+
RCT_EXPORT_METHOD(stop:(NSString *)scanId)
|
|
82
195
|
{
|
|
83
|
-
if (
|
|
84
|
-
|
|
196
|
+
if (scanId.length > 0) {
|
|
197
|
+
[self stopScan:scanId];
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
for (NSString *key in self.scans.allKeys) {
|
|
201
|
+
[self stopScan:key];
|
|
85
202
|
}
|
|
203
|
+
}
|
|
86
204
|
|
|
87
|
-
|
|
88
|
-
|
|
205
|
+
- (void) stopScan:(NSString *)scanId
|
|
206
|
+
{
|
|
207
|
+
RNZScan *scan = self.scans[scanId];
|
|
208
|
+
if (!scan) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
[self.scans removeObjectForKey:scanId];
|
|
89
212
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
213
|
+
for (RNZResolve *resolve in scan.resolvingServices.allValues) {
|
|
214
|
+
[self cancelResolve:resolve];
|
|
215
|
+
}
|
|
216
|
+
[scan.resolvingServices removeAllObjects];
|
|
217
|
+
[scan.foundInterfaces removeAllObjects];
|
|
94
218
|
|
|
95
|
-
|
|
96
|
-
|
|
219
|
+
if (scan.browseRef) {
|
|
220
|
+
DNSServiceRefDeallocate(scan.browseRef);
|
|
221
|
+
scan.browseRef = NULL;
|
|
222
|
+
}
|
|
223
|
+
[self sendEvent:@"RNZeroconfStop" scan:scan body:@{}];
|
|
97
224
|
}
|
|
98
225
|
|
|
99
|
-
|
|
100
|
-
- (void) netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser
|
|
101
|
-
didRemoveService:(NSNetService*)service
|
|
102
|
-
moreComing:(BOOL)moreComing
|
|
226
|
+
- (void) handleBrowse:(RNZScan *)scan flags:(DNSServiceFlags)flags error:(DNSServiceErrorType)error name:(const char *)name regtype:(const char *)regtype domain:(const char *)domain
|
|
103
227
|
{
|
|
104
|
-
if (
|
|
105
|
-
|
|
228
|
+
if (scan.browseRef == NULL) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (error != kDNSServiceErr_NoError) {
|
|
232
|
+
[self sendError:[self errorWithCode:error action:@"Browsing services" serviceName:nil] scan:scan];
|
|
233
|
+
// The browse can't continue after an error
|
|
234
|
+
RNZDeallocateLater(scan.browseRef, scan);
|
|
235
|
+
scan.browseRef = NULL;
|
|
236
|
+
if (self.scans[scan.scanId] == scan) {
|
|
237
|
+
[self stopScan:scan.scanId];
|
|
238
|
+
}
|
|
239
|
+
return;
|
|
106
240
|
}
|
|
107
241
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
242
|
+
NSString *serviceName = name ? [NSString stringWithUTF8String:name] : nil;
|
|
243
|
+
if (!serviceName) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
NSInteger interfaces = scan.foundInterfaces[serviceName].integerValue;
|
|
247
|
+
|
|
248
|
+
if (flags & kDNSServiceFlagsAdd) {
|
|
249
|
+
scan.foundInterfaces[serviceName] = @(interfaces + 1);
|
|
250
|
+
if (interfaces == 0) {
|
|
251
|
+
[self sendEvent:@"RNZeroconfFound" scan:scan body:@{ kRNServiceKeysName: serviceName }];
|
|
252
|
+
[self startResolve:serviceName regtype:[NSString stringWithUTF8String:regtype] domain:[NSString stringWithUTF8String:domain] scan:scan];
|
|
253
|
+
}
|
|
254
|
+
return;
|
|
114
255
|
}
|
|
115
256
|
|
|
116
|
-
|
|
117
|
-
|
|
257
|
+
if (interfaces > 1) {
|
|
258
|
+
scan.foundInterfaces[serviceName] = @(interfaces - 1);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
[scan.foundInterfaces removeObjectForKey:serviceName];
|
|
262
|
+
|
|
263
|
+
// Stop any pending resolve for the removed service
|
|
264
|
+
RNZResolve *resolve = scan.resolvingServices[serviceName];
|
|
265
|
+
if (resolve) {
|
|
266
|
+
[self cancelResolve:resolve];
|
|
267
|
+
[scan.resolvingServices removeObjectForKey:serviceName];
|
|
268
|
+
}
|
|
269
|
+
[self sendEvent:@"RNZeroconfRemove" scan:scan body:@{ kRNServiceKeysName: serviceName }];
|
|
118
270
|
}
|
|
119
271
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
272
|
+
#pragma mark - Resolve
|
|
273
|
+
|
|
274
|
+
- (void) startResolve:(NSString *)name regtype:(NSString *)regtype domain:(NSString *)domain scan:(RNZScan *)scan
|
|
123
275
|
{
|
|
124
|
-
[
|
|
276
|
+
RNZResolve *resolve = [[RNZResolve alloc] init];
|
|
277
|
+
resolve.module = self;
|
|
278
|
+
resolve.scan = scan;
|
|
279
|
+
resolve.name = name;
|
|
280
|
+
resolve.regtype = regtype;
|
|
281
|
+
resolve.domain = domain;
|
|
282
|
+
scan.resolvingServices[name] = resolve;
|
|
283
|
+
[self resolve:resolve];
|
|
125
284
|
}
|
|
126
285
|
|
|
127
|
-
|
|
128
|
-
- (void) netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser
|
|
286
|
+
- (void) resolve:(RNZResolve *)resolve
|
|
129
287
|
{
|
|
130
|
-
|
|
288
|
+
resolve.finished = NO;
|
|
289
|
+
resolve.addresses = [[NSMutableOrderedSet alloc] init];
|
|
290
|
+
|
|
291
|
+
DNSServiceRef ref = NULL;
|
|
292
|
+
DNSServiceErrorType error = DNSServiceResolve(&ref, 0, kDNSServiceInterfaceIndexAny, resolve.name.UTF8String,
|
|
293
|
+
resolve.regtype.UTF8String, resolve.domain.UTF8String,
|
|
294
|
+
RNZResolveReply, (__bridge void *)resolve);
|
|
295
|
+
if (error != kDNSServiceErr_NoError) {
|
|
296
|
+
[self failResolve:resolve error:[self errorWithCode:error action:@"Resolving service" serviceName:resolve.name]];
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
DNSServiceSetDispatchQueue(ref, RNZ_QUEUE);
|
|
300
|
+
resolve.resolveRef = ref;
|
|
301
|
+
|
|
302
|
+
__weak RNZeroconf *weakSelf = self;
|
|
303
|
+
__weak RNZResolve *weakResolve = resolve;
|
|
304
|
+
resolve.timeoutBlock = dispatch_block_create(0, ^{
|
|
305
|
+
[weakSelf resolveTimedOut:weakResolve];
|
|
306
|
+
});
|
|
307
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(resolve.scan.resolveTimeoutSeconds * NSEC_PER_SEC)), RNZ_QUEUE, resolve.timeoutBlock);
|
|
131
308
|
}
|
|
132
309
|
|
|
133
|
-
|
|
134
|
-
- (void) netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser
|
|
310
|
+
- (void) resolveTimedOut:(RNZResolve *)resolve
|
|
135
311
|
{
|
|
136
|
-
[
|
|
312
|
+
if (!resolve || resolve.finished || resolve.scan.resolvingServices[resolve.name] != resolve) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
[self cancelResolve:resolve];
|
|
316
|
+
|
|
317
|
+
// Slow devices can time out, retry once before reporting the error (#186)
|
|
318
|
+
if (!resolve.retried) {
|
|
319
|
+
resolve.retried = YES;
|
|
320
|
+
[self resolve:resolve];
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
[self failResolve:resolve error:@{
|
|
325
|
+
@"message": [NSString stringWithFormat:@"Resolving service %@ failed: timed out", resolve.name],
|
|
326
|
+
@"code": @"TIMEOUT",
|
|
327
|
+
@"domain": @"RNZeroconf",
|
|
328
|
+
@"serviceName": resolve.name,
|
|
329
|
+
}];
|
|
137
330
|
}
|
|
138
331
|
|
|
139
|
-
|
|
332
|
+
- (void) handleResolve:(RNZResolve *)resolve error:(DNSServiceErrorType)error host:(const char *)host port:(uint16_t)port txtLength:(uint16_t)txtLength txt:(const unsigned char *)txt
|
|
333
|
+
{
|
|
334
|
+
if (resolve.finished || resolve.resolveRef == NULL) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
if (error != kDNSServiceErr_NoError) {
|
|
338
|
+
[self failResolve:resolve error:[self errorWithCode:error action:@"Resolving service" serviceName:resolve.name]];
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
140
341
|
|
|
141
|
-
//
|
|
142
|
-
|
|
342
|
+
// Only the first answer is needed
|
|
343
|
+
RNZDeallocateLater(resolve.resolveRef, resolve);
|
|
344
|
+
resolve.resolveRef = NULL;
|
|
345
|
+
|
|
346
|
+
resolve.host = host ? [NSString stringWithUTF8String:host] : nil;
|
|
347
|
+
resolve.port = port;
|
|
348
|
+
resolve.txt = [RNNetServiceSerializer dictionaryFromTXTRecord:txt length:txtLength];
|
|
349
|
+
|
|
350
|
+
DNSServiceRef ref = NULL;
|
|
351
|
+
DNSServiceErrorType addressError = DNSServiceGetAddrInfo(&ref, 0, kDNSServiceInterfaceIndexAny,
|
|
352
|
+
kDNSServiceProtocol_IPv4 | kDNSServiceProtocol_IPv6,
|
|
353
|
+
host, RNZAddressReply, (__bridge void *)resolve);
|
|
354
|
+
if (addressError != kDNSServiceErr_NoError) {
|
|
355
|
+
[self failResolve:resolve error:[self errorWithCode:addressError action:@"Resolving service" serviceName:resolve.name]];
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
DNSServiceSetDispatchQueue(ref, RNZ_QUEUE);
|
|
359
|
+
resolve.addressRef = ref;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
- (void) handleAddress:(RNZResolve *)resolve flags:(DNSServiceFlags)flags error:(DNSServiceErrorType)error address:(const struct sockaddr *)address
|
|
143
363
|
{
|
|
144
|
-
|
|
145
|
-
|
|
364
|
+
if (resolve.finished || resolve.addressRef == NULL) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
if (error != kDNSServiceErr_NoError) {
|
|
368
|
+
// No record for one of the address families is not a failure
|
|
369
|
+
if (error == kDNSServiceErr_NoSuchRecord) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
[self failResolve:resolve error:[self errorWithCode:error action:@"Resolving service" serviceName:resolve.name]];
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
146
375
|
|
|
147
|
-
|
|
148
|
-
|
|
376
|
+
NSString *string = [RNNetServiceSerializer stringFromAddress:address];
|
|
377
|
+
if (string && (flags & kDNSServiceFlagsAdd)) {
|
|
378
|
+
[resolve.addresses addObject:string];
|
|
379
|
+
}
|
|
380
|
+
if (flags & kDNSServiceFlagsMoreComing) {
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// IPv4 and IPv6 answers can arrive in separate batches, wait briefly before emitting
|
|
385
|
+
if (resolve.emitBlock) {
|
|
386
|
+
dispatch_block_cancel(resolve.emitBlock);
|
|
387
|
+
}
|
|
388
|
+
__weak RNZeroconf *weakSelf = self;
|
|
389
|
+
__weak RNZResolve *weakResolve = resolve;
|
|
390
|
+
resolve.emitBlock = dispatch_block_create(0, ^{
|
|
391
|
+
[weakSelf finishResolve:weakResolve];
|
|
392
|
+
});
|
|
393
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), RNZ_QUEUE, resolve.emitBlock);
|
|
149
394
|
}
|
|
150
395
|
|
|
151
|
-
|
|
152
|
-
- (void) netService:(NSNetService *)sender
|
|
153
|
-
didNotResolve:(NSDictionary *)errorDict
|
|
396
|
+
- (void) finishResolve:(RNZResolve *)resolve
|
|
154
397
|
{
|
|
155
|
-
|
|
398
|
+
if (!resolve || resolve.finished || resolve.addresses.count == 0) {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
[self cancelResolve:resolve];
|
|
402
|
+
if (resolve.scan.resolvingServices[resolve.name] == resolve) {
|
|
403
|
+
[resolve.scan.resolvingServices removeObjectForKey:resolve.name];
|
|
404
|
+
}
|
|
156
405
|
|
|
157
|
-
|
|
158
|
-
|
|
406
|
+
[self sendEvent:@"RNZeroconfResolved" scan:resolve.scan body:@{
|
|
407
|
+
kRNServiceKeysName: resolve.name,
|
|
408
|
+
kRNServiceKeysFullName: [NSString stringWithFormat:@"%@%@.", resolve.host ?: @"", resolve.regtype],
|
|
409
|
+
kRNServiceKeysHost: resolve.host ?: @"",
|
|
410
|
+
kRNServiceKeysPort: @(resolve.port),
|
|
411
|
+
kRNServiceKeysAddresses: resolve.addresses.array,
|
|
412
|
+
kRNServiceTxtRecords: resolve.txt ?: @{},
|
|
413
|
+
}];
|
|
159
414
|
}
|
|
160
415
|
|
|
161
|
-
- (void)
|
|
416
|
+
- (void) failResolve:(RNZResolve *)resolve error:(NSDictionary *)error
|
|
162
417
|
{
|
|
163
|
-
|
|
418
|
+
[self cancelResolve:resolve];
|
|
419
|
+
if (resolve.scan.resolvingServices[resolve.name] == resolve) {
|
|
420
|
+
[resolve.scan.resolvingServices removeObjectForKey:resolve.name];
|
|
421
|
+
}
|
|
422
|
+
[self sendError:error scan:resolve.scan];
|
|
164
423
|
}
|
|
165
424
|
|
|
166
|
-
//
|
|
167
|
-
- (void)
|
|
425
|
+
// Stops everything in flight for a resolve, safe to call from its own callbacks
|
|
426
|
+
- (void) cancelResolve:(RNZResolve *)resolve
|
|
168
427
|
{
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
428
|
+
resolve.finished = YES;
|
|
429
|
+
if (resolve.timeoutBlock) {
|
|
430
|
+
dispatch_block_cancel(resolve.timeoutBlock);
|
|
431
|
+
resolve.timeoutBlock = nil;
|
|
432
|
+
}
|
|
433
|
+
if (resolve.emitBlock) {
|
|
434
|
+
dispatch_block_cancel(resolve.emitBlock);
|
|
435
|
+
resolve.emitBlock = nil;
|
|
436
|
+
}
|
|
437
|
+
RNZDeallocateLater(resolve.resolveRef, resolve);
|
|
438
|
+
resolve.resolveRef = NULL;
|
|
439
|
+
RNZDeallocateLater(resolve.addressRef, resolve);
|
|
440
|
+
resolve.addressRef = NULL;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
#pragma mark - Publish
|
|
172
444
|
|
|
173
|
-
|
|
445
|
+
RCT_EXPORT_METHOD(registerService:(NSString *)type
|
|
446
|
+
protocol:(NSString *)protocol
|
|
447
|
+
domain:(NSString *)domain
|
|
448
|
+
name:(NSString *)name
|
|
449
|
+
port:(int)port
|
|
450
|
+
txt:(NSArray<NSArray<NSString *> *> *)txt
|
|
451
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
452
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
453
|
+
{
|
|
454
|
+
NSMutableArray<NSString *> *tooLong = [NSMutableArray array];
|
|
455
|
+
NSData *txtRecord = [RNNetServiceSerializer TXTRecordFromPairs:txt ?: @[] tooLong:tooLong];
|
|
456
|
+
for (NSString *key in tooLong) {
|
|
457
|
+
[self sendError:@{
|
|
458
|
+
@"message": [NSString stringWithFormat:@"TXT record entry %@ is longer than 255 bytes", key],
|
|
459
|
+
@"code": @"TXT_ENTRY_TOO_LONG",
|
|
460
|
+
@"domain": @"RNZeroconf",
|
|
461
|
+
@"serviceName": name,
|
|
462
|
+
}];
|
|
463
|
+
}
|
|
174
464
|
|
|
465
|
+
// dns_sd lets the same app register a name twice, rename like Bonjour does on conflicts
|
|
466
|
+
NSString *availableName = name;
|
|
467
|
+
for (NSInteger suffix = 2; [self isNameInUse:availableName]; suffix++) {
|
|
468
|
+
availableName = [NSString stringWithFormat:@"%@ (%ld)", name, (long)suffix];
|
|
469
|
+
}
|
|
470
|
+
name = availableName;
|
|
471
|
+
|
|
472
|
+
RNZPublication *publication = [[RNZPublication alloc] init];
|
|
473
|
+
publication.module = self;
|
|
474
|
+
publication.name = name;
|
|
475
|
+
publication.regtype = [NSString stringWithFormat:@"_%@._%@", type, protocol];
|
|
476
|
+
publication.domain = domain.length > 0 ? domain : @"local.";
|
|
477
|
+
publication.port = (uint16_t)port;
|
|
478
|
+
publication.txt = [RNNetServiceSerializer dictionaryFromTXTRecord:txtRecord.bytes length:(uint16_t)txtRecord.length];
|
|
479
|
+
publication.resolve = resolve;
|
|
480
|
+
publication.reject = reject;
|
|
481
|
+
|
|
482
|
+
DNSServiceRef ref = NULL;
|
|
483
|
+
DNSServiceErrorType error = DNSServiceRegister(&ref, 0, kDNSServiceInterfaceIndexAny, name.UTF8String,
|
|
484
|
+
publication.regtype.UTF8String,
|
|
485
|
+
domain.length > 0 ? domain.UTF8String : NULL,
|
|
486
|
+
NULL, htons((uint16_t)port),
|
|
487
|
+
(uint16_t)txtRecord.length, txtRecord.length > 0 ? txtRecord.bytes : NULL,
|
|
488
|
+
RNZRegisterReply, (__bridge void *)publication);
|
|
489
|
+
if (error != kDNSServiceErr_NoError) {
|
|
490
|
+
NSDictionary *errorInfo = [self errorWithCode:error action:@"Publishing service" serviceName:name];
|
|
491
|
+
[self sendError:errorInfo];
|
|
492
|
+
[self reject:reject error:errorInfo];
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
DNSServiceSetDispatchQueue(ref, RNZ_QUEUE);
|
|
496
|
+
publication.ref = ref;
|
|
497
|
+
[self.pendingPublications addObject:publication];
|
|
175
498
|
}
|
|
176
499
|
|
|
177
|
-
- (void)
|
|
178
|
-
didNotPublish:(NSDictionary<NSString *,NSNumber *> *)errorDict
|
|
500
|
+
- (void) handleRegister:(RNZPublication *)publication flags:(DNSServiceFlags)flags error:(DNSServiceErrorType)error name:(const char *)name
|
|
179
501
|
{
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
502
|
+
if (publication.ref == NULL) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
if (error != kDNSServiceErr_NoError) {
|
|
506
|
+
NSDictionary *errorInfo = [self errorWithCode:error action:@"Publishing service" serviceName:publication.name];
|
|
507
|
+
[self sendError:errorInfo];
|
|
508
|
+
[self.pendingPublications removeObject:publication];
|
|
509
|
+
if (self.publishedServices[publication.name] == publication) {
|
|
510
|
+
[self.publishedServices removeObjectForKey:publication.name];
|
|
511
|
+
}
|
|
512
|
+
RNZDeallocateLater(publication.ref, publication);
|
|
513
|
+
publication.ref = NULL;
|
|
514
|
+
if (publication.reject) {
|
|
515
|
+
[self reject:publication.reject error:errorInfo];
|
|
516
|
+
}
|
|
517
|
+
publication.resolve = nil;
|
|
518
|
+
publication.reject = nil;
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
if (!(flags & kDNSServiceFlagsAdd)) {
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
186
524
|
|
|
525
|
+
// The name can differ from the requested one when it was already taken
|
|
526
|
+
NSString *registeredName = (name ? [NSString stringWithUTF8String:name] : nil) ?: publication.name;
|
|
527
|
+
if (self.publishedServices[publication.name] == publication) {
|
|
528
|
+
[self.publishedServices removeObjectForKey:publication.name];
|
|
529
|
+
}
|
|
530
|
+
publication.name = registeredName;
|
|
531
|
+
self.publishedServices[registeredName] = publication;
|
|
532
|
+
[self.pendingPublications removeObject:publication];
|
|
533
|
+
|
|
534
|
+
NSDictionary *serviceInfo = [self publicationInfo:publication];
|
|
535
|
+
[self sendEvent:@"RNZeroconfServiceRegistered" body:serviceInfo];
|
|
536
|
+
if (publication.resolve) {
|
|
537
|
+
publication.resolve(serviceInfo);
|
|
538
|
+
}
|
|
539
|
+
publication.resolve = nil;
|
|
540
|
+
publication.reject = nil;
|
|
187
541
|
}
|
|
188
542
|
|
|
189
|
-
|
|
543
|
+
RCT_EXPORT_METHOD(unregisterService:(NSString *)serviceName
|
|
544
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
545
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
190
546
|
{
|
|
191
|
-
|
|
192
|
-
|
|
547
|
+
RNZPublication *publication = self.publishedServices[serviceName];
|
|
548
|
+
if (!publication) {
|
|
549
|
+
[self reject:reject error:@{
|
|
550
|
+
@"message": [NSString stringWithFormat:@"Service %@ is not published", serviceName],
|
|
551
|
+
@"code": @"NOT_PUBLISHED",
|
|
552
|
+
@"domain": @"RNZeroconf",
|
|
553
|
+
@"serviceName": serviceName,
|
|
554
|
+
}];
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
193
557
|
|
|
194
|
-
|
|
195
|
-
[self.
|
|
558
|
+
// Deallocating the ref unregisters the service
|
|
559
|
+
[self.publishedServices removeObjectForKey:serviceName];
|
|
560
|
+
DNSServiceRefDeallocate(publication.ref);
|
|
561
|
+
publication.ref = NULL;
|
|
196
562
|
|
|
563
|
+
NSDictionary *serviceInfo = [self publicationInfo:publication];
|
|
564
|
+
[self sendEvent:@"RNZeroconfServiceUnregistered" body:serviceInfo];
|
|
565
|
+
resolve(serviceInfo);
|
|
197
566
|
}
|
|
198
567
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
- (instancetype) init
|
|
568
|
+
- (BOOL) isNameInUse:(NSString *)name
|
|
202
569
|
{
|
|
203
|
-
self
|
|
204
|
-
|
|
205
|
-
if (self) {
|
|
206
|
-
_resolvingServices = [[NSMutableDictionary alloc] init];
|
|
207
|
-
_publishedServices = [[NSMutableDictionary alloc] init];
|
|
208
|
-
_browser = [[NSNetServiceBrowser alloc] init];
|
|
209
|
-
[_browser setDelegate:self];
|
|
570
|
+
if (self.publishedServices[name]) {
|
|
571
|
+
return YES;
|
|
210
572
|
}
|
|
573
|
+
for (RNZPublication *publication in self.pendingPublications) {
|
|
574
|
+
if ([publication.name isEqualToString:name]) {
|
|
575
|
+
return YES;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return NO;
|
|
579
|
+
}
|
|
211
580
|
|
|
212
|
-
|
|
581
|
+
- (NSDictionary *) publicationInfo:(RNZPublication *)publication
|
|
582
|
+
{
|
|
583
|
+
return @{
|
|
584
|
+
kRNServiceKeysName: publication.name,
|
|
585
|
+
kRNServiceKeysFullName: [NSString stringWithFormat:@"%@.%@.%@", publication.name, publication.regtype, publication.domain],
|
|
586
|
+
kRNServiceKeysPort: @(publication.port),
|
|
587
|
+
kRNServiceKeysAddresses: @[],
|
|
588
|
+
kRNServiceTxtRecords: publication.txt ?: @{},
|
|
589
|
+
};
|
|
213
590
|
}
|
|
214
591
|
|
|
215
|
-
|
|
216
|
-
|
|
592
|
+
#pragma mark - Local Network access
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* Resolves 'granted', 'denied' or 'unknown'. There is no API to read the Local Network permission,
|
|
596
|
+
* so this advertises a temporary Bonjour service and browses for it: seeing it means access is granted,
|
|
597
|
+
* a browser waiting with kDNSServiceErr_PolicyDenied until the timeout means it is denied.
|
|
598
|
+
* The type must be listed in NSBonjourServices, defaults to the first one. It can show the permission prompt.
|
|
599
|
+
*/
|
|
600
|
+
RCT_EXPORT_METHOD(checkLocalNetworkAccess:(NSString *)type
|
|
601
|
+
timeout:(double)timeout
|
|
602
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
603
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
217
604
|
{
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
605
|
+
NSString *serviceType = type;
|
|
606
|
+
if (serviceType.length == 0) {
|
|
607
|
+
NSArray *declared = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSBonjourServices"];
|
|
608
|
+
serviceType = [declared isKindOfClass:[NSArray class]] ? declared.firstObject : nil;
|
|
609
|
+
}
|
|
610
|
+
if (serviceType.length == 0) {
|
|
611
|
+
[self reject:reject error:@{
|
|
612
|
+
@"message": @"No service type to check with, add one to NSBonjourServices in Info.plist",
|
|
613
|
+
@"code": @"MISSING_BONJOUR_SERVICES",
|
|
614
|
+
@"domain": @"RNZeroconf",
|
|
615
|
+
}];
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
// "_http._tcp." -> "_http._tcp"
|
|
619
|
+
if ([serviceType hasSuffix:@"."]) {
|
|
620
|
+
serviceType = [serviceType substringToIndex:serviceType.length - 1];
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
NSString *name = [NSString stringWithFormat:@"rnzeroconf-%@", [[NSUUID UUID].UUIDString substringToIndex:8]];
|
|
624
|
+
dispatch_queue_t queue = RNZ_QUEUE;
|
|
625
|
+
|
|
626
|
+
nw_parameters_t parameters = nw_parameters_create_secure_tcp(NW_PARAMETERS_DISABLE_PROTOCOL, NW_PARAMETERS_DEFAULT_CONFIGURATION);
|
|
627
|
+
nw_listener_t listener = nw_listener_create(parameters);
|
|
628
|
+
nw_listener_set_advertise_descriptor(listener, nw_advertise_descriptor_create_bonjour_service(name.UTF8String, serviceType.UTF8String, "local."));
|
|
629
|
+
nw_listener_set_queue(listener, queue);
|
|
630
|
+
nw_listener_set_new_connection_handler(listener, ^(nw_connection_t connection) {
|
|
631
|
+
nw_connection_cancel(connection);
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
nw_browse_descriptor_t descriptor = nw_browse_descriptor_create_bonjour_service(serviceType.UTF8String, "local.");
|
|
635
|
+
nw_browser_t browser = nw_browser_create(descriptor, nw_parameters_create_secure_tcp(NW_PARAMETERS_DISABLE_PROTOCOL, NW_PARAMETERS_DEFAULT_CONFIGURATION));
|
|
636
|
+
nw_browser_set_queue(browser, queue);
|
|
637
|
+
|
|
638
|
+
__block BOOL finished = NO;
|
|
639
|
+
__block BOOL policyDenied = NO;
|
|
640
|
+
void (^finish)(NSString *) = ^(NSString *result) {
|
|
641
|
+
if (finished) {
|
|
642
|
+
return;
|
|
222
643
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
644
|
+
finished = YES;
|
|
645
|
+
nw_browser_cancel(browser);
|
|
646
|
+
nw_listener_cancel(listener);
|
|
647
|
+
resolve(result);
|
|
648
|
+
};
|
|
649
|
+
|
|
650
|
+
nw_browser_set_browse_results_changed_handler(browser, ^(nw_browse_result_t oldResult, nw_browse_result_t newResult, bool batchComplete) {
|
|
651
|
+
nw_endpoint_t endpoint = newResult ? nw_browse_result_copy_endpoint(newResult) : nil;
|
|
652
|
+
const char *found = endpoint ? nw_endpoint_get_bonjour_service_name(endpoint) : NULL;
|
|
653
|
+
if (found && strcmp(found, name.UTF8String) == 0) {
|
|
654
|
+
finish(@"granted");
|
|
227
655
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
656
|
+
});
|
|
657
|
+
nw_browser_set_state_changed_handler(browser, ^(nw_browser_state_t state, nw_error_t error) {
|
|
658
|
+
if (error && nw_error_get_error_domain(error) == nw_error_domain_dns) {
|
|
659
|
+
// Stays waiting while the prompt is shown, only conclude on timeout
|
|
660
|
+
policyDenied = nw_error_get_error_code(error) == kDNSServiceErr_PolicyDenied;
|
|
661
|
+
} else if (state == nw_browser_state_ready) {
|
|
662
|
+
policyDenied = NO;
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
nw_listener_start(listener);
|
|
667
|
+
nw_browser_start(browser);
|
|
668
|
+
|
|
669
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((timeout > 0 ? timeout : 5.0) * NSEC_PER_SEC)), queue, ^{
|
|
670
|
+
finish(policyDenied ? @"denied" : @"unknown");
|
|
671
|
+
});
|
|
233
672
|
}
|
|
234
673
|
|
|
674
|
+
#pragma mark - Teardown
|
|
675
|
+
|
|
235
676
|
// Called when the bridge is torn down (e.g. reload): stop scanning and unpublish services
|
|
236
677
|
- (void) invalidate
|
|
237
678
|
{
|
|
238
|
-
[self
|
|
239
|
-
for (
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
[self.resolvingServices removeAllObjects];
|
|
244
|
-
for (NSNetService *service in self.publishedServices.allValues) {
|
|
245
|
-
service.delegate = nil;
|
|
246
|
-
[service stop];
|
|
679
|
+
[self stop:nil];
|
|
680
|
+
for (RNZPublication *publication in self.publishedServices.allValues) {
|
|
681
|
+
DNSServiceRefDeallocate(publication.ref);
|
|
682
|
+
publication.ref = NULL;
|
|
247
683
|
}
|
|
248
684
|
[self.publishedServices removeAllObjects];
|
|
685
|
+
for (RNZPublication *publication in self.pendingPublications) {
|
|
686
|
+
DNSServiceRefDeallocate(publication.ref);
|
|
687
|
+
publication.ref = NULL;
|
|
688
|
+
}
|
|
689
|
+
[self.pendingPublications removeAllObjects];
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
#pragma mark - Events and errors
|
|
693
|
+
|
|
694
|
+
- (void) sendEvent:(NSString *)name body:(id)body
|
|
695
|
+
{
|
|
696
|
+
[self.bridge.eventDispatcher sendDeviceEventWithName:name body:body];
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// Scan events carry the id of the scan they belong to
|
|
700
|
+
- (void) sendEvent:(NSString *)name scan:(RNZScan *)scan body:(NSDictionary *)body
|
|
701
|
+
{
|
|
702
|
+
NSMutableDictionary *withScan = [body mutableCopy];
|
|
703
|
+
withScan[@"scanId"] = scan.scanId ?: @"";
|
|
704
|
+
[self sendEvent:name body:withScan];
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
- (void) sendError:(NSDictionary *)error scan:(RNZScan *)scan
|
|
708
|
+
{
|
|
709
|
+
NSMutableDictionary *withScan = [error mutableCopy];
|
|
710
|
+
withScan[@"scanId"] = scan.scanId ?: @"";
|
|
711
|
+
[self sendError:withScan];
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
// Emits an error event as { message, code, domain, serviceName }
|
|
715
|
+
- (void) sendError:(NSDictionary *)error
|
|
716
|
+
{
|
|
717
|
+
[self sendEvent:@"RNZeroconfError" body:error];
|
|
249
718
|
}
|
|
250
719
|
|
|
251
|
-
|
|
720
|
+
// Rejects a promise with the same { message, code, domain, serviceName } shape as error events, in userInfo
|
|
721
|
+
- (void) reject:(RCTPromiseRejectBlock)reject error:(NSDictionary *)error
|
|
252
722
|
{
|
|
253
|
-
|
|
723
|
+
id code = error[@"code"];
|
|
724
|
+
NSError *nsError = [NSError errorWithDomain:error[@"domain"]
|
|
725
|
+
code:[code isKindOfClass:[NSNumber class]] ? [code integerValue] : 0
|
|
726
|
+
userInfo:error];
|
|
727
|
+
reject([NSString stringWithFormat:@"%@", code], error[@"message"], nsError);
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
- (NSDictionary *) errorWithCode:(DNSServiceErrorType)code action:(NSString *)action serviceName:(NSString *)serviceName
|
|
731
|
+
{
|
|
732
|
+
NSString *subject = serviceName ? [NSString stringWithFormat:@"%@ %@", action, serviceName] : action;
|
|
733
|
+
NSMutableDictionary *error = [@{
|
|
734
|
+
@"message": [NSString stringWithFormat:@"%@ failed: %@", subject, [RNZeroconf describeError:code]],
|
|
735
|
+
@"code": @(code),
|
|
736
|
+
@"domain": @"DNSSD",
|
|
737
|
+
} mutableCopy];
|
|
738
|
+
if (serviceName) {
|
|
739
|
+
error[@"serviceName"] = serviceName;
|
|
740
|
+
}
|
|
741
|
+
return error;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
// Readable description of a DNSServiceErrorType
|
|
745
|
+
+ (NSString *) describeError:(DNSServiceErrorType)code
|
|
746
|
+
{
|
|
747
|
+
switch (code) {
|
|
748
|
+
case kDNSServiceErr_NoAuth: return @"not authorized, add the service type to NSBonjourServices in Info.plist";
|
|
749
|
+
case kDNSServiceErr_PolicyDenied: return @"Local Network access denied";
|
|
750
|
+
case kDNSServiceErr_NameConflict: return @"name already in use";
|
|
751
|
+
case kDNSServiceErr_BadParam: return @"bad parameter";
|
|
752
|
+
case kDNSServiceErr_NoSuchName: return @"no such name";
|
|
753
|
+
case kDNSServiceErr_NoSuchRecord: return @"no such record";
|
|
754
|
+
case kDNSServiceErr_ServiceNotRunning: return @"mDNSResponder is not running";
|
|
755
|
+
case kDNSServiceErr_Timeout: return @"timed out";
|
|
756
|
+
case kDNSServiceErr_NoMemory: return @"out of memory";
|
|
757
|
+
case kDNSServiceErr_Unsupported: return @"unsupported";
|
|
758
|
+
default: return [NSString stringWithFormat:@"error %d", code];
|
|
759
|
+
}
|
|
254
760
|
}
|
|
255
761
|
|
|
256
762
|
@end
|