@onekeyfe/react-native-async-storage 3.0.80 → 3.0.81-alpha.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.
- package/android/src/main/java/com/asyncstorage/RNCAsyncStorageModule.kt +4 -0
- package/ios/AsyncStorage.h +3 -0
- package/ios/AsyncStorage.mm +20 -0
- package/lib/module/NativeAsyncStorage.web.js +2 -1
- package/lib/module/index.js +57 -10
- package/lib/module/runtimeConfig.js +40 -0
- package/lib/typescript/src/NativeAsyncStorage.d.ts +1 -0
- package/lib/typescript/src/NativeAsyncStorage.web.d.ts +4 -1
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/runtimeConfig.d.ts +16 -0
- package/package.json +3 -2
- package/src/NativeAsyncStorage.ts +1 -0
- package/src/NativeAsyncStorage.web.ts +6 -1
- package/src/index.tsx +118 -10
- package/src/runtimeConfig.ts +86 -0
|
@@ -292,6 +292,10 @@ class RNCAsyncStorageModule(reactContext: ReactApplicationContext) :
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
+
override fun reloadManifest(promise: Promise) {
|
|
296
|
+
promise.resolve(null)
|
|
297
|
+
}
|
|
298
|
+
|
|
295
299
|
// --- Private helpers (ported from AsyncLocalStorageUtil.java) ---
|
|
296
300
|
|
|
297
301
|
private fun ensureDatabase(): Boolean {
|
package/ios/AsyncStorage.h
CHANGED
package/ios/AsyncStorage.mm
CHANGED
|
@@ -711,4 +711,24 @@ static void RCTStorageDirectoryMigrationCheck(NSString *fromStorageDirectory,
|
|
|
711
711
|
});
|
|
712
712
|
}
|
|
713
713
|
|
|
714
|
+
- (void)reloadManifest:(RCTPromiseResolveBlock)resolve
|
|
715
|
+
reject:(RCTPromiseRejectBlock)reject
|
|
716
|
+
{
|
|
717
|
+
dispatch_async(RCTGetMethodQueue(), ^{
|
|
718
|
+
BOOL previousHaveSetup = self->_haveSetup;
|
|
719
|
+
NSMutableDictionary<NSString *, NSString *> *previousManifest = self->_manifest;
|
|
720
|
+
self->_haveSetup = NO;
|
|
721
|
+
NSDictionary *ensureSetupError = [self _ensureSetup];
|
|
722
|
+
if (ensureSetupError) {
|
|
723
|
+
self->_haveSetup = previousHaveSetup;
|
|
724
|
+
self->_manifest = previousManifest;
|
|
725
|
+
reject(@"ASYNC_STORAGE_ERROR",
|
|
726
|
+
ensureSetupError[@"message"] ?: @"Storage setup failed",
|
|
727
|
+
nil);
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
resolve(nil);
|
|
731
|
+
});
|
|
732
|
+
}
|
|
733
|
+
|
|
714
734
|
@end
|
|
@@ -135,7 +135,8 @@ const AsyncStorage = {
|
|
|
135
135
|
multiMerge: (keyValuePairs, callback) => {
|
|
136
136
|
const promises = keyValuePairs.map(item => AsyncStorage.mergeItem(item[0], item[1]));
|
|
137
137
|
return createPromiseAll(promises, callback);
|
|
138
|
-
}
|
|
138
|
+
},
|
|
139
|
+
reloadManifest: () => Promise.resolve()
|
|
139
140
|
};
|
|
140
141
|
export default AsyncStorage;
|
|
141
142
|
//# sourceMappingURL=NativeAsyncStorage.web.js.map
|
package/lib/module/index.js
CHANGED
|
@@ -1,10 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import NativeModule from './NativeAsyncStorage';
|
|
4
|
+
import { forwardAsyncStorageWriteIfNeeded } from "./runtimeConfig.js";
|
|
5
|
+
async function forwardWriteAndReloadManifestIfNeeded(method, args) {
|
|
6
|
+
if (!(await forwardAsyncStorageWriteIfNeeded(method, args))) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
await NativeModule.reloadManifest();
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
async function reloadManifestBestEffort() {
|
|
13
|
+
try {
|
|
14
|
+
await NativeModule.reloadManifest();
|
|
15
|
+
} catch {
|
|
16
|
+
// Keep using this runtime's current manifest when a refresh is temporarily
|
|
17
|
+
// unavailable, for example while iOS data-protected files are locked.
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function runLocalWriteWithFreshManifest(write) {
|
|
21
|
+
// This narrows the local-write stale manifest window, but it does not make
|
|
22
|
+
// uninjected writes cross-runtime serialized. Writes that already completed
|
|
23
|
+
// before forwarder installation keep the legacy local-write semantics.
|
|
24
|
+
await reloadManifestBestEffort();
|
|
25
|
+
await write();
|
|
26
|
+
}
|
|
27
|
+
async function runReadWithFreshManifest(read) {
|
|
28
|
+
// iOS keeps one manifest cache per runtime/module instance while the files on
|
|
29
|
+
// disk are shared. Refresh before reads so main can observe bg-origin writes
|
|
30
|
+
// without routing reads through the bg runtime. Android/web implementations
|
|
31
|
+
// expose reloadManifest as a no-op.
|
|
32
|
+
await reloadManifestBestEffort();
|
|
33
|
+
return read();
|
|
34
|
+
}
|
|
4
35
|
function createAsyncStorage() {
|
|
5
36
|
const getItem = async (key, callback) => {
|
|
6
37
|
try {
|
|
7
|
-
const result = await NativeModule.multiGet([key]);
|
|
38
|
+
const result = await runReadWithFreshManifest(() => NativeModule.multiGet([key]));
|
|
8
39
|
const value = result?.[0]?.[1] ?? null;
|
|
9
40
|
callback?.(null, value);
|
|
10
41
|
return value;
|
|
@@ -16,7 +47,9 @@ function createAsyncStorage() {
|
|
|
16
47
|
};
|
|
17
48
|
const setItem = async (key, value, callback) => {
|
|
18
49
|
try {
|
|
19
|
-
await
|
|
50
|
+
if (!(await forwardWriteAndReloadManifestIfNeeded('multiSet', [[[key, value]]]))) {
|
|
51
|
+
await runLocalWriteWithFreshManifest(() => NativeModule.multiSet([[key, value]]));
|
|
52
|
+
}
|
|
20
53
|
callback?.(null);
|
|
21
54
|
} catch (e) {
|
|
22
55
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -26,7 +59,9 @@ function createAsyncStorage() {
|
|
|
26
59
|
};
|
|
27
60
|
const removeItem = async (key, callback) => {
|
|
28
61
|
try {
|
|
29
|
-
await
|
|
62
|
+
if (!(await forwardWriteAndReloadManifestIfNeeded('multiRemove', [[key]]))) {
|
|
63
|
+
await runLocalWriteWithFreshManifest(() => NativeModule.multiRemove([key]));
|
|
64
|
+
}
|
|
30
65
|
callback?.(null);
|
|
31
66
|
} catch (e) {
|
|
32
67
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -36,7 +71,9 @@ function createAsyncStorage() {
|
|
|
36
71
|
};
|
|
37
72
|
const mergeItem = async (key, value, callback) => {
|
|
38
73
|
try {
|
|
39
|
-
await
|
|
74
|
+
if (!(await forwardWriteAndReloadManifestIfNeeded('multiMerge', [[[key, value]]]))) {
|
|
75
|
+
await runLocalWriteWithFreshManifest(() => NativeModule.multiMerge([[key, value]]));
|
|
76
|
+
}
|
|
40
77
|
callback?.(null);
|
|
41
78
|
} catch (e) {
|
|
42
79
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -46,7 +83,9 @@ function createAsyncStorage() {
|
|
|
46
83
|
};
|
|
47
84
|
const clear = async callback => {
|
|
48
85
|
try {
|
|
49
|
-
await
|
|
86
|
+
if (!(await forwardWriteAndReloadManifestIfNeeded('clear', []))) {
|
|
87
|
+
await NativeModule.clear();
|
|
88
|
+
}
|
|
50
89
|
callback?.(null);
|
|
51
90
|
} catch (e) {
|
|
52
91
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -56,7 +95,7 @@ function createAsyncStorage() {
|
|
|
56
95
|
};
|
|
57
96
|
const getAllKeys = async callback => {
|
|
58
97
|
try {
|
|
59
|
-
const keys = await NativeModule.getAllKeys();
|
|
98
|
+
const keys = await runReadWithFreshManifest(() => NativeModule.getAllKeys());
|
|
60
99
|
callback?.(null, keys);
|
|
61
100
|
return keys;
|
|
62
101
|
} catch (e) {
|
|
@@ -70,7 +109,7 @@ function createAsyncStorage() {
|
|
|
70
109
|
};
|
|
71
110
|
const multiGet = async (keys, callback) => {
|
|
72
111
|
try {
|
|
73
|
-
const result = await NativeModule.multiGet([...keys]);
|
|
112
|
+
const result = await runReadWithFreshManifest(() => NativeModule.multiGet([...keys]));
|
|
74
113
|
callback?.(null, result);
|
|
75
114
|
return result;
|
|
76
115
|
} catch (e) {
|
|
@@ -82,7 +121,9 @@ function createAsyncStorage() {
|
|
|
82
121
|
const multiSet = async (keyValuePairs, callback) => {
|
|
83
122
|
try {
|
|
84
123
|
const mutablePairs = keyValuePairs.map(([k, v]) => [k, v]);
|
|
85
|
-
await
|
|
124
|
+
if (!(await forwardWriteAndReloadManifestIfNeeded('multiSet', [mutablePairs]))) {
|
|
125
|
+
await runLocalWriteWithFreshManifest(() => NativeModule.multiSet(mutablePairs));
|
|
126
|
+
}
|
|
86
127
|
callback?.(null);
|
|
87
128
|
} catch (e) {
|
|
88
129
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -92,7 +133,10 @@ function createAsyncStorage() {
|
|
|
92
133
|
};
|
|
93
134
|
const multiRemove = async (keys, callback) => {
|
|
94
135
|
try {
|
|
95
|
-
|
|
136
|
+
const mutableKeys = [...keys];
|
|
137
|
+
if (!(await forwardWriteAndReloadManifestIfNeeded('multiRemove', [mutableKeys]))) {
|
|
138
|
+
await runLocalWriteWithFreshManifest(() => NativeModule.multiRemove(mutableKeys));
|
|
139
|
+
}
|
|
96
140
|
callback?.(null);
|
|
97
141
|
} catch (e) {
|
|
98
142
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -102,7 +146,9 @@ function createAsyncStorage() {
|
|
|
102
146
|
};
|
|
103
147
|
const multiMerge = async (keyValuePairs, callback) => {
|
|
104
148
|
try {
|
|
105
|
-
await
|
|
149
|
+
if (!(await forwardWriteAndReloadManifestIfNeeded('multiMerge', [keyValuePairs]))) {
|
|
150
|
+
await runLocalWriteWithFreshManifest(() => NativeModule.multiMerge(keyValuePairs));
|
|
151
|
+
}
|
|
106
152
|
callback?.(null);
|
|
107
153
|
} catch (e) {
|
|
108
154
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -126,4 +172,5 @@ function createAsyncStorage() {
|
|
|
126
172
|
}
|
|
127
173
|
const AsyncStorage = createAsyncStorage();
|
|
128
174
|
export default AsyncStorage;
|
|
175
|
+
export { setAsyncStorageShouldForwardWriteGetter, setAsyncStorageWriteForwarder } from "./runtimeConfig.js";
|
|
129
176
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const runtimeGlobal = globalThis;
|
|
4
|
+
let shouldForwardWriteGetter = runtimeGlobal.__onekeyAsyncStorageShouldForwardWriteGetter;
|
|
5
|
+
let writeForwarder = runtimeGlobal.__onekeyAsyncStorageWriteForwarder;
|
|
6
|
+
export function setAsyncStorageShouldForwardWriteGetter(getter) {
|
|
7
|
+
shouldForwardWriteGetter = getter;
|
|
8
|
+
runtimeGlobal.__onekeyAsyncStorageShouldForwardWriteGetter = getter;
|
|
9
|
+
}
|
|
10
|
+
export function setAsyncStorageWriteForwarder(forwarder) {
|
|
11
|
+
writeForwarder = forwarder;
|
|
12
|
+
runtimeGlobal.__onekeyAsyncStorageWriteForwarder = forwarder;
|
|
13
|
+
}
|
|
14
|
+
function getShouldForwardWriteGetter() {
|
|
15
|
+
return shouldForwardWriteGetter ?? runtimeGlobal.__onekeyAsyncStorageShouldForwardWriteGetter;
|
|
16
|
+
}
|
|
17
|
+
function getWriteForwarder() {
|
|
18
|
+
return writeForwarder ?? runtimeGlobal.__onekeyAsyncStorageWriteForwarder;
|
|
19
|
+
}
|
|
20
|
+
function shouldForwardWriteToBackground() {
|
|
21
|
+
return getShouldForwardWriteGetter()?.() ?? false;
|
|
22
|
+
}
|
|
23
|
+
export function shouldForwardAsyncStorageWrite() {
|
|
24
|
+
return shouldForwardWriteToBackground();
|
|
25
|
+
}
|
|
26
|
+
export async function forwardAsyncStorageWrite(method, args) {
|
|
27
|
+
const forwarder = getWriteForwarder();
|
|
28
|
+
if (!forwarder) {
|
|
29
|
+
throw new Error('AsyncStorage write forwarder is not configured.');
|
|
30
|
+
}
|
|
31
|
+
await forwarder(method, args);
|
|
32
|
+
}
|
|
33
|
+
export async function forwardAsyncStorageWriteIfNeeded(method, args) {
|
|
34
|
+
if (!shouldForwardAsyncStorageWrite()) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
await forwardAsyncStorageWrite(method, args);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=runtimeConfig.js.map
|
|
@@ -6,6 +6,7 @@ export interface Spec extends TurboModule {
|
|
|
6
6
|
multiMerge(keyValuePairs: [string, string][]): Promise<void>;
|
|
7
7
|
getAllKeys(): Promise<string[]>;
|
|
8
8
|
clear(): Promise<void>;
|
|
9
|
+
reloadManifest(): Promise<void>;
|
|
9
10
|
}
|
|
10
11
|
declare const _default: Spec;
|
|
11
12
|
export default _default;
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
8
|
import type { AsyncStorageStatic } from './types';
|
|
9
|
-
|
|
9
|
+
type AsyncStorageWebStatic = AsyncStorageStatic & {
|
|
10
|
+
reloadManifest: () => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
declare const AsyncStorage: AsyncStorageWebStatic;
|
|
10
13
|
export default AsyncStorage;
|
|
11
14
|
//# sourceMappingURL=NativeAsyncStorage.web.d.ts.map
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { AsyncStorageStatic } from './types';
|
|
2
2
|
declare const AsyncStorage: AsyncStorageStatic;
|
|
3
3
|
export default AsyncStorage;
|
|
4
|
+
export type { AsyncStorageShouldForwardWriteGetter, AsyncStorageWriteArgs, AsyncStorageWriteArgsByMethod, AsyncStorageWriteForwarder, AsyncStorageWriteMethod, } from './runtimeConfig';
|
|
4
5
|
export type { AsyncStorageStatic, Callback, CallbackWithResult, KeyValuePair, MultiCallback, MultiGetCallback, } from './types';
|
|
6
|
+
export { setAsyncStorageShouldForwardWriteGetter, setAsyncStorageWriteForwarder, } from './runtimeConfig';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type AsyncStorageWriteArgsByMethod = {
|
|
2
|
+
clear: [];
|
|
3
|
+
multiSet: [[string, string][]];
|
|
4
|
+
multiRemove: [string[]];
|
|
5
|
+
multiMerge: [[string, string][]];
|
|
6
|
+
};
|
|
7
|
+
export type AsyncStorageWriteMethod = keyof AsyncStorageWriteArgsByMethod;
|
|
8
|
+
export type AsyncStorageWriteArgs<T extends AsyncStorageWriteMethod = AsyncStorageWriteMethod> = AsyncStorageWriteArgsByMethod[T];
|
|
9
|
+
export type AsyncStorageShouldForwardWriteGetter = () => boolean;
|
|
10
|
+
export type AsyncStorageWriteForwarder = <T extends AsyncStorageWriteMethod>(method: T, args: AsyncStorageWriteArgs<T>) => Promise<void>;
|
|
11
|
+
export declare function setAsyncStorageShouldForwardWriteGetter(getter: AsyncStorageShouldForwardWriteGetter): void;
|
|
12
|
+
export declare function setAsyncStorageWriteForwarder(forwarder: AsyncStorageWriteForwarder): void;
|
|
13
|
+
export declare function shouldForwardAsyncStorageWrite(): boolean;
|
|
14
|
+
export declare function forwardAsyncStorageWrite<T extends AsyncStorageWriteMethod>(method: T, args: AsyncStorageWriteArgs<T>): Promise<void>;
|
|
15
|
+
export declare function forwardAsyncStorageWriteIfNeeded<T extends AsyncStorageWriteMethod>(method: T, args: AsyncStorageWriteArgs<T>): Promise<boolean>;
|
|
16
|
+
//# sourceMappingURL=runtimeConfig.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/react-native-async-storage",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.81-alpha.1",
|
|
4
4
|
"description": "react-native-async-storage",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -164,5 +164,6 @@
|
|
|
164
164
|
"release-it"
|
|
165
165
|
],
|
|
166
166
|
"version": "0.56.0"
|
|
167
|
-
}
|
|
167
|
+
},
|
|
168
|
+
"stableVersion": "3.0.80"
|
|
168
169
|
}
|
|
@@ -8,6 +8,7 @@ export interface Spec extends TurboModule {
|
|
|
8
8
|
multiMerge(keyValuePairs: [string, string][]): Promise<void>;
|
|
9
9
|
getAllKeys(): Promise<string[]>;
|
|
10
10
|
clear(): Promise<void>;
|
|
11
|
+
reloadManifest(): Promise<void>;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
export default TurboModuleRegistry.getEnforcing<Spec>('RNCAsyncStorage');
|
|
@@ -17,6 +17,9 @@ import type {
|
|
|
17
17
|
type OnMultiResult = Function;
|
|
18
18
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
19
19
|
type OnResult = Function;
|
|
20
|
+
type AsyncStorageWebStatic = AsyncStorageStatic & {
|
|
21
|
+
reloadManifest: () => Promise<void>;
|
|
22
|
+
};
|
|
20
23
|
|
|
21
24
|
const merge = mergeOptions.bind({
|
|
22
25
|
concatArrays: true,
|
|
@@ -73,7 +76,7 @@ function createPromiseAll<
|
|
|
73
76
|
);
|
|
74
77
|
}
|
|
75
78
|
|
|
76
|
-
const AsyncStorage:
|
|
79
|
+
const AsyncStorage: AsyncStorageWebStatic = {
|
|
77
80
|
/**
|
|
78
81
|
* Fetches `key` value.
|
|
79
82
|
*/
|
|
@@ -176,6 +179,8 @@ const AsyncStorage: AsyncStorageStatic = {
|
|
|
176
179
|
);
|
|
177
180
|
return createPromiseAll(promises, callback);
|
|
178
181
|
},
|
|
182
|
+
|
|
183
|
+
reloadManifest: () => Promise.resolve(),
|
|
179
184
|
};
|
|
180
185
|
|
|
181
186
|
export default AsyncStorage;
|
package/src/index.tsx
CHANGED
|
@@ -1,10 +1,54 @@
|
|
|
1
1
|
import NativeModule from './NativeAsyncStorage';
|
|
2
|
+
import { forwardAsyncStorageWriteIfNeeded } from './runtimeConfig';
|
|
3
|
+
import type {
|
|
4
|
+
AsyncStorageWriteArgs,
|
|
5
|
+
AsyncStorageWriteMethod,
|
|
6
|
+
} from './runtimeConfig';
|
|
2
7
|
import type { AsyncStorageStatic } from './types';
|
|
3
8
|
|
|
9
|
+
async function forwardWriteAndReloadManifestIfNeeded<
|
|
10
|
+
T extends AsyncStorageWriteMethod
|
|
11
|
+
>(method: T, args: AsyncStorageWriteArgs<T>) {
|
|
12
|
+
if (!(await forwardAsyncStorageWriteIfNeeded(method, args))) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
await NativeModule.reloadManifest();
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function reloadManifestBestEffort() {
|
|
21
|
+
try {
|
|
22
|
+
await NativeModule.reloadManifest();
|
|
23
|
+
} catch {
|
|
24
|
+
// Keep using this runtime's current manifest when a refresh is temporarily
|
|
25
|
+
// unavailable, for example while iOS data-protected files are locked.
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function runLocalWriteWithFreshManifest(write: () => Promise<void>) {
|
|
30
|
+
// This narrows the local-write stale manifest window, but it does not make
|
|
31
|
+
// uninjected writes cross-runtime serialized. Writes that already completed
|
|
32
|
+
// before forwarder installation keep the legacy local-write semantics.
|
|
33
|
+
await reloadManifestBestEffort();
|
|
34
|
+
await write();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function runReadWithFreshManifest<T>(read: () => Promise<T>): Promise<T> {
|
|
38
|
+
// iOS keeps one manifest cache per runtime/module instance while the files on
|
|
39
|
+
// disk are shared. Refresh before reads so main can observe bg-origin writes
|
|
40
|
+
// without routing reads through the bg runtime. Android/web implementations
|
|
41
|
+
// expose reloadManifest as a no-op.
|
|
42
|
+
await reloadManifestBestEffort();
|
|
43
|
+
return read();
|
|
44
|
+
}
|
|
45
|
+
|
|
4
46
|
function createAsyncStorage(): AsyncStorageStatic {
|
|
5
47
|
const getItem: AsyncStorageStatic['getItem'] = async (key, callback) => {
|
|
6
48
|
try {
|
|
7
|
-
const result = await
|
|
49
|
+
const result = await runReadWithFreshManifest(() =>
|
|
50
|
+
NativeModule.multiGet([key])
|
|
51
|
+
);
|
|
8
52
|
const value = result?.[0]?.[1] ?? null;
|
|
9
53
|
callback?.(null, value);
|
|
10
54
|
return value;
|
|
@@ -21,7 +65,15 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
21
65
|
callback
|
|
22
66
|
) => {
|
|
23
67
|
try {
|
|
24
|
-
|
|
68
|
+
if (
|
|
69
|
+
!(await forwardWriteAndReloadManifestIfNeeded('multiSet', [
|
|
70
|
+
[[key, value]],
|
|
71
|
+
]))
|
|
72
|
+
) {
|
|
73
|
+
await runLocalWriteWithFreshManifest(() =>
|
|
74
|
+
NativeModule.multiSet([[key, value]])
|
|
75
|
+
);
|
|
76
|
+
}
|
|
25
77
|
callback?.(null);
|
|
26
78
|
} catch (e) {
|
|
27
79
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -35,7 +87,13 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
35
87
|
callback
|
|
36
88
|
) => {
|
|
37
89
|
try {
|
|
38
|
-
|
|
90
|
+
if (
|
|
91
|
+
!(await forwardWriteAndReloadManifestIfNeeded('multiRemove', [[key]]))
|
|
92
|
+
) {
|
|
93
|
+
await runLocalWriteWithFreshManifest(() =>
|
|
94
|
+
NativeModule.multiRemove([key])
|
|
95
|
+
);
|
|
96
|
+
}
|
|
39
97
|
callback?.(null);
|
|
40
98
|
} catch (e) {
|
|
41
99
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -50,7 +108,15 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
50
108
|
callback
|
|
51
109
|
) => {
|
|
52
110
|
try {
|
|
53
|
-
|
|
111
|
+
if (
|
|
112
|
+
!(await forwardWriteAndReloadManifestIfNeeded('multiMerge', [
|
|
113
|
+
[[key, value]],
|
|
114
|
+
]))
|
|
115
|
+
) {
|
|
116
|
+
await runLocalWriteWithFreshManifest(() =>
|
|
117
|
+
NativeModule.multiMerge([[key, value]])
|
|
118
|
+
);
|
|
119
|
+
}
|
|
54
120
|
callback?.(null);
|
|
55
121
|
} catch (e) {
|
|
56
122
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -61,7 +127,9 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
61
127
|
|
|
62
128
|
const clear: AsyncStorageStatic['clear'] = async (callback) => {
|
|
63
129
|
try {
|
|
64
|
-
await
|
|
130
|
+
if (!(await forwardWriteAndReloadManifestIfNeeded('clear', []))) {
|
|
131
|
+
await NativeModule.clear();
|
|
132
|
+
}
|
|
65
133
|
callback?.(null);
|
|
66
134
|
} catch (e) {
|
|
67
135
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -72,7 +140,9 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
72
140
|
|
|
73
141
|
const getAllKeys: AsyncStorageStatic['getAllKeys'] = async (callback) => {
|
|
74
142
|
try {
|
|
75
|
-
const keys = await
|
|
143
|
+
const keys = await runReadWithFreshManifest(() =>
|
|
144
|
+
NativeModule.getAllKeys()
|
|
145
|
+
);
|
|
76
146
|
callback?.(null, keys);
|
|
77
147
|
return keys;
|
|
78
148
|
} catch (e) {
|
|
@@ -88,7 +158,9 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
88
158
|
|
|
89
159
|
const multiGet: AsyncStorageStatic['multiGet'] = async (keys, callback) => {
|
|
90
160
|
try {
|
|
91
|
-
const result = await
|
|
161
|
+
const result = await runReadWithFreshManifest(() =>
|
|
162
|
+
NativeModule.multiGet([...keys])
|
|
163
|
+
);
|
|
92
164
|
callback?.(null, result);
|
|
93
165
|
return result;
|
|
94
166
|
} catch (e) {
|
|
@@ -106,7 +178,15 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
106
178
|
const mutablePairs = keyValuePairs.map(
|
|
107
179
|
([k, v]) => [k, v] as [string, string]
|
|
108
180
|
);
|
|
109
|
-
|
|
181
|
+
if (
|
|
182
|
+
!(await forwardWriteAndReloadManifestIfNeeded('multiSet', [
|
|
183
|
+
mutablePairs,
|
|
184
|
+
]))
|
|
185
|
+
) {
|
|
186
|
+
await runLocalWriteWithFreshManifest(() =>
|
|
187
|
+
NativeModule.multiSet(mutablePairs)
|
|
188
|
+
);
|
|
189
|
+
}
|
|
110
190
|
callback?.(null);
|
|
111
191
|
} catch (e) {
|
|
112
192
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -120,7 +200,16 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
120
200
|
callback
|
|
121
201
|
) => {
|
|
122
202
|
try {
|
|
123
|
-
|
|
203
|
+
const mutableKeys = [...keys];
|
|
204
|
+
if (
|
|
205
|
+
!(await forwardWriteAndReloadManifestIfNeeded('multiRemove', [
|
|
206
|
+
mutableKeys,
|
|
207
|
+
]))
|
|
208
|
+
) {
|
|
209
|
+
await runLocalWriteWithFreshManifest(() =>
|
|
210
|
+
NativeModule.multiRemove(mutableKeys)
|
|
211
|
+
);
|
|
212
|
+
}
|
|
124
213
|
callback?.(null);
|
|
125
214
|
} catch (e) {
|
|
126
215
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -134,7 +223,15 @@ function createAsyncStorage(): AsyncStorageStatic {
|
|
|
134
223
|
callback
|
|
135
224
|
) => {
|
|
136
225
|
try {
|
|
137
|
-
|
|
226
|
+
if (
|
|
227
|
+
!(await forwardWriteAndReloadManifestIfNeeded('multiMerge', [
|
|
228
|
+
keyValuePairs,
|
|
229
|
+
]))
|
|
230
|
+
) {
|
|
231
|
+
await runLocalWriteWithFreshManifest(() =>
|
|
232
|
+
NativeModule.multiMerge(keyValuePairs)
|
|
233
|
+
);
|
|
234
|
+
}
|
|
138
235
|
callback?.(null);
|
|
139
236
|
} catch (e) {
|
|
140
237
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -162,6 +259,13 @@ const AsyncStorage = createAsyncStorage();
|
|
|
162
259
|
|
|
163
260
|
export default AsyncStorage;
|
|
164
261
|
|
|
262
|
+
export type {
|
|
263
|
+
AsyncStorageShouldForwardWriteGetter,
|
|
264
|
+
AsyncStorageWriteArgs,
|
|
265
|
+
AsyncStorageWriteArgsByMethod,
|
|
266
|
+
AsyncStorageWriteForwarder,
|
|
267
|
+
AsyncStorageWriteMethod,
|
|
268
|
+
} from './runtimeConfig';
|
|
165
269
|
export type {
|
|
166
270
|
AsyncStorageStatic,
|
|
167
271
|
Callback,
|
|
@@ -170,3 +274,7 @@ export type {
|
|
|
170
274
|
MultiCallback,
|
|
171
275
|
MultiGetCallback,
|
|
172
276
|
} from './types';
|
|
277
|
+
export {
|
|
278
|
+
setAsyncStorageShouldForwardWriteGetter,
|
|
279
|
+
setAsyncStorageWriteForwarder,
|
|
280
|
+
} from './runtimeConfig';
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export type AsyncStorageWriteArgsByMethod = {
|
|
2
|
+
clear: [];
|
|
3
|
+
multiSet: [[string, string][]];
|
|
4
|
+
multiRemove: [string[]];
|
|
5
|
+
multiMerge: [[string, string][]];
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type AsyncStorageWriteMethod = keyof AsyncStorageWriteArgsByMethod;
|
|
9
|
+
|
|
10
|
+
export type AsyncStorageWriteArgs<
|
|
11
|
+
T extends AsyncStorageWriteMethod = AsyncStorageWriteMethod
|
|
12
|
+
> = AsyncStorageWriteArgsByMethod[T];
|
|
13
|
+
|
|
14
|
+
export type AsyncStorageShouldForwardWriteGetter = () => boolean;
|
|
15
|
+
|
|
16
|
+
export type AsyncStorageWriteForwarder = <T extends AsyncStorageWriteMethod>(
|
|
17
|
+
method: T,
|
|
18
|
+
args: AsyncStorageWriteArgs<T>
|
|
19
|
+
) => Promise<void>;
|
|
20
|
+
|
|
21
|
+
type AsyncStorageRuntimeGlobal = typeof globalThis & {
|
|
22
|
+
__onekeyAsyncStorageShouldForwardWriteGetter?: AsyncStorageShouldForwardWriteGetter;
|
|
23
|
+
__onekeyAsyncStorageWriteForwarder?: AsyncStorageWriteForwarder;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const runtimeGlobal = globalThis as AsyncStorageRuntimeGlobal;
|
|
27
|
+
|
|
28
|
+
let shouldForwardWriteGetter: AsyncStorageShouldForwardWriteGetter | undefined =
|
|
29
|
+
runtimeGlobal.__onekeyAsyncStorageShouldForwardWriteGetter;
|
|
30
|
+
let writeForwarder: AsyncStorageWriteForwarder | undefined =
|
|
31
|
+
runtimeGlobal.__onekeyAsyncStorageWriteForwarder;
|
|
32
|
+
|
|
33
|
+
export function setAsyncStorageShouldForwardWriteGetter(
|
|
34
|
+
getter: AsyncStorageShouldForwardWriteGetter
|
|
35
|
+
) {
|
|
36
|
+
shouldForwardWriteGetter = getter;
|
|
37
|
+
runtimeGlobal.__onekeyAsyncStorageShouldForwardWriteGetter = getter;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function setAsyncStorageWriteForwarder(
|
|
41
|
+
forwarder: AsyncStorageWriteForwarder
|
|
42
|
+
) {
|
|
43
|
+
writeForwarder = forwarder;
|
|
44
|
+
runtimeGlobal.__onekeyAsyncStorageWriteForwarder = forwarder;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function getShouldForwardWriteGetter() {
|
|
48
|
+
return (
|
|
49
|
+
shouldForwardWriteGetter ??
|
|
50
|
+
runtimeGlobal.__onekeyAsyncStorageShouldForwardWriteGetter
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function getWriteForwarder() {
|
|
55
|
+
return writeForwarder ?? runtimeGlobal.__onekeyAsyncStorageWriteForwarder;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function shouldForwardWriteToBackground() {
|
|
59
|
+
return getShouldForwardWriteGetter()?.() ?? false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function shouldForwardAsyncStorageWrite() {
|
|
63
|
+
return shouldForwardWriteToBackground();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function forwardAsyncStorageWrite<
|
|
67
|
+
T extends AsyncStorageWriteMethod
|
|
68
|
+
>(method: T, args: AsyncStorageWriteArgs<T>): Promise<void> {
|
|
69
|
+
const forwarder = getWriteForwarder();
|
|
70
|
+
if (!forwarder) {
|
|
71
|
+
throw new Error('AsyncStorage write forwarder is not configured.');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
await forwarder(method, args);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function forwardAsyncStorageWriteIfNeeded<
|
|
78
|
+
T extends AsyncStorageWriteMethod
|
|
79
|
+
>(method: T, args: AsyncStorageWriteArgs<T>): Promise<boolean> {
|
|
80
|
+
if (!shouldForwardAsyncStorageWrite()) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
await forwardAsyncStorageWrite(method, args);
|
|
85
|
+
return true;
|
|
86
|
+
}
|