react-native-zeroconf 0.15.2 → 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.
Files changed (231) hide show
  1. package/README.md +27 -536
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/com/balthazargronon/RCTZeroconf/Zeroconf.java +16 -4
  4. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroconfModule.java +95 -13
  5. package/android/src/main/java/com/balthazargronon/RCTZeroconf/nsd/NsdServiceImpl.java +184 -64
  6. package/android/src/main/java/com/balthazargronon/RCTZeroconf/nsd/ServiceInfoCallbacks.java +89 -0
  7. package/android/src/main/java/com/balthazargronon/RCTZeroconf/rx2dnssd/DnssdImpl.java +114 -39
  8. package/android/src/main/jni/Android.mk +1 -24
  9. package/android/src/main/jni/Application.mk +1 -1
  10. package/dist/index.js +244 -27
  11. package/index.d.ts +95 -9
  12. package/ios/RNZeroconf/RNNetServiceSerializer.h +10 -2
  13. package/ios/RNZeroconf/RNNetServiceSerializer.m +51 -59
  14. package/ios/RNZeroconf/RNZeroconf.h +1 -3
  15. package/ios/RNZeroconf/RNZeroconf.m +642 -175
  16. package/package.json +39 -1
  17. package/react-native-zeroconf.podspec +12 -6
  18. package/src/index.js +222 -31
  19. package/android/src/main/java/com/github/druk/dnssd/DNSSDBindable.java +0 -67
  20. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2DnssdBindable.java +0 -35
  21. package/android/src/main/jni/mdnsresponder/Android.bp +0 -215
  22. package/android/src/main/jni/mdnsresponder/Clients/ClientCommon.c +0 -75
  23. package/android/src/main/jni/mdnsresponder/Clients/ClientCommon.h +0 -41
  24. package/android/src/main/jni/mdnsresponder/Clients/Makefile +0 -54
  25. package/android/src/main/jni/mdnsresponder/Clients/ReadMe.txt +0 -25
  26. package/android/src/main/jni/mdnsresponder/Clients/dns-sd.c +0 -1351
  27. package/android/src/main/jni/mdnsresponder/Makefile +0 -41
  28. package/android/src/main/jni/mdnsresponder/PrivateDNS.txt +0 -275
  29. package/android/src/main/jni/mdnsresponder/android/caseMapping/Iphlpapi.h +0 -1
  30. package/android/src/main/jni/mdnsresponder/android/caseMapping/README +0 -3
  31. package/android/src/main/jni/mdnsresponder/android/caseMapping/Resource.h +0 -1
  32. package/android/src/main/jni/mdnsresponder/android/caseMapping/Ws2tcpip.h +0 -1
  33. package/android/src/main/jni/mdnsresponder/android/caseMapping/ipExport.h +0 -1
  34. package/android/src/main/jni/mdnsresponder/android/windows_firewall_dummy.c +0 -10
  35. package/android/src/main/jni/mdnsresponder/mDNSCore/Implementer Notes.txt +0 -66
  36. package/android/src/main/jni/mdnsresponder/mDNSPosix/Client.c +0 -223
  37. package/android/src/main/jni/mdnsresponder/mDNSPosix/ExampleClientApp.c +0 -91
  38. package/android/src/main/jni/mdnsresponder/mDNSPosix/ExampleClientApp.h +0 -18
  39. package/android/src/main/jni/mdnsresponder/mDNSPosix/Identify.c +0 -378
  40. package/android/src/main/jni/mdnsresponder/mDNSPosix/Makefile +0 -520
  41. package/android/src/main/jni/mdnsresponder/mDNSPosix/NetMonitor.c +0 -1010
  42. package/android/src/main/jni/mdnsresponder/mDNSPosix/ProxyResponder.c +0 -300
  43. package/android/src/main/jni/mdnsresponder/mDNSPosix/ReadMe.txt +0 -314
  44. package/android/src/main/jni/mdnsresponder/mDNSPosix/Responder.c +0 -792
  45. package/android/src/main/jni/mdnsresponder/mDNSPosix/Services.txt +0 -36
  46. package/android/src/main/jni/mdnsresponder/mDNSPosix/libnss_mdns.8 +0 -148
  47. package/android/src/main/jni/mdnsresponder/mDNSPosix/mdnsd.sh +0 -73
  48. package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_ReadMe.txt +0 -125
  49. package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.c +0 -2723
  50. package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.conf +0 -13
  51. package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.conf.5 +0 -135
  52. package/android/src/main/jni/mdnsresponder/mDNSPosix/parselog.py +0 -247
  53. package/android/src/main/jni/mdnsresponder/mDNSResponder.sln +0 -400
  54. package/android/src/main/jni/mdnsresponder/mDNSShared/DebugServices.c +0 -3075
  55. package/android/src/main/jni/mdnsresponder/mDNSShared/dns-sd.1 +0 -194
  56. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.8 +0 -69
  57. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.c +0 -3146
  58. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.conf +0 -60
  59. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd_lexer.l +0 -84
  60. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd_parser.y +0 -585
  61. package/android/src/main/jni/mdnsresponder/mDNSShared/mDNS.1 +0 -198
  62. package/android/src/main/jni/mdnsresponder/mDNSShared/mDNSResponder.8 +0 -116
  63. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/BrowsingPage.cpp +0 -441
  64. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/BrowsingPage.h +0 -156
  65. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigDialog.cpp +0 -59
  66. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigDialog.h +0 -48
  67. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigPropertySheet.cpp +0 -301
  68. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigPropertySheet.h +0 -105
  69. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.cpp +0 -380
  70. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.def +0 -20
  71. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.h +0 -84
  72. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.rc +0 -141
  73. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.vcproj +0 -727
  74. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelDll.rc +0 -123
  75. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.cpp +0 -373
  76. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.h +0 -48
  77. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.rc +0 -123
  78. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.vcproj +0 -764
  79. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelLocRes.rc +0 -270
  80. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelLocRes.vcproj +0 -487
  81. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelRes.rc +0 -134
  82. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelRes.vcproj +0 -518
  83. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/FourthPage.cpp +0 -197
  84. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/FourthPage.h +0 -87
  85. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/RegistrationPage.cpp +0 -387
  86. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/RegistrationPage.h +0 -75
  87. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SecondPage.cpp +0 -544
  88. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SecondPage.h +0 -107
  89. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ServicesPage.cpp +0 -273
  90. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ServicesPage.h +0 -123
  91. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SharedSecret.cpp +0 -115
  92. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SharedSecret.h +0 -54
  93. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.dll.manifest +0 -10
  94. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.exe.manifest +0 -17
  95. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.manifest +0 -17
  96. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.rc2 +0 -13
  97. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel64.manifest +0 -17
  98. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/EnergySaver.ico +0 -0
  99. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/controlpanel.ico +0 -0
  100. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/failure.ico +0 -0
  101. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/success.ico +0 -0
  102. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/resource.h +0 -56
  103. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/stdafx.cpp +0 -20
  104. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/stdafx.h +0 -64
  105. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dll.aps +0 -0
  106. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dll.rc +0 -102
  107. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dllmain.c +0 -112
  108. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dnssd.def +0 -48
  109. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dnssd.vcproj +0 -472
  110. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/resource.h +0 -27
  111. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/AssemblyInfo.cpp +0 -84
  112. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/PString.h +0 -70
  113. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/Stdafx.cpp +0 -22
  114. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/Stdafx.h +0 -33
  115. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.cpp +0 -1234
  116. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.h +0 -1392
  117. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.ico +0 -0
  118. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.rc +0 -113
  119. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.vcproj +0 -446
  120. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/resource.h +0 -3
  121. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.cpp +0 -693
  122. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.h +0 -52
  123. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.vcproj +0 -324
  124. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.cpp +0 -208
  125. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.def +0 -35
  126. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.idl +0 -491
  127. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.rc +0 -126
  128. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.rgs +0 -11
  129. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.vcproj +0 -625
  130. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSD.cpp +0 -892
  131. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.cpp +0 -31
  132. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.h +0 -133
  133. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.rgs +0 -27
  134. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.cpp +0 -101
  135. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.h +0 -185
  136. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.rgs +0 -27
  137. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.cpp +0 -2095
  138. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.h +0 -429
  139. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.rgs +0 -27
  140. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/StringServices.cpp +0 -344
  141. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/StringServices.h +0 -102
  142. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.cpp +0 -381
  143. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.h +0 -203
  144. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.rgs +0 -27
  145. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/_IDNSSDEvents_CP.h +0 -358
  146. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/dlldatax.c +0 -51
  147. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/dlldatax.h +0 -49
  148. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/resource.h +0 -30
  149. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/stdafx.h +0 -88
  150. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2002.sln +0 -21
  151. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2002.vcproj +0 -253
  152. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2003.sln +0 -21
  153. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2003.vcproj +0 -267
  154. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.ico +0 -0
  155. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.rc +0 -323
  156. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.rc2 +0 -20
  157. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Resource.h +0 -53
  158. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/AboutDialog.cpp +0 -71
  159. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/AboutDialog.h +0 -62
  160. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/Application.cpp +0 -111
  161. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/Application.h +0 -68
  162. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/ChooserDialog.cpp +0 -1426
  163. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/ChooserDialog.h +0 -131
  164. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/LoginDialog.cpp +0 -109
  165. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/LoginDialog.h +0 -53
  166. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/StdAfx.cpp +0 -18
  167. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/StdAfx.h +0 -48
  168. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcc +0 -37
  169. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcp +0 -868
  170. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcw +0 -29
  171. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.ico +0 -0
  172. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.rc +0 -194
  173. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.rc2 +0 -13
  174. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/newres.h +0 -28
  175. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/resource.h +0 -22
  176. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/Application.cpp +0 -92
  177. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/Application.h +0 -57
  178. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/BrowserDialog.cpp +0 -394
  179. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/BrowserDialog.h +0 -84
  180. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/StdAfx.cpp +0 -18
  181. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/StdAfx.h +0 -46
  182. package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/Java.vcproj +0 -111
  183. package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/jdns_sd.rc +0 -62
  184. package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/makefile +0 -143
  185. package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/makefile64 +0 -143
  186. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.aps +0 -0
  187. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.c +0 -581
  188. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.rc +0 -103
  189. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.vcproj +0 -409
  190. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/Prefix.h +0 -28
  191. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/resource.h +0 -27
  192. package/android/src/main/jni/mdnsresponder/mDNSWindows/PosixCompat.c +0 -128
  193. package/android/src/main/jni/mdnsresponder/mDNSWindows/PosixCompat.h +0 -70
  194. package/android/src/main/jni/mdnsresponder/mDNSWindows/README.txt +0 -85
  195. package/android/src/main/jni/mdnsresponder/mDNSWindows/RegNames.h +0 -57
  196. package/android/src/main/jni/mdnsresponder/mDNSWindows/Secret.c +0 -338
  197. package/android/src/main/jni/mdnsresponder/mDNSWindows/Secret.h +0 -42
  198. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/EventLog.mc +0 -11
  199. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/EventLogMessages.bin +0 -0
  200. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Firewall.cpp +0 -484
  201. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Firewall.h +0 -79
  202. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Prefix.h +0 -30
  203. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.aps +0 -0
  204. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.c +0 -2669
  205. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.h +0 -30
  206. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.mcp +0 -0
  207. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.rc +0 -114
  208. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.vcproj +0 -562
  209. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/main.c +0 -32
  210. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/res/mDNSResponder.manifest +0 -12
  211. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/res/mDNSResponder64.manifest +0 -12
  212. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/resource.h +0 -17
  213. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/resrc1.h +0 -15
  214. package/android/src/main/jni/mdnsresponder/mDNSWindows/VPCDetect.cpp +0 -165
  215. package/android/src/main/jni/mdnsresponder/mDNSWindows/VPCDetect.h +0 -36
  216. package/android/src/main/jni/mdnsresponder/mDNSWindows/WinServices.cpp +0 -93
  217. package/android/src/main/jni/mdnsresponder/mDNSWindows/WinServices.h +0 -34
  218. package/android/src/main/jni/mdnsresponder/mDNSWindows/WinVersRes.h +0 -35
  219. package/android/src/main/jni/mdnsresponder/mDNSWindows/isocode.h +0 -135
  220. package/android/src/main/jni/mdnsresponder/mDNSWindows/loclibrary.c +0 -268
  221. package/android/src/main/jni/mdnsresponder/mDNSWindows/loclibrary.h +0 -54
  222. package/android/src/main/jni/mdnsresponder/mDNSWindows/mDNSWin32.c +0 -5200
  223. package/android/src/main/jni/mdnsresponder/mDNSWindows/mDNSWin32.h +0 -208
  224. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/ReadMe.txt +0 -15
  225. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.aps +0 -0
  226. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.c +0 -2430
  227. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.def +0 -24
  228. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.rc +0 -104
  229. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.vcproj +0 -457
  230. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/resource.h +0 -27
  231. 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', () => this.emit('start'));
60
- this._dListeners.stop = _reactNative.DeviceEventEmitter.addListener('RNZeroconfStop', () => this.emit('stop'));
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', new Error(err));
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] = service;
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 service = withAddressFamilies(data);
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
- * Defaults to _http._tcp. on local domain
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(type = 'http', protocol = 'tcp', domain = 'local.', implType = ImplType.NSD) {
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
- // Only one scan runs at a time, stop the one running on the other implementation
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(type, protocol, domain = 'local.', name, port, txt = {}, implType = ImplType.NSD) {
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: Error) => void
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
- * Scan for services, defaults to `_http._tcp.` on the `local.` domain
72
- * @param implType Android only, defaults to `NSD`
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
- scan(type?: string, protocol?: string, domain?: string, implType?: ImplType): void
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. Type and protocol are passed without underscores, e.g. `('http', 'tcp', ...)`
84
- * @param implType Android only, defaults to `NSD`
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
- ): void
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): void
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
- + (NSDictionary *) serializeServiceToDictionary:(NSNetService *)service
21
- resolved:(BOOL)resolved;
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
- + (NSDictionary *) serializeServiceToDictionary:(NSNetService *)service
22
- resolved:(BOOL)resolved
22
+ + (NSString *) stringFromAddress:(const struct sockaddr *)address
23
23
  {
24
- NSMutableDictionary *serviceInfo = [[NSMutableDictionary alloc] init];
25
- serviceInfo[kRNServiceKeysName] = service.name;
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
- return [NSDictionary dictionaryWithDictionary:serviceInfo];
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
- + (NSArray<NSString *> *) addressesFromService:(NSNetService *)service
38
+ + (NSDictionary<NSString *, NSString *> *) dictionaryFromTXTRecord:(const void *)record length:(uint16_t)length
57
39
  {
58
- NSMutableArray<NSString *> *addresses = [[NSMutableArray alloc] init];
59
-
60
- // source: http://stackoverflow.com/a/4976808/2715
61
- char addressBuffer[INET6_ADDRSTRLEN];
62
-
63
- for (NSData *data in service.addresses) {
64
- memset(addressBuffer, 0, INET6_ADDRSTRLEN);
65
-
66
- typedef union {
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
- if (addressStr) {
83
- NSString *address = [NSString stringWithUTF8String:addressStr];
84
- [addresses addObject:address];
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
- return [NSArray arrayWithArray:addresses];
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, NSNetServiceBrowserDelegate, NSNetServiceDelegate>
16
-
17
- @property (nonatomic, strong) NSNetServiceBrowser *browser;
15
+ @interface RNZeroconf : NSObject <RCTBridgeModule, RCTInvalidating>
18
16
 
19
17
  @end