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
@@ -3,11 +3,14 @@ package com.balthazargronon.RCTZeroconf;
3
3
 
4
4
  import android.util.Log;
5
5
 
6
+ import com.facebook.react.bridge.Promise;
6
7
  import com.facebook.react.bridge.ReactApplicationContext;
7
8
  import com.facebook.react.bridge.ReactContext;
8
9
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
9
10
  import com.facebook.react.bridge.ReactMethod;
10
11
  import com.facebook.react.bridge.ReadableArray;
12
+ import com.facebook.react.bridge.WritableMap;
13
+ import com.facebook.react.bridge.WritableNativeMap;
11
14
  import com.facebook.react.modules.core.DeviceEventManagerModule;
12
15
 
13
16
  import javax.annotation.Nullable;
@@ -35,6 +38,15 @@ public class ZeroconfModule extends ReactContextBaseJavaModule {
35
38
  public static final String KEY_SERVICE_PORT = "port";
36
39
  public static final String KEY_SERVICE_ADDRESSES = "addresses";
37
40
  public static final String KEY_SERVICE_TXT = "txt";
41
+ // Id of the JS instance whose scan an event belongs to
42
+ public static final String KEY_SCAN_ID = "scanId";
43
+
44
+ // Where an error code comes from
45
+ public static final String ERROR_DOMAIN_NSD = "NsdManager";
46
+ public static final String ERROR_DOMAIN_DNSSD = "DNSSD";
47
+ public static final String ERROR_DOMAIN_LIBRARY = "RNZeroconf";
48
+ public static final String ERROR_CODE_EXCEPTION = "EXCEPTION";
49
+ public static final String ERROR_CODE_NOT_PUBLISHED = "NOT_PUBLISHED";
38
50
 
39
51
  private ZeroConfImplFactory zeroConfFactory;
40
52
 
@@ -49,22 +61,30 @@ public class ZeroconfModule extends ReactContextBaseJavaModule {
49
61
  }
50
62
 
51
63
  @ReactMethod
52
- public void scan(String type, String protocol, String domain, String implType) {
64
+ public void scan(String scanId, String type, String protocol, String domain, String implType) {
53
65
  try {
54
- getZeroconfImpl(implType).scan(type, protocol, domain);
66
+ getZeroconfImpl(implType).scan(scanId, type, protocol, domain);
55
67
  } catch (Throwable e) {
56
68
  Log.e(getClass().getName(), e.getMessage(), e);
57
- sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, "Exception During Scan: " + e.getMessage());
69
+ sendError(ERROR_DOMAIN_LIBRARY, ERROR_CODE_EXCEPTION, "Exception during scan: " + e.getMessage(), null, scanId);
58
70
  }
59
71
  }
60
72
 
73
+ /**
74
+ * Stops the scan with this id, or every scan of the implementation without one
75
+ */
61
76
  @ReactMethod
62
- public void stop(String implType) {
77
+ public void stop(@Nullable String scanId, String implType) {
63
78
  try {
64
- getZeroconfImpl(implType).stop();
79
+ Zeroconf impl = getZeroconfImpl(implType);
80
+ if (scanId == null || scanId.isEmpty()) {
81
+ impl.stopAll();
82
+ } else {
83
+ impl.stop(scanId);
84
+ }
65
85
  } catch (Throwable e) {
66
86
  Log.e(getClass().getName(), e.getMessage(), e);
67
- sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, "Exception During Stop: " + e.getMessage());
87
+ sendError(ERROR_DOMAIN_LIBRARY, ERROR_CODE_EXCEPTION, "Exception during stop: " + e.getMessage(), null, scanId);
68
88
  }
69
89
  }
70
90
 
@@ -73,22 +93,26 @@ public class ZeroconfModule extends ReactContextBaseJavaModule {
73
93
  }
74
94
 
75
95
  @ReactMethod
76
- public void registerService(String type, String protocol, String domain, String name, int port, ReadableArray txt, String implType) {
96
+ public void registerService(String type, String protocol, String domain, String name, int port, ReadableArray txt, String implType, Promise promise) {
77
97
  try {
78
- getZeroconfImpl(implType).registerService(type, protocol, domain, name, port, txt);
98
+ getZeroconfImpl(implType).registerService(type, protocol, domain, name, port, txt, promise);
79
99
  } catch (Throwable e) {
80
100
  Log.e(getClass().getName(), e.getMessage(), e);
81
- sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, "Exception During Register Service: " + e.getMessage());
101
+ String message = "Exception while registering service: " + e.getMessage();
102
+ sendError(ERROR_DOMAIN_LIBRARY, ERROR_CODE_EXCEPTION, message, name);
103
+ reject(promise, ERROR_DOMAIN_LIBRARY, ERROR_CODE_EXCEPTION, message, name);
82
104
  }
83
105
  }
84
106
 
85
107
  @ReactMethod
86
- public void unregisterService(String serviceName, String implType) {
108
+ public void unregisterService(String serviceName, String implType, Promise promise) {
87
109
  try {
88
- getZeroconfImpl(implType).unregisterService(serviceName);
110
+ getZeroconfImpl(implType).unregisterService(serviceName, promise);
89
111
  } catch (Throwable e) {
90
112
  Log.e(getClass().getName(), e.getMessage(), e);
91
- sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, "Exception During Unregister Service: " + e.getMessage());
113
+ String message = "Exception while unregistering service: " + e.getMessage();
114
+ sendError(ERROR_DOMAIN_LIBRARY, ERROR_CODE_EXCEPTION, message, serviceName);
115
+ reject(promise, ERROR_DOMAIN_LIBRARY, ERROR_CODE_EXCEPTION, message, serviceName);
92
116
  }
93
117
  }
94
118
 
@@ -105,6 +129,64 @@ public class ZeroconfModule extends ReactContextBaseJavaModule {
105
129
  }
106
130
  }
107
131
 
132
+ /**
133
+ * Emits an error event as { message, code, domain, serviceName }
134
+ *
135
+ * @param code an Integer for platform error codes, a String for the library's own
136
+ */
137
+ public void sendError(String domain, Object code, String message, @Nullable String serviceName) {
138
+ sendError(domain, code, message, serviceName, null);
139
+ }
140
+
141
+ /**
142
+ * @param scanId the scan the error belongs to, null for errors not related to a scan
143
+ */
144
+ public void sendError(String domain, Object code, String message, @Nullable String serviceName, @Nullable String scanId) {
145
+ WritableMap error = buildError(domain, code, message, serviceName);
146
+ if (scanId != null) {
147
+ error.putString(KEY_SCAN_ID, scanId);
148
+ }
149
+ sendEvent(getReactApplicationContext(), EVENT_ERROR, error);
150
+ }
151
+
152
+ /**
153
+ * Rejects a promise with the same { message, code, domain, serviceName } shape as error events, in userInfo
154
+ */
155
+ public static void reject(@Nullable Promise promise, String domain, Object code, String message, @Nullable String serviceName) {
156
+ if (promise != null) {
157
+ promise.reject(String.valueOf(code), message, buildError(domain, code, message, serviceName));
158
+ }
159
+ }
160
+
161
+ private static WritableMap buildError(String domain, Object code, String message, @Nullable String serviceName) {
162
+ WritableMap error = new WritableNativeMap();
163
+ error.putString("message", message);
164
+ error.putString("domain", domain);
165
+ if (code instanceof Integer) {
166
+ error.putInt("code", (Integer) code);
167
+ } else {
168
+ error.putString("code", String.valueOf(code));
169
+ }
170
+ if (serviceName != null) {
171
+ error.putString("serviceName", serviceName);
172
+ }
173
+ return error;
174
+ }
175
+
176
+ /**
177
+ * Readable description of an NsdManager failure code
178
+ */
179
+ public static String describeNsdError(int errorCode) {
180
+ switch (errorCode) {
181
+ case 0: return "internal error"; // FAILURE_INTERNAL_ERROR
182
+ case 3: return "operation already active"; // FAILURE_ALREADY_ACTIVE
183
+ case 4: return "maximum number of requests reached"; // FAILURE_MAX_LIMIT
184
+ case 5: return "operation not running"; // FAILURE_OPERATION_NOT_RUNNING (API 34)
185
+ case 6: return "bad parameters"; // FAILURE_BAD_PARAMETERS (API 34)
186
+ default: return "error " + errorCode;
187
+ }
188
+ }
189
+
108
190
  // Called on teardown by current React Native versions.
109
191
  // No @Override so it still compiles against versions that don't declare it.
110
192
  public void invalidate() {
@@ -120,7 +202,7 @@ public class ZeroconfModule extends ReactContextBaseJavaModule {
120
202
  private void teardown() {
121
203
  try {
122
204
  for (Zeroconf impl : zeroConfFactory.getCreatedImpls()) {
123
- impl.stop();
205
+ impl.stopAll();
124
206
  impl.unregisterAllServices();
125
207
  }
126
208
  } catch (Throwable e) {
@@ -12,6 +12,7 @@ import android.util.Log;
12
12
 
13
13
  import com.balthazargronon.RCTZeroconf.Zeroconf;
14
14
  import com.balthazargronon.RCTZeroconf.ZeroconfModule;
15
+ import com.facebook.react.bridge.Promise;
15
16
  import com.facebook.react.bridge.ReactApplicationContext;
16
17
 
17
18
  import com.facebook.react.bridge.ReadableArray;
@@ -25,123 +26,210 @@ import java.nio.charset.StandardCharsets;
25
26
  import java.util.ArrayDeque;
26
27
  import java.util.ArrayList;
27
28
  import java.util.Collections;
29
+ import java.util.Iterator;
28
30
  import java.util.List;
29
31
  import java.util.Locale;
30
32
  import java.util.Map;
31
33
  import java.util.concurrent.ConcurrentHashMap;
34
+ import java.util.concurrent.ExecutorService;
35
+ import java.util.concurrent.Executors;
36
+
37
+ import javax.annotation.Nullable;
32
38
 
33
39
  public class NsdServiceImpl implements Zeroconf {
34
40
  private static final String TAG = "NsdServiceImpl";
35
41
  private static final long RESOLVE_RETRY_DELAY_MS = 100;
36
42
 
37
43
  private NsdManager mNsdManager;
38
- private NsdManager.DiscoveryListener mDiscoveryListener;
44
+ // Reference counted: acquired once per running scan
39
45
  private WifiManager.MulticastLock multicastLock;
40
- private Map<String, NsdManager.RegistrationListener> mPublishedServices;
46
+ private Map<String, ServiceRegistrationListener> mPublishedServices;
41
47
  private ZeroconfModule zeroconfModule;
42
48
  private ReactApplicationContext reactApplicationContext;
43
49
 
44
- // NsdManager can only resolve one service at a time before API 34, so resolves are queued
45
- private final ArrayDeque<NsdServiceInfo> mResolveQueue = new ArrayDeque<>();
50
+ // Running scans, keyed by the id of the JS instance that started them
51
+ private final Map<String, NsdScan> mScans = new ConcurrentHashMap<>();
52
+ // Not the main thread: serviceInfoToMap can do a blocking reverse lookup for the host name
53
+ private final ExecutorService mCallbackExecutor = Executors.newSingleThreadExecutor();
54
+
55
+ // NsdManager can only resolve one service at a time before API 34, so resolves are queued across scans
56
+ private final ArrayDeque<PendingResolve> mResolveQueue = new ArrayDeque<>();
46
57
  private boolean mIsResolving = false;
47
58
  private final Handler mHandler = new Handler(Looper.getMainLooper());
48
59
 
60
+ private static class NsdScan {
61
+ final String scanId;
62
+ NsdManager.DiscoveryListener discoveryListener;
63
+ // Android 14+: services are followed with registerServiceInfoCallback, null before
64
+ @Nullable ServiceInfoCallbacks infoCallbacks;
65
+
66
+ NsdScan(String scanId) {
67
+ this.scanId = scanId;
68
+ }
69
+ }
70
+
71
+ private static class PendingResolve {
72
+ final String scanId;
73
+ final NsdServiceInfo serviceInfo;
74
+
75
+ PendingResolve(String scanId, NsdServiceInfo serviceInfo) {
76
+ this.scanId = scanId;
77
+ this.serviceInfo = serviceInfo;
78
+ }
79
+ }
80
+
49
81
  public NsdServiceImpl(ZeroconfModule zeroconfModule, ReactApplicationContext reactApplicationContext) {
50
82
  this.zeroconfModule = zeroconfModule;
51
83
  this.reactApplicationContext = reactApplicationContext;
52
- mPublishedServices = new ConcurrentHashMap<String, NsdManager.RegistrationListener>();
84
+ mPublishedServices = new ConcurrentHashMap<String, ServiceRegistrationListener>();
53
85
  }
54
86
 
55
87
  @Override
56
- public void scan(String type, String protocol, String domain) {
57
- if (mNsdManager == null) {
58
- mNsdManager = (NsdManager) getReactApplicationContext().getSystemService(Context.NSD_SERVICE);
59
- }
88
+ public void scan(final String scanId, String type, String protocol, String domain) {
89
+ final NsdManager nsdManager = getNsdManager();
60
90
 
61
- this.stop();
91
+ this.stop(scanId);
92
+ acquireMulticastLock();
62
93
 
63
- if (multicastLock == null) {
64
- @SuppressLint("WifiManagerLeak") WifiManager wifi = (WifiManager) getReactApplicationContext().getSystemService(Context.WIFI_SERVICE);
65
- multicastLock = wifi.createMulticastLock("multicastLock");
66
- multicastLock.setReferenceCounted(true);
67
- multicastLock.acquire();
94
+ final NsdScan scan = new NsdScan(scanId);
95
+
96
+ if (Build.VERSION.SDK_INT >= 34) {
97
+ scan.infoCallbacks = new ServiceInfoCallbacks(nsdManager, mCallbackExecutor, new ServiceInfoCallbacks.Listener() {
98
+ @Override
99
+ public void onServiceUpdated(NsdServiceInfo serviceInfo) {
100
+ if (getHostAddresses(serviceInfo).isEmpty()) {
101
+ return;
102
+ }
103
+ sendScanEvent(ZeroconfModule.EVENT_RESOLVE, serviceInfoToMap(serviceInfo), scanId);
104
+ }
105
+
106
+ @Override
107
+ public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
108
+ zeroconfModule.sendError(ZeroconfModule.ERROR_DOMAIN_NSD, errorCode, "Resolving service " + serviceInfo.getServiceName() + " failed: " + ZeroconfModule.describeNsdError(errorCode), serviceInfo.getServiceName(), scanId);
109
+ }
110
+ });
68
111
  }
69
112
 
70
- mDiscoveryListener = new NsdManager.DiscoveryListener() {
113
+ scan.discoveryListener = new NsdManager.DiscoveryListener() {
71
114
  @Override
72
115
  public void onStartDiscoveryFailed(String serviceType, int errorCode) {
73
- String error = "Starting service discovery failed with code: " + errorCode;
74
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, error);
116
+ zeroconfModule.sendError(ZeroconfModule.ERROR_DOMAIN_NSD, errorCode, "Starting service discovery failed: " + ZeroconfModule.describeNsdError(errorCode), null, scanId);
117
+ // The discovery never started, nothing to stop
118
+ if (mScans.remove(scanId, scan)) {
119
+ releaseMulticastLock();
120
+ }
75
121
  }
76
122
 
77
123
  @Override
78
124
  public void onStopDiscoveryFailed(String serviceType, int errorCode) {
79
- String error = "Stopping service discovery failed with code: " + errorCode;
80
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, error);
125
+ zeroconfModule.sendError(ZeroconfModule.ERROR_DOMAIN_NSD, errorCode, "Stopping service discovery failed: " + ZeroconfModule.describeNsdError(errorCode), null, scanId);
81
126
  }
82
127
 
83
128
  @Override
84
129
  public void onDiscoveryStarted(String serviceType) {
85
- Log.d(TAG, "Discovery started");
86
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_START, null);
130
+ Log.d(TAG, "Discovery started for " + scanId);
131
+ sendScanEvent(ZeroconfModule.EVENT_START, new WritableNativeMap(), scanId);
87
132
  }
88
133
 
89
134
  @Override
90
135
  public void onDiscoveryStopped(String serviceType) {
91
- Log.d(TAG, "Discovery stopped");
92
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_STOP, null);
136
+ Log.d(TAG, "Discovery stopped for " + scanId);
137
+ sendScanEvent(ZeroconfModule.EVENT_STOP, new WritableNativeMap(), scanId);
93
138
  }
94
139
 
95
140
  @Override
96
141
  public void onServiceFound(NsdServiceInfo serviceInfo) {
97
142
  Log.d(TAG, "Service found");
98
- WritableMap service = new WritableNativeMap();
99
- service.putString(ZeroconfModule.KEY_SERVICE_NAME, serviceInfo.getServiceName());
100
-
101
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_FOUND, service);
102
- enqueueResolve(serviceInfo);
143
+ sendScanEvent(ZeroconfModule.EVENT_FOUND, serviceNameToMap(serviceInfo), scanId);
144
+ if (scan.infoCallbacks != null) {
145
+ scan.infoCallbacks.register(serviceInfo);
146
+ } else {
147
+ enqueueResolve(scanId, serviceInfo);
148
+ }
103
149
  }
104
150
 
105
151
  @Override
106
152
  public void onServiceLost(NsdServiceInfo serviceInfo) {
107
153
  Log.d(TAG, "Service lost");
108
- WritableMap service = new WritableNativeMap();
109
- service.putString(ZeroconfModule.KEY_SERVICE_NAME, serviceInfo.getServiceName());
110
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_REMOVE, service);
154
+ sendScanEvent(ZeroconfModule.EVENT_REMOVE, serviceNameToMap(serviceInfo), scanId);
155
+ if (scan.infoCallbacks != null) {
156
+ scan.infoCallbacks.unregister(serviceInfo.getServiceName());
157
+ }
111
158
  }
112
159
  };
113
160
 
161
+ mScans.put(scanId, scan);
114
162
  String serviceType = String.format("_%s._%s.", type, protocol);
115
- mNsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
163
+ nsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, scan.discoveryListener);
116
164
  }
117
165
 
118
166
  @Override
119
- public void stop() {
120
- if (mDiscoveryListener != null && mNsdManager != null) {
167
+ public void stop(String scanId) {
168
+ NsdScan scan = mScans.remove(scanId);
169
+ if (scan == null) {
170
+ return;
171
+ }
172
+
173
+ if (scan.discoveryListener != null && mNsdManager != null) {
121
174
  try {
122
- mNsdManager.stopServiceDiscovery(mDiscoveryListener);
175
+ mNsdManager.stopServiceDiscovery(scan.discoveryListener);
123
176
  } catch (IllegalArgumentException e) {
124
177
  // Listener was never registered or already unregistered (e.g. discovery failed to start)
125
178
  Log.w(TAG, "stopServiceDiscovery failed", e);
126
179
  }
127
180
  }
128
181
 
129
- mHandler.removeCallbacksAndMessages(null);
182
+ if (scan.infoCallbacks != null) {
183
+ scan.infoCallbacks.unregisterAll();
184
+ }
185
+
130
186
  synchronized (mResolveQueue) {
131
- mResolveQueue.clear();
132
- mIsResolving = false;
187
+ Iterator<PendingResolve> iterator = mResolveQueue.iterator();
188
+ while (iterator.hasNext()) {
189
+ if (iterator.next().scanId.equals(scanId)) {
190
+ iterator.remove();
191
+ }
192
+ }
193
+ }
194
+
195
+ releaseMulticastLock();
196
+ }
197
+
198
+ @Override
199
+ public void stopAll() {
200
+ for (String scanId : new ArrayList<>(mScans.keySet())) {
201
+ stop(scanId);
202
+ }
203
+ }
204
+
205
+ private void acquireMulticastLock() {
206
+ if (multicastLock == null) {
207
+ @SuppressLint("WifiManagerLeak") WifiManager wifi = (WifiManager) getReactApplicationContext().getSystemService(Context.WIFI_SERVICE);
208
+ multicastLock = wifi.createMulticastLock("multicastLock");
209
+ multicastLock.setReferenceCounted(true);
133
210
  }
211
+ multicastLock.acquire();
212
+ }
134
213
 
135
- if (multicastLock != null) {
214
+ private void releaseMulticastLock() {
215
+ if (multicastLock != null && multicastLock.isHeld()) {
136
216
  multicastLock.release();
137
217
  }
218
+ }
138
219
 
139
- mDiscoveryListener = null;
140
- multicastLock = null;
220
+ private void sendScanEvent(String eventName, WritableMap body, String scanId) {
221
+ body.putString(ZeroconfModule.KEY_SCAN_ID, scanId);
222
+ zeroconfModule.sendEvent(getReactApplicationContext(), eventName, body);
223
+ }
224
+
225
+ private static WritableMap serviceNameToMap(NsdServiceInfo serviceInfo) {
226
+ WritableMap service = new WritableNativeMap();
227
+ service.putString(ZeroconfModule.KEY_SERVICE_NAME, serviceInfo.getServiceName());
228
+ return service;
141
229
  }
142
230
 
143
231
  @Override
144
- public void registerService(String type, String protocol, String domain, String name, int port, ReadableArray txt) {
232
+ public void registerService(String type, String protocol, String domain, String name, int port, ReadableArray txt, Promise promise) {
145
233
  String serviceType = String.format("_%s._%s.", type, protocol);
146
234
 
147
235
  final NsdManager nsdManager = this.getNsdManager();
@@ -156,26 +244,30 @@ public class NsdServiceImpl implements Zeroconf {
156
244
  }
157
245
 
158
246
  nsdManager.registerService(
159
- serviceInfo, NsdManager.PROTOCOL_DNS_SD, new ServiceRegistrationListener());
247
+ serviceInfo, NsdManager.PROTOCOL_DNS_SD, new ServiceRegistrationListener(promise));
160
248
  }
161
249
 
162
250
  @Override
163
- public void unregisterService(String serviceName) {
251
+ public void unregisterService(String serviceName, @Nullable Promise promise) {
164
252
 
165
253
  final NsdManager nsdManager = this.getNsdManager();
166
254
 
167
- NsdManager.RegistrationListener serviceListener = mPublishedServices.get(serviceName);
255
+ ServiceRegistrationListener serviceListener = mPublishedServices.get(serviceName);
168
256
 
169
- if (serviceListener != null) {
170
- mPublishedServices.remove(serviceName);
171
- nsdManager.unregisterService(serviceListener);
257
+ if (serviceListener == null) {
258
+ ZeroconfModule.reject(promise, ZeroconfModule.ERROR_DOMAIN_LIBRARY, ZeroconfModule.ERROR_CODE_NOT_PUBLISHED, "Service " + serviceName + " is not published", serviceName);
259
+ return;
172
260
  }
261
+
262
+ mPublishedServices.remove(serviceName);
263
+ serviceListener.unregisterPromise = promise;
264
+ nsdManager.unregisterService(serviceListener);
173
265
  }
174
266
 
175
267
  @Override
176
268
  public void unregisterAllServices() {
177
269
  for (String serviceName : new ArrayList<>(mPublishedServices.keySet())) {
178
- unregisterService(serviceName);
270
+ unregisterService(serviceName, null);
179
271
  }
180
272
  }
181
273
 
@@ -190,15 +282,15 @@ public class NsdServiceImpl implements Zeroconf {
190
282
  return reactApplicationContext;
191
283
  }
192
284
 
193
- private void enqueueResolve(NsdServiceInfo serviceInfo) {
285
+ private void enqueueResolve(String scanId, NsdServiceInfo serviceInfo) {
194
286
  synchronized (mResolveQueue) {
195
- mResolveQueue.add(serviceInfo);
287
+ mResolveQueue.add(new PendingResolve(scanId, serviceInfo));
196
288
  }
197
289
  resolveNext();
198
290
  }
199
291
 
200
292
  private void resolveNext() {
201
- NsdServiceInfo next;
293
+ PendingResolve next;
202
294
  synchronized (mResolveQueue) {
203
295
  if (mIsResolving || mResolveQueue.isEmpty()) {
204
296
  return;
@@ -207,10 +299,11 @@ public class NsdServiceImpl implements Zeroconf {
207
299
  mIsResolving = true;
208
300
  }
209
301
  try {
210
- getNsdManager().resolveService(next, new ZeroResolveListener());
302
+ getNsdManager().resolveService(next.serviceInfo, new ZeroResolveListener(next.scanId));
211
303
  } catch (Throwable e) {
212
304
  Log.e(TAG, "resolveService failed", e);
213
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, "Resolving service failed: " + e.getMessage());
305
+ String serviceName = next.serviceInfo.getServiceName();
306
+ zeroconfModule.sendError(ZeroconfModule.ERROR_DOMAIN_LIBRARY, ZeroconfModule.ERROR_CODE_EXCEPTION, "Resolving service " + serviceName + " failed: " + e.getMessage(), serviceName, next.scanId);
214
307
  onResolveDone();
215
308
  }
216
309
  }
@@ -223,31 +316,46 @@ public class NsdServiceImpl implements Zeroconf {
223
316
  }
224
317
 
225
318
  private class ZeroResolveListener implements NsdManager.ResolveListener {
319
+ private final String scanId;
320
+
321
+ ZeroResolveListener(String scanId) {
322
+ this.scanId = scanId;
323
+ }
324
+
226
325
  @Override
227
326
  public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
228
327
  if (errorCode == NsdManager.FAILURE_ALREADY_ACTIVE) {
229
328
  // Another resolve (possibly from another app or listener) is in flight: retry shortly
230
329
  synchronized (mResolveQueue) {
231
- mResolveQueue.addFirst(serviceInfo);
330
+ mResolveQueue.addFirst(new PendingResolve(scanId, serviceInfo));
232
331
  mIsResolving = false;
233
332
  }
234
333
  mHandler.postDelayed(NsdServiceImpl.this::resolveNext, RESOLVE_RETRY_DELAY_MS);
235
334
  return;
236
335
  }
237
- String error = "Resolving service failed with code: " + errorCode;
238
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, error);
336
+ if (mScans.containsKey(scanId)) {
337
+ zeroconfModule.sendError(ZeroconfModule.ERROR_DOMAIN_NSD, errorCode, "Resolving service " + serviceInfo.getServiceName() + " failed: " + ZeroconfModule.describeNsdError(errorCode), serviceInfo.getServiceName(), scanId);
338
+ }
239
339
  onResolveDone();
240
340
  }
241
341
 
242
342
  @Override
243
343
  public void onServiceResolved(NsdServiceInfo serviceInfo) {
244
- WritableMap service = serviceInfoToMap(serviceInfo);
245
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_RESOLVE, service);
344
+ // The scan may have been stopped while resolving
345
+ if (mScans.containsKey(scanId)) {
346
+ sendScanEvent(ZeroconfModule.EVENT_RESOLVE, serviceInfoToMap(serviceInfo), scanId);
347
+ }
246
348
  onResolveDone();
247
349
  }
248
350
  }
249
351
 
250
352
  private class ServiceRegistrationListener implements NsdManager.RegistrationListener {
353
+ @Nullable private Promise registerPromise;
354
+ @Nullable private Promise unregisterPromise;
355
+
356
+ ServiceRegistrationListener(@Nullable Promise registerPromise) {
357
+ this.registerPromise = registerPromise;
358
+ }
251
359
 
252
360
  @Override
253
361
  public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
@@ -260,12 +368,18 @@ public class NsdServiceImpl implements Zeroconf {
260
368
 
261
369
  WritableMap service = serviceInfoToMap(NsdServiceInfo);
262
370
  zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_PUBLISHED, service);
371
+ if (registerPromise != null) {
372
+ registerPromise.resolve(serviceInfoToMap(NsdServiceInfo));
373
+ registerPromise = null;
374
+ }
263
375
  }
264
376
 
265
377
  @Override
266
378
  public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
267
- String error = "Registering service " + serviceInfo.getServiceName() + " failed with code: " + errorCode;
268
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, error);
379
+ String message = "Registering service " + serviceInfo.getServiceName() + " failed: " + ZeroconfModule.describeNsdError(errorCode);
380
+ zeroconfModule.sendError(ZeroconfModule.ERROR_DOMAIN_NSD, errorCode, message, serviceInfo.getServiceName());
381
+ ZeroconfModule.reject(registerPromise, ZeroconfModule.ERROR_DOMAIN_NSD, errorCode, message, serviceInfo.getServiceName());
382
+ registerPromise = null;
269
383
  }
270
384
 
271
385
  @Override
@@ -274,12 +388,18 @@ public class NsdServiceImpl implements Zeroconf {
274
388
  // NsdManager.unregisterService() and pass in this listener.
275
389
  final WritableMap service = serviceInfoToMap(nsdServiceInfo);
276
390
  zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_UNREGISTERED, service);
391
+ if (unregisterPromise != null) {
392
+ unregisterPromise.resolve(serviceInfoToMap(nsdServiceInfo));
393
+ unregisterPromise = null;
394
+ }
277
395
  }
278
396
 
279
397
  @Override
280
398
  public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
281
- String error = "Unregistering service " + serviceInfo.getServiceName() + " failed with code: " + errorCode;
282
- zeroconfModule.sendEvent(getReactApplicationContext(), ZeroconfModule.EVENT_ERROR, error);
399
+ String message = "Unregistering service " + serviceInfo.getServiceName() + " failed: " + ZeroconfModule.describeNsdError(errorCode);
400
+ zeroconfModule.sendError(ZeroconfModule.ERROR_DOMAIN_NSD, errorCode, message, serviceInfo.getServiceName());
401
+ ZeroconfModule.reject(unregisterPromise, ZeroconfModule.ERROR_DOMAIN_NSD, errorCode, message, serviceInfo.getServiceName());
402
+ unregisterPromise = null;
283
403
  }
284
404
  }
285
405