scratch-vm/src/worker.js
2016-08-15 21:37:36 -04:00

82 lines
2.4 KiB
JavaScript

var EventEmitter = require('events');
var util = require('util');
function VirtualMachine () {
if (!window.Worker) {
console.error('WebWorkers not supported in this environment.' +
' Please use the non-worker version (vm.js or vm.min.js).');
return;
}
var instance = this;
EventEmitter.call(instance);
instance.vmWorker = new Worker('../vm.js');
// onmessage calls are converted into emitted events.
instance.vmWorker.onmessage = function (e) {
instance.emit(e.data.method, e.data);
};
instance.blockListener = function (e) {
// Messages from Blockly are not serializable by default.
// Pull out the necessary, serializable components to pass across.
var serializableE = {
blockId: e.blockId,
element: e.element,
type: e.type,
name: e.name,
newValue: e.newValue,
oldParentId: e.oldParentId,
oldInputName: e.oldInputName,
newParentId: e.newParentId,
newInputName: e.newInputName,
xml: {
outerHTML: (e.xml) ? e.xml.outerHTML : null
}
};
instance.vmWorker.postMessage({
method: 'blockListener',
args: serializableE
});
};
}
/**
* Inherit from EventEmitter
*/
util.inherits(VirtualMachine, EventEmitter);
// For documentation, please see index.js.
// These mirror the functionality provided there, with the worker wrapper.
VirtualMachine.prototype.getPlaygroundData = function () {
this.vmWorker.postMessage({method: 'getPlaygroundData'});
};
VirtualMachine.prototype.postIOData = function (device, data) {
this.vmWorker.postMessage({
method: 'postIOData',
device: device,
data: data
});
};
VirtualMachine.prototype.start = function () {
this.vmWorker.postMessage({method: 'start'});
};
VirtualMachine.prototype.greenFlag = function () {
this.vmWorker.postMessage({method: 'greenFlag'});
};
VirtualMachine.prototype.stopAll = function () {
this.vmWorker.postMessage({method: 'stopAll'});
};
VirtualMachine.prototype.animationFrame = function () {
this.vmWorker.postMessage({method: 'animationFrame'});
};
/**
* Export and bind to `window`
*/
module.exports = VirtualMachine;
if (typeof window !== 'undefined') window.VirtualMachine = module.exports;