v86 / src /browser /inbrowser_network.js
peterpeter8585's picture
Upload 553 files
8df6da4 verified
// For Types Only
import { BusConnector } from "../bus.js";
/**
* Network adapter "inbrowser" which connects the emulated NIC
* to a shared in-browser BroadcastChannel.
*
* NOTE: BroadcastChannel.postMessage() sends the given message to
* *other* BroadcastChannel objects set up for the same channel.
* Since we use the same BroadcastChannel instance for both
* sending and receiving we do not receive copies of our
* own sent messages.
* Source: https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts
*
* @constructor
*
* @param {BusConnector} bus
* @param {*=} config
*/
export function InBrowserNetworkAdapter(bus, config)
{
const id = config.id || 0;
this.bus = bus;
this.bus_send_msgid = `net${id}-send`;
this.bus_recv_msgid = `net${id}-receive`;
this.channel = new BroadcastChannel(`v86-inbrowser-${id}`);
this.is_open = true;
// forward ethernet frames from emulated NIC to hub
this.nic_to_hub_fn = (eth_frame) => {
this.channel.postMessage(eth_frame);
};
this.bus.register(this.bus_send_msgid, this.nic_to_hub_fn, this);
// forward ethernet frames from hub to emulated NIC
this.hub_to_nic_fn = (ev) => {
this.bus.send(this.bus_recv_msgid, ev.data);
};
this.channel.addEventListener("message", this.hub_to_nic_fn);
}
InBrowserNetworkAdapter.prototype.destroy = function()
{
if(this.is_open) {
this.bus.unregister(this.bus_send_msgid, this.nic_to_hub_fn);
this.channel.removeEventListener("message", this.hub_to_nic_fn);
this.channel.close();
this.is_open = false;
}
};