public override void didReceiveScriptMessage(NKScriptMessage message)
        {
            // A workaround for when postMessage(undefined)
            if (message.body == null)
            {
                return;
            }

            var body = message.body as Dictionary <string, object>;

            if (body != null && body.ContainsKey("$opcode"))
            {
                string opcode = body["$opcode"] as String;
                int    target = Int32.Parse(body["$target"].ToString());
                NKScriptMessageHandler proxy = null;
                if (_proxies.ContainsKey(target))
                {
                    proxy = _proxies[target];
                }
                else if (target > 1500)
                {
                    var targetFloor = target - (target % NKRANGEPERPROCESS);
                    if (_proxiesNatives.ContainsKey(targetFloor))
                    {
                        proxy = _proxiesNatives[targetFloor];
                    }
                }

                if (proxy != null)
                {
                    if (opcode == "-")
                    {
                        if (target == 0)
                        {
                            // TRANSFER TO REMOTE, WITH SYNC
                            var _ = proxy.didReceiveScriptMessageSync(message);
                            this.unbind();
                        }
                        else
                        {
                            // TRANSFER TO REMOTE, WITH SYNC
                            var _ = proxy.didReceiveScriptMessageSync(message);

                            // UNBIND PROXY
                            _cancelTokens[target].Cancel();
                        }
                    }
                    else if (typeInfo.ContainsProperty(opcode))
                    {
                        // ALSO TRANSFER TO REMOTE
                        proxy.didReceiveScriptMessage(message);
                    }
                    else if (typeInfo.ContainsMethod(opcode))
                    {
                        // Invoke method

                        // TRANSFER TO REMOTE ONLY
                        proxy.didReceiveScriptMessage(message);
                    }
                    else
                    {
                        NKLogging.log(String.Format("!Invalid member name: {0}", opcode));
                    }
                }
                else if (opcode == "+")
                {
                    throw new NotImplementedException("+ opcode must be called using synchronous messages");
                }
                else
                {
                    // else Unknown opcode
                    var obj = _principal.plugin as NKScriptMessageHandler;
                    if (obj != null)
                    {
                        obj.didReceiveScriptMessage(message);
                    }
                    else
                    {
                        // discard unknown message
                        NKLogging.log(String.Format("!Unknown message: {0}", message.body.ToString()));
                    }
                }
            }
            else
            {
                // null body, ignore
            }
        }
Example #2
0
        // RENDERER PROCESS PIPE EVENT LOOP
        private async Task _processClientMessages()
        {
            var message = await readObjectAsync(syncPipeIn);

            if (message == null)
            {
                NKLogging.log("!Renderer Received Empty Message");
                cancelTokenSource.Cancel();
                return;
            }

            if (message.command == NKRemotingMessage.Command.NKScriptMessageSync)
            {
                var name = message.args[0];
                Dictionary <string, object> body = null;
                try
                {
                    body = context.NKdeserialize(message.args[1]) as Dictionary <string, object>;
                }
                catch (Exception ex)
                {
                    NKLogging.log("!Renderer Message Deserialization Error: " + ex.Message);
                }
                var nks = new NKScriptMessage(name, body);

                NKScriptMessageHandler handler = null;
                if (_localHandlers.ContainsKey(name))
                {
                    handler = _localHandlers[name];
                }
                else
                {
                    int target = Int32.Parse(body["$target"].ToString());
                    handler = NKScriptChannel.getNative(target);
                }
                if (handler != null)
                {
                    var nkr = new NKRemotingMessage();
                    nkr.command = NKRemotingMessage.Command.NKScriptMessageSyncReply;

                    try
                    {
                        var result = handler.didReceiveScriptMessageSync(nks);
                        nkr.args = new string[] { context.NKserialize(result) };
                    } catch (Exception ex)
                    {
                        NKLogging.log("!Renderer Message Processing Error: " + ex.Message);
                        NKLogging.log(ex.StackTrace);
                        nkr.args = new string[] { };
                    }
                    writeObject(syncPipeOut, nkr);
                }
                else
                {
                    NKLogging.log("+Renderer Received Unknown Script Message Sync");
                }
            }
            else if (message.command == NKRemotingMessage.Command.NKScriptMessage)
            {
                var name = message.args[0];
                Dictionary <string, object> body = null;
                try
                {
                    body = context.NKdeserialize(message.args[1]) as Dictionary <string, object>;
                }
                catch (Exception ex)
                {
                    NKLogging.log("!Renderer Message Deserialization Error: " + ex.Message);
                }
                var nks = new NKScriptMessage(name, body);

                NKScriptMessageHandler handler = null;
                if (_localHandlers.ContainsKey(name))
                {
                    handler = _localHandlers[name];
                }
                else
                {
                    int target = Int32.Parse(body["$target"].ToString());
                    handler = NKScriptChannel.getNative(target);
                }
                if (handler != null)
                {
                    handler.didReceiveScriptMessage(nks);
                }
                else
                {
                    NKLogging.log("+Renderer Received Unknown Script Message " + message.args[1]);
                }
            }
            else if (message.command == NKRemotingMessage.Command.NKRemotingClose)
            {
                try
                {
                    syncPipeIn.Close();
                    syncPipeOut.Close();
                    asyncPipe.Close();
                }
                catch { }

                Environment.Exit(0);
            }
            else if (message.command == NKRemotingMessage.Command.NKEvent)
            {
                var     eventType   = message.args[0];
                NKEvent eventObject = new NKEvent((IDictionary <string, object>)(NKData.jsonDeserialize(message.args[1])));
                NKEventEmitter.global.emit <NKEvent>(eventType, eventObject, false);
            }

            if (!cancelToken.IsCancellationRequested)
            {
                await _processClientMessages();
            }
            else
            {
                return;
            }
        }
        public override object didReceiveScriptMessageSync(NKScriptMessage message)
        {
            // A workaround for when postMessage(undefined)
            if (message.body == null)
            {
                return(false);
            }

            // thread static
            NKScriptValue._currentContext = this.context;
            object result;

            var body = message.body as Dictionary <string, object>;

            if (body != null && body.ContainsKey("$opcode"))
            {
                string opcode = body["$opcode"] as String;
                int    target = Int32.Parse(body["$target"].ToString());
                NKScriptMessageHandler proxy = null;
                if (_proxies.ContainsKey(target))
                {
                    proxy = _proxies[target];
                }
                else if (target > 1500)
                {
                    var targetFloor = target - (target % 10);
                    if (_proxiesNatives.ContainsKey(targetFloor))
                    {
                        proxy = _proxiesNatives[targetFloor];
                    }
                }

                if (proxy != null)
                {
                    if (opcode == "-")
                    {
                        if (target == 0)
                        {
                            // TRANSFER TO REMOTE
                            var _ = proxy.didReceiveScriptMessageSync(message);

                            this.unbind();
                            result = true;
                        }
                        else
                        {
                            // TRANSFER TO REMOTE
                            var _ = proxy.didReceiveScriptMessageSync(message);

                            // UNBIND PROXY
                            _cancelTokens[target].Cancel();

                            result = true;
                        }
                    }
                    else if (typeInfo.ContainsProperty(opcode))
                    {
                        // TRANSFER TO REMOTE
                        proxy.didReceiveScriptMessageSync(message);
                        result = true;
                    }
                    else if (typeInfo.ContainsMethod(opcode))
                    {
                        // Invoke method via REMOTE proxy
                        result = proxy.didReceiveScriptMessageSync(message);
                    }
                    else
                    {
                        NKLogging.log(String.Format("!Invalid member name: {0}", opcode));
                        result = false;
                    }
                }
                else if (opcode == "+")
                {
                    _instances[target] = null;

                    int maxNativeFirst = NKScriptChannel.nativeFirstSequence - (NKScriptChannel.nativeFirstSequence % NKRANGEPERPROCESS) - 1;
                    int minNativeFirst = (maxNativeFirst - NKRANGEPERPROCESS) + 1;
                    NKScriptChannel.nativeFirstSequence = minNativeFirst - 1;

                    var cancelTokenSource = new CancellationTokenSource();
                    _cancelTokens[target] = cancelTokenSource;
                    proxy            = NKRemoting.NKRemotingProxy.createClient(ns, id, maxNativeFirst, message, context, cancelTokenSource.Token);
                    _proxies[target] = proxy;
                    _proxiesNatives[minNativeFirst] = proxy;

                    result = true;
                }
                else
                {
                    // else Unknown opcode
                    var obj = _principal.plugin as NKScriptMessageHandler;
                    if (obj != null)
                    {
                        result = obj.didReceiveScriptMessageSync(message);
                    }
                    else
                    {
                        // discard unknown message
                        NKLogging.log(String.Format("!Unknown message: {0}", message.body.ToString()));
                        result = false;
                    }
                }
            }
            else
            {
                // null body
                result = false;
            }

            //thread static
            NKScriptValue._currentContext = null;
            return(result);
        }