@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.
@@ -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 {
@@ -24,4 +24,7 @@
24
24
  - (void)clear:(RCTPromiseResolveBlock)resolve
25
25
  reject:(RCTPromiseRejectBlock)reject;
26
26
 
27
+ - (void)reloadManifest:(RCTPromiseResolveBlock)resolve
28
+ reject:(RCTPromiseRejectBlock)reject;
29
+
27
30
  @end
@@ -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
@@ -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 NativeModule.multiSet([[key, value]]);
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 NativeModule.multiRemove([key]);
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 NativeModule.multiMerge([[key, value]]);
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 NativeModule.clear();
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 NativeModule.multiSet(mutablePairs);
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
- await NativeModule.multiRemove([...keys]);
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 NativeModule.multiMerge(keyValuePairs);
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
- declare const AsyncStorage: AsyncStorageStatic;
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.80",
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: AsyncStorageStatic = {
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 NativeModule.multiGet([key]);
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
- await NativeModule.multiSet([[key, value]]);
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
- await NativeModule.multiRemove([key]);
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
- await NativeModule.multiMerge([[key, value]]);
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 NativeModule.clear();
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 NativeModule.getAllKeys();
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 NativeModule.multiGet([...keys]);
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
- await NativeModule.multiSet(mutablePairs);
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
- await NativeModule.multiRemove([...keys]);
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
- await NativeModule.multiMerge(keyValuePairs);
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
+ }