diff --git a/android/manifest.gradle b/android/manifest.gradle index 1632052..e942b18 100644 --- a/android/manifest.gradle +++ b/android/manifest.gradle @@ -7,5 +7,5 @@ ext { mavenGradleVersion = '2.1' // Textile - textileVersion = '2.0.8' + textileVersion = '2.0.9' } diff --git a/android/src/main/java/io/textile/rnmobile/IpfsBridge.java b/android/src/main/java/io/textile/rnmobile/IpfsBridge.java index 8783bc9..3729115 100644 --- a/android/src/main/java/io/textile/rnmobile/IpfsBridge.java +++ b/android/src/main/java/io/textile/rnmobile/IpfsBridge.java @@ -39,6 +39,25 @@ public void run() { }); } + @ReactMethod + public void connect(final String multiaddr, final Promise promise) { + executor.execute(new Runnable() { + @Override + public void run() { + try { + if (Textile.instance().ipfs.swarmConnect(multiaddr)) { + promise.resolve(true); + } else { + promise.reject(new Exception("connect")); + } + } + catch (final Exception e) { + promise.reject("connect", e); + } + } + }); + } + @ReactMethod public void dataAtPath(final String path, final Promise promise) { executor.execute(new Runnable() { diff --git a/ios/IpfsBridge.m b/ios/IpfsBridge.m index 74e7d03..9a2e2e0 100644 --- a/ios/IpfsBridge.m +++ b/ios/IpfsBridge.m @@ -26,6 +26,20 @@ - (dispatch_queue_t)methodQueue { fulfillWithResult([Textile.instance.ipfs peerId:&error], error, resolve, reject); } +RCT_EXPORT_METHOD(connect:(NSString*)multiaddr resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { + NSError *error; + BOOL connected = [Textile.instance.ipfs swarmConnect:multiaddr error:&error]; + if (!error) { + if (connected) { + resolve(true); + } else { + reject(@"EUNSPECIFIED", @"connect", nil);; + } + } else { + reject(@(error.code).stringValue, error.localizedDescription, error); + } +} + RCT_EXPORT_METHOD(dataAtPath:(NSString*)pth resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { [Textile.instance.ipfs dataAtPath:pth completion:^(NSData * _Nullable data, NSString * _Nullable mediaType, NSError * _Nonnull error) { NSDictionary *result = @{ diff --git a/src/ipfs.ts b/src/ipfs.ts index 30211ba..d471963 100644 --- a/src/ipfs.ts +++ b/src/ipfs.ts @@ -14,6 +14,19 @@ export async function peerId(): Promise { return result as string } +/** + * Open a new direct connection to a peer using an IPFS multiaddr + * ```typescript + * Textile.ipfs.connect(multiaddr); + * ``` + */ +export async function connect( + multiaddr: string +): Promise { + const result = await IpfsBridge.connect(multiaddr) + return result +} + /** * Get raw file data by IPFS path. See `cat` method in IPFS. * ```typescript diff --git a/textile-react-native-sdk.podspec b/textile-react-native-sdk.podspec index b7ca3bc..ba7e8fc 100644 --- a/textile-react-native-sdk.podspec +++ b/textile-react-native-sdk.podspec @@ -16,7 +16,7 @@ Pod::Spec.new do |s| s.tvos.deployment_target = '9.0' s.dependency 'React' - s.dependency 'Textile', '2.0.10' + s.dependency 'Textile', '2.0.11' s.preserve_paths = 'README.md', 'LICENSE', 'package.json' s.source_files = 'ios/**/*.{h,m}'