@functionland/react-native-fula 0.4.2 → 1.1.4

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 (66) hide show
  1. package/README.md +99 -9
  2. package/android/.gradle/7.5.1/checksums/checksums.lock +0 -0
  3. package/android/.gradle/7.5.1/checksums/md5-checksums.bin +0 -0
  4. package/android/.gradle/7.5.1/checksums/sha1-checksums.bin +0 -0
  5. package/android/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock +0 -0
  6. package/android/.gradle/7.5.1/executionHistory/executionHistory.bin +0 -0
  7. package/android/.gradle/7.5.1/executionHistory/executionHistory.lock +0 -0
  8. package/android/.gradle/7.5.1/fileHashes/fileHashes.bin +0 -0
  9. package/android/.gradle/7.5.1/fileHashes/fileHashes.lock +0 -0
  10. package/android/.gradle/7.5.1/fileHashes/resourceHashesCache.bin +0 -0
  11. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  12. package/android/.gradle/buildOutputCleanup/cache.properties +1 -1
  13. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  14. package/android/.gradle/file-system.probe +0 -0
  15. package/android/.idea/jarRepositories.xml +9 -9
  16. package/android/.idea/sonarlint/issuestore/index.pb +0 -0
  17. package/android/build.gradle +7 -5
  18. package/android/gradle/wrapper/gradle-wrapper.properties +7 -6
  19. package/android/gradle.properties +1 -1
  20. package/android/gradlew +53 -2
  21. package/android/local.properties +1 -1
  22. package/android/src/main/java/land/fx/fula/FulaModule.java +840 -72
  23. package/android/src/main/java/land/fx/fula/FulaPackage.java +32 -32
  24. package/lib/commonjs/index.js +5 -1
  25. package/lib/commonjs/index.js.map +1 -1
  26. package/lib/commonjs/interfaces/api-lookup.js +1653 -0
  27. package/lib/commonjs/interfaces/api-lookup.js.map +1 -0
  28. package/lib/commonjs/interfaces/fulaNativeModule.js +1 -1
  29. package/lib/commonjs/interfaces/fulaNativeModule.js.map +1 -1
  30. package/lib/commonjs/protocols/blockchain.js +404 -0
  31. package/lib/commonjs/protocols/blockchain.js.map +1 -0
  32. package/lib/commonjs/protocols/chain-api.js +87 -0
  33. package/lib/commonjs/protocols/chain-api.js.map +1 -0
  34. package/lib/commonjs/protocols/fula.js +120 -7
  35. package/lib/commonjs/protocols/fula.js.map +1 -1
  36. package/lib/commonjs/types/blockchain.js +2 -0
  37. package/lib/commonjs/types/blockchain.js.map +1 -0
  38. package/lib/module/index.js +4 -0
  39. package/lib/module/index.js.map +1 -1
  40. package/lib/module/interfaces/api-lookup.js +1648 -0
  41. package/lib/module/interfaces/api-lookup.js.map +1 -0
  42. package/lib/module/interfaces/fulaNativeModule.js +1 -1
  43. package/lib/module/interfaces/fulaNativeModule.js.map +1 -1
  44. package/lib/module/protocols/blockchain.js +383 -0
  45. package/lib/module/protocols/blockchain.js.map +1 -0
  46. package/lib/module/protocols/chain-api.js +76 -0
  47. package/lib/module/protocols/chain-api.js.map +1 -0
  48. package/lib/module/protocols/fula.js +110 -4
  49. package/lib/module/protocols/fula.js.map +1 -1
  50. package/lib/module/types/blockchain.js +2 -0
  51. package/lib/module/types/blockchain.js.map +1 -0
  52. package/lib/typescript/index.d.ts +2 -0
  53. package/lib/typescript/interfaces/api-lookup.d.ts +1643 -0
  54. package/lib/typescript/interfaces/fulaNativeModule.d.ts +40 -3
  55. package/lib/typescript/protocols/blockchain.d.ts +17 -0
  56. package/lib/typescript/protocols/chain-api.d.ts +6 -0
  57. package/lib/typescript/protocols/fula.d.ts +52 -2
  58. package/lib/typescript/types/blockchain.d.ts +68 -0
  59. package/package.json +13 -8
  60. package/src/index.tsx +3 -1
  61. package/src/interfaces/api-lookup.ts +1647 -0
  62. package/src/interfaces/fulaNativeModule.ts +50 -7
  63. package/src/protocols/blockchain.ts +460 -0
  64. package/src/protocols/chain-api.ts +80 -0
  65. package/src/protocols/fula.ts +157 -12
  66. package/src/types/blockchain.ts +81 -0
@@ -8,8 +8,11 @@ import com.facebook.react.bridge.Promise;
8
8
  import com.facebook.react.bridge.ReactApplicationContext;
9
9
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
10
10
  import com.facebook.react.bridge.ReactMethod;
11
+ import com.facebook.react.bridge.WritableMap;
12
+ import com.facebook.react.bridge.WritableNativeMap;
11
13
  import com.facebook.react.module.annotations.ReactModule;
12
14
 
15
+ import org.apache.commons.io.FileUtils;
13
16
  import org.jetbrains.annotations.Contract;
14
17
 
15
18
  import java.io.File;
@@ -18,51 +21,72 @@ import java.util.Arrays;
18
21
 
19
22
  import javax.crypto.SecretKey;
20
23
 
24
+ import org.json.JSONObject;
25
+ import org.json.JSONArray;
26
+
21
27
  import fulamobile.Config;
22
28
  import fulamobile.Fulamobile;
23
29
 
24
- import land.fx.wnfslib.LibKt;
30
+ import land.fx.wnfslib.Fs;
25
31
 
26
32
  @ReactModule(name = FulaModule.NAME)
27
33
  public class FulaModule extends ReactContextBaseJavaModule {
34
+
35
+
36
+ @Override
37
+ public void initialize() {
38
+ System.loadLibrary("wnfslib");
39
+ System.loadLibrary("gojni");
40
+ }
41
+
42
+
28
43
  public static final String NAME = "FulaModule";
29
44
  fulamobile.Client fula;
45
+
30
46
  Client client;
47
+ Config fulaConfig;
31
48
  String appDir;
32
49
  String fulaStorePath;
33
50
  String privateForest;
34
51
  land.fx.wnfslib.Config rootConfig;
35
52
  SharedPreferenceHelper sharedPref;
53
+ SecretKey secretKeyGlobal;
54
+ String identityEncryptedGlobal;
36
55
  static String PRIVATE_KEY_STORE_ID = "PRIVATE_KEY";
37
56
 
38
- public class Client implements land.fx.wnfslib.Client {
57
+ public static class Client implements land.fx.wnfslib.Datastore {
39
58
 
40
- private fulamobile.Client internalClient;
59
+ private final fulamobile.Client internalClient;
41
60
 
42
61
  Client(fulamobile.Client clientInput) {
43
- internalClient = clientInput;
62
+ this.internalClient = clientInput;
44
63
  }
45
64
 
46
65
  @NonNull
47
66
  @Override
48
67
  public byte[] get(@NonNull byte[] cid) {
49
68
  try {
50
- internalClient.get(cid);
69
+ Log.d("ReactNative", Arrays.toString(cid));
70
+ return this.internalClient.get(cid);
51
71
  } catch (Exception e) {
52
72
  e.printStackTrace();
53
73
  }
54
- return null;
74
+ Log.d("ReactNative","Error get");
75
+ return cid;
55
76
  }
56
77
 
57
78
  @NonNull
58
79
  @Override
59
80
  public byte[] put(@NonNull byte[] data, long codec) {
60
81
  try {
61
- return client.put(data, codec);
82
+ //Log.d("ReactNative", "data="+ Arrays.toString(data) +" ;codec="+codec);
83
+ return this.internalClient.put(data, codec);
62
84
  } catch (Exception e) {
85
+ Log.d("ReactNative", "put Error="+e.getMessage());
63
86
  e.printStackTrace();
64
87
  }
65
- return null;
88
+ Log.d("ReactNative","Error put");
89
+ return data;
66
90
  }
67
91
  }
68
92
 
@@ -85,7 +109,7 @@ public class FulaModule extends ReactContextBaseJavaModule {
85
109
 
86
110
  @Override
87
111
  @NonNull
88
- public String getName() {
112
+ public java.lang.String getName() {
89
113
  return NAME;
90
114
  }
91
115
 
@@ -96,7 +120,7 @@ public class FulaModule extends ReactContextBaseJavaModule {
96
120
 
97
121
  @NonNull
98
122
  @Contract("_ -> new")
99
- private String toString(byte[] input) {
123
+ public String toString(byte[] input) {
100
124
  return new String(input, StandardCharsets.UTF_8);
101
125
  }
102
126
 
@@ -121,7 +145,7 @@ public class FulaModule extends ReactContextBaseJavaModule {
121
145
  }
122
146
 
123
147
  @NonNull
124
- private static byte[] convertStringToByte(@NonNull String data) {
148
+ private byte[] convertStringToByte(@NonNull String data) {
125
149
  String[] keyInt_S = data.split(",");
126
150
  int[] keyInt = stringArrToIntArr(keyInt_S);
127
151
 
@@ -129,23 +153,228 @@ public class FulaModule extends ReactContextBaseJavaModule {
129
153
  }
130
154
 
131
155
  @ReactMethod
132
- public void init(String identityString, String storePath, String bloxAddr, String exchange, Promise promise) {
156
+ public void checkConnection(Promise promise) {
157
+ Log.d("ReactNative", "checkConnection started");
158
+ ThreadUtils.runOnExecutor(() -> {
159
+ if (this.fula != null) {
160
+ try {
161
+ boolean connectionStatus = this.checkConnectionInternal();
162
+ promise.resolve(connectionStatus);
163
+ }
164
+ catch (Exception e) {
165
+ Log.d("ReactNative", "checkConnection failed with Error: " + e.getMessage());
166
+ promise.resolve(false);
167
+ }
168
+ }
169
+ });
170
+ }
171
+
172
+ @ReactMethod
173
+ public void newClient(String identityString, String storePath, String bloxAddr, String exchange, boolean autoFlush, boolean useRelay, Promise promise) {
174
+ Log.d("ReactNative", "newClient started");
175
+ ThreadUtils.runOnExecutor(() -> {
176
+ try {
177
+ Log.d("ReactNative", "newClient storePath= " + storePath);
178
+ byte[] identity = toByte(identityString);
179
+ Log.d("ReactNative", "newClient identity= " + identityString);
180
+ this.newClientInternal(identity, storePath, bloxAddr, exchange, autoFlush, useRelay);
181
+ //String objString = Arrays.toString(obj);
182
+ String peerId = this.fula.id();
183
+ promise.resolve(peerId);
184
+ } catch (Exception e) {
185
+ Log.d("ReactNative", "newClient failed with Error: " + e.getMessage());
186
+ promise.reject("Error", e.getMessage());
187
+ }
188
+ });
189
+ }
190
+
191
+ @ReactMethod
192
+ public void isReady(boolean filesystemCheck, Promise promise) {
193
+ Log.d("ReactNative", "isReady started");
194
+ ThreadUtils.runOnExecutor(() -> {
195
+ boolean initialized = false;
196
+ try {
197
+ if (this.fula != null && this.fula.id() != null) {
198
+ if (filesystemCheck) {
199
+ if (this.client != null && this.rootConfig != null && !this.rootConfig.getCid().isEmpty()) {
200
+ initialized = true;
201
+ }
202
+ } else {
203
+ initialized = true;
204
+ }
205
+ }
206
+ promise.resolve(initialized);
207
+ } catch (Exception e) {
208
+ Log.d("ReactNative", "isReady failed with Error: " + e.getMessage());
209
+ promise.reject("Error", e.getMessage());
210
+ }
211
+ });
212
+ }
213
+
214
+ @ReactMethod
215
+ public void init(String identityString, String storePath, String bloxAddr, String exchange, boolean autoFlush, String rootConfig, boolean useRelay, boolean refresh, Promise promise) {
133
216
  Log.d("ReactNative", "init started");
134
217
  ThreadUtils.runOnExecutor(() -> {
135
218
  try {
219
+ WritableMap resultData = new WritableNativeMap();
136
220
  Log.d("ReactNative", "init storePath= " + storePath);
137
221
  byte[] identity = toByte(identityString);
138
222
  Log.d("ReactNative", "init identity= " + identityString);
139
- String[] obj = initInternal(identity, storePath, bloxAddr, exchange);
223
+ String[] obj = this.initInternal(identity, storePath, bloxAddr, exchange, autoFlush, rootConfig, useRelay, refresh);
140
224
  Log.d("ReactNative", "init object created: [ " + obj[0] + ", " + obj[1] + ", " + obj[2] + " ]");
141
- promise.resolve(obj);
225
+ resultData.putString("peerId", obj[0]);
226
+ resultData.putString("rootCid", obj[1]);
227
+ resultData.putString("private_ref", obj[2]);
228
+ promise.resolve(resultData);
142
229
  } catch (Exception e) {
143
230
  Log.d("ReactNative", "init failed with Error: " + e.getMessage());
144
- promise.reject(e);
231
+ promise.reject("Error", e.getMessage());
232
+ }
233
+ });
234
+ }
235
+
236
+ @ReactMethod
237
+ public void logout(String identityString, String storePath, Promise promise) {
238
+ Log.d("ReactNative", "logout started");
239
+ ThreadUtils.runOnExecutor(() -> {
240
+ try {
241
+ byte[] identity = toByte(identityString);
242
+ boolean obj = this.logoutInternal(identity, storePath);
243
+ Log.d("ReactNative", "logout completed");
244
+ promise.resolve(obj);
245
+ } catch (Exception e) {
246
+ Log.d("ReactNative", "logout failed with Error: " + e.getMessage());
247
+ promise.reject("Error", e.getMessage());
145
248
  }
146
249
  });
147
250
  }
148
251
 
252
+ private boolean checkConnectionInternal() throws Exception {
253
+ try {
254
+ Log.d("ReactNative", "checkConnectionInternal started");
255
+ if (this.fula != null) {
256
+ try {
257
+ Log.d("ReactNative", "connectToBlox started");
258
+ this.fula.connectToBlox();
259
+ return true;
260
+ }
261
+ catch (Exception e) {
262
+ Log.d("ReactNative", "checkConnectionInternal failed with Error: " + e.getMessage());
263
+ return false;
264
+ }
265
+ } else {
266
+ Log.d("ReactNative", "checkConnectionInternal failed because fula is not initialized ");
267
+ return false;
268
+ }
269
+ } catch (Exception e) {
270
+ Log.d("ReactNative", "checkConnectionInternal failed with Error: " + e.getMessage());
271
+ throw (e);
272
+ }
273
+ }
274
+
275
+ @ReactMethod
276
+ private void checkFailedActions(boolean retry, Promise promise) throws Exception {
277
+ try {
278
+ if (this.fula != null) {
279
+ if (!retry) {
280
+ Log.d("ReactNative", "checkFailedActions without retry");
281
+ fulamobile.LinkIterator failedLinks = this.fula.listFailedPushes();
282
+ if (failedLinks.hasNext()) {
283
+ Log.d("ReactNative", "checkFailedActions found: "+Arrays.toString(failedLinks.next()));
284
+ promise.resolve(true);
285
+ } else {
286
+ promise.resolve(false);
287
+ }
288
+ } else {
289
+ Log.d("ReactNative", "checkFailedActions with retry");
290
+ boolean retryResults = this.retryFailedActionsInternal();
291
+ promise.resolve(!retryResults);
292
+ }
293
+ } else {
294
+ throw new Exception("Fula is not initialized");
295
+ }
296
+ } catch (Exception e) {
297
+ Log.d("ReactNative", "checkFailedActions failed with Error: " + e.getMessage());
298
+ throw (e);
299
+ }
300
+ }
301
+
302
+ private boolean retryFailedActionsInternal() throws Exception {
303
+ try {
304
+ Log.d("ReactNative", "retryFailedActionsInternal started");
305
+ if (this.fula != null) {
306
+ //Fula is initialized
307
+ try {
308
+ boolean connectionCheck = this.checkConnectionInternal();
309
+ if(connectionCheck) {
310
+ try {
311
+ Log.d("ReactNative", "retryFailedPushes started");
312
+ this.fula.retryFailedPushes();
313
+ Log.d("ReactNative", "flush started");
314
+ this.fula.flush();
315
+ return true;
316
+ }
317
+ catch (Exception e) {
318
+ this.fula.flush();
319
+ Log.d("ReactNative", "retryFailedActionsInternal failed with Error: " + e.getMessage());
320
+ return false;
321
+ }
322
+ //Blox online
323
+ /*fulamobile.LinkIterator failedLinks = this.fula.listFailedPushes();
324
+ if (failedLinks.hasNext()) {
325
+ Log.d("ReactNative", "Failed links");
326
+ //Failed list is not empty. iterate in the list
327
+ while (failedLinks.hasNext()) {
328
+ //Get the missing key
329
+ byte[] failedNode = failedLinks.next();
330
+ try {
331
+ //Push to Blox
332
+ Log.d("ReactNative", "Pushing Failed links "+Arrays.toString(failedNode));
333
+ this.pushInternal(failedNode);
334
+ Log.d("ReactNative", "Failed links pushed");
335
+ }
336
+ catch (Exception e) {
337
+ Log.d("ReactNative", "retryFailedActionsInternal failed with Error: " + e.getMessage());
338
+ }
339
+ }
340
+ //check if list is empty now and all are pushed
341
+ Log.d("ReactNative", "Pushing finished");
342
+ fulamobile.LinkIterator failedLinks_after = this.fula.listFailedPushes();
343
+ if(failedLinks_after.hasNext()) {
344
+ //Some pushes failed
345
+ byte[] first_failed = failedLinks_after.next();
346
+ Log.d("ReactNative", "Failed links are not empty "+Arrays.toString(first_failed));
347
+ return false;
348
+ } else {
349
+ //All pushes successful
350
+ return true;
351
+ }
352
+ } else {
353
+ Log.d("ReactNative", "No Failed links");
354
+ //Failed list is empty
355
+ return true;
356
+ }*/
357
+ } else {
358
+ Log.d("ReactNative", "retryFailedActions failed because blox is offline");
359
+ //Blox Offline
360
+ return false;
361
+ }
362
+ }
363
+ catch (Exception e) {
364
+ Log.d("ReactNative", "retryFailedActions failed with Error: " + e.getMessage());
365
+ return false;
366
+ }
367
+ } else {
368
+ Log.d("ReactNative", "retryFailedActions failed because fula is not initialized");
369
+ //Fula is not initialized
370
+ return false;
371
+ }
372
+ } catch (Exception e) {
373
+ Log.d("ReactNative", "retryFailedActions failed with Error: " + e.getMessage());
374
+ throw (e);
375
+ }
376
+ }
377
+
149
378
  @NonNull
150
379
  private byte[] createPeerIdentity(byte[] privateKey) throws Exception {
151
380
  try {
@@ -170,34 +399,203 @@ public class FulaModule extends ReactContextBaseJavaModule {
170
399
  }
171
400
  }
172
401
 
402
+ private void createNewRootConfig(FulaModule.Client iClient, byte[] identity) throws Exception {
403
+ this.privateForest = Fs.createPrivateForest(iClient);
404
+ Log.d("ReactNative", "privateForest is created: " + this.privateForest);
405
+ this.rootConfig = Fs.createRootDir(iClient, this.privateForest, identity);
406
+ if (this.fula != null) {
407
+ this.fula.flush();
408
+ }
409
+ Log.d("ReactNative", "new rootConfig is created: cid=" + this.rootConfig.getCid()+" & private_ref="+this.rootConfig.getPrivate_ref());
410
+
411
+ this.encrypt_and_store_config();
412
+ }
413
+
414
+ private String getPrivateRef(FulaModule.Client iClient, byte[] wnfsKey, String rootCid) throws Exception {
415
+ Log.d("ReactNative", "getPrivateRef called: rootCid=" + rootCid);
416
+ String privateRef = Fs.getPrivateRef(iClient, wnfsKey, rootCid);
417
+ Log.d("ReactNative", "getPrivateRef completed: privateRef=" + privateRef);
418
+ return privateRef;
419
+ }
420
+
421
+ private boolean encrypt_and_store_config() throws Exception {
422
+ try {
423
+ if(this.identityEncryptedGlobal != null && !this.identityEncryptedGlobal.isEmpty()) {
424
+ String cid_encrypted = Cryptography.encryptMsg(this.rootConfig.getCid(), this.secretKeyGlobal);
425
+ String private_ref_encrypted = Cryptography.encryptMsg(this.rootConfig.getPrivate_ref(), this.secretKeyGlobal);
426
+
427
+ sharedPref.add("cid_encrypted_" + this.identityEncryptedGlobal, cid_encrypted);
428
+ sharedPref.add("private_ref_encrypted_" + this.identityEncryptedGlobal, private_ref_encrypted);
429
+ return true;
430
+ } else {
431
+ return false;
432
+ }
433
+ } catch (Exception e) {
434
+ Log.d("ReactNative", "encrypt_and_store_config failed with Error: " + e.getMessage());
435
+ throw (e);
436
+ }
437
+ }
438
+
439
+ private boolean logoutInternal(byte[] identity, String storePath) throws Exception {
440
+ try {
441
+ if (this.fula != null) {
442
+ this.fula.flush();
443
+ }
444
+ SecretKey secretKey = Cryptography.generateKey(identity);
445
+ String identity_encrypted = Cryptography.encryptMsg(Arrays.toString(identity), secretKey);
446
+ sharedPref.remove("cid_encrypted_"+ identity_encrypted);
447
+ sharedPref.remove("private_ref_encrypted_"+identity_encrypted);
448
+
449
+ //TODO: Should also remove peerid @Mahdi
450
+
451
+ sharedPref.remove("cid_encrypted_"+ identity_encrypted);
452
+ sharedPref.remove("private_ref_encrypted_"+ identity_encrypted);
453
+
454
+ this.rootConfig = null;
455
+ this.secretKeyGlobal = null;
456
+ this.identityEncryptedGlobal = null;
457
+
458
+ if (storePath == null || storePath.trim().isEmpty()) {
459
+ storePath = this.fulaStorePath;
460
+ }
461
+
462
+ File file = new File(storePath);
463
+ FileUtils.deleteDirectory(file);
464
+ return true;
465
+
466
+ } catch (Exception e) {
467
+ Log.d("ReactNative", "logout internal failed with Error: " + e.getMessage());
468
+ throw (e);
469
+ }
470
+ }
471
+
472
+ public fulamobile.Client getFulaClient() {
473
+ return this.fula;
474
+ }
475
+
173
476
  @NonNull
174
- private String[] initInternal(byte[] identity, String storePath, String bloxAddr, String exchange) throws Exception {
477
+ private byte[] newClientInternal(byte[] identity, String storePath, String bloxAddr, String exchange, boolean autoFlush, boolean useRelay) throws Exception {
175
478
  try {
176
- Config config_ext = new Config();
479
+ fulaConfig = new Config();
177
480
  if (storePath == null || storePath.trim().isEmpty()) {
178
- config_ext.setStorePath(fulaStorePath);
481
+ fulaConfig.setStorePath(this.fulaStorePath);
179
482
  } else {
180
- config_ext.setStorePath(storePath);
181
- }
182
- Log.d("ReactNative", "storePath is set: " + config_ext.getStorePath());
183
-
184
- byte[] peerIdentity = createPeerIdentity(identity);
185
- config_ext.setIdentity(peerIdentity);
186
- Log.d("ReactNative", "peerIdentity is set: " + toString(config_ext.getIdentity()));
187
- config_ext.setBloxAddr(bloxAddr);
188
- Log.d("ReactNative", "bloxAddr is set: " + config_ext.getBloxAddr());
189
- config_ext.setExchange(exchange);
190
- this.fula = Fulamobile.newClient(config_ext);
191
- this.client = new Client(this.fula);
192
- Log.d("ReactNative", "fula initialized: " + this.fula.id());
193
- if (this.rootConfig == null) {
194
- Log.d("ReactNative", "creating rootConfig");
195
- this.privateForest = LibKt.createPrivateForest(this.client);
196
- Log.d("ReactNative", "privateForest is created: " + this.privateForest);
197
- this.rootConfig = LibKt.createRootDir(this.client, this.privateForest);
198
- Log.d("ReactNative", "rootConfig is created: " + this.rootConfig.getCid());
483
+ fulaConfig.setStorePath(storePath);
484
+ }
485
+ Log.d("ReactNative", "storePath is set: " + fulaConfig.getStorePath());
486
+
487
+ byte[] peerIdentity = this.createPeerIdentity(identity);
488
+ fulaConfig.setIdentity(peerIdentity);
489
+ Log.d("ReactNative", "peerIdentity is set: " + toString(fulaConfig.getIdentity()));
490
+ fulaConfig.setBloxAddr(bloxAddr);
491
+ Log.d("ReactNative", "bloxAddr is set: " + fulaConfig.getBloxAddr());
492
+ fulaConfig.setExchange(exchange);
493
+ fulaConfig.setSyncWrites(autoFlush);
494
+ if (useRelay) {
495
+ fulaConfig.setAllowTransientConnection(true);
496
+ fulaConfig.setForceReachabilityPrivate(true);
497
+ }
498
+ if (this.fula == null) {
499
+ Log.d("ReactNative", "Creating a new Fula instance");
500
+ this.fula = Fulamobile.newClient(fulaConfig);
501
+ }
502
+ if (this.fula != null) {
503
+ this.fula.flush();
504
+ }
505
+ return peerIdentity;
506
+ } catch (Exception e) {
507
+ Log.d("ReactNative", "newclientInternal failed with Error: " + e.getMessage());
508
+ throw (e);
509
+ }
510
+ }
511
+
512
+ @NonNull
513
+ private String[] initInternal(byte[] identity, String storePath, String bloxAddr, String exchange, boolean autoFlush, String rootCid, boolean useRelay, boolean refresh) throws Exception {
514
+ try {
515
+ if (this.fula == null || refresh) {
516
+ this.newClientInternal(identity, storePath, bloxAddr, exchange, autoFlush, useRelay);
517
+ }
518
+ if(this.client == null || refresh) {
519
+ this.client = new Client(this.fula);
520
+ Log.d("ReactNative", "fula initialized: " + this.fula.id());
521
+ }
522
+
523
+ SecretKey secretKey = Cryptography.generateKey(identity);
524
+ String identity_encrypted =Cryptography.encryptMsg(Arrays.toString(identity), secretKey);
525
+ this.identityEncryptedGlobal = identity_encrypted;
526
+ this.secretKeyGlobal = secretKey;
527
+
528
+ if (this.rootConfig == null || this.rootConfig.getCid().isEmpty() || this.rootConfig.getPrivate_ref().isEmpty()) {
529
+ Log.d("ReactNative", "this.rootCid is empty.");
530
+ //Load from keystore
531
+
532
+ String cid_encrypted_fetched = sharedPref.getValue("cid_encrypted_"+ identity_encrypted);
533
+ String private_ref_encrypted_fetched = sharedPref.getValue("private_ref_encrypted_"+identity_encrypted);
534
+ Log.d("ReactNative", "Here1");
535
+ String cid = "";
536
+ String private_ref = "";
537
+ if(cid_encrypted_fetched != null && !cid_encrypted_fetched.isEmpty()) {
538
+ Log.d("ReactNative", "decrypting cid="+cid_encrypted_fetched+" with secret="+secretKey.toString());
539
+ cid = Cryptography.decryptMsg(cid_encrypted_fetched, secretKey);
540
+ }
541
+ if(private_ref_encrypted_fetched != null && !private_ref_encrypted_fetched.isEmpty()) {
542
+ Log.d("ReactNative", "decrypting private_ref="+private_ref_encrypted_fetched+" with secret="+secretKey.toString());
543
+ private_ref = Cryptography.decryptMsg(private_ref_encrypted_fetched, secretKey);
544
+ }
545
+ Log.d("ReactNative", "Here2");
546
+ //Log.d("ReactNative", "Attempted to fetch cid from keystore; cid="+cid+" & private_ref="+private_ref);
547
+ if((cid == null || cid.isEmpty()) || (private_ref == null || private_ref.isEmpty()) ){
548
+ Log.d("ReactNative", "cid or PrivateRef was not found");
549
+ if(rootCid != null && !rootCid.isEmpty()){
550
+ Log.d("ReactNative", "Re-setting cid from input: "+rootCid);
551
+ cid = rootCid;
552
+ }
553
+ if((private_ref == null || private_ref.isEmpty()) && (cid != null && !cid.isEmpty())){
554
+ Log.d("ReactNative", "Re-fetching privateRef from wnfs: cid="+cid);
555
+ private_ref = this.getPrivateRef(this.client, identity, cid);
556
+ Log.d("ReactNative", "Re-fetching privateRef from wnfs: "+private_ref);
557
+ }
558
+ if(cid == null || cid.isEmpty() || private_ref == null || private_ref.isEmpty()) {
559
+ Log.d("ReactNative", "Tried to recover cid and privateRef but was not successful. Creating new ones");
560
+ this.createNewRootConfig(this.client, identity);
561
+ } else {
562
+ Log.d("ReactNative", "Tried to recover cid and privateRef and was successful. cid:"+cid+" & private_ref="+private_ref);
563
+ this.rootConfig = new land.fx.wnfslib.Config(cid, private_ref);
564
+ this.encrypt_and_store_config();
565
+ }
566
+ } else if(cid != null && !cid.isEmpty() && private_ref != null && !private_ref.isEmpty()) {
567
+ Log.d("ReactNative", "Found cid and private ref in keychain store");
568
+ if(cid != null && !cid.isEmpty() && private_ref != null && !private_ref.isEmpty()) {
569
+ Log.d("ReactNative", "Recovered cid and private ref from keychain store. cid="+cid+" & private_ref="+private_ref);
570
+ this.rootConfig = new land.fx.wnfslib.Config(cid, private_ref);
571
+ } else{
572
+ Log.d("ReactNative", "Found but Could not recover cid and private_ref from keychain store");
573
+ this.createNewRootConfig(this.client, identity);
574
+ }
575
+ } else{
576
+ Log.d("ReactNative", "This cid and private_ref generation should never happen!!!");
577
+ //Create new root and store cid and private_ref
578
+ this.createNewRootConfig(this.client, identity);
579
+ }
580
+
581
+
582
+ Log.d("ReactNative", "creating rootConfig completed");
583
+
584
+ /*
585
+ byte[] testbyte = convertStringToByte("-104,40,24,-93,24,100,24,114,24,111,24,111,24,116,24,-126,24,-126,0,0,24,-128,24,103,24,118,24,101,24,114,24,115,24,105,24,111,24,110,24,101,24,48,24,46,24,49,24,46,24,48,24,105,24,115,24,116,24,114,24,117,24,99,24,116,24,117,24,114,24,101,24,100,24,104,24,97,24,109,24,116");
586
+ long testcodec = 85;
587
+ byte[] testputcid = this.client.put(testbyte, testcodec);
588
+ Log.d("ReactNative", "client.put test done"+ Arrays.toString(testputcid));
589
+ byte[] testfetchedcid = convertStringToByte("1,113,18,32,-6,-63,-128,79,-102,-89,57,77,-8,67,-98,8,-81,40,-87,123,122,29,-52,-124,-60,-53,100,105,125,123,-5,-99,41,106,-124,-64");
590
+ byte[] testfetchedbytes = this.client.get(testfetchedcid);
591
+ Log.d("ReactNative", "client.get test done"+ Arrays.toString(testfetchedbytes));
592
+ */
593
+
594
+
595
+ Log.d("ReactNative", "rootConfig is created: cid=" + this.rootConfig.getCid()+ "& private_ref="+this
596
+ .rootConfig.getPrivate_ref());
199
597
  } else {
200
- Log.d("ReactNative", "rootConfig existed: " + this.rootConfig.getCid());
598
+ Log.d("ReactNative", "rootConfig existed: cid=" + this.rootConfig.getCid()+ " & private_ref="+this.rootConfig.getPrivate_ref());
201
599
  }
202
600
  String peerId = this.fula.id();
203
601
  String[] obj = new String[3];
@@ -205,6 +603,9 @@ public class FulaModule extends ReactContextBaseJavaModule {
205
603
  obj[1] = this.rootConfig.getCid();
206
604
  obj[2] = this.rootConfig.getPrivate_ref();
207
605
  Log.d("ReactNative", "initInternal is completed successfully");
606
+ if (this.fula != null) {
607
+ this.fula.flush();
608
+ }
208
609
  return obj;
209
610
  } catch (Exception e) {
210
611
  Log.d("ReactNative", "init internal failed with Error: " + e.getMessage());
@@ -217,9 +618,18 @@ public class FulaModule extends ReactContextBaseJavaModule {
217
618
  ThreadUtils.runOnExecutor(() -> {
218
619
  Log.d("ReactNative", "mkdir: path = " + path);
219
620
  try {
220
- land.fx.wnfslib.Config config = LibKt.mkdir(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path);
221
- this.rootConfig = config;
222
- promise.resolve(config.getCid());
621
+ land.fx.wnfslib.Config config = Fs.mkdir(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path);
622
+ if(config != null) {
623
+ this.rootConfig = config;
624
+ this.encrypt_and_store_config();
625
+ if (this.fula != null) {
626
+ this.fula.flush();
627
+ }
628
+ promise.resolve(config.getCid());
629
+ } else {
630
+ Log.d("ReactNative", "mkdir Error: config is null");
631
+ promise.reject(new Exception("mkdir Error: config is null"));
632
+ }
223
633
  } catch (Exception e) {
224
634
  Log.d("get", e.getMessage());
225
635
  promise.reject(e);
@@ -239,9 +649,18 @@ public class FulaModule extends ReactContextBaseJavaModule {
239
649
  ThreadUtils.runOnExecutor(() -> {
240
650
  Log.d("ReactNative", "writeFile to : path = " + fulaTargetFilename + ", from: " + localFilename);
241
651
  try {
242
- land.fx.wnfslib.Config config = LibKt.writeFileFromPath(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), fulaTargetFilename, localFilename);
243
- this.rootConfig = config;
244
- promise.resolve(config.getCid());
652
+ land.fx.wnfslib.Config config = Fs.writeFileFromPath(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), fulaTargetFilename, localFilename);
653
+ if(config != null) {
654
+ this.rootConfig = config;
655
+ this.encrypt_and_store_config();
656
+ if (this.fula != null) {
657
+ this.fula.flush();
658
+ }
659
+ promise.resolve(config.getCid());
660
+ } else {
661
+ Log.d("ReactNative", "writeFile Error: config is null");
662
+ promise.reject(new Exception("writeFile Error: config is null"));
663
+ }
245
664
  } catch (Exception e) {
246
665
  Log.d("get", e.getMessage());
247
666
  promise.reject(e);
@@ -255,9 +674,13 @@ public class FulaModule extends ReactContextBaseJavaModule {
255
674
  Log.d("ReactNative", "writeFile: contentString = " + contentString);
256
675
  Log.d("ReactNative", "writeFile: path = " + path);
257
676
  try {
258
- byte[] content = convertStringToByte(contentString);
259
- land.fx.wnfslib.Config config = LibKt.writeFile(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path, content);
677
+ byte[] content = this.convertStringToByte(contentString);
678
+ land.fx.wnfslib.Config config = Fs.writeFile(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path, content);
260
679
  this.rootConfig = config;
680
+ this.encrypt_and_store_config();
681
+ if (this.fula != null) {
682
+ this.fula.flush();
683
+ }
261
684
  promise.resolve(config.getCid());
262
685
  } catch (Exception e) {
263
686
  Log.d("get", e.getMessage());
@@ -271,8 +694,12 @@ public class FulaModule extends ReactContextBaseJavaModule {
271
694
  ThreadUtils.runOnExecutor(() -> {
272
695
  Log.d("ReactNative", "ls: path = " + path);
273
696
  try {
274
- String res = LibKt.ls(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path);
275
- promise.resolve(res);
697
+ byte[] res = Fs.ls(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path);
698
+
699
+ //JSONArray jsonArray = new JSONArray(res);
700
+ String s = new String(res, StandardCharsets.UTF_8);
701
+ Log.d("ReactNative", "ls: res = " + s);
702
+ promise.resolve(s);
276
703
  } catch (Exception e) {
277
704
  Log.d("get", e.getMessage());
278
705
  promise.reject(e);
@@ -285,9 +712,66 @@ public class FulaModule extends ReactContextBaseJavaModule {
285
712
  ThreadUtils.runOnExecutor(() -> {
286
713
  Log.d("ReactNative", "rm: path = " + path);
287
714
  try {
288
- land.fx.wnfslib.Config config = LibKt.rm(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path);
289
- this.rootConfig = config;
290
- promise.resolve(config.getCid());
715
+ land.fx.wnfslib.Config config = Fs.rm(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path);
716
+ if(config != null) {
717
+ this.rootConfig = config;
718
+ this.encrypt_and_store_config();
719
+ if (this.fula != null) {
720
+ this.fula.flush();
721
+ }
722
+ promise.resolve(config.getCid());
723
+ } else {
724
+ Log.d("ReactNative", "rm Error: config is null");
725
+ promise.reject(new Exception("rm Error: config is null"));
726
+ }
727
+ } catch (Exception e) {
728
+ Log.d("get", e.getMessage());
729
+ promise.reject(e);
730
+ }
731
+ });
732
+ }
733
+
734
+ @ReactMethod
735
+ public void cp(String sourcePath, String targetPath, Promise promise) {
736
+ ThreadUtils.runOnExecutor(() -> {
737
+ Log.d("ReactNative", "rm: sourcePath = " + sourcePath);
738
+ try {
739
+ land.fx.wnfslib.Config config = Fs.cp(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), sourcePath, targetPath);
740
+ if(config != null) {
741
+ this.rootConfig = config;
742
+ this.encrypt_and_store_config();
743
+ if (this.fula != null) {
744
+ this.fula.flush();
745
+ }
746
+ promise.resolve(config.getCid());
747
+ } else {
748
+ Log.d("ReactNative", "cp Error: config is null");
749
+ promise.reject(new Exception("cp Error: config is null"));
750
+ }
751
+ } catch (Exception e) {
752
+ Log.d("get", e.getMessage());
753
+ promise.reject(e);
754
+ }
755
+ });
756
+ }
757
+
758
+ @ReactMethod
759
+ public void mv(String sourcePath, String targetPath, Promise promise) {
760
+ ThreadUtils.runOnExecutor(() -> {
761
+ Log.d("ReactNative", "rm: sourcePath = " + sourcePath);
762
+ try {
763
+ land.fx.wnfslib.Config config = Fs.mv(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), sourcePath, targetPath);
764
+ if(config != null) {
765
+ this.rootConfig = config;
766
+ this.encrypt_and_store_config();
767
+ if (this.fula != null) {
768
+ this.fula.flush();
769
+ }
770
+ promise.resolve(config.getCid());
771
+ } else {
772
+ Log.d("ReactNative", "mv Error: config is null");
773
+ promise.reject(new Exception("mv Error: config is null"));
774
+ }
291
775
  } catch (Exception e) {
292
776
  Log.d("get", e.getMessage());
293
777
  promise.reject(e);
@@ -307,7 +791,7 @@ public class FulaModule extends ReactContextBaseJavaModule {
307
791
  ThreadUtils.runOnExecutor(() -> {
308
792
  Log.d("ReactNative", "readFile: fulaTargetFilename = " + fulaTargetFilename);
309
793
  try {
310
- String path = LibKt.readFileToPath(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), fulaTargetFilename, localFilename);
794
+ String path = Fs.readFilestreamToPath(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), fulaTargetFilename, localFilename);
311
795
  promise.resolve(path);
312
796
  } catch (Exception e) {
313
797
  Log.d("get", e.getMessage());
@@ -321,7 +805,7 @@ public class FulaModule extends ReactContextBaseJavaModule {
321
805
  ThreadUtils.runOnExecutor(() -> {
322
806
  Log.d("ReactNative", "readFileContent: path = " + path);
323
807
  try {
324
- byte[] res = LibKt.readFile(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path);
808
+ byte[] res = Fs.readFile(this.client, this.rootConfig.getCid(), this.rootConfig.getPrivate_ref(), path);
325
809
  String resString = toString(res);
326
810
  promise.resolve(resString);
327
811
  } catch (Exception e) {
@@ -336,8 +820,8 @@ public class FulaModule extends ReactContextBaseJavaModule {
336
820
  ThreadUtils.runOnExecutor(() -> {
337
821
  Log.d("ReactNative", "get: keyString = " + keyString);
338
822
  try {
339
- byte[] key = convertStringToByte(keyString);
340
- byte[] value = getInternal(key);
823
+ byte[] key = this.convertStringToByte(keyString);
824
+ byte[] value = this.getInternal(key);
341
825
  String valueString = toString(value);
342
826
  promise.resolve(valueString);
343
827
  } catch (Exception e) {
@@ -367,8 +851,8 @@ public class FulaModule extends ReactContextBaseJavaModule {
367
851
  ThreadUtils.runOnExecutor(() -> {
368
852
  Log.d("ReactNative", "has: keyString = " + keyString);
369
853
  try {
370
- byte[] key = convertStringToByte(keyString);
371
- boolean result = hasInternal(key);
854
+ byte[] key = this.convertStringToByte(keyString);
855
+ boolean result = this.hasInternal(key);
372
856
  promise.resolve(result);
373
857
  } catch (Exception e) {
374
858
  Log.d("get", e.getMessage());
@@ -377,7 +861,6 @@ public class FulaModule extends ReactContextBaseJavaModule {
377
861
  });
378
862
  }
379
863
 
380
- @NonNull
381
864
  private boolean hasInternal(byte[] key) throws Exception {
382
865
  try {
383
866
  boolean res = this.fula.has(key);
@@ -388,7 +871,6 @@ public class FulaModule extends ReactContextBaseJavaModule {
388
871
  }
389
872
  }
390
873
 
391
- @NonNull
392
874
  private void pullInternal(byte[] key) throws Exception {
393
875
  try {
394
876
  this.fula.pull(key);
@@ -403,7 +885,7 @@ public class FulaModule extends ReactContextBaseJavaModule {
403
885
  ThreadUtils.runOnExecutor(() -> {
404
886
  Log.d("ReactNative", "push started");
405
887
  try {
406
- pushInternal(convertStringToByte(this.rootConfig.getCid()));
888
+ this.pushInternal(this.convertStringToByte(this.rootConfig.getCid()));
407
889
  promise.resolve(this.rootConfig.getCid());
408
890
  } catch (Exception e) {
409
891
  Log.d("get", e.getMessage());
@@ -412,17 +894,17 @@ public class FulaModule extends ReactContextBaseJavaModule {
412
894
  });
413
895
  }
414
896
 
415
- @NonNull
416
897
  private void pushInternal(byte[] key) throws Exception {
417
898
  try {
418
- if (this.fula.has(key)) {
899
+ if (this.fula != null && this.fula.has(key)) {
419
900
  this.fula.push(key);
901
+ this.fula.flush();
420
902
  } else {
421
- Log.d("pushInternal", "error: key wasn't found");
903
+ Log.d("ReactNative", "pushInternal error: key wasn't found or fula is not initialized");
422
904
  throw new Exception("key wasn't found in local storage");
423
905
  }
424
906
  } catch (Exception e) {
425
- Log.d("pushInternal", e.getMessage());
907
+ Log.d("ReactNative", "pushInternal"+ e.getMessage());
426
908
  throw (e);
427
909
  }
428
910
  }
@@ -433,7 +915,7 @@ public class FulaModule extends ReactContextBaseJavaModule {
433
915
  Log.d("ReactNative", "put: codecString = " + codecString);
434
916
  Log.d("ReactNative", "put: valueString = " + valueString);
435
917
  try {
436
- //byte[] codec = convertStringToByte(CodecString);
918
+ //byte[] codec = this.convertStringToByte(CodecString);
437
919
  long codec = Long.parseLong(codecString);
438
920
 
439
921
 
@@ -441,12 +923,11 @@ public class FulaModule extends ReactContextBaseJavaModule {
441
923
  byte[] value = toByte(valueString);
442
924
 
443
925
  Log.d("ReactNative", "put: value.toString() = " + toString(value));
444
- byte[] key = putInternal(value, codec);
926
+ byte[] key = this.putInternal(value, codec);
445
927
  Log.d("ReactNative", "put: key.toString() = " + toString(key));
446
928
  promise.resolve(toString(key));
447
929
  } catch (Exception e) {
448
930
  Log.d("ReactNative", "put: error = " + e.getMessage());
449
- Log.d("put", e.getMessage());
450
931
  promise.reject(e);
451
932
  }
452
933
  });
@@ -455,26 +936,313 @@ public class FulaModule extends ReactContextBaseJavaModule {
455
936
  @NonNull
456
937
  private byte[] putInternal(byte[] value, long codec) throws Exception {
457
938
  try {
458
- byte[] key = this.fula.put(value, codec);
459
- return key;
939
+ if(this.fula != null) {
940
+ byte[] key = this.fula.put(value, codec);
941
+ this.fula.flush();
942
+ return key;
943
+ } else {
944
+ Log.d("ReactNative", "putInternal Error: fula is not initialized");
945
+ throw (new Exception("putInternal Error: fula is not initialized"));
946
+ }
460
947
  } catch (Exception e) {
461
- Log.d("putInternal", e.getMessage());
948
+ Log.d("ReactNative", "putInternal"+ e.getMessage());
462
949
  throw (e);
463
950
  }
464
951
  }
465
952
 
953
+ @ReactMethod
954
+ public void setAuth(String peerIdString, boolean allow, Promise promise) {
955
+ ThreadUtils.runOnExecutor(() -> {
956
+ Log.d("ReactNative", "setAuth: peerIdString = " + peerIdString);
957
+ try {
958
+ if (this.fula != null && this.fula.id() != null && this.fulaConfig != null && this.fulaConfig.getBloxAddr() != null) {
959
+ String bloxAddr = this.fulaConfig.getBloxAddr();
960
+ Log.d("ReactNative", "setAuth: bloxAddr = '" + bloxAddr+"'"+ " peerIdString = '" + peerIdString+"'");
961
+ int index = bloxAddr.lastIndexOf("/");
962
+ String bloxPeerId = bloxAddr.substring(index + 1);
963
+ this.fula.setAuth(bloxPeerId, peerIdString, allow);
964
+ promise.resolve(true);
965
+ } else {
966
+ Log.d("ReactNative", "setAuth error: fula is not initialized");
967
+ throw new Exception("fula is not initialized");
968
+ }
969
+ promise.resolve(false);
970
+ } catch (Exception e) {
971
+ Log.d("get", e.getMessage());
972
+ promise.reject(e);
973
+ }
974
+ });
975
+ }
976
+
466
977
  @ReactMethod
467
978
  public void shutdown(Promise promise) {
468
979
  ThreadUtils.runOnExecutor(() -> {
469
980
  try {
470
- fula.shutdown();
981
+ if(this.fula != null) {
982
+ this.fula.shutdown();
983
+ this.fula = null;
984
+ this.client = null;
985
+ }
471
986
  promise.resolve(true);
472
987
  } catch (Exception e) {
473
988
  promise.reject(e);
474
- Log.d("shutdown", e.getMessage());
989
+ Log.d("ReactNative", "shutdown"+ e.getMessage());
990
+ }
991
+ });
992
+ }
993
+
994
+ ///////////////////////////////////////////////////////////
995
+ ///////////////////////////////////////////////////////////
996
+ ///////////////////////////////////////////////////////////
997
+ ///////////////////////////////////////////////////////////
998
+ //////////////////////ANYTHING BELOW IS FOR BLOCKCHAIN/////
999
+ ///////////////////////////////////////////////////////////
1000
+ @ReactMethod
1001
+ public void createAccount(String seedString, Promise promise) {
1002
+ ThreadUtils.runOnExecutor(() -> {
1003
+ Log.d("ReactNative", "createAccount: seedString = " + seedString);
1004
+ try {
1005
+ if (this.fula == null || this.fula.id() == null || this.fula.id().isEmpty()) {
1006
+ promise.reject(new Error("Fula client is not initialized"));
1007
+ } else {
1008
+
1009
+ if (!seedString.startsWith("/")) {
1010
+ promise.reject(new Error("seed should start with /"));
1011
+ }
1012
+ byte[] result = this.fula.seeded(seedString);
1013
+ String resultString = toString(result);
1014
+ promise.resolve(resultString);
1015
+ }
1016
+ } catch (Exception e) {
1017
+ Log.d("get", e.getMessage());
1018
+ promise.reject(e);
1019
+ }
1020
+ });
1021
+ }
1022
+
1023
+ @ReactMethod
1024
+ public void checkAccountExists(String accountString, Promise promise) {
1025
+ ThreadUtils.runOnExecutor(() -> {
1026
+ Log.d("ReactNative", "checkAccountExists: accountString = " + accountString);
1027
+ try {
1028
+ byte[] result = this.fula.accountExists(accountString);
1029
+ String resultString = toString(result);
1030
+ promise.resolve(resultString);
1031
+ } catch (Exception e) {
1032
+ Log.d("get", e.getMessage());
1033
+ promise.reject(e);
1034
+ }
1035
+ });
1036
+ }
1037
+
1038
+ @ReactMethod
1039
+ public void createPool(String seedString, String poolName, Promise promise) {
1040
+ ThreadUtils.runOnExecutor(() -> {
1041
+ Log.d("ReactNative", "createPool: seedString = " + seedString + "; poolName = " + poolName);
1042
+ try {
1043
+ byte[] result = this.fula.poolCreate(seedString, poolName);
1044
+ String resultString = toString(result);
1045
+ promise.resolve(resultString);
1046
+ } catch (Exception e) {
1047
+ Log.d("get", e.getMessage());
1048
+ promise.reject(e);
1049
+ }
1050
+ });
1051
+ }
1052
+
1053
+ @ReactMethod
1054
+ public void listPools(Promise promise) {
1055
+ ThreadUtils.runOnExecutor(() -> {
1056
+ Log.d("ReactNative", "listPools");
1057
+ try {
1058
+ byte[] result = this.fula.poolList();
1059
+ String resultString = toString(result);
1060
+ promise.resolve(resultString);
1061
+ } catch (Exception e) {
1062
+ Log.d("get", e.getMessage());
1063
+ promise.reject(e);
1064
+ }
1065
+ });
1066
+ }
1067
+
1068
+ @ReactMethod
1069
+ public void joinPool(String seedString, long poolID, Promise promise) {
1070
+ ThreadUtils.runOnExecutor(() -> {
1071
+ Log.d("ReactNative", "joinPool: seedString = " + seedString + "; poolID = " + poolID);
1072
+ try {
1073
+ byte[] result = this.fula.poolJoin(seedString, poolID);
1074
+ String resultString = toString(result);
1075
+ promise.resolve(resultString);
1076
+ } catch (Exception e) {
1077
+ Log.d("get", e.getMessage());
1078
+ promise.reject(e);
1079
+ }
1080
+ });
1081
+ }
1082
+
1083
+ @ReactMethod
1084
+ public void cancelPoolJoin(String seedString, long poolID, Promise promise) {
1085
+ ThreadUtils.runOnExecutor(() -> {
1086
+ Log.d("ReactNative", "cancelPoolJoin: seedString = " + seedString + "; poolID = " + poolID);
1087
+ try {
1088
+ byte[] result = this.fula.poolCancelJoin(seedString, poolID);
1089
+ String resultString = toString(result);
1090
+ promise.resolve(resultString);
1091
+ } catch (Exception e) {
1092
+ Log.d("get", e.getMessage());
1093
+ promise.reject(e);
1094
+ }
1095
+ });
1096
+ }
1097
+
1098
+ @ReactMethod
1099
+ public void listPoolJoinRequests(long poolID, Promise promise) {
1100
+ ThreadUtils.runOnExecutor(() -> {
1101
+ Log.d("ReactNative", "listPoolJoinRequests: poolID = " + poolID);
1102
+ try {
1103
+ byte[] result = this.fula.poolRequests(poolID);
1104
+ String resultString = toString(result);
1105
+ promise.resolve(resultString);
1106
+ } catch (Exception e) {
1107
+ Log.d("get", e.getMessage());
1108
+ promise.reject(e);
1109
+ }
1110
+ });
1111
+ }
1112
+
1113
+ @ReactMethod
1114
+ public void votePoolJoinRequest(String seedString, long poolID, String accountString, boolean accept, Promise promise) {
1115
+ ThreadUtils.runOnExecutor(() -> {
1116
+ Log.d("ReactNative", "votePoolJoinRequest: seedString = " + seedString + "; poolID = " + poolID + "; accountString = " + accountString + "; accept = " + accept);
1117
+ try {
1118
+ byte[] result = this.fula.poolVote(seedString, poolID, accountString, accept);
1119
+ String resultString = toString(result);
1120
+ promise.resolve(resultString);
1121
+ } catch (Exception e) {
1122
+ Log.d("get", e.getMessage());
1123
+ promise.reject(e);
475
1124
  }
476
1125
  });
1126
+ }
477
1127
 
1128
+ @ReactMethod
1129
+ public void leavePool(String seedString, long poolID, Promise promise) {
1130
+ ThreadUtils.runOnExecutor(() -> {
1131
+ Log.d("ReactNative", "leavePool: seedString = " + seedString + "; poolID = " + poolID);
1132
+ try {
1133
+ byte[] result = this.fula.poolLeave(seedString, poolID);
1134
+ String resultString = toString(result);
1135
+ promise.resolve(resultString);
1136
+ } catch (Exception e) {
1137
+ Log.d("get", e.getMessage());
1138
+ promise.reject(e);
1139
+ }
1140
+ });
1141
+ }
1142
+
1143
+ @ReactMethod
1144
+ public void newReplicationRequest(String seedString, long poolID, long replicationFactor, String cid, Promise promise) {
1145
+ ThreadUtils.runOnExecutor(() -> {
1146
+ Log.d("ReactNative", "newReplicationRequest: seedString = " + seedString + "; poolID = " + poolID + "; replicationFactor = " + replicationFactor + "; cid = " + cid);
1147
+ try {
1148
+ byte[] result = this.fula.manifestUpload(seedString, poolID, replicationFactor, cid);
1149
+ String resultString = toString(result);
1150
+ promise.resolve(resultString);
1151
+ } catch (Exception e) {
1152
+ Log.d("get", e.getMessage());
1153
+ promise.reject(e);
1154
+ }
1155
+ });
1156
+ }
1157
+
1158
+ @ReactMethod
1159
+ public void newStoreRequest(String seedString, long poolID, String uploader, String cid, Promise promise) {
1160
+ ThreadUtils.runOnExecutor(() -> {
1161
+ Log.d("ReactNative", "newStoreRequest: seedString = " + seedString + "; poolID = " + poolID + "; uploader = " + uploader + "; cid = " + cid);
1162
+ try {
1163
+ byte[] result = this.fula.manifestStore(seedString, poolID, uploader, cid);
1164
+ String resultString = toString(result);
1165
+ promise.resolve(resultString);
1166
+ } catch (Exception e) {
1167
+ Log.d("get", e.getMessage());
1168
+ promise.reject(e);
1169
+ }
1170
+ });
1171
+ }
1172
+
1173
+ @ReactMethod
1174
+ public void listAvailableReplicationRequests(long poolID, Promise promise) {
1175
+ ThreadUtils.runOnExecutor(() -> {
1176
+ Log.d("ReactNative", "listAvailableReplicationRequests: poolID = " + poolID);
1177
+ try {
1178
+ byte[] result = this.fula.manifestAvailable(poolID);
1179
+ String resultString = toString(result);
1180
+ promise.resolve(resultString);
1181
+ } catch (Exception e) {
1182
+ Log.d("get", e.getMessage());
1183
+ promise.reject(e);
1184
+ }
1185
+ });
1186
+ }
1187
+
1188
+ @ReactMethod
1189
+ public void removeReplicationRequest(String seedString, long poolID, String cid, Promise promise) {
1190
+ ThreadUtils.runOnExecutor(() -> {
1191
+ Log.d("ReactNative", "newReplicationRequest: seedString = " + seedString + "; poolID = " + poolID + "; cid = " + cid);
1192
+ try {
1193
+ byte[] result = this.fula.manifestRemove(seedString, poolID, cid);
1194
+ String resultString = toString(result);
1195
+ promise.resolve(resultString);
1196
+ } catch (Exception e) {
1197
+ Log.d("get", e.getMessage());
1198
+ promise.reject(e);
1199
+ }
1200
+ });
1201
+ }
1202
+
1203
+ @ReactMethod
1204
+ public void removeStorer(String seedString, String storage, long poolID, String cid, Promise promise) {
1205
+ ThreadUtils.runOnExecutor(() -> {
1206
+ Log.d("ReactNative", "removeStorer: seedString = " + seedString + "; storage = " + storage + "; poolID = " + poolID + "; cid = " + cid);
1207
+ try {
1208
+ byte[] result = this.fula.manifestRemoveStorer(seedString, storage, poolID, cid);
1209
+ String resultString = toString(result);
1210
+ promise.resolve(resultString);
1211
+ } catch (Exception e) {
1212
+ Log.d("get", e.getMessage());
1213
+ promise.reject(e);
1214
+ }
1215
+ });
1216
+ }
1217
+
1218
+ @ReactMethod
1219
+ public void removeStoredReplication(String seedString, String uploader, long poolID, String cid, Promise promise) {
1220
+ ThreadUtils.runOnExecutor(() -> {
1221
+ Log.d("ReactNative", "removeStoredReplication: seedString = " + seedString + "; uploader = " + uploader + "; poolID = " + poolID + "; cid = " + cid);
1222
+ try {
1223
+ byte[] result = this.fula.manifestRemoveStored(seedString, uploader, poolID, cid);
1224
+ String resultString = toString(result);
1225
+ promise.resolve(resultString);
1226
+ } catch (Exception e) {
1227
+ Log.d("get", e.getMessage());
1228
+ promise.reject(e);
1229
+ }
1230
+ });
1231
+ }
1232
+
1233
+ @ReactMethod
1234
+ public void bloxFreeSpace(Promise promise) {
1235
+ ThreadUtils.runOnExecutor(() -> {
1236
+ Log.d("ReactNative", "bloxFreeSpace");
1237
+ try {
1238
+ byte[] result = this.fula.bloxFreeSpace();
1239
+ String resultString = toString(result);
1240
+ promise.resolve(resultString);
1241
+ } catch (Exception e) {
1242
+ Log.d("get", e.getMessage());
1243
+ promise.reject(e);
1244
+ }
1245
+ });
478
1246
  }
479
1247
 
480
1248
  }