Switch from old FFI to new port interface for default output ports
Also add default handlers for stdout and stderr
This commit is contained in:
parent
7cf5a564e5
commit
7e64531d2e
1 changed files with 27 additions and 21 deletions
|
@ -71,31 +71,11 @@ function init(display, container, module, moduleToReplace, ports) {
|
||||||
ports_in:ports
|
ports_in:ports
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set up methods to communicate with Elm program from JS.
|
|
||||||
function send(name, value) {
|
|
||||||
if (typeof value === 'undefined') return function(v) { return send(name,v); };
|
|
||||||
var e = document.createEvent('Event');
|
|
||||||
e.initEvent(name + '_' + elm.id, true, true);
|
|
||||||
e.value = value;
|
|
||||||
document.dispatchEvent(e);
|
|
||||||
}
|
|
||||||
function recv(name, handler) {
|
|
||||||
document.addEventListener(name + '_' + elm.id, handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
recv('log', function(e) {console.log(e.value)});
|
|
||||||
recv('title', function(e) {document.title = e.value});
|
|
||||||
recv('redirect', function(e) {
|
|
||||||
if (e.value.length > 0) { window.location = e.value; }
|
|
||||||
});
|
|
||||||
|
|
||||||
function swap(newModule) {
|
function swap(newModule) {
|
||||||
removeListeners(listeners);
|
removeListeners(listeners);
|
||||||
var div = document.createElement('div');
|
var div = document.createElement('div');
|
||||||
var newElm = init(display, div, newModule, elm);
|
var newElm = init(display, div, newModule, elm);
|
||||||
inputs = [];
|
inputs = [];
|
||||||
// elm.send = newElm.send;
|
|
||||||
// elm.recv = newElm.recv;
|
|
||||||
// elm.swap = newElm.swap;
|
// elm.swap = newElm.swap;
|
||||||
return newElm;
|
return newElm;
|
||||||
}
|
}
|
||||||
|
@ -111,6 +91,7 @@ function init(display, container, module, moduleToReplace, ports) {
|
||||||
}
|
}
|
||||||
inputs = ElmRuntime.filterDeadInputs(inputs);
|
inputs = ElmRuntime.filterDeadInputs(inputs);
|
||||||
filterListeners(inputs, listeners);
|
filterListeners(inputs, listeners);
|
||||||
|
addReceivers(elm.ports_out);
|
||||||
if (display !== ElmRuntime.Display.NONE) {
|
if (display !== ElmRuntime.Display.NONE) {
|
||||||
var graphicsNode = initGraphics(elm, Module);
|
var graphicsNode = initGraphics(elm, Module);
|
||||||
}
|
}
|
||||||
|
@ -124,7 +105,7 @@ function init(display, container, module, moduleToReplace, ports) {
|
||||||
}
|
}
|
||||||
|
|
||||||
reportAnyErrors();
|
reportAnyErrors();
|
||||||
return { send:send, recv:recv, swap:swap, ports:elm.ports_out };
|
return { swap:swap, ports:elm.ports_out };
|
||||||
};
|
};
|
||||||
|
|
||||||
function filterListeners(inputs, listeners) {
|
function filterListeners(inputs, listeners) {
|
||||||
|
@ -147,6 +128,31 @@ function removeListeners(listeners) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add receivers for built-in ports if they are defined
|
||||||
|
function addReceivers(ports) {
|
||||||
|
if ('log' in ports) {
|
||||||
|
ports.log.subscribe(function(v) { console.log(v) });
|
||||||
|
}
|
||||||
|
if ('stdout' in ports) {
|
||||||
|
var handler = process ? function(v) { process.stdout.write(v); }
|
||||||
|
: function(v) { console.log(v); };
|
||||||
|
ports.stdout.subscribe(handler);
|
||||||
|
}
|
||||||
|
if ('stderr' in ports) {
|
||||||
|
var handler = process ? function(v) { process.stderr.write(v); }
|
||||||
|
: function(v) { console.log('Error:' + v); };
|
||||||
|
ports.stderr.subscribe(handler);
|
||||||
|
}
|
||||||
|
if ('title' in ports) {
|
||||||
|
ports.title.subscribe(function(v) { document.title = v; });
|
||||||
|
}
|
||||||
|
if ('redirect' in ports) {
|
||||||
|
ports.redirect.subscribe(function(v) {
|
||||||
|
if (v.length > 0) window.location = v;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function initGraphics(elm, Module) {
|
function initGraphics(elm, Module) {
|
||||||
if (!('main' in Module))
|
if (!('main' in Module))
|
||||||
throw new Error("'main' is missing! What do I display?!");
|
throw new Error("'main' is missing! What do I display?!");
|
||||||
|
|
Loading…
Reference in a new issue