summaryrefslogtreecommitdiff
path: root/main.cf2d245a.js.map
blob: f2e36287c0376c8959eccee9f6d0e4ae2be3c2c4 (plain) (blame)
1
{"version":3,"sources":["js/uBit.js","js/notification.js","js/gamepad.js","js/main.js"],"names":["UART_SERVICE_UUID","UART_TX_CHARACTERISTIC_UUID","UART_RX_CHARACTERISTIC_UUID","EVENT_SERVICE_CHARACTERISTIC_UUID","UBIT_REQUIREMENT_CHARACTERISTIC_UUID","CLIENTREQUIREMENTS_CHARACTERISTIC_UUID","UBITEVENT_CHARACTERISTIC_UUID","CLIENTEVENT_CHARACTERISTIC_UUID","MESEvents","MES_DPAD_CONTROLLER_ID","MES_DPAD_BUTTON_A_DOWN","MES_DPAD_BUTTON_A_UP","MES_DPAD_BUTTON_B_DOWN","MES_DPAD_BUTTON_B_UP","MES_DPAD_BUTTON_C_DOWN","MES_DPAD_BUTTON_C_UP","MES_DPAD_BUTTON_D_DOWN","MES_DPAD_BUTTON_D_UP","MES_DPAD_BUTTON_1_DOWN","MES_DPAD_BUTTON_1_UP","MES_DPAD_BUTTON_2_DOWN","MES_DPAD_BUTTON_2_UP","MES_DPAD_BUTTON_3_DOWN","MES_DPAD_BUTTON_3_UP","MES_DPAD_BUTTON_4_DOWN","MES_DPAD_BUTTON_4_UP","BluetoothService","EventService","service","ubitEvent","console","log","event_type","event_value","writeValue","Uint16Array","gattServer","debug","getPrimaryService","SERVICE_UUID","getCharacteristic","ubitEventCharacteristic","uBitBLE","onConnectCallback","onDisconnectCallback","callbackFunction","device","gatt","connected","isConnected","disconnect","navigator","bluetooth","requestDevice","filters","namePrefix","optionalServices","addEventListener","name","id","connect","server","getService","eventService","getSupportedProperties","characteristic","supportedProperties","p","properties","push","toUpperCase","join","eventByteArrayToString","event","receivedData","i","target","value","byteLength","getUint8","String","fromCharCode","apply","waiting_timer","undefined","notif_queue","notif","notif_c","notification_area","document","querySelector","screen","availHeight","availWidth","body","classList","contains","setInterval","clearInterval","pop","notif_elem","createElement","className","appendChild","add","setTimeout","remove","style","opacity","removeChild","length","notif_alert","alert_str","div","text","innerHTML","icon","notif_warn","notif_info","info_str","notif_success","success_str","CanvasStage","node","window","devicePixelRatio","canvas","setAttribute","resize","drawElements","getContext","getComputedStyle","getPropertyValue","slice","x","y","TouchElement","collides","clearRect","draw","showTouches","drawTouches","e","colors","Object","entries","touches","identifier","touch","beginPath","arc","Math","PI","fillStyle","fill","lineWidth","strokeStyle","stroke","element","init","splice","Element","opts","gamepad","_opts","assign","alignX","alignY","ctx","width","height","getScaleY","isInside","isPointInPath","path","Square","Path2D","w","rect","getX","getY","doCallbacks","includes","type","touchCount","eState","isActive","handleTouchEventCallbacks","createTouchEventObject","action","GamepadButton","keyboardButton","altText","altTextAlign","shape","registerKeybinding","s","floor","toString","font","textBaseline","textAlign","fillText","showAltText","ax","ay","GamepadJoystick","lockX","lockY","autoCenter","bindUp","bindLeft","bindRight","bindDown","key","hasOwnProperty","round","mouseX","cR","mouseY","max","cX","stage","screenToCanvasX","min","abs","sign","isKeyPressed","cY","screenToCanvasY","Gamepad","addEventListeners","ev","handleKeyEvent","handleTouchEvent","handleMouseEvent","binding","keyCode","pressed","gtEvent","touchId","setActive","debugTouches","processGamepadTouchEvent","clientX","clientY","preventDefault","typedict","changedTouches","getTarget","showDebug","t","enableVibration","vibrate","error","callback","elements","addElement","elementIds","removeElementById","removeAllElements","variant","addElements","sw","serviceWorker","register","scope","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","update","catch","getElementById","ubit","v","setGamepadLayout","localStorage","setItem","getItem","checked","searchDevice","gamepadState","onTouchEvent","debugString","sendEvent","onConnect","onDisconnect"],"mappings":"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","file":"main.cf2d245a.js","sourceRoot":"../src","sourcesContent":["/*\n * This code is written with a lot of help from these resources:\n * https://github.com/antefact/microBit.js/blob/master/src/microBit.js\n * https://gist.github.com/kotobuki/7c67f8b9361e08930da1a5cfcfb0653f\n * https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html\n */\nconst UART_SERVICE_UUID                      = \"6e400001-b5a3-f393-e0a9-e50e24dcca9e\";\n/* Used for reading UART data from micro bit */\nconst UART_TX_CHARACTERISTIC_UUID            = \"6e400002-b5a3-f393-e0a9-e50e24dcca9e\";\n/* Used for writing UART data to micro bit */\nconst UART_RX_CHARACTERISTIC_UUID            = \"6e400003-b5a3-f393-e0a9-e50e24dcca9e\";\n/* The event service characteristic (which extends the uBit message bus over bluetooth) */\nconst EVENT_SERVICE_CHARACTERISTIC_UUID      = \"e95d93af-251d-470a-a062-fa1922dfa9a8\";\n/* This should be read once connected, as the ubit will advertise which events it wants to subscribe to */\nconst UBIT_REQUIREMENT_CHARACTERISTIC_UUID   = \"e95db84c-251d-470a-a062-fa1922dfa9a8\";\n/* The characteristic where we should write the events we wish to be informed of from the microbit */\nconst CLIENTREQUIREMENTS_CHARACTERISTIC_UUID = \"e95d23c4-251d-470a-a062-fa1922dfa9a8\"\n/* The characteristic used for reading EventService messages */\nconst UBITEVENT_CHARACTERISTIC_UUID          = \"e95d9775-251d-470a-a062-fa1922dfa9a8\";\n/* The characteristic used for writing EventService messages */\nconst CLIENTEVENT_CHARACTERISTIC_UUID        = \"e95d5404-251d-470a-a062-fa1922dfa9a8\";\n\n/* This table is retrieved from this site:\n * https://github.com/lancaster-university/microbit-dal/blob/master/inc/bluetooth/MESEvents.h */\nexport const MESEvents = {\n    MES_DPAD_CONTROLLER_ID: 1104,\n    MES_DPAD_BUTTON_A_DOWN: 1,\n    MES_DPAD_BUTTON_A_UP:   2,\n    MES_DPAD_BUTTON_B_DOWN: 3,\n    MES_DPAD_BUTTON_B_UP:   4,\n    MES_DPAD_BUTTON_C_DOWN: 5,\n    MES_DPAD_BUTTON_C_UP:   6,\n    MES_DPAD_BUTTON_D_DOWN: 7,\n    MES_DPAD_BUTTON_D_UP:   8,\n    MES_DPAD_BUTTON_1_DOWN: 9,\n    MES_DPAD_BUTTON_1_UP:   10,\n    MES_DPAD_BUTTON_2_DOWN: 11,\n    MES_DPAD_BUTTON_2_UP:   12,\n    MES_DPAD_BUTTON_3_DOWN: 13,\n    MES_DPAD_BUTTON_3_UP:   14,\n    MES_DPAD_BUTTON_4_DOWN: 15,\n    MES_DPAD_BUTTON_4_UP:   16\n}\n\nclass BluetoothService {\n    SERVICE_UUID = null;\n}\n\nclass EventService extends BluetoothService {\n    static SERVICE_UUID = EVENT_SERVICE_CHARACTERISTIC_UUID;\n    service;\n\n    constructor(service, ubitEvent) {\n        super();\n        this.service = service;\n        this.ubitEvent = ubitEvent;\n        console.log(\"EventService initialized.\");\n    }\n\n    sendEvent(event_type, event_value) {\n        this.ubitEvent.writeValue(\n            new Uint16Array([event_type, event_value])\n        );\n    }\n\n    static async getService(gattServer) {\n        console.debug(\"Getting EventService\");\n        let service = await gattServer.getPrimaryService(EventService.SERVICE_UUID);\n        console.debug(\"Getting UBitevent characteristic\");\n        let ubitEventCharacteristic = await service.getCharacteristic(CLIENTEVENT_CHARACTERISTIC_UUID);\n        return new EventService(service, ubitEventCharacteristic);\n    }\n}\n\nexport class uBitBLE {\n    eventService;\n    device;\n\n    constructor() {\n        this.onConnectCallback = function() {};\n        this.onDisconnectCallback = function() {};\n    }\n\n    onConnect(callbackFunction) {\n        this.onConnectCallback = callbackFunction;\n    }\n\n    onDisconnect(callbackFunction) {\n        this.onDisconnectCallback = callbackFunction;\n    }\n\n    isConnected() {\n        if (this.device) {\n            return this.device.gatt.connected;\n        } else {\n            return false;\n        }\n    }\n\n    disconnect() {\n        if (this.isConnected()) {\n            this.device.gatt.disconnect();\n        }\n    }\n\n    async searchDevice() {\n        this.device = await navigator.bluetooth.requestDevice({\n            filters: [{namePrefix: \"BBC micro:bit\"}],\n            optionalServices: [EVENT_SERVICE_CHARACTERISTIC_UUID]\n        });\n        this.device.addEventListener('gattserverdisconnected', this.onDisconnectCallback);\n        console.log(\"Connected to new device\", this.device.name, this.device.id);\n\n        console.debug(\"Connection to GATT server...\");\n        const server = await this.device.gatt.connect()\n\n        this.onConnectCallback();\n        console.debug(\"Getting services...\");\n\n        const eventService = await EventService.getService(server);\n        this.eventService = eventService;\n    }\n\n}\n\nfunction getSupportedProperties(characteristic) {\n    let supportedProperties = [];\n    for (const p in characteristic.properties) {\n        if (characteristic.properties[p] === true) {\n            supportedProperties.push(p.toUpperCase());\n        }\n    }\n    return '[' + supportedProperties.join(', ') + ']';\n}\n\nfunction eventByteArrayToString(event) {\n    let receivedData = [];\n    for (var i = 0; i < event.target.value.byteLength; i++) {\n        receivedData[i] = event.target.value.getUint8(i);\n    }\n    return String.fromCharCode.apply(null, receivedData);\n}\n","let waiting_timer = undefined;\nlet notif_queue = [];\n\nfunction notif(notif_c) {\n    let notification_area = document.querySelector(\".statusline .notification-area\");\n\n    if ((notification_area.querySelector(\".notification\") === null) && (waiting_timer === undefined)) {\n        // This is just so no notifications will be played and disappears while the full screen landscape warning is in the way.\n        if( (screen.availHeight > screen.availWidth) && (!document.body.classList.contains(\"ignore-landscape-warning\"))){\n            waiting_timer = setInterval(() => {\n                if( (screen.availHeight < screen.availWidth) || (document.body.classList.contains(\"ignore-landscape-warning\"))){\n                    clearInterval(waiting_timer);\n                    waiting_timer = undefined;\n                    notif(notif_queue.pop());\n                }\n            }, 1000);\n            notif_queue.push(notif_c);\n            return;\n        }\n\n        let notif_elem = document.createElement(\"div\");\n        notif_elem.className = \"notification\";\n        notif_elem.appendChild(notif_c[0]);\n        notif_elem.appendChild(notif_c[1]);\n\n        notification_area.appendChild(notif_elem);\n\n        notification_area.classList.add(\"show\");\n        setTimeout(() => {\n            notification_area.classList.remove(\"show\");\n            notif_elem.querySelector(\"p\").style.opacity = \"0\";\n            setTimeout(() => {\n                notification_area.removeChild(notif_elem);\n                if (notif_queue.length > 0) {\n                    notif(notif_queue.pop());\n                }\n            }, 1000);\n        }, 10000);\n    } else {\n        notif_queue.push(notif_c);\n    }\n}\n\nexport function notif_alert(alert_str) {\n    let div = document.createElement(\"div\");\n    div.className = \"notification-content\";\n\n    let text = document.createElement(\"p\");\n    text.innerHTML = alert_str;\n    div.appendChild(text);\n\n    let icon = document.createElement(\"i\");\n    icon.className = \"alert fas fa-exclamation-triangle\";\n    div.appendChild(icon);\n\n    notif([icon, div]);\n}\n\nexport function notif_warn(alert_str) {\n    let div = document.createElement(\"div\");\n    div.className = \"notification-content\";\n\n    let text = document.createElement(\"p\");\n    text.innerHTML = alert_str;\n    div.appendChild(text);\n\n    let icon = document.createElement(\"i\");\n    icon.className = \"warning fas fa-exclamation-triangle\";\n    div.appendChild(icon);\n\n    notif([icon, div]);\n}\n\nexport function notif_info(info_str) {\n    let div = document.createElement(\"div\");\n    div.className = \"notification-content\";\n\n    let text = document.createElement(\"p\");\n    text.innerHTML = info_str;\n    div.appendChild(text);\n\n    let icon = document.createElement(\"i\");\n    icon.className = \"info fas fa-info-circle\";\n    div.appendChild(icon);\n\n    notif([icon, div]);\n}\n\nexport function notif_success(success_str) {\n    let div = document.createElement(\"div\");\n    div.className = \"notification-content\";\n\n    let text = document.createElement(\"p\");\n    text.innerHTML = success_str;\n    div.appendChild(text);\n\n    let icon = document.createElement(\"i\");\n    icon.className = \"success fas fa-check-circle\";\n    div.appendChild(icon);\n\n    notif([icon, div]);\n}\n","class CanvasStage {\n    canvas;\n    #dpi = window.devicePixelRatio;\n    #width;\n    #height;\n    #ctx;\n    #elements = [];\n    touches = {};\n    showTouches = false;\n\n    constructor(id, node) {\n        this.canvas = document.createElement(\"canvas\");\n        this.canvas.setAttribute(\"id\", id);\n        node.appendChild(this.canvas);\n\n        addEventListener(\"resize\", () => this.resize());\n        this.resize();\n\n        console.debug(\"Created canvas\", this.canvas);\n\n        setInterval(() => {\n            this.drawElements();\n        }, 10);\n    }\n\n    /* Resizes the canvas to be the correct size for the current screen */\n    resize() {\n        this.#ctx = this.canvas.getContext(\"2d\");\n        this.#height = +getComputedStyle(this.canvas).getPropertyValue(\"height\").slice(0, -2);\n        this.#width = +getComputedStyle(this.canvas).getPropertyValue(\"width\").slice(0, -2);\n        this.canvas.setAttribute('height', this.#height * this.#dpi);\n        this.canvas.setAttribute('width', this.#width * this.#dpi);\n    }\n\n    /* Translate a screen x coordinate to a canvas x coordinate */\n    screenToCanvasX(x) { return x * this.#dpi; }\n\n    /* Translate a screen y coordinate to a canvas y coordinate */\n    screenToCanvasY(y) { return y * this.#dpi; }\n\n    /* Get target at position, i.e. the element that intersects said position */\n    getTarget(x, y) {\n        x *= this.#dpi;\n        y *= this.#dpi;\n        for (let i = 0; i < this.#elements.length; i++) {\n            if ((this.#elements[i] instanceof TouchElement)\n                && (this.#elements[i].collides(this.#ctx, x, y))) {\n                return this.#elements[i];\n            }\n        }\n    }\n\n    /* Redraws all elements of the stage on the screen. */\n    drawElements() {\n        this.#ctx.clearRect(0, 0, this.#width * this.#dpi, this.#height * this.#dpi);\n        for (let i = 0; i < this.#elements.length; i++) {\n            this.#elements[i].draw(this.#ctx);\n        }\n        if (this.showTouches) {\n            this.drawTouches();\n        }\n    }\n\n    /* Draws all touches on the screen, used to debug */\n    drawTouches(e) {\n        const colors = [\"200, 0, 0\", \"0, 200, 0\", \"0, 0, 200\", \"200, 200, 0\", \"200, 200, 200\"]\n        for (const [identifier, touch] of Object.entries(this.touches)) {\n            this.#ctx.beginPath();\n            this.#ctx.arc(touch.x * this.#dpi, touch.y * this.#dpi, 20 * this.#dpi, 0, 2*Math.PI, true);\n            this.#ctx.fillStyle = `rgba(${colors[identifier]}, 0.2)`;\n            this.#ctx.fill();\n\n            this.#ctx.lineWidth = 2.0;\n            this.#ctx.strokeStyle = `rgba(${colors[identifier]}, 0.8)`;\n            this.#ctx.stroke();\n        }\n    }\n\n    /* Add a element to the stage */\n    addElement(element) {\n        this.#elements.push(element);\n        element.init();\n    }\n\n    /* Remove a element from the stage by id */\n    removeElementById(id) {\n        for (let i = 0; i < this.#elements.length; i++) {\n            if (id === this.#elements[i].id) {\n                this.#elements.splice(i, 1);\n                return;\n            }\n        }\n    }\n\n    /* Wipe all elements from the stage */\n    removeAllElements() {\n        this.#elements.splice(0, this.#elements.length);\n    }\n\n}\n\nclass Element {\n    gamepad;\n    id;\n    x;\n    y;\n    alignX;\n    alignY;\n    path;\n    isInside;\n    isActive;\n    type = \"Element\";\n    \n    constructor(opts, gamepad) {\n        let _opts = Object.assign({\n            id: null,\n            x: 0,\n            y: 0,\n            alignX: null,\n            alignY: null\n        }, opts);\n        this.id = _opts.id;\n        this.x = _opts.x;\n        this.y = _opts.y;\n        this.alignX = _opts.alignX;\n        this.alignY = _opts.alignY;\n        this.gamepad = gamepad;\n    }\n\n    /* Used for initializing the element onto the stage */\n    init() {}\n\n    /* Get the x-axis scaling factor (currently unused, only the y scaling factor is in use) */\n    getScaleX(ctx) { \n        return ctx.canvas.width / 100;\n    }\n\n    /* Get the y-axis scaling factor */\n    getScaleY(ctx) { \n        return ctx.canvas.height / 100;\n    }\n\n    /* Get the canvas x position of this element, adjusted from the virtual canvas coordinates */\n    getX(ctx) {\n        let x = this.x * this.getScaleY(ctx);\n        if (this.alignX === \"center\") {\n            x = (ctx.canvas.width / 2) + x;\n        }\n        if (this.alignX === \"right\") {\n            x = ctx.canvas.width - x;\n        }\n        return x;\n    }\n\n    /* Get the canvas y position of this element, adjusted from the virtual canvas coordinates */\n    getY(ctx) {\n        let y = this.y * this.getScaleY(ctx);\n        if (this.alignY === \"center\") {\n            y = (ctx.canvas.height / 2) + y;\n        }\n        if (this.alignY === \"bottom\") {\n            y = ctx.canvas.height - y;\n        }\n        return y;\n    }\n\n    /* Used to draw the element onto a canvas context */\n    draw(ctx) {}\n\n    /* Used to check wether the coordinates is inside this element */\n    collides(ctx, x, y) {\n        this.isInside = ctx.isPointInPath(this.path, x, y);\n        return this.isInside;\n    }\n\n}\n\nexport class Square extends Element {\n    draw(ctx) {\n        this.path = new Path2D();\n        let w = this.getScaleY(ctx) * 20;\n        this.path.rect(this.getX(ctx) - (w/2), this.getY(ctx) - (w/2), w, w);\n        ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n        ctx.fill(this.path);\n    }\n}\n\nclass TouchElement extends Element {\n    type = \"TouchElement\";\n    touchCount = 0;\n\n    setActive(e, doCallbacks = true) {\n        if ([\"end\", \"cancel\"].includes(e.type)) { this.touchCount--; }\n        let eState = e.type == \"start\";\n        if ((eState !== this.isActive) && (this.touchCount == 0)) {\n            this.isActive = eState;\n            if (doCallbacks) {\n                this.gamepad.handleTouchEventCallbacks(this.createTouchEventObject(\n                    this.isActive ? \"touchstart\" : \"touchend\"\n                ));\n            }\n        }\n        if (e.type == \"start\") { this.touchCount++; }\n    }\n\n    createTouchEventObject(action) {\n        return {\n            id: this.id,\n            action: action,\n            type: this.type\n        }\n    }\n\n}\n\nexport class GamepadButton extends TouchElement {\n    shape;\n    altText;\n    altTextAlign;\n    type = \"GamepadButton\";\n\n    constructor(opts) {\n        let _opts = Object.assign({\n            keyboardButton: null,\n            altText: null,\n            altTextAlign: \"left\",\n            shape: \"round\"\n        }, opts);\n        super(opts);\n        this.keyboardButton = _opts.keyboardButton;\n        this.shape = _opts.shape;\n        this.altText = _opts.altText;\n        this.altTextAlign = _opts.altTextAlign;\n    }\n\n    init() {\n        if (this.keyboardButton !== null) {\n            this.gamepad.registerKeybinding(this.keyboardButton, this);\n        }\n    }\n\n    draw(ctx) {\n        this.path = new Path2D();\n        if (this.shape === \"round\") {\n            this.path.arc(this.getX(ctx), this.getY(ctx), this.getScaleY(ctx) * 10, 0, 4*Math.PI, true);\n        } else if (this.shape === \"square\") {\n            let w = this.getScaleY(ctx) * 20;\n            this.path.rect(this.getX(ctx) - (w/2), this.getY(ctx) - (w/2), w, w);\n        }\n        if (this.isActive) {\n            ctx.fillStyle = `rgba(80, 80, 80, 1)`;\n        } else {\n            ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n        }\n        ctx.fill(this.path);\n\n        let s = `${Math.floor((this.getScaleY(ctx)*8).toString())}px 'Press Start 2P'`;\n        ctx.font = s;\n        ctx.textBaseline = \"middle\";\n        ctx.textAlign = \"center\";\n        ctx.fillStyle = `rgba(255, 255, 255, 1)`;\n        ctx.fillText(this.id, this.getX(ctx), this.getY(ctx));\n\n        if ((this.altText !== null) && (this.gamepad.showAltText)) {\n            ctx.beginPath();\n            ctx.font = `${Math.floor((this.getScaleY(ctx)*3).toString())}px 'Press Start 2P'`;\n            ctx.textBaseline = \"middle\";\n            ctx.textAlign = \"center\";\n            ctx.fillStyle = `rgba(150, 150, 150, 1)`;\n            let ax = this.getX(ctx);\n            let ay = this.getY(ctx);\n            switch (this.altTextAlign) {\n                case \"left\":\n                    ax -= (this.getScaleY(ctx) * 13);\n                    break;\n                case \"right\":\n                    ax += (this.getScaleY(ctx) * 13);\n                    break;\n                case \"top\":\n                    ay -= (this.getScaleY(ctx) * 13);\n                    break;\n                case \"bottom\":\n                    ay += (this.getScaleY(ctx) * 13);\n                    break;\n            }\n            ctx.fillText(this.altText, ax, ay);\n        }\n    }\n\n}\n\nexport class GamepadJoystick extends TouchElement {\n    type = \"GamepadJoystick\";\n    mouseX = 0;\n    mouseY = 0;\n    cR = 0;\n    cX = 0;\n    cY = 0;\n\n    #lockX;\n    #lockY;\n\n    #pressedKeys = {};\n\n    constructor(opts) {\n        let _opts = Object.assign({\n            lockX: false,\n            lockY: false,\n            autoCenter: true,\n            bindUp: null,\n            bindLeft: null,\n            bindRight: null,\n            bindDown: null\n        }, opts);\n        super(opts);\n        this.#lockX = _opts.lockX;\n        this.#lockY = _opts.lockY;\n        this.bindUp = _opts.bindUp;\n        this.bindLeft = _opts.bindLeft;\n        this.bindRight = _opts.bindRight;\n        this.bindDown = _opts.bindDown;\n    }\n\n    init() {\n        if (this.bindUp !== null) {\n            this.gamepad.registerKeybinding(this.bindUp, this);\n        }\n        if (this.bindLeft !== null) {\n            this.gamepad.registerKeybinding(this.bindLeft, this);\n        }\n        if (this.bindRight !== null) {\n            this.gamepad.registerKeybinding(this.bindRight, this);\n        }\n        if (this.bindDown !== null) {\n            this.gamepad.registerKeybinding(this.bindDown, this);\n        }\n    }\n\n    isKeyPressed(key) {\n        return ((key !== null)\n                && (this.#pressedKeys.hasOwnProperty(key))\n                && (this.#pressedKeys[key] > 0));\n    }\n\n    createTouchEventObject(action) {\n        return {\n            id: this.id,\n            action: action,\n            type: this.type,\n            x: Math.round((this.mouseX / this.cR) * 100),\n            y: Math.round((this.mouseY / this.cR) * 100)\n        }\n    }\n\n    setActive(e) {\n        super.setActive(e, false);\n        if (e.hasOwnProperty(\"key\")) {\n            if (!this.#pressedKeys.hasOwnProperty(e.key)) {\n                this.#pressedKeys[e.key] = 0;\n            }\n            if ([\"start\"].includes(e.type)) {\n                this.#pressedKeys[e.key]++;\n            }\n            if ([\"end\", \"cancel\"].includes(e.type)) {\n                this.#pressedKeys[e.key]--;\n            }\n        }\n\n        let max = this.cR\n        if (!this.#lockX) {\n            if (e.hasOwnProperty(\"x\")) {\n                this.mouseX = this.cX - this.gamepad.stage.screenToCanvasX(e.x);\n                this.mouseX = Math.min(Math.abs(this.mouseX), max) * Math.sign(this.mouseX); \n                this.mouseX *= -1;\n            }\n            if (this.isKeyPressed(this.bindLeft)) { this.mouseX = -max; } \n            if (this.isKeyPressed(this.bindRight)) { this.mouseX = max; }\n            if (this.isKeyPressed(this.bindLeft) && this.isKeyPressed(this.bindRight)) { this.mouseX = 0; }\n            if (!this.isActive) { this.mouseX = 0; }\n        }\n        if (!this.#lockY) {\n            if (e.hasOwnProperty(\"y\")) {\n                this.mouseY = this.cY - this.gamepad.stage.screenToCanvasY(e.y);\n                this.mouseY = Math.min(Math.abs(this.mouseY), max) * Math.sign(this.mouseY); \n            } \n            if (this.isKeyPressed(this.bindUp)) { this.mouseY = max; } \n            if (this.isKeyPressed(this.bindDown)) { this.mouseY = -max; }\n            if (this.isKeyPressed(this.bindUp) && this.isKeyPressed(this.bindDown)) { this.mouseY = 0; }\n            if (!this.isActive) { this.mouseY = 0; }\n        }\n\n        let action = \"touchmove\";\n        if (this.isActive && (this.touchCount == 1) && (e.type === \"start\")) {\n            action = \"touchstart\";\n        }\n        if (!this.isActive) {\n            action = \"touchend\";\n        }\n        this.gamepad.handleTouchEventCallbacks(this.createTouchEventObject(action));\n    }\n\n    draw(ctx) {\n        this.cX = this.getX(ctx);\n        this.cY = this.getY(ctx);\n        this.cR = this.getScaleY(ctx) * 25;\n\n        this.path = new Path2D();\n        this.path.arc(this.cX, this.cY, this.cR, 0, 4*Math.PI, true);\n        if (this.isActive) {\n            ctx.fillStyle = `rgba(85, 85, 85, 0.8)`;\n        } else {\n            ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n        }\n        ctx.fill(this.path);\n\n        ctx.beginPath();\n        ctx.arc(this.cX + this.mouseX, this.cY - this.mouseY, this.getScaleY(ctx) * 15, 0, 4*Math.PI, true);\n        ctx.fillStyle = `rgba(130, 130, 130, 1)`;\n        ctx.fill();\n\n    }\n\n}\n\nexport class Gamepad {\n    stage;\n    #width;\n    #height;\n\n    #touches = {};\n    #keybindings = {};\n    #keystates = {};\n    #touchEventCallbacks = [];\n\n    showDebug = false;\n    showAltText = true;\n    enableVibration = true;\n\n    constructor() {\n        this.stage = new CanvasStage(\"GamePad\", document.querySelector(\".gamepad-wrapper\"));\n        this.addEventListeners();\n    }\n\n    addEventListeners() {\n        let ev = [\"keydown\", \"keyup\"];\n        for(var e in ev) {\n            document.addEventListener(ev[e], (e) => this.handleKeyEvent(e), false);\n        }\n        ev = [\"touchstart\", \"touchend\", \"touchcancel\", \"touchmove\"];\n        for(var e in ev) {\n            this.stage.canvas.addEventListener(ev[e], (e) => this.handleTouchEvent(e), false);\n        }\n        ev = [\"mousedown\", \"mouseup\", \"mousemove\"];\n        for(var e in ev) {\n            this.stage.canvas.addEventListener(ev[e], (e) => this.handleMouseEvent(e), false);\n        }\n    }\n\n    /* Used by stage elements to register themselves with some keybinding */\n    registerKeybinding(binding, element) {\n        this.#keybindings[binding] = element;\n    }\n\n    /* Event handler for keyboard events */\n    handleKeyEvent(e) {\n        const typedict = {\"keydown\": \"start\", \"keyup\": \"end\"}\n        if (!this.#keystates.hasOwnProperty(e.keyCode)) {\n            this.#keystates[e.keyCode] = {pressed: false};\n        }\n        if (this.#keybindings.hasOwnProperty(e.key)) {\n            let id = `Key ${e.key}`\n            let target = this.#keybindings[e.key];\n            let gtEvent = {\n                touchId: id,\n                key: e.key,\n                type: typedict[e.type]\n            };\n            switch (e.type) {\n                case \"keydown\":\n                    if (this.#keystates[e.keyCode].pressed) { return; }\n                    this.#keystates[e.keyCode].pressed = true;\n\n                    this.#touches[id] = {};\n                    this.#touches[id].target = target;\n                    if (this.#touches[id].hasOwnProperty(\"target\")\n                        && this.#touches[id].target != null) {\n                        this.#touches[id].target.setActive(gtEvent);\n                    }\n                    break;\n                case \"keyup\":\n                    if (!this.#keystates[e.keyCode].pressed) { return; }\n                    this.#keystates[e.keyCode].pressed = false;\n\n                    if (this.#touches[id].hasOwnProperty(\"target\")\n                        && this.#touches[id].target != null) {\n                        this.#touches[id].target.setActive(gtEvent);\n                    }\n                    delete this.#touches[id];\n                    break;\n            }\n        }\n        this.stage.touches = this.#touches;\n        this.debugTouches();\n    }\n\n    /* Event handler for mouse events, will just translate the event to a more common form\n     * before further processing. */\n    handleMouseEvent(e) {\n        const typedict = {\"mousedown\": \"start\", \"mouseup\": \"end\", \"mousemove\": \"move\"}\n        this.processGamepadTouchEvent({\n            x: e.clientX,\n            y: e.clientY,\n            touchId: \"mouse\",\n            type: typedict[e.type]\n        });\n    }\n\n    /* Event handler for touch events, will just translate the event to a more common form\n     * before further processing. */\n    handleTouchEvent(e) {\n        e.preventDefault();\n        const typedict = {\"touchstart\": \"start\", \"touchend\": \"end\", \"touchcancel\": \"end\", \"touchmove\": \"move\"}\n        for (let i = 0; i < e.changedTouches.length; i++) {\n            let touch = e.changedTouches[i];\n            this.processGamepadTouchEvent({\n                x: touch.clientX,\n                y: touch.clientY,\n                touchId: touch.identifier,\n                type: typedict[e.type]\n            });\n        }\n    }\n\n    /* Event handler for processing standarized touch/mouse events. */\n    processGamepadTouchEvent(gtEvent) {\n        let target = this.stage.getTarget(gtEvent.x, gtEvent.y)\n        switch (gtEvent.type) {\n            case \"start\":\n                this.#touches[gtEvent.touchId] = {};\n                this.#touches[gtEvent.touchId].target = target;\n            case \"move\":\n                if (this.#touches.hasOwnProperty(gtEvent.touchId)) {\n                    this.#touches[gtEvent.touchId].x = gtEvent.x;\n                    this.#touches[gtEvent.touchId].y = gtEvent.y;\n\n                    if (this.#touches[gtEvent.touchId].hasOwnProperty(\"target\")\n                        && this.#touches[gtEvent.touchId].target != null) {\n                        this.#touches[gtEvent.touchId].target.setActive(gtEvent);\n                    }\n                }\n                break;\n\n            case \"end\":\n            case \"cancel\":\n                if (this.#touches[gtEvent.touchId].hasOwnProperty(\"target\")\n                    && this.#touches[gtEvent.touchId].target != null) {\n                    this.#touches[gtEvent.touchId].target.setActive(gtEvent);\n                }\n                delete this.#touches[gtEvent.touchId];\n                break;\n\n            default:\n                console.log(\"Unknown touch event\", gtEvent.type);\n        }\n        this.stage.touches = this.#touches;\n        this.debugTouches();\n    }\n\n    /* Update the debug text with all current touches */\n    debugTouches() {\n        let s = \"\";\n        if (this.showDebug) {\n            for (const [i, t] of Object.entries(this.#touches)) {\n                s += `[${i}] `\n                if (t.hasOwnProperty(\"x\")) {\n                    s += `x: ${Math.round(t.x, 2)}, y: ${Math.round(t.y)},`\n                }\n                s += `target: ${t.target ? t.target.id : null}\\n`;\n            }\n        }\n        document.querySelector(\".gamepad-touches\").innerHTML = s;\n    }\n\n    /* Used by elements to process callbacks on actions to outside the gamepad */\n    handleTouchEventCallbacks(e) {\n        if (this.enableVibration && [\"touchstart\", \"touchend\"].includes(e.action)) {\n            try {\n                window.navigator.vibrate(5);\n            } catch (e) {\n                console.error(e);\n            }\n        }\n        for (let i = 0; i < this.#touchEventCallbacks.length; i++) {\n            this.#touchEventCallbacks[i](e);\n        }\n    }\n\n    /* Register a method as a callback for gamepad touch events */\n    onTouchEvent(callback) {\n        this.#touchEventCallbacks.push(callback);\n    }\n\n    /* Add a list of elements to the gamepad stage */\n    addElements(elements) {\n        for (let i = 0; i < elements.length; i++) {\n            elements[i].gamepad = this;\n            this.stage.addElement(elements[i]);\n        }\n    }\n\n    /* Remove a list of elements from the gamepad stage by id */\n    removeElementsById(elementIds) {\n        for (let i = 0; i < elementIds.length; i++) {\n            this.stage.removeElementById(elementIds[i]);\n        }\n    }\n\n    /* Remove all elements from the gamepad stage */\n    removeAllElements() {\n        this.stage.removeAllElements();\n    }\n\n    /* Initialize gamepad with a predefined layout */\n    setGamepadLayout(variant) {\n        console.debug(`Setting the gamepad layout to ${variant}, deleting all current elements.`);\n        this.removeAllElements();\n        switch (variant) {\n            case \"1\":\n                this.addElements([\n                    new Square({id: \"filler1\", x: 40,  y: 0, alignX: \"left\",  alignY: \"center\"}),\n                    new GamepadButton({id: \"C\", x: 20, y:   0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowLeft\", altText: \"◀\", altTextAlign: \"right\"}),\n                    new GamepadButton({id: \"D\", x: 60, y:   0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowRight\",altText: \"▶\", altTextAlign: \"left\"}),\n                    new GamepadButton({id: \"A\", x: 40, y: -20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowUp\",   altText: \"▲\", altTextAlign: \"bottom\"}),\n                    new GamepadButton({id: \"B\", x: 40, y:  20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowDown\", altText: \"▼\", altTextAlign: \"top\"}),\n                    new GamepadButton({id: \"3\", x: 20, y:   0, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"3\", altText: \"3\", altTextAlign: \"left\"}),\n                    new GamepadButton({id: \"4\", x: 60, y:   0, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"4\", altText: \"4\", altTextAlign: \"right\"}),\n                    new GamepadButton({id: \"1\", x: 40, y: -20, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"1\", altText: \"1\", altTextAlign: \"bottom\"}),\n                    new GamepadButton({id: \"2\", x: 40, y:  20, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"2\", altText: \"2\", altTextAlign: \"top\"}),\n                ])\n                break;\n            case \"2\":\n                this.addElements([\n                    new Square({id: \"filler2\", x: 40,  y: 0, alignX: \"right\",  alignY: \"center\"}),\n                    new Square({id: \"filler1\", x: 40,  y: 0, alignX: \"left\",  alignY: \"center\"}),\n                    new GamepadButton({id: \"C\", x: 20, y:   0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowLeft\", altText: \"◀\", altTextAlign: \"right\"}),\n                    new GamepadButton({id: \"D\", x: 60, y:   0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowRight\",altText: \"▶\", altTextAlign: \"left\"}),\n                    new GamepadButton({id: \"A\", x: 40, y: -20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowUp\",   altText: \"▲\", altTextAlign: \"bottom\"}),\n                    new GamepadButton({id: \"B\", x: 40, y:  20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowDown\", altText: \"▼\", altTextAlign: \"top\"}),\n                    new GamepadButton({id: \"3\", x: 20, y:   0, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"3\"}),\n                    new GamepadButton({id: \"4\", x: 60, y:   0, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"4\"}),\n                    new GamepadButton({id: \"1\", x: 40, y: -20, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"1\"}),\n                    new GamepadButton({id: \"2\", x: 40, y:  20, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"2\"}),\n                ])\n                break;\n            case \"9\":\n                this.addElements([\n                    new GamepadJoystick({id: \"left\", x: 40, y:  0, alignX: \"left\",  alignY: \"center\", lockX: true, bindUp: \"ArrowUp\", bindDown: \"ArrowDown\"}),\n                    new GamepadJoystick({id: \"right\", x: 40, y:  0, alignX: \"right\", alignY: \"center\", lockY: true, bindLeft: \"ArrowLeft\", bindRight: \"ArrowRight\"})\n                ]);\n                break;\n        }\n    }\n\n}\n","import { uBitBLE, MESEvents } from \"./uBit\";\nimport { notif_alert, notif_warn, notif_info, notif_success } from './notification';\nimport { Gamepad } from './gamepad';\n\n/* Attempt to install service worker */\nlet sw = \"service-worker.js\";\nif (navigator.serviceWorker) {\n    navigator.serviceWorker.register(\n        sw, {scope: '/microbit-gamepad/'}\n    ).then(registration => {\n        registration.onupdatefound = () => {\n            const installingWorker = registration.installing;\n            if (installingWorker == null) { return; }\n            installingWorker.onstatechange = () => {\n                if (installingWorker.state === \"installed\") {\n                    if (navigator.serviceWorker.controller) {\n                        notif_info(\"New content is available, relaunch the app to install it.\");\n                    } else {\n                        notif_success(\"Content is cached for offline use.\");\n                    }\n                }\n            };\n        };\n        registration.update();\n    }).catch(error => {\n        notif_warn(\"Could not install service worker...\");\n        console.error(\"Error during service worker registration:\", error);\n    });\n}\n\n/* Allow the ignore-landscape-warning button to work */\ndocument.getElementById(\"btn_ignore_landscape_warning\").addEventListener(\"click\", () => {\n    document.body.classList.add(\"ignore-landscape-warning\");\n});\n\n/* Show a warning if bluetooth is unavailable in the browser. */\nif (!navigator.bluetooth) {\n    //alert(\"Bluetooth not enabled in your browser, this won't work...\");\n    console.error(\"You do not have a bluetooth enabled browser, you need to have a bluetooth enabled browser...\");\n    notif_alert(\"Your browser does not seem to support bluetooth, try using Google Chrome or Microsoft Edge.\");\n}\n\n/* Define and initialize things */\nlet gamepad = new Gamepad();\nwindow.gamepad = gamepad;\nlet ubit = new uBitBLE();\nwindow.ubit = ubit;\n\n/* Setup storage and picker for the gamepad layout */\ndocument.querySelector(\".settings-dialog #layout\").addEventListener(\"change\", (v) => {\n    gamepad.setGamepadLayout(v.target.value);\n    localStorage.setItem(\"gamepadLayout\", v.target.value);\n    document.querySelector(\".button-states pre\").innerHTML = \"No buttons pressed yet\";\n});\nif (localStorage.getItem(\"gamepadLayout\") === null) { localStorage.setItem(\"gamepadLayout\", \"1\"); }\ngamepad.setGamepadLayout(localStorage.getItem(\"gamepadLayout\"));\ndocument.querySelector(\".button-states pre\").innerHTML = \"No buttons pressed yet\";\ndocument.querySelector(\".settings-dialog #layout\").value = localStorage.getItem(\"gamepadLayout\");\n\n/* Setup storage for toggling touches */\ndocument.querySelector(\".settings-dialog #show-touches\").addEventListener(\"change\", (v) => {\n    gamepad.stage.showTouches = v.target.checked;\n    localStorage.setItem(\"showTouches\", v.target.checked);\n});\nif (localStorage.getItem(\"showTouches\") === null) { localStorage.setItem(\"showTouches\", false); }\ngamepad.stage.showTouches = localStorage.getItem(\"showTouches\") == \"true\";\ndocument.querySelector(\".settings-dialog #show-touches\").checked = localStorage.getItem(\"showTouches\") == \"true\";\n\n/* Setup storage for toggling alt text */\ndocument.querySelector(\".settings-dialog #show-gamepad-alt-text\").addEventListener(\"change\", (v) => {\n    gamepad.showAltText = v.target.checked;\n    localStorage.setItem(\"showAltText\", v.target.checked);\n});\nif (localStorage.getItem(\"showAltText\") === null) { localStorage.setItem(\"showAltText\", false); }\ngamepad.showAltText = localStorage.getItem(\"showAltText\") == \"true\";\ndocument.querySelector(\".settings-dialog #show-gamepad-alt-text\").checked = localStorage.getItem(\"showAltText\") == \"true\";\n\n/* Setup storage for toggling vibration/haptic feedback */\ndocument.querySelector(\".settings-dialog #enable-haptic\").addEventListener(\"change\", (v) => {\n    gamepad.enableVibration = v.target.checked;\n    localStorage.setItem(\"enableHaptic\", v.target.checked);\n});\nif (localStorage.getItem(\"enableHaptic\") === null) { localStorage.setItem(\"enableHaptic\", true); }\ngamepad.enableVibration = localStorage.getItem(\"enableHaptic\") == \"true\";\ndocument.querySelector(\".settings-dialog #enable-haptic\").checked = localStorage.getItem(\"enableHaptic\") == \"true\";\n\n/* Setup storage for toggling debug mode */\ndocument.querySelector(\".settings-dialog #enable-debug\").addEventListener(\"change\", (v) => {\n    gamepad.showDebug = v.target.checked;\n    if (v.target.checked) {\n        document.body.classList.add(\"debug\");\n    } else {\n        document.body.classList.remove(\"debug\");\n    }\n    localStorage.setItem(\"enableDebug\", v.target.checked);\n});\nif (localStorage.getItem(\"enableDebug\") === null) { localStorage.setItem(\"enableDebug\", false); }\ngamepad.showDebug = localStorage.getItem(\"enableDebug\") == \"true\";\nif (localStorage.getItem(\"enableDebug\") === \"true\") {\n    document.body.classList.add(\"debug\");\n} else {\n    document.body.classList.remove(\"debug\");\n}\ndocument.querySelector(\".settings-dialog #enable-debug\").checked = localStorage.getItem(\"enableDebug\") == \"true\";\n\n/* Setup buttons for opening/closing settings panel */\ndocument.querySelector(\"#btn_show_settings\").addEventListener(\"click\", () => {\n    document.querySelector(\".settings-dialog\").classList.add(\"shown\");\n});\ndocument.querySelector(\"#btn_hide_settings\").addEventListener(\"click\", () => {\n    document.querySelector(\".settings-dialog\").classList.remove(\"shown\");\n});\n\n/* Setup actions for bluetooth connect/disconnect buttons */\ndocument.querySelector(\"#btn_disconnect\").addEventListener(\"click\", () => {\n    ubit.disconnect();\n});\ndocument.getElementById(\"btn_connect\").addEventListener(\"click\", () => {\n    if (!navigator.bluetooth) {\n        notif_alert(\"You need a bluetooth enabled browser for this app to work, try chrome.\");\n    }\n    ubit.searchDevice();\n});\n\n/* Handle gamepad events */\nlet gamepadState = {};\ngamepad.onTouchEvent(e => {\n    /* This is just for the debug data */\n    if ([\"touchstart\", \"touchmove\"].includes(e.action)) {\n        gamepadState[e.id] = {state: true, ...e};\n    }\n    if ([\"touchend\"].includes(e.action)) {\n        gamepadState[e.id] = {state: false, ...e};\n    }\n    let debugString = \"\";\n    for (const [key, value] of Object.entries(gamepadState)) {\n        debugString += `${key}: ${value.state ? 'Pressed' : 'Not pressed'}`;\n        if (value.hasOwnProperty(\"x\")) {\n            debugString += ` (x: ${value.x}, y: ${value.y})`;\n        }\n        debugString += `\\n`;\n    }\n    document.querySelector(\".button-states pre\").innerHTML = debugString;\n});\n\ngamepad.onTouchEvent(e => {\n    const event_type = MESEvents.MES_DPAD_CONTROLLER_ID;\n    let event_value = null;\n    if (e.action == \"touchstart\") {\n        if        (e.id == \"A\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_A_DOWN;\n        } else if (e.id == \"B\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_B_DOWN;\n        } else if (e.id == \"C\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_C_DOWN;\n        } else if (e.id == \"D\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_D_DOWN;\n        } else if (e.id == \"1\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_1_DOWN;\n        } else if (e.id == \"2\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_2_DOWN;\n        } else if (e.id == \"3\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_3_DOWN;\n        } else if (e.id == \"4\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_4_DOWN;\n        }\n    } else if (e.action == \"touchend\") {\n        if        (e.id == \"A\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_A_UP;\n        } else if (e.id == \"B\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_B_UP;\n        } else if (e.id == \"C\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_C_UP;\n        } else if (e.id == \"D\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_D_UP;\n        } else if (e.id == \"1\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_1_UP;\n        } else if (e.id == \"2\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_2_UP;\n        } else if (e.id == \"3\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_3_UP;\n        } else if (e.id == \"4\") {\n            event_value = MESEvents.MES_DPAD_BUTTON_4_UP;\n        }\n    }\n    if ((ubit.isConnected()) && (event_value != null)) {\n        ubit.eventService.sendEvent(event_type, event_value);\n    }\n});\n\n/* Setup handlers for ubit (bluetooth) events */\nubit.onConnect(() => {\n    document.body.classList.add(\"connected\");\n});\n\nubit.onDisconnect(() => {\n    document.body.classList.remove(\"connected\");\n});\n\n"]}