From 783a3688aa244fa8c7f94e7038f1d55ed4f8629c Mon Sep 17 00:00:00 2001 From: Tim Mickel Date: Tue, 21 Jun 2016 14:48:54 -0400 Subject: [PATCH] Update index.js to support worker environment --- src/index.js | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/index.js b/src/index.js index e8558a19e..afe6cc2f4 100644 --- a/src/index.js +++ b/src/index.js @@ -4,6 +4,12 @@ var util = require('util'); var Blocks = require('./engine/blocks'); var Runtime = require('./engine/runtime'); +/** + * Whether the environment is a WebWorker. + * @const{boolean} + */ +var ENV_WORKER = typeof importScripts === 'function'; + /** * Handles connections between blocks, stage, and extensions. * @@ -30,6 +36,55 @@ function VirtualMachine () { ); } +/* + * Worker Handlers + */ +if (ENV_WORKER) { + self.vmInstance = new VirtualMachine(); + self.onmessage = function (e) { + var messageData = e.data; + switch (messageData.method) { + case 'start': + self.vmInstance.runtime.start(); + break; + case 'greenFlag': + self.vmInstance.runtime.greenFlag(); + break; + case 'stopAll': + self.vmInstance.runtime.stopAll(); + break; + case 'blockListener': + self.vmInstance.blockListener(messageData.args); + break; + case 'flyoutBlockListener': + self.vmInstance.flyoutBlockListener(messageData.args); + break; + case 'getPlaygroundData': + self.postMessage({ + method: 'playgroundData', + blocks: self.vmInstance.blocks, + threads: self.vmInstance.runtime.threads + }); + break; + default: + throw 'Unknown method' + messageData.method; + } + }; + // Bind runtime's emitted events to postmessages. + self.vmInstance.runtime.on(Runtime.STACK_GLOW_ON, function (id) { + self.postMessage({method: Runtime.STACK_GLOW_ON, id: id}); + }); + self.vmInstance.runtime.on(Runtime.STACK_GLOW_OFF, function (id) { + self.postMessage({method: Runtime.STACK_GLOW_OFF, id: id}); + }); + self.vmInstance.runtime.on(Runtime.BLOCK_GLOW_ON, function (id) { + self.postMessage({method: Runtime.BLOCK_GLOW_ON, id: id}); + }); + self.vmInstance.runtime.on(Runtime.BLOCK_GLOW_OFF, function (id) { + self.postMessage({method: Runtime.BLOCK_GLOW_OFF, id: id}); + }); +} + /** * Inherit from EventEmitter */