react-native-zeroconf 0.17.2 → 1.0.0-rc.1

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 (117) hide show
  1. package/NOTICE +2 -6
  2. package/README.md +1 -1
  3. package/android/CMakeLists.txt +64 -0
  4. package/android/build.gradle +1 -13
  5. package/android/generated/java/com/balthazargronon/RCTZeroconf/NativeZeroconfSpec.java +96 -0
  6. package/android/generated/jni/CMakeLists.txt +28 -0
  7. package/android/generated/jni/RNZeroconfSpec-generated.cpp +77 -0
  8. package/android/generated/jni/RNZeroconfSpec.h +31 -0
  9. package/android/generated/jni/react/renderer/components/RNZeroconfSpec/RNZeroconfSpecJSI.h +798 -0
  10. package/android/src/main/java/com/balthazargronon/RCTZeroconf/{ZeroconfModule.java → NsdHost.java} +97 -140
  11. package/android/src/main/java/com/balthazargronon/RCTZeroconf/NsdPayload.java +87 -0
  12. package/android/src/main/java/com/balthazargronon/RCTZeroconf/NsdPromise.java +40 -0
  13. package/android/src/main/java/com/balthazargronon/RCTZeroconf/Zeroconf.java +4 -6
  14. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroconfNativeSupport.java +60 -0
  15. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroconfOptions.java +15 -26
  16. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroconfReactPackage.java +5 -15
  17. package/android/src/main/java/com/balthazargronon/RCTZeroconf/nsd/NsdServiceImpl.java +90 -96
  18. package/android/src/main/jni/mdnsresponder/mDNSPosix/PosixDaemon.c +19 -1
  19. package/android/src/main/jni/mdnsresponder/mDNSPosix/mDNSPosix.c +104 -1
  20. package/android/src/main/jni/mdnsresponder/mDNSPosix/mDNSPosix.h +7 -0
  21. package/android/src/main/jni/mdnsresponder/mDNSShared/dnssd_clientshim.c +34 -9
  22. package/cpp/Backend.cpp +16 -0
  23. package/cpp/Backend.h +116 -0
  24. package/cpp/ZeroconfModule.cpp +280 -0
  25. package/cpp/ZeroconfModule.h +144 -0
  26. package/cpp/android/NsdBackend.cpp +462 -0
  27. package/cpp/android/NsdBackend.h +61 -0
  28. package/cpp/android/ZeroconfAndroidModule.cpp +49 -0
  29. package/cpp/android/ZeroconfAndroidModule.h +15 -0
  30. package/cpp/apple/DispatchExecutor.cpp +66 -0
  31. package/cpp/apple/DispatchExecutor.h +37 -0
  32. package/cpp/apple/LocalNetworkAccess.h +19 -0
  33. package/cpp/apple/LocalNetworkAccess.mm +87 -0
  34. package/cpp/dnssd/DnssdBackend.cpp +976 -0
  35. package/cpp/dnssd/DnssdBackend.h +114 -0
  36. package/cpp/dnssd/Executor.h +28 -0
  37. package/cpp/embedded/EmbeddedExecutor.cpp +124 -0
  38. package/cpp/embedded/EmbeddedExecutor.h +57 -0
  39. package/ios/ZeroconfOnLoad.mm +34 -0
  40. package/ios/generated/ReactCodegen/RNZeroconfSpec/RNZeroconfSpec-generated.mm +140 -0
  41. package/ios/generated/ReactCodegen/RNZeroconfSpec/RNZeroconfSpec.h +189 -0
  42. package/ios/generated/ReactCodegen/RNZeroconfSpecJSI.h +798 -0
  43. package/lib/module/NativeZeroconf.js +15 -0
  44. package/lib/module/NativeZeroconf.js.map +1 -0
  45. package/lib/module/bridge.js +124 -0
  46. package/lib/module/bridge.js.map +1 -0
  47. package/{dist → lib/module}/index.js +149 -149
  48. package/lib/module/index.js.map +1 -0
  49. package/lib/module/package.json +1 -0
  50. package/lib/module/types.js +24 -0
  51. package/lib/module/types.js.map +1 -0
  52. package/lib/typescript/package.json +1 -0
  53. package/lib/typescript/src/NativeZeroconf.d.ts +75 -0
  54. package/lib/typescript/src/NativeZeroconf.d.ts.map +1 -0
  55. package/lib/typescript/src/bridge.d.ts +22 -0
  56. package/lib/typescript/src/bridge.d.ts.map +1 -0
  57. package/lib/typescript/src/index.d.ts +111 -0
  58. package/lib/typescript/src/index.d.ts.map +1 -0
  59. package/lib/typescript/src/types.d.ts +175 -0
  60. package/lib/typescript/src/types.d.ts.map +1 -0
  61. package/package.json +65 -29
  62. package/react-native-zeroconf.podspec +2 -1
  63. package/react-native.config.js +17 -0
  64. package/src/NativeZeroconf.ts +120 -0
  65. package/src/bridge.ts +153 -0
  66. package/src/index.ts +607 -0
  67. package/{index.d.ts → src/types.ts} +5 -99
  68. package/windows/RNZeroconf/RNZeroconf.vcxproj +17 -2
  69. package/windows/RNZeroconf/RNZeroconf.vcxproj.filters +0 -6
  70. package/windows/RNZeroconf/ReactPackageProvider.cpp +23 -20
  71. package/windows/RNZeroconf/WindowsBackend.cpp +156 -0
  72. package/windows/RNZeroconf/WindowsBackend.h +13 -0
  73. package/windows/RNZeroconf/ZeroconfCore.cpp +2 -2
  74. package/windows/RNZeroconf/ZeroconfCore.h +2 -2
  75. package/windows/RNZeroconf/ZeroconfWindowsModule.cpp +22 -0
  76. package/windows/RNZeroconf/ZeroconfWindowsModule.h +14 -0
  77. package/android/src/main/java/com/balthazargronon/RCTZeroconf/ZeroConfImplFactory.java +0 -56
  78. package/android/src/main/java/com/balthazargronon/RCTZeroconf/dnssd/DnssdImpl.java +0 -654
  79. package/android/src/main/java/com/github/druk/dnssd/BaseListener.java +0 -33
  80. package/android/src/main/java/com/github/druk/dnssd/BrowseListener.java +0 -67
  81. package/android/src/main/java/com/github/druk/dnssd/DNSRecord.java +0 -47
  82. package/android/src/main/java/com/github/druk/dnssd/DNSSD.java +0 -650
  83. package/android/src/main/java/com/github/druk/dnssd/DNSSDEmbedded.java +0 -135
  84. package/android/src/main/java/com/github/druk/dnssd/DNSSDException.java +0 -66
  85. package/android/src/main/java/com/github/druk/dnssd/DNSSDRecordRegistrar.java +0 -55
  86. package/android/src/main/java/com/github/druk/dnssd/DNSSDRegistration.java +0 -54
  87. package/android/src/main/java/com/github/druk/dnssd/DNSSDService.java +0 -35
  88. package/android/src/main/java/com/github/druk/dnssd/DomainListener.java +0 -57
  89. package/android/src/main/java/com/github/druk/dnssd/InternalBrowseListener.java +0 -76
  90. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSD.java +0 -870
  91. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDRecordRegistrar.java +0 -30
  92. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDRegistration.java +0 -34
  93. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDService.java +0 -29
  94. package/android/src/main/java/com/github/druk/dnssd/InternalDomainListener.java +0 -62
  95. package/android/src/main/java/com/github/druk/dnssd/InternalQueryListener.java +0 -61
  96. package/android/src/main/java/com/github/druk/dnssd/InternalRegisterListener.java +0 -51
  97. package/android/src/main/java/com/github/druk/dnssd/InternalResolveListener.java +0 -58
  98. package/android/src/main/java/com/github/druk/dnssd/NSClass.java +0 -16
  99. package/android/src/main/java/com/github/druk/dnssd/NSType.java +0 -58
  100. package/android/src/main/java/com/github/druk/dnssd/QueryListener.java +0 -54
  101. package/android/src/main/java/com/github/druk/dnssd/RegisterListener.java +0 -46
  102. package/android/src/main/java/com/github/druk/dnssd/RegisterRecordListener.java +0 -35
  103. package/android/src/main/java/com/github/druk/dnssd/ResolveListener.java +0 -55
  104. package/android/src/main/java/com/github/druk/dnssd/TXTRecord.java +0 -293
  105. package/android/src/main/jni/Android.mk +0 -73
  106. package/android/src/main/jni/Application.mk +0 -3
  107. package/android/src/main/jni/DNSSD.java.h +0 -290
  108. package/android/src/main/jni/JNISupport.c +0 -1140
  109. package/ios/RNZeroconf/RNNetServiceSerializer.h +0 -31
  110. package/ios/RNZeroconf/RNNetServiceSerializer.m +0 -84
  111. package/ios/RNZeroconf/RNZeroconf.h +0 -17
  112. package/ios/RNZeroconf/RNZeroconf.m +0 -1025
  113. package/ios/RNZeroconf.xcodeproj/project.pbxproj +0 -261
  114. package/ios/RNZeroconf.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  115. package/src/index.js +0 -563
  116. package/windows/RNZeroconf/RNZeroconf.cpp +0 -228
  117. package/windows/RNZeroconf/RNZeroconf.h +0 -70
@@ -0,0 +1,49 @@
1
+ #include "ZeroconfAndroidModule.h"
2
+
3
+ #include "../dnssd/DnssdBackend.h"
4
+ #include "../embedded/EmbeddedExecutor.h"
5
+ #include "NsdBackend.h"
6
+
7
+ #include <android/log.h>
8
+ #include <fbjni/fbjni.h>
9
+
10
+ namespace facebook::react {
11
+
12
+ namespace {
13
+
14
+ // ZeroconfNativeSupport.setMulticastLock, from any thread
15
+ void SetMulticastLock(bool held) {
16
+ jni::ThreadScope::WithClassLoader([held] {
17
+ static const auto support = jni::findClassStatic("com/balthazargronon/RCTZeroconf/ZeroconfNativeSupport");
18
+ static const auto setMulticastLock = support->getStaticMethod<void(jboolean)>("setMulticastLock");
19
+ setMulticastLock(support, held ? JNI_TRUE : JNI_FALSE);
20
+ });
21
+ }
22
+
23
+ ZeroconfPlatform AndroidPlatform() {
24
+ ZeroconfPlatform platform;
25
+ // NSD (the default) is Android's NsdManager, DNSSD the mDNSResponder embedded in the library
26
+ platform.backendKey = [](const std::string &implType) { return std::string(implType == "DNSSD" ? "DNSSD" : "NSD"); };
27
+ platform.createBackend = [](const std::string &key, rnzeroconf::Events events) -> std::shared_ptr<rnzeroconf::Backend> {
28
+ if (key == "NSD") {
29
+ return rnzeroconf::NsdBackend::Create(std::move(events));
30
+ }
31
+ auto executor = rnzeroconf::EmbeddedExecutor::Shared();
32
+ if (executor->StartError() != 0) {
33
+ __android_log_print(ANDROID_LOG_ERROR, "RNZeroconf", "The embedded mDNSResponder failed to start (%d)", executor->StartError());
34
+ }
35
+ return rnzeroconf::DnssdBackend::Create(executor, std::move(events));
36
+ };
37
+ platform.setActive = SetMulticastLock;
38
+ // Android 17's ACCESS_LOCAL_NETWORK, JavaScript requests it when it is denied
39
+ platform.checkLocalNetworkAccess = [](const std::string &, double, std::function<void(const std::string &)> resolve,
40
+ std::function<void(const rnzeroconf::Error &)>) { resolve(rnzeroconf::NsdBackend::CheckLocalNetworkAccess()); };
41
+ return platform;
42
+ }
43
+
44
+ } // namespace
45
+
46
+ ZeroconfAndroidModule::ZeroconfAndroidModule(std::shared_ptr<CallInvoker> jsInvoker)
47
+ : ZeroconfModule(std::move(jsInvoker), AndroidPlatform()) {}
48
+
49
+ } // namespace facebook::react
@@ -0,0 +1,15 @@
1
+ // The C++ module on Android, constructed by React Native's autolinking (react-native.config.js):
2
+ // Android's NsdManager for NSD (through the Java side), the mDNSResponder embedded in the library for
3
+ // DNSSD, and the multicast lock
4
+ #pragma once
5
+
6
+ #include "../ZeroconfModule.h"
7
+
8
+ namespace facebook::react {
9
+
10
+ class ZeroconfAndroidModule : public ZeroconfModule {
11
+ public:
12
+ explicit ZeroconfAndroidModule(std::shared_ptr<CallInvoker> jsInvoker);
13
+ };
14
+
15
+ } // namespace facebook::react
@@ -0,0 +1,66 @@
1
+ #include "DispatchExecutor.h"
2
+
3
+ #include <utility>
4
+
5
+ namespace rnzeroconf {
6
+
7
+ namespace {
8
+
9
+ struct Delayed {
10
+ std::shared_ptr<void> timers;
11
+ Executor::TimerId id;
12
+ };
13
+
14
+ } // namespace
15
+
16
+ DispatchExecutor::DispatchExecutor(const char *label) : queue_(dispatch_queue_create(label, DISPATCH_QUEUE_SERIAL)) {}
17
+
18
+ DispatchExecutor::~DispatchExecutor() {
19
+ #if !OS_OBJECT_USE_OBJC
20
+ dispatch_release(queue_);
21
+ #endif
22
+ }
23
+
24
+ void DispatchExecutor::Post(Task task) {
25
+ dispatch_async_f(queue_, new Task(std::move(task)), [](void *context) {
26
+ std::unique_ptr<Task> task(static_cast<Task *>(context));
27
+ (*task)();
28
+ });
29
+ }
30
+
31
+ Executor::TimerId DispatchExecutor::PostDelayed(double seconds, Task task) {
32
+ TimerId id = ++nextTimer_;
33
+ {
34
+ std::lock_guard<std::mutex> lock(timers_->mutex);
35
+ timers_->pending[id] = std::make_shared<Task>(std::move(task));
36
+ }
37
+ auto *delayed = new Delayed{timers_, id};
38
+ dispatch_after_f(dispatch_time(DISPATCH_TIME_NOW, static_cast<int64_t>(seconds * NSEC_PER_SEC)), queue_, delayed, [](void *context) {
39
+ std::unique_ptr<Delayed> delayed(static_cast<Delayed *>(context));
40
+ auto timers = std::static_pointer_cast<Timers>(delayed->timers);
41
+ std::shared_ptr<Task> task;
42
+ {
43
+ std::lock_guard<std::mutex> lock(timers->mutex);
44
+ auto found = timers->pending.find(delayed->id);
45
+ if (found == timers->pending.end()) {
46
+ // Cancelled
47
+ return;
48
+ }
49
+ task = found->second;
50
+ timers->pending.erase(found);
51
+ }
52
+ (*task)();
53
+ });
54
+ return id;
55
+ }
56
+
57
+ void DispatchExecutor::Cancel(TimerId timer) {
58
+ std::lock_guard<std::mutex> lock(timers_->mutex);
59
+ timers_->pending.erase(timer);
60
+ }
61
+
62
+ void DispatchExecutor::Attach(DNSServiceRef ref) {
63
+ DNSServiceSetDispatchQueue(ref, queue_);
64
+ }
65
+
66
+ } // namespace rnzeroconf
@@ -0,0 +1,37 @@
1
+ // Executor on a serial dispatch queue: dns_sd delivers callbacks there with DNSServiceSetDispatchQueue
2
+ #pragma once
3
+
4
+ #include "../dnssd/Executor.h"
5
+
6
+ #include <dispatch/dispatch.h>
7
+
8
+ #include <atomic>
9
+ #include <map>
10
+ #include <memory>
11
+ #include <mutex>
12
+
13
+ namespace rnzeroconf {
14
+
15
+ class DispatchExecutor : public Executor {
16
+ public:
17
+ explicit DispatchExecutor(const char *label);
18
+ ~DispatchExecutor() override;
19
+
20
+ void Post(Task task) override;
21
+ TimerId PostDelayed(double seconds, Task task) override;
22
+ void Cancel(TimerId timer) override;
23
+ void Attach(DNSServiceRef ref) override;
24
+
25
+ private:
26
+ struct Timers {
27
+ std::mutex mutex;
28
+ std::map<TimerId, std::shared_ptr<Task>> pending;
29
+ };
30
+
31
+ dispatch_queue_t queue_;
32
+ std::atomic<TimerId> nextTimer_{0};
33
+ // Outlives the executor while timers are scheduled
34
+ std::shared_ptr<Timers> timers_ = std::make_shared<Timers>();
35
+ };
36
+
37
+ } // namespace rnzeroconf
@@ -0,0 +1,19 @@
1
+ // The Local Network permission on Apple platforms
2
+ #pragma once
3
+
4
+ #include "../Backend.h"
5
+
6
+ #include <functional>
7
+ #include <string>
8
+
9
+ namespace rnzeroconf {
10
+
11
+ // Settles with 'granted', 'denied' or 'unknown', on the main queue. type is a service type from
12
+ // NSBonjourServices ("_http._tcp"), the first one listed when empty. Can show the permission prompt
13
+ void CheckLocalNetworkAccess(
14
+ const std::string &type,
15
+ double timeout,
16
+ std::function<void(const std::string &status)> resolve,
17
+ std::function<void(const Error &error)> reject);
18
+
19
+ } // namespace rnzeroconf
@@ -0,0 +1,87 @@
1
+ // The Local Network check of Apple platforms, with Network.framework. No React Native dependency:
2
+ // ios/ZeroconfOnLoad.mm hands it to the module, test/apple/local-network-access.mm tests it.
3
+ #import "LocalNetworkAccess.h"
4
+
5
+ #import <Foundation/Foundation.h>
6
+ #import <Network/Network.h>
7
+ #include <dns_sd.h>
8
+
9
+ namespace rnzeroconf {
10
+
11
+ /**
12
+ * Resolves 'granted', 'denied' or 'unknown'. There is no API to read the Local Network permission,
13
+ * so this advertises a temporary Bonjour service and browses for it: seeing it means access is granted,
14
+ * a browser waiting with kDNSServiceErr_PolicyDenied until the timeout means it is denied.
15
+ * The type must be listed in NSBonjourServices, defaults to the first one. It can show the permission prompt.
16
+ */
17
+ void CheckLocalNetworkAccess(
18
+ const std::string &type,
19
+ double timeout,
20
+ std::function<void(const std::string &status)> resolve,
21
+ std::function<void(const Error &error)> reject) {
22
+ NSString *serviceType = type.empty() ? nil : [NSString stringWithUTF8String:type.c_str()];
23
+ if (serviceType.length == 0) {
24
+ NSArray *declared = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSBonjourServices"];
25
+ serviceType = [declared isKindOfClass:[NSArray class]] ? declared.firstObject : nil;
26
+ }
27
+ if (serviceType.length == 0) {
28
+ reject(LibraryError("MISSING_BONJOUR_SERVICES", "No service type to check with, add one to NSBonjourServices in Info.plist"));
29
+ return;
30
+ }
31
+ // "_http._tcp." -> "_http._tcp"
32
+ if ([serviceType hasSuffix:@"."]) {
33
+ serviceType = [serviceType substringToIndex:serviceType.length - 1];
34
+ }
35
+
36
+ NSString *name = [NSString stringWithFormat:@"rnzeroconf-%@", [[NSUUID UUID].UUIDString substringToIndex:8]];
37
+ dispatch_queue_t queue = dispatch_get_main_queue();
38
+
39
+ nw_parameters_t parameters = nw_parameters_create_secure_tcp(NW_PARAMETERS_DISABLE_PROTOCOL, NW_PARAMETERS_DEFAULT_CONFIGURATION);
40
+ nw_listener_t listener = nw_listener_create(parameters);
41
+ nw_listener_set_advertise_descriptor(listener, nw_advertise_descriptor_create_bonjour_service(name.UTF8String, serviceType.UTF8String, "local."));
42
+ nw_listener_set_queue(listener, queue);
43
+ nw_listener_set_new_connection_handler(listener, ^(nw_connection_t connection) {
44
+ nw_connection_cancel(connection);
45
+ });
46
+
47
+ nw_browse_descriptor_t descriptor = nw_browse_descriptor_create_bonjour_service(serviceType.UTF8String, "local.");
48
+ nw_browser_t browser = nw_browser_create(descriptor, nw_parameters_create_secure_tcp(NW_PARAMETERS_DISABLE_PROTOCOL, NW_PARAMETERS_DEFAULT_CONFIGURATION));
49
+ nw_browser_set_queue(browser, queue);
50
+
51
+ __block BOOL finished = NO;
52
+ __block BOOL policyDenied = NO;
53
+ void (^finish)(NSString *) = ^(NSString *result) {
54
+ if (finished) {
55
+ return;
56
+ }
57
+ finished = YES;
58
+ nw_browser_cancel(browser);
59
+ nw_listener_cancel(listener);
60
+ resolve(result.UTF8String);
61
+ };
62
+
63
+ nw_browser_set_browse_results_changed_handler(browser, ^(nw_browse_result_t, nw_browse_result_t newResult, bool) {
64
+ nw_endpoint_t endpoint = newResult ? nw_browse_result_copy_endpoint(newResult) : nil;
65
+ const char *found = endpoint ? nw_endpoint_get_bonjour_service_name(endpoint) : NULL;
66
+ if (found && strcmp(found, name.UTF8String) == 0) {
67
+ finish(@"granted");
68
+ }
69
+ });
70
+ nw_browser_set_state_changed_handler(browser, ^(nw_browser_state_t state, nw_error_t error) {
71
+ if (error && nw_error_get_error_domain(error) == nw_error_domain_dns) {
72
+ // Stays waiting while the prompt is shown, only conclude on timeout
73
+ policyDenied = nw_error_get_error_code(error) == kDNSServiceErr_PolicyDenied;
74
+ } else if (state == nw_browser_state_ready) {
75
+ policyDenied = NO;
76
+ }
77
+ });
78
+
79
+ nw_listener_start(listener);
80
+ nw_browser_start(browser);
81
+
82
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((timeout > 0 ? timeout : 5.0) * NSEC_PER_SEC)), queue, ^{
83
+ finish(policyDenied ? @"denied" : @"unknown");
84
+ });
85
+ }
86
+
87
+ } // namespace rnzeroconf