diff --git a/doric-android/devkit/src/main/AndroidManifest.xml b/doric-android/devkit/src/main/AndroidManifest.xml
index a6d467f8..e02359eb 100644
--- a/doric-android/devkit/src/main/AndroidManifest.xml
+++ b/doric-android/devkit/src/main/AndroidManifest.xml
@@ -1,12 +1,15 @@
-
+
+
-
-
+
+
diff --git a/doric-android/devkit/src/main/java/pub/doric/devkit/IDevKit.java b/doric-android/devkit/src/main/java/pub/doric/devkit/IDevKit.java
index 18a6b0e0..dd720085 100644
--- a/doric-android/devkit/src/main/java/pub/doric/devkit/IDevKit.java
+++ b/doric-android/devkit/src/main/java/pub/doric/devkit/IDevKit.java
@@ -6,7 +6,7 @@ import org.json.JSONObject;
public interface IDevKit {
enum Command {
- HOT_RELOAD, EXCEPTION, LOG
+ HOT_RELOAD, EXCEPTION, LOG, DEBUG
}
void connectDevKit(String url);
diff --git a/doric-android/devkit/src/main/java/pub/doric/devkit/WSClient.java b/doric-android/devkit/src/main/java/pub/doric/devkit/WSClient.java
index 3b5d6a62..d3766c69 100644
--- a/doric-android/devkit/src/main/java/pub/doric/devkit/WSClient.java
+++ b/doric-android/devkit/src/main/java/pub/doric/devkit/WSClient.java
@@ -49,7 +49,7 @@ public class WSClient extends WebSocketListener {
boolean intercept(String type, String command, JSONObject payload) throws JSONException;
}
- private Set interceptors = new HashSet<>();
+ private final Set interceptors = new HashSet<>();
public WSClient(String url) {
OkHttpClient okHttpClient = new OkHttpClient
diff --git a/doric-android/devkit/src/main/java/pub/doric/devkit/ui/DoricDevActivity.java b/doric-android/devkit/src/main/java/pub/doric/devkit/ui/DoricDevActivity.java
index e513ae22..9541a950 100644
--- a/doric-android/devkit/src/main/java/pub/doric/devkit/ui/DoricDevActivity.java
+++ b/doric-android/devkit/src/main/java/pub/doric/devkit/ui/DoricDevActivity.java
@@ -17,6 +17,8 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
+import com.github.pengfeizhou.jscore.JSONBuilder;
+
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@@ -25,6 +27,7 @@ import pub.doric.DoricContext;
import pub.doric.DoricContextManager;
import pub.doric.devkit.DevKit;
import pub.doric.devkit.DoricDev;
+import pub.doric.devkit.IDevKit;
import pub.doric.devkit.R;
import pub.doric.devkit.event.ConnectExceptionEvent;
import pub.doric.devkit.event.EOFExceptionEvent;
@@ -150,7 +153,11 @@ public class DoricDevActivity extends AppCompatActivity {
cell.findViewById(R.id.debug_text_view).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
-
+ DevKit.getInstance().sendDevCommand(
+ IDevKit.Command.DEBUG,
+ new JSONBuilder()
+ .put("source", doricContext.getSource())
+ .toJSONObject());
}
});
diff --git a/doric-cli/src/server.ts b/doric-cli/src/server.ts
index 099dbe3f..b49bd7f1 100644
--- a/doric-cli/src/server.ts
+++ b/doric-cli/src/server.ts
@@ -1,5 +1,8 @@
import WebSocket from "ws"
import "colors";
+import path from "path";
+import { glob } from "./util";
+import { Shell } from "./shell";
export type MSG = {
type: "D2C" | "C2D" | "C2S" | "D2S" | "S2C" | "S2D",
@@ -45,6 +48,26 @@ export async function createServer() {
debug?.send(result);
} else if (resultObject.type === "C2S") {
switch (resultObject.cmd) {
+ case 'DEBUG':
+ let source = resultObject.payload.source as string;
+ if (source.endsWith(".js")) {
+ source = source.replace(".js", ".ts");
+ } else if (!source.endsWith(".ts")) {
+ source = source + ".ts"
+ }
+ const tsFiles = await glob(`**/${source}`, {
+ cwd: path.resolve(process.cwd(), "src")
+ })
+ if (!!!tsFiles || tsFiles.length === 0) {
+ console.error(`Cannot find ${source} in ${path.resolve(process.cwd(), "src")}`);
+ }
+ const sourceFile = tsFiles[0];
+ Shell.exec("node", [
+ "--inspect-brk",
+ path.resolve(process.cwd(), "src", sourceFile)
+ ])
+ console.log(`Debugger on ${sourceFile}`);
+ break;
case 'EXCEPTION':
console.log(resultObject.payload.source.red);
console.log(resultObject.payload.exception.red);
diff --git a/doric-iOS/Devkit/Classes/DoricDebugDriver.h b/doric-iOS/Devkit/Classes/DoricDebugDriver.h
index 8995e521..adbd0251 100644
--- a/doric-iOS/Devkit/Classes/DoricDebugDriver.h
+++ b/doric-iOS/Devkit/Classes/DoricDebugDriver.h
@@ -22,10 +22,11 @@
#import
#import
-
+#import "DoricWSClient.h"
NS_ASSUME_NONNULL_BEGIN
@interface DoricDebugDriver : NSObject
+- (instancetype)initWithWSClient:(DoricWSClient *)wsClient;
@end
NS_ASSUME_NONNULL_END
diff --git a/doric-iOS/Devkit/Classes/DoricDebugDriver.m b/doric-iOS/Devkit/Classes/DoricDebugDriver.m
index 11a8e661..57ced03e 100644
--- a/doric-iOS/Devkit/Classes/DoricDebugDriver.m
+++ b/doric-iOS/Devkit/Classes/DoricDebugDriver.m
@@ -23,19 +23,21 @@
#import "DoricDebugDriver.h"
#import "DoricDebugJSEngine.h"
#import "DoricConstant.h"
-#import "DoricContextManager.h"
+#import "DoricDev.h"
@interface DoricDebugDriver ()
@property(nonatomic, strong) DoricJSEngine *jsExecutor;
+@property(nonatomic, copy) NSString *theContextId;
@end
@implementation DoricDebugDriver
@dynamic registry;
-- (instancetype)init {
+- (instancetype)initWithWSClient:(DoricWSClient *)wsClient {
if (self = [super init]) {
- _jsExecutor = [[DoricDebugJSEngine alloc] init];
+ _jsExecutor = [[DoricDebugJSEngine alloc] initWithWSClient:wsClient];
+ _theContextId = nil;
}
return self;
}
@@ -150,7 +152,7 @@ - (DoricAsyncResult *)createContext:(NSString *)contextId script:(NSString *)scr
__strong typeof(_self) self = _self;
if (!self) return;
@try {
- [self.jsExecutor prepareContext:contextId script:script source:source];
+ self.theContextId = contextId;
[ret setupResult:@YES];
} @catch (NSException *exception) {
[ret setupError:exception];
@@ -166,7 +168,9 @@ - (DoricAsyncResult *)destroyContext:(NSString *)contextId {
__strong typeof(_self) self = _self;
if (!self) return;
@try {
- [self.jsExecutor destroyContext:contextId];
+ if ([contextId isEqualToString:self.theContextId]) {
+ [DoricDev.instance stopDebugging:NO];
+ }
[ret setupResult:@YES];
} @catch (NSException *exception) {
[ret setupError:exception];
diff --git a/doric-iOS/Devkit/Classes/DoricDebugJSEngine.h b/doric-iOS/Devkit/Classes/DoricDebugJSEngine.h
index 8ee9c8ff..8c3b9dfb 100644
--- a/doric-iOS/Devkit/Classes/DoricDebugJSEngine.h
+++ b/doric-iOS/Devkit/Classes/DoricDebugJSEngine.h
@@ -24,11 +24,11 @@
#import
#import
-
+#import "DoricWSClient.h"
NS_ASSUME_NONNULL_BEGIN
@interface DoricDebugJSEngine : DoricJSEngine
-
+- (instancetype)initWithWSClient:(DoricWSClient *)wsClient;
@end
NS_ASSUME_NONNULL_END
diff --git a/doric-iOS/Devkit/Classes/DoricDebugJSEngine.m b/doric-iOS/Devkit/Classes/DoricDebugJSEngine.m
index 37bc5e40..a22a9e0b 100644
--- a/doric-iOS/Devkit/Classes/DoricDebugJSEngine.m
+++ b/doric-iOS/Devkit/Classes/DoricDebugJSEngine.m
@@ -22,68 +22,22 @@
#import "DoricContext.h"
#import "DoricDebugJSEngine.h"
-#import "DoricJSRemoteExecutor.h"
-#import "DoricUtil.h"
-#import "NSString+JsonString.h"
-#import "DoricDev.h"
-
-@interface DoricDebugMonitor : NSObject
-@end
-
-@implementation DoricDebugMonitor
-- (void)onException:(NSException *)exception inContext:(DoricContext *)context {
- DoricLog(@"DefaultMonitor - source: %@- onException - %@", context.source, exception.reason);
- NSDictionary *jsonDic = @{
- @"cmd": @"EXCEPTION",
- @"data": @{
- @"source": [context.source stringByReplacingOccurrencesOfString:@".js" withString:@".ts"],
- @"exception": exception.reason
- }
- };
-
- NSString *jsonStr = [NSString dc_convertToJsonWithDic:jsonDic];
- [[DoricDev instance] sendDevCommand:jsonStr];
-}
-
-- (void)onLog:(DoricLogType)type message:(NSString *)message {
- DoricLog(message);
-
- NSString *typeString = @"DEFAULT";
- if (type == DoricLogTypeDebug) {
- typeString = @"DEFAULT";
- } else if (type == DoricLogTypeWarning) {
- typeString = @"WARN";
- } else if (type == DoricLogTypeError) {
- typeString = @"ERROR";
- }
-
- NSDictionary *jsonDic = @{
- @"cmd": @"LOG",
- @"data": @{
- @"type": typeString,
- @"message": message
- }
- };
-
- NSString *jsonStr = [NSString dc_convertToJsonWithDic:jsonDic];
- [[DoricDev instance] sendDevCommand:jsonStr];
-}
-@end
+#import "DoricRemoteJSExecutor.h"
@interface DoricDebugJSEngine ()
+@property(nonatomic, weak) DoricWSClient *wsClient;
@end
@implementation DoricDebugJSEngine
-- (instancetype)init {
+- (instancetype)initWithWSClient:(DoricWSClient *)wsClient {
if (self = [super init]) {
+ _wsClient = wsClient;
}
return self;
}
- (void)initJSEngine {
- [self.registry registerMonitor:[DoricDebugMonitor new]];
- self.jsExecutor = [[DoricJSRemoteExecutor alloc] init];
+ self.jsExecutor = [[DoricRemoteJSExecutor alloc] initWithWSClient:self.wsClient];
}
-
@end
diff --git a/doric-iOS/Devkit/Classes/DoricDev.h b/doric-iOS/Devkit/Classes/DoricDev.h
index 1437fefd..81d7b402 100644
--- a/doric-iOS/Devkit/Classes/DoricDev.h
+++ b/doric-iOS/Devkit/Classes/DoricDev.h
@@ -19,10 +19,12 @@
//
// Created by jingpeng.wang on 2020/2/25.
//
+#import "DoricWSClient.h"
NS_ASSUME_NONNULL_BEGIN
@interface DoricDev : NSObject
+@property(nonatomic, strong) DoricWSClient *wsClient;
+ (instancetype)instance;
- (void)openDevMode;
@@ -33,8 +35,11 @@ NS_ASSUME_NONNULL_BEGIN
- (void)connectDevKit:(NSString *)url;
-- (void)sendDevCommand:(NSString *)command;
+- (void)startDebugging:(NSString *)source;
+- (void)stopDebugging:(BOOL)resume;
+
+- (void)reload:(NSString *)source script:(NSString *)script;
@end
NS_ASSUME_NONNULL_END
diff --git a/doric-iOS/Devkit/Classes/DoricDev.m b/doric-iOS/Devkit/Classes/DoricDev.m
index f39d98ec..c06db301 100644
--- a/doric-iOS/Devkit/Classes/DoricDev.m
+++ b/doric-iOS/Devkit/Classes/DoricDev.m
@@ -20,20 +20,50 @@
// Created by jingpeng.wang on 2020/2/25.
//
#import
-#import
#import
-#import
+#import
#import "DoricDev.h"
-#import "DoricWSClient.h"
#import "DoricDebugDriver.h"
#import "DoricDevViewController.h"
#import "DoricDevMonitor.h"
+@interface DoricContextDebuggable : NSObject
+@property(nonatomic, weak) DoricContext *doricContext;
+@property(nonatomic, weak) id nativeDriver;
+@property(nonatomic, weak) DoricWSClient *wsClient;
+@end
+
+@implementation DoricContextDebuggable
+- (instancetype)initWithWSClient:(DoricWSClient *)client context:(DoricContext *)context {
+ if (self = [super init]) {
+ _wsClient = client;
+ _doricContext = context;
+ _nativeDriver = context.driver;
+ }
+ return self;
+}
+
+- (void)startDebug {
+ [self.doricContext setDriver:[[DoricDebugDriver alloc] initWithWSClient:self.wsClient]];
+ [self.doricContext reload:self.doricContext.script];
+}
+
+- (void)stopDebug:(BOOL)resume {
+ id driver = self.doricContext.driver;
+ if ([driver isKindOfClass:DoricDebugDriver.class]) {
+
+ }
+ if (resume) {
+ self.doricContext.driver = self.nativeDriver;
+ [self.doricContext reload:self.doricContext.script];
+ }
+}
+@end
+
+
@interface DoricDev ()
-@property(nonatomic, strong) DoricWSClient *wsclient;
-@property(nonatomic, strong) DoricContext *context;
-@property(nonatomic, strong) DoricDebugDriver *driver;
+@property(nonatomic, strong) DoricContextDebuggable *debuggable;
@end
@implementation DoricDev
@@ -43,10 +73,6 @@ - (instancetype)init {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOpenEvent) name:@"OpenEvent" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onEOFEvent) name:@"EOFEvent" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onConnectExceptionEvent) name:@"ConnectExceptionEvent" object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onStartDebugEvent:) name:@"StartDebugEvent" object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onEnterDebugEvent) name:@"EnterDebugEvent" object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onStopDebugEvent) name:@"StopDebugEvent" object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDebuggerReadyEvent) name:@"DebuggerReadyEvent" object:nil];
[DoricNativeDriver.instance.registry registerMonitor:[DoricDevMonitor new]];
}
return self;
@@ -75,25 +101,21 @@ - (void)openDevMode {
}
- (void)closeDevMode {
- if (self.wsclient) {
- [self.wsclient close];
- self.wsclient = nil;
+ if (self.wsClient) {
+ [self.wsClient close];
+ self.wsClient = nil;
}
}
- (BOOL)isInDevMode {
- return self.wsclient != nil;
+ return self.wsClient != nil;
}
- (void)connectDevKit:(NSString *)url {
- if (self.wsclient) {
- [self.wsclient close];
+ if (self.wsClient) {
+ [self.wsClient close];
}
- self.wsclient = [[DoricWSClient alloc] initWithUrl:url];
-}
-
-- (void)sendDevCommand:(NSString *)command {
- [self.wsclient send:command];
+ self.wsClient = [[DoricWSClient alloc] initWithUrl:url];
}
- (void)onOpenEvent {
@@ -108,34 +130,51 @@ - (void)onConnectExceptionEvent {
ShowToast(@"dev kit connection exception", DoricGravityBottom);
}
-- (void)onStartDebugEvent:(NSNotification *)notification {
- NSString *contextId = notification.object;
- ShowToast(contextId, DoricGravityBottom);
- for (DoricContext *context in [[DoricContextManager instance] aliveContexts]) {
- BOOL result = [context.contextId compare:contextId] == NSOrderedSame;
- if (result) {
- _context = context;
+- (DoricContext *)matchContext:(NSString *)source {
+ for (DoricContext *context in [DoricContextManager.instance aliveContexts]) {
+ if ([source containsString:context.source] || [context.source isEqualToString:@"__dev__"]) {
+ return context;
}
}
+ return nil;
+}
+
+- (void)reload:(NSString *)source script:(NSString *)script {
+ DoricContext *context = [self matchContext:source];
+ if (context) {
+ if ([context.driver isKindOfClass:DoricDebugDriver.class]) {
+ DoricLog(@"Context source %@ in debugging,skip reload", source);
+ } else {
+ DoricLog(@"Context reload :id %@,source %@", context.contextId, source);
+ [context reload:script];
+ }
+ } else {
+ DoricLog(@"Cannot find context source %@ for reload", source);
+ }
}
-- (void)onEnterDebugEvent {
- _driver = [DoricDebugDriver new];
-}
+- (void)startDebugging:(NSString *)source {
+ [self.debuggable stopDebug:YES];
+ DoricContext *context = [self matchContext:source];
+ if (context) {
+ [self.wsClient sendToDebugger:@"DEBUG_RES" payload:@{
+ @"contextId": context.contextId
+ }];
+ self.debuggable = [[DoricContextDebuggable alloc] initWithWSClient:self.wsClient context:context];
+ [self.debuggable startDebug];
+ } else {
+ DoricLog(@"Cannot find context source %@ for debugging", source);
+ [self.wsClient sendToDebugger:@"DEBUG_STOP" payload:@{
+ @"msg": @"Cannot find suitable alive context for debugging"
+ }];
+ }
+};
-- (void)onStopDebugEvent {
- _context.driver = [DoricNativeDriver instance];
- _context.rootNode.viewId = nil;
- [_context callEntity:DORIC_ENTITY_INIT, _context.extra, nil];
- [_context callEntity:DORIC_ENTITY_CREATE, nil];
- [_context callEntity:DORIC_ENTITY_BUILD withArgumentsArray:@[_context.initialParams]];
-}
-
-- (void)onDebuggerReadyEvent {
- _context.driver = _driver;
- _context.rootNode.viewId = nil;
- [_context callEntity:DORIC_ENTITY_INIT, _context.extra, nil];
- [_context callEntity:DORIC_ENTITY_CREATE, nil];
- [_context callEntity:DORIC_ENTITY_BUILD withArgumentsArray:@[_context.initialParams]];
+- (void)stopDebugging:(BOOL)resume {
+ [self.wsClient sendToDebugger:@"DEBUG_STOP" payload:@{
+ @"msg": @"Stop debugging"
+ }];
+ [self.debuggable stopDebug:resume];
+ self.debuggable = nil;
}
@end
diff --git a/doric-iOS/Devkit/Classes/DoricDevMonitor.h b/doric-iOS/Devkit/Classes/DoricDevMonitor.h
index 55c29233..7bde1b5a 100644
--- a/doric-iOS/Devkit/Classes/DoricDevMonitor.h
+++ b/doric-iOS/Devkit/Classes/DoricDevMonitor.h
@@ -1,3 +1,18 @@
+/*
+* Copyright [2019] [Doric.Pub]
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
//
// DoricDevMonitor.h
// DoricDevkit
diff --git a/doric-iOS/Devkit/Classes/DoricDevMonitor.m b/doric-iOS/Devkit/Classes/DoricDevMonitor.m
index a90ac42d..2b6b40eb 100644
--- a/doric-iOS/Devkit/Classes/DoricDevMonitor.m
+++ b/doric-iOS/Devkit/Classes/DoricDevMonitor.m
@@ -1,3 +1,18 @@
+/*
+* Copyright [2019] [Doric.Pub]
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
//
// DoricDevMonitor.m
// DoricDevkit
@@ -8,7 +23,6 @@
#import "DoricDevMonitor.h"
#import "DoricDev.h"
-#import "NSString+JsonString.h"
#import "Doric.h"
@implementation DoricDevMonitor
@@ -16,16 +30,11 @@ - (void)onException:(NSException *)exception inContext:(DoricContext *)context {
if (!DoricDev.instance.isInDevMode) {
return;
}
- NSDictionary *jsonDic = @{
- @"cmd": @"EXCEPTION",
- @"data": @{
- @"source": [context.source stringByReplacingOccurrencesOfString:@".js" withString:@".ts"],
- @"exception": exception.reason
- }
- };
-
- NSString *jsonStr = [NSString dc_convertToJsonWithDic:jsonDic];
- [[DoricDev instance] sendDevCommand:jsonStr];
+ [DoricDev.instance.wsClient sendToServer:@"EXCEPTION"
+ payload:@{
+ @"source": [context.source stringByReplacingOccurrencesOfString:@".js" withString:@".ts"],
+ @"exception": exception.reason
+ }];
}
- (void)onLog:(DoricLogType)type message:(NSString *)message {
@@ -33,23 +42,16 @@ - (void)onLog:(DoricLogType)type message:(NSString *)message {
return;
}
NSString *typeString = @"DEFAULT";
- if (type == DoricLogTypeDebug) {
- typeString = @"DEFAULT";
- } else if (type == DoricLogTypeWarning) {
+ if (type == DoricLogTypeWarning) {
typeString = @"WARN";
} else if (type == DoricLogTypeError) {
typeString = @"ERROR";
}
- NSDictionary *jsonDic = @{
- @"cmd": @"LOG",
- @"data": @{
- @"type": typeString,
- @"message": message
- }
- };
-
- NSString *jsonStr = [NSString dc_convertToJsonWithDic:jsonDic];
- [[DoricDev instance] sendDevCommand:jsonStr];
+ [DoricDev.instance.wsClient sendToServer:@"EXCEPTION"
+ payload:@{
+ @"type": typeString,
+ @"message": message
+ }];
}
@end
diff --git a/doric-iOS/Devkit/Classes/DoricDevViewController.m b/doric-iOS/Devkit/Classes/DoricDevViewController.m
index fe877fd1..6365cb83 100644
--- a/doric-iOS/Devkit/Classes/DoricDevViewController.m
+++ b/doric-iOS/Devkit/Classes/DoricDevViewController.m
@@ -25,7 +25,6 @@
#import "DoricDev.h"
#import "DoricDevViewController.h"
-#import "DoricJSRemoteExecutor.h"
#import "QRScanViewController.h"
@interface DoricDevViewController ()
@@ -51,7 +50,6 @@ - (void)viewDidLoad {
}
if (self.isSimulator) {
NSString *result = @"127.0.0.1";
- [DoricJSRemoteExecutor configIp:result];
[[DoricDev instance] connectDevKit:[NSString stringWithFormat:@"ws://%@:7777", result]];
ShowToast([NSString stringWithFormat:@"Connected to %@", result], DoricGravityBottom);
} else {
@@ -94,9 +92,6 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath
@"source": [context.source stringByReplacingOccurrencesOfString:@".js" withString:@".ts"]
}
};
-
- NSString *jsonStr = [NSString dc_convertToJsonWithDic:jsonDic];
- [[DoricDev instance] sendDevCommand:jsonStr];
}
@end
diff --git a/doric-iOS/Devkit/Classes/DoricJSRemoteExecutor.m b/doric-iOS/Devkit/Classes/DoricJSRemoteExecutor.m
deleted file mode 100644
index 6a40a872..00000000
--- a/doric-iOS/Devkit/Classes/DoricJSRemoteExecutor.m
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
-* Copyright [2019] [Doric.Pub]
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-//
-// DoricJSRemoteExecutor.m
-// Doric
-//
-// Created by 王劲鹏 on 2019/10/31.
-//
-#import "DoricJSRemoteExecutor.h"
-#import "SRWebSocket.h"
-#import "DoricUtil.h"
-#import "DoricJSRemoteArgType.h"
-#import "NSString+JsonString.h"
-
-static NSString *debuggerAddress = @"";
-
-typedef id (^Block0)(void);
-typedef id (^Block1)(id arg0);
-typedef id (^Block2)(id arg0, id arg1);
-typedef id (^Block3)(id arg0, id arg1, id arg2);
-typedef id (^Block4)(id arg0, id arg1, id arg2, id arg3);
-typedef id (^Block5)(id arg0, id arg1, id arg2, id arg3, id arg4);
-
-@interface DoricJSRemoteExecutor ()
-@property(nonatomic, strong) SRWebSocket *srWebSocket;
-@property(nonatomic, strong) NSMutableDictionary *blockMDic;
-@property(nonatomic, strong) JSValue *temp;
-@end
-
-@implementation DoricJSRemoteExecutor
-- (instancetype)init {
- if (self = [super init]) {
- [self srWebSocket];
- _semaphore = dispatch_semaphore_create(0);
- DC_LOCK(self.semaphore);
- }
- return self;
-}
-
-#pragma mark - SRWebSocketDelegate
-- (void)webSocketDidOpen:(SRWebSocket *)webSocket {
- DoricLog(@"debugger webSocketDidOpen");
- DC_UNLOCK(self.semaphore);
- [[NSNotificationCenter defaultCenter] postNotificationName:@"DebuggerReadyEvent" object:nil];
-}
-
-- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload {
- DoricLog(@"debugger webSocketdidReceivePong");
-}
-
-- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {
- NSData *jsonData = [message dataUsingEncoding:NSUTF8StringEncoding];
- NSError *err;
- NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
- options:NSJSONReadingMutableContainers
- error:&err];
- if (err) {
- DoricLog(@"debugger webSocketdidReceiveMessage parse error:%@", err);
- return;
- }
- NSString *cmd = [[dic valueForKey:@"cmd"] copy];
-
- if ([cmd isEqualToString:@"injectGlobalJSFunction"]) {
- NSString *name = [dic valueForKey:@"name"];
- NSArray *argsArr = [dic valueForKey:@"arguments"];
- NSMutableArray *argsMarr = [NSMutableArray new];
- for (NSUInteger i = 0; i < argsArr.count; i++) {
- [argsMarr addObject:argsArr[i]];
- }
-
- id result;
- id tmpBlk = self.blockMDic[name];
- if (argsArr.count == 0) {
- result = ((Block0) tmpBlk)();
- } else if (argsArr.count == 1) {
- result = ((Block1) tmpBlk)(argsArr[0]);
- } else if (argsArr.count == 2) {
- result = ((Block2)tmpBlk)(argsArr[0], argsArr[1]);
- } else if (argsArr.count == 3) {
- result = ((Block3)tmpBlk)(argsArr[0], argsArr[1], argsArr[2]);
- } else if (argsArr.count == 4) {
- result = ((Block4)tmpBlk)(argsArr[0], argsArr[1], argsArr[2], argsArr[3]);
- } else if (argsArr.count == 5) {
- result = ((Block5)tmpBlk)(argsArr[0], argsArr[1], argsArr[2], argsArr[3], argsArr[4]);
- }else {
- DoricLog(@"error:args to more than 5. args:%@",argsArr);
- }
-
- } else if ([cmd isEqualToString:@"invokeMethod"]) {
- @try {
- self.temp = [JSValue valueWithObject:[dic valueForKey:@"result"] inContext:nil];
- } @catch (NSException *exception) {
- DoricLog(@"debugger ", NSStringFromSelector(_cmd), exception.reason);
- } @finally {
- DC_UNLOCK(self.semaphore);
- }
- }
-}
-
-- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error {
- DoricLog(@"debugger webSocketdidFailWithError");
- DC_UNLOCK(self.semaphore);
-}
-
-- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean {
- DoricLog(@"debugger webSocketdidCloseWithCode");
- [[NSNotificationCenter defaultCenter] postNotificationName:@"StopDebugEvent" object:nil];
-}
-
-#pragma mark - DoricJSExecutorProtocol
-- (NSString *)loadJSScript:(NSString *)script source:(NSString *)source {
-
- return nil;
-}
-
-- (void)injectGlobalJSObject:(NSString *)name obj:(id)obj {
- if ([obj isKindOfClass:NSClassFromString(@"NSBlock")]) {
- self.blockMDic[name] = obj;
- }
- NSDictionary *jsonDic = @{
- @"cmd": @"injectGlobalJSFunction",
- @"name": name
- };
-
- NSString *jsonStr = [NSString dc_convertToJsonWithDic:jsonDic];
- if (!jsonStr) {
- return;
- }
-
- [self.srWebSocket send:jsonStr];
-}
-
-- (JSValue *)invokeObject:(NSString *)objName method:(NSString *)funcName args:(NSArray *)args {
-
- NSMutableArray *argsMArr = [NSMutableArray new];
- for (id arg in args) {
- NSDictionary *dic = [self dicForArg:arg];
- [argsMArr addObject:dic];
- }
-
- NSArray *argsArr = [argsMArr copy];
-
- NSDictionary *jsonDic = @{
- @"cmd": @"invokeMethod",
- @"objectName": objName,
- @"functionName": funcName,
- @"values": argsArr
- };
-
- NSString *jsonStr = [NSString dc_convertToJsonWithDic:jsonDic];
- if (!jsonStr) {
- return nil;
- }
-
- [self.srWebSocket send:jsonStr];
- DC_LOCK(self.semaphore);
-
- return self.temp;
-}
-
-- (NSDictionary *)dicForArg:(id)arg {
- DoricJSRemoteArgType type = DoricargTypeWithArg(arg);
- if (type == DoricJSRemoteArgTypeObject || type == DoricJSRemoteArgTypeArray) {
- NSString *jsonStr = [NSString dc_convertToJsonWithDic:(NSDictionary *)arg];
- arg = jsonStr;
- }
- NSDictionary *dic = @{
- @"type": @(type),
- @"value": arg
- };
- return dic;
-}
-
-+ (void)configIp:(NSString *)ip {
- debuggerAddress = [[@"ws://" stringByAppendingString:ip] stringByAppendingString:@":2080"];
-}
-
-- (void)close {
- [self.srWebSocket close];
-}
-
-#pragma mark - Properties
-- (SRWebSocket *)srWebSocket {
- if (!_srWebSocket) {
- NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:debuggerAddress] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];
- _srWebSocket = [[SRWebSocket alloc] initWithURLRequest:request];
- _srWebSocket.delegate = self;
- [_srWebSocket open];
- }
- return _srWebSocket;
-}
-
-- (NSMutableDictionary *)blockMDic {
- if (!_blockMDic) {
- _blockMDic = [NSMutableDictionary new];
- }
- return _blockMDic;
-}
-
-@end
diff --git a/doric-iOS/Devkit/Classes/DoricJSRemoteExecutor.h b/doric-iOS/Devkit/Classes/DoricRemoteJSExecutor.h
similarity index 74%
rename from doric-iOS/Devkit/Classes/DoricJSRemoteExecutor.h
rename to doric-iOS/Devkit/Classes/DoricRemoteJSExecutor.h
index f186e7cb..c9a49eab 100644
--- a/doric-iOS/Devkit/Classes/DoricJSRemoteExecutor.h
+++ b/doric-iOS/Devkit/Classes/DoricRemoteJSExecutor.h
@@ -14,24 +14,20 @@
* limitations under the License.
*/
//
-// DoricJSRemoteExecutor.h
-// Pods
+// DoricRemoteJSExecutor.h
+// DoricDevkit
//
-// Created by 王劲鹏 on 2019/10/31.
+// Created by pengfei.zhou on 2021/2/22.
//
#import
#import
+#import "DoricWSClient.h"
NS_ASSUME_NONNULL_BEGIN
-@interface DoricJSRemoteExecutor : NSObject
-
-@property(nonatomic, strong) dispatch_semaphore_t semaphore;
-
-+ (void)configIp:(NSString *)ip;
-
-- (void)close;
+@interface DoricRemoteJSExecutor : NSObject
+- (instancetype)initWithWSClient:(DoricWSClient *)wsClient;
@end
NS_ASSUME_NONNULL_END
diff --git a/doric-iOS/Devkit/Classes/DoricRemoteJSExecutor.m b/doric-iOS/Devkit/Classes/DoricRemoteJSExecutor.m
new file mode 100644
index 00000000..611a1212
--- /dev/null
+++ b/doric-iOS/Devkit/Classes/DoricRemoteJSExecutor.m
@@ -0,0 +1,194 @@
+/*
+* Copyright [2019] [Doric.Pub]
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+//
+// DoricRemoteJSExecutor.m
+// DoricDevkit
+//
+// Created by pengfei.zhou on 2021/2/22.
+//
+
+#import "DoricRemoteJSExecutor.h"
+#import "NSString+JsonString.h"
+#import
+
+typedef NS_ENUM(NSUInteger, DoricJSRemoteArgType) {
+ DoricJSRemoteArgTypeNil = 0,
+ DoricJSRemoteArgTypeNumber,
+ DoricJSRemoteArgTypeBool,
+ DoricJSRemoteArgTypeString,
+ DoricJSRemoteArgTypeObject,
+ DoricJSRemoteArgTypeArray,
+};
+
+
+typedef id (^Block0)(void);
+
+typedef id (^Block1)(id arg0);
+
+typedef id (^Block2)(id arg0, id arg1);
+
+typedef id (^Block3)(id arg0, id arg1, id arg2);
+
+typedef id (^Block4)(id arg0, id arg1, id arg2, id arg3);
+
+typedef id (^Block5)(id arg0, id arg1, id arg2, id arg3, id arg4);
+
+@interface DoricRemoteJSExecutor ()
+@property(nonatomic, weak) DoricWSClient *wsClient;
+@property(nonatomic, strong) NSMutableDictionary *blockMDic;
+@property(nonatomic, strong) JSValue *temp;
+@property(nonatomic, strong) dispatch_semaphore_t semaphore;
+@end
+
+@implementation DoricRemoteJSExecutor
+- (instancetype)initWithWSClient:(DoricWSClient *)wsClient {
+ if (self = [super init]) {
+ _wsClient = wsClient;
+ [_wsClient addInterceptor:self];
+ _blockMDic = [NSMutableDictionary new];
+ _semaphore = dispatch_semaphore_create(0);
+ }
+ return self;
+}
+
+- (NSString *)loadJSScript:(NSString *)script source:(NSString *)source {
+ return nil;
+}
+
+- (void)injectGlobalJSObject:(NSString *)name obj:(id)obj {
+ if ([obj isKindOfClass:NSClassFromString(@"NSBlock")]) {
+ self.blockMDic[name] = obj;
+ [self.wsClient sendToDebugger:@"injectGlobalJSFunction" payload:@{
+ @"name": name,
+ }];
+ } else if ([obj isKindOfClass:NSNumber.class]) {
+ [self.wsClient sendToDebugger:@"injectGlobalJSObject" payload:@{
+ @"name": name,
+ @"type": @(DoricJSRemoteArgTypeNumber),
+ @"value": obj,
+ }];
+ } else if ([obj isKindOfClass:NSString.class]) {
+ [self.wsClient sendToDebugger:@"injectGlobalJSObject" payload:@{
+ @"name": name,
+ @"type": @(DoricJSRemoteArgTypeString),
+ @"value": obj,
+ }];
+ } else if ([obj isKindOfClass:NSObject.class]) {
+ [self.wsClient sendToDebugger:@"injectGlobalJSObject" payload:@{
+ @"name": name,
+ @"type": @(DoricJSRemoteArgTypeObject),
+ @"value": obj,
+ }];
+ } else if ([obj isKindOfClass:NSArray.class]) {
+ [self.wsClient sendToDebugger:@"injectGlobalJSObject" payload:@{
+ @"name": name,
+ @"type": @(DoricJSRemoteArgTypeArray),
+ @"value": obj,
+ }];
+ } else if (obj == nil) {
+ [self.wsClient sendToDebugger:@"injectGlobalJSObject" payload:@{
+ @"name": name,
+ @"type": @(DoricJSRemoteArgTypeNil),
+ }];
+ }
+}
+
+- (JSValue *)invokeObject:(NSString *)objName method:(NSString *)funcName args:(NSArray *)args {
+
+ NSMutableArray *argsMArr = [NSMutableArray new];
+
+ for (id arg in args) {
+ NSDictionary *dic = [self dicForArg:arg];
+ [argsMArr addObject:dic];
+ }
+
+ [self.wsClient sendToDebugger:@"invokeMethod" payload:@{
+ @"cmd": @"invokeMethod",
+ @"objectName": objName,
+ @"functionName": funcName,
+ @"values": [argsMArr copy]
+ }];
+
+ DC_LOCK(self.semaphore);
+
+ return self.temp;
+}
+
+- (NSDictionary *)dicForArg:(id)arg {
+ DoricJSRemoteArgType type = [self argType:arg];
+ if (type == DoricJSRemoteArgTypeObject || type == DoricJSRemoteArgTypeArray) {
+ NSString *jsonStr = [NSString dc_convertToJsonWithDic:arg];
+ arg = jsonStr;
+ }
+ NSDictionary *dic = @{
+ @"type": @(type),
+ @"value": arg
+ };
+ return dic;
+}
+
+- (DoricJSRemoteArgType)argType:(id)arg {
+ DoricJSRemoteArgType type = DoricJSRemoteArgTypeNil;
+ if ([arg isKindOfClass:[NSNumber class]]) {
+ type = DoricJSRemoteArgTypeNumber;
+ } else if ([arg isKindOfClass:[NSString class]]) {
+ type = DoricJSRemoteArgTypeString;
+ } else if ([arg isKindOfClass:[NSDictionary class]]) {
+ type = DoricJSRemoteArgTypeObject;
+ } else if ([arg isKindOfClass:[NSMutableArray class]]) {
+ type = DoricJSRemoteArgTypeArray;
+ }
+ return type;
+}
+
+- (BOOL)interceptType:(NSString *)type command:(NSString *)cmd payload:(NSDictionary *)payload {
+ if ([type isEqualToString:@"D2C"]) {
+ if ([cmd isEqualToString:@"injectGlobalJSFunction"]) {
+ NSString *name = payload[@"name"];
+ NSArray *argsArr = payload[@"arguments"];
+ id tmpBlk = self.blockMDic[name];
+ id result;
+ if (argsArr.count == 0) {
+ result = ((Block0) tmpBlk)();
+ } else if (argsArr.count == 1) {
+ result = ((Block1) tmpBlk)(argsArr[0]);
+ } else if (argsArr.count == 2) {
+ result = ((Block2) tmpBlk)(argsArr[0], argsArr[1]);
+ } else if (argsArr.count == 3) {
+ result = ((Block3) tmpBlk)(argsArr[0], argsArr[1], argsArr[2]);
+ } else if (argsArr.count == 4) {
+ result = ((Block4) tmpBlk)(argsArr[0], argsArr[1], argsArr[2], argsArr[3]);
+ } else if (argsArr.count == 5) {
+ result = ((Block5) tmpBlk)(argsArr[0], argsArr[1], argsArr[2], argsArr[3], argsArr[4]);
+ } else {
+ DoricLog(@"error:args to more than 5. args:%@", argsArr);
+ result = nil;
+ }
+ } else if ([cmd isEqualToString:@"invokeMethod"]) {
+ @try {
+ self.temp = [JSValue valueWithObject:payload[@"result"] inContext:nil];
+ } @catch (NSException *exception) {
+ DoricLog(@"debugger ", NSStringFromSelector(_cmd), exception.reason);
+ } @finally {
+ DC_UNLOCK(self.semaphore);
+ }
+ }
+ }
+ return NO;
+}
+
+
+@end
diff --git a/doric-iOS/Devkit/Classes/DoricWSClient.h b/doric-iOS/Devkit/Classes/DoricWSClient.h
index 63626027..2f0d61dd 100644
--- a/doric-iOS/Devkit/Classes/DoricWSClient.h
+++ b/doric-iOS/Devkit/Classes/DoricWSClient.h
@@ -24,12 +24,22 @@
NS_ASSUME_NONNULL_BEGIN
+@protocol DoricWSClientInterceptor
+- (BOOL)interceptType:(NSString *)type command:(NSString *)cmd payload:(NSDictionary *)payload;
+@end
+
@interface DoricWSClient : NSObject
- (instancetype)initWithUrl:(NSString *)url;
-- (void)send:(NSString *)command;
-
- (void)close;
+
+- (void)addInterceptor:(id )interceptor;
+
+- (void)removeInterceptor:(id )interceptor;
+
+- (void)sendToDebugger:(NSString *)cmd payload:(NSDictionary *)payload;
+
+- (void)sendToServer:(NSString *)cmd payload:(NSDictionary *)payload;
@end
NS_ASSUME_NONNULL_END
diff --git a/doric-iOS/Devkit/Classes/DoricWSClient.m b/doric-iOS/Devkit/Classes/DoricWSClient.m
index 47702d1b..42d9a8c0 100644
--- a/doric-iOS/Devkit/Classes/DoricWSClient.m
+++ b/doric-iOS/Devkit/Classes/DoricWSClient.m
@@ -22,16 +22,20 @@
#import "DoricWSClient.h"
#import "SRWebSocket.h"
-#import "DoricUtil.h"
-#import "DoricContextManager.h"
+#import
+#import
+#import
+#import "DoricDev.h"
@interface DoricWSClient ()
@property(nonatomic, strong) SRWebSocket *websocket;
+@property(nonatomic, strong) NSHashTable > *interceptors;
@end
@implementation DoricWSClient
- (instancetype)initWithUrl:(NSString *)url {
if (self = [super init]) {
+ _interceptors = [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory];
_websocket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:url]];
_websocket.delegate = self;
[_websocket open];
@@ -58,7 +62,27 @@ - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {
DoricLog(@"webSocketdidReceiveMessage parse error:%@", err);
return;
}
- NSString *cmd = [[dic valueForKey:@"cmd"] mutableCopy];
+
+ NSString *type = dic[@"type"];
+ NSString *cmd = dic[@"cmd"];
+ NSDictionary *payload = dic[@"payload"];
+ for (id interceptor in self.interceptors) {
+ if ([interceptor interceptType:type command:cmd payload:payload]) {
+ return;
+ }
+ }
+
+ if ([cmd isEqualToString:@"DEBUG_REQ"]) {
+ NSString *source = payload[@"source"];
+ [DoricDev.instance startDebugging:source];
+ } else if ([cmd isEqualToString:@"DEBUG_STOP"]) {
+ [DoricDev.instance stopDebugging:YES];
+ } else if ([cmd isEqualToString:@"RELOAD"]) {
+ NSString *source = payload[@"source"];
+ NSString *script = payload[@"script"];
+ [DoricDev.instance reload:source script:script];
+ }
+
if ([cmd compare:@"SWITCH_TO_DEBUG"] == NSOrderedSame) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"EnterDebugEvent" object:nil];
} else if ([cmd compare:@"RELOAD"] == NSOrderedSame) {
@@ -82,8 +106,33 @@ - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reas
[[NSNotificationCenter defaultCenter] postNotificationName:@"EOFEvent" object:nil];
}
-- (void)send:(NSString *)command {
- [_websocket send:command];
+- (void)send:(NSDictionary *)command {
+ NSString *jsonStr = [NSString dc_convertToJsonWithDic:command];
+ [_websocket send:jsonStr];
+}
+
+- (void)addInterceptor:(id )interceptor {
+ [self.interceptors addObject:interceptor];
+}
+
+- (void)removeInterceptor:(id )interceptor {
+ [self.interceptors removeObject:interceptor];
+}
+
+- (void)sendToDebugger:(NSString *)cmd payload:(NSDictionary *)payload {
+ [self send:@{
+ @"type": @"C2D",
+ @"cmd": cmd,
+ @"payload": payload,
+ }];
+}
+
+- (void)sendToServer:(NSString *)cmd payload:(NSDictionary *)payload {
+ [self send:@{
+ @"type": @"C2S",
+ @"cmd": cmd,
+ @"payload": payload,
+ }];
}
- (void)close {
diff --git a/doric-iOS/Devkit/Classes/QRScanViewController.m b/doric-iOS/Devkit/Classes/QRScanViewController.m
index 0e7cb496..b897f5ac 100644
--- a/doric-iOS/Devkit/Classes/QRScanViewController.m
+++ b/doric-iOS/Devkit/Classes/QRScanViewController.m
@@ -24,7 +24,6 @@
#import
#import
#import
-#import "DoricJSRemoteExecutor.h"
@interface QRScanViewController ()
@property(strong, nonatomic) AVCaptureDevice *device;
@@ -105,7 +104,6 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:
NSString *result = qrObject.stringValue;
NSLog(@"Scan result is %@", result);
[[DoricDev instance] connectDevKit:[NSString stringWithFormat:@"ws://%@:7777", result]];
- [DoricJSRemoteExecutor configIp:result];
ShowToast([NSString stringWithFormat:@"Connected to %@", result], DoricGravityBottom);
[self.navigationController popViewControllerAnimated:NO];
}
diff --git a/doric-iOS/Pod/Classes/Engine/DoricJSEngine.h b/doric-iOS/Pod/Classes/Engine/DoricJSEngine.h
index 32bd1de3..c73d2956 100644
--- a/doric-iOS/Pod/Classes/Engine/DoricJSEngine.h
+++ b/doric-iOS/Pod/Classes/Engine/DoricJSEngine.h
@@ -46,6 +46,8 @@ NS_ASSUME_NONNULL_BEGIN
- (JSValue *)invokeDoricMethod:(NSString *)method argumentsArray:(NSArray *)args;
- (void)ensureRunOnJSThread:(dispatch_block_t)block;
+
+- (void)initJSEngine;
@end
NS_ASSUME_NONNULL_END
diff --git a/doric-iOS/Pod/Classes/Engine/DoricJSEngine.m b/doric-iOS/Pod/Classes/Engine/DoricJSEngine.m
index 18a513ca..774d6f3a 100644
--- a/doric-iOS/Pod/Classes/Engine/DoricJSEngine.m
+++ b/doric-iOS/Pod/Classes/Engine/DoricJSEngine.m
@@ -96,6 +96,7 @@ - (instancetype)init {
[self initJSExecutor];
[self initDoricEnvironment];
}];
+ [self.registry registerMonitor:[DoricDefaultMonitor new]];
}
return self;
}
@@ -126,7 +127,6 @@ - (void)threadRun {
}
- (void)initJSEngine {
- [self.registry registerMonitor:[DoricDefaultMonitor new]];
self.jsExecutor = [DoricJSCoreExecutor new];
}
diff --git a/doric-iOS/Pod/Classes/Util/Category/NSString+JsonString.h b/doric-iOS/Pod/Classes/Util/Category/NSString+JsonString.h
index 9581e9a3..c7034458 100644
--- a/doric-iOS/Pod/Classes/Util/Category/NSString+JsonString.h
+++ b/doric-iOS/Pod/Classes/Util/Category/NSString+JsonString.h
@@ -12,7 +12,7 @@
NS_ASSUME_NONNULL_BEGIN
@interface NSString (JsonString)
-+ (NSString *)dc_convertToJsonWithDic:(NSDictionary *)dic;
++ (NSString *)dc_convertToJsonWithDic:(id)obj;
@end
NS_ASSUME_NONNULL_END
diff --git a/doric-iOS/Pod/Classes/Util/Category/NSString+JsonString.m b/doric-iOS/Pod/Classes/Util/Category/NSString+JsonString.m
index bcdd6437..9304bc17 100644
--- a/doric-iOS/Pod/Classes/Util/Category/NSString+JsonString.m
+++ b/doric-iOS/Pod/Classes/Util/Category/NSString+JsonString.m
@@ -9,11 +9,11 @@
#import "DoricUtil.h"
@implementation NSString (JsonString)
-+ (NSString *)dc_convertToJsonWithDic:(NSDictionary *)dic {
++ (NSString *)dc_convertToJsonWithDic:(id)obj {
NSError *err;
- NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&err];
+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject:obj options:NSJSONWritingPrettyPrinted error:&err];
NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
-
+
if (err) {
DoricLog(NSStringFromSelector(_cmd), @"Convert dictionary to json string failed.");
return nil;
diff --git a/doric-iOS/Pod/Classes/Util/DoricJSRemoteArgType.h b/doric-iOS/Pod/Classes/Util/DoricJSRemoteArgType.h
deleted file mode 100644
index c156a740..00000000
--- a/doric-iOS/Pod/Classes/Util/DoricJSRemoteArgType.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// DoricJSRemoteArgType.h
-// Doric
-//
-// Created by Insomnia on 2019/11/7.
-//
-
-#import
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NS_ENUM(NSUInteger, DoricJSRemoteArgType) {
- DoricJSRemoteArgTypeNil = 0,
- DoricJSRemoteArgTypeNumber,
- DoricJSRemoteArgTypeBool,
- DoricJSRemoteArgTypeString,
- DoricJSRemoteArgTypeObject,
- DoricJSRemoteArgTypeArray,
-};
-
-DoricJSRemoteArgType DoricargTypeWithArg(id arg);
-
-
-NS_ASSUME_NONNULL_END
diff --git a/doric-iOS/Pod/Classes/Util/DoricJSRemoteArgType.m b/doric-iOS/Pod/Classes/Util/DoricJSRemoteArgType.m
deleted file mode 100644
index a056199a..00000000
--- a/doric-iOS/Pod/Classes/Util/DoricJSRemoteArgType.m
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// DoricJSRemoteArgType.m
-// Doric
-//
-// Created by Insomnia on 2019/11/7.
-//
-
-#import "DoricJSRemoteArgType.h"
-DoricJSRemoteArgType DoricargTypeWithArg(id arg) {
- DoricJSRemoteArgType type = DoricJSRemoteArgTypeNil;
- if ([arg isKindOfClass:[NSNumber class]]) {
- type = DoricJSRemoteArgTypeNumber;
- }else if ([arg isKindOfClass:[NSString class]]) {
- type = DoricJSRemoteArgTypeString;
- }else if ([arg isKindOfClass:[NSDictionary class]]) {
- type = DoricJSRemoteArgTypeObject;
- }else if ([arg isKindOfClass:[NSMutableArray class]]) {
- type = DoricJSRemoteArgTypeArray;
- }
- return type;
-}