public JsDynamicWrapper(JsBridge bridge, object target) : base(bridge) { this.target = target; var handle = Type.GetTypeHandle(this.target); this.targetType = Type.GetTypeFromHandle(handle); }
public TypeInspector(JsBridge bridge, object target) { this.bridge = bridge; this.targetType = target.GetType(); //if (target is JsDynamic) { // CollectDynamicMembers((JsDynamic)target); //} //else { CollectMembers(); //} }
private void button6_Click(object sender, EventArgs e) { #if DEBUG JsBridge.dbugTestCallbacks(); #endif using (JsEngine engine = new JsEngine()) using (JsContext ctx = engine.CreateContext(new MyJsTypeDefinitionBuilder())) { GC.Collect(); System.Diagnostics.Stopwatch stwatch = new System.Diagnostics.Stopwatch(); stwatch.Reset(); stwatch.Start(); var ab = new AboutMe(); ctx.SetVariableAutoWrap("x", ab); //string testsrc = "x.IsOK;"; string testsrc = "x.Test2('AAA');"; object result = ctx.Execute(testsrc); stwatch.Stop(); Console.WriteLine("met1 template:" + stwatch.ElapsedMilliseconds.ToString()); } }
static void Main() { //----------------------------------- //1. //after we build nodejs in dll version //we will get node.dll //then just copy it to another name 'libespr' string currentdir = System.IO.Directory.GetCurrentDirectory(); string libEspr = @"../../../node-v8.1.4/Release/libespr.dll"; if (File.Exists(libEspr)) { //delete the old one File.Delete(libEspr); } File.Copy( @"../../../node-v8.1.4/Release/node.dll", //from libEspr); //----------------------------------- //2. load libespr.dll (node.dll) IntPtr intptr = LoadLibrary(libEspr); int errCode = GetLastError(); int libesprVer = JsBridge.LibVersion; //change working dir to target app and run //test with socket.io's chat sample System.IO.Directory.SetCurrentDirectory(@"../../../socket.io/examples/chat"); #if DEBUG JsBridge.dbugTestCallbacks(); #endif //------------ JsEngine.RunJsEngine((IntPtr nativeEngine, IntPtr nativeContext) => { JsEngine eng = new JsEngine(nativeEngine); JsContext ctx = eng.CreateContext(nativeContext); //------------- //this LibEspressoClass object is need, //so node can talk with us, //------------- JsTypeDefinition jstypedef = new JsTypeDefinition("LibEspressoClass"); jstypedef.AddMember(new JsMethodDefinition("LoadMainSrcFile", args => { //since this is sample socket io app string filedata = File.ReadAllText("index.js"); args.SetResult(filedata); })); jstypedef.AddMember(new JsMethodDefinition("C", args => { args.SetResult(true); })); jstypedef.AddMember(new JsMethodDefinition("E", args => { args.SetResult(true); })); if (!jstypedef.IsRegisterd) { ctx.RegisterTypeDefinition(jstypedef); } //---------- //then register this as x*** //this object is just an instance for reference ctx.SetVariableFromAny("LibEspresso", ctx.CreateWrapper(new object(), jstypedef)); }); string userInput = Console.ReadLine(); }
protected JsWrapperBase(JsBridge bridge) { this.bridge = bridge; }
public void GetTypeResponseMessage(JsBridge bridge, object target) { TypeInspector inspector = new TypeInspector(bridge, target); SendMessage(inspector.GetTypeInfo()); }
public SessionHelper(JsBridge bridge, ISession session) { this.Bridge = bridge; this.session = session; }
static void Main() { //----------------------------------- //1. //after we build nodejs in dll version //we will get node.dll //then just copy it to another name 'libespr' string currentdir = System.IO.Directory.GetCurrentDirectory(); string libEspr = @"../../../node-v8.4.0/Release/libespr.dll"; if (File.Exists(libEspr)) { //delete the old one File.Delete(libEspr); } File.Copy( @"../../../node-v8.4.0/Release/node.dll", //from libEspr); //----------------------------------- //2. load libespr.dll (node.dll) IntPtr intptr = LoadLibrary(libEspr); int errCode = GetLastError(); int libesprVer = JsBridge.LibVersion; #if DEBUG JsBridge.dbugTestCallbacks(); #endif //------------ JsEngine.RunJsEngine((IntPtr nativeEngine, IntPtr nativeContext) => { JsEngine eng = new JsEngine(nativeEngine); JsContext ctx = eng.CreateContext(nativeContext); //------------- //this LibEspressoClass object is need, //so node can talk with us, //------------- JsTypeDefinition jstypedef = new JsTypeDefinition("LibEspressoClass"); jstypedef.AddMember(new JsMethodDefinition("LoadMainSrcFile", args => { string filedata = @"var http = require('http'); (function t(){ console.log('hello from Espresso-ND'); var server = http.createServer(function(req, res) { res.writeHead(200); res.end('Hello! from Espresso-ND'); }); server.listen(8080,'localhost'); })();"; args.SetResult(filedata); })); jstypedef.AddMember(new JsMethodDefinition("C", args => { args.SetResult(true); })); jstypedef.AddMember(new JsMethodDefinition("E", args => { args.SetResult(true); })); if (!jstypedef.IsRegisterd) { ctx.RegisterTypeDefinition(jstypedef); } //---------- //then register this as x*** //this object is just an instance for reference ctx.SetVariableFromAny("LibEspresso", ctx.CreateWrapper(new object(), jstypedef)); }); string userInput = Console.ReadLine(); }
private void button5_Click(object sender, EventArgs e) { #if DEBUG JsBridge.dbugTestCallbacks(); #endif JsTypeDefinition jstypedef = new JsTypeDefinition("AA"); jstypedef.AddMember(new JsMethodDefinition("B", args => { int argCount = args.ArgCount; var thisArg = args.GetThisArg(); var arg0 = args.GetArgAsObject(0); args.SetResult((bool)arg0); })); jstypedef.AddMember(new JsMethodDefinition("C", args => { args.SetResult(true); })); //----------------------------------------------------- jstypedef.AddMember(new JsPropertyDefinition("D", args => { var ab = new AboutMe(); args.SetResultAutoWrap(ab); }, args => { //setter })); jstypedef.AddMember(new JsPropertyDefinition("E", args => { //getter args.SetResult(250); }, args => { //setter })); //=============================================================== //create js engine and context using (JsEngine engine = new JsEngine()) using (JsContext ctx = engine.CreateContext()) { ctx.RegisterTypeDefinition(jstypedef); GC.Collect(); System.Diagnostics.Stopwatch stwatch = new System.Diagnostics.Stopwatch(); stwatch.Reset(); stwatch.Start(); TestMe1 t1 = new TestMe1(); INativeScriptable proxy = ctx.CreateWrapper(t1, jstypedef); ctx.SetVariable("x", proxy); //string testsrc = "x.B(x.D.IsOK);"; string testsrc = "x.B(x.D.GetOK());"; object result = ctx.Execute(testsrc); stwatch.Stop(); Console.WriteLine("met1 template:" + stwatch.ElapsedMilliseconds.ToString()); } }
private void TestHelper(IObjectFactory factory, SessionHandler handler) { MockRepository mocks = new MockRepository(); ISession session = mocks.StrictMock<ISession>(); JsBridge bridge = new JsBridge(session, factory); HostedMode.Host = bridge; SessionHelper helper = new SessionHelper(bridge, session); using (mocks.Ordered()) { handler(helper); } mocks.ReplayAll(); bridge.DispatchForever(); mocks.VerifyAll(); }
static void TestNodeJs_Buffer() { //https://nodejs.org/api/buffer.html #if DEBUG JsBridge.dbugTestCallbacks(); #endif //------------ ////example2: get value from node js MyBufferBridge myBuffer = new MyBufferBridge(); //for nodejs's Buffer //NodeJsEngineHelper.Run(ss => //{ // //for node js // ss.SetExternalObj("myBuffer", myBuffer); // return @" // const buf1 = Buffer.alloc(20); // buf1.writeUInt8(0, 0); // buf1.writeUInt8(1, 1); // buf1.writeUInt8(2, 2); // //----------- // myBuffer.SetBuffer(buf1); // console.log('before:'); // console.log(buf1); // if(myBuffer.HaveSomeNewUpdate()){ // myBuffer.UpdateBufferFromDotNetSide(); // console.log('after:'); // console.log(buf1); // }else{ // console.log('no data'); // } // "; //}); //for v8 NodeJsEngineHelper.Run(ss => { //for general v8 //see more https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint8 ss.SetExternalObj("myBuffer", myBuffer); return(@" const buf1 = new ArrayBuffer(20); const view = new DataView(buf1); view.setUint8(0, 0); view.setUint8(1, 1); view.setUint8(2, 2); //----------- myBuffer.SetBuffer(buf1); console.log('before:'); console.log(buf1); if(myBuffer.HaveSomeNewUpdate()){ myBuffer.UpdateBufferFromDotNetSide(); console.log('after:'); console.log(buf1); }else{ console.log('no data'); } "); }); int buffLen = myBuffer.Length; string userInput = Console.ReadLine(); }
static void Main() { //----------------------------------- //1. //after we build nodejs in dll version //we will get node.dll //then just copy it to another name 'libespr' string currentdir = System.IO.Directory.GetCurrentDirectory(); string libEspr = "libespr.dll"; ////string libEspr = @"../../../node-v11.12.0/Release/libespr.dll"; //previous version 8.4.0 //if (File.Exists(libEspr)) //{ // //delete the old one // File.Delete(libEspr); //} //File.Copy( // @"../../../node-v11.12.0/Release/node.dll", // //previous version 8.4.0 // libEspr); //----------------------------------- //2. load libespr.dll (node.dll) //----------------------------------- //string libEspr = "libespr.dll"; IntPtr intptr = LoadLibrary(libEspr); int errCode = GetLastError(); int libesprVer = JsBridge.LibVersion; #if DEBUG JsBridge.dbugTestCallbacks(); #endif //------------ //http2 client NodeJsEngineHelper.Run( ss => @"const http2 = require('http2'); const fs = require('fs'); const client = http2.connect('https://localhost:8443', { ca: fs.readFileSync('localhost-cert.pem') }); client.on('error', (err) => console.error(err)); const req = client.request({ ':path': '/' }); req.on('response', (headers, flags) => { for (const name in headers) { console.log(`${name}: ${headers[name]}`); } }); req.setEncoding('utf8'); let data = ''; req.on('data', (chunk) => { data += chunk; }); req.on('end', () => { console.log(`\n${data}`); client.close(); }); req.end(); "); string userInput = Console.ReadLine(); }
public JsObjectWrapper(JsBridge bridge, object target) : base(bridge) { this.target = target; this.inspector = new TypeInspector(bridge, target); }
public void Run(NetworkStream stream) { HostedMode.Host = new CallContextStorage(); try { var session = new RemoteSession(stream, stream); var factory = new DefaultFactory(); var bridge = new JsBridge(session, factory); HostedMode.Host = bridge; bridge.DispatchForever(); } catch (Exception ex) { Debug.WriteLine(ex); } finally { stream.Close(); } }
static void Main() { //----------------------------------- //1. //after we build nodejs in dll version //we will get node.dll //then just copy it to another name 'libespr' string libEspr = @"../../../node-v16.8.0/out/Release/node.dll"; //----------------------------------- //2. load node.dll //----------------------------------- IntPtr intptr = LoadLibrary(libEspr); int errCode = GetLastError(); int libesprVer = JsBridge.LibVersion; #if DEBUG JsBridge.dbugTestCallbacks(); #endif //------------ //http2 client //http2 client HttpResp httpResp = new HttpResp(); NodeJsEngineHelper.Run( ss => { ss.SetExternalObj("my_resp", httpResp); return(@"const http2 = require('http2'); const fs = require('fs'); const client = http2.connect('https://localhost:8443', { ca: fs.readFileSync('localhost-cert.pem') }); client.on('error', (err) => console.error(err)); //const req = client.request({ ':path': '/' }); const req = client.request({ ':path': '/' ,'body':'123456789'}); req.on('response', (headers, flags) => { for (const name in headers) { console.log(`${name}: ${headers[name]}`); } }); req.setEncoding('utf8'); let data = ''; req.on('data', (chunk) => { data += chunk; }); req.on('end', () => { //console.log(`\n${data}`); my_resp.Data=data; client.close(); }); req.end(); "); }); string userInput = Console.ReadLine(); if (httpResp.Data != null) { Console.WriteLine(httpResp.Data); } }
private void button7_Click(object sender, EventArgs e) { string filename = @"..\..\..\HtmlRenderer.Demo\Samples\ClassicSamples\00.Intro.htm"; //1. blank html var fileContent = "<html><script>function doc_ready(){console.log('doc_ready');}</script><body onload=\"doc_ready()\"><div id=\"a\">A</div><div id=\"b\" style=\"background-color:blue\">B</div><div id=\"c\">c_node</div></body></html>"; easeViewport.LoadHtml(filename, fileContent); //---------------------------------------------------------------- //after load html page //load v8 if ready JsBridge.LoadV8("..\\..\\dll\\VRoomJsNative.dll"); #if DEBUG JsBridge.dbugTestCallbacks(); #endif //=============================================================== //2. access dom var webdoc = easeViewport.GetHtmlDom() as LayoutFarm.WebDom.IHtmlDocument; //create js engine and context if (myengine == null) { var jstypeBuilder = new LayoutFarm.Scripting.MyJsTypeDefinitionBuilder(); myengine = new JsEngine(); myCtx = myengine.CreateContext(jstypeBuilder); } System.Diagnostics.Stopwatch stwatch = new System.Diagnostics.Stopwatch(); stwatch.Reset(); stwatch.Start(); myCtx.SetVariableAutoWrap("document", webdoc); myCtx.SetVariableAutoWrap("console", myWbConsole); string simplejs = @" (function(){ console.log('hello world!'); var domNodeA = document.getElementById('a'); var domNodeB = document.getElementById('b'); var domNodeC = document.getElementById('c'); var newText1 = document.createTextNode('... says hello world!'); domNodeA.appendChild(newText1); for(var i=0;i<10;++i){ var newText2= document.createTextNode(i); domNodeA.appendChild(newText2); } var newDivNode= document.createElement('div'); newDivNode.appendChild(document.createTextNode('new div')); newDivNode.attachEventListener('mousedown',function(){console.log('new div');}); domNodeB.appendChild(newDivNode); domNodeC.innerHTML='<div> from inner html <span> from span</span> </div>'; console.log(domNodeC.innerHTML); })(); "; object testResult = myCtx.Execute(simplejs); stwatch.Stop(); Console.WriteLine("met1 template:" + stwatch.ElapsedMilliseconds.ToString()); }
private void button3_Click(object sender, EventArgs e) { #if DEBUG JsBridge.dbugTestCallbacks(); #endif JsTypeDefinition jstypedef = new JsTypeDefinition("AA"); jstypedef.AddMember(new JsMethodDefinition("B", args => { args.SetResult(100); })); jstypedef.AddMember(new JsMethodDefinition("C", args => { args.SetResult(true); })); jstypedef.AddMember(new JsPropertyDefinition("D", args => { //getter args.SetResult(true); }, args => { //setter })); jstypedef.AddMember(new JsPropertyDefinition("E", args => { //getter args.SetResult(250); }, args => { //setter })); //=============================================================== //create js engine and context using (JsEngine engine = new JsEngine()) using (JsContext ctx = engine.CreateContext()) { ctx.RegisterTypeDefinition(jstypedef); GC.Collect(); System.Diagnostics.Stopwatch stwatch = new System.Diagnostics.Stopwatch(); stwatch.Reset(); stwatch.Start(); TestMe1 t1 = new TestMe1(); var proxy = ctx.CreateWrapper(t1, jstypedef); //for (int i = 2000; i >= 0; --i) //{ ctx.SetVariableFromAny("x", proxy); //object result = ctx.Execute("(function(){if(x.C()){return x.B();}else{return 0;}})()"); object result = ctx.Execute("(function(){if(x.D){ x.E=300; return x.B();}else{return 0;}})()"); //} stwatch.Stop(); Console.WriteLine("met1 template:" + stwatch.ElapsedMilliseconds.ToString()); //Assert.That(result, Is.EqualTo(100)); } }
private void button5_Click(object sender, EventArgs e) { //1. init html var fileContent = "<html><body><div id=\"a\">A</div><div id=\"b\" style=\"background-color:blue\">B</div></body></html>"; easeViewport.LoadHtmlString("", fileContent); //---------------------------------------------------------------- //after load html page //test javascript ... #if DEBUG JsBridge.dbugTestCallbacks(); #endif //=============================================================== //2. access dom var webdoc = easeViewport.GetHtmlDom() as IHtmlDocument; //create js engine and context var jstypeBuilder = new LayoutFarm.Scripting.MyJsTypeDefinitionBuilder(); using (JsEngine engine = new JsEngine()) using (JsContext ctx = engine.CreateContext(jstypeBuilder)) { System.Diagnostics.Stopwatch stwatch = new System.Diagnostics.Stopwatch(); stwatch.Reset(); stwatch.Start(); ctx.SetVariableAutoWrap("document", webdoc); string testsrc1 = "document.getElementById('a');"; object domNodeA = ctx.Execute(testsrc1); string testsrc2 = "document.getElementById('b');"; object domNodeB = ctx.Execute(testsrc2); stwatch.Stop(); Console.WriteLine("met1 template:" + stwatch.ElapsedMilliseconds.ToString()); } ////3. get element by id //var domNodeA = webdoc.GetElementById("a"); //var domNodeB = webdoc.GetElementById("b"); //domNodeA.AddTextContent("Hello from A"); //domNodeB.AddChild("div", div => //{ // div.SetAttribute("style", "background-color:yellow"); // div.AddTextContent("Hello from B"); //}); //domNodeB.AttachMouseDownEvent(ev => //{ // var domB = new EaseDomElement(domNodeB); // domB.SetBackgroundColor(Color.Red); // ev.StopPropagation(); // //domNodeB.SetAttribute("style", "background-color:red"); //}); //domNodeB.AttachMouseUpEvent(ev => //{ // var domB = new EaseDomElement(domNodeB); // domB.SetBackgroundColor(Color.Yellow); // ev.StopPropagation(); // //domNodeB.SetAttribute("style", "background-color:red"); //}); }
public JsProxy(JsBridge bridge) : base(bridge) { _bridge = bridge; }
private void button6_Click(object sender, EventArgs e) { //1. init html var fileContent = "<html><body><div id=\"a\">A</div><div id=\"b\" style=\"background-color:blue\">B</div><div id=\"c\">c_node</div></body></html>"; easeViewport.LoadHtmlString("", fileContent); //---------------------------------------------------------------- //after load html page //load v8 if ready #if DEBUG JsBridge.dbugTestCallbacks(); #endif //=============================================================== //2. access dom var webdoc = easeViewport.GetHtmlDom() as LayoutFarm.WebDom.IHtmlDocument; //create js engine and context if (myengine == null) { var jstypeBuilder = new LayoutFarm.Scripting.MyJsTypeDefinitionBuilder(); myengine = new JsEngine(); myCtx = myengine.CreateContext(jstypeBuilder); } System.Diagnostics.Stopwatch stwatch = new System.Diagnostics.Stopwatch(); stwatch.Reset(); stwatch.Start(); myCtx.SetVariableAutoWrap("document", webdoc); myCtx.SetVariableAutoWrap("console", myWbConsole); string simplejs = @" (function(){ console.log('hello world!'); var domNodeA = document.getElementById('a'); var domNodeB = document.getElementById('b'); var domNodeC = document.getElementById('c'); var newText1 = document.createTextNode('... says hello world!'); domNodeA.appendChild(newText1); for(var i=0;i<10;++i){ var newText2= document.createTextNode(i); domNodeA.appendChild(newText2); } var newDivNode= document.createElement('div'); newDivNode.appendChild(document.createTextNode('new div')); newDivNode.attachEventListener('mousedown',function(){console.log('new div');}); domNodeB.appendChild(newDivNode); domNodeC.innerHTML='<div> from inner html <span> from span</span> </div>'; console.log(domNodeC.innerHTML); })(); "; object testResult = myCtx.Execute(simplejs); stwatch.Stop(); Console.WriteLine("met1 template:" + stwatch.ElapsedMilliseconds.ToString()); ////3. get element by id //var domNodeA = webdoc.GetElementById("a"); //var domNodeB = webdoc.GetElementById("b"); //domNodeA.AddTextContent("Hello from A"); //domNodeB.AddChild("div", div => //{ // div.SetAttribute("style", "background-color:yellow"); // div.AddTextContent("Hello from B"); //}); //domNodeB.AttachMouseDownEvent(ev => //{ // var domB = new EaseDomElement(domNodeB); // domB.SetBackgroundColor(Color.Red); // ev.StopPropagation(); // //domNodeB.SetAttribute("style", "background-color:red"); //}); //domNodeB.AttachMouseUpEvent(ev => //{ // var domB = new EaseDomElement(domNodeB); // domB.SetBackgroundColor(Color.Yellow); // ev.StopPropagation(); // //domNodeB.SetAttribute("style", "background-color:red"); //}); }
public object CreateInstance(JsBridge bridge, Type type) { object ret = chain.CreateInstance(bridge, type); cache.Add(ret.GetType(), ret); return ret; }
public JsArrayWrapper(JsBridge bridge, Array target) { this.bridge = bridge; this.target = target; this.elementType = target.GetType().GetElementType(); }