Add: NodeJs Support
This commit is contained in:
@@ -6,6 +6,9 @@
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
|
||||
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||
|
||||
<application
|
||||
|
||||
46
app/src/main/assets/nodejs_engine_init.js
Normal file
46
app/src/main/assets/nodejs_engine_init.js
Normal file
@@ -0,0 +1,46 @@
|
||||
var __requireOld__ = require;
|
||||
var __nodejs_modules__ = {
|
||||
'websocket' : com.iwebpp.wspp.WebSocket,
|
||||
'websocketserver': com.iwebpp.wspp.WebSocketServer,
|
||||
'net': com.iwebpp.node.net.TCP,
|
||||
'tcp': com.iwebpp.node.net.TCP,
|
||||
'udt': com.iwebpp.node.net.UDT,
|
||||
'readable': com.iwebpp.node.stream.Readable2,
|
||||
'writable': com.iwebpp.node.stream.Writable2,
|
||||
'duplex': com.iwebpp.node.stream.Duplex,
|
||||
'transform': com.iwebpp.node.stream.Transform,
|
||||
'passthrough': com.iwebpp.node.stream.PassThrough,
|
||||
'dns': com.iwebpp.node.Dns,
|
||||
'url': com.iwebpp.node.Url,
|
||||
}
|
||||
|
||||
var require = function(module){
|
||||
if (module === 'http'){
|
||||
return {
|
||||
get: function(url, listener){
|
||||
return com.iwebpp.node.http.http.get(NodeCurrentContext, url, listener);
|
||||
},
|
||||
request: function(url, listener) {
|
||||
return com.iwebpp.node.http.http.request(NodeCurrentContext, url, listener);
|
||||
},
|
||||
createServer: function(listener) {
|
||||
return com.iwebpp.node.http.http.createServer(NodeCurrentContext, listener);
|
||||
},
|
||||
};
|
||||
}
|
||||
if (module === 'httpp'){
|
||||
return {
|
||||
get: function(url, listener){
|
||||
return com.iwebpp.node.http.httpp.get(NodeCurrentContext, url, listener);
|
||||
},
|
||||
request: function(url, listener) {
|
||||
return com.iwebpp.node.http.httpp.request(NodeCurrentContext, url, listener);
|
||||
},
|
||||
createServer: function(listener) {
|
||||
return com.iwebpp.node.http.httpp.createServer(NodeCurrentContext, listener);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
return __requireOld__(module);
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = function() {
|
||||
java.lang.System.out.println('The CommonJS require function works!')
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import com.stardust.automator.AccessibilityEventCommandHost;
|
||||
import com.stardust.scriptdroid.accessibility.AccessibilityInfoProvider;
|
||||
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
|
||||
import com.stardust.scriptdroid.droid.script.JavaScriptEngine;
|
||||
import com.stardust.scriptdroid.droid.script.NodeJsJavaScriptEngine;
|
||||
import com.stardust.scriptdroid.droid.script.RhinoJavaScriptEngine;
|
||||
import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
|
||||
import com.stardust.scriptdroid.droid.script.file.SharedPrefScriptFileList;
|
||||
@@ -71,7 +72,7 @@ public class App extends Application {
|
||||
|
||||
private void configApp() {
|
||||
ScriptFileList.setImpl(SharedPrefScriptFileList.getInstance());
|
||||
JavaScriptEngine.setDefault(new RhinoJavaScriptEngine(DroidRuntime.getRuntime()));
|
||||
JavaScriptEngine.setDefault(new NodeJsJavaScriptEngine(DroidRuntime.getRuntime()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
package com.stardust.scriptdroid.droid.script;
|
||||
|
||||
import com.iwebpp.node.Dns;
|
||||
import com.iwebpp.node.NodeContext;
|
||||
import com.iwebpp.node.Url;
|
||||
import com.iwebpp.node.http.http;
|
||||
import com.iwebpp.node.js.rhino.Host;
|
||||
import com.iwebpp.node.stream.Duplex;
|
||||
import com.iwebpp.node.stream.PassThrough;
|
||||
import com.iwebpp.node.stream.Readable2;
|
||||
import com.iwebpp.node.stream.Transform;
|
||||
import com.iwebpp.node.stream.Writable2;
|
||||
import com.iwebpp.nodeandroid.MainActivity;
|
||||
import com.iwebpp.nodeandroid.Toaster;
|
||||
import com.iwebpp.wspp.WebSocketServer;
|
||||
import com.stardust.scriptdroid.App;
|
||||
import com.stardust.scriptdroid.droid.Droid;
|
||||
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
|
||||
import com.stardust.scriptdroid.tool.FileUtils;
|
||||
|
||||
import org.mozilla.javascript.Context;
|
||||
import org.mozilla.javascript.Scriptable;
|
||||
import org.mozilla.javascript.ScriptableObject;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/3/25.
|
||||
*/
|
||||
|
||||
public class NodeJsJavaScriptEngine extends RhinoJavaScriptEngine {
|
||||
|
||||
public NodeJsJavaScriptEngine(DroidRuntime runtime) {
|
||||
super(runtime);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Object execute(String script) {
|
||||
NodeContext nodectx = new NodeContext();
|
||||
Context context = createContext();
|
||||
Scriptable scope = createScope(context);
|
||||
ScriptableObject.putProperty(scope, "NodeCurrentContext", Context.javaToJS(nodectx, scope));
|
||||
init(context, scope);
|
||||
Object result = context.evaluateString(scope, script, "<script>", 1, null);
|
||||
try {
|
||||
nodectx.execute();
|
||||
} catch (Throwable throwable) {
|
||||
throw new RuntimeException(throwable);
|
||||
}
|
||||
if (!script.startsWith(Droid.UI) && !script.startsWith(Droid.STAY))
|
||||
removeAndDestroy();
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init(Context context, Scriptable scope) {
|
||||
super.init(context, scope);
|
||||
try {
|
||||
context.evaluateString(scope, FileUtils.readString(App.getApp().getAssets().open("nodejs_engine_init.js")), "<nodejs_init>", 1, null);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void putProperties(Context context, Scriptable scope) {
|
||||
super.putProperties(context, scope);
|
||||
ScriptableObject.putProperty(scope, "NodeHostEnv", Context.javaToJS(this, scope));
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,9 @@ package com.stardust.scriptdroid.droid.script;
|
||||
|
||||
import android.net.Uri;
|
||||
|
||||
import com.iwebpp.node.NodeContext;
|
||||
import com.iwebpp.node.js.rhino.Host;
|
||||
import com.iwebpp.nodeandroid.Toaster;
|
||||
import com.stardust.scriptdroid.droid.Droid;
|
||||
import com.stardust.scriptdroid.App;
|
||||
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
|
||||
@@ -55,13 +58,13 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine {
|
||||
return result;
|
||||
}
|
||||
|
||||
private Scriptable createScope(Context context) {
|
||||
protected Scriptable createScope(Context context) {
|
||||
ImporterTopLevel importerTopLevel = new ImporterTopLevel();
|
||||
importerTopLevel.initStandardObjects(context, false);
|
||||
return importerTopLevel;
|
||||
}
|
||||
|
||||
private Context createContext() {
|
||||
protected Context createContext() {
|
||||
Context context = Context.enter();
|
||||
context.setOptimizationLevel(-1);
|
||||
context.setLanguageVersion(Context.VERSION_1_7);
|
||||
@@ -69,18 +72,22 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine {
|
||||
return context;
|
||||
}
|
||||
|
||||
private void init(Context context, Scriptable scope) {
|
||||
protected void init(Context context, Scriptable scope) {
|
||||
putProperties(context, scope);
|
||||
initRequireBuilder(context, scope);
|
||||
context.evaluateString(scope, Init.getInitScript(), "<init>", 1, null);
|
||||
mThreads.add(Thread.currentThread());
|
||||
}
|
||||
|
||||
protected void putProperties(Context context, Scriptable scope) {
|
||||
ScriptableObject.putProperty(scope, "context", App.getApp());
|
||||
ScriptableObject.putProperty(scope, "__engine__", "rhino");
|
||||
for (Map.Entry<String, Object> variable : mVariableMap.entrySet()) {
|
||||
ScriptableObject.putProperty(scope, variable.getKey(), variable.getValue());
|
||||
}
|
||||
initRequireBuilder(context, scope);
|
||||
context.evaluateString(scope, Init.getInitScript(), "<init>", 1, null);
|
||||
mThreads.add(Thread.currentThread());
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void initRequireBuilder(Context context, Scriptable scope) {
|
||||
List<URI> paths = Collections.singletonList(new File(ScriptFile.DEFAULT_FOLDER).toURI());
|
||||
new RequireBuilder()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user