diff --git a/example/ThreadExample/index.ios.js b/example/ThreadExample/index.ios.js index e6bad64796e598d03d66818557d5099d09281ad5..51cf77146db9dad7be7c9c083bb9017e5de5872d 100644 --- a/example/ThreadExample/index.ios.js +++ b/example/ThreadExample/index.ios.js @@ -7,11 +7,11 @@ import { TouchableOpacity, } from 'react-native'; -import { worker } from 'react-native-thread'; +import { Thread } from 'react-native-thread'; class ThreadExample extends Component { componentDidMount() { - this.worker = new worker('worker.js'); + this.worker= new Thread('worker.js'); this.worker.onmessage = (message) => { console.log("Got message from worker", message); diff --git a/index.js b/index.js index 93c20ab68bac9c3df54769367488a8c73f2033a2..404aa906958d547bdb82501748949f723ded6325 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,2 @@ -export self from './js/self'; -export worker from './js/worker'; -// import { NativeModules } from 'react-native'; -// -// const { RNThread } = NativeModules; -// -// export default RNThread; +export { default as self } from './js/self'; +export { default as Thread } from './js/Thread'; diff --git a/ios/RNThread.xcodeproj/project.pbxproj b/ios/RNThread.xcodeproj/project.pbxproj index 4354a6251e8c8d08b942febf879c1000596eb523..67a21bbabcb694692e620ee095caa444bc609c5d 100644 --- a/ios/RNThread.xcodeproj/project.pbxproj +++ b/ios/RNThread.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - C039B44A1F6CF2A4009CB65E /* WorkerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C039B4471F6CF2A4009CB65E /* WorkerManager.m */; }; + C039B44A1F6CF2A4009CB65E /* ThreadManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C039B4471F6CF2A4009CB65E /* ThreadManager.m */; }; C039B44B1F6CF2A4009CB65E /* WorkerSelfManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C039B4491F6CF2A4009CB65E /* WorkerSelfManager.m */; }; /* End PBXBuildFile section */ @@ -25,9 +25,9 @@ /* Begin PBXFileReference section */ 134814201AA4EA6300B7C361 /* libRNThread.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNThread.a; sourceTree = BUILT_PRODUCTS_DIR; }; - C039B4461F6CF2A4009CB65E /* WorkerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerManager.h; sourceTree = ""; }; - C039B4471F6CF2A4009CB65E /* WorkerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WorkerManager.m; sourceTree = ""; }; - C039B4481F6CF2A4009CB65E /* WorkerSelfManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerSelfManager.h; sourceTree = ""; }; + C039B4461F6CF2A4009CB65E /* ThreadManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadManager.h; sourceTree = ""; }; + C039B4471F6CF2A4009CB65E /* ThreadManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadManager.m; sourceTree = ""; }; + C039B4481F6CF2A4009CB65E /* ThreadSelfManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadSelfManager.h; sourceTree = ""; }; C039B4491F6CF2A4009CB65E /* WorkerSelfManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WorkerSelfManager.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -53,9 +53,9 @@ 58B511D21A9E6C8500147676 = { isa = PBXGroup; children = ( - C039B4461F6CF2A4009CB65E /* WorkerManager.h */, - C039B4471F6CF2A4009CB65E /* WorkerManager.m */, - C039B4481F6CF2A4009CB65E /* WorkerSelfManager.h */, + C039B4461F6CF2A4009CB65E /* ThreadManager.h */, + C039B4471F6CF2A4009CB65E /* ThreadManager.m */, + C039B4481F6CF2A4009CB65E /* ThreadSelfManager.h */, C039B4491F6CF2A4009CB65E /* WorkerSelfManager.m */, 134814211AA4EA7D00B7C361 /* Products */, ); @@ -117,7 +117,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C039B44A1F6CF2A4009CB65E /* WorkerManager.m in Sources */, + C039B44A1F6CF2A4009CB65E /* ThreadManager.m in Sources */, C039B44B1F6CF2A4009CB65E /* WorkerSelfManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ios/WorkerManager.h b/ios/ThreadManager.h similarity index 54% rename from ios/WorkerManager.h rename to ios/ThreadManager.h index e5c796ca2d94fbaaababfd6a1007d470980775a5..04ba3619753fab10aae7100372ae6f057e5a141a 100644 --- a/ios/WorkerManager.h +++ b/ios/ThreadManager.h @@ -1,13 +1,13 @@ -#ifndef WorkerManager_h -#define WorkerManager_h +#ifndef ThreadManager_h +#define ThreadManager_h -#import "WorkerSelfManager.h" +#import "ThreadSelfManager.h" #import #import #import #import -@interface WorkerManager : NSObject +@interface ThreadManager : NSObject @end #endif diff --git a/ios/ThreadManager.m b/ios/ThreadManager.m new file mode 100644 index 0000000000000000000000000000000000000000..e1e57b4b4336a2ed5ae8557350a67d4591aca37c --- /dev/null +++ b/ios/ThreadManager.m @@ -0,0 +1,88 @@ +#import "ThreadManager.h" +#include + +@implementation ThreadManager + +@synthesize bridge = _bridge; + +NSMutableDictionary *threads; + +RCT_EXPORT_MODULE(); + +RCT_REMAP_METHOD(startThread, + name: (NSString *)name + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + if (threads == nil) { + threads = [[NSMutableDictionary alloc] init]; + } + + int threadId = abs(arc4random()); + + NSURL *threadURL = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:name fallbackResource:nil]; + NSLog(@"starting Thread %@", [threadURL absoluteString]); + + + RCTBridge *threadBridge = [[RCTBridge alloc] initWithBundleURL:threadURL + moduleProvider:nil + launchOptions:nil]; + + ThreadSelfManager *threadSelf = [threadBridge moduleForName:@"ThreadSelfManager"]; + [threadSelf setThreadId:threadId]; + [threadSelf setParentBridge:self.bridge]; + + + [threads setObject:threadBridge forKey:[NSNumber numberWithInt:threadId]]; + resolve([NSNumber numberWithInt:threadId]); +} + +RCT_EXPORT_METHOD(stopThread:(int)threadId) +{ + if (threads == nil) { + NSLog(@"Empty list of threads. abort stopping thread with id %i", threadId); + return; + } + + RCTBridge *threadBridge = threads[[NSNumber numberWithInt:threadId]]; + if (threadBridge == nil) { + NSLog(@"Thread is NIl. abort stopping thread with id %i", threadId); + return; + } + + [threadBridge invalidate]; + [threads removeObjectForKey:[NSNumber numberWithInt:threadId]]; +} + +RCT_EXPORT_METHOD(postThreadMessage: (int)threadId message:(NSString *)message) +{ + if (threads == nil) { + NSLog(@"Empty list of threads. abort posting to thread with id %i", threadId); + return; + } + + RCTBridge *threadBridge = threads[[NSNumber numberWithInt:threadId]]; + if (threadBridge == nil) { + NSLog(@"Thread is NIl. abort posting to thread with id %i", threadId); + return; + } + + [threadBridge.eventDispatcher sendAppEventWithName:@"ThreadMessage" + body:message]; +} + +- (void)invalidate { + if (threads == nil) { + return; + } + + for (NSNumber *threadId in threads) { + RCTBridge *threadBridge = threads[threadId]; + [threadBridge invalidate]; + } + + [threads removeAllObjects]; + threads = nil; +} + +@end diff --git a/ios/WorkerSelfManager.h b/ios/ThreadSelfManager.h similarity index 52% rename from ios/WorkerSelfManager.h rename to ios/ThreadSelfManager.h index d1e43521dc85856b018996bd3dba73b9b9ebdde9..b4b47b713021dce82018f3a8ab6477f13838b902 100644 --- a/ios/WorkerSelfManager.h +++ b/ios/ThreadSelfManager.h @@ -1,12 +1,12 @@ -#ifndef WorkerSelfManager_h -#define WorkerSelfManager_h +#ifndef ThreadSelfManager_h +#define ThreadSelfManager_h #import #import #import -@interface WorkerSelfManager : NSObject -@property int workerId; +@interface ThreadSelfManager : NSObject +@property int threadId; @property RCTBridge *parentBridge; @end diff --git a/ios/WorkerManager.m b/ios/WorkerManager.m deleted file mode 100644 index a6efbd501490371aeaa794ed392ba7fe7002262d..0000000000000000000000000000000000000000 --- a/ios/WorkerManager.m +++ /dev/null @@ -1,88 +0,0 @@ -#import "WorkerManager.h" -#include - -@implementation WorkerManager - -@synthesize bridge = _bridge; - -NSMutableDictionary *workers; - -RCT_EXPORT_MODULE(); - -RCT_REMAP_METHOD(startWorker, - name: (NSString *)name - resolver:(RCTPromiseResolveBlock)resolve - rejecter:(RCTPromiseRejectBlock)reject) -{ - if (workers == nil) { - workers = [[NSMutableDictionary alloc] init]; - } - - int workerId = abs(arc4random()); - - NSURL *workerURL = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:name fallbackResource:nil]; - NSLog(@"starting Worker %@", [workerURL absoluteString]); - - - RCTBridge *workerBridge = [[RCTBridge alloc] initWithBundleURL:workerURL - moduleProvider:nil - launchOptions:nil]; - - WorkerSelfManager *workerSelf = [workerBridge moduleForName:@"WorkerSelfManager"]; - [workerSelf setWorkerId:workerId]; - [workerSelf setParentBridge:self.bridge]; - - - [workers setObject:workerBridge forKey:[NSNumber numberWithInt:workerId]]; - resolve([NSNumber numberWithInt:workerId]); -} - -RCT_EXPORT_METHOD(stopWorker:(int)workerId) -{ - if (workers == nil) { - NSLog(@"Empty list of workers. abort stopping worker with id %i", workerId); - return; - } - - RCTBridge *workerBridge = workers[[NSNumber numberWithInt:workerId]]; - if (workerBridge == nil) { - NSLog(@"Worker is NIl. abort stopping worker with id %i", workerId); - return; - } - - [workerBridge invalidate]; - [workers removeObjectForKey:[NSNumber numberWithInt:workerId]]; -} - -RCT_EXPORT_METHOD(postWorkerMessage: (int)workerId message:(NSString *)message) -{ - if (workers == nil) { - NSLog(@"Empty list of workers. abort posting to worker with id %i", workerId); - return; - } - - RCTBridge *workerBridge = workers[[NSNumber numberWithInt:workerId]]; - if (workerBridge == nil) { - NSLog(@"Worker is NIl. abort posting to worker with id %i", workerId); - return; - } - - [workerBridge.eventDispatcher sendAppEventWithName:@"WorkerMessage" - body:message]; -} - -- (void)invalidate { - if (workers == nil) { - return; - } - - for (NSNumber *workerId in workers) { - RCTBridge *workerBridge = workers[workerId]; - [workerBridge invalidate]; - } - - [workers removeAllObjects]; - workers = nil; -} - -@end diff --git a/ios/WorkerSelfManager.m b/ios/WorkerSelfManager.m index 2ceba9de5525450fb9bc7097841f90052e51c4dd..4ab0e05fb533144215ce7989e0ba4138adf9169f 100644 --- a/ios/WorkerSelfManager.m +++ b/ios/WorkerSelfManager.m @@ -1,22 +1,22 @@ -#import "WorkerSelfManager.h" +#import "ThreadSelfManager.h" #include -@implementation WorkerSelfManager +@implementation ThreadSelfManager RCT_EXPORT_MODULE(); @synthesize bridge = _bridge; @synthesize parentBridge = _parentBridge; -@synthesize workerId = _workerId; +@synthesize threadId = _threadId; RCT_EXPORT_METHOD(postMessage: (NSString *)message) { if (self.parentBridge == nil) { - NSLog(@"No parent bridge defined - abord sending worker message"); + NSLog(@"No parent bridge defined - abord sending thread message"); return; } - NSString *eventName = [NSString stringWithFormat:@"Worker%i", self.workerId]; + NSString *eventName = [NSString stringWithFormat:@"thread%i", self.threadId]; [self.parentBridge.eventDispatcher sendAppEventWithName:eventName body:message]; diff --git a/js/worker.js b/js/Thread.js similarity index 60% rename from js/worker.js rename to js/Thread.js index c81ba0af21b89f93ac88f75e4d304f33ef2d6e19..4380b58721d267f1ecba4fc93e44530ba45f80e7 100644 --- a/js/worker.js +++ b/js/Thread.js @@ -3,17 +3,17 @@ import { DeviceEventEmitter, } from 'react-native'; -const { WorkerManager } = NativeModules; +const { ThreadManager } = NativeModules; -export default class Worker { +export default class Thread { constructor(jsPath) { if (!jsPath || !jsPath.endsWith('.js')) { throw new Error("Invalid worker path. Only js files are supported"); } - this.id = WorkerManager.startWorker(jsPath.replace(".js", "")) + this.id = ThreadManager.startThread(jsPath.replace(".js", "")) .then(id => { - DeviceEventEmitter.addListener(`Worker${id}`, (message) => { + DeviceEventEmitter.addListener(`Thread${id}`, (message) => { !!message && this.onmessage && this.onmessage(message); }); return id; @@ -22,10 +22,10 @@ export default class Worker { } postMessage(message) { - this.id.then(id => WorkerManager.postWorkerMessage(id, message)); + this.id.then(id => ThreadManager.postThreadMessage(id, message)); } terminate() { - this.id.then(WorkerManager.stopWorker); + this.id.then(ThreadManager.stopThread); } } diff --git a/js/self.js b/js/self.js index e908ed64c85881d53d02b17ae4477cf658c478c3..e3b06f2d0a3740e411ce0d76f32f81bdd988fc64 100644 --- a/js/self.js +++ b/js/self.js @@ -3,18 +3,18 @@ import { DeviceEventEmitter, } from 'react-native'; -const { WorkerSelfManager } = NativeModules; +const { ThreadSelfManager } = NativeModules; const self = { onmessage: null, postMessage: (message) => { if (!message) { return; } - WorkerSelfManager.postMessage(message); + ThreadSelfManager.postMessage(message); } }; -DeviceEventEmitter.addListener("WorkerMessage", (message) => { +DeviceEventEmitter.addListener("ThreadMessage", (message) => { !!message && self.onmessage && self.onmessage(message); }); diff --git a/package.json b/package.json index 40f93fd615d85427e8199bdeb810af15ce4a570d..6c940f54e07ebcb6afbeaa3401daa3357f87a0cb 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,5 @@ "peerDependencies": { "react-native": "^0.41.2", "react-native-windows": "0.41.0-rc.1" - } }