@bigio/better-auth-electron 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/web.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js","../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js","../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/lifecycle/index.js","../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/listen-keys/index.js","../node_modules/.pnpm/@nanostores+react@1.0.0_nanostores@1.1.0_react@19.2.4/node_modules/@nanostores/react/index.js","../src/options/electron-plugin-options.ts","../node_modules/.pnpm/@oslojs+encoding@1.1.0/node_modules/@oslojs/encoding/dist/base32.js","../node_modules/.pnpm/@oslojs+encoding@1.1.0/node_modules/@oslojs/encoding/dist/base64.js","../src/utils/electron-plugin-env.ts","../src/utils/electron-plugin-utils.ts","../src/web/electron-web-clientHelper.ts","../src/web/electron-web-plugin.ts"],"names":["EncodingPadding","DecodingPadding"],"mappings":"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","file":"web.js","sourcesContent":["import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","import { clean } from '../clean-stores/index.js'\n\nconst START = 0\nconst STOP = 1\nconst SET = 2\nconst NOTIFY = 3\nconst MOUNT = 5\nconst UNMOUNT = 6\nconst REVERT_MUTATION = 10\n\nexport let on = (object, listener, eventKey, mutateStore) => {\n object.events = object.events || {}\n if (!object.events[eventKey + REVERT_MUTATION]) {\n object.events[eventKey + REVERT_MUTATION] = mutateStore(eventProps => {\n // eslint-disable-next-line no-sequences\n object.events[eventKey].reduceRight((event, l) => (l(event), event), {\n shared: {},\n ...eventProps\n })\n })\n }\n object.events[eventKey] = object.events[eventKey] || []\n object.events[eventKey].push(listener)\n return () => {\n let currentListeners = object.events[eventKey]\n let index = currentListeners.indexOf(listener)\n currentListeners.splice(index, 1)\n if (!currentListeners.length) {\n delete object.events[eventKey]\n object.events[eventKey + REVERT_MUTATION]()\n delete object.events[eventKey + REVERT_MUTATION]\n }\n }\n}\n\nexport let onStart = ($store, listener) =>\n on($store, listener, START, runListeners => {\n let originListen = $store.listen\n $store.listen = arg => {\n if (!$store.lc && !$store.starting) {\n $store.starting = true\n runListeners()\n delete $store.starting\n }\n return originListen(arg)\n }\n return () => {\n $store.listen = originListen\n }\n })\n\nexport let onStop = ($store, listener) =>\n on($store, listener, STOP, runListeners => {\n let originOff = $store.off\n $store.off = () => {\n runListeners()\n originOff()\n }\n return () => {\n $store.off = originOff\n }\n })\n\nexport let onSet = ($store, listener) =>\n on($store, listener, SET, runListeners => {\n let originSet = $store.set\n let originSetKey = $store.setKey\n if ($store.setKey) {\n $store.setKey = (changed, changedValue) => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({\n abort,\n changed,\n newValue: { ...$store.value, [changed]: changedValue }\n })\n if (!isAborted) return originSetKey(changed, changedValue)\n }\n }\n $store.set = newValue => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({ abort, newValue })\n if (!isAborted) return originSet(newValue)\n }\n return () => {\n $store.set = originSet\n $store.setKey = originSetKey\n }\n })\n\nexport let onNotify = ($store, listener) =>\n on($store, listener, NOTIFY, runListeners => {\n let originNotify = $store.notify\n $store.notify = (oldValue, changed) => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({ abort, changed, oldValue })\n if (!isAborted) return originNotify(oldValue, changed)\n }\n return () => {\n $store.notify = originNotify\n }\n })\n\nexport let STORE_UNMOUNT_DELAY = 1000\n\nexport let onMount = ($store, initialize) => {\n let listener = payload => {\n let destroy = initialize(payload)\n if (destroy) $store.events[UNMOUNT].push(destroy)\n }\n return on($store, listener, MOUNT, runListeners => {\n let originListen = $store.listen\n $store.listen = (...args) => {\n if (!$store.lc && !$store.active) {\n $store.active = true\n runListeners()\n }\n return originListen(...args)\n }\n\n let originOff = $store.off\n $store.events[UNMOUNT] = []\n $store.off = () => {\n originOff()\n setTimeout(() => {\n if ($store.active && !$store.lc) {\n $store.active = false\n for (let destroy of $store.events[UNMOUNT]) destroy()\n $store.events[UNMOUNT] = []\n }\n }, STORE_UNMOUNT_DELAY)\n }\n\n if (process.env.NODE_ENV !== 'production') {\n let originClean = $store[clean]\n $store[clean] = () => {\n for (let destroy of $store.events[UNMOUNT]) destroy()\n $store.events[UNMOUNT] = []\n $store.active = false\n originClean()\n }\n }\n\n return () => {\n $store.listen = originListen\n $store.off = originOff\n }\n })\n}\n","export function listenKeys($store, keys, listener) {\n let keysSet = new Set(keys).add(undefined)\n return $store.listen((value, oldValue, changed) => {\n if (keysSet.has(changed)) {\n listener(value, oldValue, changed)\n }\n })\n}\n\nexport function subscribeKeys($store, keys, listener) {\n let unbind = listenKeys($store, keys, listener)\n listener($store.value)\n return unbind\n}\n","import { listenKeys } from 'nanostores'\nimport { useCallback, useRef, useSyncExternalStore } from 'react'\n\nlet emit = (snapshotRef, onChange) => value => {\n if (snapshotRef.current === value) return\n snapshotRef.current = value\n onChange()\n}\n\nexport function useStore(store, { keys, deps = [store, keys] } = {}) {\n let snapshotRef = useRef()\n snapshotRef.current = store.get()\n\n let subscribe = useCallback(onChange => {\n emit(snapshotRef, onChange)(store.value)\n\n return keys?.length > 0\n ? listenKeys(store, keys, emit(snapshotRef, onChange))\n : store.listen(emit(snapshotRef, onChange))\n }, deps)\n let get = () => snapshotRef.current\n\n return useSyncExternalStore(subscribe, get, get)\n}\n","// root/src/utils/electron-plugin-options.ts\n\nimport type { BetterAuthClientOptions, Session, User } from 'better-auth'\nimport type { AuthClient } from 'better-auth/client'\nimport type { BrowserWindow } from 'electron'\n// import { renderOAuthPage } from '../preact/electron-login'\n// import type { BigIOError } from '../utils/electron-plugin-env'\n\nexport type ElectronServerPluginOptions = {\n /**\n * The custom protocol scheme used for deep linking authentication.\n * @remarks\n * This should match the protocol registered in your Electron Main Process.\n * Do not include the `://` suffix.\n * @example \"bigio\" to be like \"bigio://better-auth-callback\"\n */\n ELECTRON_SCHEME: string\n PROVIDERS: string[]\n // baseURL?: string\n // cookiePrefix?: string\n // logger?: typeof bigIOLogger | typeof logsgh\n debugMode?: boolean\n WEB_ERROR_PAGE_URL?: string\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME?: string\n ELECTRON_TO_BACKEND_HOST_PATH?: string\n ELECTRON_APP_HOST?: string\n\n /**\n * The specific action path or host used to identify the auth callback.\n * This will be combined with the scheme to form the full callback URL.\n * Format: `${scheme}://${hostname}`\n * @example \"better-auth-callback\"\n * // Resulting URL: \"bigio://better-auth-callback\"\n */\n ELECTRON_CALLBACK_HOST_PATH?: string\n /**\n * The IPC event name used to receive deep link URLs from the main process.\n * @example \"deep-link-received\"\n */\n DEEPLINK_EVENT_NAME?: string\n /**\n * The IPC event name used to notify the main process that the renderer app is mounted.\n * @example \"renderer-app-mounted\"\n */\n APP_MOUNTED_EVENT_NAME?: string\n /**\n * The URL path for the backend exchange endpoint to exchange the JWT ticket.\n * @example \"/electron/exchange\"\n */\n BACKEND_EXCHANGE_URL?: string\n BACKEND_FAST_TICKET_URL?: string\n BACKEND_LOGIN_URL?: string\n PREACT_LOGIN_PAGE?: (\n baseURL?: string | undefined,\n scheme?: string | undefined,\n provider?: string | undefined,\n ) => string\n customPreactJS?: string\n TICKET_NAME_IN_URL?: string\n SCHEME_NAME_IN_URL?: string\n PROVIDER_NAME_IN_URL?: string\n CHALLENGE_NAME_IN_URL?: string\n TICKET_TTL_SEC?: number\n ELECTRON_SESSION_DURATION?: number\n}\n\nexport type ElectronRendererPluginOptions = {\n /**\n * The custom protocol scheme used for deep linking authentication.\n * @remarks\n * This should match the protocol registered in your Electron Main Process.\n * Do not include the `://` suffix.\n * @example \"bigio\" to be like \"bigio://better-auth-callback\"\n */\n ELECTRON_SCHEME: string\n // baseURL?: string\n // cookiePrefix?: string\n // logger?: typeof bigIOLogger | typeof log\n // betterAuthClient: AuthClient<BetterAuthClientOptions>\n debug?: boolean\n refetchSessionOnFocus?: boolean\n CHALLENGE_NAME_IN_URL?: string\n ELECTRON_APP_HOST?: string\n TICKET_NAME_IN_URL?: string\n onDeepLinkFailedFn?: (error: unknown) => Promise<void>\n onDeepLinkSuccessFn?: (data: {\n session: Pick<Session, 'createdAt' | 'updatedAt' | 'expiresAt'>\n user: User\n }) => Promise<void>\n lazySignalUIReadyForFn?: boolean\n /**\n * The specific action path or host used to identify the auth callback.\n * This will be combined with the scheme to form the full callback URL.\n * Format: `${scheme}://${hostname}`\n * @example \"better-auth-callback\"\n * // Resulting URL: \"bigio://better-auth-callback\"\n */\n ELECTRON_CALLBACK_HOST_PATH?: string\n /**\n * The IPC event name used to receive deep link URLs from the main process.\n * @example \"deep-link-received\"\n */\n DEEPLINK_EVENT_NAME?: string\n /**\n * The IPC event name used to notify the main process that the renderer app is mounted.\n * @example \"renderer-app-mounted\"\n */\n APP_MOUNTED_EVENT_NAME?: string\n /**\n * The URL path for the backend exchange endpoint to exchange the JWT ticket.\n * @example \"/electron/exchange\"\n */\n BACKEND_EXCHANGE_URL?: string\n}\nexport type ElectronMainPluginOptions = {\n isOAuth: boolean\n /**\n * The custom protocol scheme used for deep linking authentication.\n * @remarks\n * This should match the protocol registered in your Electron Main Process.\n * Do not include the `://` suffix.\n * @example \"bigio\" to be like \"bigio://better-auth-callback\"\n */\n ELECTRON_SCHEME: string\n BETTER_AUTH_BASEURL: string\n PROVIDERS: string[]\n FRONTEND_URL: string\n ELECTRON_APP_NAME: string\n CONTENT_SECURITY_POLICY?: string\n /**\n * The specific action path or host used to identify the auth callback.\n * This will be combined with the scheme to form the full callback URL.\n * Format: `${scheme}://${hostname}`\n * @example \"better-auth-callback\"\n * // Resulting URL: \"bigio://better-auth-callback\"\n */\n // logger?: typeof bigIOLogger | typeof log\n debugMode?: boolean\n ELECTRON_VERIFIER_LENGTH?: number\n CHALLENGE_NAME_IN_URL?: string\n SCHEME_NAME_IN_URL?: string\n PROVIDER_NAME_IN_URL?: string\n CALLBACK_PATHNAME_IN_URL?: string\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME?: string\n ELECTRON_APP_HOST?: string\n ELECTRON_RENDERER_PATH?: string\n OLD_SCHOOL_ONBEFORE_WAY?: boolean\n GET_COOKIES_EVENT_NAME?: string\n ELECTRON_VERIFIER_FILE_NAME?: string\n /**\n * The specific action path or host used to identify the auth callback.\n * This will be combined with the scheme to form the full callback URL.\n * Format: `${scheme}://${hostname}`\n * @example \"better-auth-callback\"\n * // Resulting URL: \"bigio://better-auth-callback\"\n */\n ELECTRON_CALLBACK_HOST_PATH?: string\n /**\n * The IPC event name used to receive deep link URLs from the main process.\n * @example \"deep-link-received\"\n */\n DEEPLINK_EVENT_NAME?: string\n /**\n * The IPC event name used to clear cookies from the main process.\n * @example \"clear-Cookies\"\n */\n CLEAR_COOKIES_EVENT_NAME?: string\n /**\n * The IPC event name used to notify the main process that the renderer app is mounted.\n * @example \"renderer-app-mounted\"\n */\n APP_MOUNTED_EVENT_NAME?: string\n /**\n * The URL path for the backend exchange endpoint to exchange the JWT ticket.\n * @example \"/electron/exchange\"\n */\n BACKEND_EXCHANGE_URL?: string\n openHandlerHelper?: (details: Electron.HandlerDetails) => Electron.WindowOpenHandlerResponse\n\n beforeSendHelper?: (details: Electron.OnBeforeSendHeadersListenerDetails) => {\n callback: {\n requestHeaders: Record<string, string | string[]>\n cancel?: boolean\n }\n }\n customProtocolServingHelper?: {\n scheme?: string\n privileges?: {\n standard: boolean\n secure: boolean\n supportFetchAPI: boolean\n corsEnabled: boolean\n bypassCSP: boolean\n allowServiceWorkers?: boolean\n codeCache?: boolean\n stream?: boolean\n }\n protocolHandleOnCreateWindow?: (mainWindow: BrowserWindow) => Promise<void>\n protocolHandleOnAppReady?: (request: Request) => Response | Promise<Response>\n }\n}\nexport type ElectronButtonOptions = {\n FRONTEND_URL: string\n PROVIDER_NAME_IN_URL: string\n}\nexport type ElectronWebOptions = typeof defatultWebOptions\n\nexport const defaultServerPluginOptions = {\n ELECTRON_SCHEME: 'bigio',\n ELECTRON_APP_HOST: 'app-renderer',\n PROVIDERS: ['github', 'google'],\n BACKEND_EXCHANGE_URL: 'electron/exchange',\n BACKEND_FAST_TICKET_URL: 'electron/fastTicket',\n WEB_ERROR_PAGE_URL: 'http://localhost:3001/better-auth',\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME: 'electron-handoff',\n ELECTRON_CALLBACK_HOST_PATH: 'better-auth-callback',\n ELECTRON_TO_BACKEND_HOST_PATH: 'from-electron-to-auth-backend',\n BACKEND_LOGIN_URL: 'electron/login',\n // PREACT_LOGIN_PAGE: renderOAuthPage,\n TICKET_NAME_IN_URL: 'ticket',\n SCHEME_NAME_IN_URL: 'scheme',\n PROVIDER_NAME_IN_URL: 'provider',\n CHALLENGE_NAME_IN_URL: 'electron_challenge',\n TICKET_TTL_SEC: 60 * 5,\n ELECTRON_SESSION_DURATION: 7 * 24 * 60 * 60 * 1000,\n // customPreactJS: customPreactJS,\n} satisfies Partial<ElectronServerPluginOptions>\n\nexport const defaultRendererPluginOptions = {\n ELECTRON_SCHEME: 'bigio',\n ELECTRON_APP_HOST: 'app-renderer',\n BACKEND_EXCHANGE_URL: 'electron/exchange',\n refetchSessionOnFocus: true,\n ELECTRON_CALLBACK_HOST_PATH: 'better-auth-callback',\n DEEPLINK_EVENT_NAME: 'deep-link-received',\n APP_MOUNTED_EVENT_NAME: 'renderer-app-mounted',\n CHALLENGE_NAME_IN_URL: 'electron_challenge',\n TICKET_NAME_IN_URL: 'ticket',\n lazySignalUIReadyForFn: false,\n} satisfies Partial<ElectronRendererPluginOptions>\n\nexport const defaultMainPluginOptions = {\n debugMode: false,\n isOAuth: true,\n BETTER_AUTH_BASEURL: 'http://localhost:3002',\n ELECTRON_APP_NAME: 'bigio-electron-demo',\n PROVIDERS: ['github', 'google'],\n ELECTRON_APP_HOST: 'app-renderer',\n ELECTRON_SCHEME: 'bigio',\n ELECTRON_RENDERER_PATH: 'out/renderer',\n DEEPLINK_EVENT_NAME: 'deep-link-received',\n APP_MOUNTED_EVENT_NAME: 'renderer-app-mounted',\n CLEAR_COOKIES_EVENT_NAME: 'clear-Cookies',\n GET_COOKIES_EVENT_NAME: 'get-Cookies',\n ELECTRON_VERIFIER_LENGTH: 32,\n FRONTEND_URL: 'http://localhost:3002/oauth',\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME: 'electron-handoff',\n SCHEME_NAME_IN_URL: 'scheme',\n PROVIDER_NAME_IN_URL: 'provider',\n CHALLENGE_NAME_IN_URL: 'electron_challenge',\n CALLBACK_PATHNAME_IN_URL: 'callbackpath',\n OLD_SCHOOL_ONBEFORE_WAY: false,\n ELECTRON_CALLBACK_HOST_PATH: 'better-auth-callback',\n ELECTRON_VERIFIER_FILE_NAME: 'bigio-auth-state.json',\n} satisfies Partial<ElectronMainPluginOptions>\n\nexport const defaultButtonOptions = {\n FRONTEND_URL: 'http://localhost:3001/oauth',\n PROVIDER_NAME_IN_URL: 'provider',\n} satisfies Partial<ElectronButtonOptions>\n\nexport const defatultWebOptions = {\n ELECTRON_SCHEME: 'bigio',\n SCHEME_NAME_IN_URL: 'scheme',\n PROVIDERS: ['github', 'google'],\n PROVIDER_NAME_IN_URL: 'provider',\n CHALLENGE_NAME_IN_URL: 'electron_challenge',\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME: 'electron-handoff',\n BACKEND_FAST_TICKET_URL: 'electron/fastTicket',\n} as const\n","export function encodeBase32UpperCase(bytes) {\n return encodeBase32_internal(bytes, base32UpperCaseAlphabet, EncodingPadding.Include);\n}\nexport function encodeBase32UpperCaseNoPadding(bytes) {\n return encodeBase32_internal(bytes, base32UpperCaseAlphabet, EncodingPadding.None);\n}\nexport function encodeBase32LowerCase(bytes) {\n return encodeBase32_internal(bytes, base32LowerCaseAlphabet, EncodingPadding.Include);\n}\nexport function encodeBase32LowerCaseNoPadding(bytes) {\n return encodeBase32_internal(bytes, base32LowerCaseAlphabet, EncodingPadding.None);\n}\n/** Replaced: Use encodeBase32UpperCase() instead. */\nexport function encodeBase32(bytes) {\n return encodeBase32UpperCase(bytes);\n}\n/** Replaced: Use encodeBase32UpperCaseNoPadding() instead. */\nexport function encodeBase32NoPadding(bytes) {\n return encodeBase32UpperCaseNoPadding(bytes);\n}\nfunction encodeBase32_internal(bytes, alphabet, padding) {\n let result = \"\";\n for (let i = 0; i < bytes.byteLength; i += 5) {\n let buffer = 0n;\n let bufferBitSize = 0;\n for (let j = 0; j < 5 && i + j < bytes.byteLength; j++) {\n buffer = (buffer << 8n) | BigInt(bytes[i + j]);\n bufferBitSize += 8;\n }\n if (bufferBitSize % 5 !== 0) {\n buffer = buffer << BigInt(5 - (bufferBitSize % 5));\n bufferBitSize += 5 - (bufferBitSize % 5);\n }\n for (let j = 0; j < 8; j++) {\n if (bufferBitSize >= 5) {\n result += alphabet[Number((buffer >> BigInt(bufferBitSize - 5)) & 0x1fn)];\n bufferBitSize -= 5;\n }\n else if (bufferBitSize > 0) {\n result += alphabet[Number((buffer << BigInt(6 - bufferBitSize)) & 0x3fn)];\n bufferBitSize = 0;\n }\n else if (padding === EncodingPadding.Include) {\n result += \"=\";\n }\n }\n }\n return result;\n}\nexport function decodeBase32(encoded) {\n return decodeBase32_internal(encoded, base32DecodeMap, DecodingPadding.Required);\n}\nexport function decodeBase32IgnorePadding(encoded) {\n return decodeBase32_internal(encoded, base32DecodeMap, DecodingPadding.Ignore);\n}\nfunction decodeBase32_internal(encoded, decodeMap, padding) {\n const result = new Uint8Array(Math.ceil(encoded.length / 8) * 5);\n let totalBytes = 0;\n for (let i = 0; i < encoded.length; i += 8) {\n let chunk = 0n;\n let bitsRead = 0;\n for (let j = 0; j < 8; j++) {\n if (padding === DecodingPadding.Required) {\n if (encoded[i + j] === \"=\") {\n continue;\n }\n if (i + j >= encoded.length) {\n throw new Error(\"Invalid padding\");\n }\n }\n if (padding === DecodingPadding.Ignore) {\n if (i + j >= encoded.length || encoded[i + j] === \"=\") {\n continue;\n }\n }\n if (j > 0 && encoded[i + j - 1] === \"=\") {\n throw new Error(\"Invalid padding\");\n }\n if (!(encoded[i + j] in decodeMap)) {\n throw new Error(\"Invalid character\");\n }\n chunk |= BigInt(decodeMap[encoded[i + j]]) << BigInt((7 - j) * 5);\n bitsRead += 5;\n }\n if (bitsRead < 40) {\n let unused;\n if (bitsRead === 10) {\n unused = chunk & 0xffffffffn;\n }\n else if (bitsRead === 20) {\n unused = chunk & 0xffffffn;\n }\n else if (bitsRead === 25) {\n unused = chunk & 0xffffn;\n }\n else if (bitsRead === 35) {\n unused = chunk & 0xffn;\n }\n else {\n throw new Error(\"Invalid padding\");\n }\n if (unused !== 0n) {\n throw new Error(\"Invalid padding\");\n }\n }\n const byteLength = Math.floor(bitsRead / 8);\n for (let i = 0; i < byteLength; i++) {\n result[totalBytes] = Number((chunk >> BigInt(32 - i * 8)) & 0xffn);\n totalBytes++;\n }\n }\n return result.slice(0, totalBytes);\n}\nconst base32UpperCaseAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\nconst base32LowerCaseAlphabet = \"abcdefghijklmnopqrstuvwxyz234567\";\nconst base32DecodeMap = {\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n a: 0,\n b: 1,\n c: 2,\n d: 3,\n e: 4,\n f: 5,\n g: 6,\n h: 7,\n i: 8,\n j: 9,\n k: 10,\n l: 11,\n m: 12,\n n: 13,\n o: 14,\n p: 15,\n q: 16,\n r: 17,\n s: 18,\n t: 19,\n u: 20,\n v: 21,\n w: 22,\n x: 23,\n y: 24,\n z: 25,\n \"2\": 26,\n \"3\": 27,\n \"4\": 28,\n \"5\": 29,\n \"6\": 30,\n \"7\": 31\n};\nvar EncodingPadding;\n(function (EncodingPadding) {\n EncodingPadding[EncodingPadding[\"Include\"] = 0] = \"Include\";\n EncodingPadding[EncodingPadding[\"None\"] = 1] = \"None\";\n})(EncodingPadding || (EncodingPadding = {}));\nvar DecodingPadding;\n(function (DecodingPadding) {\n DecodingPadding[DecodingPadding[\"Required\"] = 0] = \"Required\";\n DecodingPadding[DecodingPadding[\"Ignore\"] = 1] = \"Ignore\";\n})(DecodingPadding || (DecodingPadding = {}));\n","export function encodeBase64(bytes) {\n return encodeBase64_internal(bytes, base64Alphabet, EncodingPadding.Include);\n}\nexport function encodeBase64NoPadding(bytes) {\n return encodeBase64_internal(bytes, base64Alphabet, EncodingPadding.None);\n}\nexport function encodeBase64url(bytes) {\n return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding.Include);\n}\nexport function encodeBase64urlNoPadding(bytes) {\n return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding.None);\n}\nfunction encodeBase64_internal(bytes, alphabet, padding) {\n let result = \"\";\n for (let i = 0; i < bytes.byteLength; i += 3) {\n let buffer = 0;\n let bufferBitSize = 0;\n for (let j = 0; j < 3 && i + j < bytes.byteLength; j++) {\n buffer = (buffer << 8) | bytes[i + j];\n bufferBitSize += 8;\n }\n for (let j = 0; j < 4; j++) {\n if (bufferBitSize >= 6) {\n result += alphabet[(buffer >> (bufferBitSize - 6)) & 0x3f];\n bufferBitSize -= 6;\n }\n else if (bufferBitSize > 0) {\n result += alphabet[(buffer << (6 - bufferBitSize)) & 0x3f];\n bufferBitSize = 0;\n }\n else if (padding === EncodingPadding.Include) {\n result += \"=\";\n }\n }\n }\n return result;\n}\nconst base64Alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst base64urlAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nexport function decodeBase64(encoded) {\n return decodeBase64_internal(encoded, base64DecodeMap, DecodingPadding.Required);\n}\nexport function decodeBase64IgnorePadding(encoded) {\n return decodeBase64_internal(encoded, base64DecodeMap, DecodingPadding.Ignore);\n}\nexport function decodeBase64url(encoded) {\n return decodeBase64_internal(encoded, base64urlDecodeMap, DecodingPadding.Required);\n}\nexport function decodeBase64urlIgnorePadding(encoded) {\n return decodeBase64_internal(encoded, base64urlDecodeMap, DecodingPadding.Ignore);\n}\nfunction decodeBase64_internal(encoded, decodeMap, padding) {\n const result = new Uint8Array(Math.ceil(encoded.length / 4) * 3);\n let totalBytes = 0;\n for (let i = 0; i < encoded.length; i += 4) {\n let chunk = 0;\n let bitsRead = 0;\n for (let j = 0; j < 4; j++) {\n if (padding === DecodingPadding.Required && encoded[i + j] === \"=\") {\n continue;\n }\n if (padding === DecodingPadding.Ignore &&\n (i + j >= encoded.length || encoded[i + j] === \"=\")) {\n continue;\n }\n if (j > 0 && encoded[i + j - 1] === \"=\") {\n throw new Error(\"Invalid padding\");\n }\n if (!(encoded[i + j] in decodeMap)) {\n throw new Error(\"Invalid character\");\n }\n chunk |= decodeMap[encoded[i + j]] << ((3 - j) * 6);\n bitsRead += 6;\n }\n if (bitsRead < 24) {\n let unused;\n if (bitsRead === 12) {\n unused = chunk & 0xffff;\n }\n else if (bitsRead === 18) {\n unused = chunk & 0xff;\n }\n else {\n throw new Error(\"Invalid padding\");\n }\n if (unused !== 0) {\n throw new Error(\"Invalid padding\");\n }\n }\n const byteLength = Math.floor(bitsRead / 8);\n for (let i = 0; i < byteLength; i++) {\n result[totalBytes] = (chunk >> (16 - i * 8)) & 0xff;\n totalBytes++;\n }\n }\n return result.slice(0, totalBytes);\n}\nvar EncodingPadding;\n(function (EncodingPadding) {\n EncodingPadding[EncodingPadding[\"Include\"] = 0] = \"Include\";\n EncodingPadding[EncodingPadding[\"None\"] = 1] = \"None\";\n})(EncodingPadding || (EncodingPadding = {}));\nvar DecodingPadding;\n(function (DecodingPadding) {\n DecodingPadding[DecodingPadding[\"Required\"] = 0] = \"Required\";\n DecodingPadding[DecodingPadding[\"Ignore\"] = 1] = \"Ignore\";\n})(DecodingPadding || (DecodingPadding = {}));\nconst base64DecodeMap = {\n \"0\": 52,\n \"1\": 53,\n \"2\": 54,\n \"3\": 55,\n \"4\": 56,\n \"5\": 57,\n \"6\": 58,\n \"7\": 59,\n \"8\": 60,\n \"9\": 61,\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n a: 26,\n b: 27,\n c: 28,\n d: 29,\n e: 30,\n f: 31,\n g: 32,\n h: 33,\n i: 34,\n j: 35,\n k: 36,\n l: 37,\n m: 38,\n n: 39,\n o: 40,\n p: 41,\n q: 42,\n r: 43,\n s: 44,\n t: 45,\n u: 46,\n v: 47,\n w: 48,\n x: 49,\n y: 50,\n z: 51,\n \"+\": 62,\n \"/\": 63\n};\nconst base64urlDecodeMap = {\n \"0\": 52,\n \"1\": 53,\n \"2\": 54,\n \"3\": 55,\n \"4\": 56,\n \"5\": 57,\n \"6\": 58,\n \"7\": 59,\n \"8\": 60,\n \"9\": 61,\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n a: 26,\n b: 27,\n c: 28,\n d: 29,\n e: 30,\n f: 31,\n g: 32,\n h: 33,\n i: 34,\n j: 35,\n k: 36,\n l: 37,\n m: 38,\n n: 39,\n o: 40,\n p: 41,\n q: 42,\n r: 43,\n s: 44,\n t: 45,\n u: 46,\n v: 47,\n w: 48,\n x: 49,\n y: 50,\n z: 51,\n \"-\": 62,\n _: 63\n};\n","// utils/electron-plugin-env.ts\n/** biome-ignore-all lint/style/useConsistentTypeDefinitions: <> */\nimport type { IpcRenderer, WebFrame, WebUtils } from 'electron'\n\ntype Prettify<T> = {\n [K in keyof T]: T[K]\n} & {}\ndeclare const process:\n | {\n env: {\n NODE_ENV?: string\n }\n versions?: {\n electron?: string\n }\n }\n | undefined\n\ndeclare global {\n interface ImportMetaEnv {\n readonly MODE: string\n readonly DEV: boolean\n readonly PROD: boolean\n readonly SSR: boolean\n\n [key: string]: unknown\n }\n\n interface ImportMeta {\n readonly env: ImportMetaEnv\n }\n}\n\ndeclare global {\n interface Window {\n electron: {\n webUtils: Prettify<WebUtils>\n webFrame: Prettify<WebFrame>\n process: Prettify<SafeProcess>\n ipcRenderer: Prettify<IpcRenderer>\n }\n }\n}\ntype SafeProcess = {\n readonly platform: NodeJS.Platform\n readonly versions: NodeJS.ProcessVersions\n readonly env: NodeJS.ProcessEnv\n}\n\ntype ElectronWindow = Window & {\n electron: {\n webUtils: Prettify<WebUtils>\n webFrame: Prettify<WebFrame>\n process: Prettify<SafeProcess>\n ipcRenderer: Prettify<IpcRenderer>\n }\n}\nconst getGlobal = () => {\n if (typeof globalThis !== 'undefined') {\n return globalThis\n }\n if (typeof self !== 'undefined') {\n return self\n }\n if (typeof window !== 'undefined') {\n return window\n }\n if (typeof global !== 'undefined') {\n return global\n }\n throw new Error('unable to locate global object')\n}\nconst globals = getGlobal()\n// function requireSetCookies(headers: Headers) {\n// if (typeof headers.getSetCookie !== 'function') {\n// throw new BigIOError('Environment Error: headers.getSetCookie is not a function.', {\n// bigioErrorStack: [\n// {\n// msg: 'Outdated Node.js Environment',\n// ctx: `'Please upgrade NodeJS to 18.14+`,\n// },\n// ],\n// })\n// }\n\n// const setCookieHeader = headers.getSetCookie()\n// if (!setCookieHeader || setCookieHeader.length === 0) {\n// const headerKeys = Array.from(headers.keys()).join(', ')\n// throw new APIError('INTERNAL_SERVER_ERROR', {\n// message: 'Critical: No Set-Cookie headers received from provider',\n// debugInfo: { availableHeaders: headerKeys },\n// })\n// }\n// return setCookieHeader\n// }\nexport function isElectronWindow(window: Window | typeof globalThis): window is ElectronWindow {\n if (typeof window !== 'undefined') {\n if (\n typeof navigator !== 'undefined' &&\n 'userAgent' in navigator &&\n navigator.userAgent.toLowerCase().includes(' electron/')\n ) {\n return true\n }\n if ('electron' in window && typeof window.electron !== 'undefined') {\n return true\n }\n }\n return false\n}\nconst getEnv = () => {\n if (typeof window !== 'undefined') {\n if (isElectronWindow(globals)) {\n return 'ELECTRON_RENDERER'\n }\n return 'BROWSER'\n }\n if (globalThis === self) {\n return 'WORKER'\n }\n if (typeof global !== 'undefined' && typeof process !== 'undefined') {\n if (typeof process.versions?.electron !== 'undefined') {\n return 'ELECTRON_MAIN'\n }\n return 'NODE'\n }\n return 'UNKNOWN'\n}\nconst getRawNodeEnv = (): string => {\n if (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.MODE) {\n return import.meta.env.MODE\n }\n\n // biome-ignore lint/complexity/useOptionalChain: <>\n if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV) {\n return process.env.NODE_ENV\n }\n\n return 'development'\n}\n\nconst RAW_ENV = getRawNodeEnv()\n\nexport const IS_DEV = RAW_ENV === 'development'\nexport const IS_PROD = RAW_ENV === 'production'\nexport const IS_TEST = RAW_ENV === 'test'\n\nexport const IS_ELECTRON_PACKAGED = (() => {\n // biome-ignore lint/complexity/useOptionalChain: <>\n if (typeof process !== 'undefined' && process.versions && process.versions.electron) {\n try {\n return require('electron').app.isPackaged\n } catch {\n return false\n }\n }\n return false\n})()\n\nif (typeof console !== 'undefined') {\n console.debug(`[ENV] Current Mode: ${RAW_ENV} | Packaged: ${IS_ELECTRON_PACKAGED}`)\n}\n","// root/packages/better-auth-electron/src/utils/electron-plugin-utils.ts\n\nimport { decodeBase64urlIgnorePadding, encodeBase64urlNoPadding } from '@oslojs/encoding'\n// import type { AuthClient, BetterAuthClientOptions } from 'better-auth/client'\nimport type { IpcRenderer, WebFrame, WebUtils } from 'electron'\n\n// import { atom } from 'jotai/vanilla'\n\nimport z from 'zod'\n\nimport { IS_DEV } from './electron-plugin-env'\n\n// import { BigIOError } from './electron-plugin-env'\n// import { okOr, safeTry } from './electron-plugin-helper'\n// root/packages/better-auth-electron/src/utils/electron-plugin-helper.ts\n\n// import { BigIOError, consoleError } from './electron-plugin-utils'\ntype Prettify<T> = {\n [K in keyof T]: T[K]\n} & {}\ntype NonNull<T> = Exclude<T, null | undefined>\nexport class BigIOError extends Error {\n public readonly bigioErrorStack: unknown[]\n\n constructor(message: string, options: { cause?: unknown; bigioErrorStack?: unknown[] }) {\n super(message, { cause: options.cause })\n this.name = 'BigIOError'\n this.bigioErrorStack = options.bigioErrorStack || []\n\n Object.setPrototypeOf(this, new.target.prototype)\n Object.defineProperty(this, 'bigioErrorStack', { enumerable: false })\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause,\n bigioErrorStack: this.bigioErrorStack,\n }\n }\n}\n\nexport const consoleError = (\n originalError: unknown,\n message?: string,\n bigioErrorStack?: unknown[],\n) => {\n if (!IS_DEV) {\n return\n }\n if (message && bigioErrorStack) {\n console.groupCollapsed(`[BigIOError]`)\n console.error('[BigIOError] message: ', message)\n if (Array.isArray(bigioErrorStack) && bigioErrorStack.length > 0) {\n console.log('[BigIOError] Stack Trace Table: ')\n console.table(bigioErrorStack)\n }\n console.error('[BigIOError] Original Error: ', originalError)\n console.groupEnd()\n } else if (originalError instanceof BigIOError) {\n console.groupCollapsed(`[BigIOError]`)\n console.error('[BigIOError] message: ', originalError.message)\n if (\n Array.isArray(originalError.bigioErrorStack) &&\n originalError.bigioErrorStack.length > 0\n ) {\n console.log('[BigIOError] Stack Trace Table: ')\n console.table(originalError.bigioErrorStack)\n }\n console.error('[BigIOError] Original Error: ', originalError.cause)\n console.groupEnd()\n } else {\n console.groupCollapsed(`[Error]`)\n console.error('[Error]: ', originalError)\n console.groupEnd()\n }\n}\nexport const consoleLog = (...argv: unknown[]): void => {\n if (IS_DEV) {\n console.log(...argv)\n }\n}\ntype BigIOLogger = {\n info(message: unknown, ...args: unknown[]): void\n warn(message: unknown, ...args: unknown[]): void\n error(message: unknown, ...args: unknown[]): void\n debug?(message: unknown, ...args: unknown[]): void\n}\n\nexport const bigIOLogger: BigIOLogger = {\n info: (message: unknown, ...args: unknown[]) => {\n console.log(message, ...args)\n },\n warn: (message: unknown, ...args: unknown[]) => {\n console.warn(message, ...args)\n },\n error: (message: unknown, ...args: unknown[]) => {\n console.error(message, ...args)\n },\n debug: (message: unknown, ...args: unknown[]) => {\n console.debug(message, ...args)\n },\n}\nfunction getPreviousBigIOErrorStack(error: unknown): unknown[] {\n if (error instanceof BigIOError) {\n return error.bigioErrorStack\n }\n\n if (error instanceof Error && 'bigioErrorStack' in error) {\n return Array.isArray(error.bigioErrorStack) ? error.bigioErrorStack : []\n }\n return []\n}\ntype ErrorMessage = { msg?: string; ctx: unknown } | string | Error | boolean\n\n// biome-ignore lint/style/useUnifiedTypeSignatures: <>\nexport function okOr<T>(value: T): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: string): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: { msg?: string; ctx: unknown }): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: Error): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: boolean): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: ErrorMessage): NonNull<T>\nexport function okOr<T>(value: T, errorMessage?: ErrorMessage): NonNull<T> {\n // Happy Path\n if (value !== null && value !== undefined) {\n return value as NonNull<T>\n }\n const now = Date.now()\n\n const ctx = (() => {\n const DEFAULT_CTX = 'okOr function failed'\n\n if (\n !(errorMessage instanceof Error) &&\n typeof errorMessage === 'object' &&\n 'ctx' in errorMessage\n ) {\n return errorMessage.ctx\n }\n if (typeof errorMessage === 'string') {\n return DEFAULT_CTX\n }\n if (errorMessage === undefined) {\n return DEFAULT_CTX\n }\n if (errorMessage instanceof Error) {\n return DEFAULT_CTX\n }\n if (errorMessage === true) {\n return DEFAULT_CTX\n }\n return DEFAULT_CTX\n })()\n const msg = (() => {\n const DEFAULT_MSG = 'Unexpected return null or undefined value'\n if (\n !(errorMessage instanceof Error) &&\n typeof errorMessage === 'object' &&\n 'msg' in errorMessage &&\n typeof errorMessage.msg === 'string'\n ) {\n return errorMessage.msg\n }\n if (typeof errorMessage === 'string') {\n return errorMessage\n }\n if (errorMessage === undefined) {\n return DEFAULT_MSG\n }\n if (errorMessage instanceof Error) {\n return DEFAULT_MSG\n }\n if (errorMessage === true) {\n return DEFAULT_MSG\n }\n return DEFAULT_MSG\n })()\n\n const newItem = {\n msg: msg,\n ctx: ctx,\n timestamp: now,\n }\n\n if (errorMessage instanceof Error) {\n const prevStack = getPreviousBigIOErrorStack(errorMessage)\n const newStack = [...prevStack, newItem]\n if (!errorMessage.cause) {\n try {\n Object.defineProperty(errorMessage, 'cause', {\n value: new BigIOError(msg, {\n bigioErrorStack: newStack,\n }),\n configurable: true,\n writable: true,\n enumerable: false,\n })\n } catch {\n // some\n }\n }\n try {\n Object.defineProperty(errorMessage, 'bigioErrorStack', {\n value: newStack,\n configurable: true,\n writable: true,\n enumerable: false,\n })\n } catch {\n throw new BigIOError('Wrapper for frozen user error', {\n cause: errorMessage,\n bigioErrorStack: newStack,\n })\n }\n throw errorMessage\n }\n\n throw new BigIOError(msg, {\n bigioErrorStack: [newItem],\n })\n}\n\nconst handleUnsafeError = (originalError: unknown, errorMessage?: ErrorMessage) => {\n const now = Date.now()\n const prevStack = getPreviousBigIOErrorStack(originalError)\n const originalErrorMsg =\n originalError instanceof Error ? originalError.message : String(originalError)\n const newMsg = (() => {\n if (errorMessage === true) {\n return originalErrorMsg\n }\n if (typeof errorMessage === 'string') {\n return errorMessage\n }\n if (\n typeof errorMessage === 'object' &&\n 'ctx' in errorMessage &&\n !(errorMessage instanceof Error)\n ) {\n return errorMessage.msg || originalErrorMsg\n }\n if (errorMessage instanceof Error) {\n return errorMessage.message\n }\n return originalErrorMsg\n })()\n const userStack = (() => {\n if (errorMessage === true) {\n return [\n {\n msg: 'SafeTry failed',\n ctx: originalErrorMsg,\n timestamp: now,\n },\n ]\n }\n if (typeof errorMessage === 'string') {\n return [\n {\n msg: errorMessage,\n ctx: originalErrorMsg,\n timestamp: now,\n },\n ]\n }\n if (\n typeof errorMessage === 'object' &&\n 'ctx' in errorMessage &&\n !(errorMessage instanceof Error)\n ) {\n return [\n {\n msg: errorMessage.msg || originalErrorMsg,\n ctx: errorMessage.ctx,\n timestamp: now,\n },\n ]\n }\n if (errorMessage instanceof Error) {\n const userNewStack = getPreviousBigIOErrorStack(errorMessage)\n if (userNewStack.length > 0) {\n const lastItem = userNewStack.at(-1)\n if (\n lastItem &&\n typeof lastItem === 'object' &&\n !('timestamp' in lastItem && lastItem.timestamp)\n ) {\n return [...userNewStack.slice(0, -1), { ...lastItem, timestamp: now }]\n }\n return userNewStack\n }\n return [{ msg: errorMessage.message, ctx: originalErrorMsg, timestamp: now }]\n }\n\n return [{ ctx: originalErrorMsg }]\n })()\n const MAX_STACK_SIZE = IS_DEV ? 500 : 50\n const newStack = (() => {\n const stack = [...prevStack, ...userStack]\n if (stack.length > MAX_STACK_SIZE) {\n return [\n {\n msg: `... Truncated (Stack > ${MAX_STACK_SIZE}) ...`,\n ctx: null,\n timestamp: now,\n },\n ...stack.slice(-MAX_STACK_SIZE),\n ]\n }\n return stack\n })()\n consoleError(originalError, newMsg, newStack)\n if (errorMessage instanceof Error) {\n if (!errorMessage.cause && originalError) {\n try {\n Object.defineProperty(errorMessage, 'cause', {\n value: originalError,\n configurable: true,\n writable: true,\n enumerable: false,\n })\n } catch {\n // some\n }\n }\n try {\n Object.defineProperty(errorMessage, 'bigioErrorStack', {\n value: newStack,\n configurable: true,\n writable: true,\n enumerable: false,\n })\n } catch {\n throw new BigIOError('Wrapper for frozen user error', {\n cause: errorMessage,\n bigioErrorStack: newStack,\n })\n }\n throw errorMessage\n }\n throw new BigIOError(newMsg, {\n cause: originalError,\n bigioErrorStack: newStack,\n })\n}\n\nconst handleSafeError = (originalError: unknown) => {\n const prevStack = getPreviousBigIOErrorStack(originalError)\n const originalErrorMsg =\n originalError instanceof Error ? originalError.message : String(originalError)\n const now = Date.now()\n const newStack = [\n ...prevStack,\n { msg: originalErrorMsg, ctx: originalErrorMsg, timestamp: now },\n ]\n return {\n data: null,\n error: new BigIOError(originalErrorMsg, {\n cause: originalError,\n bigioErrorStack: newStack,\n }),\n }\n}\n\nconst handlePromise = <T>(internalPromise: Promise<T>, errorMessage?: ErrorMessage) => {\n if (errorMessage !== undefined) {\n return internalPromise\n .then((data) => okOr(data, errorMessage))\n .catch((originalError) => handleUnsafeError(originalError, errorMessage))\n }\n\n return internalPromise\n .then((data) => ({ data: okOr(data), error: null }))\n .catch((originalError) => handleSafeError(originalError))\n}\n\ntype SafeResult<T> =\n | {\n data: NonNull<T>\n error: null\n }\n | {\n data: null\n error: Error\n }\n// biome-ignore lint/style/useUnifiedTypeSignatures: temp\nexport function safeTry<T>(func: Promise<T>): Promise<SafeResult<T>>\nexport function safeTry<T>(func: Promise<T>, errorMessage: ErrorMessage): Promise<NonNull<T>>\nexport function safeTry<T>(func: () => Promise<T>): Promise<SafeResult<T>>\nexport function safeTry<T>(func: () => Promise<T>, errorMessage: ErrorMessage): Promise<NonNull<T>>\nexport function safeTry<T>(func: () => T): SafeResult<T>\nexport function safeTry<T>(func: () => T, errorMessage: ErrorMessage): NonNull<T>\n\nexport function safeTry<T>(\n func: Promise<T> | (() => Promise<T>) | (() => T),\n errorMessage?: ErrorMessage,\n): Promise<SafeResult<T>> | Promise<NonNull<T>> | SafeResult<T> | NonNull<T> {\n try {\n if (func instanceof Promise) {\n return handlePromise(func, errorMessage)\n }\n if (typeof func === 'function') {\n const result = func()\n if (result instanceof Promise) {\n return handlePromise(result, errorMessage)\n }\n\n if (errorMessage !== undefined) {\n return okOr(result, errorMessage)\n }\n return {\n data: okOr(result),\n error: null,\n }\n }\n } catch (error) {\n if (errorMessage !== undefined) {\n handleUnsafeError(error, errorMessage)\n }\n return handleSafeError(error)\n }\n const now = Date.now()\n const invalidInputMsg = 'SayTry Fn Invalid input: expected Function or Promise'\n const invalidError = new BigIOError(invalidInputMsg, {\n cause: func,\n bigioErrorStack: [\n {\n msg: invalidInputMsg,\n ctx: 'Type Check Failed',\n timestamp: now,\n },\n ],\n })\n if (errorMessage !== undefined) {\n throw invalidError\n }\n return {\n data: null,\n error: invalidError,\n }\n}\n\nconst crypto = globalThis.crypto\nconst ALGO_SHA = 'SHA-256'\nconst HKDF_ALGO = { name: 'HKDF' }\nconst AES_ALGO = { name: 'AES-GCM', length: 128 }\nconst secretKeyCache = new Map<string, CryptoKey>()\n\nconst MAX_CACHE_SIZE = 50\nconst GLOBAL_ENCODER = new TextEncoder()\nasync function getCachedKey(secret: string): Promise<CryptoKey> {\n const checkSecret = okOr(secret, {\n msg: 'Invalid secret input for getCachedKey',\n ctx: {\n secretLength: secret?.length,\n },\n })\n const keyDataBuffer = await safeTry(\n crypto.subtle.digest(ALGO_SHA, GLOBAL_ENCODER.encode(checkSecret)),\n {\n msg: 'Failed to create SHA digest from secret',\n ctx: { secretLength: checkSecret.length },\n },\n )\n\n const cacheKeyIndex = encode64(keyDataBuffer)\n if (secretKeyCache.has(cacheKeyIndex)) {\n const cachedKey = secretKeyCache.get(cacheKeyIndex)\n if (cachedKey) {\n secretKeyCache.delete(cacheKeyIndex)\n secretKeyCache.set(cacheKeyIndex, cachedKey)\n return cachedKey\n }\n }\n const keyMaterial = await safeTry(\n crypto.subtle.importKey('raw', GLOBAL_ENCODER.encode(checkSecret), HKDF_ALGO, false, [\n 'deriveKey',\n ]),\n {\n msg: 'Failed to import raw key material',\n ctx: {\n algo: HKDF_ALGO.name,\n },\n },\n )\n const key = await safeTry(\n crypto.subtle.deriveKey(\n {\n name: 'HKDF',\n hash: ALGO_SHA,\n salt: new Uint8Array(),\n info: GLOBAL_ENCODER.encode('better-auth-electron-v1'),\n },\n keyMaterial,\n AES_ALGO,\n false,\n ['encrypt', 'decrypt'],\n ),\n {\n msg: 'HKDF deriveKey failed',\n ctx: {\n algo: HKDF_ALGO.name,\n },\n },\n )\n if (secretKeyCache.size >= MAX_CACHE_SIZE) {\n const staleKey = secretKeyCache.keys().next().value\n if (staleKey) {\n secretKeyCache.delete(staleKey)\n }\n }\n secretKeyCache.set(cacheKeyIndex, key)\n return key\n}\n\nfunction encode64(buffer: Uint8Array | ArrayBuffer) {\n const checkBuffer = okOr(buffer, {\n msg: 'Invalid buffer input for toBase64Url',\n ctx: { type: typeof buffer },\n })\n const bytes = checkBuffer instanceof Uint8Array ? checkBuffer : new Uint8Array(checkBuffer)\n\n return encodeBase64urlNoPadding(bytes)\n}\n\nfunction decode64(str: string): Uint8Array {\n const checkStr = okOr(str, {\n msg: 'Invalid string input for fromBase64Url',\n ctx: {\n stringLength: str?.length,\n },\n })\n\n const normalizedStr = checkStr.replace(/\\+/g, '-').replace(/\\//g, '_')\n const bytesBuffer = safeTry(() => decodeBase64urlIgnorePadding(normalizedStr), {\n msg: 'Base64 Decoding Failed',\n ctx: {\n msg: 'Oslo decode failed',\n ctx: { strPart: str.slice(0, 10) },\n },\n })\n\n return bytesBuffer as unknown as Uint8Array\n}\n\nexport async function encryptTicket(\n payload: Record<string, unknown>,\n secret: string,\n ttlSeconds = 60,\n): Promise<string> {\n const checkPayload = okOr(payload, {\n msg: 'Invalid payload: input is null or undefined for encryptTicket',\n ctx: {\n keys: payload ? Object.keys(payload) : null,\n },\n })\n const checkSecret = okOr(secret, {\n msg: 'Invalid secret: input is empty or invalid for encryptTicket',\n ctx: { secretLength: secret?.length },\n })\n const key = await safeTry(getCachedKey(checkSecret), {\n msg: 'Key initialization failed: unable to derive crypto key from secret',\n ctx: { secretLength: secret.length },\n })\n const iv = okOr(crypto.getRandomValues(new Uint8Array(12)), {\n msg: 'Crypto failure: system RNG failed to generate Initialization Vector (IV)',\n ctx: { requiredBytes: 12 },\n })\n const finalPayload = {\n payload: checkPayload,\n exp: Date.now() + ttlSeconds * 1000,\n }\n const jsonString = safeTry(() => JSON.stringify(finalPayload), {\n msg: 'Serialization failed: payload contains unserializable data (e.g., BigInt, Circular ref)',\n ctx: {\n payloadKeys: Object.keys(checkPayload),\n exp: finalPayload.exp,\n },\n })\n\n const encodedData = GLOBAL_ENCODER.encode(jsonString)\n const encryptedContent = await safeTry(\n crypto.subtle.encrypt({ name: 'AES-GCM', iv: iv }, key, encodedData),\n {\n msg: 'Encryption failed: AES-GCM encryption process encountered an error',\n ctx: {\n ivLength: iv.byteLength,\n dataLength: encodedData.byteLength,\n algo: 'AES-GCM',\n },\n },\n )\n const returnIV = encode64(iv)\n const returnData = encode64(encryptedContent)\n\n return `${returnIV}.${returnData}`\n}\n\nexport async function decryptTicket<T = Record<string, unknown>>(\n ticket: string,\n secret: string,\n): Promise<T> {\n const checkTicket = okOr(ticket, {\n msg: 'Ticket Validation for decryptTicket Failed: Input is null or undefined',\n ctx: {\n length: ticket?.length,\n },\n })\n const checkSecret = okOr(secret, {\n msg: 'Secret Validation for decryptTicket Failed: Input is null or undefined',\n ctx: {\n length: secret?.length,\n },\n })\n const now = Date.now()\n if (!checkTicket.includes('.')) {\n throw new BigIOError('Ticket Malformed: Missing separator (.)', {\n bigioErrorStack: [\n {\n msg: 'Ticket Malformed: Missing separator (.)',\n ctx: { ticketPart: `${checkTicket.slice(0, 10)}...` },\n timestamp: now,\n },\n ],\n })\n }\n const [ivUrl, dataUrl] = checkTicket.split('.')\n if (!(ivUrl && dataUrl)) {\n throw new BigIOError('Invalid ticket format: incomplete parts', {\n bigioErrorStack: [\n {\n msg: 'Invalid ticket format: incomplete parts',\n ctx: { ticketPart: `${checkTicket.slice(0, 10)}...` },\n timestamp: now,\n },\n ],\n })\n }\n const iv = decode64(ivUrl)\n const data = decode64(dataUrl)\n\n if (iv.byteLength !== 12) {\n throw new BigIOError('Crypto Failure: Invalid IV length', {\n bigioErrorStack: [\n {\n msg: 'AES-GCM requires 12-byte IV',\n ctx: { actualLength: iv.byteLength, expected: 12 },\n timestamp: now,\n },\n ],\n })\n }\n const key = await safeTry(getCachedKey(checkSecret), {\n msg: 'Key Derivation Failed: Unable to generate crypto key',\n ctx: { secretLength: checkSecret.length },\n })\n const decryptedBuffer = await safeTry(\n crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: iv as unknown as BufferSource },\n key,\n data as unknown as BufferSource,\n ),\n {\n msg: 'Decryption Failed: Authentication tag mismatch or data corruption',\n ctx: { ivLength: iv.byteLength, dataLength: data.byteLength },\n },\n )\n const decodedString = new TextDecoder().decode(decryptedBuffer)\n const rawJson = safeTry(() => JSON.parse(decodedString), {\n msg: 'JSON Parsing Decrypted payload Failed',\n ctx: { len: decodedString.length, prefix: decodedString.slice(0, 10) },\n })\n const isValidPayload = safeTry(\n () =>\n z\n .object({\n payload: z.record(z.string(), z.unknown()).or(z.looseObject({})),\n exp: z.number().int().min(1),\n })\n .parse(rawJson),\n true,\n )\n const expNow = Date.now()\n\n if (expNow > isValidPayload.exp) {\n throw new BigIOError('Ticket Expired', {\n bigioErrorStack: [\n {\n msg: 'Ticket Expired',\n ctx: {\n exp: isValidPayload.exp,\n now: expNow,\n expiredByMs: expNow - isValidPayload.exp,\n },\n timestamp: expNow,\n },\n ],\n })\n }\n return isValidPayload.payload as T\n}\n\nexport function pkceGenerateVerifier(byteLength = 32): string {\n if (byteLength < 32 || byteLength > 96) {\n throw new BigIOError('PKCE Error: Invalid Verifier Length', {\n bigioErrorStack: [\n {\n msg: 'Verifier byte length must be between 32 and 96',\n ctx: {\n inputLength: byteLength,\n rfcRequirement: '43-128 chars string',\n },\n timestamp: Date.now(),\n },\n ],\n })\n }\n\n const buffer = new Uint8Array(byteLength)\n\n const randomValues = okOr(crypto.getRandomValues(buffer), {\n msg: 'PKCE Failure: System RNG failed to generate Verifier entropy',\n ctx: { requiredBytes: byteLength },\n })\n const result = encode64(randomValues)\n return result\n}\n\nexport async function pkceGenerateChallenge(verifier: string): Promise<string> {\n const checkVerifier = okOr(verifier, {\n msg: 'PKCE Challenge Failure: Verifier input is empty or invalid',\n ctx: { length: verifier?.length },\n })\n const data = GLOBAL_ENCODER.encode(checkVerifier)\n const hashBuffer = await safeTry(crypto.subtle.digest(ALGO_SHA, data), {\n msg: `PKCE Challenge Failure: ${ALGO_SHA} digest failed`,\n ctx: {\n verifierBytes: data.byteLength,\n algo: ALGO_SHA,\n },\n })\n\n return encode64(hashBuffer)\n}\nconst REGEX_BASE64_URL = /^[a-zA-Z0-9\\-_]+=*$/\n\nexport function SearchParamsZod(ELECTRON_SCHEME: string, PROVIDERS: string[]) {\n return z.object({\n scheme: z\n .string()\n .min(1, 'Scheme cannot be empty')\n .regex(REGEX_BASE64_URL)\n .refine((scheme) => scheme === ELECTRON_SCHEME, {\n message: 'Invalid scheme provided',\n }),\n provider: z.enum(PROVIDERS),\n challenge: z\n .string()\n .length(43, 'Challenge must be exactly 43 characters')\n .regex(REGEX_BASE64_URL),\n })\n}\n","// root/packages/better-auth-electron/src/web/electron-web-clientHelper.ts\n\n// import type { createAuthClient } from 'better-auth/client'\n// import type { Atom, WritableAtom } from 'nanostores'\nimport { atom } from 'nanostores'\n\nexport const lazyClient = atom()\n","// root/packages/better-auth-electron/src/web/electron-web-plugin.ts\n\nimport { useStore } from '@nanostores/react'\nimport type {\n BetterAuthClientPlugin,\n BetterAuthError,\n Prettify,\n SessionQueryParams,\n} from 'better-auth'\nimport type {\n BetterFetch,\n BetterFetchError,\n BetterFetchOption,\n createAuthClient,\n} from 'better-auth/client'\nimport type { Atom } from 'nanostores'\nimport { atom, onMount } from 'nanostores'\nimport type { ElectronWebOptions } from '../options/electron-plugin-options'\nimport { defatultWebOptions } from '../options/electron-plugin-options'\nimport { BigIOError, SearchParamsZod, safeTry } from '../utils/electron-plugin-utils'\nimport { lazyClient } from './electron-web-clientHelper'\n\ntype StandardAuthClient = ReturnType<typeof createAuthClient>\nexport const setLazyClient = (client: unknown) => lazyClient.set(client)\n\nconst LOCK_NAME_IN_WINDOW = '__BIGIO_BETTER_AUTH_ELECTRON_WEB_ATTACHED__'\n\nconst checkAndSetGlobalLock = (): boolean => {\n const win = window as typeof window & { [key: string]: unknown }\n if (typeof win[LOCK_NAME_IN_WINDOW] === 'boolean' && win[LOCK_NAME_IN_WINDOW]) {\n return true\n }\n win[LOCK_NAME_IN_WINDOW] = true\n return false\n}\n// const isLoaded = atom(false)\n\nexport const electronWebHandoffPlugin = <\n T extends {\n $Infer: {\n Session: {\n session: unknown\n user: unknown\n }\n }\n },\n>() => {\n type SessionType = T['$Infer']['Session']['session']\n type UserType = T['$Infer']['Session']['user']\n type UseSessionData = {\n data: { user: UserType; session: SessionType }\n error: BetterFetchError | null\n isPending: boolean\n isRefetching: boolean\n refetch: (\n queryParams?:\n | {\n query?: SessionQueryParams\n }\n | undefined,\n ) => Promise<void>\n }\n const config: ElectronWebOptions = { ...defatultWebOptions }\n const {\n CHALLENGE_NAME_IN_URL,\n PROVIDER_NAME_IN_URL,\n SCHEME_NAME_IN_URL,\n PROVIDERS,\n ELECTRON_SCHEME,\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME,\n BACKEND_FAST_TICKET_URL,\n } = config\n const electronWebAtoms = ($fetch: BetterFetch) => {\n const handoffStatus = atom<'idle' | 'connecting' | 'succeed' | 'failed'>('idle')\n const handoffMessage = atom<{\n msg: 'idle' | 'succeed' | 'failed'\n ctx?: unknown\n }>({\n msg: 'idle',\n })\n const myAtom = atom<null>(null)\n return {\n handoffStatus: handoffStatus,\n handoffMessage: handoffMessage,\n myAtom: myAtom,\n }\n }\n type ElectronWebAtoms = ReturnType<typeof electronWebAtoms>\n\n return {\n id: 'electron-web-handoff',\n\n getAtoms: ($fetch) => electronWebAtoms($fetch),\n\n getActions: ($fetch, $store) => {\n console.log('getActions')\n const sessionAtom = $store.atoms.session as Atom<UseSessionData>\n\n const { handoffStatus, handoffMessage } = $store.atoms as unknown as ElectronWebAtoms\n const handoffLogic = () => {\n console.log('handoffLogic')\n const { data: sessionData, isPending, isRefetching, error } = sessionAtom.get()\n if (isPending || isRefetching || error) {\n return\n }\n\n if (handoffStatus.get() !== 'idle') {\n return\n }\n\n const searchParams = new URLSearchParams(window.location.search)\n const scheme = searchParams.get(SCHEME_NAME_IN_URL)\n if (!scheme) {\n return\n }\n if (scheme !== ELECTRON_SCHEME) {\n handoffMessage.set({\n msg: 'failed',\n ctx: `Wrong Scheme: ${scheme}`,\n })\n handoffStatus.set('failed')\n return\n }\n const provider = searchParams.get(PROVIDER_NAME_IN_URL)\n const challenge = searchParams.get(CHALLENGE_NAME_IN_URL)\n const searchParamsZod = SearchParamsZod(ELECTRON_SCHEME, [...PROVIDERS])\n const searchParamsObj = {\n scheme: scheme,\n provider: provider,\n challenge: challenge,\n }\n const validParams = searchParamsZod.parse(searchParamsObj)\n\n const client = lazyClient.get() as StandardAuthClient\n if (!client) {\n return\n }\n const performFastLogin = async () => {\n console.log('檢測到有效 Session,啟動快速通道...')\n handoffStatus.set('connecting')\n const { data: fastLoginResult, error: fastLoginError } = await safeTry(\n async () => {\n const { data: fastTicketData, error: fastTicketError } =\n await client.$fetch<{\n redirect: string\n }>(`/${BACKEND_FAST_TICKET_URL}`, {\n method: 'POST',\n body: {\n userid: (sessionData?.user as { id: unknown }).id,\n scheme: scheme,\n provider: provider,\n challenge: challenge,\n },\n credentials: 'include',\n })\n if (fastTicketError || !fastTicketData.redirect) {\n handoffStatus.set('failed')\n throw new BigIOError('Failed to get fast ticket', {\n bigioErrorStack: [\n { msg: 'Failed to get fast ticket', ctx: validParams },\n ],\n })\n }\n const targetUrl = fastTicketData.redirect\n if (!targetUrl.startsWith(`${scheme}://`)) {\n handoffStatus.set('failed')\n console.error(\n `Failed to get fast ticket with Wrong Scheme: ${scheme}`,\n )\n throw new BigIOError(\n `Failed to get fast ticket with Wrong Scheme: ${scheme}`,\n {\n bigioErrorStack: [\n { msg: 'Failed to get fast ticket', ctx: scheme },\n ],\n },\n )\n }\n return fastTicketData\n },\n )\n if (!fastLoginResult || fastLoginError) {\n handoffStatus.set('failed')\n handoffMessage.set({\n msg: 'failed',\n ctx: searchParamsObj,\n })\n return false\n }\n\n window.location.href = fastLoginResult.redirect\n handoffStatus.set('succeed')\n handoffMessage.set({ msg: 'succeed' })\n return true\n }\n const handleLogin = async (loginProvider: (typeof PROVIDERS)[number]) => {\n console.log('登錄ing')\n handoffStatus.set('connecting')\n const { data: loginData, error: loginError } = await safeTry(async () => {\n const callbackURL = new URL(\n `/${WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME}`,\n window.location.origin,\n )\n\n callbackURL.searchParams.set(SCHEME_NAME_IN_URL, validParams.scheme)\n callbackURL.searchParams.set(PROVIDER_NAME_IN_URL, validParams.provider)\n callbackURL.searchParams.set(CHALLENGE_NAME_IN_URL, validParams.challenge)\n\n const relativeCallbackURL = callbackURL.pathname + callbackURL.search\n await client.signIn.social({\n provider: loginProvider,\n callbackURL: relativeCallbackURL,\n })\n\n return true\n })\n if (!loginData || loginError) {\n handoffStatus.set('failed')\n handoffMessage.set({\n msg: 'failed',\n ctx: searchParamsObj,\n })\n return false\n }\n handoffStatus.set('succeed')\n handoffMessage.set({ msg: 'succeed' })\n return true\n }\n if (sessionData) {\n performFastLogin()\n } else {\n handleLogin(provider as (typeof PROVIDERS)[number])\n }\n }\n if (!checkAndSetGlobalLock()) {\n onMount(sessionAtom, () => {\n console.log('onMount')\n })\n sessionAtom.listen((aatom) => {\n handoffLogic()\n console.log('listen', aatom)\n })\n }\n\n // window.addEventListener('hashchange', () => {\n // console.log(' [Handoff] Hash changed, re-running logic')\n // // handoffLogic()\n // })\n\n // window.addEventListener('popstate', () => {\n // console.log('history [Handoff] History navigation detected')\n // // handoffLogic()\n // })\n return {\n bigio: {\n useElectronOAuthSession: () => {\n const { data, error, isPending, isRefetching, refetch } =\n useStore(sessionAtom)\n\n const oauthMessage = useStore<typeof handoffMessage>(\n $store.atoms.handoffMessage,\n )\n\n return {\n data: data,\n error: error,\n isPending: isPending,\n isRefetching: isRefetching,\n refetch: refetch,\n oauthMessage: oauthMessage,\n }\n },\n },\n }\n },\n } satisfies BetterAuthClientPlugin\n}\n"]}
1
+ {"version":3,"sources":["../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js","../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js","../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/listen-keys/index.js","../node_modules/.pnpm/@nanostores+react@1.0.0_nanostores@1.1.0_react@19.2.4/node_modules/@nanostores/react/index.js","../src/options/electron-plugin-options.ts","../node_modules/.pnpm/@oslojs+encoding@1.1.0/node_modules/@oslojs/encoding/dist/base32.js","../node_modules/.pnpm/@oslojs+encoding@1.1.0/node_modules/@oslojs/encoding/dist/base64.js","../src/utils/electron-plugin-env.ts","../src/utils/electron-plugin-utils.ts","../src/web/electron-web-clientHelper.ts","../src/web/electron-web-plugin.ts"],"names":["EncodingPadding","DecodingPadding","i"],"mappings":"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","file":"web.js","sourcesContent":["import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","export function listenKeys($store, keys, listener) {\n let keysSet = new Set(keys).add(undefined)\n return $store.listen((value, oldValue, changed) => {\n if (keysSet.has(changed)) {\n listener(value, oldValue, changed)\n }\n })\n}\n\nexport function subscribeKeys($store, keys, listener) {\n let unbind = listenKeys($store, keys, listener)\n listener($store.value)\n return unbind\n}\n","import { listenKeys } from 'nanostores'\nimport { useCallback, useRef, useSyncExternalStore } from 'react'\n\nlet emit = (snapshotRef, onChange) => value => {\n if (snapshotRef.current === value) return\n snapshotRef.current = value\n onChange()\n}\n\nexport function useStore(store, { keys, deps = [store, keys] } = {}) {\n let snapshotRef = useRef()\n snapshotRef.current = store.get()\n\n let subscribe = useCallback(onChange => {\n emit(snapshotRef, onChange)(store.value)\n\n return keys?.length > 0\n ? listenKeys(store, keys, emit(snapshotRef, onChange))\n : store.listen(emit(snapshotRef, onChange))\n }, deps)\n let get = () => snapshotRef.current\n\n return useSyncExternalStore(subscribe, get, get)\n}\n","// root/src/utils/electron-plugin-options.ts\n\nimport type { BetterAuthClientOptions, Session, User } from 'better-auth'\nimport type { AuthClient } from 'better-auth/client'\nimport type { BrowserWindow } from 'electron'\n// import { renderOAuthPage } from '../preact/electron-login'\n// import type { BigIOError } from '../utils/electron-plugin-env'\n\nexport type ElectronServerPluginOptions = {\n /**\n * The custom protocol scheme used for deep linking authentication.\n * @remarks\n * This should match the protocol registered in your Electron Main Process.\n * Do not include the `://` suffix.\n * @example \"bigio\" to be like \"bigio://better-auth-callback\"\n */\n ELECTRON_SCHEME: string\n PROVIDERS: string[]\n // baseURL?: string\n // cookiePrefix?: string\n // logger?: typeof bigIOLogger | typeof logsgh\n debugMode?: boolean\n WEB_ERROR_PAGE_URL?: string\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME?: string\n ELECTRON_TO_BACKEND_HOST_PATH?: string\n ELECTRON_APP_HOST?: string\n\n /**\n * The specific action path or host used to identify the auth callback.\n * This will be combined with the scheme to form the full callback URL.\n * Format: `${scheme}://${hostname}`\n * @example \"better-auth-callback\"\n * // Resulting URL: \"bigio://better-auth-callback\"\n */\n ELECTRON_CALLBACK_HOST_PATH?: string\n /**\n * The IPC event name used to receive deep link URLs from the main process.\n * @example \"deep-link-received\"\n */\n DEEPLINK_EVENT_NAME?: string\n /**\n * The IPC event name used to notify the main process that the renderer app is mounted.\n * @example \"renderer-app-mounted\"\n */\n APP_MOUNTED_EVENT_NAME?: string\n /**\n * The URL path for the backend exchange endpoint to exchange the JWT ticket.\n * @example \"/electron/exchange\"\n */\n BACKEND_EXCHANGE_URL?: string\n BACKEND_FAST_TICKET_URL?: string\n BACKEND_LOGIN_URL?: string\n PREACT_LOGIN_PAGE?: (\n baseURL?: string | undefined,\n scheme?: string | undefined,\n provider?: string | undefined,\n ) => string\n customPreactJS?: string\n TICKET_NAME_IN_URL?: string\n SCHEME_NAME_IN_URL?: string\n PROVIDER_NAME_IN_URL?: string\n CHALLENGE_NAME_IN_URL?: string\n AUTH_STATUS_NAME_IN_URL?: string\n TICKET_TTL_SEC?: number\n ELECTRON_SESSION_DURATION?: number\n}\n\nexport type ElectronRendererPluginOptions = {\n FRONTEND_URL?: string\n PROVIDER_NAME_IN_URL?: string\n SCOPES_NAME_IN_URL?: string\n LOGINHINT_NAME_IN_URL?: string\n ADDITIONAL_DATA_NAME_IN_URL?: string\n PROVIDERS?: string[]\n REQUEST_SIGN_UP_NAME_IN_URL?: string\n AUTH_STATUS_NAME_IN_URL?: string\n\n /**\n * The custom protocol scheme used for deep linking authentication.\n * @remarks\n * This should match the protocol registered in your Electron Main Process.\n * Do not include the `://` suffix.\n * @example \"bigio\" to be like \"bigio://better-auth-callback\"\n */\n ELECTRON_SCHEME: string\n // baseURL?: string\n // cookiePrefix?: string\n // logger?: typeof bigIOLogger | typeof log\n // betterAuthClient: AuthClient<BetterAuthClientOptions>\n debug?: boolean\n refetchSessionOnFocus?: boolean\n CHALLENGE_NAME_IN_URL?: string\n ELECTRON_APP_HOST?: string\n TICKET_NAME_IN_URL?: string\n onDeepLinkFailedFn?: (error: unknown) => Promise<void>\n onDeepLinkSuccessFn?: <T>(data: {\n session: Pick<Session, 'createdAt' | 'updatedAt' | 'expiresAt'>\n user: User\n }) => Promise<T | unknown>\n lazySignalUIReadyForFn?: boolean\n /**\n * The specific action path or host used to identify the auth callback.\n * This will be combined with the scheme to form the full callback URL.\n * Format: `${scheme}://${hostname}`\n * @example \"better-auth-callback\"\n * // Resulting URL: \"bigio://better-auth-callback\"\n */\n ELECTRON_CALLBACK_HOST_PATH?: string\n /**\n * The IPC event name used to receive deep link URLs from the main process.\n * @example \"deep-link-received\"\n */\n DEEPLINK_EVENT_NAME?: string\n /**\n * The IPC event name used to notify the main process that the renderer app is mounted.\n * @example \"renderer-app-mounted\"\n */\n APP_MOUNTED_EVENT_NAME?: string\n /**\n * The URL path for the backend exchange endpoint to exchange the JWT ticket.\n * @example \"/electron/exchange\"\n */\n BACKEND_EXCHANGE_URL?: string\n}\nexport type ElectronMainPluginOptions = {\n isOAuth: boolean\n /**\n * The custom protocol scheme used for deep linking authentication.\n * @remarks\n * This should match the protocol registered in your Electron Main Process.\n * Do not include the `://` suffix.\n * @example \"bigio\" to be like \"bigio://better-auth-callback\"\n */\n ELECTRON_SCHEME: string\n BETTER_AUTH_BASEURL: string\n FRONTEND_URL: string\n ELECTRON_APP_NAME: string\n CONTENT_SECURITY_POLICY?: string\n /**\n * The specific action path or host used to identify the auth callback.\n * This will be combined with the scheme to form the full callback URL.\n * Format: `${scheme}://${hostname}`\n * @example \"better-auth-callback\"\n * // Resulting URL: \"bigio://better-auth-callback\"\n */\n // logger?: typeof bigIOLogger | typeof log\n debugMode?: boolean\n ELECTRON_VERIFIER_LENGTH?: number\n CHALLENGE_NAME_IN_URL?: string\n SCHEME_NAME_IN_URL?: string\n CALLBACK_PATHNAME_IN_URL?: string\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME?: string\n ELECTRON_APP_HOST?: string\n ELECTRON_RENDERER_PATH?: string\n OLD_SCHOOL_ONBEFORE_WAY?: boolean\n GET_COOKIES_EVENT_NAME?: string\n ELECTRON_VERIFIER_FILE_NAME?: string\n /**\n * The specific action path or host used to identify the auth callback.\n * This will be combined with the scheme to form the full callback URL.\n * Format: `${scheme}://${hostname}`\n * @example \"better-auth-callback\"\n * // Resulting URL: \"bigio://better-auth-callback\"\n */\n ELECTRON_CALLBACK_HOST_PATH?: string\n /**\n * The IPC event name used to receive deep link URLs from the main process.\n * @example \"deep-link-received\"\n */\n DEEPLINK_EVENT_NAME?: string\n /**\n * The IPC event name used to clear cookies from the main process.\n * @example \"clear-Cookies\"\n */\n CLEAR_COOKIES_EVENT_NAME?: string\n /**\n * The IPC event name used to notify the main process that the renderer app is mounted.\n * @example \"renderer-app-mounted\"\n */\n APP_MOUNTED_EVENT_NAME?: string\n /**\n * The URL path for the backend exchange endpoint to exchange the JWT ticket.\n * @example \"/electron/exchange\"\n */\n BACKEND_EXCHANGE_URL?: string\n openHandlerHelper?: (details: Electron.HandlerDetails) => Electron.WindowOpenHandlerResponse\n\n beforeSendHelper?: (details: Electron.OnBeforeSendHeadersListenerDetails) => {\n callback: {\n requestHeaders: Record<string, string | string[]>\n cancel?: boolean\n }\n }\n customProtocolServingHelper?: {\n scheme?: string\n privileges?: {\n standard: boolean\n secure: boolean\n supportFetchAPI: boolean\n corsEnabled: boolean\n bypassCSP: boolean\n allowServiceWorkers?: boolean\n codeCache?: boolean\n stream?: boolean\n }\n protocolHandleOnCreateWindow?: (mainWindow: BrowserWindow) => Promise<void>\n protocolHandleOnAppReady?: (request: Request) => Response | Promise<Response>\n }\n}\nexport type ElectronButtonOptions = {\n FRONTEND_URL: string\n PROVIDER_NAME_IN_URL: string\n}\nexport type ElectronWebOptions = typeof defaultWebOptions\n\nexport const defaultServerPluginOptions = {\n ELECTRON_SCHEME: 'bigio',\n ELECTRON_APP_HOST: 'app-renderer',\n PROVIDERS: ['github', 'google'],\n BACKEND_EXCHANGE_URL: 'electron/exchange',\n BACKEND_FAST_TICKET_URL: 'electron/fastTicket',\n WEB_ERROR_PAGE_URL: 'http://localhost:3001/better-auth',\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME: 'electron-handoff',\n ELECTRON_CALLBACK_HOST_PATH: 'better-auth-callback',\n ELECTRON_TO_BACKEND_HOST_PATH: 'from-electron-to-auth-backend',\n BACKEND_LOGIN_URL: 'electron/login',\n // PREACT_LOGIN_PAGE: renderOAuthPage,\n TICKET_NAME_IN_URL: 'ticket',\n SCHEME_NAME_IN_URL: 'scheme',\n PROVIDER_NAME_IN_URL: 'provider',\n CHALLENGE_NAME_IN_URL: 'electron-challenge',\n AUTH_STATUS_NAME_IN_URL: 'electron-status',\n TICKET_TTL_SEC: 60 * 5,\n ELECTRON_SESSION_DURATION: 7 * 24 * 60 * 60 * 1000,\n // customPreactJS: customPreactJS,\n} satisfies Partial<ElectronServerPluginOptions>\n\nexport const defaultRendererPluginOptions = {\n ELECTRON_SCHEME: 'bigio',\n ELECTRON_APP_HOST: 'app-renderer',\n BACKEND_EXCHANGE_URL: 'electron/exchange',\n PROVIDERS: ['github', 'google'],\n\n refetchSessionOnFocus: true,\n ELECTRON_CALLBACK_HOST_PATH: 'better-auth-callback',\n DEEPLINK_EVENT_NAME: 'deep-link-received',\n APP_MOUNTED_EVENT_NAME: 'renderer-app-mounted',\n CHALLENGE_NAME_IN_URL: 'electron-challenge',\n TICKET_NAME_IN_URL: 'ticket',\n lazySignalUIReadyForFn: false,\n FRONTEND_URL: 'http://localhost:3001/oauth',\n PROVIDER_NAME_IN_URL: 'provider',\n SCOPES_NAME_IN_URL: 'electron-scopes',\n LOGINHINT_NAME_IN_URL: 'electron-loginhint',\n ADDITIONAL_DATA_NAME_IN_URL: 'electron-addata',\n REQUEST_SIGN_UP_NAME_IN_URL: 'electron-reqsignup',\n AUTH_STATUS_NAME_IN_URL: 'electron-status',\n} satisfies Partial<ElectronRendererPluginOptions>\n\nexport const defaultMainPluginOptions = {\n debugMode: false,\n isOAuth: true,\n BETTER_AUTH_BASEURL: 'http://localhost:3002',\n ELECTRON_APP_NAME: 'bigio-electron-demo',\n ELECTRON_APP_HOST: 'app-renderer',\n ELECTRON_SCHEME: 'bigio',\n ELECTRON_RENDERER_PATH: 'out/renderer',\n DEEPLINK_EVENT_NAME: 'deep-link-received',\n APP_MOUNTED_EVENT_NAME: 'renderer-app-mounted',\n CLEAR_COOKIES_EVENT_NAME: 'clear-Cookies',\n GET_COOKIES_EVENT_NAME: 'get-Cookies',\n ELECTRON_VERIFIER_LENGTH: 32,\n FRONTEND_URL: 'http://localhost:3001/oauth',\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME: 'electron-handoff',\n SCHEME_NAME_IN_URL: 'scheme',\n CHALLENGE_NAME_IN_URL: 'electron-challenge',\n CALLBACK_PATHNAME_IN_URL: 'callbackpath',\n OLD_SCHOOL_ONBEFORE_WAY: false,\n ELECTRON_CALLBACK_HOST_PATH: 'better-auth-callback',\n ELECTRON_VERIFIER_FILE_NAME: 'bigio-auth-state.json',\n} satisfies Partial<ElectronMainPluginOptions>\n\nexport const defaultButtonOptions = {\n FRONTEND_URL: 'http://localhost:3001/oauth',\n PROVIDER_NAME_IN_URL: 'provider',\n} satisfies Partial<ElectronButtonOptions>\n\nexport const defaultWebOptions = {\n ELECTRON_SCHEME: 'bigio',\n SCHEME_NAME_IN_URL: 'scheme',\n PROVIDERS: ['github', 'google'],\n PROVIDER_NAME_IN_URL: 'provider',\n CHALLENGE_NAME_IN_URL: 'electron-challenge',\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME: 'electron-handoff',\n BACKEND_FAST_TICKET_URL: 'electron/fastTicket',\n SCOPES_NAME_IN_URL: 'electron-scopes',\n LOGINHINT_NAME_IN_URL: 'electron-loginhint',\n ADDITIONAL_DATA_NAME_IN_URL: 'electron-addata',\n REQUEST_SIGN_UP_NAME_IN_URL: 'electron-reqsignup',\n AUTH_STATUS_NAME_IN_URL: 'electron-status',\n} as const\n","export function encodeBase32UpperCase(bytes) {\n return encodeBase32_internal(bytes, base32UpperCaseAlphabet, EncodingPadding.Include);\n}\nexport function encodeBase32UpperCaseNoPadding(bytes) {\n return encodeBase32_internal(bytes, base32UpperCaseAlphabet, EncodingPadding.None);\n}\nexport function encodeBase32LowerCase(bytes) {\n return encodeBase32_internal(bytes, base32LowerCaseAlphabet, EncodingPadding.Include);\n}\nexport function encodeBase32LowerCaseNoPadding(bytes) {\n return encodeBase32_internal(bytes, base32LowerCaseAlphabet, EncodingPadding.None);\n}\n/** Replaced: Use encodeBase32UpperCase() instead. */\nexport function encodeBase32(bytes) {\n return encodeBase32UpperCase(bytes);\n}\n/** Replaced: Use encodeBase32UpperCaseNoPadding() instead. */\nexport function encodeBase32NoPadding(bytes) {\n return encodeBase32UpperCaseNoPadding(bytes);\n}\nfunction encodeBase32_internal(bytes, alphabet, padding) {\n let result = \"\";\n for (let i = 0; i < bytes.byteLength; i += 5) {\n let buffer = 0n;\n let bufferBitSize = 0;\n for (let j = 0; j < 5 && i + j < bytes.byteLength; j++) {\n buffer = (buffer << 8n) | BigInt(bytes[i + j]);\n bufferBitSize += 8;\n }\n if (bufferBitSize % 5 !== 0) {\n buffer = buffer << BigInt(5 - (bufferBitSize % 5));\n bufferBitSize += 5 - (bufferBitSize % 5);\n }\n for (let j = 0; j < 8; j++) {\n if (bufferBitSize >= 5) {\n result += alphabet[Number((buffer >> BigInt(bufferBitSize - 5)) & 0x1fn)];\n bufferBitSize -= 5;\n }\n else if (bufferBitSize > 0) {\n result += alphabet[Number((buffer << BigInt(6 - bufferBitSize)) & 0x3fn)];\n bufferBitSize = 0;\n }\n else if (padding === EncodingPadding.Include) {\n result += \"=\";\n }\n }\n }\n return result;\n}\nexport function decodeBase32(encoded) {\n return decodeBase32_internal(encoded, base32DecodeMap, DecodingPadding.Required);\n}\nexport function decodeBase32IgnorePadding(encoded) {\n return decodeBase32_internal(encoded, base32DecodeMap, DecodingPadding.Ignore);\n}\nfunction decodeBase32_internal(encoded, decodeMap, padding) {\n const result = new Uint8Array(Math.ceil(encoded.length / 8) * 5);\n let totalBytes = 0;\n for (let i = 0; i < encoded.length; i += 8) {\n let chunk = 0n;\n let bitsRead = 0;\n for (let j = 0; j < 8; j++) {\n if (padding === DecodingPadding.Required) {\n if (encoded[i + j] === \"=\") {\n continue;\n }\n if (i + j >= encoded.length) {\n throw new Error(\"Invalid padding\");\n }\n }\n if (padding === DecodingPadding.Ignore) {\n if (i + j >= encoded.length || encoded[i + j] === \"=\") {\n continue;\n }\n }\n if (j > 0 && encoded[i + j - 1] === \"=\") {\n throw new Error(\"Invalid padding\");\n }\n if (!(encoded[i + j] in decodeMap)) {\n throw new Error(\"Invalid character\");\n }\n chunk |= BigInt(decodeMap[encoded[i + j]]) << BigInt((7 - j) * 5);\n bitsRead += 5;\n }\n if (bitsRead < 40) {\n let unused;\n if (bitsRead === 10) {\n unused = chunk & 0xffffffffn;\n }\n else if (bitsRead === 20) {\n unused = chunk & 0xffffffn;\n }\n else if (bitsRead === 25) {\n unused = chunk & 0xffffn;\n }\n else if (bitsRead === 35) {\n unused = chunk & 0xffn;\n }\n else {\n throw new Error(\"Invalid padding\");\n }\n if (unused !== 0n) {\n throw new Error(\"Invalid padding\");\n }\n }\n const byteLength = Math.floor(bitsRead / 8);\n for (let i = 0; i < byteLength; i++) {\n result[totalBytes] = Number((chunk >> BigInt(32 - i * 8)) & 0xffn);\n totalBytes++;\n }\n }\n return result.slice(0, totalBytes);\n}\nconst base32UpperCaseAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\nconst base32LowerCaseAlphabet = \"abcdefghijklmnopqrstuvwxyz234567\";\nconst base32DecodeMap = {\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n a: 0,\n b: 1,\n c: 2,\n d: 3,\n e: 4,\n f: 5,\n g: 6,\n h: 7,\n i: 8,\n j: 9,\n k: 10,\n l: 11,\n m: 12,\n n: 13,\n o: 14,\n p: 15,\n q: 16,\n r: 17,\n s: 18,\n t: 19,\n u: 20,\n v: 21,\n w: 22,\n x: 23,\n y: 24,\n z: 25,\n \"2\": 26,\n \"3\": 27,\n \"4\": 28,\n \"5\": 29,\n \"6\": 30,\n \"7\": 31\n};\nvar EncodingPadding;\n(function (EncodingPadding) {\n EncodingPadding[EncodingPadding[\"Include\"] = 0] = \"Include\";\n EncodingPadding[EncodingPadding[\"None\"] = 1] = \"None\";\n})(EncodingPadding || (EncodingPadding = {}));\nvar DecodingPadding;\n(function (DecodingPadding) {\n DecodingPadding[DecodingPadding[\"Required\"] = 0] = \"Required\";\n DecodingPadding[DecodingPadding[\"Ignore\"] = 1] = \"Ignore\";\n})(DecodingPadding || (DecodingPadding = {}));\n","export function encodeBase64(bytes) {\n return encodeBase64_internal(bytes, base64Alphabet, EncodingPadding.Include);\n}\nexport function encodeBase64NoPadding(bytes) {\n return encodeBase64_internal(bytes, base64Alphabet, EncodingPadding.None);\n}\nexport function encodeBase64url(bytes) {\n return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding.Include);\n}\nexport function encodeBase64urlNoPadding(bytes) {\n return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding.None);\n}\nfunction encodeBase64_internal(bytes, alphabet, padding) {\n let result = \"\";\n for (let i = 0; i < bytes.byteLength; i += 3) {\n let buffer = 0;\n let bufferBitSize = 0;\n for (let j = 0; j < 3 && i + j < bytes.byteLength; j++) {\n buffer = (buffer << 8) | bytes[i + j];\n bufferBitSize += 8;\n }\n for (let j = 0; j < 4; j++) {\n if (bufferBitSize >= 6) {\n result += alphabet[(buffer >> (bufferBitSize - 6)) & 0x3f];\n bufferBitSize -= 6;\n }\n else if (bufferBitSize > 0) {\n result += alphabet[(buffer << (6 - bufferBitSize)) & 0x3f];\n bufferBitSize = 0;\n }\n else if (padding === EncodingPadding.Include) {\n result += \"=\";\n }\n }\n }\n return result;\n}\nconst base64Alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst base64urlAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nexport function decodeBase64(encoded) {\n return decodeBase64_internal(encoded, base64DecodeMap, DecodingPadding.Required);\n}\nexport function decodeBase64IgnorePadding(encoded) {\n return decodeBase64_internal(encoded, base64DecodeMap, DecodingPadding.Ignore);\n}\nexport function decodeBase64url(encoded) {\n return decodeBase64_internal(encoded, base64urlDecodeMap, DecodingPadding.Required);\n}\nexport function decodeBase64urlIgnorePadding(encoded) {\n return decodeBase64_internal(encoded, base64urlDecodeMap, DecodingPadding.Ignore);\n}\nfunction decodeBase64_internal(encoded, decodeMap, padding) {\n const result = new Uint8Array(Math.ceil(encoded.length / 4) * 3);\n let totalBytes = 0;\n for (let i = 0; i < encoded.length; i += 4) {\n let chunk = 0;\n let bitsRead = 0;\n for (let j = 0; j < 4; j++) {\n if (padding === DecodingPadding.Required && encoded[i + j] === \"=\") {\n continue;\n }\n if (padding === DecodingPadding.Ignore &&\n (i + j >= encoded.length || encoded[i + j] === \"=\")) {\n continue;\n }\n if (j > 0 && encoded[i + j - 1] === \"=\") {\n throw new Error(\"Invalid padding\");\n }\n if (!(encoded[i + j] in decodeMap)) {\n throw new Error(\"Invalid character\");\n }\n chunk |= decodeMap[encoded[i + j]] << ((3 - j) * 6);\n bitsRead += 6;\n }\n if (bitsRead < 24) {\n let unused;\n if (bitsRead === 12) {\n unused = chunk & 0xffff;\n }\n else if (bitsRead === 18) {\n unused = chunk & 0xff;\n }\n else {\n throw new Error(\"Invalid padding\");\n }\n if (unused !== 0) {\n throw new Error(\"Invalid padding\");\n }\n }\n const byteLength = Math.floor(bitsRead / 8);\n for (let i = 0; i < byteLength; i++) {\n result[totalBytes] = (chunk >> (16 - i * 8)) & 0xff;\n totalBytes++;\n }\n }\n return result.slice(0, totalBytes);\n}\nvar EncodingPadding;\n(function (EncodingPadding) {\n EncodingPadding[EncodingPadding[\"Include\"] = 0] = \"Include\";\n EncodingPadding[EncodingPadding[\"None\"] = 1] = \"None\";\n})(EncodingPadding || (EncodingPadding = {}));\nvar DecodingPadding;\n(function (DecodingPadding) {\n DecodingPadding[DecodingPadding[\"Required\"] = 0] = \"Required\";\n DecodingPadding[DecodingPadding[\"Ignore\"] = 1] = \"Ignore\";\n})(DecodingPadding || (DecodingPadding = {}));\nconst base64DecodeMap = {\n \"0\": 52,\n \"1\": 53,\n \"2\": 54,\n \"3\": 55,\n \"4\": 56,\n \"5\": 57,\n \"6\": 58,\n \"7\": 59,\n \"8\": 60,\n \"9\": 61,\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n a: 26,\n b: 27,\n c: 28,\n d: 29,\n e: 30,\n f: 31,\n g: 32,\n h: 33,\n i: 34,\n j: 35,\n k: 36,\n l: 37,\n m: 38,\n n: 39,\n o: 40,\n p: 41,\n q: 42,\n r: 43,\n s: 44,\n t: 45,\n u: 46,\n v: 47,\n w: 48,\n x: 49,\n y: 50,\n z: 51,\n \"+\": 62,\n \"/\": 63\n};\nconst base64urlDecodeMap = {\n \"0\": 52,\n \"1\": 53,\n \"2\": 54,\n \"3\": 55,\n \"4\": 56,\n \"5\": 57,\n \"6\": 58,\n \"7\": 59,\n \"8\": 60,\n \"9\": 61,\n A: 0,\n B: 1,\n C: 2,\n D: 3,\n E: 4,\n F: 5,\n G: 6,\n H: 7,\n I: 8,\n J: 9,\n K: 10,\n L: 11,\n M: 12,\n N: 13,\n O: 14,\n P: 15,\n Q: 16,\n R: 17,\n S: 18,\n T: 19,\n U: 20,\n V: 21,\n W: 22,\n X: 23,\n Y: 24,\n Z: 25,\n a: 26,\n b: 27,\n c: 28,\n d: 29,\n e: 30,\n f: 31,\n g: 32,\n h: 33,\n i: 34,\n j: 35,\n k: 36,\n l: 37,\n m: 38,\n n: 39,\n o: 40,\n p: 41,\n q: 42,\n r: 43,\n s: 44,\n t: 45,\n u: 46,\n v: 47,\n w: 48,\n x: 49,\n y: 50,\n z: 51,\n \"-\": 62,\n _: 63\n};\n","// utils/electron-plugin-env.ts\n/** biome-ignore-all lint/style/useConsistentTypeDefinitions: <> */\nimport type { IpcRenderer, WebFrame, WebUtils } from 'electron'\n\ntype Prettify<T> = {\n [K in keyof T]: T[K]\n} & {}\ndeclare const process:\n | {\n env: {\n NODE_ENV?: string\n }\n versions?: {\n electron?: string\n }\n }\n | undefined\n\ndeclare global {\n interface ImportMetaEnv {\n readonly MODE: string\n readonly DEV: boolean\n readonly PROD: boolean\n readonly SSR: boolean\n\n [key: string]: unknown\n }\n\n interface ImportMeta {\n readonly env: ImportMetaEnv\n }\n}\n\ndeclare global {\n interface Window {\n electron: {\n webUtils: Prettify<WebUtils>\n webFrame: Prettify<WebFrame>\n process: Prettify<SafeProcess>\n ipcRenderer: Prettify<IpcRenderer>\n }\n }\n}\ntype SafeProcess = {\n readonly platform: NodeJS.Platform\n readonly versions: NodeJS.ProcessVersions\n readonly env: NodeJS.ProcessEnv\n}\n\ntype ElectronWindow = Window & {\n electron: {\n webUtils: Prettify<WebUtils>\n webFrame: Prettify<WebFrame>\n process: Prettify<SafeProcess>\n ipcRenderer: Prettify<IpcRenderer>\n }\n}\nconst getGlobal = () => {\n if (typeof globalThis !== 'undefined') {\n return globalThis\n }\n if (typeof self !== 'undefined') {\n return self\n }\n if (typeof window !== 'undefined') {\n return window\n }\n if (typeof global !== 'undefined') {\n return global\n }\n throw new Error('unable to locate global object')\n}\nconst globals = getGlobal()\n// function requireSetCookies(headers: Headers) {\n// if (typeof headers.getSetCookie !== 'function') {\n// throw new BigIOError('Environment Error: headers.getSetCookie is not a function.', {\n// bigioErrorStack: [\n// {\n// msg: 'Outdated Node.js Environment',\n// ctx: `'Please upgrade NodeJS to 18.14+`,\n// },\n// ],\n// })\n// }\n\n// const setCookieHeader = headers.getSetCookie()\n// if (!setCookieHeader || setCookieHeader.length === 0) {\n// const headerKeys = Array.from(headers.keys()).join(', ')\n// throw new APIError('INTERNAL_SERVER_ERROR', {\n// message: 'Critical: No Set-Cookie headers received from provider',\n// debugInfo: { availableHeaders: headerKeys },\n// })\n// }\n// return setCookieHeader\n// }\nexport function isElectronWindow(window: Window | typeof globalThis): window is ElectronWindow {\n if (typeof window !== 'undefined') {\n if (\n typeof navigator !== 'undefined' &&\n 'userAgent' in navigator &&\n navigator.userAgent.toLowerCase().includes(' electron/')\n ) {\n return true\n }\n if ('electron' in window && typeof window.electron !== 'undefined') {\n return true\n }\n }\n return false\n}\nconst getEnv = () => {\n if (typeof window !== 'undefined') {\n if (isElectronWindow(globals)) {\n return 'ELECTRON_RENDERER'\n }\n return 'BROWSER'\n }\n if (globalThis === self) {\n return 'WORKER'\n }\n if (typeof global !== 'undefined' && typeof process !== 'undefined') {\n if (typeof process.versions?.electron !== 'undefined') {\n return 'ELECTRON_MAIN'\n }\n return 'NODE'\n }\n return 'UNKNOWN'\n}\nconst getRawNodeEnv = (): string => {\n if (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.MODE) {\n return import.meta.env.MODE\n }\n\n // biome-ignore lint/complexity/useOptionalChain: <>\n if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV) {\n return process.env.NODE_ENV\n }\n\n return 'development'\n}\n\nconst RAW_ENV = getRawNodeEnv()\n\nexport const IS_DEV = RAW_ENV === 'development'\nexport const IS_PROD = RAW_ENV === 'production'\nexport const IS_TEST = RAW_ENV === 'test'\n\nexport const IS_ELECTRON_PACKAGED = (() => {\n // biome-ignore lint/complexity/useOptionalChain: <>\n if (typeof process !== 'undefined' && process.versions && process.versions.electron) {\n try {\n return require('electron').app.isPackaged\n } catch {\n return false\n }\n }\n return false\n})()\n\nif (typeof console !== 'undefined') {\n console.debug(`[ENV] Current Mode: ${RAW_ENV} | Packaged: ${IS_ELECTRON_PACKAGED}`)\n}\n","// root/packages/better-auth-electron/src/utils/electron-plugin-utils.ts\n\nimport { decodeBase64urlIgnorePadding, encodeBase64urlNoPadding } from '@oslojs/encoding'\n// import type { AuthClient, BetterAuthClientOptions } from 'better-auth/client'\nimport type { IpcRenderer, WebFrame, WebUtils } from 'electron'\n\n// import { atom } from 'jotai/vanilla'\n\nimport z, { boolean } from 'zod'\n\nimport { IS_DEV } from './electron-plugin-env'\n\n// import { BigIOError } from './electron-plugin-env'\n// import { okOr, safeTry } from './electron-plugin-helper'\n// root/packages/better-auth-electron/src/utils/electron-plugin-helper.ts\n\n// import { BigIOError, consoleError } from './electron-plugin-utils'\ntype Prettify<T> = {\n [K in keyof T]: T[K]\n} & {}\ntype NonNull<T> = Exclude<T, null | undefined>\nexport class BigIOError extends Error {\n public readonly bigioErrorStack: unknown[]\n\n constructor(message: string, options: { cause?: unknown; bigioErrorStack?: unknown[] }) {\n super(message, { cause: options.cause })\n this.name = 'BigIOError'\n this.bigioErrorStack = options.bigioErrorStack || []\n\n Object.setPrototypeOf(this, new.target.prototype)\n Object.defineProperty(this, 'bigioErrorStack', { enumerable: false })\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause,\n bigioErrorStack: this.bigioErrorStack,\n }\n }\n}\n\nexport const consoleError = (\n originalError: unknown,\n message?: string,\n bigioErrorStack?: unknown[],\n) => {\n if (!IS_DEV) {\n return\n }\n if (message && bigioErrorStack) {\n console.groupCollapsed(`[BigIOError]`)\n console.error('[BigIOError] message: ', message)\n if (Array.isArray(bigioErrorStack) && bigioErrorStack.length > 0) {\n console.log('[BigIOError] Stack Trace Table: ')\n console.table(bigioErrorStack)\n }\n console.error('[BigIOError] Original Error: ', originalError)\n console.groupEnd()\n } else if (originalError instanceof BigIOError) {\n console.groupCollapsed(`[BigIOError]`)\n console.error('[BigIOError] message: ', originalError.message)\n if (\n Array.isArray(originalError.bigioErrorStack) &&\n originalError.bigioErrorStack.length > 0\n ) {\n console.log('[BigIOError] Stack Trace Table: ')\n console.table(originalError.bigioErrorStack)\n }\n console.error('[BigIOError] Original Error: ', originalError.cause)\n console.groupEnd()\n } else {\n console.groupCollapsed(`[Error]`)\n console.error('[Error]: ', originalError)\n console.groupEnd()\n }\n}\nexport const consoleLog = (...argv: unknown[]): void => {\n if (IS_DEV) {\n console.log(...argv)\n }\n}\ntype BigIOLogger = {\n info(message: unknown, ...args: unknown[]): void\n warn(message: unknown, ...args: unknown[]): void\n error(message: unknown, ...args: unknown[]): void\n debug?(message: unknown, ...args: unknown[]): void\n}\n\nexport const bigIOLogger: BigIOLogger = {\n info: (message: unknown, ...args: unknown[]) => {\n console.log(message, ...args)\n },\n warn: (message: unknown, ...args: unknown[]) => {\n console.warn(message, ...args)\n },\n error: (message: unknown, ...args: unknown[]) => {\n console.error(message, ...args)\n },\n debug: (message: unknown, ...args: unknown[]) => {\n console.debug(message, ...args)\n },\n}\nfunction getPreviousBigIOErrorStack(error: unknown): unknown[] {\n if (error instanceof BigIOError) {\n return error.bigioErrorStack\n }\n\n if (error instanceof Error && 'bigioErrorStack' in error) {\n return Array.isArray(error.bigioErrorStack) ? error.bigioErrorStack : []\n }\n return []\n}\ntype ErrorMessage = { msg?: string; ctx: unknown } | string | Error | boolean\n\n// biome-ignore lint/style/useUnifiedTypeSignatures: <>\nexport function okOr<T>(value: T): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: string): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: { msg?: string; ctx: unknown }): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: Error): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: boolean): NonNull<T>\nexport function okOr<T>(value: T, errorMessage: ErrorMessage): NonNull<T>\nexport function okOr<T>(value: T, errorMessage?: ErrorMessage): NonNull<T> {\n // Happy Path\n if (value !== null && value !== undefined) {\n return value as NonNull<T>\n }\n const now = Date.now()\n\n const ctx = (() => {\n const DEFAULT_CTX = 'okOr function failed'\n\n if (\n !(errorMessage instanceof Error) &&\n typeof errorMessage === 'object' &&\n 'ctx' in errorMessage\n ) {\n return errorMessage.ctx\n }\n if (typeof errorMessage === 'string') {\n return DEFAULT_CTX\n }\n if (errorMessage === undefined) {\n return DEFAULT_CTX\n }\n if (errorMessage instanceof Error) {\n return DEFAULT_CTX\n }\n if (errorMessage === true) {\n return DEFAULT_CTX\n }\n return DEFAULT_CTX\n })()\n const msg = (() => {\n const DEFAULT_MSG = 'Unexpected return null or undefined value'\n if (\n !(errorMessage instanceof Error) &&\n typeof errorMessage === 'object' &&\n 'msg' in errorMessage &&\n typeof errorMessage.msg === 'string'\n ) {\n return errorMessage.msg\n }\n if (typeof errorMessage === 'string') {\n return errorMessage\n }\n if (errorMessage === undefined) {\n return DEFAULT_MSG\n }\n if (errorMessage instanceof Error) {\n return DEFAULT_MSG\n }\n if (errorMessage === true) {\n return DEFAULT_MSG\n }\n return DEFAULT_MSG\n })()\n\n const newItem = {\n msg: msg,\n ctx: ctx,\n timestamp: now,\n }\n\n if (errorMessage instanceof Error) {\n const prevStack = getPreviousBigIOErrorStack(errorMessage)\n const newStack = [...prevStack, newItem]\n if (!errorMessage.cause) {\n try {\n Object.defineProperty(errorMessage, 'cause', {\n value: new BigIOError(msg, {\n bigioErrorStack: newStack,\n }),\n configurable: true,\n writable: true,\n enumerable: false,\n })\n } catch {\n // some\n }\n }\n try {\n Object.defineProperty(errorMessage, 'bigioErrorStack', {\n value: newStack,\n configurable: true,\n writable: true,\n enumerable: false,\n })\n } catch {\n throw new BigIOError('Wrapper for frozen user error', {\n cause: errorMessage,\n bigioErrorStack: newStack,\n })\n }\n throw errorMessage\n }\n\n throw new BigIOError(msg, {\n bigioErrorStack: [newItem],\n })\n}\n\nconst handleUnsafeError = (originalError: unknown, errorMessage?: ErrorMessage) => {\n const now = Date.now()\n const prevStack = getPreviousBigIOErrorStack(originalError)\n const originalErrorMsg =\n originalError instanceof Error ? originalError.message : String(originalError)\n const newMsg = (() => {\n if (errorMessage === true) {\n return originalErrorMsg\n }\n if (typeof errorMessage === 'string') {\n return errorMessage\n }\n if (\n typeof errorMessage === 'object' &&\n 'ctx' in errorMessage &&\n !(errorMessage instanceof Error)\n ) {\n return errorMessage.msg || originalErrorMsg\n }\n if (errorMessage instanceof Error) {\n return errorMessage.message\n }\n return originalErrorMsg\n })()\n const userStack = (() => {\n if (errorMessage === true) {\n return [\n {\n msg: 'SafeTry failed',\n ctx: originalErrorMsg,\n timestamp: now,\n },\n ]\n }\n if (typeof errorMessage === 'string') {\n return [\n {\n msg: errorMessage,\n ctx: originalErrorMsg,\n timestamp: now,\n },\n ]\n }\n if (\n typeof errorMessage === 'object' &&\n 'ctx' in errorMessage &&\n !(errorMessage instanceof Error)\n ) {\n return [\n {\n msg: errorMessage.msg || originalErrorMsg,\n ctx: errorMessage.ctx,\n timestamp: now,\n },\n ]\n }\n if (errorMessage instanceof Error) {\n const userNewStack = getPreviousBigIOErrorStack(errorMessage)\n if (userNewStack.length > 0) {\n const lastItem = userNewStack.at(-1)\n if (\n lastItem &&\n typeof lastItem === 'object' &&\n !('timestamp' in lastItem && lastItem.timestamp)\n ) {\n return [...userNewStack.slice(0, -1), { ...lastItem, timestamp: now }]\n }\n return userNewStack\n }\n return [{ msg: errorMessage.message, ctx: originalErrorMsg, timestamp: now }]\n }\n\n return [{ ctx: originalErrorMsg }]\n })()\n const MAX_STACK_SIZE = IS_DEV ? 500 : 50\n const newStack = (() => {\n const stack = [...prevStack, ...userStack]\n if (stack.length > MAX_STACK_SIZE) {\n return [\n {\n msg: `... Truncated (Stack > ${MAX_STACK_SIZE}) ...`,\n ctx: null,\n timestamp: now,\n },\n ...stack.slice(-MAX_STACK_SIZE),\n ]\n }\n return stack\n })()\n consoleError(originalError, newMsg, newStack)\n if (errorMessage instanceof Error) {\n if (!errorMessage.cause && originalError) {\n try {\n Object.defineProperty(errorMessage, 'cause', {\n value: originalError,\n configurable: true,\n writable: true,\n enumerable: false,\n })\n } catch {\n // some\n }\n }\n try {\n Object.defineProperty(errorMessage, 'bigioErrorStack', {\n value: newStack,\n configurable: true,\n writable: true,\n enumerable: false,\n })\n } catch {\n throw new BigIOError('Wrapper for frozen user error', {\n cause: errorMessage,\n bigioErrorStack: newStack,\n })\n }\n throw errorMessage\n }\n throw new BigIOError(newMsg, {\n cause: originalError,\n bigioErrorStack: newStack,\n })\n}\n\nconst handleSafeError = (originalError: unknown) => {\n const prevStack = getPreviousBigIOErrorStack(originalError)\n const originalErrorMsg =\n originalError instanceof Error ? originalError.message : String(originalError)\n const now = Date.now()\n const newStack = [\n ...prevStack,\n { msg: originalErrorMsg, ctx: originalErrorMsg, timestamp: now },\n ]\n return {\n data: null,\n error: new BigIOError(originalErrorMsg, {\n cause: originalError,\n bigioErrorStack: newStack,\n }),\n }\n}\n\nconst handlePromise = <T>(internalPromise: Promise<T>, errorMessage?: ErrorMessage) => {\n if (errorMessage !== undefined) {\n return internalPromise\n .then((data) => okOr(data, errorMessage))\n .catch((originalError) => handleUnsafeError(originalError, errorMessage))\n }\n\n return internalPromise\n .then((data) => ({ data: okOr(data), error: null }))\n .catch((originalError) => handleSafeError(originalError))\n}\n\ntype SafeResult<T> =\n | {\n data: NonNull<T>\n error: null\n }\n | {\n data: null\n error: Error\n }\n// biome-ignore lint/style/useUnifiedTypeSignatures: temp\nexport function safeTry<T>(func: Promise<T>): Promise<SafeResult<T>>\nexport function safeTry<T>(func: Promise<T>, errorMessage: ErrorMessage): Promise<NonNull<T>>\nexport function safeTry<T>(func: () => Promise<T>): Promise<SafeResult<T>>\nexport function safeTry<T>(func: () => Promise<T>, errorMessage: ErrorMessage): Promise<NonNull<T>>\nexport function safeTry<T>(func: () => T): SafeResult<T>\nexport function safeTry<T>(func: () => T, errorMessage: ErrorMessage): NonNull<T>\n\nexport function safeTry<T>(\n func: Promise<T> | (() => Promise<T>) | (() => T),\n errorMessage?: ErrorMessage,\n): Promise<SafeResult<T>> | Promise<NonNull<T>> | SafeResult<T> | NonNull<T> {\n try {\n if (func instanceof Promise) {\n return handlePromise(func, errorMessage)\n }\n if (typeof func === 'function') {\n const result = func()\n if (result instanceof Promise) {\n return handlePromise(result, errorMessage)\n }\n\n if (errorMessage !== undefined) {\n return okOr(result, errorMessage)\n }\n return {\n data: okOr(result),\n error: null,\n }\n }\n } catch (error) {\n if (errorMessage !== undefined) {\n handleUnsafeError(error, errorMessage)\n }\n return handleSafeError(error)\n }\n const now = Date.now()\n const invalidInputMsg = 'SayTry Fn Invalid input: expected Function or Promise'\n const invalidError = new BigIOError(invalidInputMsg, {\n cause: func,\n bigioErrorStack: [\n {\n msg: invalidInputMsg,\n ctx: 'Type Check Failed',\n timestamp: now,\n },\n ],\n })\n if (errorMessage !== undefined) {\n throw invalidError\n }\n return {\n data: null,\n error: invalidError,\n }\n}\n\nconst crypto = globalThis.crypto\nconst ALGO_SHA = 'SHA-256'\nconst HKDF_ALGO = { name: 'HKDF' }\nconst AES_ALGO = { name: 'AES-GCM', length: 128 }\nconst secretKeyCache = new Map<string, CryptoKey>()\n\nconst MAX_CACHE_SIZE = 50\nconst GLOBAL_ENCODER = new TextEncoder()\nconst GLOBAL_DECODER = new TextDecoder()\nasync function getCachedKey(secret: string): Promise<CryptoKey> {\n const checkSecret = okOr(secret, {\n msg: 'Invalid secret input for getCachedKey',\n ctx: {\n secretLength: secret?.length,\n },\n })\n const keyDataBuffer = await safeTry(\n crypto.subtle.digest(ALGO_SHA, GLOBAL_ENCODER.encode(checkSecret)),\n {\n msg: 'Failed to create SHA digest from secret',\n ctx: { secretLength: checkSecret.length },\n },\n )\n\n const cacheKeyIndex = encode64(keyDataBuffer)\n if (secretKeyCache.has(cacheKeyIndex)) {\n const cachedKey = secretKeyCache.get(cacheKeyIndex)\n if (cachedKey) {\n secretKeyCache.delete(cacheKeyIndex)\n secretKeyCache.set(cacheKeyIndex, cachedKey)\n return cachedKey\n }\n }\n const keyMaterial = await safeTry(\n crypto.subtle.importKey('raw', GLOBAL_ENCODER.encode(checkSecret), HKDF_ALGO, false, [\n 'deriveKey',\n ]),\n {\n msg: 'Failed to import raw key material',\n ctx: {\n algo: HKDF_ALGO.name,\n },\n },\n )\n const key = await safeTry(\n crypto.subtle.deriveKey(\n {\n name: 'HKDF',\n hash: ALGO_SHA,\n salt: new Uint8Array(),\n info: GLOBAL_ENCODER.encode('better-auth-electron-v1'),\n },\n keyMaterial,\n AES_ALGO,\n false,\n ['encrypt', 'decrypt'],\n ),\n {\n msg: 'HKDF deriveKey failed',\n ctx: {\n algo: HKDF_ALGO.name,\n },\n },\n )\n if (secretKeyCache.size >= MAX_CACHE_SIZE) {\n const staleKey = secretKeyCache.keys().next().value\n if (staleKey) {\n secretKeyCache.delete(staleKey)\n }\n }\n secretKeyCache.set(cacheKeyIndex, key)\n return key\n}\n\nfunction encode64(buffer: Uint8Array | ArrayBuffer) {\n const checkBuffer = okOr(buffer, {\n msg: 'Invalid buffer input for toBase64Url',\n ctx: { type: typeof buffer },\n })\n const bytes = checkBuffer instanceof Uint8Array ? checkBuffer : new Uint8Array(checkBuffer)\n\n return encodeBase64urlNoPadding(bytes)\n}\n\nfunction decode64(str: string): Uint8Array {\n const checkStr = okOr(str, {\n msg: 'Invalid string input for fromBase64Url',\n ctx: {\n stringLength: str?.length,\n },\n })\n\n const normalizedStr = checkStr.replace(/\\+/g, '-').replace(/\\//g, '_')\n const bytesBuffer = safeTry(() => decodeBase64urlIgnorePadding(normalizedStr), {\n msg: 'Base64 Decoding Failed',\n ctx: {\n msg: 'Oslo decode failed',\n ctx: { strPart: str.slice(0, 10) },\n },\n })\n\n return bytesBuffer as unknown as Uint8Array\n}\n\nexport async function encryptTicket(\n payload: Record<string, unknown>,\n secret: string,\n ttlSeconds = 60,\n): Promise<string> {\n const checkPayload = okOr(payload, {\n msg: 'Invalid payload: input is null or undefined for encryptTicket',\n ctx: {\n keys: payload ? Object.keys(payload) : null,\n },\n })\n const checkSecret = okOr(secret, {\n msg: 'Invalid secret: input is empty or invalid for encryptTicket',\n ctx: { secretLength: secret?.length },\n })\n const key = await safeTry(getCachedKey(checkSecret), {\n msg: 'Key initialization failed: unable to derive crypto key from secret',\n ctx: { secretLength: secret.length },\n })\n const iv = okOr(crypto.getRandomValues(new Uint8Array(12)), {\n msg: 'Crypto failure: system RNG failed to generate Initialization Vector (IV)',\n ctx: { requiredBytes: 12 },\n })\n const finalPayload = {\n payload: checkPayload,\n exp: Date.now() + ttlSeconds * 1000,\n }\n const jsonString = safeTry(() => JSON.stringify(finalPayload), {\n msg: 'Serialization failed: payload contains unserializable data (e.g., BigInt, Circular ref)',\n ctx: {\n payloadKeys: Object.keys(checkPayload),\n exp: finalPayload.exp,\n },\n })\n\n const encodedData = GLOBAL_ENCODER.encode(jsonString)\n const encryptedContent = await safeTry(\n crypto.subtle.encrypt({ name: 'AES-GCM', iv: iv }, key, encodedData),\n {\n msg: 'Encryption failed: AES-GCM encryption process encountered an error',\n ctx: {\n ivLength: iv.byteLength,\n dataLength: encodedData.byteLength,\n algo: 'AES-GCM',\n },\n },\n )\n const returnIV = encode64(iv)\n const returnData = encode64(encryptedContent)\n\n return `${returnIV}.${returnData}`\n}\n\nexport async function decryptTicket<T = Record<string, unknown>>(\n ticket: string,\n secret: string,\n): Promise<T> {\n const checkTicket = okOr(ticket, {\n msg: 'Ticket Validation for decryptTicket Failed: Input is null or undefined',\n ctx: {\n length: ticket?.length,\n },\n })\n const checkSecret = okOr(secret, {\n msg: 'Secret Validation for decryptTicket Failed: Input is null or undefined',\n ctx: {\n length: secret?.length,\n },\n })\n const now = Date.now()\n if (!checkTicket.includes('.')) {\n throw new BigIOError('Ticket Malformed: Missing separator (.)', {\n bigioErrorStack: [\n {\n msg: 'Ticket Malformed: Missing separator (.)',\n ctx: { ticketPart: `${checkTicket.slice(0, 10)}...` },\n timestamp: now,\n },\n ],\n })\n }\n const [ivUrl, dataUrl] = checkTicket.split('.')\n if (!(ivUrl && dataUrl)) {\n throw new BigIOError('Invalid ticket format: incomplete parts', {\n bigioErrorStack: [\n {\n msg: 'Invalid ticket format: incomplete parts',\n ctx: { ticketPart: `${checkTicket.slice(0, 10)}...` },\n timestamp: now,\n },\n ],\n })\n }\n const iv = decode64(ivUrl)\n const data = decode64(dataUrl)\n\n if (iv.byteLength !== 12) {\n throw new BigIOError('Crypto Failure: Invalid IV length', {\n bigioErrorStack: [\n {\n msg: 'AES-GCM requires 12-byte IV',\n ctx: { actualLength: iv.byteLength, expected: 12 },\n timestamp: now,\n },\n ],\n })\n }\n const key = await safeTry(getCachedKey(checkSecret), {\n msg: 'Key Derivation Failed: Unable to generate crypto key',\n ctx: { secretLength: checkSecret.length },\n })\n const decryptedBuffer = await safeTry(\n crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: iv as unknown as BufferSource },\n key,\n data as unknown as BufferSource,\n ),\n {\n msg: 'Decryption Failed: Authentication tag mismatch or data corruption',\n ctx: { ivLength: iv.byteLength, dataLength: data.byteLength },\n },\n )\n const decodedString = GLOBAL_DECODER.decode(decryptedBuffer)\n const rawJson = safeTry(() => JSON.parse(decodedString), {\n msg: 'JSON Parsing Decrypted payload Failed',\n ctx: { len: decodedString.length, prefix: decodedString.slice(0, 10) },\n })\n const isValidPayload = safeTry(\n () =>\n z\n .object({\n payload: z.record(z.string(), z.unknown()).or(z.looseObject({})),\n exp: z.number().int().min(1),\n })\n .parse(rawJson),\n true,\n )\n const expNow = Date.now()\n\n if (expNow > isValidPayload.exp) {\n throw new BigIOError('Ticket Expired', {\n bigioErrorStack: [\n {\n msg: 'Ticket Expired',\n ctx: {\n exp: isValidPayload.exp,\n now: expNow,\n expiredByMs: expNow - isValidPayload.exp,\n },\n timestamp: expNow,\n },\n ],\n })\n }\n return isValidPayload.payload as T\n}\n\nexport function pkceGenerateVerifier(byteLength = 32): string {\n if (byteLength < 32 || byteLength > 96) {\n throw new BigIOError('PKCE Error: Invalid Verifier Length', {\n bigioErrorStack: [\n {\n msg: 'Verifier byte length must be between 32 and 96',\n ctx: {\n inputLength: byteLength,\n rfcRequirement: '43-128 chars string',\n },\n timestamp: Date.now(),\n },\n ],\n })\n }\n\n const buffer = new Uint8Array(byteLength)\n\n const randomValues = okOr(crypto.getRandomValues(buffer), {\n msg: 'PKCE Failure: System RNG failed to generate Verifier entropy',\n ctx: { requiredBytes: byteLength },\n })\n const result = encode64(randomValues)\n return result\n}\n\nexport async function pkceGenerateChallenge(verifier: string): Promise<string> {\n const checkVerifier = okOr(verifier, {\n msg: 'PKCE Challenge Failure: Verifier input is empty or invalid',\n ctx: { length: verifier?.length },\n })\n const data = GLOBAL_ENCODER.encode(checkVerifier)\n const hashBuffer = await safeTry(crypto.subtle.digest(ALGO_SHA, data), {\n msg: `PKCE Challenge Failure: ${ALGO_SHA} digest failed`,\n ctx: {\n verifierBytes: data.byteLength,\n algo: ALGO_SHA,\n },\n })\n\n return encode64(hashBuffer)\n}\nconst REGEX_BASE64_URL = /^[a-zA-Z0-9\\-_]+=*$/\n\nexport function RequiredSearchParamsBuilder(ELECTRON_SCHEME: string, PROVIDERS: string[]) {\n return z.object({\n scheme: z\n .string()\n .min(1, 'Scheme cannot be empty')\n .regex(REGEX_BASE64_URL)\n .refine((scheme) => scheme === ELECTRON_SCHEME, {\n message: 'Invalid scheme provided',\n }),\n provider: z.enum(PROVIDERS),\n challenge: z\n .string()\n .length(43, 'Challenge must be exactly 43 characters')\n .regex(REGEX_BASE64_URL),\n status: z.enum(['succeed', 'error', 'newUser']).optional(),\n })\n}\nexport const OptionalSearchParamsZodBuilder = z.object({\n scopes: z.array(z.string()).optional(),\n loginHint: z.string().optional(),\n additionalData: z.record(z.string(), z.any()).optional(),\n requestSignUp: boolean().optional(),\n})\nexport const safeEncodeURL = (data: unknown) => {\n return safeTry(() => {\n if (data === undefined || data === null) {\n throw new BigIOError('Invalid input for safeEncodeURL: input is null/undefine', {\n bigioErrorStack: [{ msg: 'input is null/undefine' }],\n })\n }\n\n const jsonStr = JSON.stringify(data)\n const bytes = GLOBAL_ENCODER.encode(jsonStr)\n\n return encode64(bytes)\n }, true)\n}\n\nexport const safeDecodeURL = <T = unknown>(data: string): T => {\n return safeTry(() => {\n if (data === undefined || data === null) {\n throw new BigIOError('Invalid input for safeDecodeURL: input is null/undefined', {\n bigioErrorStack: [{ msg: 'input is null/undefined' }],\n })\n }\n if (typeof data !== 'string') {\n throw new BigIOError('Invalid input for safeDecodeURL: expected string', {\n bigioErrorStack: [{ ctx: { type: typeof data, value: data } }],\n })\n }\n const bytes = decode64(data)\n const jsonStr = GLOBAL_DECODER.decode(bytes)\n return JSON.parse(jsonStr)\n }, true)\n}\n","// root/packages/better-auth-electron/src/web/electron-web-clientHelper.ts\n\n// import type { createAuthClient } from 'better-auth/client'\n// import type { Atom, WritableAtom } from 'nanostores'\nimport { atom } from 'nanostores'\n\nexport const lazyClient = atom()\n","// root/src/web/electron-web-plugin.ts\n\nimport { useStore } from '@nanostores/react'\nimport type { BetterAuthClientPlugin, SessionQueryParams } from 'better-auth'\nimport type { BetterFetch, BetterFetchError, createAuthClient } from 'better-auth/client'\nimport type { Atom } from 'nanostores'\nimport { atom } from 'nanostores'\nimport type { ElectronWebOptions } from '../options/electron-plugin-options'\nimport { defaultWebOptions } from '../options/electron-plugin-options'\nimport {\n BigIOError,\n OptionalSearchParamsZodBuilder,\n RequiredSearchParamsBuilder,\n safeDecodeURL,\n safeTry,\n} from '../utils/electron-plugin-utils'\nimport { lazyClient } from './electron-web-clientHelper'\n\ntype StandardAuthClient = ReturnType<typeof createAuthClient>\nexport const setLazyClient = (client: unknown) => lazyClient.set(client)\n\nconst LOCK_NAME_IN_WINDOW = '__BIGIO_BETTER_AUTH_ELECTRON_WEB_ATTACHED__'\n\nconst checkAndSetGlobalLock = (): boolean => {\n const win = window as typeof window & { [key: string]: unknown }\n if (typeof win[LOCK_NAME_IN_WINDOW] === 'boolean' && win[LOCK_NAME_IN_WINDOW]) {\n return true\n }\n win[LOCK_NAME_IN_WINDOW] = true\n return false\n}\n\nexport const electronWebHandoffPlugin = <\n T extends {\n $Infer: {\n Session: {\n session: unknown\n user: unknown\n }\n }\n },\n>() => {\n type SessionType = T['$Infer']['Session']['session']\n type UserType = T['$Infer']['Session']['user']\n type UseSessionData = {\n data: { user: UserType; session: SessionType }\n error: BetterFetchError | null\n isPending: boolean\n isRefetching: boolean\n refetch: (\n queryParams?:\n | {\n query?: SessionQueryParams\n }\n | undefined,\n ) => Promise<void>\n }\n const config: ElectronWebOptions = { ...defaultWebOptions }\n const {\n CHALLENGE_NAME_IN_URL,\n PROVIDER_NAME_IN_URL,\n SCHEME_NAME_IN_URL,\n PROVIDERS,\n ELECTRON_SCHEME,\n WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME,\n BACKEND_FAST_TICKET_URL,\n SCOPES_NAME_IN_URL,\n LOGINHINT_NAME_IN_URL,\n ADDITIONAL_DATA_NAME_IN_URL,\n REQUEST_SIGN_UP_NAME_IN_URL,\n AUTH_STATUS_NAME_IN_URL,\n } = config\n const electronWebAtoms = ($fetch: BetterFetch) => {\n const handoffError = atom<string | null>(null)\n const handoffStatus = atom<'idle' | 'pending' | 'connecting' | 'succeed' | 'failed'>('idle')\n const fastLogin = atom<boolean | null>(null)\n const initializationErrorAtom = atom<Error | null>(null)\n return {\n handoffError: handoffError,\n handoffStatus: handoffStatus,\n fastLogin: fastLogin,\n initializationErrorAtom: initializationErrorAtom,\n }\n }\n type ElectronWebAtoms = ReturnType<typeof electronWebAtoms>\n\n return {\n id: 'bigio-electron-webhandoff-plugin',\n getAtoms: ($fetch) => electronWebAtoms($fetch),\n getActions: ($fetch, $store) => {\n const sessionAtom = $store.atoms.session as Atom<UseSessionData>\n\n const {\n handoffStatus,\n handoffError,\n fastLogin: fastLoginAtom,\n initializationErrorAtom,\n } = $store.atoms as unknown as ElectronWebAtoms\n\n const handoffLogic = async () => {\n // 'connecting' | 'succeed' | 'failed' early return\n // only 'idle' and 'pending' will run the logic\n if (handoffStatus.get() !== 'idle' && handoffStatus.get() !== 'pending') {\n return false\n }\n const { data: sessionData, isPending, isRefetching, error } = sessionAtom.get()\n if (isPending || isRefetching || error) {\n return false\n }\n const searchParams = new URLSearchParams(window.location.search)\n const scheme = searchParams.get(SCHEME_NAME_IN_URL)\n if (!scheme) {\n return false\n }\n if (scheme !== ELECTRON_SCHEME) {\n throw new BigIOError(`Wrong Scheme: ${scheme}`, {\n bigioErrorStack: [\n {\n msg: `Wrong Scheme: ${scheme}`,\n },\n ],\n })\n }\n const provider = searchParams.get(PROVIDER_NAME_IN_URL)\n if (!provider) {\n return false\n }\n const challenge = searchParams.get(CHALLENGE_NAME_IN_URL)\n if (!challenge) {\n return false\n }\n\n const SearchParamsZod = RequiredSearchParamsBuilder(ELECTRON_SCHEME, [...PROVIDERS])\n const requiredValidParams = SearchParamsZod.parse({\n scheme: scheme,\n provider: provider,\n challenge: challenge,\n })\n\n const scopes = searchParams.get(SCOPES_NAME_IN_URL)\n const loginHint = searchParams.get(LOGINHINT_NAME_IN_URL)\n const additionalData = searchParams.get(ADDITIONAL_DATA_NAME_IN_URL)\n const requestSignUp = searchParams.get(REQUEST_SIGN_UP_NAME_IN_URL)\n\n const optionalValidParams = OptionalSearchParamsZodBuilder.parse({\n scopes: scopes ? safeDecodeURL(scopes) : undefined,\n loginHint: loginHint ? safeDecodeURL(loginHint) : undefined,\n additionalData: additionalData ? safeDecodeURL(additionalData) : undefined,\n requestSignUp: requestSignUp ? safeDecodeURL(requestSignUp) : undefined,\n })\n\n const client = lazyClient.get() as StandardAuthClient\n if (!client) {\n throw new BigIOError('handoff fn faild to get AuthClient', {\n bigioErrorStack: [{ msg: 'check the init authClient code' }],\n })\n }\n const fastLogin = async () => {\n handoffStatus.set('connecting')\n return await safeTry(async () => {\n const { data: fastTicketData, error: fastTicketError } =\n await client.$fetch<{\n redirect: string\n }>(`/${BACKEND_FAST_TICKET_URL}`, {\n method: 'POST',\n body: {\n userid: (sessionData?.user as { id: unknown }).id,\n scheme: scheme,\n provider: provider,\n challenge: challenge,\n },\n credentials: 'include',\n })\n if (fastTicketError || !fastTicketData.redirect) {\n throw new BigIOError('Failed to get fast ticket', {\n bigioErrorStack: [\n {\n msg: 'Failed to get fast ticket',\n ctx: {\n requiredValidParams: requiredValidParams,\n error: fastTicketError,\n },\n },\n ],\n })\n }\n const targetUrl = fastTicketData.redirect\n if (!targetUrl.startsWith(`${scheme}://`)) {\n throw new BigIOError(\n `Failed to get fast ticket with Wrong Scheme: ${scheme}`,\n {\n bigioErrorStack: [\n {\n msg: 'Failed to get fast ticket with Wrong Scheme',\n ctx: scheme,\n },\n ],\n },\n )\n }\n\n handoffStatus.set('succeed')\n window.location.href = targetUrl\n return sessionData.user\n }, true)\n }\n\n const parseURL = (status: string) => {\n const callbackURL = new URL(\n `/${WEB_OAUTH_SIGNIN_CALLBACK_PATHNAME}`,\n window.location.origin,\n )\n callbackURL.searchParams.set(AUTH_STATUS_NAME_IN_URL, status)\n callbackURL.searchParams.set(SCHEME_NAME_IN_URL, requiredValidParams.scheme)\n callbackURL.searchParams.set(PROVIDER_NAME_IN_URL, requiredValidParams.provider)\n callbackURL.searchParams.set(\n CHALLENGE_NAME_IN_URL,\n requiredValidParams.challenge,\n )\n return callbackURL.pathname + callbackURL.search\n }\n const regularLogin = async (loginProvider: (typeof PROVIDERS)[number]) => {\n handoffStatus.set('connecting')\n return await safeTry(async () => {\n const { data: socialData, error: socialError } = await client.signIn.social(\n {\n provider: loginProvider,\n callbackURL: parseURL('succeed'),\n scopes: optionalValidParams.scopes,\n additionalData: optionalValidParams.additionalData,\n loginHint: optionalValidParams.loginHint,\n requestSignUp: optionalValidParams.requestSignUp,\n disableRedirect: false,\n errorCallbackURL: parseURL('error'),\n newUserCallbackURL: parseURL('newUser'),\n },\n )\n if (!socialData || socialError) {\n throw new BigIOError(`Faild to sign in with ${loginProvider}`, {\n bigioErrorStack: [\n {\n ctx: {\n provider: loginProvider,\n error: socialError,\n },\n },\n ],\n })\n }\n handoffStatus.set('succeed')\n return socialData\n }, true)\n }\n if (sessionData?.session) {\n if (optionalValidParams.requestSignUp) {\n return await regularLogin(provider as (typeof PROVIDERS)[number])\n }\n const isFastLogin = fastLoginAtom.get()\n if (isFastLogin === true) {\n return await fastLogin()\n }\n if (isFastLogin === false) {\n return await regularLogin(provider as (typeof PROVIDERS)[number])\n }\n if (isFastLogin === null) {\n handoffStatus.set('pending')\n return true\n }\n } else {\n return await regularLogin(provider as (typeof PROVIDERS)[number])\n }\n return false\n }\n // const { data, error } = safeTry(() => handoffLogic())\n if (!checkAndSetGlobalLock()) {\n sessionAtom.listen(async (aatom) => {\n console.log(sessionAtom.get())\n const { data, error } = await safeTry(() => handoffLogic())\n if (error) {\n handoffStatus.set('failed')\n handoffError.set(error.message)\n initializationErrorAtom.set(error)\n console.error(error)\n }\n })\n fastLoginAtom.listen(async () => {\n handoffStatus.set('idle')\n const { data, error } = await safeTry(() => handoffLogic())\n if (error) {\n handoffStatus.set('failed')\n handoffError.set(error.message)\n initializationErrorAtom.set(error)\n console.error(error)\n }\n })\n }\n\n const setFastLogin = (decision: boolean) => {\n fastLoginAtom.set(decision)\n }\n return {\n bigio: {\n useElectronOAuthSession: () => {\n const initializationError = initializationErrorAtom.get()\n if (initializationError instanceof Error) {\n console.error(initializationError)\n initializationErrorAtom.set(null)\n }\n const { data, error, isPending, isRefetching, refetch } =\n useStore(sessionAtom)\n const oauthError = useStore<typeof handoffError>(handoffError)\n\n const oauthStatus = useStore<typeof handoffStatus>(handoffStatus)\n\n return {\n data: data,\n error: error,\n isPending: isPending,\n isRefetching: isRefetching,\n refetch: refetch,\n oauthStatus: oauthStatus,\n oauthError: oauthError,\n setFastLogin: setFastLogin,\n }\n },\n },\n }\n },\n } satisfies BetterAuthClientPlugin\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigio/better-auth-electron",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "author": "bigmusic",
5
5
  "license": "MIT",
6
6
  "private": false,