{
  "version": 3,
  "sources": ["../src/listeners.ts", "../src/index.ts"],
  "sourcesContent": [
    "let bunWs: WebSocket,\n    bunToken: string;\n\nconst evalHandler = async (payload: {\n    detail: {\n        js: string,\n        requestId: string\n    }\n}) => {\n    try {\n        // eslint-disable-next-line no-eval\n        const val = await (0, eval)(payload.detail.js);\n        // ⬆️ (0, eval) is used to execute the code in global scope\n        bunWs.send(JSON.stringify({\n            token: bunToken,\n            command: 'execResult',\n            id: payload.detail.requestId,\n            returnValue: val\n        }));\n    } catch (e) {\n        bunWs.send(JSON.stringify({\n            token: bunToken,\n            command: 'execResult',\n            id: payload.detail.requestId,\n            error: e.message,\n            stack: e.stack\n        }));\n    }\n};\n\nexport default async (\n    neutralino: Awaited<typeof import('@neutralinojs/lib')>,\n    token: string,\n    ws: WebSocket\n) => {\n    bunWs = ws;\n    bunToken = token;\n    neutralino.events.on('buntralinoEval', evalHandler);\n    neutralino.events.on('buntralinoNavigate', (event: {\n        detail: {\n            url: string\n        }\n    }) => {\n        window.location.href = event.detail.url;\n    });\n    neutralino.events.on('buntralinoReload', () => {\n        window.location.reload();\n    });\n};\n",
    "import listeners from './listeners';\nconst getUid = () => Date.now().toString(36) + Math.random().toString(36);\n\nlet neutralino: Awaited<typeof import('@neutralinojs/lib')>;\nif (window.Neutralino) {\n    neutralino = window.Neutralino;\n}\n\nlet bunToken: string, bunPort: number, bunWs: WebSocket;\nlet readyResolve: (value: void | PromiseLike<void>) => void,\n    readyReject: (reason?: Error) => void;\nconst readyPromise = new Promise<void>((resolve, reject) => {\n    readyResolve = resolve;\n    readyReject = reject;\n});\n\nlet bunCheckEnabled = true;\nexport const disableBunCheck = () => {\n    bunCheckEnabled = false;\n};\n\n(async () => {\n    if (!neutralino!) {\n        neutralino = (await import('@neutralinojs/lib')).default;\n    }\n    neutralino.events.on('ready', async () => {\n        // Firstly check that this window was opened with Buntralino\n        if (bunCheckEnabled &&\n            window.NL_RESMODE === 'bundle' &&\n            !window.NL_ARGS.some(a => a.startsWith('--buntralino-name='))\n        ) {\n            // Open the actual Buntralino app and exit\n            const config = await neutralino.app.getConfig();\n            let execPath = `${window.NL_CWD}/${config.cli.binaryName}`;\n            if (window.NL_OS === 'Windows') {\n                execPath += '.exe';\n            }\n            try {\n                // Check if the file exists\n                neutralino.filesystem.getStats(execPath);\n                // Run the proper executable and detach it\n                await neutralino.os.execCommand(`\"${execPath}\"`, {\n                    background: true,\n                    cwd: window.NL_CWD\n                });\n                neutralino.app.exit();\n            } catch (error) {\n                window.alert('\"neutralino\" is not the main executable! Please run the other one.');\n                neutralino.app.exit();\n            } finally {\n                return;\n            }\n        }\n\n        // Try connecting to Buntralino\n        try {\n            const match1 = window.NL_ARGS.find(a => a.startsWith('--buntralino-port=')),\n                  match2 = window.NL_ARGS.find(a => a.startsWith('--buntralino-name='));\n            if (!match1 || !match2) {\n                return;\n            }\n            const [, port] = match1.split('=');\n            const [, name] = match2.split('=');\n            const neuToken = window.NL_TOKEN || sessionStorage.NL_TOKEN;\n            bunWs = new WebSocket(`ws://127.0.0.1:${port}`);\n            bunWs.onopen = () => {\n                // eslint-disable-next-line no-console\n                console.debug('⚛️ Announcing ourself to Buntralino…');\n                bunWs.send(JSON.stringify({\n                    command: 'announceSelf',\n                    name,\n                    NL_PORT: window.NL_PORT,\n                    NL_TOKEN: neuToken\n                }));\n            };\n\n            const listener = (payload: {\n                detail: {\n                    token: string,\n                    port: number\n                }\n            }) => {\n                neutralino.events.off('buntralinoRegisterParent', listener);\n                if (!payload.detail.token || !payload.detail.port) {\n                    return;\n                }\n                bunToken = payload.detail.token;\n                bunPort = payload.detail.port;\n                bunWs = new WebSocket(`ws://127.0.0.1:${bunPort}`);\n                bunWs.onopen = () => {\n                    listeners(neutralino, bunToken, bunWs);\n                    // eslint-disable-next-line no-console\n                    console.log('⚛️🥟 Buntralino connected on port', bunPort);\n                    readyResolve();\n                };\n            };\n            neutralino.events.on('buntralinoRegisterParent', listener);\n        } catch (error) {\n            readyReject(error);\n            console.error('⚛️ Buntralino failed with', error);\n        }\n    });\n    // Initialize Neutralino just in case the app developer didn't do it themselves\n    neutralino.init();\n})();\n\n/**\n * Runs a method registered through registerMethod or registerMethodMap on Bun side.\n * Payload can be any JSON serializable value.\n * Returns a Promise that resolves with the result of the method or rejects with an Error.\n *\n * Example:\n * ```js\n * await buntralino.run('downloadFile', {\n *     src: 'https://secret.bunnies.io/builds/windows.exe',\n *     dest: 'dependencies/secretBunnies.exe'\n * });\n * ```\n */\nexport const run = async (methodName: string, payload?: unknown): Promise<unknown> => {\n    await readyPromise;\n    const awaitedResponseId = getUid();\n    bunWs.send(JSON.stringify({\n        token: bunToken,\n        command: 'run',\n        method: methodName,\n        id: awaitedResponseId,\n        payload\n    }));\n    return new Promise<unknown>((resolve, reject) => {\n        const listener = (event: CustomEvent<{\n            id: string,\n            returnValue?: unknown,\n            error?: string | null,\n            stack?: string | null\n        }>) => {\n            const {id, returnValue, error, stack} = event.detail;\n            if (id === awaitedResponseId) {\n                neutralino.events.off('buntralinoExecResult', listener);\n                if ('error' in event.detail) {\n                    reject(new Error(error ?? 'Unknown error', {\n                        cause: stack ? new Error(stack) : null\n                    }));\n                }\n                resolve(returnValue);\n            }\n        };\n        neutralino.events.on('buntralinoExecResult', listener);\n    });\n};\n\n/**\n * Fully shuts down the Buntralino app.\n */\nexport const shutdown = () => {\n    bunWs.send(JSON.stringify({\n        token: bunToken,\n        command: 'shutdown'\n    }));\n};\n\n/**\n * Sends an event with additional event.detail value to all the Neutralino instances.\n *\n * Example:\n * ```js\n * buntralino.broadcast('newUpdate', {\n *     version: '1.4.2'\n * });\n * ```\n */\nexport const broadcast = (eventName: string, payload: unknown) => {\n    bunWs.send(JSON.stringify({\n        token: bunToken,\n        command: 'broadcast',\n        event: eventName,\n        payload\n    }));\n};\n/**\n * Sends an event with additional event.detail value to a specific named Neutralino instance.\n *\n * Example:\n * ```js\n * buntralino.sendEvent('main', 'loginSuccessful', {\n *     username: 'Doofus3000'\n * });\n * ```\n */\nexport const sendEvent = (target: string, eventName: string, payload?: unknown) => {\n    bunWs.send(JSON.stringify({\n        token: bunToken,\n        command: 'sendEvent',\n        event: eventName,\n        target,\n        payload\n    }));\n};\n\n/**\n * A Promise that resolves when the Buntralino client is ready to accept commands.\n */\nexport const ready = readyPromise;\n\nexport default {\n    run,\n    ready,\n    shutdown,\n    broadcast,\n    sendEvent\n};\n"
  ],
  "mappings": "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",
  "debugId": "2A5E97728ECE554464756E2164756E21",
  "names": []
}