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
|
||||
};
|
||||
|
||||
// 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) {
|
||||
removeListeners(listeners);
|
||||
var div = document.createElement('div');
|
||||
var newElm = init(display, div, newModule, elm);
|
||||
inputs = [];
|
||||
// elm.send = newElm.send;
|
||||
// elm.recv = newElm.recv;
|
||||
// elm.swap = newElm.swap;
|
||||
return newElm;
|
||||
}
|
||||
|
@ -111,6 +91,7 @@ function init(display, container, module, moduleToReplace, ports) {
|
|||
}
|
||||
inputs = ElmRuntime.filterDeadInputs(inputs);
|
||||
filterListeners(inputs, listeners);
|
||||
addReceivers(elm.ports_out);
|
||||
if (display !== ElmRuntime.Display.NONE) {
|
||||
var graphicsNode = initGraphics(elm, Module);
|
||||
}
|
||||
|
@ -124,7 +105,7 @@ function init(display, container, module, moduleToReplace, ports) {
|
|||
}
|
||||
|
||||
reportAnyErrors();
|
||||
return { send:send, recv:recv, swap:swap, ports:elm.ports_out };
|
||||
return { swap:swap, ports:elm.ports_out };
|
||||
};
|
||||
|
||||
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) {
|
||||
if (!('main' in Module))
|
||||
throw new Error("'main' is missing! What do I display?!");
|
||||
|
|
Loading…
Reference in a new issue