buntralino-client
Version:
Neutralino.js library for Buntralino. Buntralino unites Bun and Neutralino.js to make a simpler, lighter alternative to Electron and NW.js. Use Neutralino.js API at client and send harder tasks to Bun while keeping your development process easy.
11 lines • 11.3 kB
Source Map (JSON)
{
"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": []
}