var connections = [];
// A list of "ports", i.e. connected clients (such as web pages). Multiple web
// pages can connect to our service: they all receive the same data.
var ports = [];
function byPath(path) {
    return connections.filter(function (x) { return x.path == path; });
}
function byId(id) {
    return connections.filter(function (x) { return x.id == id; });
}
function onReceive(data, id) {
    if (ports.length == 0)
        return;
    var view = new DataView(data);
    var decoder = new TextDecoder("utf-8");
    var decodedString = decoder.decode(view);
    ports.forEach(function (port) { return port.postMessage({
        type: "serial",
        data: decodedString,
        id: id
    }); });
}
function findNewDevices() {
    chrome.serial.getDevices(function (serialPorts) {
        serialPorts.forEach(function (serialPort) {
            if (byPath(serialPort.path).length == 0 &&
                serialPort.displayName == "mbed Serial Port") {
                try {
                    chrome.serial.connect(serialPort.path, { bitrate: 115200 }, function (info) {
                        // In case the [connect] operation takes more than five seconds...
                        if (info && byPath(serialPort.path).length == 0)
                            connections.push({
                                id: info.connectionId,
                                path: serialPort.path
                            });
                    });
                }
                catch (e) {
                    console.log("failed to connect to " + serialPort.displayName);
                }
            }
        });
    });
}
function main() {
    // Register new clients in the [ports] global variable.
    chrome.runtime.onConnectExternal.addListener(function (port) {
        console.log('connection to port ' + port.name);
        if (/^serial$/.test(port.name)) {
            ports.push(port);
            port.onDisconnect.addListener(function () {
                ports = ports.filter(function (x) { return x != port; });
            });
        }
    });
    // When receiving data for one of the connections that we're tracking, forward
    // it to all connected clients.
    chrome.serial.onReceive.addListener(function (info) {
        if (byId(info.connectionId).length > 0)
            onReceive(info.data, info.connectionId);
    });
    // When it looks like we've been disconnected, drop the corresponding
    // connection object from the [connections] global variable.
    chrome.serial.onReceiveError.addListener(function (info) {
        if (info.error == "system_error" || info.error == "disconnected" || info.error == "device_lost")
            connections = connections.filter(function (x) { return x.id != info.connectionId; });
    });
    // Probe serial connections at regular intervals. In case we find an mbed port
    // we haven't yet connected to, connect to it.
    setInterval(findNewDevices, 5000);
    findNewDevices();
}
document.addEventListener("DOMContentLoaded", main);