diff --git a/client/react-native/android/app/src/main/java/chat/berty/core/CoreModule.java b/client/react-native/android/app/src/main/java/chat/berty/core/CoreModule.java index c7d8ac5ec5..4ee797849a 100644 --- a/client/react-native/android/app/src/main/java/chat/berty/core/CoreModule.java +++ b/client/react-native/android/app/src/main/java/chat/berty/core/CoreModule.java @@ -25,7 +25,7 @@ public String getName() { } @ReactMethod - public void start(Promise promise) throws Exception { + public void start(Promise promise) { try { Core.start(this.filesDir, this.logger); promise.resolve(null); @@ -36,7 +36,18 @@ public void start(Promise promise) throws Exception { } @ReactMethod - public void getPort(Promise promise) throws Exception { + public void restart(Promise promise) { + try { + Core.restart(this.filesDir, this.logger); + promise.resolve(null); + } catch (Exception err) { + this.logger.format(Level.ERROR, this.getName(), "Unable to restart core: %s", err); + promise.reject(err); + } + } + + @ReactMethod + public void getPort(Promise promise) { try { Long data = Core.getPort(); promise.resolve(data.toString()); diff --git a/client/react-native/common/relay/environment.js b/client/react-native/common/relay/environment.js index 2e22116d33..651414c630 100644 --- a/client/react-native/common/relay/environment.js +++ b/client/react-native/common/relay/environment.js @@ -12,6 +12,7 @@ if (__DEV__) { if (Platform.OS === 'web') { NativeModules.CoreModule = { start: async () => {}, + restart: async () => {}, getPort: async () => { const url = new URL(window.location.href) return url.searchParams.get('gql-port') || '8700' diff --git a/client/react-native/gomobile/core.go b/client/react-native/gomobile/core.go index 39c7ee6793..8222b8e5c0 100644 --- a/client/react-native/gomobile/core.go +++ b/client/react-native/gomobile/core.go @@ -116,3 +116,12 @@ func Start(datastorePath string, logger Logger) error { return nil } + +func Restart(datastorePath string, logger Logger) error { + if currentAccount == nil { + return errors.New("daemon not started") + } + currentAccount.Close() + currentAccount = nil + return Start(datastorePath, logger) +} diff --git a/client/react-native/ios/modules/core/CoreModule.m b/client/react-native/ios/modules/core/CoreModule.m index 821dc78df3..bb56ce481d 100644 --- a/client/react-native/ios/modules/core/CoreModule.m +++ b/client/react-native/ios/modules/core/CoreModule.m @@ -13,6 +13,9 @@ @interface RCT_EXTERN_REMAP_MODULE(CoreModule, CoreModule, NSObject) RCT_EXTERN_METHOD(start:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject); +RCT_EXTERN_METHOD(restart:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject); + RCT_EXTERN_METHOD(getPort:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject); diff --git a/client/react-native/ios/modules/core/CoreModule.swift b/client/react-native/ios/modules/core/CoreModule.swift index a67459b7b3..3d294855bb 100644 --- a/client/react-native/ios/modules/core/CoreModule.swift +++ b/client/react-native/ios/modules/core/CoreModule.swift @@ -12,30 +12,49 @@ var logger = Logger("chat.berty.io", "CoreModule") @objc(CoreModule) class CoreModule: NSObject { + + func getFilesDir() throws -> String { + let filesDir = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first + let filesPath = filesDir?.path + let fileExist = FileManager.default.fileExists(atPath: filesPath!) + + if fileExist == false { + try FileManager.default.createDirectory(at: filesDir!, withIntermediateDirectories: true, attributes: nil) + } + + return filesPath! + } + @objc func start(_ resolve: RCTPromiseResolveBlock!, reject: RCTPromiseRejectBlock!) { var err: NSError? - let filesDir = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first - let filesPath = filesDir?.path - let fileExist = FileManager.default.fileExists(atPath: filesPath!) - - if fileExist == false { - do { - try FileManager.default.createDirectory(at: filesDir!, withIntermediateDirectories: true, attributes: nil) - } catch let error as NSError { - logger.format("create directory error: ", level: .Error, error.userInfo.description) - reject("\(String(describing: error.code))", error.userInfo.description, error) + do { + CoreStart(try self.getFilesDir(), logger, &err) + if let error = err { + throw error } - } - - CoreStart(filesPath, logger, &err) - if let error = err { - logger.format("core module init error: %@", level: .Error, error.userInfo.description) + resolve(nil) + } catch let error as NSError { + logger.format("core module start error: %@", level: .Error, error.userInfo.description) reject("\(String(describing: error.code))", error.userInfo.description, error) } - resolve(nil) } - + + @objc func restart(_ resolve: RCTPromiseResolveBlock!, reject: RCTPromiseRejectBlock!) { + var err: NSError? + + do { + CoreRestart(try self.getFilesDir(), logger, &err) + if let error = err { + throw error + } + resolve(nil) + } catch let error as NSError { + logger.format("core module restart error: %@", level: .Error, error.userInfo.description) + reject("\(String(describing: error.code))", error.userInfo.description, error) + } + } + @objc func getPort(_ resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) { var err: NSError? var port: Int = 0