Skip to content

Commit 3c7c03b

Browse files
committed
feat: brownfield integration
1 parent 75421e3 commit 3c7c03b

File tree

7 files changed

+86
-40
lines changed

7 files changed

+86
-40
lines changed
Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.asyncstorage.storage
22

3-
import android.content.Context
43
import com.facebook.react.bridge.Arguments
54
import com.facebook.react.bridge.Promise
65
import com.facebook.react.bridge.ReadableArray
@@ -20,17 +19,12 @@ private val createStorageScope = { name: String ->
2019
CoroutineScope(SupervisorJob() + CoroutineName(name))
2120
}
2221

23-
/**
24-
* todo:
25-
* - handle exceptions via coroutine exception handler or via try catch
26-
*/
27-
class PersistentStorage(
28-
ctx: Context,
22+
class RNStorage(
23+
private val db: SharedStorage,
2924
dbName: String,
3025
coroutineContext: CoroutineContext = EmptyCoroutineContext,
3126
) {
3227
private val scope = createStorageScope(dbName) + coroutineContext
33-
private val db = SharedStorage(ctx, dbName)
3428

3529
fun get(rnKeys: ReadableArray, promise: Promise) =
3630
scope.lunchWithRejection(promise) {
@@ -65,7 +59,7 @@ class PersistentStorage(
6559
}
6660
}
6761

68-
private fun <T> CoroutineScope.lunchWithRejection(promise: Promise, block: suspend () -> T): Unit {
62+
private fun <T> CoroutineScope.lunchWithRejection(promise: Promise, block: suspend () -> T) {
6963
launch {
7064
try {
7165
block()
Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,34 @@
11
package org.asyncstorage.storage
22

33
import android.content.Context
4+
import org.asyncstorage.shared_storage.SharedStorage
45

6+
/**
7+
* StorageRegistry is a singleton responsible for managing and providing access to SharedStorage and
8+
* RNStorage instances in a thread-safe manner.
9+
*/
510
object StorageRegistry {
11+
/**
12+
* Cache for Shared Storages instances. These instances are shared by native and RN
13+
* implementation.
14+
*/
15+
private val storages = mutableMapOf<String, SharedStorage>()
616

7-
private val storages = mutableMapOf<String, PersistentStorage>()
17+
/**
18+
* Cache for PersistentStorage used by RN module. It uses shared storage singleton instances.
19+
*/
20+
private val rnStorages = mutableMapOf<String, RNStorage>()
821

9-
fun getOrCreate(ctx: Context, name: String): PersistentStorage =
10-
storages.getOrPut(name) { PersistentStorage(ctx, name) }
22+
fun getRNStorage(ctx: Context, name: String): RNStorage =
23+
synchronized(this) {
24+
rnStorages.getOrPut(name) {
25+
val storage = storages.getOrPut(name) { SharedStorage(ctx, name) }
26+
RNStorage(storage, name)
27+
}
28+
}
29+
30+
fun getStorage(ctx: Context, name: String): SharedStorage =
31+
synchronized(this) {
32+
return storages.getOrPut(name) { SharedStorage(ctx, name) }
33+
}
1134
}

packages/async-storage/android/src/newarch/org/asyncstorage/AsyncStorageModule.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@ class AsyncStorageModule(private val reactContext: ReactApplicationContext) :
1616
override fun getName() = NAME
1717

1818
override fun getValues(db: String, keys: ReadableArray, promise: Promise) {
19-
StorageRegistry.getOrCreate(reactContext, db).run { get(keys, promise) }
19+
StorageRegistry.getRNStorage(reactContext, db).run { get(keys, promise) }
2020
}
2121

2222
override fun setValues(db: String, values: ReadableArray, promise: Promise) {
23-
StorageRegistry.getOrCreate(reactContext, db).run { set(values, promise) }
23+
StorageRegistry.getRNStorage(reactContext, db).run { set(values, promise) }
2424
}
2525

2626
override fun removeValues(db: String, keys: ReadableArray, promise: Promise) {
27-
StorageRegistry.getOrCreate(reactContext, db).run { remove(keys, promise) }
27+
StorageRegistry.getRNStorage(reactContext, db).run { remove(keys, promise) }
2828
}
2929

3030
override fun getKeys(db: String, promise: Promise) {
31-
StorageRegistry.getOrCreate(reactContext, db).run { allKeys(promise) }
31+
StorageRegistry.getRNStorage(reactContext, db).run { allKeys(promise) }
3232
}
3333

3434
override fun clearStorage(db: String, promise: Promise) {
35-
StorageRegistry.getOrCreate(reactContext, db).run { clear(promise) }
35+
StorageRegistry.getRNStorage(reactContext, db).run { clear(promise) }
3636
}
3737

3838
override fun legacy_multiGet(keys: ReadableArray, promise: Promise) {

packages/async-storage/android/src/oldarch/asyncstorage/AsyncStorageModule.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@ class AsyncStorageModule(private val reactContext: ReactApplicationContext) :
1919

2020
@ReactMethod
2121
fun getValues(db: String, keys: ReadableArray, promise: Promise) {
22-
StorageRegistry.getOrCreate(reactContext, db).run { get(keys, promise) }
22+
StorageRegistry.getRNStorage(reactContext, db).run { get(keys, promise) }
2323
}
2424

2525
@ReactMethod
2626
fun setValues(db: String, values: ReadableArray, promise: Promise) {
27-
StorageRegistry.getOrCreate(reactContext, db).run { set(values, promise) }
27+
StorageRegistry.getRNStorage(reactContext, db).run { set(values, promise) }
2828
}
2929

3030
@ReactMethod
3131
fun removeValues(db: String, keys: ReadableArray, promise: Promise) {
32-
StorageRegistry.getOrCreate(reactContext, db).run { remove(keys, promise) }
32+
StorageRegistry.getRNStorage(reactContext, db).run { remove(keys, promise) }
3333
}
3434

3535
@ReactMethod
3636
fun getKeys(db: String, promise: Promise) {
37-
StorageRegistry.getOrCreate(reactContext, db).run { allKeys(promise) }
37+
StorageRegistry.getRNStorage(reactContext, db).run { allKeys(promise) }
3838
}
3939

4040
@ReactMethod
4141
fun clearStorage(db: String, promise: Promise) {
42-
StorageRegistry.getOrCreate(reactContext, db).run { clear(promise) }
42+
StorageRegistry.getRNStorage(reactContext, db).run { clear(promise) }
4343
}
4444

4545
@ReactMethod

packages/async-storage/apple/AsyncStorage.mm

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,33 @@ @implementation AsyncStorage
77

88
- (void)getValues:(nonnull NSString *)dbName keys:(nonnull NSArray *)keys resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
99

10-
PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName];
10+
RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName];
1111
[db getWithKeys:keys resolver:resolve rejecter:reject];
1212
}
1313

1414
- (void)setValues:(nonnull NSString *)dbName values:(nonnull NSArray<NSDictionary *> *)values resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
1515

16-
PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName];
16+
RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName];
1717
[db setWithValues:values resolver:resolve rejecter:reject];
1818
}
1919

2020

2121
- (void)removeValues:(nonnull NSString *)dbName keys:(nonnull NSArray *)keys resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
2222

23-
PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName];
23+
RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName];
2424
[db removeWithKeys:keys resolver:resolve rejecter:reject];
2525
}
2626

2727

2828
- (void)clearStorage:(nonnull NSString *)dbName resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
2929

30-
PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName];
30+
RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName];
3131
[db clearWithResolver:resolve rejecter:reject];
3232
}
3333

3434
- (void)getKeys:(nonnull NSString *)dbName resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
3535

36-
PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName];
36+
RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName];
3737
[db allKeysWithResolver:resolve rejecter:reject];
3838
}
3939

packages/async-storage/apple/storage/PersistentStorage.swift renamed to packages/async-storage/apple/storage/RNStorage.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import SharedAsyncStorage
33

44

55
@objc
6-
public class PersistentStorage: NSObject {
6+
public class RNStorage: NSObject {
77
private let db: SharedStorage
8-
9-
init(databaseName: String) {
10-
db = SharedStorage(context: PlatformContext.Instance(), databaseName: databaseName)
8+
9+
init(db: SharedStorage) {
10+
self.db = db
1111
}
1212

1313
@objc
Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,51 @@
1+
import SharedAsyncStorage
2+
3+
/**
4+
* StorageRegistry is a singleton responsible for managing and providing access to SharedStorage and
5+
* RNStorage instances in a thread-safe manner.
6+
*/
17
@objc
28
public class StorageRegistry: NSObject {
9+
@objc
10+
public static let shared = StorageRegistry()
11+
12+
private let lock = NSLock()
13+
private var storages: [String: SharedStorage] = [:]
14+
private var rnStorages: [String: RNStorage] = [:]
15+
316
override private init() {
417
super.init()
518
}
619

720
@objc
8-
public static let shared = StorageRegistry()
21+
public func getRNStorage(dbName: String) -> RNStorage {
22+
lock.lock()
23+
defer {
24+
lock.unlock()
25+
}
926

10-
private var databases: [String: PersistentStorage] = [:]
27+
return rnStorages[dbName] ?? {
28+
let storage = storages[dbName] ?? {
29+
let s = SharedStorage(context: PlatformContext.Instance(), databaseName: dbName)
30+
storages[dbName] = s
31+
return s
32+
}()
33+
let rnStorage = RNStorage(db: storage)
34+
rnStorages[dbName] = rnStorage
35+
return rnStorage
36+
}()
37+
}
1138

12-
@objc
13-
public func getOrCreate(dbName: String) -> PersistentStorage {
14-
if let storage = databases[dbName] {
15-
return storage
39+
public func getStorage(dbName: String) -> SharedStorage {
40+
lock.lock()
41+
defer {
42+
lock.unlock()
1643
}
1744

18-
let db = PersistentStorage(databaseName: dbName)
19-
databases[dbName] = db
20-
return db
45+
return storages[dbName] ?? {
46+
let s = SharedStorage(context: PlatformContext.Instance(), databaseName: dbName)
47+
storages[dbName] = s
48+
return s
49+
}()
2150
}
2251
}

0 commit comments

Comments
 (0)