Spaces:
Runtime error
Runtime error
| // 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; | |
| } | |
| }; | |