@onekeyfe/react-native-background-thread 1.1.45 → 1.1.47

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 (37) hide show
  1. package/BackgroundThread.podspec +4 -2
  2. package/android/CMakeLists.txt +29 -0
  3. package/android/build.gradle +42 -0
  4. package/android/src/main/cpp/cpp-adapter.cpp +222 -0
  5. package/android/src/main/java/com/backgroundthread/BTLogger.kt +55 -0
  6. package/android/src/main/java/com/backgroundthread/BackgroundThreadManager.kt +223 -0
  7. package/android/src/main/java/com/backgroundthread/BackgroundThreadModule.kt +17 -17
  8. package/cpp/SharedRPC.cpp +223 -0
  9. package/cpp/SharedRPC.h +50 -0
  10. package/cpp/SharedStore.cpp +184 -0
  11. package/cpp/SharedStore.h +28 -0
  12. package/ios/BackgroundRunnerReactNativeDelegate.h +0 -17
  13. package/ios/BackgroundRunnerReactNativeDelegate.mm +30 -117
  14. package/ios/BackgroundThread.h +1 -0
  15. package/ios/BackgroundThread.mm +6 -22
  16. package/ios/BackgroundThreadManager.h +6 -12
  17. package/ios/BackgroundThreadManager.mm +38 -27
  18. package/lib/module/NativeBackgroundThread.js.map +1 -1
  19. package/lib/module/SharedRPC.js +6 -0
  20. package/lib/module/SharedRPC.js.map +1 -0
  21. package/lib/module/SharedStore.js +6 -0
  22. package/lib/module/SharedStore.js.map +1 -0
  23. package/lib/module/index.js +2 -0
  24. package/lib/module/index.js.map +1 -1
  25. package/lib/typescript/src/NativeBackgroundThread.d.ts +2 -4
  26. package/lib/typescript/src/NativeBackgroundThread.d.ts.map +1 -1
  27. package/lib/typescript/src/SharedRPC.d.ts +12 -0
  28. package/lib/typescript/src/SharedRPC.d.ts.map +1 -0
  29. package/lib/typescript/src/SharedStore.d.ts +14 -0
  30. package/lib/typescript/src/SharedStore.d.ts.map +1 -0
  31. package/lib/typescript/src/index.d.ts +4 -0
  32. package/lib/typescript/src/index.d.ts.map +1 -1
  33. package/package.json +2 -2
  34. package/src/NativeBackgroundThread.ts +2 -4
  35. package/src/SharedRPC.ts +16 -0
  36. package/src/SharedStore.ts +18 -0
  37. package/src/index.tsx +4 -0
@@ -8,6 +8,9 @@
8
8
  #include <memory>
9
9
  #include <mutex>
10
10
 
11
+ #include "SharedStore.h"
12
+ #include "SharedRPC.h"
13
+
11
14
  #import <React/RCTBridge.h>
12
15
  #import <React/RCTBundleURLProvider.h>
13
16
 
@@ -51,26 +54,30 @@ static void stubJsiFunction(jsi::Runtime &runtime, jsi::Object &object, const ch
51
54
  }));
52
55
  }
53
56
 
54
- static std::string safeGetStringProperty(jsi::Runtime &rt, const jsi::Object &obj, const char *key)
57
+ static void invokeOptionalGlobalFunction(jsi::Runtime &runtime, const char *name)
55
58
  {
56
- if (!obj.hasProperty(rt, key)) {
57
- return "";
59
+ try {
60
+ jsi::Value fnValue = runtime.global().getProperty(runtime, name);
61
+ if (!fnValue.isObject() || !fnValue.asObject(runtime).isFunction(runtime)) {
62
+ return;
63
+ }
64
+
65
+ jsi::Function fn = fnValue.asObject(runtime).asFunction(runtime);
66
+ fn.call(runtime);
67
+ } catch (const jsi::JSError &e) {
68
+ [BTLogger error:[NSString stringWithFormat:@"JSError calling global function %s: %s", name, e.getMessage().c_str()]];
69
+ } catch (const std::exception &e) {
70
+ [BTLogger error:[NSString stringWithFormat:@"Error calling global function %s: %s", name, e.what()]];
58
71
  }
59
- jsi::Value value = obj.getProperty(rt, key);
60
- return value.isString() ? value.getString(rt).utf8(rt) : "";
61
72
  }
62
73
 
63
74
  @interface BackgroundReactNativeDelegate () {
64
75
  RCTInstance *_rctInstance;
65
- std::shared_ptr<jsi::Function> _onMessageSandbox;
66
76
  std::string _origin;
67
77
  std::string _jsBundleSource;
68
78
  }
69
79
 
70
80
  - (void)cleanupResources;
71
-
72
- - (jsi::Function)createPostMessageFunction:(jsi::Runtime &)runtime;
73
- - (jsi::Function)createSetOnMessageFunction:(jsi::Runtime &)runtime;
74
81
  - (void)setupErrorHandler:(jsi::Runtime &)runtime;
75
82
 
76
83
  @end
@@ -91,7 +98,6 @@ static std::string safeGetStringProperty(jsi::Runtime &rt, const jsi::Object &ob
91
98
 
92
99
  - (void)cleanupResources
93
100
  {
94
- _onMessageSandbox.reset();
95
101
  _rctInstance = nil;
96
102
  }
97
103
 
@@ -134,56 +140,12 @@ static std::string safeGetStringProperty(jsi::Runtime &rt, const jsi::Object &ob
134
140
  return [[NSBundle mainBundle] URLForResource: @"background" withExtension: @"bundle"];
135
141
  }
136
142
 
137
- - (void)postMessage:(const std::string &)message
138
- {
139
- if (!_onMessageSandbox || !_rctInstance) {
140
- return;
141
- }
142
-
143
- [_rctInstance callFunctionOnBufferedRuntimeExecutor:[=](jsi::Runtime &runtime) {
144
- try {
145
- // Validate runtime before any JSI operations
146
- runtime.global(); // Test if runtime is accessible
147
-
148
- // Double-check the JSI function is still valid
149
- if (!_onMessageSandbox) {
150
- return;
151
- }
152
-
153
- jsi::Value parsedValue = runtime.global()
154
- .getPropertyAsObject(runtime, "JSON")
155
- .getPropertyAsFunction(runtime, "parse")
156
- .call(runtime, jsi::String::createFromUtf8(runtime, message));
157
-
158
- _onMessageSandbox->call(runtime, {std::move(parsedValue)});
159
- } catch (const jsi::JSError &e) {
160
- [BTLogger error:[NSString stringWithFormat:@"JSError during postMessage: %s", e.getMessage().c_str()]];
161
- } catch (const std::exception &e) {
162
- [BTLogger error:[NSString stringWithFormat:@"RuntimeError during postMessage: %s", e.what()]];
163
- } catch (...) {
164
- [BTLogger error:[NSString stringWithFormat:@"Runtime invalid during postMessage for sandbox %s", _origin.c_str()]];
165
- }
166
- }];
167
- }
168
-
169
- - (bool)routeMessage:(const std::string &)message toSandbox:(const std::string &)targetId
170
- {
171
- // Sandbox routing is not yet implemented. Deny all cross-sandbox messages by default.
172
- [BTLogger warn:@"routeMessage denied: sandbox routing not implemented"];
173
- return false;
174
- }
175
-
176
143
  - (void)hostDidStart:(RCTHost *)host
177
144
  {
178
145
  if (!host) {
179
146
  return;
180
147
  }
181
148
 
182
- // Safely clear any existing JSI function and instance before new runtime setup
183
- // This prevents crash on reload when old function is tied to invalid runtime
184
- _onMessageSandbox.reset();
185
- _onMessageSandbox = nullptr;
186
-
187
149
  // Clear old instance reference before setting new one
188
150
  _rctInstance = nil;
189
151
 
@@ -195,9 +157,21 @@ static std::string safeGetStringProperty(jsi::Runtime &rt, const jsi::Object &ob
195
157
  }
196
158
 
197
159
  [_rctInstance callFunctionOnBufferedRuntimeExecutor:[=](jsi::Runtime &runtime) {
198
- facebook::react::defineReadOnlyGlobal(runtime, "postHostMessage", [self createPostMessageFunction:runtime]);
199
- facebook::react::defineReadOnlyGlobal(runtime, "onHostMessage", [self createSetOnMessageFunction:runtime]);
200
160
  [self setupErrorHandler:runtime];
161
+
162
+ // Install SharedStore into background runtime
163
+ SharedStore::install(runtime);
164
+
165
+ // Install SharedRPC with executor for cross-runtime notifications
166
+ RCTInstance *bgInstance = _rctInstance;
167
+ RPCRuntimeExecutor bgExecutor = [bgInstance](std::function<void(jsi::Runtime &)> work) {
168
+ [bgInstance callFunctionOnBufferedRuntimeExecutor:[work](jsi::Runtime &rt) {
169
+ work(rt);
170
+ }];
171
+ };
172
+ SharedRPC::install(runtime, std::move(bgExecutor), "background");
173
+ [BTLogger info:@"SharedStore and SharedRPC installed in background runtime"];
174
+ invokeOptionalGlobalFunction(runtime, "__setupBackgroundRPCHandler");
201
175
  }];
202
176
  }
203
177
 
@@ -214,67 +188,6 @@ static std::string safeGetStringProperty(jsi::Runtime &rt, const jsi::Object &ob
214
188
  return [super getTurboModule:name jsInvoker:jsInvoker];
215
189
  }
216
190
 
217
- - (jsi::Function)createPostMessageFunction:(jsi::Runtime &)runtime
218
- {
219
- return jsi::Function::createFromHostFunction(
220
- runtime,
221
- jsi::PropNameID::forAscii(runtime, "postMessage"),
222
- 2, // Updated to accept up to 2 arguments
223
- [=](jsi::Runtime &rt, const jsi::Value &, const jsi::Value *args, size_t count) {
224
- // Validate runtime before any JSI operations
225
- try {
226
- rt.global(); // Test if runtime is accessible
227
- } catch (...) {
228
- return jsi::Value::undefined();
229
- }
230
-
231
- if (count < 1 || count > 2) {
232
- throw jsi::JSError(rt, "Expected 1 or 2 arguments: postMessage(message, targetOrigin?)");
233
- }
234
-
235
- const jsi::Value &messageArg = args[0];
236
- if (!messageArg.isString()) {
237
- throw jsi::JSError(rt, "Expected an string as the first argument");
238
- }
239
- // jsi::Object jsonObject = rt.global().getPropertyAsObject(rt, "JSON");
240
- // jsi::Function jsonStringify = jsonObject.getPropertyAsFunction(rt, "stringify");
241
- // jsi::Value jsonResult = jsonStringify.call(rt, messageArg);
242
- std::string messageJson = messageArg.getString(rt).utf8(rt);
243
- NSString *messageNS = [NSString stringWithUTF8String:messageJson.c_str()];
244
- dispatch_async(dispatch_get_main_queue(), ^{
245
- if (self.onMessageCallback) {
246
- self.onMessageCallback(messageNS);
247
- }
248
- });
249
- return jsi::Value::undefined();
250
- });
251
- }
252
-
253
- - (jsi::Function)createSetOnMessageFunction:(jsi::Runtime &)runtime
254
- {
255
- return jsi::Function::createFromHostFunction(
256
- runtime,
257
- jsi::PropNameID::forAscii(runtime, "setOnMessage"),
258
- 1,
259
- [=](jsi::Runtime &rt, const jsi::Value &, const jsi::Value *args, size_t count) {
260
- if (count != 1) {
261
- throw jsi::JSError(rt, "Expected exactly one argument");
262
- }
263
-
264
- const jsi::Value &arg = args[0];
265
- if (!arg.isObject() || !arg.asObject(rt).isFunction(rt)) {
266
- throw jsi::JSError(rt, "Expected a function as the first argument");
267
- }
268
-
269
- jsi::Function fn = arg.asObject(rt).asFunction(rt);
270
-
271
- _onMessageSandbox.reset();
272
- _onMessageSandbox = std::make_shared<jsi::Function>(std::move(fn));
273
-
274
- return jsi::Value::undefined();
275
- });
276
- }
277
-
278
191
  - (void)setupErrorHandler:(jsi::Runtime &)runtime
279
192
  {
280
193
  // Get ErrorUtils
@@ -4,5 +4,6 @@
4
4
 
5
5
  - (void)startBackgroundRunner;
6
6
  - (void)startBackgroundRunnerWithEntryURL:(NSString *)entryURL;
7
+ - (void)installSharedBridge;
7
8
 
8
9
  @end
@@ -18,31 +18,15 @@
18
18
  }
19
19
 
20
20
  - (void)startBackgroundRunnerWithEntryURL:(NSString *)entryURL {
21
- BackgroundThreadManager *manager = [BackgroundThreadManager sharedInstance];
22
- [manager startBackgroundRunnerWithEntryURL:entryURL];
23
- }
24
-
25
- // Force register event callback during initialization
26
- // This is mainly to handle the scenario of restarting in development environment
27
- - (void)initBackgroundThread {
28
- [self bindMessageCallback];
29
- }
30
-
31
- - (void)bindMessageCallback {
32
21
  BackgroundThreadManager *manager = [BackgroundThreadManager sharedInstance];
33
- __weak __typeof__(self) weakSelf = self;
34
- [manager setOnMessageCallback:^(NSString *message) {
35
- [weakSelf emitOnBackgroundMessage:message];
36
- }];
22
+ [manager startBackgroundRunnerWithEntryURL:entryURL];
37
23
  }
38
24
 
39
- - (void)postBackgroundMessage:(nonnull NSString *)message {
40
- BackgroundThreadManager *manager = [BackgroundThreadManager
41
- sharedInstance];
42
- if (!manager.checkMessageCallback) {
43
- [self bindMessageCallback];
44
- }
45
- [[BackgroundThreadManager sharedInstance] postBackgroundMessage:message];
25
+ - (void)installSharedBridge {
26
+ // On iOS, SharedBridge is installed from AppDelegate's hostDidStart: callback
27
+ // via +[BackgroundThreadManager installSharedBridgeInMainRuntime:].
28
+ // This is a no-op here — kept for API parity with Android.
29
+ [BTLogger info:@"installSharedBridge called (no-op on iOS, installed from AppDelegate)"];
46
30
  }
47
31
 
48
32
  + (NSString *)moduleName
@@ -4,12 +4,18 @@ NS_ASSUME_NONNULL_BEGIN
4
4
 
5
5
  @class BackgroundReactNativeDelegate;
6
6
  @class RCTReactNativeFactory;
7
+ @class RCTHost;
7
8
 
8
9
  @interface BackgroundThreadManager : NSObject
9
10
 
10
11
  /// Shared instance for singleton pattern
11
12
  + (instancetype)sharedInstance;
12
13
 
14
+ /// Install SharedBridge HostObject into the main (UI) runtime.
15
+ /// Call this from your AppDelegate's ReactNativeDelegate hostDidStart: callback.
16
+ /// @param host The RCTHost for the main runtime
17
+ + (void)installSharedBridgeInMainRuntime:(RCTHost *)host;
18
+
13
19
  /// Start background runner with default entry URL
14
20
  - (void)startBackgroundRunner;
15
21
 
@@ -17,18 +23,6 @@ NS_ASSUME_NONNULL_BEGIN
17
23
  /// @param entryURL The custom entry URL for the background runner
18
24
  - (void)startBackgroundRunnerWithEntryURL:(NSString *)entryURL;
19
25
 
20
- /// Post message to background runner
21
- /// @param message The message to post
22
- - (void)postBackgroundMessage:(NSString *)message;
23
-
24
- /// Set callback for handling background messages
25
- /// @param callback The callback block to handle messages
26
- - (void)setOnMessageCallback:(void (^)(NSString *message))callback;
27
-
28
- /// Check if message callback is set
29
- /// @return YES if message callback is set, NO otherwise
30
- - (BOOL)checkMessageCallback;
31
-
32
26
  /// Check if background runner is started
33
27
  @property (nonatomic, readonly) BOOL isStarted;
34
28
 
@@ -15,12 +15,16 @@
15
15
  #import "BackgroundRunnerReactNativeDelegate.h"
16
16
  #import "BTLogger.h"
17
17
 
18
+ #include "SharedStore.h"
19
+ #include "SharedRPC.h"
20
+ #import <ReactCommon/RCTHost.h>
21
+ #import <objc/runtime.h>
22
+
18
23
  @interface BackgroundThreadManager ()
19
24
  @property (nonatomic, strong) BackgroundReactNativeDelegate *reactNativeFactoryDelegate;
20
25
  @property (nonatomic, strong) RCTReactNativeFactory *reactNativeFactory;
21
26
  @property (nonatomic, assign) BOOL hasListeners;
22
27
  @property (nonatomic, assign, readwrite) BOOL isStarted;
23
- @property (nonatomic, copy) void (^onMessageCallback)(NSString *message);
24
28
  @end
25
29
 
26
30
  @implementation BackgroundThreadManager
@@ -48,6 +52,37 @@ static NSString *const MODULE_DEBUG_URL = @"http://localhost:8082/apps/mobile/ba
48
52
  return self;
49
53
  }
50
54
 
55
+ #pragma mark - SharedBridge
56
+
57
+ + (void)installSharedBridgeInMainRuntime:(RCTHost *)host {
58
+ if (!host) {
59
+ [BTLogger error:@"Cannot install SharedBridge: RCTHost is nil"];
60
+ return;
61
+ }
62
+
63
+ Ivar ivar = class_getInstanceVariable([host class], "_instance");
64
+ id instance = object_getIvar(host, ivar);
65
+
66
+ if (!instance) {
67
+ [BTLogger error:@"Cannot install SharedBridge: RCTInstance is nil"];
68
+ return;
69
+ }
70
+
71
+ [instance callFunctionOnBufferedRuntimeExecutor:^(facebook::jsi::Runtime &runtime) {
72
+ SharedStore::install(runtime);
73
+
74
+ // Install SharedRPC with executor for cross-runtime notifications
75
+ id capturedInstance = instance;
76
+ RPCRuntimeExecutor mainExecutor = [capturedInstance](std::function<void(jsi::Runtime &)> work) {
77
+ [capturedInstance callFunctionOnBufferedRuntimeExecutor:[work](jsi::Runtime &rt) {
78
+ work(rt);
79
+ }];
80
+ };
81
+ SharedRPC::install(runtime, std::move(mainExecutor), "main");
82
+ [BTLogger info:@"SharedStore and SharedRPC installed in main runtime"];
83
+ }];
84
+ }
85
+
51
86
  #pragma mark - Public Methods
52
87
 
53
88
  - (void)startBackgroundRunner {
@@ -71,39 +106,15 @@ static NSString *const MODULE_DEBUG_URL = @"http://localhost:8082/apps/mobile/ba
71
106
  NSDictionary *launchOptions = @{};
72
107
  self.reactNativeFactoryDelegate = [[BackgroundReactNativeDelegate alloc] init];
73
108
  self.reactNativeFactory = [[RCTReactNativeFactory alloc] initWithDelegate:self.reactNativeFactoryDelegate];
74
-
109
+
75
110
  #if DEBUG
76
111
  [self.reactNativeFactoryDelegate setJsBundleSource:std::string([entryURL UTF8String])];
77
112
  #endif
78
-
113
+
79
114
  [self.reactNativeFactory.rootViewFactory viewWithModuleName:MODULE_NAME
80
115
  initialProperties:initialProperties
81
116
  launchOptions:launchOptions];
82
-
83
- __weak __typeof__(self) weakSelf = self;
84
- [self.reactNativeFactoryDelegate setOnMessageCallback:^(NSString *message) {
85
- if (weakSelf.onMessageCallback) {
86
- weakSelf.onMessageCallback(message);
87
- }
88
- }];
89
117
  });
90
118
  }
91
119
 
92
- - (void)postBackgroundMessage:(NSString *)message {
93
- if (self.reactNativeFactoryDelegate) {
94
- [self.reactNativeFactoryDelegate postMessage:std::string([message UTF8String])];
95
- }
96
- }
97
-
98
- - (void)setOnMessageCallback:(void (^)(NSString *message))callback {
99
- _onMessageCallback = callback;
100
- }
101
-
102
- - (BOOL)checkMessageCallback {
103
- if (self.onMessageCallback) {
104
- return YES;
105
- }
106
- return NO;
107
- }
108
-
109
120
  @end
@@ -1 +1 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeBackgroundThread.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAAQ,cAAc;AAUlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,kBAAkB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeBackgroundThread.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAAQ,cAAc;AAQlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,kBAAkB,CAAC","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ export function getSharedRPC() {
4
+ return globalThis.sharedRPC;
5
+ }
6
+ //# sourceMappingURL=SharedRPC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getSharedRPC","globalThis","sharedRPC"],"sourceRoot":"../../src","sources":["SharedRPC.ts"],"mappings":";;AAaA,OAAO,SAASA,YAAYA,CAAA,EAA2B;EACrD,OAAOC,UAAU,CAACC,SAAS;AAC7B","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ export function getSharedStore() {
4
+ return globalThis.sharedStore;
5
+ }
6
+ //# sourceMappingURL=SharedStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getSharedStore","globalThis","sharedStore"],"sourceRoot":"../../src","sources":["SharedStore.ts"],"mappings":";;AAeA,OAAO,SAASA,cAAcA,CAAA,EAA6B;EACzD,OAAOC,UAAU,CAACC,WAAW;AAC/B","ignoreList":[]}
@@ -2,4 +2,6 @@
2
2
 
3
3
  import NativeBackgroundThread from "./NativeBackgroundThread.js";
4
4
  export const BackgroundThread = NativeBackgroundThread;
5
+ export { getSharedStore } from "./SharedStore.js";
6
+ export { getSharedRPC } from "./SharedRPC.js";
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["NativeBackgroundThread","BackgroundThread"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,sBAAsB,MAAM,6BAA0B;AAE7D,OAAO,MAAMC,gBAAgB,GAAGD,sBAAsB","ignoreList":[]}
1
+ {"version":3,"names":["NativeBackgroundThread","BackgroundThread","getSharedStore","getSharedRPC"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,sBAAsB,MAAM,6BAA0B;AAE7D,OAAO,MAAMC,gBAAgB,GAAGD,sBAAsB;AACtD,SAASE,cAAc,QAAQ,kBAAe;AAE9C,SAASC,YAAY,QAAQ,gBAAa","ignoreList":[]}
@@ -1,9 +1,7 @@
1
- import type { CodegenTypes, TurboModule } from 'react-native';
1
+ import type { TurboModule } from 'react-native';
2
2
  export interface Spec extends TurboModule {
3
- readonly onBackgroundMessage: CodegenTypes.EventEmitter<string>;
4
- postBackgroundMessage(message: string): void;
5
3
  startBackgroundRunnerWithEntryURL(entryURL: string): void;
6
- initBackgroundThread(): void;
4
+ installSharedBridge(): void;
7
5
  }
8
6
  declare const _default: Spec;
9
7
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeBackgroundThread.d.ts","sourceRoot":"","sources":["../../../src/NativeBackgroundThread.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,QAAQ,CAAC,mBAAmB,EAAE,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAChE,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,iCAAiC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,oBAAoB,IAAI,IAAI,CAAC;CAC9B;;AAED,wBAA0E"}
1
+ {"version":3,"file":"NativeBackgroundThread.d.ts","sourceRoot":"","sources":["../../../src/NativeBackgroundThread.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,iCAAiC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,mBAAmB,IAAI,IAAI,CAAC;CAC7B;;AAED,wBAA0E"}
@@ -0,0 +1,12 @@
1
+ export interface ISharedRPC {
2
+ write(callId: string, value: string | number | boolean): void;
3
+ read(callId: string): string | number | boolean | undefined;
4
+ has(callId: string): boolean;
5
+ readonly pendingCount: number;
6
+ onWrite(callback: (callId: string) => void): void;
7
+ }
8
+ declare global {
9
+ var sharedRPC: ISharedRPC | undefined;
10
+ }
11
+ export declare function getSharedRPC(): ISharedRPC | undefined;
12
+ //# sourceMappingURL=SharedRPC.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedRPC.d.ts","sourceRoot":"","sources":["../../../src/SharedRPC.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC5D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;CACnD;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,YAAY,IAAI,UAAU,GAAG,SAAS,CAErD"}
@@ -0,0 +1,14 @@
1
+ export interface ISharedStore {
2
+ set(key: string, value: string | number | boolean): void;
3
+ get(key: string): string | number | boolean | undefined;
4
+ has(key: string): boolean;
5
+ delete(key: string): boolean;
6
+ keys(): string[];
7
+ clear(): void;
8
+ readonly size: number;
9
+ }
10
+ declare global {
11
+ var sharedStore: ISharedStore | undefined;
12
+ }
13
+ export declare function getSharedStore(): ISharedStore | undefined;
14
+ //# sourceMappingURL=SharedStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedStore.d.ts","sourceRoot":"","sources":["../../../src/SharedStore.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IACzD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,IAAI,IAAI,MAAM,EAAE,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,WAAW,EAAE,YAAY,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAgB,cAAc,IAAI,YAAY,GAAG,SAAS,CAEzD"}
@@ -1,2 +1,6 @@
1
1
  export declare const BackgroundThread: import("./NativeBackgroundThread").Spec;
2
+ export { getSharedStore } from './SharedStore';
3
+ export type { ISharedStore } from './SharedStore';
4
+ export { getSharedRPC } from './SharedRPC';
5
+ export type { ISharedRPC } from './SharedRPC';
2
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,yCAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,yCAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/react-native-background-thread",
3
- "version": "1.1.45",
3
+ "version": "1.1.47",
4
4
  "description": "react-native-background-thread",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -76,7 +76,7 @@
76
76
  "lefthook": "^2.0.3",
77
77
  "prettier": "^2.8.8",
78
78
  "react": "19.2.0",
79
- "react-native": "0.83.0",
79
+ "react-native": "patch:react-native@npm%3A0.83.0#~/.yarn/patches/react-native-npm-0.83.0-577d0f2d83.patch",
80
80
  "react-native-builder-bob": "^0.40.17",
81
81
  "release-it": "^19.0.4",
82
82
  "turbo": "^2.5.6",
@@ -1,11 +1,9 @@
1
1
  import { TurboModuleRegistry } from 'react-native';
2
2
 
3
- import type { CodegenTypes, TurboModule } from 'react-native';
3
+ import type { TurboModule } from 'react-native';
4
4
  export interface Spec extends TurboModule {
5
- readonly onBackgroundMessage: CodegenTypes.EventEmitter<string>;
6
- postBackgroundMessage(message: string): void;
7
5
  startBackgroundRunnerWithEntryURL(entryURL: string): void;
8
- initBackgroundThread(): void;
6
+ installSharedBridge(): void;
9
7
  }
10
8
 
11
9
  export default TurboModuleRegistry.getEnforcing<Spec>('BackgroundThread');
@@ -0,0 +1,16 @@
1
+ export interface ISharedRPC {
2
+ write(callId: string, value: string | number | boolean): void;
3
+ read(callId: string): string | number | boolean | undefined;
4
+ has(callId: string): boolean;
5
+ readonly pendingCount: number;
6
+ onWrite(callback: (callId: string) => void): void;
7
+ }
8
+
9
+ declare global {
10
+ // eslint-disable-next-line no-var
11
+ var sharedRPC: ISharedRPC | undefined;
12
+ }
13
+
14
+ export function getSharedRPC(): ISharedRPC | undefined {
15
+ return globalThis.sharedRPC;
16
+ }
@@ -0,0 +1,18 @@
1
+ export interface ISharedStore {
2
+ set(key: string, value: string | number | boolean): void;
3
+ get(key: string): string | number | boolean | undefined;
4
+ has(key: string): boolean;
5
+ delete(key: string): boolean;
6
+ keys(): string[];
7
+ clear(): void;
8
+ readonly size: number;
9
+ }
10
+
11
+ declare global {
12
+ // eslint-disable-next-line no-var
13
+ var sharedStore: ISharedStore | undefined;
14
+ }
15
+
16
+ export function getSharedStore(): ISharedStore | undefined {
17
+ return globalThis.sharedStore;
18
+ }
package/src/index.tsx CHANGED
@@ -1,3 +1,7 @@
1
1
  import NativeBackgroundThread from './NativeBackgroundThread';
2
2
 
3
3
  export const BackgroundThread = NativeBackgroundThread;
4
+ export { getSharedStore } from './SharedStore';
5
+ export type { ISharedStore } from './SharedStore';
6
+ export { getSharedRPC } from './SharedRPC';
7
+ export type { ISharedRPC } from './SharedRPC';