@xylex-group/athena 2.8.2 → 2.10.0
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/README.md +154 -64
- package/dist/browser.cjs +1550 -181
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +8 -7
- package/dist/browser.d.ts +8 -7
- package/dist/browser.js +1540 -182
- package/dist/browser.js.map +1 -1
- package/dist/cli/index.cjs +1337 -67
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +3 -3
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +1337 -67
- package/dist/cli/index.js.map +1 -1
- package/dist/{model-form-Cx3wtvi8.d.ts → client-B7EQ_hPV.d.cts} +606 -118
- package/dist/{model-form-_ugfOXao.d.cts → client-BYii6dU9.d.ts} +606 -118
- package/dist/index.cjs +1540 -113
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -7
- package/dist/index.d.ts +8 -7
- package/dist/index.js +1530 -114
- package/dist/index.js.map +1 -1
- package/dist/model-form-ByvyyvxB.d.ts +96 -0
- package/dist/model-form-DACdBLYG.d.cts +96 -0
- package/dist/{react-email-CiiSVa9F.d.cts → module-DC96HJa3.d.cts} +130 -5
- package/dist/{react-email-WN8UU3AL.d.ts → module-DbHlxpeR.d.ts} +130 -5
- package/dist/next/client.cjs +8591 -0
- package/dist/next/client.cjs.map +1 -0
- package/dist/next/client.d.cts +24 -0
- package/dist/next/client.d.ts +24 -0
- package/dist/next/client.js +8589 -0
- package/dist/next/client.js.map +1 -0
- package/dist/next/server.cjs +8709 -0
- package/dist/next/server.cjs.map +1 -0
- package/dist/next/server.d.cts +52 -0
- package/dist/next/server.d.ts +52 -0
- package/dist/next/server.js +8706 -0
- package/dist/next/server.js.map +1 -0
- package/dist/{pipeline-BtD-Uo5X.d.cts → pipeline-CmUZsXsi.d.cts} +1 -1
- package/dist/{pipeline-yCIZNJHE.d.ts → pipeline-DZMsPxUg.d.ts} +1 -1
- package/dist/react.cjs +30 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +38 -10
- package/dist/react.d.ts +38 -10
- package/dist/react.js +30 -2
- package/dist/react.js.map +1 -1
- package/dist/shared-BMVGMnti.d.cts +35 -0
- package/dist/shared-DRptGBWP.d.ts +35 -0
- package/dist/{types-g8G6J0xE.d.cts → types-BeZIHduP.d.cts} +2 -1
- package/dist/{types-g8G6J0xE.d.ts → types-BeZIHduP.d.ts} +2 -1
- package/dist/{types-C2kiTt6-.d.ts → types-C-YvfgYh.d.cts} +26 -2
- package/dist/{types-89EfjLjV.d.cts → types-CRjDwmtJ.d.ts} +26 -2
- package/package.json +32 -14
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gateway/errors.ts","../src/gateway/url.ts","../src/cookies/cookie-utils.ts","../src/cookies/index.ts","../package.json","../src/sdk-version.ts","../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts","../src/react/utils.ts","../src/react/query-client.ts","../src/react/provider.ts","../src/react/use-query.ts","../src/react/use-mutation.ts","../src/react/use-session.ts","../src/react/use-storage-upload.ts","../src/schema/model-form.ts"],"names":["isRecord","serialized","sourceData","selectedData","useMemo","useCallback","useRef","useSyncExternalStore","useState","useEffect"],"mappings":"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","file":"react.js","sourcesContent":["import type {\n AthenaGatewayEndpointPath,\n AthenaGatewayErrorCode,\n AthenaGatewayErrorDetails,\n AthenaGatewayMethod,\n AthenaGatewayResponse,\n} from './types.js'\n\nexport interface AthenaGatewayErrorInput {\n code: AthenaGatewayErrorCode\n message: string\n status?: number\n endpoint?: AthenaGatewayEndpointPath\n method?: AthenaGatewayMethod\n requestId?: string\n hint?: string\n cause?: string\n}\n\n/**\n * Canonical error for gateway failures.\n * Holds request context and machine-readable classification.\n */\nexport class AthenaGatewayError extends Error {\n readonly code: AthenaGatewayErrorCode\n readonly status: number\n readonly endpoint?: AthenaGatewayEndpointPath\n readonly method?: AthenaGatewayMethod\n readonly requestId?: string\n readonly hint?: string\n readonly causeDetail?: string\n\n constructor(input: AthenaGatewayErrorInput) {\n super(input.message)\n this.name = 'AthenaGatewayError'\n this.code = input.code\n this.status = input.status ?? 0\n this.endpoint = input.endpoint\n this.method = input.method\n this.requestId = input.requestId\n this.hint = input.hint\n this.causeDetail = input.cause\n }\n\n toDetails(): AthenaGatewayErrorDetails {\n return {\n code: this.code,\n message: this.message,\n status: this.status,\n endpoint: this.endpoint,\n method: this.method,\n requestId: this.requestId,\n hint: this.hint,\n cause: this.causeDetail,\n }\n }\n\n static fromResponse<T>(\n response: AthenaGatewayResponse<T>,\n fallback: Omit<AthenaGatewayErrorInput, 'code' | 'message' | 'status'>,\n ) {\n const details = response.errorDetails\n if (details) {\n return new AthenaGatewayError({\n code: details.code,\n message: details.message,\n status: details.status,\n endpoint: details.endpoint ?? fallback.endpoint,\n method: details.method ?? fallback.method,\n requestId: details.requestId ?? fallback.requestId,\n hint: details.hint,\n cause: details.cause,\n })\n }\n\n return new AthenaGatewayError({\n code: 'HTTP_ERROR',\n message: response.error ?? 'Gateway request failed',\n status: response.status,\n endpoint: fallback.endpoint,\n method: fallback.method,\n requestId: fallback.requestId,\n })\n }\n}\n\nexport function isAthenaGatewayError(error: unknown): error is AthenaGatewayError {\n return error instanceof AthenaGatewayError\n}\n","import { AthenaGatewayError } from './errors.ts'\n\nexport const ATHENA_DEFAULT_BASE_URL = 'https://athena-db.com'\n\nfunction describeReceivedValue(value: unknown): string {\n if (value === undefined) return 'undefined'\n if (value === null) return 'null'\n if (typeof value === 'string') {\n return value.trim().length > 0 ? JSON.stringify(value) : 'an empty string'\n }\n return `${typeof value} ${JSON.stringify(value)}`\n}\n\nfunction invalidBaseUrlError(message: string, hint: string): AthenaGatewayError {\n return new AthenaGatewayError({\n code: 'INVALID_URL',\n message,\n status: 0,\n hint,\n })\n}\n\nexport interface NormalizeAthenaGatewayBaseUrlOptions {\n defaultBaseUrl?: string\n label?: string\n}\n\nexport function normalizeAthenaGatewayBaseUrl(\n input: string | null | undefined,\n options: NormalizeAthenaGatewayBaseUrlOptions = {},\n): string {\n const label = options.label ?? 'Athena gateway base URL'\n const candidate = input ?? options.defaultBaseUrl\n\n if (candidate === undefined || candidate === null) {\n throw invalidBaseUrlError(\n `${label} must be a non-empty absolute http(s) URL. Received ${describeReceivedValue(input)}.`,\n 'Set ATHENA_URL (or pass createClient(url, ...)) to a full URL such as \"https://mirror3.athena-db.com\".',\n )\n }\n\n const trimmed = candidate.trim()\n if (!trimmed) {\n throw invalidBaseUrlError(\n `${label} must be a non-empty absolute http(s) URL. Received ${describeReceivedValue(candidate)}.`,\n 'Set ATHENA_URL (or pass createClient(url, ...)) to a full URL such as \"https://mirror3.athena-db.com\".',\n )\n }\n\n let parsed: URL\n try {\n parsed = new URL(trimmed)\n } catch {\n throw invalidBaseUrlError(\n `${label} must be a valid absolute http(s) URL. Received ${describeReceivedValue(candidate)}.`,\n 'Use a full URL including the protocol, for example \"https://mirror3.athena-db.com\".',\n )\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw invalidBaseUrlError(\n `${label} must use http or https. Received ${JSON.stringify(trimmed)}.`,\n 'Use an Athena gateway URL such as \"https://mirror3.athena-db.com\".',\n )\n }\n\n if (parsed.search || parsed.hash) {\n throw invalidBaseUrlError(\n `${label} must not include query parameters or hash fragments. Received ${JSON.stringify(trimmed)}.`,\n 'Pass only the base URL. Endpoint paths such as \"/gateway/fetch\" are appended by the SDK.',\n )\n }\n\n return parsed.toString().replace(/\\/+$/, '')\n}\n\nexport function buildAthenaGatewayUrl(baseUrl: string, path: string): string {\n if (!path.startsWith('/')) {\n throw invalidBaseUrlError(\n `Athena gateway path must start with \"/\". Received ${JSON.stringify(path)}.`,\n 'Use a leading slash such as \"/gateway/fetch\" or \"/\".',\n )\n }\n\n return `${baseUrl}${path}`\n}\n","import type { AthenaCookieOptions } from './types.ts'\n\nfunction tryDecode(str: string): string {\n if (str.indexOf('%') === -1) {\n return str\n }\n try {\n return decodeURIComponent(str)\n } catch {\n return str\n }\n}\n\nexport interface CookieAttributes {\n value: string\n 'max-age'?: number\n expires?: Date\n domain?: string\n path?: string\n secure?: boolean\n httponly?: boolean\n partitioned?: boolean\n samesite?: 'strict' | 'lax' | 'none'\n [key: string]: unknown\n}\n\nexport const SECURE_COOKIE_PREFIX = '__Secure-'\nexport const HOST_COOKIE_PREFIX = '__Host-'\n\n/**\n * Remove __Secure- or __Host- prefix from cookie name.\n */\nexport function stripSecureCookiePrefix(cookieName: string): string {\n if (cookieName.startsWith(SECURE_COOKIE_PREFIX)) {\n return cookieName.slice(SECURE_COOKIE_PREFIX.length)\n }\n if (cookieName.startsWith(HOST_COOKIE_PREFIX)) {\n return cookieName.slice(HOST_COOKIE_PREFIX.length)\n }\n return cookieName\n}\n\n/**\n * Split a comma-joined `Set-Cookie` header string into individual cookies.\n */\nexport function splitSetCookieHeader(setCookie: string): string[] {\n if (!setCookie) {\n return []\n }\n\n const result: string[] = []\n let start = 0\n let i = 0\n\n while (i < setCookie.length) {\n if (setCookie[i] === ',') {\n let j = i + 1\n while (j < setCookie.length && setCookie[j] === ' ') {\n j++\n }\n while (j < setCookie.length && setCookie[j] !== '=' && setCookie[j] !== ';' && setCookie[j] !== ',') {\n j++\n }\n\n if (j < setCookie.length && setCookie[j] === '=') {\n const part = setCookie.slice(start, i).trim()\n if (part) {\n result.push(part)\n }\n start = i + 1\n while (start < setCookie.length && setCookie[start] === ' ') {\n start++\n }\n i = start\n continue\n }\n }\n i++\n }\n\n const last = setCookie.slice(start).trim()\n if (last) {\n result.push(last)\n }\n\n return result\n}\n\nexport function parseSetCookieHeader(setCookie: string): Map<string, CookieAttributes> {\n const cookies = new Map<string, CookieAttributes>()\n const cookieArray = splitSetCookieHeader(setCookie)\n\n for (const cookieString of cookieArray) {\n const parts = cookieString.split(';').map((part) => part.trim())\n const [nameValue, ...attributes] = parts\n const [name, ...valueParts] = (nameValue || '').split('=')\n if (!name) {\n continue\n }\n\n const value = unquoteCookieValue(valueParts.join('='))\n const decodedValue = tryDecode(value)\n const attrObj: CookieAttributes = { value: decodedValue }\n\n for (const attribute of attributes) {\n const [attrName, ...attrValueParts] = attribute.split('=')\n const attrValue = attrValueParts.join('=')\n const normalizedAttrName = attrName.trim().toLowerCase()\n switch (normalizedAttrName) {\n case 'max-age':\n attrObj['max-age'] = attrValue ? parseInt(attrValue.trim(), 10) : undefined\n break\n case 'expires':\n attrObj.expires = attrValue ? new Date(attrValue.trim()) : undefined\n break\n case 'domain':\n attrObj.domain = attrValue ? attrValue.trim() : undefined\n break\n case 'path':\n attrObj.path = attrValue ? attrValue.trim() : undefined\n break\n case 'secure':\n attrObj.secure = true\n break\n case 'httponly':\n attrObj.httponly = true\n break\n case 'samesite':\n attrObj.samesite = attrValue ? (attrValue.trim().toLowerCase() as 'strict' | 'lax' | 'none') : undefined\n break\n case 'partitioned':\n attrObj.partitioned = true\n break\n default:\n attrObj[normalizedAttrName] = attrValue ? attrValue.trim() : true\n break\n }\n }\n\n cookies.set(name, attrObj)\n }\n\n return cookies\n}\n\nexport function toCookieOptions(attributes: CookieAttributes): AthenaCookieOptions {\n return {\n maxAge: attributes['max-age'],\n expires: attributes.expires,\n domain: attributes.domain,\n path: attributes.path,\n secure: attributes.secure,\n httpOnly: attributes.httponly,\n sameSite: attributes.samesite,\n partitioned: attributes.partitioned,\n }\n}\n\n/**\n * Cookie-name token char set per RFC 7230 §3.2.6.\n */\nexport const cookieNameRegex = /^[\\w!#$%&'*.^`|~+-]+$/\n\nfunction unquoteCookieValue(value: string): string {\n if (value.length < 2 || !value.startsWith('\"') || !value.endsWith('\"')) {\n return value\n }\n return value.slice(1, -1)\n}\n\n/**\n * Parse a `Cookie` header into a key/value map.\n */\nexport function parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = cookieHeader.split('; ')\n const cookieMap = new Map<string, string>()\n cookies.forEach((cookie) => {\n const [name, value] = cookie.split(/=(.*)/s)\n cookieMap.set(name as string, value as string)\n })\n return cookieMap\n}\n\n/**\n * Add or replace a cookie in the request `Cookie` header.\n */\nexport function setRequestCookie(headers: Headers, name: string, value: string): void {\n const cookieMap = parseCookies(headers.get('cookie') || '')\n if (cookieNameRegex.test(name)) {\n cookieMap.set(name, value)\n }\n headers.set(\n 'cookie',\n Array.from(cookieMap, ([key, currentValue]) => `${key}=${encodeURIComponent(currentValue)}`).join('; '),\n )\n}\n\n/**\n * Merge `Set-Cookie` values into a `Cookie` header.\n */\nexport function applySetCookies(target: Headers, setCookieValues: Iterable<string>): void {\n const cookieMap = parseCookies(target.get('cookie') || '')\n for (const setCookie of setCookieValues) {\n for (const [name, attr] of parseSetCookieHeader(setCookie)) {\n if (cookieNameRegex.test(name)) {\n cookieMap.set(name, attr.value)\n }\n }\n }\n target.set(\n 'cookie',\n Array.from(cookieMap, ([key, currentValue]) => `${key}=${encodeURIComponent(currentValue)}`).join('; '),\n )\n}\n\nexport function setCookieToHeader(headers: Headers) {\n return (context: { response: Response }) => {\n const setCookieHeader = context.response.headers.get('set-cookie')\n if (!setCookieHeader) {\n return\n }\n applySetCookies(headers, [setCookieHeader])\n }\n}\n","import { decodeBase64UrlToString, encodeStringToBase64Url } from './base64.ts'\r\nimport {\r\n HOST_COOKIE_PREFIX,\r\n SECURE_COOKIE_PREFIX,\r\n parseCookies,\r\n parseSetCookieHeader,\r\n setCookieToHeader,\r\n setRequestCookie,\r\n splitSetCookieHeader,\r\n stripSecureCookiePrefix,\r\n toCookieOptions,\r\n} from './cookie-utils.ts'\r\nimport { signHmacBase64Url, signJwtHS256, verifyJwtHS256 } from './crypto.ts'\r\nimport { createAccountStore, createSessionStore, getAccountCookie, getChunkedCookie } from './session-store.ts'\r\nimport type {\r\n AthenaAuthCookie,\r\n AthenaAuthCookies,\r\n AthenaCookieContextRuntime,\r\n AthenaCookieOptions,\r\n AthenaCookiesOptions,\r\n AthenaCookieVersionResolver,\r\n AthenaGetCookieCacheConfig,\r\n AthenaSessionPair,\r\n} from './types.ts'\r\n\r\nconst DEFAULT_COOKIE_PREFIX = 'athena-auth'\r\nconst LEGACY_COOKIE_PREFIX = 'better-auth'\r\nconst DEFAULT_SESSION_MAX_AGE = 7 * 24 * 60 * 60\r\nconst DEFAULT_CACHE_MAX_AGE = 60 * 5\r\n\r\nfunction isProductionRuntime(): boolean {\r\n return typeof process !== 'undefined' && process.env?.NODE_ENV === 'production'\r\n}\r\n\r\nfunction getEnvironmentSecret(): string | undefined {\r\n if (typeof process === 'undefined') {\r\n return undefined\r\n }\r\n return process.env?.ATHENA_AUTH_SECRET || process.env?.BETTER_AUTH_SECRET || process.env?.AUTH_SECRET\r\n}\r\n\r\nfunction isDynamicBaseURLConfig(baseURL: AthenaCookiesOptions['baseURL']): boolean {\r\n return (\r\n typeof baseURL === 'object' &&\r\n baseURL !== null &&\r\n 'allowedHosts' in baseURL &&\r\n Array.isArray((baseURL as { allowedHosts?: unknown }).allowedHosts)\r\n )\r\n}\r\n\r\nfunction resolveCookiePrefixes(primaryPrefix: string): string[] {\r\n const prefixes = [primaryPrefix]\r\n if (!prefixes.includes(DEFAULT_COOKIE_PREFIX)) {\r\n prefixes.push(DEFAULT_COOKIE_PREFIX)\r\n }\r\n if (!prefixes.includes(LEGACY_COOKIE_PREFIX)) {\r\n prefixes.push(LEGACY_COOKIE_PREFIX)\r\n }\r\n return prefixes\r\n}\r\n\r\nfunction createError(message: string): Error {\r\n return new Error(`@xylex-group/athena/cookies: ${message}`)\r\n}\r\n\r\nfunction getSecretOrThrow(secret?: string): string {\r\n const resolved = secret || getEnvironmentSecret()\r\n if (!resolved) {\r\n throw createError(\r\n 'getCookieCache requires a secret. Pass `secret` or set ATHENA_AUTH_SECRET/BETTER_AUTH_SECRET/AUTH_SECRET.',\r\n )\r\n }\r\n return resolved\r\n}\r\n\r\nfunction asObject(value: unknown): Record<string, unknown> | null {\r\n if (!value || typeof value !== 'object') {\r\n return null\r\n }\r\n return value as Record<string, unknown>\r\n}\r\n\r\nfunction getSessionTokenFromPair(session: AthenaSessionPair): string {\r\n const token = session.session?.token\r\n if (typeof token !== 'string' || token.length === 0) {\r\n throw createError('setSessionCookie requires `session.session.token` to be a non-empty string.')\r\n }\r\n return token\r\n}\r\n\r\nasync function resolveCookieVersion(\r\n versionConfig: AthenaCookieVersionResolver | undefined,\r\n session: Record<string, unknown>,\r\n user: Record<string, unknown>,\r\n): Promise<string> {\r\n if (!versionConfig) {\r\n return '1'\r\n }\r\n if (typeof versionConfig === 'string') {\r\n return versionConfig\r\n }\r\n return versionConfig(session, user)\r\n}\r\n\r\nfunction getSessionCookieCacheName(cookiePrefix: string, cookieName: string, isSecure: boolean): string {\r\n return isSecure ? `${SECURE_COOKIE_PREFIX}${cookiePrefix}.${cookieName}` : `${cookiePrefix}.${cookieName}`\r\n}\r\n\r\nasync function setCookieValue(\r\n ctx: AthenaCookieContextRuntime,\r\n name: string,\r\n value: string,\r\n attributes: AthenaCookieOptions,\r\n): Promise<void> {\r\n const secret = ctx.context.secret\r\n if (secret && typeof ctx.setSignedCookie === 'function') {\r\n await ctx.setSignedCookie(name, value, secret, attributes)\r\n return\r\n }\r\n ctx.setCookie(name, value, attributes)\r\n}\r\n\r\nfunction parseJsonSafely<T>(value: string): T | null {\r\n try {\r\n return JSON.parse(value) as T\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction getIsSecureCookie(config: { isSecure?: boolean } | undefined): boolean {\r\n if (config?.isSecure !== undefined) {\r\n return config.isSecure\r\n }\r\n return isProductionRuntime()\r\n}\r\n\r\nexport function createCookieGetter(options: AthenaCookiesOptions) {\r\n const baseURLString = typeof options.baseURL === 'string' ? options.baseURL : undefined\r\n const dynamicProtocol =\r\n typeof options.baseURL === 'object' && options.baseURL !== null ? options.baseURL.protocol : undefined\r\n\r\n const secure =\r\n options.advanced?.useSecureCookies !== undefined\r\n ? options.advanced.useSecureCookies\r\n : dynamicProtocol === 'https'\r\n ? true\r\n : dynamicProtocol === 'http'\r\n ? false\r\n : baseURLString\r\n ? baseURLString.startsWith('https://')\r\n : isProductionRuntime()\r\n\r\n const secureCookiePrefix = secure ? SECURE_COOKIE_PREFIX : ''\r\n const crossSubdomainEnabled = !!options.advanced?.crossSubDomainCookies?.enabled\r\n const domain = crossSubdomainEnabled\r\n ? options.advanced?.crossSubDomainCookies?.domain || (baseURLString ? new URL(baseURLString).hostname : undefined)\r\n : undefined\r\n\r\n if (crossSubdomainEnabled && !domain && !isDynamicBaseURLConfig(options.baseURL)) {\r\n throw createError('baseURL is required when `crossSubDomainCookies.enabled` is true.')\r\n }\r\n\r\n function createCookie(cookieName: string, overrideAttributes: Partial<AthenaCookieOptions> = {}): AthenaAuthCookie {\r\n const prefix = options.advanced?.cookiePrefix || DEFAULT_COOKIE_PREFIX\r\n const name = options.advanced?.cookies?.[cookieName]?.name || `${prefix}.${cookieName}`\r\n const attributes = options.advanced?.cookies?.[cookieName]?.attributes || {}\r\n\r\n return {\r\n name: `${secureCookiePrefix}${name}`,\r\n attributes: {\r\n secure: !!secureCookiePrefix,\r\n sameSite: 'lax',\r\n path: '/',\r\n httpOnly: true,\r\n ...(crossSubdomainEnabled ? { domain } : {}),\r\n ...options.advanced?.defaultCookieAttributes,\r\n ...overrideAttributes,\r\n ...attributes,\r\n },\r\n }\r\n }\r\n\r\n return createCookie\r\n}\r\n\r\nexport function getCookies(options: AthenaCookiesOptions): AthenaAuthCookies {\r\n const createCookie = createCookieGetter(options)\r\n const sessionToken = createCookie('session_token', { maxAge: options.session?.expiresIn || DEFAULT_SESSION_MAX_AGE })\r\n const sessionData = createCookie('session_data', { maxAge: options.session?.cookieCache?.maxAge || DEFAULT_CACHE_MAX_AGE })\r\n const accountData = createCookie('account_data', { maxAge: options.session?.cookieCache?.maxAge || DEFAULT_CACHE_MAX_AGE })\r\n const dontRememberToken = createCookie('dont_remember')\r\n\r\n return {\r\n sessionToken: {\r\n name: sessionToken.name,\r\n attributes: sessionToken.attributes,\r\n },\r\n sessionData: {\r\n name: sessionData.name,\r\n attributes: sessionData.attributes,\r\n },\r\n dontRememberToken: {\r\n name: dontRememberToken.name,\r\n attributes: dontRememberToken.attributes,\r\n },\r\n accountData: {\r\n name: accountData.name,\r\n attributes: accountData.attributes,\r\n },\r\n }\r\n}\r\n\r\nexport async function setCookieCache(\r\n ctx: AthenaCookieContextRuntime,\r\n session: AthenaSessionPair,\r\n dontRememberMe: boolean,\r\n): Promise<void> {\r\n const cookieCacheConfig = ctx.context.options?.session?.cookieCache\r\n if (!cookieCacheConfig?.enabled) {\r\n return\r\n }\r\n\r\n const version = await resolveCookieVersion(\r\n cookieCacheConfig.version,\r\n session.session as Record<string, unknown>,\r\n session.user as Record<string, unknown>,\r\n )\r\n\r\n const sessionData = {\r\n session: session.session,\r\n user: session.user,\r\n updatedAt: Date.now(),\r\n version,\r\n }\r\n\r\n const baseAttributes = ctx.context.authCookies.sessionData.attributes\r\n const maxAge = dontRememberMe ? undefined : baseAttributes.maxAge\r\n const options: AthenaCookieOptions = {\r\n ...baseAttributes,\r\n maxAge,\r\n }\r\n const expiresAt = Date.now() + ((options.maxAge || 60) * 1000)\r\n const strategy = cookieCacheConfig.strategy || 'compact'\r\n const secret = getSecretOrThrow(ctx.context.secret)\r\n\r\n let encoded: string\r\n if (strategy === 'jwt') {\r\n encoded = await signJwtHS256(sessionData, secret, options.maxAge || DEFAULT_CACHE_MAX_AGE)\r\n } else if (strategy === 'jwe') {\r\n throw createError('`jwe` strategy is not supported by the SDK cookie helper.')\r\n } else {\r\n const signature = await signHmacBase64Url(\r\n secret,\r\n JSON.stringify({\r\n ...sessionData,\r\n expiresAt,\r\n }),\r\n )\r\n encoded = encodeStringToBase64Url(\r\n JSON.stringify({\r\n session: sessionData,\r\n expiresAt,\r\n signature,\r\n }),\r\n )\r\n }\r\n\r\n if (encoded.length > 4093) {\r\n const store = createSessionStore(ctx.context.authCookies.sessionData.name, options, ctx)\r\n const cookies = store.chunk(encoded, options)\r\n store.setCookies(cookies)\r\n } else {\r\n const store = createSessionStore(ctx.context.authCookies.sessionData.name, options, ctx)\r\n if (store.hasChunks()) {\r\n store.setCookies(store.clean())\r\n }\r\n ctx.setCookie(ctx.context.authCookies.sessionData.name, encoded, options)\r\n }\r\n}\r\n\r\nexport async function setSessionCookie(\r\n ctx: AthenaCookieContextRuntime,\r\n session: AthenaSessionPair,\r\n dontRememberMe?: boolean,\r\n overrides?: Partial<AthenaCookieOptions>,\r\n): Promise<void> {\r\n if (dontRememberMe === undefined && typeof ctx.getSignedCookie === 'function' && ctx.context.secret) {\r\n const existingFlag = await ctx.getSignedCookie(ctx.context.authCookies.dontRememberToken.name, ctx.context.secret)\r\n dontRememberMe = !!existingFlag\r\n }\r\n\r\n const resolvedDontRememberMe = dontRememberMe ?? false\r\n const token = getSessionTokenFromPair(session)\r\n const options = ctx.context.authCookies.sessionToken.attributes\r\n const maxAge = resolvedDontRememberMe ? undefined : ctx.context.sessionConfig?.expiresIn\r\n await setCookieValue(ctx, ctx.context.authCookies.sessionToken.name, token, {\r\n ...options,\r\n maxAge,\r\n ...overrides,\r\n })\r\n\r\n if (resolvedDontRememberMe) {\r\n await setCookieValue(\r\n ctx,\r\n ctx.context.authCookies.dontRememberToken.name,\r\n 'true',\r\n ctx.context.authCookies.dontRememberToken.attributes,\r\n )\r\n }\r\n\r\n await setCookieCache(ctx, session, resolvedDontRememberMe)\r\n ctx.context.setNewSession?.(session)\r\n}\r\n\r\n/**\r\n * Expires a cookie by setting `maxAge: 0` while preserving attributes.\r\n */\r\nexport function expireCookie(ctx: AthenaCookieContextRuntime, cookie: AthenaAuthCookie): void {\r\n ctx.setCookie(cookie.name, '', {\r\n ...cookie.attributes,\r\n maxAge: 0,\r\n })\r\n}\r\n\r\nexport function deleteSessionCookie(ctx: AthenaCookieContextRuntime, skipDontRememberMe?: boolean): void {\r\n expireCookie(ctx, ctx.context.authCookies.sessionToken)\r\n expireCookie(ctx, ctx.context.authCookies.sessionData)\r\n\r\n if (ctx.context.options?.account?.storeAccountCookie) {\r\n expireCookie(ctx, ctx.context.authCookies.accountData)\r\n const accountStore = createAccountStore(\r\n ctx.context.authCookies.accountData.name,\r\n ctx.context.authCookies.accountData.attributes,\r\n ctx,\r\n )\r\n accountStore.setCookies(accountStore.clean())\r\n }\r\n\r\n const sessionStore = createSessionStore(\r\n ctx.context.authCookies.sessionData.name,\r\n ctx.context.authCookies.sessionData.attributes,\r\n ctx,\r\n )\r\n sessionStore.setCookies(sessionStore.clean())\r\n\r\n if (!skipDontRememberMe) {\r\n expireCookie(ctx, ctx.context.authCookies.dontRememberToken)\r\n }\r\n}\r\n\r\nexport const getSessionCookie = (\r\n request: Request | Headers,\r\n config?:\r\n | {\r\n cookiePrefix?: string\r\n cookieName?: string\r\n path?: string\r\n }\r\n | undefined,\r\n): string | null => {\r\n const cookies = (request instanceof Headers || !('headers' in request) ? request : request.headers).get('cookie')\r\n if (!cookies) {\r\n return null\r\n }\r\n\r\n const { cookieName = 'session_token', cookiePrefix = 'athena-auth' } = config || {}\r\n const parsedCookie = parseCookies(cookies)\r\n const getCookie = (name: string): string | undefined =>\r\n parsedCookie.get(name) || parsedCookie.get(`${SECURE_COOKIE_PREFIX}${name}`)\r\n const candidateCookieNames = Array.from(new Set([\r\n cookieName,\r\n cookieName.replace(/_/g, '-'),\r\n cookieName.replace(/-/g, '_'),\r\n ])).filter(Boolean)\r\n for (const candidateName of candidateCookieNames) {\r\n const sessionToken =\r\n getCookie(`${cookiePrefix}.${candidateName}`) || getCookie(`${cookiePrefix}-${candidateName}`)\r\n if (sessionToken) {\r\n return sessionToken\r\n }\r\n }\r\n return null\r\n}\r\n\r\nexport const getCookieCache = async <\r\n SessionShape extends Record<string, unknown> = Record<string, unknown>,\r\n UserShape extends Record<string, unknown> = Record<string, unknown>,\r\n>(\r\n request: Request | Headers,\r\n config?: AthenaGetCookieCacheConfig<SessionShape, UserShape>,\r\n): Promise<{\r\n session: SessionShape\r\n user: UserShape\r\n updatedAt: number\r\n version?: string\r\n} | null> => {\r\n const headers = request instanceof Headers || !('headers' in request) ? request : request.headers\r\n const cookieHeader = headers.get('cookie')\r\n if (!cookieHeader) {\r\n return null\r\n }\r\n\r\n const parsedCookie = parseCookies(cookieHeader)\r\n const cookieName = config?.cookieName || 'session_data'\r\n const requestedPrefix = config?.cookiePrefix || DEFAULT_COOKIE_PREFIX\r\n const strategy = config?.strategy || 'compact'\r\n const cookiePrefixes = resolveCookiePrefixes(requestedPrefix)\r\n const isSecure = getIsSecureCookie(config)\r\n const secret = getSecretOrThrow(config?.secret)\r\n\r\n let sessionData: string | undefined\r\n\r\n for (const prefix of cookiePrefixes) {\r\n const candidate = getSessionCookieCacheName(prefix, cookieName, isSecure)\r\n const cookieValue = parsedCookie.get(candidate)\r\n if (cookieValue) {\r\n sessionData = cookieValue\r\n break\r\n }\r\n }\r\n\r\n if (!sessionData) {\r\n const reconstructedChunks: Array<{ index: number; value: string }> = []\r\n for (const prefix of cookiePrefixes) {\r\n const candidate = getSessionCookieCacheName(prefix, cookieName, isSecure)\r\n for (const [name, value] of parsedCookie.entries()) {\r\n if (!name.startsWith(`${candidate}.`)) {\r\n continue\r\n }\r\n const parts = name.split('.')\r\n const indexStr = parts[parts.length - 1]\r\n const index = parseInt(indexStr || '0', 10)\r\n if (!Number.isNaN(index)) {\r\n reconstructedChunks.push({ index, value })\r\n }\r\n }\r\n if (reconstructedChunks.length > 0) {\r\n break\r\n }\r\n }\r\n\r\n if (reconstructedChunks.length > 0) {\r\n reconstructedChunks.sort((left, right) => left.index - right.index)\r\n sessionData = reconstructedChunks.map((chunk) => chunk.value).join('')\r\n }\r\n }\r\n\r\n if (!sessionData) {\r\n return null\r\n }\r\n\r\n if (strategy === 'jwe') {\r\n throw createError(\r\n '`jwe` strategy is not supported by the SDK cookie helper. Use compact/jwt or pass cookie data through the auth server.',\r\n )\r\n }\r\n\r\n if (strategy === 'jwt') {\r\n const payload = await verifyJwtHS256<Record<string, unknown>>(sessionData, secret)\r\n if (!payload) {\r\n return null\r\n }\r\n const sessionRecord = asObject(payload.session)\r\n const userRecord = asObject(payload.user)\r\n const updatedAt = payload.updatedAt\r\n if (!sessionRecord || !userRecord || typeof updatedAt !== 'number') {\r\n return null\r\n }\r\n\r\n if (config?.version) {\r\n const cookieVersion = typeof payload.version === 'string' ? payload.version : '1'\r\n const expectedVersion =\r\n typeof config.version === 'string'\r\n ? config.version\r\n : await config.version(sessionRecord as SessionShape, userRecord as UserShape)\r\n if (cookieVersion !== expectedVersion) {\r\n return null\r\n }\r\n }\r\n\r\n return {\r\n session: sessionRecord as SessionShape,\r\n user: userRecord as UserShape,\r\n updatedAt,\r\n version: typeof payload.version === 'string' ? payload.version : undefined,\r\n }\r\n }\r\n\r\n const compactPayload = parseJsonSafely<{\r\n session: {\r\n session: SessionShape\r\n user: UserShape\r\n updatedAt: number\r\n version?: string\r\n }\r\n expiresAt: number\r\n signature: string\r\n }>(decodeBase64UrlToString(sessionData))\r\n\r\n if (!compactPayload) {\r\n return null\r\n }\r\n\r\n const expectedSignature = await signHmacBase64Url(\r\n secret,\r\n JSON.stringify({\r\n ...compactPayload.session,\r\n expiresAt: compactPayload.expiresAt,\r\n }),\r\n )\r\n\r\n if (expectedSignature !== compactPayload.signature) {\r\n return null\r\n }\r\n\r\n if (compactPayload.expiresAt <= Date.now()) {\r\n return null\r\n }\r\n\r\n const resolvedSession = compactPayload.session\r\n if (config?.version) {\r\n const cookieVersion = resolvedSession.version || '1'\r\n const expectedVersion =\r\n typeof config.version === 'string'\r\n ? config.version\r\n : await config.version(resolvedSession.session, resolvedSession.user)\r\n if (cookieVersion !== expectedVersion) {\r\n return null\r\n }\r\n }\r\n\r\n const sessionObject = asObject(resolvedSession.session)\r\n const userObject = asObject(resolvedSession.user)\r\n if (!sessionObject || !userObject) {\r\n return null\r\n }\r\n\r\n return {\r\n session: sessionObject as SessionShape,\r\n user: userObject as UserShape,\r\n updatedAt: resolvedSession.updatedAt,\r\n version: resolvedSession.version,\r\n }\r\n}\r\n\r\nexport {\r\n HOST_COOKIE_PREFIX,\r\n SECURE_COOKIE_PREFIX,\r\n createSessionStore,\r\n getAccountCookie,\r\n getChunkedCookie,\r\n parseCookies,\r\n parseSetCookieHeader,\r\n setCookieToHeader,\r\n setRequestCookie,\r\n splitSetCookieHeader,\r\n stripSecureCookiePrefix,\r\n toCookieOptions,\r\n}\r\n\r\nexport type {\r\n AthenaAuthCookie,\r\n AthenaAuthCookies,\r\n AthenaCookieContextRuntime,\r\n AthenaCookieOptions,\r\n AthenaCookiesOptions,\r\n AthenaGetCookieCacheConfig,\r\n}\r\n","{\n \"author\": \"floris@xylex.group\",\n \"bin\": {\n \"athena-js\": \"./bin/athena-js.js\"\n },\n \"dependencies\": {\n \"blessed\": \"^0.1.81\",\n \"chalk\": \"^4.1.2\",\n \"cron-parser\": \"^4.9.0\",\n \"pg\": \"^8.16.0\",\n \"use-sync-external-store\": \"^1.5.0\",\n \"uuid\": \"^9.0.1\",\n \"zod\": \"^4.0.1\"\n },\n \"description\": \"Athena JS SDK\",\n \"devDependencies\": {\n \"@react-email/components\": \"^1.0.12\",\n \"@react-email/render\": \"^2.0.8\",\n \"@types/blessed\": \"^0.1.25\",\n \"@types/node\": \"^20.10.5\",\n \"@types/pg\": \"^8.15.1\",\n \"@types/react\": \"^18.3.12\",\n \"@types/react-test-renderer\": \"^18.3.1\",\n \"@types/uuid\": \"^9.0.7\",\n \"@typescript-eslint/eslint-plugin\": \"^8.57.0\",\n \"@typescript-eslint/parser\": \"^8.57.0\",\n \"eslint\": \"^8.57.1\",\n \"express\": \"^4.22.2\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"react-test-renderer\": \"^18.3.1\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.3.3\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"browser\": {\n \"types\": \"./dist/browser.d.ts\",\n \"import\": \"./dist/browser.js\",\n \"require\": \"./dist/browser.cjs\",\n \"default\": \"./dist/browser.js\"\n },\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./browser\": {\n \"types\": \"./dist/browser.d.ts\",\n \"import\": \"./dist/browser.js\",\n \"require\": \"./dist/browser.cjs\",\n \"default\": \"./dist/browser.js\"\n },\n \"./cookies\": {\n \"types\": \"./dist/cookies.d.ts\",\n \"import\": \"./dist/cookies.js\",\n \"require\": \"./dist/cookies.cjs\",\n \"default\": \"./dist/cookies.js\"\n },\n \"./package.json\": \"./package.json\",\n \"./react\": {\n \"types\": \"./dist/react.d.ts\",\n \"import\": \"./dist/react.js\",\n \"require\": \"./dist/react.cjs\",\n \"default\": \"./dist/react.js\"\n },\n \"./utils\": {\n \"types\": \"./dist/utils.d.ts\",\n \"import\": \"./dist/utils.js\",\n \"require\": \"./dist/utils.cjs\",\n \"default\": \"./dist/utils.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"keywords\": [\n \"database\",\n \"driver\",\n \"api-gateway\",\n \"sdk\",\n \"react\",\n \"hooks\",\n \"http\",\n \"postgres\",\n \"query-builder\"\n ],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"@xylex-group/athena\",\n \"peerDependencies\": {\n \"@react-email/components\": \">=1.0.0\",\n \"@react-email/render\": \">=2.0.0\",\n \"react\": \">=17.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@react-email/components\": {\n \"optional\": true\n },\n \"@react-email/render\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n }\n },\n \"publisher\": \"XYLEX Group\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/xylex-group/athena-js.git\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"check:all\": \"pnpm lint && pnpm typecheck && pnpm test && pnpm build\",\n \"dev\": \"tsup --watch\",\n \"docs:methods\": \"node scripts/generate-sdk-method-reference.mjs\",\n \"example:api-call\": \"cd examples/api-call && bun run start\",\n \"example:email-resend\": \"cd examples/email-resend && bun run start\",\n \"example:express-api\": \"cd examples/express-api && bun run start\",\n \"example:order-saga\": \"cd examples/order-saga && bun run start\",\n \"example:postgres-connection\": \"cd examples/postgres-connection && bun run start\",\n \"example:recurring-invoice\": \"cd examples/recurring-invoice && bun run start\",\n \"example:retry-patterns\": \"cd examples/retry-patterns && bun run start\",\n \"lint\": \"eslint \\\"src/**/*.ts\\\" \\\"test/**/*.ts\\\"\",\n \"lint:fix\": \"pnpm lint -- --fix\",\n \"prepublishOnly\": \"pnpm typecheck && pnpm build\",\n \"publish:token\": \"node scripts/publish.js\",\n \"test\": \"node --import tsx --test --test-force-exit test/*.test.ts\",\n \"test:integration:postgres\": \"node scripts/run-postgres-introspection-test.mjs\",\n \"test:watch\": \"node --import tsx --test --watch test/*.test.ts\",\n \"typecheck\": \"tsc -p tsconfig.typecheck.json\"\n },\n \"sideEffects\": false,\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"dist/index.d.ts\"\n ],\n \"browser\": [\n \"dist/browser.d.ts\"\n ],\n \"cookies\": [\n \"dist/cookies.d.ts\"\n ],\n \"react\": [\n \"dist/react.d.ts\"\n ],\n \"utils\": [\n \"dist/utils.d.ts\"\n ]\n }\n },\n \"version\": \"2.8.2\"\n}\n","import packageJson from '../package.json' with { type: 'json' }\n\nexport const PACKAGE_VERSION = packageJson.version\n\nexport function buildSdkHeaderValue(sdkName: string): string {\n return `${sdkName} ${PACKAGE_VERSION}`\n}\n","import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayConnectionOptions,\r\n AthenaGatewayConnectionResult,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayErrorDetails,\r\n AthenaGatewayMethod,\r\n AthenaRpcCallOptions,\r\n AthenaRpcPayload,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaRpcFilter,\r\n AthenaUpdatePayload,\r\n AthenaQueryPayload,\r\n} from \"./types.js\";\r\nimport { AthenaGatewayError } from \"./errors.ts\";\r\nimport {\r\n ATHENA_DEFAULT_BASE_URL,\r\n buildAthenaGatewayUrl,\r\n normalizeAthenaGatewayBaseUrl,\r\n} from \"./url.ts\";\r\nimport { getSessionCookie } from \"../cookies/index.ts\";\r\nimport { buildSdkHeaderValue } from \"../sdk-version.ts\";\r\n\r\nconst DEFAULT_CLIENT = \"railway_direct\";\r\nconst SDK_NAME = \"xylex-group/athena\";\r\nconst SDK_HEADER_VALUE = buildSdkHeaderValue(SDK_NAME);\r\n\r\nfunction parseResponseBody(rawText: string, contentType: string | null) {\r\n if (!rawText) {\r\n return { parsed: null as unknown, parseFailed: false };\r\n }\r\n\r\n const contentTypeSuggestsJson =\r\n contentType?.toLowerCase().includes(\"application/json\") ?? false;\r\n const looksJson =\r\n contentTypeSuggestsJson || rawText.startsWith(\"{\") || rawText.startsWith(\"[\");\r\n\r\n if (!looksJson) {\r\n return { parsed: rawText as unknown, parseFailed: false };\r\n }\r\n\r\n try {\r\n return { parsed: JSON.parse(rawText) as unknown, parseFailed: false };\r\n } catch {\r\n return { parsed: rawText as unknown, parseFailed: true };\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\r\n return value ? value : undefined;\r\n}\r\n\r\nfunction resolveHeaderValue(\r\n headers: Record<string, string>,\r\n candidates: string[],\r\n): string | undefined {\r\n for (const candidate of candidates) {\r\n const direct = normalizeHeaderValue(headers[candidate]);\r\n if (direct) return direct;\r\n }\r\n\r\n const loweredCandidates = new Set(candidates.map(candidate => candidate.toLowerCase()));\r\n for (const [key, value] of Object.entries(headers)) {\r\n if (!loweredCandidates.has(key.toLowerCase())) {\r\n continue;\r\n }\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) return normalized;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction resolveBearerTokenFromAuthorizationHeader(\r\n headers: Record<string, string>,\r\n): string | undefined {\r\n const authorization = resolveHeaderValue(headers, [\"Authorization\"]);\r\n if (!authorization) {\r\n return undefined;\r\n }\r\n\r\n const match = authorization.match(/^Bearer\\s+(.+)$/i);\r\n const token = match?.[1]?.trim();\r\n return token ? token : undefined;\r\n}\r\n\r\nfunction resolveSessionTokenFromCookieHeader(\r\n headers: Record<string, string>,\r\n): string | undefined {\r\n const cookie = resolveHeaderValue(headers, [\"Cookie\"]);\r\n if (!cookie) {\r\n return undefined;\r\n }\r\n\r\n return getSessionCookie(new Headers({ cookie })) ?? undefined;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nfunction nonEmptyString(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\r\n}\r\n\r\nfunction resolveStructuredErrorPayload(payload: unknown): Record<string, unknown> | null {\r\n if (!isRecord(payload)) return null;\r\n return isRecord(payload.error) ? payload.error : payload;\r\n}\r\n\r\nfunction resolveRequestId(headers: Headers): string | undefined {\r\n return (\r\n headers.get(\"x-request-id\") ??\r\n headers.get(\"x-correlation-id\") ??\r\n headers.get(\"x-athena-request-id\") ??\r\n undefined\r\n );\r\n}\r\n\r\nfunction resolveErrorMessage(payload: unknown, fallback: string) {\r\n const structuredPayload = resolveStructuredErrorPayload(payload);\r\n if (structuredPayload) {\r\n const messageCandidates = [structuredPayload.message, structuredPayload.error, structuredPayload.details];\r\n for (const candidate of messageCandidates) {\r\n const resolved = nonEmptyString(candidate);\r\n if (resolved) return resolved;\r\n }\r\n }\r\n\r\n const rawMessage = nonEmptyString(payload);\r\n if (rawMessage) return rawMessage;\r\n\r\n return fallback;\r\n}\r\n\r\nfunction resolveErrorHint(payload: unknown): string | undefined {\r\n const structuredPayload = resolveStructuredErrorPayload(payload);\r\n return structuredPayload ? nonEmptyString(structuredPayload.hint) : undefined;\r\n}\r\n\r\nfunction resolveStatusText(response: Response, payload: unknown): string | null {\r\n const rawStatusText = nonEmptyString(response.statusText);\r\n if (rawStatusText) return rawStatusText;\r\n const payloadRecord = isRecord(payload) ? payload : null;\r\n return payloadRecord ? nonEmptyString(payloadRecord.statusText) ?? null : null;\r\n}\r\n\r\nfunction detailsFromError(error: AthenaGatewayError): AthenaGatewayErrorDetails {\r\n return error.toDetails();\r\n}\r\n\r\ninterface AthenaFindManyAstPayload {\r\n table_name: string;\r\n select: Record<string, unknown>;\r\n where?: Record<string, unknown>;\r\n orderBy?: Record<string, unknown>;\r\n limit?: number;\r\n}\r\n\r\nfunction toQueryScalar(value: unknown): string {\r\n if (value === null || value === undefined) return \"null\";\r\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\r\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"null\";\r\n return String(value);\r\n}\r\n\r\nfunction toQueryArray(values: unknown[]): string {\r\n return `{${values.map(toQueryScalar).join(\",\")}}`;\r\n}\r\n\r\nfunction toRpcArgumentQueryValue(value: unknown): string {\r\n if (Array.isArray(value)) return toQueryArray(value);\r\n if (value && typeof value === \"object\") return JSON.stringify(value);\r\n return toQueryScalar(value);\r\n}\r\n\r\nfunction toRpcFilterQueryValue(filter: AthenaRpcFilter): string {\r\n const value = filter.value;\r\n switch (filter.operator) {\r\n case \"in\": {\r\n if (!Array.isArray(value)) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: `RPC filter \"${filter.column}\" with operator \"in\" requires an array value`,\r\n status: 0,\r\n });\r\n }\r\n return `in.${toQueryArray(value)}`;\r\n }\r\n case \"is\":\r\n return `is.${toQueryScalar(value)}`;\r\n case \"eq\":\r\n case \"neq\":\r\n case \"gt\":\r\n case \"gte\":\r\n case \"lt\":\r\n case \"lte\":\r\n case \"like\":\r\n case \"ilike\":\r\n return `${filter.operator}.${toQueryScalar(value)}`;\r\n }\r\n}\r\n\r\nfunction buildRpcGetEndpoint(payload: AthenaRpcPayload): AthenaGatewayEndpointPath {\r\n const functionName = (payload.function_name ?? payload.function).trim();\r\n if (!functionName) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: \"rpc requires a function name\",\r\n status: 0,\r\n endpoint: \"/gateway/rpc\",\r\n method: \"GET\",\r\n });\r\n }\r\n\r\n const query = new URLSearchParams();\r\n if (payload.schema) query.set(\"schema\", payload.schema);\r\n if (payload.select) query.set(\"select\", payload.select);\r\n if (payload.count) query.set(\"count\", payload.count);\r\n if (payload.head) query.set(\"head\", \"true\");\r\n if (typeof payload.limit === \"number\") query.set(\"limit\", String(payload.limit));\r\n if (typeof payload.offset === \"number\") query.set(\"offset\", String(payload.offset));\r\n if (payload.order?.column) {\r\n query.set(\r\n \"order\",\r\n payload.order.ascending === false\r\n ? `${payload.order.column}.desc`\r\n : payload.order.column,\r\n );\r\n }\r\n\r\n if (payload.args) {\r\n for (const [key, value] of Object.entries(payload.args)) {\r\n query.set(key, toRpcArgumentQueryValue(value));\r\n }\r\n }\r\n\r\n if (payload.filters?.length) {\r\n for (const filter of payload.filters) {\r\n if (payload.args && Object.prototype.hasOwnProperty.call(payload.args, filter.column)) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: `RPC filter \"${filter.column}\" conflicts with RPC argument \"${filter.column}\" in GET mode`,\r\n status: 0,\r\n });\r\n }\r\n query.append(filter.column, toRpcFilterQueryValue(filter));\r\n }\r\n }\r\n\r\n const endpoint = `/rpc/${encodeURIComponent(functionName)}`;\r\n const queryText = query.toString();\r\n const withQuery = queryText ? `${endpoint}?${queryText}` : endpoint;\r\n return withQuery as AthenaGatewayEndpointPath;\r\n}\r\n\r\nfunction buildHeaders(\r\n config: AthenaGatewayBaseOptions,\r\n options?: AthenaGatewayCallOptions,\r\n): Record<string, string> {\r\n const mergedStripNulls = options?.stripNulls ?? true;\r\n const extraHeaders = {\r\n ...(config.headers ?? {}),\r\n ...(options?.headers ?? {}),\r\n };\r\n const headerClient =\r\n extraHeaders[\"x-athena-client\"] ?? extraHeaders[\"X-Athena-Client\"];\r\n const finalClient =\r\n options?.client ??\r\n config.client ??\r\n (typeof headerClient === \"string\" ? headerClient : undefined) ??\r\n DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n \"X-Athena-Sdk\": SDK_HEADER_VALUE,\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n const finalBackend = options?.backend ?? config.backend;\r\n if (finalBackend) {\r\n const type =\r\n typeof finalBackend === \"string\" ? finalBackend : finalBackend.type;\r\n if (type) headers[\"X-Backend-Type\"] = type;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n const explicitSessionToken = resolveHeaderValue(extraHeaders, [\r\n \"X-Athena-Auth-Session-Token\",\r\n ]);\r\n const derivedSessionToken =\r\n explicitSessionToken ?? resolveSessionTokenFromCookieHeader(extraHeaders);\r\n if (derivedSessionToken) {\r\n headers[\"X-Athena-Auth-Session-Token\"] = derivedSessionToken;\r\n }\r\n\r\n const explicitBearerToken = resolveHeaderValue(extraHeaders, [\r\n \"X-Athena-Auth-Bearer-Token\",\r\n ]);\r\n const derivedBearerToken =\r\n explicitBearerToken ?? resolveBearerTokenFromAuthorizationHeader(extraHeaders);\r\n if (derivedBearerToken) {\r\n headers[\"X-Athena-Auth-Bearer-Token\"] = derivedBearerToken;\r\n }\r\n\r\n const athenaClientKeys = [\"x-athena-client\", \"X-Athena-Client\"];\r\n Object.entries(extraHeaders).forEach(([key, value]) => {\r\n if (athenaClientKeys.includes(key)) return;\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) {\r\n headers[key] = normalized;\r\n }\r\n });\r\n\r\n return headers;\r\n}\r\n\r\nfunction toInvalidUrlResponse<T>(\r\n error: unknown,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n): AthenaGatewayResponse<T> {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const gatewayError =\r\n error instanceof AthenaGatewayError\r\n ? error\r\n : new AthenaGatewayError({\r\n code: \"INVALID_URL\",\r\n message,\r\n status: 0,\r\n endpoint,\r\n method,\r\n cause: message,\r\n hint: \"Set ATHENA_URL to a full http(s) URL before running queries.\",\r\n });\r\n\r\n return {\r\n ok: false,\r\n status: 0,\r\n statusText: null,\r\n data: null,\r\n error: gatewayError.message,\r\n errorDetails: detailsFromError(\r\n new AthenaGatewayError({\r\n code: gatewayError.code,\r\n message: gatewayError.message,\r\n status: gatewayError.status,\r\n endpoint,\r\n method,\r\n requestId: gatewayError.requestId,\r\n hint: gatewayError.hint,\r\n cause: gatewayError.causeDetail,\r\n }),\r\n ),\r\n raw: null,\r\n };\r\n}\r\n\r\nfunction resolveGatewayBaseUrl(input?: string | null) {\r\n return normalizeAthenaGatewayBaseUrl(input, {\r\n defaultBaseUrl: ATHENA_DEFAULT_BASE_URL,\r\n });\r\n}\r\n\r\nfunction resolveProbePath(path?: string) {\r\n if (!path) return \"/\";\r\n if (!path.startsWith(\"/\")) {\r\n throw new AthenaGatewayError({\r\n code: \"INVALID_URL\",\r\n message: `Athena gateway probe path must start with \"/\". Received ${JSON.stringify(path)}.`,\r\n status: 0,\r\n hint: 'Use a leading slash such as \"/\" or \"/health\".',\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nfunction mergeConnectionHeaders(\r\n baseHeaders: Record<string, string>,\r\n headers?: Record<string, string>,\r\n): Record<string, string> {\r\n const merged = {\r\n ...baseHeaders,\r\n ...(headers ?? {}),\r\n };\r\n\r\n if (!merged[\"X-Athena-Sdk\"] && !merged[\"x-athena-sdk\"]) {\r\n merged[\"X-Athena-Sdk\"] = SDK_HEADER_VALUE;\r\n }\r\n\r\n return merged;\r\n}\r\n\r\nasync function performConnectionCheck(\r\n baseUrl: string,\r\n requestHeaders: Record<string, string>,\r\n options?: AthenaGatewayConnectionOptions,\r\n): Promise<AthenaGatewayConnectionResult> {\r\n const path = resolveProbePath(options?.path);\r\n const url = buildAthenaGatewayUrl(baseUrl, path);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: mergeConnectionHeaders(requestHeaders, options?.headers),\r\n signal: options?.signal,\r\n });\r\n const rawText = await response.text();\r\n const requestId = resolveRequestId(response.headers);\r\n const parsedBody = parseResponseBody(\r\n rawText ?? \"\",\r\n response.headers.get(\"content-type\"),\r\n );\r\n\r\n if (parsedBody.parseFailed) {\r\n const invalidJsonError = new AthenaGatewayError({\r\n code: \"INVALID_JSON\",\r\n message: \"Gateway probe returned malformed JSON\",\r\n status: response.status,\r\n method: \"GET\",\r\n requestId,\r\n hint: \"Verify the gateway response body is valid JSON.\",\r\n cause: rawText.slice(0, 300),\r\n });\r\n return {\r\n ok: false,\r\n reachable: true,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsedBody.parsed),\r\n baseUrl,\r\n url,\r\n error: invalidJsonError.message,\r\n errorDetails: detailsFromError(invalidJsonError),\r\n raw: parsedBody.parsed,\r\n };\r\n }\r\n\r\n const parsed = parsedBody.parsed;\r\n if (!response.ok) {\r\n const httpError = new AthenaGatewayError({\r\n code: \"HTTP_ERROR\",\r\n message: resolveErrorMessage(\r\n parsed,\r\n `Athena gateway GET ${path} failed with status ${response.status}`,\r\n ),\r\n status: response.status,\r\n method: \"GET\",\r\n requestId,\r\n hint: resolveErrorHint(parsed),\r\n });\r\n\r\n return {\r\n ok: false,\r\n reachable: true,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsed),\r\n baseUrl,\r\n url,\r\n error: httpError.message,\r\n errorDetails: detailsFromError(httpError),\r\n raw: parsed,\r\n };\r\n }\r\n\r\n return {\r\n ok: true,\r\n reachable: true,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsed),\r\n baseUrl,\r\n url,\r\n error: undefined,\r\n errorDetails: null,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message = callError instanceof Error ? callError.message : String(callError);\r\n const networkError = new AthenaGatewayError({\r\n code: \"NETWORK_ERROR\",\r\n message: `Network error while probing Athena gateway ${url}: ${message}`,\r\n method: \"GET\",\r\n cause: message,\r\n hint: \"Check gateway URL, DNS, and network reachability.\",\r\n });\r\n return {\r\n ok: false,\r\n reachable: false,\r\n status: 0,\r\n statusText: null,\r\n baseUrl,\r\n url,\r\n error: networkError.message,\r\n errorDetails: detailsFromError(networkError),\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport async function verifyAthenaGatewayUrl(\r\n baseUrl: string,\r\n options?: AthenaGatewayConnectionOptions,\r\n): Promise<AthenaGatewayConnectionResult> {\r\n const normalizedBaseUrl = normalizeAthenaGatewayBaseUrl(baseUrl);\r\n return performConnectionCheck(normalizedBaseUrl, { \"X-Athena-Sdk\": SDK_HEADER_VALUE }, options);\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n let baseUrl: string;\r\n try {\r\n baseUrl = resolveGatewayBaseUrl(options?.baseUrl ?? config.baseUrl);\r\n } catch (error) {\r\n return toInvalidUrlResponse<T>(error, endpoint, method);\r\n }\r\n\r\n const url = buildAthenaGatewayUrl(baseUrl, endpoint);\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const requestInit: RequestInit = {\r\n method,\r\n headers,\r\n };\r\n if (method !== \"GET\") {\r\n requestInit.body = JSON.stringify(payload);\r\n }\r\n\r\n const response = await fetch(url, requestInit);\r\n\r\n const rawText = await response.text();\r\n const requestId = resolveRequestId(response.headers);\r\n const parsedBody = parseResponseBody(\r\n rawText ?? \"\",\r\n response.headers.get(\"content-type\"),\r\n );\r\n\r\n if (parsedBody.parseFailed) {\r\n const invalidJsonError = new AthenaGatewayError({\r\n code: \"INVALID_JSON\",\r\n message: \"Gateway returned malformed JSON\",\r\n status: response.status,\r\n endpoint,\r\n method,\r\n requestId,\r\n hint: \"Verify the gateway response body is valid JSON.\",\r\n cause: rawText.slice(0, 300),\r\n });\r\n return {\r\n ok: false,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsedBody.parsed),\r\n data: null,\r\n error: invalidJsonError.message,\r\n errorDetails: detailsFromError(invalidJsonError),\r\n raw: parsedBody.parsed,\r\n };\r\n }\r\n\r\n const parsed = parsedBody.parsed;\r\n const parsedPayload = isRecord(parsed) ? parsed : null;\r\n\r\n if (!response.ok) {\r\n const httpError = new AthenaGatewayError({\r\n code: \"HTTP_ERROR\",\r\n message: resolveErrorMessage(\r\n parsed,\r\n `Athena gateway ${method} ${endpoint} failed with status ${response.status}`,\r\n ),\r\n status: response.status,\r\n endpoint,\r\n method,\r\n requestId,\r\n hint: resolveErrorHint(parsed),\r\n });\r\n\r\n return {\r\n ok: false,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsed),\r\n data: null,\r\n error: httpError.message,\r\n errorDetails: detailsFromError(httpError),\r\n raw: parsed,\r\n };\r\n }\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload && \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n const payloadCount =\r\n parsedPayload && \"count\" in parsedPayload\r\n ? typeof parsedPayload.count === \"number\" || parsedPayload.count === null\r\n ? (parsedPayload.count as number | null)\r\n : undefined\r\n : undefined;\r\n\r\n return {\r\n ok: true,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsed),\r\n data: payloadData ?? null,\r\n count: payloadCount,\r\n error: undefined,\r\n errorDetails: null,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message = callError instanceof Error ? callError.message : String(callError);\r\n const networkError = new AthenaGatewayError({\r\n code: \"NETWORK_ERROR\",\r\n message: `Network error while calling ${method} ${endpoint}: ${message}`,\r\n endpoint,\r\n method,\r\n cause: message,\r\n hint: \"Check gateway URL, DNS, and network reachability.\",\r\n });\r\n return {\r\n ok: false,\r\n status: 0,\r\n statusText: null,\r\n data: null,\r\n error: networkError.message,\r\n errorDetails: detailsFromError(networkError),\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n verifyConnection(\r\n options?: AthenaGatewayConnectionOptions,\r\n ): Promise<AthenaGatewayConnectionResult>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload | AthenaFindManyAstPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n rpcGateway<T>(\r\n payload: AthenaRpcPayload,\r\n options?: AthenaRpcCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n queryGateway<T>(\r\n payload: AthenaQueryPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n const normalizedBaseUrl = resolveGatewayBaseUrl(config.baseUrl);\r\n const normalizedConfig: AthenaGatewayBaseOptions = {\r\n ...config,\r\n baseUrl: normalizedBaseUrl,\r\n };\r\n\r\n return {\r\n baseUrl: normalizedBaseUrl,\r\n buildHeaders(options) {\r\n return buildHeaders(normalizedConfig, options);\r\n },\r\n verifyConnection(options) {\r\n return performConnectionCheck(\r\n normalizedBaseUrl,\r\n buildHeaders(normalizedConfig),\r\n options,\r\n );\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n rpcGateway(payload, options) {\r\n if (options?.get) {\r\n const endpoint = buildRpcGetEndpoint(payload);\r\n return callAthena(normalizedConfig, endpoint, \"GET\", null, options);\r\n }\r\n return callAthena(normalizedConfig, \"/gateway/rpc\", \"POST\", payload, options);\r\n },\r\n queryGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/query\", \"POST\", payload, options);\r\n },\r\n };\r\n}\r\n","import { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaRpcCallOptions,\r\n AthenaRpcPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.ts\";\r\nimport { createAthenaGatewayClient } from \"./client.ts\";\r\nimport { AthenaGatewayError } from \"./errors.ts\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n backend: config?.backend,\r\n publishEvent: config?.publishEvent,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.backend,\r\n config?.publishEvent,\r\n config?.headers,\r\n config?.userId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const failure = AthenaGatewayError.fromResponse(response, {\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n });\r\n setError(failure.message);\r\n throw failure;\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n const typedError =\r\n callError instanceof AthenaGatewayError\r\n ? callError\r\n : new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message,\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n cause: message,\r\n });\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: typedError.status || response?.status || 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: typedError.message,\r\n errorDetails: typedError.toDetails(),\r\n });\r\n throw typedError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const defaultStripNulls = true;\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ?? options?.stripNulls ?? defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ?? options?.stripNulls ?? defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const rpcGateway = useCallback(\r\n <T = unknown>(payload: AthenaRpcPayload, options?: AthenaRpcCallOptions) =>\r\n callWithLifecycle<T>(() => client.rpcGateway<T>(payload, options), {\r\n endpoint: options?.get ? `/rpc/${payload.function}` : \"/gateway/rpc\",\r\n method: options?.get ? \"GET\" : \"POST\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n rpcGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n","import { isAthenaGatewayError } from '../gateway/errors.ts'\r\nimport type {\r\n AthenaQueryError,\r\n AthenaQueryResult,\r\n AthenaResponseLike,\r\n AthenaRetryCount,\r\n AthenaRetryDelay,\r\n QueryKey,\r\n} from './types.ts'\r\n\r\ntype RetryOptions = {\r\n retry?: AthenaRetryCount\r\n retryDelay?: AthenaRetryDelay\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\r\n}\r\n\r\nfunction isPrimitive(value: unknown): value is string | number | boolean | null | undefined {\r\n return value == null || ['string', 'number', 'boolean'].includes(typeof value)\r\n}\r\n\r\nfunction encodePrimitive(value: string | number | boolean | null | undefined): string {\r\n if (value === null) return 'null:0:'\r\n if (value === undefined) return 'undefined:0:'\r\n if (typeof value === 'string') return `str:${value.length}:${value}`\r\n if (typeof value === 'number') {\r\n const serialized = Number.isFinite(value) ? String(value) : 'nan'\r\n return `num:${serialized.length}:${serialized}`\r\n }\r\n const serialized = value ? '1' : '0'\r\n return `bool:${serialized.length}:${serialized}`\r\n}\r\n\r\nfunction stableSerialize(value: unknown, seen: WeakSet<object>): string {\r\n if (value === null) return 'null'\r\n if (value === undefined) return 'undefined'\r\n\r\n const valueType = typeof value\r\n if (valueType === 'string') return `\"${value}\"`\r\n if (valueType === 'number') return Number.isFinite(value as number) ? String(value) : 'null'\r\n if (valueType === 'boolean') return (value as boolean) ? 'true' : 'false'\r\n if (valueType === 'bigint') return `${String(value)}n`\r\n if (valueType === 'symbol') return `symbol:${String(value)}`\r\n if (valueType === 'function') {\r\n const namedFunction = value as { name?: string }\r\n return `function:${namedFunction.name || 'anonymous'}`\r\n }\r\n\r\n if (value instanceof Date) return `date:${value.toISOString()}`\r\n\r\n if (Array.isArray(value)) {\r\n return `[${value.map(item => stableSerialize(item, seen)).join(',')}]`\r\n }\r\n\r\n if (valueType === 'object') {\r\n const objectValue = value as Record<string, unknown>\r\n if (seen.has(objectValue)) return '[circular]'\r\n seen.add(objectValue)\r\n const keys = Object.keys(objectValue).sort()\r\n const serialized = `{${keys\r\n .map(key => `${key}:${stableSerialize(objectValue[key], seen)}`)\r\n .join(',')}}`\r\n seen.delete(objectValue)\r\n return serialized\r\n }\r\n\r\n return String(value)\r\n}\r\n\r\nexport function safeSerializeQueryKey(queryKey: QueryKey): string {\r\n try {\r\n if (typeof queryKey === 'string') {\r\n return `key:${queryKey}`\r\n }\r\n\r\n if (Array.isArray(queryKey) && queryKey.every(isPrimitive)) {\r\n return `arr:${queryKey.map(item => encodePrimitive(item)).join('|')}`\r\n }\r\n\r\n return `ser:${stableSerialize(queryKey, new WeakSet<object>())}`\r\n } catch {\r\n try {\r\n return `fallback:${String(queryKey)}`\r\n } catch {\r\n return 'fallback:[unserializable-query-key]'\r\n }\r\n }\r\n}\r\n\r\nexport function sleep(ms: number): Promise<void> {\r\n if (ms <= 0) return Promise.resolve()\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms)\r\n })\r\n}\r\n\r\nfunction resolveRetryCount(retry: AthenaRetryCount | undefined): number {\r\n if (retry === false || retry == null) return 0\r\n if (!Number.isFinite(retry)) return 0\r\n return Math.max(0, Math.trunc(retry))\r\n}\r\n\r\nfunction resolveRetryDelay(retryDelay: AthenaRetryDelay | undefined, attempt: number): number {\r\n if (typeof retryDelay === 'function') {\r\n const resolved = retryDelay(attempt)\r\n if (!Number.isFinite(resolved)) return 0\r\n return Math.max(0, resolved)\r\n }\r\n if (typeof retryDelay === 'number') {\r\n if (!Number.isFinite(retryDelay)) return 0\r\n return Math.max(0, retryDelay)\r\n }\r\n return 0\r\n}\r\n\r\nexport async function runWithRetry<T>(\r\n execute: (attempt: number) => Promise<T>,\r\n options?: RetryOptions,\r\n): Promise<T> {\r\n const retries = resolveRetryCount(options?.retry)\r\n let attempt = 0\r\n\r\n for (;;) {\r\n attempt += 1\r\n try {\r\n return await execute(attempt)\r\n } catch (error) {\r\n if (attempt > retries) {\r\n throw error\r\n }\r\n const delay = resolveRetryDelay(options?.retryDelay, attempt)\r\n await sleep(delay)\r\n }\r\n }\r\n}\r\n\r\nfunction errorMessageFromUnknown(error: unknown): string {\r\n if (typeof error === 'string' && error.trim()) return error.trim()\r\n if (error instanceof Error && error.message.trim()) return error.message.trim()\r\n if (isRecord(error)) {\r\n const messageCandidate = error.message ?? error.error\r\n if (typeof messageCandidate === 'string' && messageCandidate.trim()) {\r\n return messageCandidate.trim()\r\n }\r\n }\r\n return 'Athena request failed'\r\n}\r\n\r\nexport function normalizeAthenaError(\r\n error: unknown,\r\n source?: unknown,\r\n): AthenaQueryError {\r\n if (\r\n isRecord(error) &&\r\n typeof error.message === 'string' &&\r\n (error.status === undefined || typeof error.status === 'number') &&\r\n (error.code === undefined || typeof error.code === 'string')\r\n ) {\r\n return {\r\n message: error.message,\r\n status: typeof error.status === 'number' ? error.status : undefined,\r\n code: typeof error.code === 'string' ? error.code : undefined,\r\n details: error.details,\r\n raw: error.raw ?? source ?? error,\r\n }\r\n }\r\n\r\n if (isAthenaGatewayError(error)) {\r\n const details = error.toDetails()\r\n return {\r\n message: details.message,\r\n status: details.status,\r\n code: details.code,\r\n details,\r\n raw: source ?? error,\r\n }\r\n }\r\n\r\n if (isRecord(source) && source.errorDetails && isRecord(source.errorDetails)) {\r\n const details = source.errorDetails\r\n return {\r\n message: errorMessageFromUnknown(error ?? source.error),\r\n status: typeof source.status === 'number' ? source.status : undefined,\r\n code: typeof details.code === 'string' ? details.code : undefined,\r\n details,\r\n raw: source,\r\n }\r\n }\r\n\r\n if (isRecord(source) && typeof source.status === 'number') {\r\n return {\r\n message: errorMessageFromUnknown(error),\r\n status: source.status,\r\n details: source,\r\n raw: source,\r\n }\r\n }\r\n\r\n return {\r\n message: errorMessageFromUnknown(error),\r\n raw: source ?? error,\r\n }\r\n}\r\n\r\nexport function isAthenaResponseLike<T>(value: unknown): value is AthenaResponseLike<T> {\r\n if (!isRecord(value)) return false\r\n if ('error' in value || 'errorDetails' in value) return true\r\n if ('status' in value && typeof value.status === 'number') {\r\n return 'data' in value || 'raw' in value\r\n }\r\n return (\r\n 'data' in value &&\r\n ('raw' in value || 'status' in value)\r\n )\r\n}\r\n\r\nexport function normalizeAthenaResult<TQueryFnData, TData = TQueryFnData>(\r\n value: unknown,\r\n select?: (data: TQueryFnData) => TData,\r\n): AthenaQueryResult<TData> {\r\n if (isAthenaResponseLike<TQueryFnData>(value)) {\r\n const status = typeof value.status === 'number' ? value.status : value.error != null ? 500 : 200\r\n if (value.error != null) {\r\n return {\r\n data: undefined,\r\n error: normalizeAthenaError(value.error, value),\r\n status,\r\n raw: value.raw ?? value,\r\n }\r\n }\r\n\r\n const hasData = 'data' in value\r\n const sourceData = hasData\r\n ? (value.data as TQueryFnData | null | undefined)\r\n : undefined\r\n const selectedData =\r\n sourceData === undefined\r\n ? undefined\r\n : sourceData === null\r\n ? (null as unknown as TData)\r\n : select\r\n ? select(sourceData)\r\n : (sourceData as unknown as TData)\r\n\r\n return {\r\n data: selectedData,\r\n error: null,\r\n status,\r\n raw: value.raw ?? value,\r\n }\r\n }\r\n\r\n const sourceData = value as TQueryFnData\r\n const selectedData = select\r\n ? select(sourceData)\r\n : (sourceData as unknown as TData)\r\n\r\n return {\r\n data: selectedData,\r\n error: null,\r\n status: 200,\r\n raw: value,\r\n }\r\n}\r\n","import type {\r\n AthenaMutationDefaults,\r\n AthenaMutationEvent,\r\n AthenaMutationRequestLog,\r\n AthenaMutationResultData,\r\n AthenaMutationState,\r\n AthenaQueryClientConfig,\r\n AthenaQueryDefaults,\r\n AthenaQueryEvent,\r\n AthenaQueryRequestLog,\r\n AthenaQueryResult,\r\n AthenaQueryState,\r\n AthenaRuntimeEvent,\r\n AthenaStateAdapter,\r\n AthenaUnsubscribe,\r\n QueryKey,\r\n} from './types.ts'\r\nimport { normalizeAthenaError, normalizeAthenaResult, runWithRetry, safeSerializeQueryKey } from './utils.ts'\r\n\r\ntype ExecuteQueryInput<TQueryFnData, TData> = {\r\n queryKey: QueryKey\r\n queryKeyToken: string\r\n queryFn: () => Promise<TQueryFnData>\r\n select?: (data: TQueryFnData) => TData\r\n retry?: number | false\r\n retryDelay?: number | ((attempt: number) => number)\r\n dedupe?: boolean\r\n force?: boolean\r\n}\r\n\r\ntype ExecuteMutationInput<TVariables, TMutationFnData, TData> = {\r\n mutationKey?: QueryKey\r\n mutationKeyToken: string\r\n variables: TVariables\r\n mutationFn: (variables: TVariables) => Promise<TMutationFnData>\r\n select?: (data: TMutationFnData) => TData\r\n retry?: number | false\r\n retryDelay?: number | ((attempt: number) => number)\r\n}\r\n\r\ntype QueryEntry = {\r\n key: string\r\n state: AthenaQueryState<unknown>\r\n listeners: Set<() => void>\r\n gcTimer?: ReturnType<typeof setTimeout>\r\n activeRequestId: number\r\n}\r\n\r\ntype MutationEntry = {\r\n key: string\r\n state: AthenaMutationState<unknown, unknown>\r\n listeners: Set<() => void>\r\n gcTimer?: ReturnType<typeof setTimeout>\r\n activeRequestId: number\r\n}\r\n\r\nfunction createInitialQueryState<TData>(initialData?: TData): AthenaQueryState<TData> {\r\n return {\r\n status: initialData === undefined ? 'idle' : 'success',\r\n isFetching: false,\r\n data: initialData,\r\n error: null,\r\n updatedAt: initialData === undefined ? undefined : Date.now(),\r\n }\r\n}\r\n\r\nfunction createInitialMutationState<TVariables, TData>(): AthenaMutationState<TVariables, TData> {\r\n return {\r\n status: 'idle',\r\n data: undefined,\r\n error: null,\r\n isLoading: false,\r\n lastVariables: undefined,\r\n lastResponse: undefined,\r\n updatedAt: undefined,\r\n }\r\n}\r\n\r\nfunction shouldUseMemoryCache(config: AthenaQueryClientConfig): boolean {\r\n return config.cache?.mode === 'memory'\r\n}\r\n\r\nexport class AthenaQueryClient {\r\n private readonly queryEntries = new Map<string, QueryEntry>()\r\n private readonly mutationEntries = new Map<string, MutationEntry>()\r\n private readonly inflightQueries = new Map<string, Promise<AthenaQueryResult<unknown>>>()\r\n private readonly eventSubscribers = new Set<(event: AthenaRuntimeEvent) => void>()\r\n private readonly adapters = new Set<AthenaStateAdapter>()\r\n private requestCounter = 0\r\n\r\n readonly config: AthenaQueryClientConfig\r\n readonly defaultQueryOptions: AthenaQueryDefaults\r\n readonly defaultMutationOptions: AthenaMutationDefaults\r\n\r\n constructor(config: AthenaQueryClientConfig = {}) {\r\n this.config = {\r\n cache: {\r\n mode: config.cache?.mode ?? 'none',\r\n staleTime: config.cache?.staleTime,\r\n gcTime: config.cache?.gcTime,\r\n },\r\n defaultQueryOptions: config.defaultQueryOptions,\r\n defaultMutationOptions: config.defaultMutationOptions,\r\n }\r\n this.defaultQueryOptions = {\r\n retry: config.defaultQueryOptions?.retry ?? 0,\r\n retryDelay: config.defaultQueryOptions?.retryDelay,\r\n refetchOnMount: config.defaultQueryOptions?.refetchOnMount ?? true,\r\n refetchOnWindowFocus: config.defaultQueryOptions?.refetchOnWindowFocus ?? false,\r\n refetchOnReconnect: config.defaultQueryOptions?.refetchOnReconnect ?? false,\r\n }\r\n this.defaultMutationOptions = {\r\n retry: config.defaultMutationOptions?.retry ?? 0,\r\n retryDelay: config.defaultMutationOptions?.retryDelay,\r\n }\r\n }\r\n\r\n getQueryKeyToken(queryKey: QueryKey): string {\r\n return safeSerializeQueryKey(queryKey)\r\n }\r\n\r\n getMutationKeyToken(mutationKey?: QueryKey): string {\r\n if (mutationKey == null) {\r\n return '__mutation__default__'\r\n }\r\n return safeSerializeQueryKey(mutationKey)\r\n }\r\n\r\n getQueryState<TData = unknown>(key: string): AthenaQueryState<TData> {\r\n const entry = this.ensureQueryEntry(key)\r\n return entry.state as AthenaQueryState<TData>\r\n }\r\n\r\n getMutationState<TVariables = unknown, TData = unknown>(\r\n key: string,\r\n ): AthenaMutationState<TVariables, TData> {\r\n const entry = this.ensureMutationEntry(key)\r\n return entry.state as AthenaMutationState<TVariables, TData>\r\n }\r\n\r\n subscribeQuery(key: string, listener: () => void): AthenaUnsubscribe {\r\n const entry = this.ensureQueryEntry(key)\r\n if (entry.gcTimer) {\r\n clearTimeout(entry.gcTimer)\r\n entry.gcTimer = undefined\r\n }\r\n entry.listeners.add(listener)\r\n return () => {\r\n const current = this.queryEntries.get(key)\r\n if (!current) return\r\n current.listeners.delete(listener)\r\n if (current.listeners.size === 0) {\r\n this.scheduleQueryGc(current)\r\n }\r\n }\r\n }\r\n\r\n subscribeMutation(key: string, listener: () => void): AthenaUnsubscribe {\r\n const entry = this.ensureMutationEntry(key)\r\n if (entry.gcTimer) {\r\n clearTimeout(entry.gcTimer)\r\n entry.gcTimer = undefined\r\n }\r\n entry.listeners.add(listener)\r\n return () => {\r\n const current = this.mutationEntries.get(key)\r\n if (!current) return\r\n current.listeners.delete(listener)\r\n if (current.listeners.size === 0) {\r\n this.scheduleMutationGc(current)\r\n }\r\n }\r\n }\r\n\r\n subscribeEvents(listener: (event: AthenaRuntimeEvent) => void): AthenaUnsubscribe {\r\n this.eventSubscribers.add(listener)\r\n return () => {\r\n this.eventSubscribers.delete(listener)\r\n }\r\n }\r\n\r\n attachAdapter(adapter: AthenaStateAdapter): AthenaUnsubscribe {\r\n this.adapters.add(adapter)\r\n return () => {\r\n this.adapters.delete(adapter)\r\n }\r\n }\r\n\r\n resetQuery(queryKey: QueryKey): void {\r\n const key = this.getQueryKeyToken(queryKey)\r\n const entry = this.ensureQueryEntry(key)\r\n entry.activeRequestId = ++this.requestCounter\r\n this.setQueryState(entry, createInitialQueryState(), 'query_reset')\r\n this.inflightQueries.delete(key)\r\n }\r\n\r\n resetMutation(mutationKey?: QueryKey): void {\r\n const key = this.getMutationKeyToken(mutationKey)\r\n const entry = this.ensureMutationEntry(key)\r\n entry.activeRequestId = ++this.requestCounter\r\n this.setMutationState(entry, createInitialMutationState(), 'mutation_reset')\r\n }\r\n\r\n async executeQuery<TQueryFnData, TData = TQueryFnData>(\r\n input: ExecuteQueryInput<TQueryFnData, TData>,\r\n ): Promise<AthenaQueryResult<TData>> {\r\n const entry = this.ensureQueryEntry(input.queryKeyToken)\r\n\r\n if (input.dedupe !== false) {\r\n const existing = this.inflightQueries.get(input.queryKeyToken)\r\n if (existing) {\r\n return existing as Promise<AthenaQueryResult<TData>>\r\n }\r\n }\r\n\r\n if (!input.force && shouldUseMemoryCache(this.config)) {\r\n const staleTime = this.config.cache?.staleTime ?? 0\r\n const hasFreshData =\r\n entry.state.status === 'success' &&\r\n entry.state.data !== undefined &&\r\n entry.state.updatedAt !== undefined &&\r\n Date.now() - entry.state.updatedAt <= staleTime\r\n if (hasFreshData) {\r\n return {\r\n data: entry.state.data as TData,\r\n error: null,\r\n status: 200,\r\n raw: entry.state.lastResponse ?? entry.state.data,\r\n __applied: true,\r\n } as AthenaQueryResult<TData>\r\n }\r\n }\r\n\r\n const requestId = ++this.requestCounter\r\n entry.activeRequestId = requestId\r\n\r\n const startRequestLog: AthenaQueryRequestLog = {\r\n requestId,\r\n queryKey: input.queryKey,\r\n queryKeyToken: input.queryKeyToken,\r\n attempt: 1,\r\n startedAt: Date.now(),\r\n }\r\n\r\n const loadingStatus = entry.state.data === undefined ? 'loading' : entry.state.status\r\n this.setQueryState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: loadingStatus,\r\n isFetching: true,\r\n error: null,\r\n lastRequest: startRequestLog,\r\n },\r\n 'query_updated',\r\n )\r\n\r\n const executionPromise = runWithRetry(\r\n async attempt => {\r\n const attemptRequestLog: AthenaQueryRequestLog = {\r\n ...startRequestLog,\r\n attempt,\r\n }\r\n\r\n if (entry.activeRequestId === requestId) {\r\n this.setQueryState(\r\n entry,\r\n {\r\n ...entry.state,\r\n lastRequest: attemptRequestLog,\r\n isFetching: true,\r\n },\r\n 'query_updated',\r\n )\r\n }\r\n\r\n const rawResult = await input.queryFn()\r\n const normalized = normalizeAthenaResult<TQueryFnData, TData>(rawResult, input.select)\r\n\r\n if (normalized.error) {\r\n throw {\r\n __athenaNormalizedError: normalized.error,\r\n __athenaStatus: normalized.status,\r\n __athenaRaw: normalized.raw,\r\n __athenaResponse: rawResult,\r\n }\r\n }\r\n\r\n return {\r\n normalized,\r\n response: rawResult,\r\n attempt,\r\n }\r\n },\r\n {\r\n retry: input.retry,\r\n retryDelay: input.retryDelay,\r\n },\r\n )\r\n .then(result => {\r\n const applied = entry.activeRequestId === requestId\r\n if (applied) {\r\n const finishedAt = Date.now()\r\n const doneRequestLog: AthenaQueryRequestLog = {\r\n ...startRequestLog,\r\n attempt: result.attempt,\r\n endedAt: finishedAt,\r\n }\r\n this.setQueryState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'success',\r\n isFetching: false,\r\n error: null,\r\n data: result.normalized.data,\r\n lastRequest: doneRequestLog,\r\n lastResponse: result.response,\r\n updatedAt: finishedAt,\r\n },\r\n 'query_updated',\r\n )\r\n }\r\n\r\n return {\r\n ...result.normalized,\r\n __applied: applied,\r\n } as AthenaQueryResult<TData>\r\n })\r\n .catch(error => {\r\n const wrapped =\r\n typeof error === 'object' && error !== null ? (error as Record<string, unknown>) : undefined\r\n\r\n const normalizedError = wrapped?.__athenaNormalizedError\r\n ? (wrapped.__athenaNormalizedError as ReturnType<typeof normalizeAthenaError>)\r\n : normalizeAthenaError(error)\r\n\r\n const status =\r\n typeof wrapped?.__athenaStatus === 'number'\r\n ? (wrapped.__athenaStatus as number)\r\n : normalizedError.status ?? 500\r\n\r\n const raw = wrapped?.__athenaRaw ?? normalizedError.raw ?? null\r\n const response = wrapped?.__athenaResponse ?? raw\r\n\r\n const applied = entry.activeRequestId === requestId\r\n if (applied) {\r\n const finishedAt = Date.now()\r\n const doneRequestLog: AthenaQueryRequestLog = {\r\n ...startRequestLog,\r\n endedAt: finishedAt,\r\n attempt:\r\n entry.state.lastRequest?.requestId === requestId\r\n ? entry.state.lastRequest.attempt\r\n : startRequestLog.attempt,\r\n }\r\n this.setQueryState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'error',\r\n isFetching: false,\r\n error: normalizedError,\r\n lastRequest: doneRequestLog,\r\n lastResponse: response,\r\n updatedAt: finishedAt,\r\n },\r\n 'query_updated',\r\n )\r\n }\r\n\r\n return {\r\n data: undefined,\r\n error: normalizedError,\r\n status,\r\n raw,\r\n __applied: applied,\r\n } as AthenaQueryResult<TData>\r\n })\r\n .finally(() => {\r\n const inflight = this.inflightQueries.get(input.queryKeyToken)\r\n if (inflight === executionPromise) {\r\n this.inflightQueries.delete(input.queryKeyToken)\r\n }\r\n })\r\n\r\n this.inflightQueries.set(input.queryKeyToken, executionPromise as Promise<AthenaQueryResult<unknown>>)\r\n\r\n return executionPromise\r\n }\r\n\r\n async executeMutation<TVariables, TMutationFnData, TData = TMutationFnData>(\r\n input: ExecuteMutationInput<TVariables, TMutationFnData, TData>,\r\n ): Promise<AthenaMutationResultData<TData>> {\r\n const entry = this.ensureMutationEntry(input.mutationKeyToken)\r\n const requestId = ++this.requestCounter\r\n entry.activeRequestId = requestId\r\n\r\n const startRequestLog: AthenaMutationRequestLog<TVariables> = {\r\n requestId,\r\n mutationKey: input.mutationKey,\r\n mutationKeyToken: input.mutationKeyToken,\r\n attempt: 1,\r\n startedAt: Date.now(),\r\n variables: input.variables,\r\n }\r\n\r\n this.setMutationState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'loading',\r\n isLoading: true,\r\n error: null,\r\n lastVariables: input.variables,\r\n lastRequest: startRequestLog,\r\n },\r\n 'mutation_updated',\r\n )\r\n\r\n try {\r\n const result = await runWithRetry(\r\n async attempt => {\r\n const attemptRequestLog: AthenaMutationRequestLog<TVariables> = {\r\n ...startRequestLog,\r\n attempt,\r\n }\r\n\r\n if (entry.activeRequestId === requestId) {\r\n this.setMutationState(\r\n entry,\r\n {\r\n ...entry.state,\r\n lastRequest: attemptRequestLog,\r\n isLoading: true,\r\n },\r\n 'mutation_updated',\r\n )\r\n }\r\n\r\n const rawResult = await input.mutationFn(input.variables)\r\n const normalized = normalizeAthenaResult<TMutationFnData, TData>(rawResult, input.select)\r\n if (normalized.error) {\r\n throw {\r\n __athenaNormalizedError: normalized.error,\r\n __athenaStatus: normalized.status,\r\n __athenaRaw: normalized.raw,\r\n __athenaResponse: rawResult,\r\n }\r\n }\r\n\r\n return {\r\n normalized,\r\n response: rawResult,\r\n attempt,\r\n }\r\n },\r\n {\r\n retry: input.retry,\r\n retryDelay: input.retryDelay,\r\n },\r\n )\r\n\r\n if (entry.activeRequestId === requestId) {\r\n const finishedAt = Date.now()\r\n const doneRequestLog: AthenaMutationRequestLog<TVariables> = {\r\n ...startRequestLog,\r\n attempt: result.attempt,\r\n endedAt: finishedAt,\r\n }\r\n this.setMutationState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'success',\r\n isLoading: false,\r\n data: result.normalized.data,\r\n error: null,\r\n lastVariables: input.variables,\r\n lastRequest: doneRequestLog,\r\n lastResponse: result.response,\r\n updatedAt: finishedAt,\r\n },\r\n 'mutation_updated',\r\n )\r\n }\r\n\r\n return result.normalized\r\n } catch (error) {\r\n const wrapped =\r\n typeof error === 'object' && error !== null ? (error as Record<string, unknown>) : undefined\r\n const normalizedError = wrapped?.__athenaNormalizedError\r\n ? (wrapped.__athenaNormalizedError as ReturnType<typeof normalizeAthenaError>)\r\n : normalizeAthenaError(error)\r\n\r\n const status =\r\n typeof wrapped?.__athenaStatus === 'number'\r\n ? (wrapped.__athenaStatus as number)\r\n : normalizedError.status ?? 500\r\n const raw = wrapped?.__athenaRaw ?? normalizedError.raw ?? null\r\n const response = wrapped?.__athenaResponse ?? raw\r\n\r\n if (entry.activeRequestId === requestId) {\r\n const finishedAt = Date.now()\r\n const doneRequestLog: AthenaMutationRequestLog<TVariables> = {\r\n ...startRequestLog,\r\n endedAt: finishedAt,\r\n attempt:\r\n entry.state.lastRequest?.requestId === requestId\r\n ? entry.state.lastRequest.attempt\r\n : startRequestLog.attempt,\r\n }\r\n\r\n this.setMutationState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'error',\r\n isLoading: false,\r\n error: normalizedError,\r\n lastVariables: input.variables,\r\n lastRequest: doneRequestLog,\r\n lastResponse: response,\r\n updatedAt: finishedAt,\r\n },\r\n 'mutation_updated',\r\n )\r\n }\r\n\r\n return {\r\n data: undefined,\r\n error: normalizedError,\r\n status,\r\n raw,\r\n }\r\n }\r\n }\r\n\r\n private ensureQueryEntry(key: string): QueryEntry {\r\n let entry = this.queryEntries.get(key)\r\n if (entry) return entry\r\n\r\n entry = {\r\n key,\r\n state: createInitialQueryState(),\r\n listeners: new Set(),\r\n activeRequestId: 0,\r\n }\r\n this.queryEntries.set(key, entry)\r\n return entry\r\n }\r\n\r\n private ensureMutationEntry(key: string): MutationEntry {\r\n let entry = this.mutationEntries.get(key)\r\n if (entry) return entry\r\n\r\n entry = {\r\n key,\r\n state: createInitialMutationState(),\r\n listeners: new Set(),\r\n activeRequestId: 0,\r\n }\r\n this.mutationEntries.set(key, entry)\r\n return entry\r\n }\r\n\r\n private scheduleQueryGc(entry: QueryEntry): void {\r\n const gcTime = shouldUseMemoryCache(this.config)\r\n ? Math.max(0, this.config.cache?.gcTime ?? 300_000)\r\n : Math.max(0, this.config.cache?.gcTime ?? 0)\r\n\r\n entry.gcTimer = setTimeout(() => {\r\n const current = this.queryEntries.get(entry.key)\r\n if (!current || current.listeners.size > 0) return\r\n this.queryEntries.delete(entry.key)\r\n this.inflightQueries.delete(entry.key)\r\n this.emitEvent({\r\n type: 'query_gc',\r\n key: entry.key,\r\n state: current.state,\r\n timestamp: Date.now(),\r\n })\r\n }, gcTime)\r\n }\r\n\r\n private scheduleMutationGc(entry: MutationEntry): void {\r\n const gcTime = shouldUseMemoryCache(this.config)\r\n ? Math.max(0, this.config.cache?.gcTime ?? 300_000)\r\n : Math.max(0, this.config.cache?.gcTime ?? 0)\r\n\r\n entry.gcTimer = setTimeout(() => {\r\n const current = this.mutationEntries.get(entry.key)\r\n if (!current || current.listeners.size > 0) return\r\n this.mutationEntries.delete(entry.key)\r\n }, gcTime)\r\n }\r\n\r\n private setQueryState(\r\n entry: QueryEntry,\r\n state: AthenaQueryState<unknown>,\r\n eventType: AthenaQueryEvent['type'],\r\n ): void {\r\n entry.state = state\r\n for (const listener of entry.listeners) {\r\n listener()\r\n }\r\n\r\n this.emitEvent({\r\n type: eventType,\r\n key: entry.key,\r\n state,\r\n timestamp: Date.now(),\r\n })\r\n }\r\n\r\n private setMutationState(\r\n entry: MutationEntry,\r\n state: AthenaMutationState<unknown, unknown>,\r\n eventType: AthenaMutationEvent['type'],\r\n ): void {\r\n entry.state = state\r\n for (const listener of entry.listeners) {\r\n listener()\r\n }\r\n\r\n this.emitEvent({\r\n type: eventType,\r\n key: entry.key,\r\n state,\r\n timestamp: Date.now(),\r\n })\r\n }\r\n\r\n private emitEvent(event: AthenaRuntimeEvent): void {\r\n for (const listener of this.eventSubscribers) {\r\n listener(event)\r\n }\r\n\r\n for (const adapter of this.adapters) {\r\n adapter.onEvent?.(event)\r\n if (event.type === 'query_updated' || event.type === 'query_reset' || event.type === 'query_gc') {\r\n adapter.onQueryUpdated?.(event)\r\n }\r\n if (event.type === 'mutation_updated' || event.type === 'mutation_reset') {\r\n adapter.onMutationUpdated?.(event)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function createAthenaQueryClient(config?: AthenaQueryClientConfig): AthenaQueryClient {\r\n return new AthenaQueryClient(config)\r\n}\r\n\r\nexport function attachStateAdapter(\r\n client: AthenaQueryClient,\r\n adapter: AthenaStateAdapter,\r\n): AthenaUnsubscribe {\r\n return client.attachAdapter(adapter)\r\n}\r\n","import { createContext, createElement, useContext, useMemo, type ReactNode } from 'react'\r\nimport type { AthenaQueryClientConfig } from './types.ts'\r\nimport { AthenaQueryClient, createAthenaQueryClient } from './query-client.ts'\r\n\r\nconst AthenaQueryClientContext = createContext<AthenaQueryClient | null>(null)\r\n\r\nexport interface AthenaQueryClientProviderProps {\r\n client?: AthenaQueryClient\r\n config?: AthenaQueryClientConfig\r\n children: ReactNode\r\n}\r\n\r\nexport function AthenaQueryClientProvider(props: AthenaQueryClientProviderProps) {\r\n const memoizedClient = useMemo(() => {\r\n if (props.client) {\r\n return props.client\r\n }\r\n return createAthenaQueryClient(props.config)\r\n }, [props.client, props.config])\r\n\r\n return createElement(\r\n AthenaQueryClientContext.Provider,\r\n { value: memoizedClient },\r\n props.children,\r\n )\r\n}\r\n\r\nexport function useAthenaQueryClient(): AthenaQueryClient {\r\n const client = useContext(AthenaQueryClientContext)\r\n if (!client) {\r\n throw new Error(\r\n 'No AthenaQueryClient found. Wrap your component tree with AthenaQueryClientProvider.',\r\n )\r\n }\r\n return client\r\n}\r\n\r\nexport { AthenaQueryClientContext }\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n} from 'react'\r\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\r\nimport type {\r\n AthenaQueryResult,\r\n AthenaQueryState,\r\n UseQueryOptions,\r\n UseQueryResult,\r\n} from './types.ts'\r\nimport { useAthenaQueryClient } from './provider.ts'\r\n\r\ntype BrowserEventName = 'focus' | 'online'\r\n\r\ntype BrowserTarget = {\r\n addEventListener: (event: BrowserEventName, listener: () => void) => void\r\n removeEventListener: (event: BrowserEventName, listener: () => void) => void\r\n}\r\n\r\nfunction getBrowserTarget(): BrowserTarget | null {\r\n const maybeGlobal = globalThis as unknown as {\r\n addEventListener?: unknown\r\n removeEventListener?: unknown\r\n window?: unknown\r\n }\r\n\r\n const hasListeners = (value: unknown): value is BrowserTarget =>\r\n Boolean(value) &&\r\n typeof value === 'object' &&\r\n typeof (value as BrowserTarget).addEventListener === 'function' &&\r\n typeof (value as BrowserTarget).removeEventListener === 'function'\r\n\r\n if (hasListeners(maybeGlobal.window)) {\r\n return maybeGlobal.window\r\n }\r\n\r\n if (hasListeners(maybeGlobal)) {\r\n return maybeGlobal\r\n }\r\n\r\n return null\r\n}\r\n\r\nexport function useQuery<TQueryFnData, TData = TQueryFnData>(\r\n options: UseQueryOptions<TQueryFnData, TData>,\r\n): UseQueryResult<TData> {\r\n const client = useAthenaQueryClient()\r\n\r\n const queryKeyRef = useRef(options.queryKey)\r\n queryKeyRef.current = options.queryKey\r\n\r\n const queryFnRef = useRef(options.queryFn)\r\n queryFnRef.current = options.queryFn\r\n\r\n const selectRef = useRef(options.select)\r\n selectRef.current = options.select\r\n\r\n const onSuccessRef = useRef(options.onSuccess)\r\n onSuccessRef.current = options.onSuccess\r\n\r\n const onErrorRef = useRef(options.onError)\r\n onErrorRef.current = options.onError\r\n\r\n const onSettledRef = useRef(options.onSettled)\r\n onSettledRef.current = options.onSettled\r\n\r\n const enabledRef = useRef(options.enabled ?? true)\r\n enabledRef.current = options.enabled ?? true\r\n\r\n const retryRef = useRef(options.retry)\r\n retryRef.current = options.retry\r\n\r\n const retryDelayRef = useRef(options.retryDelay)\r\n retryDelayRef.current = options.retryDelay\r\n\r\n const initialDataRef = useRef(options.initialData)\r\n initialDataRef.current = options.initialData\r\n\r\n const refetchOnMountRef = useRef(options.refetchOnMount)\r\n refetchOnMountRef.current = options.refetchOnMount\r\n\r\n const refetchOnWindowFocusRef = useRef(options.refetchOnWindowFocus)\r\n refetchOnWindowFocusRef.current = options.refetchOnWindowFocus\r\n\r\n const refetchOnReconnectRef = useRef(options.refetchOnReconnect)\r\n refetchOnReconnectRef.current = options.refetchOnReconnect\r\n\r\n const queryKeyToken = useMemo(\r\n () => client.getQueryKeyToken(options.queryKey),\r\n [client, options.queryKey],\r\n )\r\n const activeQueryKeyTokenRef = useRef(queryKeyToken)\r\n activeQueryKeyTokenRef.current = queryKeyToken\r\n\r\n const subscribe = useCallback(\r\n (listener: () => void) => client.subscribeQuery(queryKeyToken, listener),\r\n [client, queryKeyToken],\r\n )\r\n\r\n const getSnapshot = useCallback(\r\n () => client.getQueryState<TData>(queryKeyToken),\r\n [client, queryKeyToken],\r\n )\r\n\r\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\r\n\r\n const effectiveSnapshot = useMemo<AthenaQueryState<TData>>(() => {\r\n if (\r\n snapshot.status === 'idle' &&\r\n snapshot.data === undefined &&\r\n initialDataRef.current !== undefined\r\n ) {\r\n return {\r\n ...snapshot,\r\n status: 'success',\r\n data: initialDataRef.current,\r\n error: null,\r\n }\r\n }\r\n return snapshot\r\n }, [snapshot])\r\n\r\n const runQuery = useCallback(\r\n async (force = false): Promise<AthenaQueryResult<TData>> => {\r\n const result = await client.executeQuery<TQueryFnData, TData>({\r\n queryKey: queryKeyRef.current,\r\n queryKeyToken,\r\n queryFn: () => queryFnRef.current(),\r\n select: selectRef.current,\r\n retry:\r\n retryRef.current ??\r\n client.defaultQueryOptions.retry ??\r\n 0,\r\n retryDelay:\r\n retryDelayRef.current ??\r\n client.defaultQueryOptions.retryDelay,\r\n dedupe: true,\r\n force,\r\n })\r\n\r\n const internalResult = result as AthenaQueryResult<TData> & {\r\n __applied?: boolean\r\n }\r\n if (activeQueryKeyTokenRef.current !== queryKeyToken || internalResult.__applied === false) {\r\n return result\r\n }\r\n\r\n if (result.error) {\r\n onErrorRef.current?.(result.error)\r\n onSettledRef.current?.(result.data, result.error)\r\n return result\r\n }\r\n\r\n onSuccessRef.current?.(result.data as TData)\r\n onSettledRef.current?.(result.data, null)\r\n return result\r\n },\r\n [client, queryKeyToken],\r\n )\r\n\r\n const lastAutoKeyRef = useRef<string | null>(null)\r\n\r\n useEffect(() => {\r\n const refetchOnMount =\r\n refetchOnMountRef.current ?? client.defaultQueryOptions.refetchOnMount ?? true\r\n\r\n const isFirstRenderForKey = lastAutoKeyRef.current !== queryKeyToken\r\n lastAutoKeyRef.current = queryKeyToken\r\n\r\n if (!enabledRef.current) {\r\n return\r\n }\r\n\r\n const state = client.getQueryState(queryKeyToken)\r\n const shouldFetch = state.status === 'idle' || (isFirstRenderForKey && refetchOnMount)\r\n\r\n if (shouldFetch) {\r\n void runQuery(false)\r\n }\r\n }, [client, queryKeyToken, runQuery])\r\n\r\n useEffect(() => {\r\n const browser = getBrowserTarget()\r\n if (!browser || !enabledRef.current) {\r\n return undefined\r\n }\r\n\r\n const refetchOnWindowFocus =\r\n refetchOnWindowFocusRef.current ??\r\n client.defaultQueryOptions.refetchOnWindowFocus ??\r\n false\r\n\r\n if (!refetchOnWindowFocus) {\r\n return undefined\r\n }\r\n\r\n const onFocus = () => {\r\n if (!enabledRef.current) return\r\n void runQuery(true)\r\n }\r\n\r\n browser.addEventListener('focus', onFocus)\r\n return () => {\r\n browser.removeEventListener('focus', onFocus)\r\n }\r\n }, [client, runQuery])\r\n\r\n useEffect(() => {\r\n const browser = getBrowserTarget()\r\n if (!browser || !enabledRef.current) {\r\n return undefined\r\n }\r\n\r\n const refetchOnReconnect =\r\n refetchOnReconnectRef.current ??\r\n client.defaultQueryOptions.refetchOnReconnect ??\r\n false\r\n\r\n if (!refetchOnReconnect) {\r\n return undefined\r\n }\r\n\r\n const onReconnect = () => {\r\n if (!enabledRef.current) return\r\n void runQuery(true)\r\n }\r\n\r\n browser.addEventListener('online', onReconnect)\r\n return () => {\r\n browser.removeEventListener('online', onReconnect)\r\n }\r\n }, [client, runQuery])\r\n\r\n const refetch = useCallback(() => runQuery(true), [runQuery])\r\n\r\n const reset = useCallback(() => {\r\n client.resetQuery(queryKeyRef.current)\r\n }, [client])\r\n\r\n return {\r\n data: effectiveSnapshot.data,\r\n error: effectiveSnapshot.error,\r\n isLoading:\r\n effectiveSnapshot.status === 'loading' && effectiveSnapshot.data === undefined,\r\n isFetching: effectiveSnapshot.isFetching,\r\n isSuccess: effectiveSnapshot.status === 'success',\r\n isError: effectiveSnapshot.status === 'error',\r\n status: effectiveSnapshot.status,\r\n refetch,\r\n reset,\r\n lastResponse: effectiveSnapshot.lastResponse,\r\n lastRequest: effectiveSnapshot.lastRequest,\r\n }\r\n}\r\n","import { useCallback, useMemo, useRef } from 'react'\r\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\r\nimport type {\r\n UseMutationOptions,\r\n UseMutationResult,\r\n} from './types.ts'\r\nimport { useAthenaQueryClient } from './provider.ts'\r\n\r\nexport function useMutation<TVariables, TMutationFnData, TData = TMutationFnData>(\r\n options: UseMutationOptions<TVariables, TMutationFnData, TData>,\r\n): UseMutationResult<TVariables, TData> {\r\n const client = useAthenaQueryClient()\r\n\r\n const mutationKeyRef = useRef(options.mutationKey)\r\n mutationKeyRef.current = options.mutationKey\r\n\r\n const mutationFnRef = useRef(options.mutationFn)\r\n mutationFnRef.current = options.mutationFn\r\n\r\n const selectRef = useRef(options.select)\r\n selectRef.current = options.select\r\n\r\n const retryRef = useRef(options.retry)\r\n retryRef.current = options.retry\r\n\r\n const retryDelayRef = useRef(options.retryDelay)\r\n retryDelayRef.current = options.retryDelay\r\n\r\n const onMutateRef = useRef(options.onMutate)\r\n onMutateRef.current = options.onMutate\r\n\r\n const onSuccessRef = useRef(options.onSuccess)\r\n onSuccessRef.current = options.onSuccess\r\n\r\n const onErrorRef = useRef(options.onError)\r\n onErrorRef.current = options.onError\r\n\r\n const onSettledRef = useRef(options.onSettled)\r\n onSettledRef.current = options.onSettled\r\n\r\n const mutationKeyToken = useMemo(\r\n () => client.getMutationKeyToken(options.mutationKey),\r\n [client, options.mutationKey],\r\n )\r\n\r\n const subscribe = useCallback(\r\n (listener: () => void) => client.subscribeMutation(mutationKeyToken, listener),\r\n [client, mutationKeyToken],\r\n )\r\n\r\n const getSnapshot = useCallback(\r\n () => client.getMutationState<TVariables, TData>(mutationKeyToken),\r\n [client, mutationKeyToken],\r\n )\r\n\r\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\r\n\r\n const mutateAsync = useCallback(\r\n async (variables: TVariables): Promise<TData> => {\r\n await onMutateRef.current?.(variables)\r\n\r\n const result = await client.executeMutation<TVariables, TMutationFnData, TData>({\r\n mutationKey: mutationKeyRef.current,\r\n mutationKeyToken,\r\n variables,\r\n mutationFn: currentVariables => mutationFnRef.current(currentVariables),\r\n select: selectRef.current,\r\n retry:\r\n retryRef.current ??\r\n client.defaultMutationOptions.retry ??\r\n 0,\r\n retryDelay:\r\n retryDelayRef.current ??\r\n client.defaultMutationOptions.retryDelay,\r\n })\r\n\r\n if (result.error) {\r\n onErrorRef.current?.(result.error, variables)\r\n onSettledRef.current?.(result.data, result.error, variables)\r\n throw result.error\r\n }\r\n\r\n const data = result.data as TData\r\n onSuccessRef.current?.(data, variables)\r\n onSettledRef.current?.(data, null, variables)\r\n return data\r\n },\r\n [client, mutationKeyToken],\r\n )\r\n\r\n const mutate = useCallback(\r\n (variables: TVariables) => {\r\n void mutateAsync(variables).catch(() => undefined)\r\n },\r\n [mutateAsync],\r\n )\r\n\r\n const reset = useCallback(() => {\r\n client.resetMutation(mutationKeyRef.current)\r\n }, [client])\r\n\r\n return {\r\n mutate,\r\n mutateAsync,\r\n data: snapshot.data,\r\n error: snapshot.error,\r\n isIdle: snapshot.status === 'idle',\r\n isLoading: snapshot.status === 'loading',\r\n isSuccess: snapshot.status === 'success',\r\n isError: snapshot.status === 'error',\r\n status: snapshot.status,\r\n reset,\r\n lastResponse: snapshot.lastResponse,\r\n lastVariables: snapshot.lastVariables,\r\n lastRequest: snapshot.lastRequest,\r\n }\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type {\n AthenaAuthCallOptions,\n AthenaAuthErrorCode,\n AthenaAuthErrorDetails,\n AthenaAuthFetchCompatibleInput,\n AthenaAuthResult,\n AthenaAuthSessionResponse,\n} from '../auth/types.ts'\n\nexport interface UseSessionOptions {\n enabled?: boolean\n refetchOnMount?: boolean\n fetchInput?: AthenaAuthFetchCompatibleInput\n callOptions?: AthenaAuthCallOptions\n}\n\nexport interface UseSessionResult<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> {\n data: TSessionData | null\n error: AthenaAuthErrorDetails | null\n isPending: boolean\n isRefetching: boolean\n refetch: () => Promise<TSessionData | null>\n}\n\ntype SessionGetter<TSessionData extends AthenaAuthSessionResponse> = (\n input?: AthenaAuthFetchCompatibleInput,\n options?: AthenaAuthCallOptions,\n) => Promise<AthenaAuthResult<TSessionData>>\n\ntype UseSessionAuthClient<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> =\n | { getSession: SessionGetter<TSessionData> }\n | { auth: { getSession: SessionGetter<TSessionData> } }\n\ntype InferSessionData<TClient> =\n TClient extends { getSession: (...args: unknown[]) => Promise<AthenaAuthResult<infer TSessionData>> }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : TClient extends {\n auth: { getSession: (...args: unknown[]) => Promise<AthenaAuthResult<infer TSessionData>> }\n }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : AthenaAuthSessionResponse\n\nfunction resolveGetSession<TSessionData extends AthenaAuthSessionResponse>(\n authClient: UseSessionAuthClient<TSessionData>,\n): SessionGetter<TSessionData> {\n if ('getSession' in authClient && typeof authClient.getSession === 'function') {\n return authClient.getSession\n }\n\n if (\n 'auth' in authClient &&\n authClient.auth &&\n typeof authClient.auth.getSession === 'function'\n ) {\n return authClient.auth.getSession\n }\n\n throw new Error('useSession requires an auth-capable client (createClient(...).auth or createAuthClient(...))')\n}\n\n/**\n * Better Auth style session hook parity for Athena auth clients.\n */\nexport function useSession<TClient extends UseSessionAuthClient>(\n authClient: TClient,\n options: UseSessionOptions = {},\n): UseSessionResult<InferSessionData<TClient>> {\n type SessionData = InferSessionData<TClient>\n const enabled = options.enabled ?? true\n const refetchOnMount = options.refetchOnMount ?? true\n\n const [data, setData] = useState<SessionData | null>(null)\n const [error, setError] = useState<AthenaAuthErrorDetails | null>(null)\n const [isPending, setIsPending] = useState<boolean>(enabled)\n const [isRefetching, setIsRefetching] = useState<boolean>(false)\n const requestIdRef = useRef(0)\n const mountedRef = useRef(true)\n const dataRef = useRef<SessionData | null>(null)\n const getSession = resolveGetSession<SessionData>(\n authClient as UseSessionAuthClient<SessionData>,\n )\n\n useEffect(() => {\n dataRef.current = data\n }, [data])\n\n const toFallbackErrorDetails = (\n code: AthenaAuthErrorCode,\n message: string,\n status: number,\n ): AthenaAuthErrorDetails => ({\n code,\n message,\n status,\n })\n\n const runFetch = useCallback(async () => {\n const requestId = ++requestIdRef.current\n const hasData = dataRef.current !== null\n\n if (hasData) {\n setIsRefetching(true)\n } else {\n setIsPending(true)\n }\n\n try {\n const result = await getSession(options.fetchInput, options.callOptions)\n if (!mountedRef.current || requestId !== requestIdRef.current) {\n return null\n }\n\n if (result.ok) {\n setData((result.data ?? null) as SessionData | null)\n setError(null)\n return (result.data ?? null) as SessionData | null\n }\n\n setError(\n result.errorDetails ??\n toFallbackErrorDetails(\n 'UNKNOWN_ERROR',\n result.error ?? 'Failed to fetch session',\n result.status,\n ),\n )\n return null\n } catch (requestError) {\n if (!mountedRef.current || requestId !== requestIdRef.current) {\n return null\n }\n\n const message =\n requestError instanceof Error ? requestError.message : 'Failed to fetch session'\n setError(toFallbackErrorDetails('NETWORK_ERROR', message, 0))\n return null\n } finally {\n if (mountedRef.current && requestId === requestIdRef.current) {\n setIsPending(false)\n setIsRefetching(false)\n }\n }\n }, [getSession, options.callOptions, options.fetchInput])\n\n useEffect(() => {\n mountedRef.current = true\n if (enabled && refetchOnMount) {\n void runFetch()\n } else {\n setIsPending(false)\n }\n return () => {\n mountedRef.current = false\n }\n }, [enabled, refetchOnMount, runFetch])\n\n const refetch = useCallback(async () => {\n return await runFetch()\n }, [runFetch])\n\n return {\n data,\n error,\n isPending,\n isRefetching,\n refetch,\n }\n}\n","import * as React from 'react'\nimport type { AthenaStorageCallOptions, AthenaStorageModule } from '../storage/module.ts'\nimport type {\n AthenaStorageFileUploadInput,\n AthenaStorageFileUploadResult,\n AthenaStorageUploadProgress,\n AthenaStorageUploadProgressHandler,\n AthenaStorageUploadSource,\n} from '../storage/file.ts'\n\nexport type UseStorageUploadInput =\n | AthenaStorageFileUploadInput\n | AthenaStorageUploadSource\n | readonly AthenaStorageUploadSource[]\n | ArrayLike<AthenaStorageUploadSource>\n\nexport interface UseStorageUploadOptions extends Omit<Partial<AthenaStorageFileUploadInput>, 'files' | 'onProgress'> {\n storage: Pick<AthenaStorageModule, 'file'>\n onProgress?: AthenaStorageUploadProgressHandler\n}\n\nexport interface UseStorageUploadResult {\n uploading: boolean\n progress: AthenaStorageUploadProgress | null\n percent: number\n error: unknown\n result: AthenaStorageFileUploadResult | null\n upload(\n input: UseStorageUploadInput,\n options?: AthenaStorageCallOptions,\n ): Promise<AthenaStorageFileUploadResult>\n abort(): void\n reset(): void\n}\n\nexport function useStorageUpload(options: UseStorageUploadOptions): UseStorageUploadResult {\n const {\n storage,\n onProgress,\n ...defaults\n } = options\n const [uploading, setUploading] = React.useState(false)\n const [progress, setProgress] = React.useState<AthenaStorageUploadProgress | null>(null)\n const [error, setError] = React.useState<unknown>(null)\n const [result, setResult] = React.useState<AthenaStorageFileUploadResult | null>(null)\n const controllerRef = React.useRef<AbortController | null>(null)\n\n const reset = React.useCallback(() => {\n setUploading(false)\n setProgress(null)\n setError(null)\n setResult(null)\n }, [])\n\n const abort = React.useCallback(() => {\n controllerRef.current?.abort()\n controllerRef.current = null\n }, [])\n\n const upload = React.useCallback(async (\n input: UseStorageUploadInput,\n callOptions?: AthenaStorageCallOptions,\n ) => {\n const controller = callOptions?.signal ? null : new AbortController()\n controllerRef.current = controller\n setUploading(true)\n setError(null)\n setResult(null)\n\n const request = normalizeHookUploadInput(defaults, input, progressEvent => {\n setProgress(progressEvent)\n onProgress?.(progressEvent)\n if (isStorageUploadInput(input)) {\n input.onProgress?.(progressEvent)\n }\n })\n\n try {\n const uploaded = await storage.file.upload(request, {\n ...callOptions,\n signal: callOptions?.signal ?? controller?.signal,\n })\n setResult(uploaded)\n return uploaded\n } catch (uploadError) {\n setError(uploadError)\n throw uploadError\n } finally {\n setUploading(false)\n if (controllerRef.current === controller) {\n controllerRef.current = null\n }\n }\n }, [defaults, onProgress, storage])\n\n return {\n uploading,\n progress,\n percent: progress?.aggregatePercent ?? 0,\n error,\n result,\n upload,\n abort,\n reset,\n }\n}\n\nfunction normalizeHookUploadInput(\n defaults: Omit<Partial<AthenaStorageFileUploadInput>, 'files' | 'onProgress'>,\n input: UseStorageUploadInput,\n onProgress: AthenaStorageUploadProgressHandler,\n): AthenaStorageFileUploadInput {\n if (isStorageUploadInput(input)) {\n return {\n ...defaults,\n ...input,\n onProgress,\n } as AthenaStorageFileUploadInput\n }\n return {\n ...defaults,\n files: input,\n onProgress,\n } as AthenaStorageFileUploadInput\n}\n\nfunction isStorageUploadInput(input: UseStorageUploadInput): input is AthenaStorageFileUploadInput {\n return Boolean(input)\n && typeof input === 'object'\n && 'files' in input\n && 's3_id' in input\n}\n","import type { AnyModelDef, InsertOf, RowOf, UpdateOf } from './types.ts'\r\n\r\ntype ModelValueRecord = Record<string, unknown>\r\n\r\nexport type ModelFormNullishMode = 'empty-string' | 'undefined' | 'null'\r\n\r\ntype NullishValueByMode = {\r\n 'empty-string': ''\r\n undefined: undefined\r\n null: null\r\n}\r\n\r\ntype MapNullableToFormValue<TField, TMode extends ModelFormNullishMode> =\r\n null extends TField\r\n ? Exclude<TField, null> | NullishValueByMode[TMode]\r\n : TField\r\n\r\n/**\r\n * Form value shape derived from a model insert payload.\r\n * Nullable fields are remapped to the selected nullish representation.\r\n */\r\nexport type ModelFormValues<\r\n TModel extends AnyModelDef,\r\n TMode extends ModelFormNullishMode = 'empty-string',\r\n> = {\r\n [K in keyof InsertOf<TModel>]: MapNullableToFormValue<InsertOf<TModel>[K], TMode>\r\n}\r\n\r\n/**\r\n * Alias for deriving form value types from any model contract.\r\n */\r\nexport type FormValuesOf<\r\n TModel extends AnyModelDef,\r\n TMode extends ModelFormNullishMode = 'empty-string',\r\n> = ModelFormValues<TModel, TMode>\r\n\r\n/**\r\n * Default value shape for form initialization.\r\n */\r\nexport type ModelFormDefaults<\r\n TModel extends AnyModelDef,\r\n TMode extends ModelFormNullishMode = 'empty-string',\r\n> = Partial<ModelFormValues<TModel, TMode>>\r\n\r\nexport interface ToModelFormDefaultsOptions<TMode extends ModelFormNullishMode = 'empty-string'> {\r\n /**\r\n * Controls how nullable model values are represented in form defaults.\r\n * - `empty-string` (default): `null -> \"\"`\r\n * - `undefined`: `null -> undefined`\r\n * - `null`: keeps `null`\r\n */\r\n nullishMode?: TMode\r\n}\r\n\r\nexport interface ToModelPayloadOptions {\r\n /**\r\n * Converts `\"\"` into `null` for nullable model fields.\r\n * Defaults to `true`.\r\n */\r\n emptyStringAsNull?: boolean\r\n /**\r\n * Omits `undefined` keys from the outgoing payload.\r\n * Defaults to `true`.\r\n */\r\n stripUndefined?: boolean\r\n}\r\n\r\nfunction resolveNullishValue(mode: ModelFormNullishMode): '' | undefined | null {\r\n if (mode === 'undefined') return undefined\r\n if (mode === 'null') return null\r\n return ''\r\n}\r\n\r\nfunction isRecord(value: unknown): value is ModelValueRecord {\r\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\r\n}\r\n\r\nfunction isNullableColumn(model: AnyModelDef, key: string): boolean {\r\n const nullable = model.meta.nullable as Partial<Record<string, boolean>> | undefined\r\n return nullable?.[key] === true\r\n}\r\n\r\n/**\r\n * Normalizes model data into form-safe defaults using model nullability metadata.\r\n */\r\nexport function toModelFormDefaults<\r\n TModel extends AnyModelDef,\r\n TMode extends ModelFormNullishMode = 'empty-string',\r\n>(\r\n model: TModel,\r\n values?: Partial<RowOf<TModel>> | Partial<InsertOf<TModel>> | null,\r\n options?: ToModelFormDefaultsOptions<TMode>,\r\n): ModelFormDefaults<TModel, TMode> {\r\n const source = values as ModelValueRecord | null | undefined\r\n if (!isRecord(source)) {\r\n return {} as ModelFormDefaults<TModel, TMode>\r\n }\r\n\r\n const mode = options?.nullishMode ?? ('empty-string' as TMode)\r\n const nullishValue = resolveNullishValue(mode)\r\n const result: ModelValueRecord = {}\r\n\r\n for (const [key, value] of Object.entries(source)) {\r\n if (value === null && isNullableColumn(model, key)) {\r\n result[key] = nullishValue\r\n continue\r\n }\r\n result[key] = value\r\n }\r\n\r\n return result as ModelFormDefaults<TModel, TMode>\r\n}\r\n\r\n/**\r\n * Normalizes form values back into model-compatible insert/update payloads.\r\n */\r\nexport function toModelPayload<TModel extends AnyModelDef>(\r\n model: TModel,\r\n formValues: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\r\n options?: ToModelPayloadOptions,\r\n): Partial<InsertOf<TModel>> {\r\n const emptyStringAsNull = options?.emptyStringAsNull ?? true\r\n const stripUndefined = options?.stripUndefined ?? true\r\n const result: ModelValueRecord = {}\r\n\r\n for (const [key, rawValue] of Object.entries(formValues as ModelValueRecord)) {\r\n if (rawValue === undefined && stripUndefined) {\r\n continue\r\n }\r\n\r\n if (emptyStringAsNull && rawValue === '' && isNullableColumn(model, key)) {\r\n result[key] = null\r\n continue\r\n }\r\n\r\n result[key] = rawValue\r\n }\r\n\r\n return result as Partial<InsertOf<TModel>>\r\n}\r\n\r\n/**\r\n * Runtime form adapter bound to a model contract.\r\n */\r\nexport interface ModelFormAdapter<TModel extends AnyModelDef> {\r\n model: TModel\r\n toDefaults<TMode extends ModelFormNullishMode = 'empty-string'>(\r\n values?: Partial<RowOf<TModel>> | Partial<InsertOf<TModel>> | null,\r\n options?: ToModelFormDefaultsOptions<TMode>,\r\n ): ModelFormDefaults<TModel, TMode>\r\n toInsert(\r\n values: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\r\n options?: ToModelPayloadOptions,\r\n ): Partial<InsertOf<TModel>>\r\n toUpdate(\r\n values: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\r\n options?: ToModelPayloadOptions,\r\n ): Partial<UpdateOf<TModel>>\r\n}\r\n\r\n/**\r\n * Creates a small model-aware adapter for form defaults and payload normalization.\r\n */\r\nexport function createModelFormAdapter<TModel extends AnyModelDef>(model: TModel): ModelFormAdapter<TModel> {\r\n return {\r\n model,\r\n toDefaults(values, options) {\r\n return toModelFormDefaults(model, values, options)\r\n },\r\n toInsert(values, options) {\r\n return toModelPayload(model, values, options) as Partial<InsertOf<TModel>>\r\n },\r\n toUpdate(values, options) {\r\n return toModelPayload(model, values, options) as Partial<UpdateOf<TModel>>\r\n },\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/gateway/errors.ts","../src/gateway/url.ts","../src/cookies/cookie-utils.ts","../src/cookies/index.ts","../package.json","../src/sdk-version.ts","../src/gateway/client.ts","../src/gateway/use-athena-gateway.ts","../src/react/utils.ts","../src/react/query-client.ts","../src/react/provider.ts","../src/react/use-query.ts","../src/react/use-mutation.ts","../src/react/use-session.ts","../src/react/use-athena-session-client.ts","../src/react/use-storage-upload.ts","../src/schema/model-form.ts"],"names":["isRecord","serialized","sourceData","selectedData","useMemo","useCallback","useRef","useSyncExternalStore","useState","useEffect"],"mappings":"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","file":"react.js","sourcesContent":["import type {\n AthenaGatewayEndpointPath,\n AthenaGatewayErrorCode,\n AthenaGatewayErrorDetails,\n AthenaGatewayMethod,\n AthenaGatewayResponse,\n} from './types.js'\n\nexport interface AthenaGatewayErrorInput {\n code: AthenaGatewayErrorCode\n message: string\n status?: number\n endpoint?: AthenaGatewayEndpointPath\n method?: AthenaGatewayMethod\n requestId?: string\n hint?: string\n cause?: string\n}\n\n/**\n * Canonical error for gateway failures.\n * Holds request context and machine-readable classification.\n */\nexport class AthenaGatewayError extends Error {\n readonly code: AthenaGatewayErrorCode\n readonly status: number\n readonly endpoint?: AthenaGatewayEndpointPath\n readonly method?: AthenaGatewayMethod\n readonly requestId?: string\n readonly hint?: string\n readonly causeDetail?: string\n\n constructor(input: AthenaGatewayErrorInput) {\n super(input.message)\n this.name = 'AthenaGatewayError'\n this.code = input.code\n this.status = input.status ?? 0\n this.endpoint = input.endpoint\n this.method = input.method\n this.requestId = input.requestId\n this.hint = input.hint\n this.causeDetail = input.cause\n }\n\n toDetails(): AthenaGatewayErrorDetails {\n return {\n code: this.code,\n message: this.message,\n status: this.status,\n endpoint: this.endpoint,\n method: this.method,\n requestId: this.requestId,\n hint: this.hint,\n cause: this.causeDetail,\n }\n }\n\n static fromResponse<T>(\n response: AthenaGatewayResponse<T>,\n fallback: Omit<AthenaGatewayErrorInput, 'code' | 'message' | 'status'>,\n ) {\n const details = response.errorDetails\n if (details) {\n return new AthenaGatewayError({\n code: details.code,\n message: details.message,\n status: details.status,\n endpoint: details.endpoint ?? fallback.endpoint,\n method: details.method ?? fallback.method,\n requestId: details.requestId ?? fallback.requestId,\n hint: details.hint,\n cause: details.cause,\n })\n }\n\n return new AthenaGatewayError({\n code: 'HTTP_ERROR',\n message: response.error ?? 'Gateway request failed',\n status: response.status,\n endpoint: fallback.endpoint,\n method: fallback.method,\n requestId: fallback.requestId,\n })\n }\n}\n\nexport function isAthenaGatewayError(error: unknown): error is AthenaGatewayError {\n return error instanceof AthenaGatewayError\n}\n","import { AthenaGatewayError } from './errors.ts'\n\nexport const ATHENA_DEFAULT_BASE_URL = 'https://athena-db.com'\n\nfunction describeReceivedValue(value: unknown): string {\n if (value === undefined) return 'undefined'\n if (value === null) return 'null'\n if (typeof value === 'string') {\n return value.trim().length > 0 ? JSON.stringify(value) : 'an empty string'\n }\n return `${typeof value} ${JSON.stringify(value)}`\n}\n\nfunction invalidBaseUrlError(message: string, hint: string): AthenaGatewayError {\n return new AthenaGatewayError({\n code: 'INVALID_URL',\n message,\n status: 0,\n hint,\n })\n}\n\nexport interface NormalizeAthenaGatewayBaseUrlOptions {\n defaultBaseUrl?: string\n label?: string\n}\n\nexport function normalizeAthenaGatewayBaseUrl(\n input: string | null | undefined,\n options: NormalizeAthenaGatewayBaseUrlOptions = {},\n): string {\n const label = options.label ?? 'Athena gateway base URL'\n const candidate = input ?? options.defaultBaseUrl\n\n if (candidate === undefined || candidate === null) {\n throw invalidBaseUrlError(\n `${label} must be a non-empty absolute http(s) URL. Received ${describeReceivedValue(input)}.`,\n 'Set ATHENA_URL (or pass createClient(url, ...)) to a full URL such as \"https://mirror3.athena-db.com\".',\n )\n }\n\n const trimmed = candidate.trim()\n if (!trimmed) {\n throw invalidBaseUrlError(\n `${label} must be a non-empty absolute http(s) URL. Received ${describeReceivedValue(candidate)}.`,\n 'Set ATHENA_URL (or pass createClient(url, ...)) to a full URL such as \"https://mirror3.athena-db.com\".',\n )\n }\n\n let parsed: URL\n try {\n parsed = new URL(trimmed)\n } catch {\n throw invalidBaseUrlError(\n `${label} must be a valid absolute http(s) URL. Received ${describeReceivedValue(candidate)}.`,\n 'Use a full URL including the protocol, for example \"https://mirror3.athena-db.com\".',\n )\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw invalidBaseUrlError(\n `${label} must use http or https. Received ${JSON.stringify(trimmed)}.`,\n 'Use an Athena gateway URL such as \"https://mirror3.athena-db.com\".',\n )\n }\n\n if (parsed.search || parsed.hash) {\n throw invalidBaseUrlError(\n `${label} must not include query parameters or hash fragments. Received ${JSON.stringify(trimmed)}.`,\n 'Pass only the base URL. Endpoint paths such as \"/gateway/fetch\" are appended by the SDK.',\n )\n }\n\n return parsed.toString().replace(/\\/+$/, '')\n}\n\nexport function buildAthenaGatewayUrl(baseUrl: string, path: string): string {\n if (!path.startsWith('/')) {\n throw invalidBaseUrlError(\n `Athena gateway path must start with \"/\". Received ${JSON.stringify(path)}.`,\n 'Use a leading slash such as \"/gateway/fetch\" or \"/\".',\n )\n }\n\n return `${baseUrl}${path}`\n}\n","import type { AthenaCookieOptions } from './types.ts'\n\nfunction tryDecode(str: string): string {\n if (str.indexOf('%') === -1) {\n return str\n }\n try {\n return decodeURIComponent(str)\n } catch {\n return str\n }\n}\n\nexport interface CookieAttributes {\n value: string\n 'max-age'?: number\n expires?: Date\n domain?: string\n path?: string\n secure?: boolean\n httponly?: boolean\n partitioned?: boolean\n samesite?: 'strict' | 'lax' | 'none'\n [key: string]: unknown\n}\n\nexport const SECURE_COOKIE_PREFIX = '__Secure-'\nexport const HOST_COOKIE_PREFIX = '__Host-'\n\n/**\n * Remove __Secure- or __Host- prefix from cookie name.\n */\nexport function stripSecureCookiePrefix(cookieName: string): string {\n if (cookieName.startsWith(SECURE_COOKIE_PREFIX)) {\n return cookieName.slice(SECURE_COOKIE_PREFIX.length)\n }\n if (cookieName.startsWith(HOST_COOKIE_PREFIX)) {\n return cookieName.slice(HOST_COOKIE_PREFIX.length)\n }\n return cookieName\n}\n\n/**\n * Split a comma-joined `Set-Cookie` header string into individual cookies.\n */\nexport function splitSetCookieHeader(setCookie: string): string[] {\n if (!setCookie) {\n return []\n }\n\n const result: string[] = []\n let start = 0\n let i = 0\n\n while (i < setCookie.length) {\n if (setCookie[i] === ',') {\n let j = i + 1\n while (j < setCookie.length && setCookie[j] === ' ') {\n j++\n }\n while (j < setCookie.length && setCookie[j] !== '=' && setCookie[j] !== ';' && setCookie[j] !== ',') {\n j++\n }\n\n if (j < setCookie.length && setCookie[j] === '=') {\n const part = setCookie.slice(start, i).trim()\n if (part) {\n result.push(part)\n }\n start = i + 1\n while (start < setCookie.length && setCookie[start] === ' ') {\n start++\n }\n i = start\n continue\n }\n }\n i++\n }\n\n const last = setCookie.slice(start).trim()\n if (last) {\n result.push(last)\n }\n\n return result\n}\n\nexport function parseSetCookieHeader(setCookie: string): Map<string, CookieAttributes> {\n const cookies = new Map<string, CookieAttributes>()\n const cookieArray = splitSetCookieHeader(setCookie)\n\n for (const cookieString of cookieArray) {\n const parts = cookieString.split(';').map((part) => part.trim())\n const [nameValue, ...attributes] = parts\n const [name, ...valueParts] = (nameValue || '').split('=')\n if (!name) {\n continue\n }\n\n const value = unquoteCookieValue(valueParts.join('='))\n const decodedValue = tryDecode(value)\n const attrObj: CookieAttributes = { value: decodedValue }\n\n for (const attribute of attributes) {\n const [attrName, ...attrValueParts] = attribute.split('=')\n const attrValue = attrValueParts.join('=')\n const normalizedAttrName = attrName.trim().toLowerCase()\n switch (normalizedAttrName) {\n case 'max-age':\n attrObj['max-age'] = attrValue ? parseInt(attrValue.trim(), 10) : undefined\n break\n case 'expires':\n attrObj.expires = attrValue ? new Date(attrValue.trim()) : undefined\n break\n case 'domain':\n attrObj.domain = attrValue ? attrValue.trim() : undefined\n break\n case 'path':\n attrObj.path = attrValue ? attrValue.trim() : undefined\n break\n case 'secure':\n attrObj.secure = true\n break\n case 'httponly':\n attrObj.httponly = true\n break\n case 'samesite':\n attrObj.samesite = attrValue ? (attrValue.trim().toLowerCase() as 'strict' | 'lax' | 'none') : undefined\n break\n case 'partitioned':\n attrObj.partitioned = true\n break\n default:\n attrObj[normalizedAttrName] = attrValue ? attrValue.trim() : true\n break\n }\n }\n\n cookies.set(name, attrObj)\n }\n\n return cookies\n}\n\nexport function toCookieOptions(attributes: CookieAttributes): AthenaCookieOptions {\n return {\n maxAge: attributes['max-age'],\n expires: attributes.expires,\n domain: attributes.domain,\n path: attributes.path,\n secure: attributes.secure,\n httpOnly: attributes.httponly,\n sameSite: attributes.samesite,\n partitioned: attributes.partitioned,\n }\n}\n\n/**\n * Cookie-name token char set per RFC 7230 §3.2.6.\n */\nexport const cookieNameRegex = /^[\\w!#$%&'*.^`|~+-]+$/\n\nfunction unquoteCookieValue(value: string): string {\n if (value.length < 2 || !value.startsWith('\"') || !value.endsWith('\"')) {\n return value\n }\n return value.slice(1, -1)\n}\n\n/**\n * Parse a `Cookie` header into a key/value map.\n */\nexport function parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = cookieHeader.split('; ')\n const cookieMap = new Map<string, string>()\n cookies.forEach((cookie) => {\n const [name, value] = cookie.split(/=(.*)/s)\n cookieMap.set(name as string, value as string)\n })\n return cookieMap\n}\n\n/**\n * Add or replace a cookie in the request `Cookie` header.\n */\nexport function setRequestCookie(headers: Headers, name: string, value: string): void {\n const cookieMap = parseCookies(headers.get('cookie') || '')\n if (cookieNameRegex.test(name)) {\n cookieMap.set(name, value)\n }\n headers.set(\n 'cookie',\n Array.from(cookieMap, ([key, currentValue]) => `${key}=${encodeURIComponent(currentValue)}`).join('; '),\n )\n}\n\n/**\n * Merge `Set-Cookie` values into a `Cookie` header.\n */\nexport function applySetCookies(target: Headers, setCookieValues: Iterable<string>): void {\n const cookieMap = parseCookies(target.get('cookie') || '')\n for (const setCookie of setCookieValues) {\n for (const [name, attr] of parseSetCookieHeader(setCookie)) {\n if (cookieNameRegex.test(name)) {\n cookieMap.set(name, attr.value)\n }\n }\n }\n target.set(\n 'cookie',\n Array.from(cookieMap, ([key, currentValue]) => `${key}=${encodeURIComponent(currentValue)}`).join('; '),\n )\n}\n\nexport function setCookieToHeader(headers: Headers) {\n return (context: { response: Response }) => {\n const setCookieHeader = context.response.headers.get('set-cookie')\n if (!setCookieHeader) {\n return\n }\n applySetCookies(headers, [setCookieHeader])\n }\n}\n","import { decodeBase64UrlToString, encodeStringToBase64Url } from './base64.ts'\r\nimport {\r\n HOST_COOKIE_PREFIX,\r\n SECURE_COOKIE_PREFIX,\r\n parseCookies,\r\n parseSetCookieHeader,\r\n setCookieToHeader,\r\n setRequestCookie,\r\n splitSetCookieHeader,\r\n stripSecureCookiePrefix,\r\n toCookieOptions,\r\n} from './cookie-utils.ts'\r\nimport { signHmacBase64Url, signJwtHS256, verifyJwtHS256 } from './crypto.ts'\r\nimport { createAccountStore, createSessionStore, getAccountCookie, getChunkedCookie } from './session-store.ts'\r\nimport type {\r\n AthenaAuthCookie,\r\n AthenaAuthCookies,\r\n AthenaCookieContextRuntime,\r\n AthenaCookieOptions,\r\n AthenaCookiesOptions,\r\n AthenaCookieVersionResolver,\r\n AthenaGetCookieCacheConfig,\r\n AthenaSessionPair,\r\n} from './types.ts'\r\n\r\nconst DEFAULT_COOKIE_PREFIX = 'athena-auth'\r\nconst LEGACY_COOKIE_PREFIX = 'better-auth'\r\nconst DEFAULT_SESSION_MAX_AGE = 7 * 24 * 60 * 60\r\nconst DEFAULT_CACHE_MAX_AGE = 60 * 5\r\n\r\nfunction isProductionRuntime(): boolean {\r\n return typeof process !== 'undefined' && process.env?.NODE_ENV === 'production'\r\n}\r\n\r\nfunction getEnvironmentSecret(): string | undefined {\r\n if (typeof process === 'undefined') {\r\n return undefined\r\n }\r\n return process.env?.ATHENA_AUTH_SECRET || process.env?.BETTER_AUTH_SECRET || process.env?.AUTH_SECRET\r\n}\r\n\r\nfunction isDynamicBaseURLConfig(baseURL: AthenaCookiesOptions['baseURL']): boolean {\r\n return (\r\n typeof baseURL === 'object' &&\r\n baseURL !== null &&\r\n 'allowedHosts' in baseURL &&\r\n Array.isArray((baseURL as { allowedHosts?: unknown }).allowedHosts)\r\n )\r\n}\r\n\r\nfunction resolveCookiePrefixes(primaryPrefix: string): string[] {\r\n const prefixes = [primaryPrefix]\r\n if (!prefixes.includes(DEFAULT_COOKIE_PREFIX)) {\r\n prefixes.push(DEFAULT_COOKIE_PREFIX)\r\n }\r\n if (!prefixes.includes(LEGACY_COOKIE_PREFIX)) {\r\n prefixes.push(LEGACY_COOKIE_PREFIX)\r\n }\r\n return prefixes\r\n}\r\n\r\nfunction createError(message: string): Error {\r\n return new Error(`@xylex-group/athena/cookies: ${message}`)\r\n}\r\n\r\nfunction getSecretOrThrow(secret?: string): string {\r\n const resolved = secret || getEnvironmentSecret()\r\n if (!resolved) {\r\n throw createError(\r\n 'getCookieCache requires a secret. Pass `secret` or set ATHENA_AUTH_SECRET/BETTER_AUTH_SECRET/AUTH_SECRET.',\r\n )\r\n }\r\n return resolved\r\n}\r\n\r\nfunction asObject(value: unknown): Record<string, unknown> | null {\r\n if (!value || typeof value !== 'object') {\r\n return null\r\n }\r\n return value as Record<string, unknown>\r\n}\r\n\r\nfunction getSessionTokenFromPair(session: AthenaSessionPair): string {\r\n const token = session.session?.token\r\n if (typeof token !== 'string' || token.length === 0) {\r\n throw createError('setSessionCookie requires `session.session.token` to be a non-empty string.')\r\n }\r\n return token\r\n}\r\n\r\nasync function resolveCookieVersion(\r\n versionConfig: AthenaCookieVersionResolver | undefined,\r\n session: Record<string, unknown>,\r\n user: Record<string, unknown>,\r\n): Promise<string> {\r\n if (!versionConfig) {\r\n return '1'\r\n }\r\n if (typeof versionConfig === 'string') {\r\n return versionConfig\r\n }\r\n return versionConfig(session, user)\r\n}\r\n\r\nfunction getSessionCookieCacheName(cookiePrefix: string, cookieName: string, isSecure: boolean): string {\r\n return isSecure ? `${SECURE_COOKIE_PREFIX}${cookiePrefix}.${cookieName}` : `${cookiePrefix}.${cookieName}`\r\n}\r\n\r\nasync function setCookieValue(\r\n ctx: AthenaCookieContextRuntime,\r\n name: string,\r\n value: string,\r\n attributes: AthenaCookieOptions,\r\n): Promise<void> {\r\n const secret = ctx.context.secret\r\n if (secret && typeof ctx.setSignedCookie === 'function') {\r\n await ctx.setSignedCookie(name, value, secret, attributes)\r\n return\r\n }\r\n ctx.setCookie(name, value, attributes)\r\n}\r\n\r\nfunction parseJsonSafely<T>(value: string): T | null {\r\n try {\r\n return JSON.parse(value) as T\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction getIsSecureCookie(config: { isSecure?: boolean } | undefined): boolean {\r\n if (config?.isSecure !== undefined) {\r\n return config.isSecure\r\n }\r\n return isProductionRuntime()\r\n}\r\n\r\nexport function createCookieGetter(options: AthenaCookiesOptions) {\r\n const baseURLString = typeof options.baseURL === 'string' ? options.baseURL : undefined\r\n const dynamicProtocol =\r\n typeof options.baseURL === 'object' && options.baseURL !== null ? options.baseURL.protocol : undefined\r\n\r\n const secure =\r\n options.advanced?.useSecureCookies !== undefined\r\n ? options.advanced.useSecureCookies\r\n : dynamicProtocol === 'https'\r\n ? true\r\n : dynamicProtocol === 'http'\r\n ? false\r\n : baseURLString\r\n ? baseURLString.startsWith('https://')\r\n : isProductionRuntime()\r\n\r\n const secureCookiePrefix = secure ? SECURE_COOKIE_PREFIX : ''\r\n const crossSubdomainEnabled = !!options.advanced?.crossSubDomainCookies?.enabled\r\n const domain = crossSubdomainEnabled\r\n ? options.advanced?.crossSubDomainCookies?.domain || (baseURLString ? new URL(baseURLString).hostname : undefined)\r\n : undefined\r\n\r\n if (crossSubdomainEnabled && !domain && !isDynamicBaseURLConfig(options.baseURL)) {\r\n throw createError('baseURL is required when `crossSubDomainCookies.enabled` is true.')\r\n }\r\n\r\n function createCookie(cookieName: string, overrideAttributes: Partial<AthenaCookieOptions> = {}): AthenaAuthCookie {\r\n const prefix = options.advanced?.cookiePrefix || DEFAULT_COOKIE_PREFIX\r\n const name = options.advanced?.cookies?.[cookieName]?.name || `${prefix}.${cookieName}`\r\n const attributes = options.advanced?.cookies?.[cookieName]?.attributes || {}\r\n\r\n return {\r\n name: `${secureCookiePrefix}${name}`,\r\n attributes: {\r\n secure: !!secureCookiePrefix,\r\n sameSite: 'lax',\r\n path: '/',\r\n httpOnly: true,\r\n ...(crossSubdomainEnabled ? { domain } : {}),\r\n ...options.advanced?.defaultCookieAttributes,\r\n ...overrideAttributes,\r\n ...attributes,\r\n },\r\n }\r\n }\r\n\r\n return createCookie\r\n}\r\n\r\nexport function getCookies(options: AthenaCookiesOptions): AthenaAuthCookies {\r\n const createCookie = createCookieGetter(options)\r\n const sessionToken = createCookie('session_token', { maxAge: options.session?.expiresIn || DEFAULT_SESSION_MAX_AGE })\r\n const sessionData = createCookie('session_data', { maxAge: options.session?.cookieCache?.maxAge || DEFAULT_CACHE_MAX_AGE })\r\n const accountData = createCookie('account_data', { maxAge: options.session?.cookieCache?.maxAge || DEFAULT_CACHE_MAX_AGE })\r\n const dontRememberToken = createCookie('dont_remember')\r\n\r\n return {\r\n sessionToken: {\r\n name: sessionToken.name,\r\n attributes: sessionToken.attributes,\r\n },\r\n sessionData: {\r\n name: sessionData.name,\r\n attributes: sessionData.attributes,\r\n },\r\n dontRememberToken: {\r\n name: dontRememberToken.name,\r\n attributes: dontRememberToken.attributes,\r\n },\r\n accountData: {\r\n name: accountData.name,\r\n attributes: accountData.attributes,\r\n },\r\n }\r\n}\r\n\r\nexport async function setCookieCache(\r\n ctx: AthenaCookieContextRuntime,\r\n session: AthenaSessionPair,\r\n dontRememberMe: boolean,\r\n): Promise<void> {\r\n const cookieCacheConfig = ctx.context.options?.session?.cookieCache\r\n if (!cookieCacheConfig?.enabled) {\r\n return\r\n }\r\n\r\n const version = await resolveCookieVersion(\r\n cookieCacheConfig.version,\r\n session.session as Record<string, unknown>,\r\n session.user as Record<string, unknown>,\r\n )\r\n\r\n const sessionData = {\r\n session: session.session,\r\n user: session.user,\r\n updatedAt: Date.now(),\r\n version,\r\n }\r\n\r\n const baseAttributes = ctx.context.authCookies.sessionData.attributes\r\n const maxAge = dontRememberMe ? undefined : baseAttributes.maxAge\r\n const options: AthenaCookieOptions = {\r\n ...baseAttributes,\r\n maxAge,\r\n }\r\n const expiresAt = Date.now() + ((options.maxAge || 60) * 1000)\r\n const strategy = cookieCacheConfig.strategy || 'compact'\r\n const secret = getSecretOrThrow(ctx.context.secret)\r\n\r\n let encoded: string\r\n if (strategy === 'jwt') {\r\n encoded = await signJwtHS256(sessionData, secret, options.maxAge || DEFAULT_CACHE_MAX_AGE)\r\n } else if (strategy === 'jwe') {\r\n throw createError('`jwe` strategy is not supported by the SDK cookie helper.')\r\n } else {\r\n const signature = await signHmacBase64Url(\r\n secret,\r\n JSON.stringify({\r\n ...sessionData,\r\n expiresAt,\r\n }),\r\n )\r\n encoded = encodeStringToBase64Url(\r\n JSON.stringify({\r\n session: sessionData,\r\n expiresAt,\r\n signature,\r\n }),\r\n )\r\n }\r\n\r\n if (encoded.length > 4093) {\r\n const store = createSessionStore(ctx.context.authCookies.sessionData.name, options, ctx)\r\n const cookies = store.chunk(encoded, options)\r\n store.setCookies(cookies)\r\n } else {\r\n const store = createSessionStore(ctx.context.authCookies.sessionData.name, options, ctx)\r\n if (store.hasChunks()) {\r\n store.setCookies(store.clean())\r\n }\r\n ctx.setCookie(ctx.context.authCookies.sessionData.name, encoded, options)\r\n }\r\n}\r\n\r\nexport async function setSessionCookie(\r\n ctx: AthenaCookieContextRuntime,\r\n session: AthenaSessionPair,\r\n dontRememberMe?: boolean,\r\n overrides?: Partial<AthenaCookieOptions>,\r\n): Promise<void> {\r\n if (dontRememberMe === undefined && typeof ctx.getSignedCookie === 'function' && ctx.context.secret) {\r\n const existingFlag = await ctx.getSignedCookie(ctx.context.authCookies.dontRememberToken.name, ctx.context.secret)\r\n dontRememberMe = !!existingFlag\r\n }\r\n\r\n const resolvedDontRememberMe = dontRememberMe ?? false\r\n const token = getSessionTokenFromPair(session)\r\n const options = ctx.context.authCookies.sessionToken.attributes\r\n const maxAge = resolvedDontRememberMe ? undefined : ctx.context.sessionConfig?.expiresIn\r\n await setCookieValue(ctx, ctx.context.authCookies.sessionToken.name, token, {\r\n ...options,\r\n maxAge,\r\n ...overrides,\r\n })\r\n\r\n if (resolvedDontRememberMe) {\r\n await setCookieValue(\r\n ctx,\r\n ctx.context.authCookies.dontRememberToken.name,\r\n 'true',\r\n ctx.context.authCookies.dontRememberToken.attributes,\r\n )\r\n }\r\n\r\n await setCookieCache(ctx, session, resolvedDontRememberMe)\r\n ctx.context.setNewSession?.(session)\r\n}\r\n\r\n/**\r\n * Expires a cookie by setting `maxAge: 0` while preserving attributes.\r\n */\r\nexport function expireCookie(ctx: AthenaCookieContextRuntime, cookie: AthenaAuthCookie): void {\r\n ctx.setCookie(cookie.name, '', {\r\n ...cookie.attributes,\r\n maxAge: 0,\r\n })\r\n}\r\n\r\nexport function deleteSessionCookie(ctx: AthenaCookieContextRuntime, skipDontRememberMe?: boolean): void {\r\n expireCookie(ctx, ctx.context.authCookies.sessionToken)\r\n expireCookie(ctx, ctx.context.authCookies.sessionData)\r\n\r\n if (ctx.context.options?.account?.storeAccountCookie) {\r\n expireCookie(ctx, ctx.context.authCookies.accountData)\r\n const accountStore = createAccountStore(\r\n ctx.context.authCookies.accountData.name,\r\n ctx.context.authCookies.accountData.attributes,\r\n ctx,\r\n )\r\n accountStore.setCookies(accountStore.clean())\r\n }\r\n\r\n const sessionStore = createSessionStore(\r\n ctx.context.authCookies.sessionData.name,\r\n ctx.context.authCookies.sessionData.attributes,\r\n ctx,\r\n )\r\n sessionStore.setCookies(sessionStore.clean())\r\n\r\n if (!skipDontRememberMe) {\r\n expireCookie(ctx, ctx.context.authCookies.dontRememberToken)\r\n }\r\n}\r\n\r\nexport const getSessionCookie = (\r\n request: Request | Headers,\r\n config?:\r\n | {\r\n cookiePrefix?: string\r\n cookieName?: string\r\n path?: string\r\n }\r\n | undefined,\r\n): string | null => {\r\n const cookies = (request instanceof Headers || !('headers' in request) ? request : request.headers).get('cookie')\r\n if (!cookies) {\r\n return null\r\n }\r\n\r\n const { cookieName = 'session_token', cookiePrefix = 'athena-auth' } = config || {}\r\n const parsedCookie = parseCookies(cookies)\r\n const getCookie = (name: string): string | undefined =>\r\n parsedCookie.get(name) || parsedCookie.get(`${SECURE_COOKIE_PREFIX}${name}`)\r\n const candidateCookieNames = Array.from(new Set([\r\n cookieName,\r\n cookieName.replace(/_/g, '-'),\r\n cookieName.replace(/-/g, '_'),\r\n ])).filter(Boolean)\r\n for (const candidateName of candidateCookieNames) {\r\n const sessionToken =\r\n getCookie(`${cookiePrefix}.${candidateName}`) || getCookie(`${cookiePrefix}-${candidateName}`)\r\n if (sessionToken) {\r\n return sessionToken\r\n }\r\n }\r\n return null\r\n}\r\n\r\nexport const getCookieCache = async <\r\n SessionShape extends Record<string, unknown> = Record<string, unknown>,\r\n UserShape extends Record<string, unknown> = Record<string, unknown>,\r\n>(\r\n request: Request | Headers,\r\n config?: AthenaGetCookieCacheConfig<SessionShape, UserShape>,\r\n): Promise<{\r\n session: SessionShape\r\n user: UserShape\r\n updatedAt: number\r\n version?: string\r\n} | null> => {\r\n const headers = request instanceof Headers || !('headers' in request) ? request : request.headers\r\n const cookieHeader = headers.get('cookie')\r\n if (!cookieHeader) {\r\n return null\r\n }\r\n\r\n const parsedCookie = parseCookies(cookieHeader)\r\n const cookieName = config?.cookieName || 'session_data'\r\n const requestedPrefix = config?.cookiePrefix || DEFAULT_COOKIE_PREFIX\r\n const strategy = config?.strategy || 'compact'\r\n const cookiePrefixes = resolveCookiePrefixes(requestedPrefix)\r\n const isSecure = getIsSecureCookie(config)\r\n const secret = getSecretOrThrow(config?.secret)\r\n\r\n let sessionData: string | undefined\r\n\r\n for (const prefix of cookiePrefixes) {\r\n const candidate = getSessionCookieCacheName(prefix, cookieName, isSecure)\r\n const cookieValue = parsedCookie.get(candidate)\r\n if (cookieValue) {\r\n sessionData = cookieValue\r\n break\r\n }\r\n }\r\n\r\n if (!sessionData) {\r\n const reconstructedChunks: Array<{ index: number; value: string }> = []\r\n for (const prefix of cookiePrefixes) {\r\n const candidate = getSessionCookieCacheName(prefix, cookieName, isSecure)\r\n for (const [name, value] of parsedCookie.entries()) {\r\n if (!name.startsWith(`${candidate}.`)) {\r\n continue\r\n }\r\n const parts = name.split('.')\r\n const indexStr = parts[parts.length - 1]\r\n const index = parseInt(indexStr || '0', 10)\r\n if (!Number.isNaN(index)) {\r\n reconstructedChunks.push({ index, value })\r\n }\r\n }\r\n if (reconstructedChunks.length > 0) {\r\n break\r\n }\r\n }\r\n\r\n if (reconstructedChunks.length > 0) {\r\n reconstructedChunks.sort((left, right) => left.index - right.index)\r\n sessionData = reconstructedChunks.map((chunk) => chunk.value).join('')\r\n }\r\n }\r\n\r\n if (!sessionData) {\r\n return null\r\n }\r\n\r\n if (strategy === 'jwe') {\r\n throw createError(\r\n '`jwe` strategy is not supported by the SDK cookie helper. Use compact/jwt or pass cookie data through the auth server.',\r\n )\r\n }\r\n\r\n if (strategy === 'jwt') {\r\n const payload = await verifyJwtHS256<Record<string, unknown>>(sessionData, secret)\r\n if (!payload) {\r\n return null\r\n }\r\n const sessionRecord = asObject(payload.session)\r\n const userRecord = asObject(payload.user)\r\n const updatedAt = payload.updatedAt\r\n if (!sessionRecord || !userRecord || typeof updatedAt !== 'number') {\r\n return null\r\n }\r\n\r\n if (config?.version) {\r\n const cookieVersion = typeof payload.version === 'string' ? payload.version : '1'\r\n const expectedVersion =\r\n typeof config.version === 'string'\r\n ? config.version\r\n : await config.version(sessionRecord as SessionShape, userRecord as UserShape)\r\n if (cookieVersion !== expectedVersion) {\r\n return null\r\n }\r\n }\r\n\r\n return {\r\n session: sessionRecord as SessionShape,\r\n user: userRecord as UserShape,\r\n updatedAt,\r\n version: typeof payload.version === 'string' ? payload.version : undefined,\r\n }\r\n }\r\n\r\n const compactPayload = parseJsonSafely<{\r\n session: {\r\n session: SessionShape\r\n user: UserShape\r\n updatedAt: number\r\n version?: string\r\n }\r\n expiresAt: number\r\n signature: string\r\n }>(decodeBase64UrlToString(sessionData))\r\n\r\n if (!compactPayload) {\r\n return null\r\n }\r\n\r\n const expectedSignature = await signHmacBase64Url(\r\n secret,\r\n JSON.stringify({\r\n ...compactPayload.session,\r\n expiresAt: compactPayload.expiresAt,\r\n }),\r\n )\r\n\r\n if (expectedSignature !== compactPayload.signature) {\r\n return null\r\n }\r\n\r\n if (compactPayload.expiresAt <= Date.now()) {\r\n return null\r\n }\r\n\r\n const resolvedSession = compactPayload.session\r\n if (config?.version) {\r\n const cookieVersion = resolvedSession.version || '1'\r\n const expectedVersion =\r\n typeof config.version === 'string'\r\n ? config.version\r\n : await config.version(resolvedSession.session, resolvedSession.user)\r\n if (cookieVersion !== expectedVersion) {\r\n return null\r\n }\r\n }\r\n\r\n const sessionObject = asObject(resolvedSession.session)\r\n const userObject = asObject(resolvedSession.user)\r\n if (!sessionObject || !userObject) {\r\n return null\r\n }\r\n\r\n return {\r\n session: sessionObject as SessionShape,\r\n user: userObject as UserShape,\r\n updatedAt: resolvedSession.updatedAt,\r\n version: resolvedSession.version,\r\n }\r\n}\r\n\r\nexport {\r\n HOST_COOKIE_PREFIX,\r\n SECURE_COOKIE_PREFIX,\r\n createSessionStore,\r\n getAccountCookie,\r\n getChunkedCookie,\r\n parseCookies,\r\n parseSetCookieHeader,\r\n setCookieToHeader,\r\n setRequestCookie,\r\n splitSetCookieHeader,\r\n stripSecureCookiePrefix,\r\n toCookieOptions,\r\n}\r\n\r\nexport type {\r\n AthenaAuthCookie,\r\n AthenaAuthCookies,\r\n AthenaCookieContextRuntime,\r\n AthenaCookieOptions,\r\n AthenaCookiesOptions,\r\n AthenaGetCookieCacheConfig,\r\n}\r\n","{\n \"author\": \"floris@xylex.group\",\n \"bin\": {\n \"athena-js\": \"./bin/athena-js.js\"\n },\n \"dependencies\": {\n \"blessed\": \"^0.1.81\",\n \"chalk\": \"^4.1.2\",\n \"cron-parser\": \"^4.9.0\",\n \"pg\": \"^8.16.0\",\n \"use-sync-external-store\": \"^1.5.0\",\n \"uuid\": \"^9.0.1\",\n \"zod\": \"^4.0.1\"\n },\n \"description\": \"Athena JS SDK\",\n \"devDependencies\": {\n \"@react-email/components\": \"^1.0.12\",\n \"@react-email/render\": \"^2.0.8\",\n \"@types/blessed\": \"^0.1.25\",\n \"@types/node\": \"^20.10.5\",\n \"@types/pg\": \"^8.15.1\",\n \"@types/react\": \"^18.3.12\",\n \"@types/react-test-renderer\": \"^18.3.1\",\n \"@types/uuid\": \"^9.0.7\",\n \"@typescript-eslint/eslint-plugin\": \"^8.57.0\",\n \"@typescript-eslint/parser\": \"^8.57.0\",\n \"eslint\": \"^8.57.1\",\n \"express\": \"^4.22.2\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"react-test-renderer\": \"^18.3.1\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.3.3\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"exports\": {\n \".\": {\n \"browser\": {\n \"default\": \"./dist/browser.js\",\n \"import\": \"./dist/browser.js\",\n \"require\": \"./dist/browser.cjs\",\n \"types\": \"./dist/browser.d.ts\"\n },\n \"default\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"./browser\": {\n \"default\": \"./dist/browser.js\",\n \"import\": \"./dist/browser.js\",\n \"require\": \"./dist/browser.cjs\",\n \"types\": \"./dist/browser.d.ts\"\n },\n \"./cookies\": {\n \"default\": \"./dist/cookies.js\",\n \"import\": \"./dist/cookies.js\",\n \"require\": \"./dist/cookies.cjs\",\n \"types\": \"./dist/cookies.d.ts\"\n },\n \"./next/client\": {\n \"default\": \"./dist/next/client.js\",\n \"import\": \"./dist/next/client.js\",\n \"require\": \"./dist/next/client.cjs\",\n \"types\": \"./dist/next/client.d.ts\"\n },\n \"./next/server\": {\n \"default\": \"./dist/next/server.js\",\n \"import\": \"./dist/next/server.js\",\n \"require\": \"./dist/next/server.cjs\",\n \"types\": \"./dist/next/server.d.ts\"\n },\n \"./package.json\": \"./package.json\",\n \"./react\": {\n \"default\": \"./dist/react.js\",\n \"import\": \"./dist/react.js\",\n \"require\": \"./dist/react.cjs\",\n \"types\": \"./dist/react.d.ts\"\n },\n \"./utils\": {\n \"default\": \"./dist/utils.js\",\n \"import\": \"./dist/utils.js\",\n \"require\": \"./dist/utils.cjs\",\n \"types\": \"./dist/utils.d.ts\"\n }\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"keywords\": [\n \"database\",\n \"driver\",\n \"api-gateway\",\n \"sdk\",\n \"react\",\n \"hooks\",\n \"http\",\n \"postgres\",\n \"query-builder\"\n ],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"@xylex-group/athena\",\n \"peerDependencies\": {\n \"@react-email/components\": \">=1.0.0\",\n \"@react-email/render\": \">=2.0.0\",\n \"react\": \">=17.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@react-email/components\": {\n \"optional\": true\n },\n \"@react-email/render\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n }\n },\n \"publisher\": \"XYLEX Group\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/xylex-group/athena-js.git\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"check:all\": \"pnpm lint && pnpm typecheck && pnpm test && pnpm build\",\n \"dev\": \"tsup --watch\",\n \"docs:methods\": \"node scripts/generate-sdk-method-reference.mjs\",\n \"example:api-call\": \"cd examples/api-call && bun run start\",\n \"example:email-resend\": \"cd examples/email-resend && bun run start\",\n \"example:express-api\": \"cd examples/express-api && bun run start\",\n \"example:order-saga\": \"cd examples/order-saga && bun run start\",\n \"example:postgres-connection\": \"cd examples/postgres-connection && bun run start\",\n \"example:recurring-invoice\": \"cd examples/recurring-invoice && bun run start\",\n \"example:retry-patterns\": \"cd examples/retry-patterns && bun run start\",\n \"lint\": \"eslint \\\"src/**/*.ts\\\" \\\"test/**/*.ts\\\"\",\n \"lint:fix\": \"pnpm lint -- --fix\",\n \"prepublishOnly\": \"pnpm typecheck && pnpm build\",\n \"publish:token\": \"node scripts/publish.js\",\n \"test\": \"node --import tsx --test --test-force-exit test/*.test.ts\",\n \"test:integration:postgres\": \"node scripts/run-postgres-introspection-test.mjs\",\n \"test:watch\": \"node --import tsx --test --watch test/*.test.ts\",\n \"typecheck\": \"tsc -p tsconfig.typecheck.json\"\n },\n \"sideEffects\": false,\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"dist/index.d.ts\"\n ],\n \"browser\": [\n \"dist/browser.d.ts\"\n ],\n \"cookies\": [\n \"dist/cookies.d.ts\"\n ],\n \"next/client\": [\n \"dist/next/client.d.ts\"\n ],\n \"next/server\": [\n \"dist/next/server.d.ts\"\n ],\n \"react\": [\n \"dist/react.d.ts\"\n ],\n \"utils\": [\n \"dist/utils.d.ts\"\n ]\n }\n },\n \"version\": \"2.10.0\"\n}","import packageJson from '../package.json' with { type: 'json' }\n\nexport const PACKAGE_VERSION = packageJson.version\n\nexport function buildSdkHeaderValue(sdkName: string): string {\n return `${sdkName} ${PACKAGE_VERSION}`\n}\n","import type {\r\n AthenaGatewayBaseOptions,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayConnectionOptions,\r\n AthenaGatewayConnectionResult,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayErrorDetails,\r\n AthenaGatewayMethod,\r\n AthenaRpcCallOptions,\r\n AthenaRpcPayload,\r\n AthenaGatewayResponse,\r\n} from \"./types.js\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaInsertPayload,\r\n AthenaRpcFilter,\r\n AthenaUpdatePayload,\r\n AthenaQueryPayload,\r\n} from \"./types.js\";\r\nimport { AthenaGatewayError } from \"./errors.ts\";\r\nimport {\r\n ATHENA_DEFAULT_BASE_URL,\r\n buildAthenaGatewayUrl,\r\n normalizeAthenaGatewayBaseUrl,\r\n} from \"./url.ts\";\r\nimport { getSessionCookie } from \"../cookies/index.ts\";\r\nimport { buildSdkHeaderValue } from \"../sdk-version.ts\";\r\n\r\nconst DEFAULT_CLIENT = \"railway_direct\";\nconst SDK_NAME = \"xylex-group/athena\";\nconst SDK_HEADER_VALUE = buildSdkHeaderValue(SDK_NAME);\nconst NO_CACHE_HEADER_VALUE = 'no-cache'\n\r\nfunction parseResponseBody(rawText: string, contentType: string | null) {\r\n if (!rawText) {\r\n return { parsed: null as unknown, parseFailed: false };\r\n }\r\n\r\n const contentTypeSuggestsJson =\r\n contentType?.toLowerCase().includes(\"application/json\") ?? false;\r\n const looksJson =\r\n contentTypeSuggestsJson || rawText.startsWith(\"{\") || rawText.startsWith(\"[\");\r\n\r\n if (!looksJson) {\r\n return { parsed: rawText as unknown, parseFailed: false };\r\n }\r\n\r\n try {\r\n return { parsed: JSON.parse(rawText) as unknown, parseFailed: false };\r\n } catch {\r\n return { parsed: rawText as unknown, parseFailed: true };\r\n }\r\n}\r\n\r\nfunction normalizeHeaderValue(value?: string | null) {\n return value ? value : undefined;\n}\n\nfunction isCacheControlHeaderName(name: string) {\n return name.toLowerCase() === 'cache-control'\n}\n\r\nfunction resolveHeaderValue(\r\n headers: Record<string, string>,\r\n candidates: string[],\r\n): string | undefined {\r\n for (const candidate of candidates) {\r\n const direct = normalizeHeaderValue(headers[candidate]);\r\n if (direct) return direct;\r\n }\r\n\r\n const loweredCandidates = new Set(candidates.map(candidate => candidate.toLowerCase()));\r\n for (const [key, value] of Object.entries(headers)) {\r\n if (!loweredCandidates.has(key.toLowerCase())) {\r\n continue;\r\n }\r\n const normalized = normalizeHeaderValue(value);\r\n if (normalized) return normalized;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction resolveBearerTokenFromAuthorizationHeader(\r\n headers: Record<string, string>,\r\n): string | undefined {\r\n const authorization = resolveHeaderValue(headers, [\"Authorization\"]);\r\n if (!authorization) {\r\n return undefined;\r\n }\r\n\r\n const match = authorization.match(/^Bearer\\s+(.+)$/i);\r\n const token = match?.[1]?.trim();\r\n return token ? token : undefined;\r\n}\r\n\r\nfunction resolveSessionTokenFromCookieHeader(\r\n headers: Record<string, string>,\r\n): string | undefined {\r\n const cookie = resolveHeaderValue(headers, [\"Cookie\"]);\r\n if (!cookie) {\r\n return undefined;\r\n }\r\n\r\n return getSessionCookie(new Headers({ cookie })) ?? undefined;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nfunction nonEmptyString(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\r\n}\r\n\r\nfunction resolveStructuredErrorPayload(payload: unknown): Record<string, unknown> | null {\r\n if (!isRecord(payload)) return null;\r\n return isRecord(payload.error) ? payload.error : payload;\r\n}\r\n\r\nfunction resolveRequestId(headers: Headers): string | undefined {\r\n return (\r\n headers.get(\"x-request-id\") ??\r\n headers.get(\"x-correlation-id\") ??\r\n headers.get(\"x-athena-request-id\") ??\r\n undefined\r\n );\r\n}\r\n\r\nfunction resolveErrorMessage(payload: unknown, fallback: string) {\r\n const structuredPayload = resolveStructuredErrorPayload(payload);\r\n if (structuredPayload) {\r\n const messageCandidates = [structuredPayload.message, structuredPayload.error, structuredPayload.details];\r\n for (const candidate of messageCandidates) {\r\n const resolved = nonEmptyString(candidate);\r\n if (resolved) return resolved;\r\n }\r\n }\r\n\r\n const rawMessage = nonEmptyString(payload);\r\n if (rawMessage) return rawMessage;\r\n\r\n return fallback;\r\n}\r\n\r\nfunction resolveErrorHint(payload: unknown): string | undefined {\r\n const structuredPayload = resolveStructuredErrorPayload(payload);\r\n return structuredPayload ? nonEmptyString(structuredPayload.hint) : undefined;\r\n}\r\n\r\nfunction resolveStatusText(response: Response, payload: unknown): string | null {\r\n const rawStatusText = nonEmptyString(response.statusText);\r\n if (rawStatusText) return rawStatusText;\r\n const payloadRecord = isRecord(payload) ? payload : null;\r\n return payloadRecord ? nonEmptyString(payloadRecord.statusText) ?? null : null;\r\n}\r\n\r\nfunction detailsFromError(error: AthenaGatewayError): AthenaGatewayErrorDetails {\r\n return error.toDetails();\r\n}\r\n\r\ninterface AthenaFindManyAstPayload {\r\n table_name: string;\r\n select: Record<string, unknown>;\r\n where?: Record<string, unknown>;\r\n orderBy?: Record<string, unknown>;\r\n limit?: number;\r\n}\r\n\r\nfunction toQueryScalar(value: unknown): string {\r\n if (value === null || value === undefined) return \"null\";\r\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\r\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : \"null\";\r\n return String(value);\r\n}\r\n\r\nfunction toQueryArray(values: unknown[]): string {\r\n return `{${values.map(toQueryScalar).join(\",\")}}`;\r\n}\r\n\r\nfunction toRpcArgumentQueryValue(value: unknown): string {\r\n if (Array.isArray(value)) return toQueryArray(value);\r\n if (value && typeof value === \"object\") return JSON.stringify(value);\r\n return toQueryScalar(value);\r\n}\r\n\r\nfunction toRpcFilterQueryValue(filter: AthenaRpcFilter): string {\r\n const value = filter.value;\r\n switch (filter.operator) {\r\n case \"in\": {\r\n if (!Array.isArray(value)) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: `RPC filter \"${filter.column}\" with operator \"in\" requires an array value`,\r\n status: 0,\r\n });\r\n }\r\n return `in.${toQueryArray(value)}`;\r\n }\r\n case \"is\":\r\n return `is.${toQueryScalar(value)}`;\r\n case \"eq\":\r\n case \"neq\":\r\n case \"gt\":\r\n case \"gte\":\r\n case \"lt\":\r\n case \"lte\":\r\n case \"like\":\r\n case \"ilike\":\r\n return `${filter.operator}.${toQueryScalar(value)}`;\r\n }\r\n}\r\n\r\nfunction buildRpcGetEndpoint(payload: AthenaRpcPayload): AthenaGatewayEndpointPath {\r\n const functionName = (payload.function_name ?? payload.function).trim();\r\n if (!functionName) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: \"rpc requires a function name\",\r\n status: 0,\r\n endpoint: \"/gateway/rpc\",\r\n method: \"GET\",\r\n });\r\n }\r\n\r\n const query = new URLSearchParams();\r\n if (payload.schema) query.set(\"schema\", payload.schema);\r\n if (payload.select) query.set(\"select\", payload.select);\r\n if (payload.count) query.set(\"count\", payload.count);\r\n if (payload.head) query.set(\"head\", \"true\");\r\n if (typeof payload.limit === \"number\") query.set(\"limit\", String(payload.limit));\r\n if (typeof payload.offset === \"number\") query.set(\"offset\", String(payload.offset));\r\n if (payload.order?.column) {\r\n query.set(\r\n \"order\",\r\n payload.order.ascending === false\r\n ? `${payload.order.column}.desc`\r\n : payload.order.column,\r\n );\r\n }\r\n\r\n if (payload.args) {\r\n for (const [key, value] of Object.entries(payload.args)) {\r\n query.set(key, toRpcArgumentQueryValue(value));\r\n }\r\n }\r\n\r\n if (payload.filters?.length) {\r\n for (const filter of payload.filters) {\r\n if (payload.args && Object.prototype.hasOwnProperty.call(payload.args, filter.column)) {\r\n throw new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message: `RPC filter \"${filter.column}\" conflicts with RPC argument \"${filter.column}\" in GET mode`,\r\n status: 0,\r\n });\r\n }\r\n query.append(filter.column, toRpcFilterQueryValue(filter));\r\n }\r\n }\r\n\r\n const endpoint = `/rpc/${encodeURIComponent(functionName)}`;\r\n const queryText = query.toString();\r\n const withQuery = queryText ? `${endpoint}?${queryText}` : endpoint;\r\n return withQuery as AthenaGatewayEndpointPath;\r\n}\r\n\r\nfunction buildHeaders(\n config: AthenaGatewayBaseOptions,\n options?: AthenaGatewayCallOptions,\n): Record<string, string> {\n const mergedStripNulls = options?.stripNulls ?? true;\n const forceNoCache = Boolean(config.forceNoCache || options?.forceNoCache)\n const extraHeaders = {\n ...(config.headers ?? {}),\n ...(options?.headers ?? {}),\n };\n const headerClient =\r\n extraHeaders[\"x-athena-client\"] ?? extraHeaders[\"X-Athena-Client\"];\r\n const finalClient =\r\n options?.client ??\r\n config.client ??\r\n (typeof headerClient === \"string\" ? headerClient : undefined) ??\r\n DEFAULT_CLIENT;\r\n const finalApiKey = options?.apiKey ?? config.apiKey;\r\n const finalPublishEvent = options?.publishEvent ?? config.publishEvent;\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n \"X-Athena-Sdk\": SDK_HEADER_VALUE,\r\n };\r\n\r\n if (options?.userId ?? config.userId) {\r\n headers[\"X-User-Id\"] = options?.userId ?? config.userId ?? \"\";\r\n }\r\n\r\n if (options?.organizationId ?? config.organizationId) {\r\n headers[\"X-Organization-Id\"] =\r\n options?.organizationId ?? config.organizationId ?? \"\";\r\n }\r\n\r\n if (finalClient) {\r\n headers[\"X-Athena-Client\"] = finalClient;\r\n }\r\n\r\n const finalBackend = options?.backend ?? config.backend;\r\n if (finalBackend) {\r\n const type =\r\n typeof finalBackend === \"string\" ? finalBackend : finalBackend.type;\r\n if (type) headers[\"X-Backend-Type\"] = type;\r\n }\r\n\r\n if (typeof mergedStripNulls === \"boolean\") {\r\n headers[\"X-Strip-Nulls\"] = mergedStripNulls ? \"true\" : \"false\";\r\n }\r\n\r\n if (finalPublishEvent) {\r\n headers[\"X-Publish-Event\"] = finalPublishEvent;\r\n }\r\n\r\n if (finalApiKey) {\r\n headers[\"apikey\"] = finalApiKey;\r\n headers[\"x-api-key\"] = headers[\"x-api-key\"] ?? finalApiKey;\r\n }\r\n\r\n const explicitSessionToken = resolveHeaderValue(extraHeaders, [\r\n \"X-Athena-Auth-Session-Token\",\r\n ]);\r\n const derivedSessionToken =\r\n explicitSessionToken ?? resolveSessionTokenFromCookieHeader(extraHeaders);\r\n if (derivedSessionToken) {\r\n headers[\"X-Athena-Auth-Session-Token\"] = derivedSessionToken;\r\n }\r\n\r\n const explicitBearerToken = resolveHeaderValue(extraHeaders, [\r\n \"X-Athena-Auth-Bearer-Token\",\r\n ]);\r\n const derivedBearerToken =\r\n explicitBearerToken ?? resolveBearerTokenFromAuthorizationHeader(extraHeaders);\r\n if (derivedBearerToken) {\r\n headers[\"X-Athena-Auth-Bearer-Token\"] = derivedBearerToken;\r\n }\r\n\r\n const athenaClientKeys = [\"x-athena-client\", \"X-Athena-Client\"];\n Object.entries(extraHeaders).forEach(([key, value]) => {\n if (athenaClientKeys.includes(key)) return;\n if (forceNoCache && isCacheControlHeaderName(key)) return;\n const normalized = normalizeHeaderValue(value);\n if (normalized) {\n headers[key] = normalized;\n }\n });\n\n if (forceNoCache) {\n headers['Cache-Control'] = NO_CACHE_HEADER_VALUE\n }\n\n return headers;\n}\n\r\nfunction toInvalidUrlResponse<T>(\r\n error: unknown,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n): AthenaGatewayResponse<T> {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const gatewayError =\r\n error instanceof AthenaGatewayError\r\n ? error\r\n : new AthenaGatewayError({\r\n code: \"INVALID_URL\",\r\n message,\r\n status: 0,\r\n endpoint,\r\n method,\r\n cause: message,\r\n hint: \"Set ATHENA_URL to a full http(s) URL before running queries.\",\r\n });\r\n\r\n return {\r\n ok: false,\r\n status: 0,\r\n statusText: null,\r\n data: null,\r\n error: gatewayError.message,\r\n errorDetails: detailsFromError(\r\n new AthenaGatewayError({\r\n code: gatewayError.code,\r\n message: gatewayError.message,\r\n status: gatewayError.status,\r\n endpoint,\r\n method,\r\n requestId: gatewayError.requestId,\r\n hint: gatewayError.hint,\r\n cause: gatewayError.causeDetail,\r\n }),\r\n ),\r\n raw: null,\r\n };\r\n}\r\n\r\nfunction resolveGatewayBaseUrl(input?: string | null) {\r\n return normalizeAthenaGatewayBaseUrl(input, {\r\n defaultBaseUrl: ATHENA_DEFAULT_BASE_URL,\r\n });\r\n}\r\n\r\nfunction resolveProbePath(path?: string) {\r\n if (!path) return \"/\";\r\n if (!path.startsWith(\"/\")) {\r\n throw new AthenaGatewayError({\r\n code: \"INVALID_URL\",\r\n message: `Athena gateway probe path must start with \"/\". Received ${JSON.stringify(path)}.`,\r\n status: 0,\r\n hint: 'Use a leading slash such as \"/\" or \"/health\".',\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nfunction mergeConnectionHeaders(\r\n baseHeaders: Record<string, string>,\r\n headers?: Record<string, string>,\r\n): Record<string, string> {\r\n const merged = {\r\n ...baseHeaders,\r\n ...(headers ?? {}),\r\n };\r\n\r\n if (!merged[\"X-Athena-Sdk\"] && !merged[\"x-athena-sdk\"]) {\r\n merged[\"X-Athena-Sdk\"] = SDK_HEADER_VALUE;\r\n }\r\n\r\n return merged;\r\n}\r\n\r\nasync function performConnectionCheck(\r\n baseUrl: string,\r\n requestHeaders: Record<string, string>,\r\n options?: AthenaGatewayConnectionOptions,\r\n): Promise<AthenaGatewayConnectionResult> {\r\n const path = resolveProbePath(options?.path);\r\n const url = buildAthenaGatewayUrl(baseUrl, path);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: mergeConnectionHeaders(requestHeaders, options?.headers),\r\n signal: options?.signal,\r\n });\r\n const rawText = await response.text();\r\n const requestId = resolveRequestId(response.headers);\r\n const parsedBody = parseResponseBody(\r\n rawText ?? \"\",\r\n response.headers.get(\"content-type\"),\r\n );\r\n\r\n if (parsedBody.parseFailed) {\r\n const invalidJsonError = new AthenaGatewayError({\r\n code: \"INVALID_JSON\",\r\n message: \"Gateway probe returned malformed JSON\",\r\n status: response.status,\r\n method: \"GET\",\r\n requestId,\r\n hint: \"Verify the gateway response body is valid JSON.\",\r\n cause: rawText.slice(0, 300),\r\n });\r\n return {\r\n ok: false,\r\n reachable: true,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsedBody.parsed),\r\n baseUrl,\r\n url,\r\n error: invalidJsonError.message,\r\n errorDetails: detailsFromError(invalidJsonError),\r\n raw: parsedBody.parsed,\r\n };\r\n }\r\n\r\n const parsed = parsedBody.parsed;\r\n if (!response.ok) {\r\n const httpError = new AthenaGatewayError({\r\n code: \"HTTP_ERROR\",\r\n message: resolveErrorMessage(\r\n parsed,\r\n `Athena gateway GET ${path} failed with status ${response.status}`,\r\n ),\r\n status: response.status,\r\n method: \"GET\",\r\n requestId,\r\n hint: resolveErrorHint(parsed),\r\n });\r\n\r\n return {\r\n ok: false,\r\n reachable: true,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsed),\r\n baseUrl,\r\n url,\r\n error: httpError.message,\r\n errorDetails: detailsFromError(httpError),\r\n raw: parsed,\r\n };\r\n }\r\n\r\n return {\r\n ok: true,\r\n reachable: true,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsed),\r\n baseUrl,\r\n url,\r\n error: undefined,\r\n errorDetails: null,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message = callError instanceof Error ? callError.message : String(callError);\r\n const networkError = new AthenaGatewayError({\r\n code: \"NETWORK_ERROR\",\r\n message: `Network error while probing Athena gateway ${url}: ${message}`,\r\n method: \"GET\",\r\n cause: message,\r\n hint: \"Check gateway URL, DNS, and network reachability.\",\r\n });\r\n return {\r\n ok: false,\r\n reachable: false,\r\n status: 0,\r\n statusText: null,\r\n baseUrl,\r\n url,\r\n error: networkError.message,\r\n errorDetails: detailsFromError(networkError),\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport async function verifyAthenaGatewayUrl(\r\n baseUrl: string,\r\n options?: AthenaGatewayConnectionOptions,\r\n): Promise<AthenaGatewayConnectionResult> {\r\n const normalizedBaseUrl = normalizeAthenaGatewayBaseUrl(baseUrl);\r\n return performConnectionCheck(normalizedBaseUrl, { \"X-Athena-Sdk\": SDK_HEADER_VALUE }, options);\r\n}\r\n\r\nasync function callAthena<T>(\r\n config: AthenaGatewayBaseOptions,\r\n endpoint: AthenaGatewayEndpointPath,\r\n method: AthenaGatewayMethod,\r\n payload: unknown,\r\n options?: AthenaGatewayCallOptions,\r\n): Promise<AthenaGatewayResponse<T>> {\r\n let baseUrl: string;\r\n try {\r\n baseUrl = resolveGatewayBaseUrl(options?.baseUrl ?? config.baseUrl);\r\n } catch (error) {\r\n return toInvalidUrlResponse<T>(error, endpoint, method);\r\n }\r\n\r\n const url = buildAthenaGatewayUrl(baseUrl, endpoint);\r\n const headers = buildHeaders(config, options);\r\n\r\n try {\r\n const requestInit: RequestInit = {\r\n method,\r\n headers,\r\n };\r\n if (method !== \"GET\") {\r\n requestInit.body = JSON.stringify(payload);\r\n }\r\n\r\n const response = await fetch(url, requestInit);\r\n\r\n const rawText = await response.text();\r\n const requestId = resolveRequestId(response.headers);\r\n const parsedBody = parseResponseBody(\r\n rawText ?? \"\",\r\n response.headers.get(\"content-type\"),\r\n );\r\n\r\n if (parsedBody.parseFailed) {\r\n const invalidJsonError = new AthenaGatewayError({\r\n code: \"INVALID_JSON\",\r\n message: \"Gateway returned malformed JSON\",\r\n status: response.status,\r\n endpoint,\r\n method,\r\n requestId,\r\n hint: \"Verify the gateway response body is valid JSON.\",\r\n cause: rawText.slice(0, 300),\r\n });\r\n return {\r\n ok: false,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsedBody.parsed),\r\n data: null,\r\n error: invalidJsonError.message,\r\n errorDetails: detailsFromError(invalidJsonError),\r\n raw: parsedBody.parsed,\r\n };\r\n }\r\n\r\n const parsed = parsedBody.parsed;\r\n const parsedPayload = isRecord(parsed) ? parsed : null;\r\n\r\n if (!response.ok) {\r\n const httpError = new AthenaGatewayError({\r\n code: \"HTTP_ERROR\",\r\n message: resolveErrorMessage(\r\n parsed,\r\n `Athena gateway ${method} ${endpoint} failed with status ${response.status}`,\r\n ),\r\n status: response.status,\r\n endpoint,\r\n method,\r\n requestId,\r\n hint: resolveErrorHint(parsed),\r\n });\r\n\r\n return {\r\n ok: false,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsed),\r\n data: null,\r\n error: httpError.message,\r\n errorDetails: detailsFromError(httpError),\r\n raw: parsed,\r\n };\r\n }\r\n\r\n // Unwrap envelope: API may return { data: [...], error: null } (e.g. when cached)\r\n // vs raw array when uncached. Use inner data when present to avoid double nesting.\r\n const payloadData =\r\n parsedPayload && \"data\" in parsedPayload\r\n ? (parsedPayload.data as T)\r\n : (parsed as T);\r\n const payloadCount =\r\n parsedPayload && \"count\" in parsedPayload\r\n ? typeof parsedPayload.count === \"number\" || parsedPayload.count === null\r\n ? (parsedPayload.count as number | null)\r\n : undefined\r\n : undefined;\r\n\r\n return {\r\n ok: true,\r\n status: response.status,\r\n statusText: resolveStatusText(response, parsed),\r\n data: payloadData ?? null,\r\n count: payloadCount,\r\n error: undefined,\r\n errorDetails: null,\r\n raw: parsed,\r\n };\r\n } catch (callError) {\r\n const message = callError instanceof Error ? callError.message : String(callError);\r\n const networkError = new AthenaGatewayError({\r\n code: \"NETWORK_ERROR\",\r\n message: `Network error while calling ${method} ${endpoint}: ${message}`,\r\n endpoint,\r\n method,\r\n cause: message,\r\n hint: \"Check gateway URL, DNS, and network reachability.\",\r\n });\r\n return {\r\n ok: false,\r\n status: 0,\r\n statusText: null,\r\n data: null,\r\n error: networkError.message,\r\n errorDetails: detailsFromError(networkError),\r\n raw: null,\r\n };\r\n }\r\n}\r\n\r\nexport interface AthenaGatewayClient {\r\n baseUrl: string;\r\n buildHeaders(options?: AthenaGatewayCallOptions): Record<string, string>;\r\n verifyConnection(\r\n options?: AthenaGatewayConnectionOptions,\r\n ): Promise<AthenaGatewayConnectionResult>;\r\n fetchGateway<T>(\r\n payload: AthenaFetchPayload | AthenaFindManyAstPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n insertGateway<T>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n updateGateway<T>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n deleteGateway<T>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n rpcGateway<T>(\r\n payload: AthenaRpcPayload,\r\n options?: AthenaRpcCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n queryGateway<T>(\r\n payload: AthenaQueryPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ): Promise<AthenaGatewayResponse<T>>;\r\n}\r\n\r\nexport function createAthenaGatewayClient(\r\n config: AthenaGatewayBaseOptions = {},\r\n): AthenaGatewayClient {\r\n const normalizedBaseUrl = resolveGatewayBaseUrl(config.baseUrl);\r\n const normalizedConfig: AthenaGatewayBaseOptions = {\r\n ...config,\r\n baseUrl: normalizedBaseUrl,\r\n };\r\n\r\n return {\r\n baseUrl: normalizedBaseUrl,\r\n buildHeaders(options) {\r\n return buildHeaders(normalizedConfig, options);\r\n },\r\n verifyConnection(options) {\r\n return performConnectionCheck(\r\n normalizedBaseUrl,\r\n buildHeaders(normalizedConfig),\r\n options,\r\n );\r\n },\r\n fetchGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/fetch\", \"POST\", payload, options);\r\n },\r\n insertGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/insert\", \"PUT\", payload, options);\r\n },\r\n updateGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/update\", \"POST\", payload, options);\r\n },\r\n deleteGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/delete\", \"DELETE\", payload, options);\r\n },\r\n rpcGateway(payload, options) {\r\n if (options?.get) {\r\n const endpoint = buildRpcGetEndpoint(payload);\r\n return callAthena(normalizedConfig, endpoint, \"GET\", null, options);\r\n }\r\n return callAthena(normalizedConfig, \"/gateway/rpc\", \"POST\", payload, options);\r\n },\r\n queryGateway(payload, options) {\r\n return callAthena(normalizedConfig, \"/gateway/query\", \"POST\", payload, options);\r\n },\r\n };\r\n}\r\n","import { useCallback, useMemo, useState } from \"react\";\r\nimport type {\r\n AthenaDeletePayload,\r\n AthenaFetchPayload,\r\n AthenaGatewayCallLog,\r\n AthenaGatewayCallOptions,\r\n AthenaGatewayEndpointPath,\r\n AthenaGatewayHookConfig,\r\n AthenaGatewayHookResult,\r\n AthenaGatewayMethod,\r\n AthenaGatewayResponse,\r\n AthenaGatewayResponseLog,\r\n AthenaInsertPayload,\r\n AthenaRpcCallOptions,\r\n AthenaRpcPayload,\r\n AthenaUpdatePayload,\r\n} from \"./types.ts\";\r\nimport { createAthenaGatewayClient } from \"./client.ts\";\r\nimport { AthenaGatewayError } from \"./errors.ts\";\r\n\r\nexport function useAthenaGateway(\r\n config?: AthenaGatewayHookConfig,\r\n): AthenaGatewayHookResult {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lastRequest, setLastRequest] = useState<AthenaGatewayCallLog | null>(\r\n null,\r\n );\r\n const [lastResponse, setLastResponse] =\r\n useState<AthenaGatewayResponseLog | null>(null);\r\n\r\n const client = useMemo(\r\n () =>\r\n createAthenaGatewayClient({\r\n client: config?.client,\r\n baseUrl: config?.baseUrl,\r\n apiKey: config?.apiKey,\r\n backend: config?.backend,\r\n publishEvent: config?.publishEvent,\r\n headers: config?.headers,\r\n userId: config?.userId,\r\n organizationId: config?.organizationId,\r\n }),\r\n [\r\n config?.baseUrl,\r\n config?.client,\r\n config?.apiKey,\r\n config?.backend,\r\n config?.publishEvent,\r\n config?.headers,\r\n config?.userId,\r\n config?.organizationId,\r\n ],\r\n );\r\n\r\n const callWithLifecycle = useCallback(\r\n async <T>(\r\n fn: () => Promise<AthenaGatewayResponse<T>>,\r\n metadata: {\r\n endpoint: string;\r\n method: string;\r\n payload: unknown;\r\n options?: AthenaGatewayCallOptions;\r\n },\r\n ): Promise<AthenaGatewayResponse<T>> => {\r\n const requestLog: AthenaGatewayCallLog = {\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n payload: metadata.payload,\r\n headers: client.buildHeaders(metadata.options),\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n setLastRequest(requestLog);\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n let response: AthenaGatewayResponse<T> | undefined;\r\n try {\r\n response = await fn();\r\n setLastResponse({ ...response, timestamp: new Date().toISOString() });\r\n\r\n if (!response.ok) {\r\n const failure = AthenaGatewayError.fromResponse(response, {\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n });\r\n setError(failure.message);\r\n throw failure;\r\n }\r\n\r\n return response;\r\n } catch (callError) {\r\n const message =\r\n callError instanceof Error ? callError.message : String(callError);\r\n const typedError =\r\n callError instanceof AthenaGatewayError\r\n ? callError\r\n : new AthenaGatewayError({\r\n code: \"UNKNOWN_ERROR\",\r\n message,\r\n endpoint: metadata.endpoint as AthenaGatewayEndpointPath,\r\n method: metadata.method as AthenaGatewayMethod,\r\n cause: message,\r\n });\r\n setError(message);\r\n setLastResponse({\r\n timestamp: new Date().toISOString(),\r\n status: typedError.status || response?.status || 0,\r\n ok: false,\r\n data: null,\r\n raw: null,\r\n error: typedError.message,\r\n errorDetails: typedError.toDetails(),\r\n });\r\n throw typedError;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const defaultStripNulls = true;\r\n\r\n const fetchGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaFetchPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaFetchPayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ?? options?.stripNulls ?? defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.fetchGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/fetch\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const insertGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaInsertPayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) =>\r\n callWithLifecycle<T>(() => client.insertGateway<T>(payload, options), {\r\n endpoint: \"/gateway/insert\",\r\n method: \"PUT\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const updateGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaUpdatePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n const normalizedPayload: AthenaUpdatePayload = {\r\n ...payload,\r\n conditions: payload.conditions ?? [],\r\n strip_nulls:\r\n payload.strip_nulls ?? options?.stripNulls ?? defaultStripNulls,\r\n };\r\n return callWithLifecycle<T>(\r\n () => client.updateGateway<T>(normalizedPayload, options),\r\n {\r\n endpoint: \"/gateway/update\",\r\n method: \"POST\",\r\n payload: normalizedPayload,\r\n options,\r\n },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const deleteGateway = useCallback(\r\n <T = unknown>(\r\n payload: AthenaDeletePayload,\r\n options?: AthenaGatewayCallOptions,\r\n ) => {\r\n if (!payload.resource_id) {\r\n throw new Error(\r\n \"deleteGateway requires resource_id (the unique identifier of the record to delete)\",\r\n );\r\n }\r\n return callWithLifecycle<T>(\r\n () => client.deleteGateway<T>(payload, options),\r\n { endpoint: \"/gateway/delete\", method: \"DELETE\", payload, options },\r\n );\r\n },\r\n [callWithLifecycle, client],\r\n );\r\n\r\n const rpcGateway = useCallback(\r\n <T = unknown>(payload: AthenaRpcPayload, options?: AthenaRpcCallOptions) =>\r\n callWithLifecycle<T>(() => client.rpcGateway<T>(payload, options), {\r\n endpoint: options?.get ? `/rpc/${payload.function}` : \"/gateway/rpc\",\r\n method: options?.get ? \"GET\" : \"POST\",\r\n payload,\r\n options,\r\n }),\r\n [callWithLifecycle, client],\r\n );\r\n\r\n return {\r\n fetchGateway,\r\n insertGateway,\r\n updateGateway,\r\n deleteGateway,\r\n rpcGateway,\r\n isLoading,\r\n error,\r\n lastRequest,\r\n lastResponse,\r\n baseUrl: client.baseUrl,\r\n };\r\n}\r\n","import { isAthenaGatewayError } from '../gateway/errors.ts'\r\nimport type {\r\n AthenaQueryError,\r\n AthenaQueryResult,\r\n AthenaResponseLike,\r\n AthenaRetryCount,\r\n AthenaRetryDelay,\r\n QueryKey,\r\n} from './types.ts'\r\n\r\ntype RetryOptions = {\r\n retry?: AthenaRetryCount\r\n retryDelay?: AthenaRetryDelay\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\r\n}\r\n\r\nfunction isPrimitive(value: unknown): value is string | number | boolean | null | undefined {\r\n return value == null || ['string', 'number', 'boolean'].includes(typeof value)\r\n}\r\n\r\nfunction encodePrimitive(value: string | number | boolean | null | undefined): string {\r\n if (value === null) return 'null:0:'\r\n if (value === undefined) return 'undefined:0:'\r\n if (typeof value === 'string') return `str:${value.length}:${value}`\r\n if (typeof value === 'number') {\r\n const serialized = Number.isFinite(value) ? String(value) : 'nan'\r\n return `num:${serialized.length}:${serialized}`\r\n }\r\n const serialized = value ? '1' : '0'\r\n return `bool:${serialized.length}:${serialized}`\r\n}\r\n\r\nfunction stableSerialize(value: unknown, seen: WeakSet<object>): string {\r\n if (value === null) return 'null'\r\n if (value === undefined) return 'undefined'\r\n\r\n const valueType = typeof value\r\n if (valueType === 'string') return `\"${value}\"`\r\n if (valueType === 'number') return Number.isFinite(value as number) ? String(value) : 'null'\r\n if (valueType === 'boolean') return (value as boolean) ? 'true' : 'false'\r\n if (valueType === 'bigint') return `${String(value)}n`\r\n if (valueType === 'symbol') return `symbol:${String(value)}`\r\n if (valueType === 'function') {\r\n const namedFunction = value as { name?: string }\r\n return `function:${namedFunction.name || 'anonymous'}`\r\n }\r\n\r\n if (value instanceof Date) return `date:${value.toISOString()}`\r\n\r\n if (Array.isArray(value)) {\r\n return `[${value.map(item => stableSerialize(item, seen)).join(',')}]`\r\n }\r\n\r\n if (valueType === 'object') {\r\n const objectValue = value as Record<string, unknown>\r\n if (seen.has(objectValue)) return '[circular]'\r\n seen.add(objectValue)\r\n const keys = Object.keys(objectValue).sort()\r\n const serialized = `{${keys\r\n .map(key => `${key}:${stableSerialize(objectValue[key], seen)}`)\r\n .join(',')}}`\r\n seen.delete(objectValue)\r\n return serialized\r\n }\r\n\r\n return String(value)\r\n}\r\n\r\nexport function safeSerializeQueryKey(queryKey: QueryKey): string {\r\n try {\r\n if (typeof queryKey === 'string') {\r\n return `key:${queryKey}`\r\n }\r\n\r\n if (Array.isArray(queryKey) && queryKey.every(isPrimitive)) {\r\n return `arr:${queryKey.map(item => encodePrimitive(item)).join('|')}`\r\n }\r\n\r\n return `ser:${stableSerialize(queryKey, new WeakSet<object>())}`\r\n } catch {\r\n try {\r\n return `fallback:${String(queryKey)}`\r\n } catch {\r\n return 'fallback:[unserializable-query-key]'\r\n }\r\n }\r\n}\r\n\r\nexport function sleep(ms: number): Promise<void> {\r\n if (ms <= 0) return Promise.resolve()\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms)\r\n })\r\n}\r\n\r\nfunction resolveRetryCount(retry: AthenaRetryCount | undefined): number {\r\n if (retry === false || retry == null) return 0\r\n if (!Number.isFinite(retry)) return 0\r\n return Math.max(0, Math.trunc(retry))\r\n}\r\n\r\nfunction resolveRetryDelay(retryDelay: AthenaRetryDelay | undefined, attempt: number): number {\r\n if (typeof retryDelay === 'function') {\r\n const resolved = retryDelay(attempt)\r\n if (!Number.isFinite(resolved)) return 0\r\n return Math.max(0, resolved)\r\n }\r\n if (typeof retryDelay === 'number') {\r\n if (!Number.isFinite(retryDelay)) return 0\r\n return Math.max(0, retryDelay)\r\n }\r\n return 0\r\n}\r\n\r\nexport async function runWithRetry<T>(\r\n execute: (attempt: number) => Promise<T>,\r\n options?: RetryOptions,\r\n): Promise<T> {\r\n const retries = resolveRetryCount(options?.retry)\r\n let attempt = 0\r\n\r\n for (;;) {\r\n attempt += 1\r\n try {\r\n return await execute(attempt)\r\n } catch (error) {\r\n if (attempt > retries) {\r\n throw error\r\n }\r\n const delay = resolveRetryDelay(options?.retryDelay, attempt)\r\n await sleep(delay)\r\n }\r\n }\r\n}\r\n\r\nfunction errorMessageFromUnknown(error: unknown): string {\r\n if (typeof error === 'string' && error.trim()) return error.trim()\r\n if (error instanceof Error && error.message.trim()) return error.message.trim()\r\n if (isRecord(error)) {\r\n const messageCandidate = error.message ?? error.error\r\n if (typeof messageCandidate === 'string' && messageCandidate.trim()) {\r\n return messageCandidate.trim()\r\n }\r\n }\r\n return 'Athena request failed'\r\n}\r\n\r\nexport function normalizeAthenaError(\r\n error: unknown,\r\n source?: unknown,\r\n): AthenaQueryError {\r\n if (\r\n isRecord(error) &&\r\n typeof error.message === 'string' &&\r\n (error.status === undefined || typeof error.status === 'number') &&\r\n (error.code === undefined || typeof error.code === 'string')\r\n ) {\r\n return {\r\n message: error.message,\r\n status: typeof error.status === 'number' ? error.status : undefined,\r\n code: typeof error.code === 'string' ? error.code : undefined,\r\n details: error.details,\r\n raw: error.raw ?? source ?? error,\r\n }\r\n }\r\n\r\n if (isAthenaGatewayError(error)) {\r\n const details = error.toDetails()\r\n return {\r\n message: details.message,\r\n status: details.status,\r\n code: details.code,\r\n details,\r\n raw: source ?? error,\r\n }\r\n }\r\n\r\n if (isRecord(source) && source.errorDetails && isRecord(source.errorDetails)) {\r\n const details = source.errorDetails\r\n return {\r\n message: errorMessageFromUnknown(error ?? source.error),\r\n status: typeof source.status === 'number' ? source.status : undefined,\r\n code: typeof details.code === 'string' ? details.code : undefined,\r\n details,\r\n raw: source,\r\n }\r\n }\r\n\r\n if (isRecord(source) && typeof source.status === 'number') {\r\n return {\r\n message: errorMessageFromUnknown(error),\r\n status: source.status,\r\n details: source,\r\n raw: source,\r\n }\r\n }\r\n\r\n return {\r\n message: errorMessageFromUnknown(error),\r\n raw: source ?? error,\r\n }\r\n}\r\n\r\nexport function isAthenaResponseLike<T>(value: unknown): value is AthenaResponseLike<T> {\r\n if (!isRecord(value)) return false\r\n if ('error' in value || 'errorDetails' in value) return true\r\n if ('status' in value && typeof value.status === 'number') {\r\n return 'data' in value || 'raw' in value\r\n }\r\n return (\r\n 'data' in value &&\r\n ('raw' in value || 'status' in value)\r\n )\r\n}\r\n\r\nexport function normalizeAthenaResult<TQueryFnData, TData = TQueryFnData>(\r\n value: unknown,\r\n select?: (data: TQueryFnData) => TData,\r\n): AthenaQueryResult<TData> {\r\n if (isAthenaResponseLike<TQueryFnData>(value)) {\r\n const status = typeof value.status === 'number' ? value.status : value.error != null ? 500 : 200\r\n if (value.error != null) {\r\n return {\r\n data: undefined,\r\n error: normalizeAthenaError(value.error, value),\r\n status,\r\n raw: value.raw ?? value,\r\n }\r\n }\r\n\r\n const hasData = 'data' in value\r\n const sourceData = hasData\r\n ? (value.data as TQueryFnData | null | undefined)\r\n : undefined\r\n const selectedData =\r\n sourceData === undefined\r\n ? undefined\r\n : sourceData === null\r\n ? (null as unknown as TData)\r\n : select\r\n ? select(sourceData)\r\n : (sourceData as unknown as TData)\r\n\r\n return {\r\n data: selectedData,\r\n error: null,\r\n status,\r\n raw: value.raw ?? value,\r\n }\r\n }\r\n\r\n const sourceData = value as TQueryFnData\r\n const selectedData = select\r\n ? select(sourceData)\r\n : (sourceData as unknown as TData)\r\n\r\n return {\r\n data: selectedData,\r\n error: null,\r\n status: 200,\r\n raw: value,\r\n }\r\n}\r\n","import type {\r\n AthenaMutationDefaults,\r\n AthenaMutationEvent,\r\n AthenaMutationRequestLog,\r\n AthenaMutationResultData,\r\n AthenaMutationState,\r\n AthenaQueryClientConfig,\r\n AthenaQueryDefaults,\r\n AthenaQueryEvent,\r\n AthenaQueryRequestLog,\r\n AthenaQueryResult,\r\n AthenaQueryState,\r\n AthenaRuntimeEvent,\r\n AthenaStateAdapter,\r\n AthenaUnsubscribe,\r\n QueryKey,\r\n} from './types.ts'\r\nimport { normalizeAthenaError, normalizeAthenaResult, runWithRetry, safeSerializeQueryKey } from './utils.ts'\r\n\r\ntype ExecuteQueryInput<TQueryFnData, TData> = {\r\n queryKey: QueryKey\r\n queryKeyToken: string\r\n queryFn: () => Promise<TQueryFnData>\r\n select?: (data: TQueryFnData) => TData\r\n retry?: number | false\r\n retryDelay?: number | ((attempt: number) => number)\r\n dedupe?: boolean\r\n force?: boolean\r\n}\r\n\r\ntype ExecuteMutationInput<TVariables, TMutationFnData, TData> = {\r\n mutationKey?: QueryKey\r\n mutationKeyToken: string\r\n variables: TVariables\r\n mutationFn: (variables: TVariables) => Promise<TMutationFnData>\r\n select?: (data: TMutationFnData) => TData\r\n retry?: number | false\r\n retryDelay?: number | ((attempt: number) => number)\r\n}\r\n\r\ntype QueryEntry = {\r\n key: string\r\n state: AthenaQueryState<unknown>\r\n listeners: Set<() => void>\r\n gcTimer?: ReturnType<typeof setTimeout>\r\n activeRequestId: number\r\n}\r\n\r\ntype MutationEntry = {\r\n key: string\r\n state: AthenaMutationState<unknown, unknown>\r\n listeners: Set<() => void>\r\n gcTimer?: ReturnType<typeof setTimeout>\r\n activeRequestId: number\r\n}\r\n\r\nfunction createInitialQueryState<TData>(initialData?: TData): AthenaQueryState<TData> {\r\n return {\r\n status: initialData === undefined ? 'idle' : 'success',\r\n isFetching: false,\r\n data: initialData,\r\n error: null,\r\n updatedAt: initialData === undefined ? undefined : Date.now(),\r\n }\r\n}\r\n\r\nfunction createInitialMutationState<TVariables, TData>(): AthenaMutationState<TVariables, TData> {\r\n return {\r\n status: 'idle',\r\n data: undefined,\r\n error: null,\r\n isLoading: false,\r\n lastVariables: undefined,\r\n lastResponse: undefined,\r\n updatedAt: undefined,\r\n }\r\n}\r\n\r\nfunction shouldUseMemoryCache(config: AthenaQueryClientConfig): boolean {\r\n return config.cache?.mode === 'memory'\r\n}\r\n\r\nexport class AthenaQueryClient {\r\n private readonly queryEntries = new Map<string, QueryEntry>()\r\n private readonly mutationEntries = new Map<string, MutationEntry>()\r\n private readonly inflightQueries = new Map<string, Promise<AthenaQueryResult<unknown>>>()\r\n private readonly eventSubscribers = new Set<(event: AthenaRuntimeEvent) => void>()\r\n private readonly adapters = new Set<AthenaStateAdapter>()\r\n private requestCounter = 0\r\n\r\n readonly config: AthenaQueryClientConfig\r\n readonly defaultQueryOptions: AthenaQueryDefaults\r\n readonly defaultMutationOptions: AthenaMutationDefaults\r\n\r\n constructor(config: AthenaQueryClientConfig = {}) {\r\n this.config = {\r\n cache: {\r\n mode: config.cache?.mode ?? 'none',\r\n staleTime: config.cache?.staleTime,\r\n gcTime: config.cache?.gcTime,\r\n },\r\n defaultQueryOptions: config.defaultQueryOptions,\r\n defaultMutationOptions: config.defaultMutationOptions,\r\n }\r\n this.defaultQueryOptions = {\r\n retry: config.defaultQueryOptions?.retry ?? 0,\r\n retryDelay: config.defaultQueryOptions?.retryDelay,\r\n refetchOnMount: config.defaultQueryOptions?.refetchOnMount ?? true,\r\n refetchOnWindowFocus: config.defaultQueryOptions?.refetchOnWindowFocus ?? false,\r\n refetchOnReconnect: config.defaultQueryOptions?.refetchOnReconnect ?? false,\r\n }\r\n this.defaultMutationOptions = {\r\n retry: config.defaultMutationOptions?.retry ?? 0,\r\n retryDelay: config.defaultMutationOptions?.retryDelay,\r\n }\r\n }\r\n\r\n getQueryKeyToken(queryKey: QueryKey): string {\r\n return safeSerializeQueryKey(queryKey)\r\n }\r\n\r\n getMutationKeyToken(mutationKey?: QueryKey): string {\r\n if (mutationKey == null) {\r\n return '__mutation__default__'\r\n }\r\n return safeSerializeQueryKey(mutationKey)\r\n }\r\n\r\n getQueryState<TData = unknown>(key: string): AthenaQueryState<TData> {\r\n const entry = this.ensureQueryEntry(key)\r\n return entry.state as AthenaQueryState<TData>\r\n }\r\n\r\n getMutationState<TVariables = unknown, TData = unknown>(\r\n key: string,\r\n ): AthenaMutationState<TVariables, TData> {\r\n const entry = this.ensureMutationEntry(key)\r\n return entry.state as AthenaMutationState<TVariables, TData>\r\n }\r\n\r\n subscribeQuery(key: string, listener: () => void): AthenaUnsubscribe {\r\n const entry = this.ensureQueryEntry(key)\r\n if (entry.gcTimer) {\r\n clearTimeout(entry.gcTimer)\r\n entry.gcTimer = undefined\r\n }\r\n entry.listeners.add(listener)\r\n return () => {\r\n const current = this.queryEntries.get(key)\r\n if (!current) return\r\n current.listeners.delete(listener)\r\n if (current.listeners.size === 0) {\r\n this.scheduleQueryGc(current)\r\n }\r\n }\r\n }\r\n\r\n subscribeMutation(key: string, listener: () => void): AthenaUnsubscribe {\r\n const entry = this.ensureMutationEntry(key)\r\n if (entry.gcTimer) {\r\n clearTimeout(entry.gcTimer)\r\n entry.gcTimer = undefined\r\n }\r\n entry.listeners.add(listener)\r\n return () => {\r\n const current = this.mutationEntries.get(key)\r\n if (!current) return\r\n current.listeners.delete(listener)\r\n if (current.listeners.size === 0) {\r\n this.scheduleMutationGc(current)\r\n }\r\n }\r\n }\r\n\r\n subscribeEvents(listener: (event: AthenaRuntimeEvent) => void): AthenaUnsubscribe {\r\n this.eventSubscribers.add(listener)\r\n return () => {\r\n this.eventSubscribers.delete(listener)\r\n }\r\n }\r\n\r\n attachAdapter(adapter: AthenaStateAdapter): AthenaUnsubscribe {\r\n this.adapters.add(adapter)\r\n return () => {\r\n this.adapters.delete(adapter)\r\n }\r\n }\r\n\r\n resetQuery(queryKey: QueryKey): void {\r\n const key = this.getQueryKeyToken(queryKey)\r\n const entry = this.ensureQueryEntry(key)\r\n entry.activeRequestId = ++this.requestCounter\r\n this.setQueryState(entry, createInitialQueryState(), 'query_reset')\r\n this.inflightQueries.delete(key)\r\n }\r\n\r\n resetMutation(mutationKey?: QueryKey): void {\r\n const key = this.getMutationKeyToken(mutationKey)\r\n const entry = this.ensureMutationEntry(key)\r\n entry.activeRequestId = ++this.requestCounter\r\n this.setMutationState(entry, createInitialMutationState(), 'mutation_reset')\r\n }\r\n\r\n async executeQuery<TQueryFnData, TData = TQueryFnData>(\r\n input: ExecuteQueryInput<TQueryFnData, TData>,\r\n ): Promise<AthenaQueryResult<TData>> {\r\n const entry = this.ensureQueryEntry(input.queryKeyToken)\r\n\r\n if (input.dedupe !== false) {\r\n const existing = this.inflightQueries.get(input.queryKeyToken)\r\n if (existing) {\r\n return existing as Promise<AthenaQueryResult<TData>>\r\n }\r\n }\r\n\r\n if (!input.force && shouldUseMemoryCache(this.config)) {\r\n const staleTime = this.config.cache?.staleTime ?? 0\r\n const hasFreshData =\r\n entry.state.status === 'success' &&\r\n entry.state.data !== undefined &&\r\n entry.state.updatedAt !== undefined &&\r\n Date.now() - entry.state.updatedAt <= staleTime\r\n if (hasFreshData) {\r\n return {\r\n data: entry.state.data as TData,\r\n error: null,\r\n status: 200,\r\n raw: entry.state.lastResponse ?? entry.state.data,\r\n __applied: true,\r\n } as AthenaQueryResult<TData>\r\n }\r\n }\r\n\r\n const requestId = ++this.requestCounter\r\n entry.activeRequestId = requestId\r\n\r\n const startRequestLog: AthenaQueryRequestLog = {\r\n requestId,\r\n queryKey: input.queryKey,\r\n queryKeyToken: input.queryKeyToken,\r\n attempt: 1,\r\n startedAt: Date.now(),\r\n }\r\n\r\n const loadingStatus = entry.state.data === undefined ? 'loading' : entry.state.status\r\n this.setQueryState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: loadingStatus,\r\n isFetching: true,\r\n error: null,\r\n lastRequest: startRequestLog,\r\n },\r\n 'query_updated',\r\n )\r\n\r\n const executionPromise = runWithRetry(\r\n async attempt => {\r\n const attemptRequestLog: AthenaQueryRequestLog = {\r\n ...startRequestLog,\r\n attempt,\r\n }\r\n\r\n if (entry.activeRequestId === requestId) {\r\n this.setQueryState(\r\n entry,\r\n {\r\n ...entry.state,\r\n lastRequest: attemptRequestLog,\r\n isFetching: true,\r\n },\r\n 'query_updated',\r\n )\r\n }\r\n\r\n const rawResult = await input.queryFn()\r\n const normalized = normalizeAthenaResult<TQueryFnData, TData>(rawResult, input.select)\r\n\r\n if (normalized.error) {\r\n throw {\r\n __athenaNormalizedError: normalized.error,\r\n __athenaStatus: normalized.status,\r\n __athenaRaw: normalized.raw,\r\n __athenaResponse: rawResult,\r\n }\r\n }\r\n\r\n return {\r\n normalized,\r\n response: rawResult,\r\n attempt,\r\n }\r\n },\r\n {\r\n retry: input.retry,\r\n retryDelay: input.retryDelay,\r\n },\r\n )\r\n .then(result => {\r\n const applied = entry.activeRequestId === requestId\r\n if (applied) {\r\n const finishedAt = Date.now()\r\n const doneRequestLog: AthenaQueryRequestLog = {\r\n ...startRequestLog,\r\n attempt: result.attempt,\r\n endedAt: finishedAt,\r\n }\r\n this.setQueryState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'success',\r\n isFetching: false,\r\n error: null,\r\n data: result.normalized.data,\r\n lastRequest: doneRequestLog,\r\n lastResponse: result.response,\r\n updatedAt: finishedAt,\r\n },\r\n 'query_updated',\r\n )\r\n }\r\n\r\n return {\r\n ...result.normalized,\r\n __applied: applied,\r\n } as AthenaQueryResult<TData>\r\n })\r\n .catch(error => {\r\n const wrapped =\r\n typeof error === 'object' && error !== null ? (error as Record<string, unknown>) : undefined\r\n\r\n const normalizedError = wrapped?.__athenaNormalizedError\r\n ? (wrapped.__athenaNormalizedError as ReturnType<typeof normalizeAthenaError>)\r\n : normalizeAthenaError(error)\r\n\r\n const status =\r\n typeof wrapped?.__athenaStatus === 'number'\r\n ? (wrapped.__athenaStatus as number)\r\n : normalizedError.status ?? 500\r\n\r\n const raw = wrapped?.__athenaRaw ?? normalizedError.raw ?? null\r\n const response = wrapped?.__athenaResponse ?? raw\r\n\r\n const applied = entry.activeRequestId === requestId\r\n if (applied) {\r\n const finishedAt = Date.now()\r\n const doneRequestLog: AthenaQueryRequestLog = {\r\n ...startRequestLog,\r\n endedAt: finishedAt,\r\n attempt:\r\n entry.state.lastRequest?.requestId === requestId\r\n ? entry.state.lastRequest.attempt\r\n : startRequestLog.attempt,\r\n }\r\n this.setQueryState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'error',\r\n isFetching: false,\r\n error: normalizedError,\r\n lastRequest: doneRequestLog,\r\n lastResponse: response,\r\n updatedAt: finishedAt,\r\n },\r\n 'query_updated',\r\n )\r\n }\r\n\r\n return {\r\n data: undefined,\r\n error: normalizedError,\r\n status,\r\n raw,\r\n __applied: applied,\r\n } as AthenaQueryResult<TData>\r\n })\r\n .finally(() => {\r\n const inflight = this.inflightQueries.get(input.queryKeyToken)\r\n if (inflight === executionPromise) {\r\n this.inflightQueries.delete(input.queryKeyToken)\r\n }\r\n })\r\n\r\n this.inflightQueries.set(input.queryKeyToken, executionPromise as Promise<AthenaQueryResult<unknown>>)\r\n\r\n return executionPromise\r\n }\r\n\r\n async executeMutation<TVariables, TMutationFnData, TData = TMutationFnData>(\r\n input: ExecuteMutationInput<TVariables, TMutationFnData, TData>,\r\n ): Promise<AthenaMutationResultData<TData>> {\r\n const entry = this.ensureMutationEntry(input.mutationKeyToken)\r\n const requestId = ++this.requestCounter\r\n entry.activeRequestId = requestId\r\n\r\n const startRequestLog: AthenaMutationRequestLog<TVariables> = {\r\n requestId,\r\n mutationKey: input.mutationKey,\r\n mutationKeyToken: input.mutationKeyToken,\r\n attempt: 1,\r\n startedAt: Date.now(),\r\n variables: input.variables,\r\n }\r\n\r\n this.setMutationState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'loading',\r\n isLoading: true,\r\n error: null,\r\n lastVariables: input.variables,\r\n lastRequest: startRequestLog,\r\n },\r\n 'mutation_updated',\r\n )\r\n\r\n try {\r\n const result = await runWithRetry(\r\n async attempt => {\r\n const attemptRequestLog: AthenaMutationRequestLog<TVariables> = {\r\n ...startRequestLog,\r\n attempt,\r\n }\r\n\r\n if (entry.activeRequestId === requestId) {\r\n this.setMutationState(\r\n entry,\r\n {\r\n ...entry.state,\r\n lastRequest: attemptRequestLog,\r\n isLoading: true,\r\n },\r\n 'mutation_updated',\r\n )\r\n }\r\n\r\n const rawResult = await input.mutationFn(input.variables)\r\n const normalized = normalizeAthenaResult<TMutationFnData, TData>(rawResult, input.select)\r\n if (normalized.error) {\r\n throw {\r\n __athenaNormalizedError: normalized.error,\r\n __athenaStatus: normalized.status,\r\n __athenaRaw: normalized.raw,\r\n __athenaResponse: rawResult,\r\n }\r\n }\r\n\r\n return {\r\n normalized,\r\n response: rawResult,\r\n attempt,\r\n }\r\n },\r\n {\r\n retry: input.retry,\r\n retryDelay: input.retryDelay,\r\n },\r\n )\r\n\r\n if (entry.activeRequestId === requestId) {\r\n const finishedAt = Date.now()\r\n const doneRequestLog: AthenaMutationRequestLog<TVariables> = {\r\n ...startRequestLog,\r\n attempt: result.attempt,\r\n endedAt: finishedAt,\r\n }\r\n this.setMutationState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'success',\r\n isLoading: false,\r\n data: result.normalized.data,\r\n error: null,\r\n lastVariables: input.variables,\r\n lastRequest: doneRequestLog,\r\n lastResponse: result.response,\r\n updatedAt: finishedAt,\r\n },\r\n 'mutation_updated',\r\n )\r\n }\r\n\r\n return result.normalized\r\n } catch (error) {\r\n const wrapped =\r\n typeof error === 'object' && error !== null ? (error as Record<string, unknown>) : undefined\r\n const normalizedError = wrapped?.__athenaNormalizedError\r\n ? (wrapped.__athenaNormalizedError as ReturnType<typeof normalizeAthenaError>)\r\n : normalizeAthenaError(error)\r\n\r\n const status =\r\n typeof wrapped?.__athenaStatus === 'number'\r\n ? (wrapped.__athenaStatus as number)\r\n : normalizedError.status ?? 500\r\n const raw = wrapped?.__athenaRaw ?? normalizedError.raw ?? null\r\n const response = wrapped?.__athenaResponse ?? raw\r\n\r\n if (entry.activeRequestId === requestId) {\r\n const finishedAt = Date.now()\r\n const doneRequestLog: AthenaMutationRequestLog<TVariables> = {\r\n ...startRequestLog,\r\n endedAt: finishedAt,\r\n attempt:\r\n entry.state.lastRequest?.requestId === requestId\r\n ? entry.state.lastRequest.attempt\r\n : startRequestLog.attempt,\r\n }\r\n\r\n this.setMutationState(\r\n entry,\r\n {\r\n ...entry.state,\r\n status: 'error',\r\n isLoading: false,\r\n error: normalizedError,\r\n lastVariables: input.variables,\r\n lastRequest: doneRequestLog,\r\n lastResponse: response,\r\n updatedAt: finishedAt,\r\n },\r\n 'mutation_updated',\r\n )\r\n }\r\n\r\n return {\r\n data: undefined,\r\n error: normalizedError,\r\n status,\r\n raw,\r\n }\r\n }\r\n }\r\n\r\n private ensureQueryEntry(key: string): QueryEntry {\r\n let entry = this.queryEntries.get(key)\r\n if (entry) return entry\r\n\r\n entry = {\r\n key,\r\n state: createInitialQueryState(),\r\n listeners: new Set(),\r\n activeRequestId: 0,\r\n }\r\n this.queryEntries.set(key, entry)\r\n return entry\r\n }\r\n\r\n private ensureMutationEntry(key: string): MutationEntry {\r\n let entry = this.mutationEntries.get(key)\r\n if (entry) return entry\r\n\r\n entry = {\r\n key,\r\n state: createInitialMutationState(),\r\n listeners: new Set(),\r\n activeRequestId: 0,\r\n }\r\n this.mutationEntries.set(key, entry)\r\n return entry\r\n }\r\n\r\n private scheduleQueryGc(entry: QueryEntry): void {\r\n const gcTime = shouldUseMemoryCache(this.config)\r\n ? Math.max(0, this.config.cache?.gcTime ?? 300_000)\r\n : Math.max(0, this.config.cache?.gcTime ?? 0)\r\n\r\n entry.gcTimer = setTimeout(() => {\r\n const current = this.queryEntries.get(entry.key)\r\n if (!current || current.listeners.size > 0) return\r\n this.queryEntries.delete(entry.key)\r\n this.inflightQueries.delete(entry.key)\r\n this.emitEvent({\r\n type: 'query_gc',\r\n key: entry.key,\r\n state: current.state,\r\n timestamp: Date.now(),\r\n })\r\n }, gcTime)\r\n }\r\n\r\n private scheduleMutationGc(entry: MutationEntry): void {\r\n const gcTime = shouldUseMemoryCache(this.config)\r\n ? Math.max(0, this.config.cache?.gcTime ?? 300_000)\r\n : Math.max(0, this.config.cache?.gcTime ?? 0)\r\n\r\n entry.gcTimer = setTimeout(() => {\r\n const current = this.mutationEntries.get(entry.key)\r\n if (!current || current.listeners.size > 0) return\r\n this.mutationEntries.delete(entry.key)\r\n }, gcTime)\r\n }\r\n\r\n private setQueryState(\r\n entry: QueryEntry,\r\n state: AthenaQueryState<unknown>,\r\n eventType: AthenaQueryEvent['type'],\r\n ): void {\r\n entry.state = state\r\n for (const listener of entry.listeners) {\r\n listener()\r\n }\r\n\r\n this.emitEvent({\r\n type: eventType,\r\n key: entry.key,\r\n state,\r\n timestamp: Date.now(),\r\n })\r\n }\r\n\r\n private setMutationState(\r\n entry: MutationEntry,\r\n state: AthenaMutationState<unknown, unknown>,\r\n eventType: AthenaMutationEvent['type'],\r\n ): void {\r\n entry.state = state\r\n for (const listener of entry.listeners) {\r\n listener()\r\n }\r\n\r\n this.emitEvent({\r\n type: eventType,\r\n key: entry.key,\r\n state,\r\n timestamp: Date.now(),\r\n })\r\n }\r\n\r\n private emitEvent(event: AthenaRuntimeEvent): void {\r\n for (const listener of this.eventSubscribers) {\r\n listener(event)\r\n }\r\n\r\n for (const adapter of this.adapters) {\r\n adapter.onEvent?.(event)\r\n if (event.type === 'query_updated' || event.type === 'query_reset' || event.type === 'query_gc') {\r\n adapter.onQueryUpdated?.(event)\r\n }\r\n if (event.type === 'mutation_updated' || event.type === 'mutation_reset') {\r\n adapter.onMutationUpdated?.(event)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function createAthenaQueryClient(config?: AthenaQueryClientConfig): AthenaQueryClient {\r\n return new AthenaQueryClient(config)\r\n}\r\n\r\nexport function attachStateAdapter(\r\n client: AthenaQueryClient,\r\n adapter: AthenaStateAdapter,\r\n): AthenaUnsubscribe {\r\n return client.attachAdapter(adapter)\r\n}\r\n","import { createContext, createElement, useContext, useMemo, type ReactNode } from 'react'\r\nimport type { AthenaQueryClientConfig } from './types.ts'\r\nimport { AthenaQueryClient, createAthenaQueryClient } from './query-client.ts'\r\n\r\nconst AthenaQueryClientContext = createContext<AthenaQueryClient | null>(null)\r\n\r\nexport interface AthenaQueryClientProviderProps {\r\n client?: AthenaQueryClient\r\n config?: AthenaQueryClientConfig\r\n children: ReactNode\r\n}\r\n\r\nexport function AthenaQueryClientProvider(props: AthenaQueryClientProviderProps) {\r\n const memoizedClient = useMemo(() => {\r\n if (props.client) {\r\n return props.client\r\n }\r\n return createAthenaQueryClient(props.config)\r\n }, [props.client, props.config])\r\n\r\n return createElement(\r\n AthenaQueryClientContext.Provider,\r\n { value: memoizedClient },\r\n props.children,\r\n )\r\n}\r\n\r\nexport function useAthenaQueryClient(): AthenaQueryClient {\r\n const client = useContext(AthenaQueryClientContext)\r\n if (!client) {\r\n throw new Error(\r\n 'No AthenaQueryClient found. Wrap your component tree with AthenaQueryClientProvider.',\r\n )\r\n }\r\n return client\r\n}\r\n\r\nexport { AthenaQueryClientContext }\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n} from 'react'\r\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\r\nimport type {\r\n AthenaQueryResult,\r\n AthenaQueryState,\r\n UseQueryOptions,\r\n UseQueryResult,\r\n} from './types.ts'\r\nimport { useAthenaQueryClient } from './provider.ts'\r\n\r\ntype BrowserEventName = 'focus' | 'online'\r\n\r\ntype BrowserTarget = {\r\n addEventListener: (event: BrowserEventName, listener: () => void) => void\r\n removeEventListener: (event: BrowserEventName, listener: () => void) => void\r\n}\r\n\r\nfunction getBrowserTarget(): BrowserTarget | null {\r\n const maybeGlobal = globalThis as unknown as {\r\n addEventListener?: unknown\r\n removeEventListener?: unknown\r\n window?: unknown\r\n }\r\n\r\n const hasListeners = (value: unknown): value is BrowserTarget =>\r\n Boolean(value) &&\r\n typeof value === 'object' &&\r\n typeof (value as BrowserTarget).addEventListener === 'function' &&\r\n typeof (value as BrowserTarget).removeEventListener === 'function'\r\n\r\n if (hasListeners(maybeGlobal.window)) {\r\n return maybeGlobal.window\r\n }\r\n\r\n if (hasListeners(maybeGlobal)) {\r\n return maybeGlobal\r\n }\r\n\r\n return null\r\n}\r\n\r\nexport function useQuery<TQueryFnData, TData = TQueryFnData>(\r\n options: UseQueryOptions<TQueryFnData, TData>,\r\n): UseQueryResult<TData> {\r\n const client = useAthenaQueryClient()\r\n\r\n const queryKeyRef = useRef(options.queryKey)\r\n queryKeyRef.current = options.queryKey\r\n\r\n const queryFnRef = useRef(options.queryFn)\r\n queryFnRef.current = options.queryFn\r\n\r\n const selectRef = useRef(options.select)\r\n selectRef.current = options.select\r\n\r\n const onSuccessRef = useRef(options.onSuccess)\r\n onSuccessRef.current = options.onSuccess\r\n\r\n const onErrorRef = useRef(options.onError)\r\n onErrorRef.current = options.onError\r\n\r\n const onSettledRef = useRef(options.onSettled)\r\n onSettledRef.current = options.onSettled\r\n\r\n const enabledRef = useRef(options.enabled ?? true)\r\n enabledRef.current = options.enabled ?? true\r\n\r\n const retryRef = useRef(options.retry)\r\n retryRef.current = options.retry\r\n\r\n const retryDelayRef = useRef(options.retryDelay)\r\n retryDelayRef.current = options.retryDelay\r\n\r\n const initialDataRef = useRef(options.initialData)\r\n initialDataRef.current = options.initialData\r\n\r\n const refetchOnMountRef = useRef(options.refetchOnMount)\r\n refetchOnMountRef.current = options.refetchOnMount\r\n\r\n const refetchOnWindowFocusRef = useRef(options.refetchOnWindowFocus)\r\n refetchOnWindowFocusRef.current = options.refetchOnWindowFocus\r\n\r\n const refetchOnReconnectRef = useRef(options.refetchOnReconnect)\r\n refetchOnReconnectRef.current = options.refetchOnReconnect\r\n\r\n const queryKeyToken = useMemo(\r\n () => client.getQueryKeyToken(options.queryKey),\r\n [client, options.queryKey],\r\n )\r\n const activeQueryKeyTokenRef = useRef(queryKeyToken)\r\n activeQueryKeyTokenRef.current = queryKeyToken\r\n\r\n const subscribe = useCallback(\r\n (listener: () => void) => client.subscribeQuery(queryKeyToken, listener),\r\n [client, queryKeyToken],\r\n )\r\n\r\n const getSnapshot = useCallback(\r\n () => client.getQueryState<TData>(queryKeyToken),\r\n [client, queryKeyToken],\r\n )\r\n\r\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\r\n\r\n const effectiveSnapshot = useMemo<AthenaQueryState<TData>>(() => {\r\n if (\r\n snapshot.status === 'idle' &&\r\n snapshot.data === undefined &&\r\n initialDataRef.current !== undefined\r\n ) {\r\n return {\r\n ...snapshot,\r\n status: 'success',\r\n data: initialDataRef.current,\r\n error: null,\r\n }\r\n }\r\n return snapshot\r\n }, [snapshot])\r\n\r\n const runQuery = useCallback(\r\n async (force = false): Promise<AthenaQueryResult<TData>> => {\r\n const result = await client.executeQuery<TQueryFnData, TData>({\r\n queryKey: queryKeyRef.current,\r\n queryKeyToken,\r\n queryFn: () => queryFnRef.current(),\r\n select: selectRef.current,\r\n retry:\r\n retryRef.current ??\r\n client.defaultQueryOptions.retry ??\r\n 0,\r\n retryDelay:\r\n retryDelayRef.current ??\r\n client.defaultQueryOptions.retryDelay,\r\n dedupe: true,\r\n force,\r\n })\r\n\r\n const internalResult = result as AthenaQueryResult<TData> & {\r\n __applied?: boolean\r\n }\r\n if (activeQueryKeyTokenRef.current !== queryKeyToken || internalResult.__applied === false) {\r\n return result\r\n }\r\n\r\n if (result.error) {\r\n onErrorRef.current?.(result.error)\r\n onSettledRef.current?.(result.data, result.error)\r\n return result\r\n }\r\n\r\n onSuccessRef.current?.(result.data as TData)\r\n onSettledRef.current?.(result.data, null)\r\n return result\r\n },\r\n [client, queryKeyToken],\r\n )\r\n\r\n const lastAutoKeyRef = useRef<string | null>(null)\r\n\r\n useEffect(() => {\r\n const refetchOnMount =\r\n refetchOnMountRef.current ?? client.defaultQueryOptions.refetchOnMount ?? true\r\n\r\n const isFirstRenderForKey = lastAutoKeyRef.current !== queryKeyToken\r\n lastAutoKeyRef.current = queryKeyToken\r\n\r\n if (!enabledRef.current) {\r\n return\r\n }\r\n\r\n const state = client.getQueryState(queryKeyToken)\r\n const shouldFetch = state.status === 'idle' || (isFirstRenderForKey && refetchOnMount)\r\n\r\n if (shouldFetch) {\r\n void runQuery(false)\r\n }\r\n }, [client, queryKeyToken, runQuery])\r\n\r\n useEffect(() => {\r\n const browser = getBrowserTarget()\r\n if (!browser || !enabledRef.current) {\r\n return undefined\r\n }\r\n\r\n const refetchOnWindowFocus =\r\n refetchOnWindowFocusRef.current ??\r\n client.defaultQueryOptions.refetchOnWindowFocus ??\r\n false\r\n\r\n if (!refetchOnWindowFocus) {\r\n return undefined\r\n }\r\n\r\n const onFocus = () => {\r\n if (!enabledRef.current) return\r\n void runQuery(true)\r\n }\r\n\r\n browser.addEventListener('focus', onFocus)\r\n return () => {\r\n browser.removeEventListener('focus', onFocus)\r\n }\r\n }, [client, runQuery])\r\n\r\n useEffect(() => {\r\n const browser = getBrowserTarget()\r\n if (!browser || !enabledRef.current) {\r\n return undefined\r\n }\r\n\r\n const refetchOnReconnect =\r\n refetchOnReconnectRef.current ??\r\n client.defaultQueryOptions.refetchOnReconnect ??\r\n false\r\n\r\n if (!refetchOnReconnect) {\r\n return undefined\r\n }\r\n\r\n const onReconnect = () => {\r\n if (!enabledRef.current) return\r\n void runQuery(true)\r\n }\r\n\r\n browser.addEventListener('online', onReconnect)\r\n return () => {\r\n browser.removeEventListener('online', onReconnect)\r\n }\r\n }, [client, runQuery])\r\n\r\n const refetch = useCallback(() => runQuery(true), [runQuery])\r\n\r\n const reset = useCallback(() => {\r\n client.resetQuery(queryKeyRef.current)\r\n }, [client])\r\n\r\n return {\r\n data: effectiveSnapshot.data,\r\n error: effectiveSnapshot.error,\r\n isLoading:\r\n effectiveSnapshot.status === 'loading' && effectiveSnapshot.data === undefined,\r\n isFetching: effectiveSnapshot.isFetching,\r\n isSuccess: effectiveSnapshot.status === 'success',\r\n isError: effectiveSnapshot.status === 'error',\r\n status: effectiveSnapshot.status,\r\n refetch,\r\n reset,\r\n lastResponse: effectiveSnapshot.lastResponse,\r\n lastRequest: effectiveSnapshot.lastRequest,\r\n }\r\n}\r\n","import { useCallback, useMemo, useRef } from 'react'\r\nimport { useSyncExternalStore } from 'use-sync-external-store/shim'\r\nimport type {\r\n UseMutationOptions,\r\n UseMutationResult,\r\n} from './types.ts'\r\nimport { useAthenaQueryClient } from './provider.ts'\r\n\r\nexport function useMutation<TVariables, TMutationFnData, TData = TMutationFnData>(\r\n options: UseMutationOptions<TVariables, TMutationFnData, TData>,\r\n): UseMutationResult<TVariables, TData> {\r\n const client = useAthenaQueryClient()\r\n\r\n const mutationKeyRef = useRef(options.mutationKey)\r\n mutationKeyRef.current = options.mutationKey\r\n\r\n const mutationFnRef = useRef(options.mutationFn)\r\n mutationFnRef.current = options.mutationFn\r\n\r\n const selectRef = useRef(options.select)\r\n selectRef.current = options.select\r\n\r\n const retryRef = useRef(options.retry)\r\n retryRef.current = options.retry\r\n\r\n const retryDelayRef = useRef(options.retryDelay)\r\n retryDelayRef.current = options.retryDelay\r\n\r\n const onMutateRef = useRef(options.onMutate)\r\n onMutateRef.current = options.onMutate\r\n\r\n const onSuccessRef = useRef(options.onSuccess)\r\n onSuccessRef.current = options.onSuccess\r\n\r\n const onErrorRef = useRef(options.onError)\r\n onErrorRef.current = options.onError\r\n\r\n const onSettledRef = useRef(options.onSettled)\r\n onSettledRef.current = options.onSettled\r\n\r\n const mutationKeyToken = useMemo(\r\n () => client.getMutationKeyToken(options.mutationKey),\r\n [client, options.mutationKey],\r\n )\r\n\r\n const subscribe = useCallback(\r\n (listener: () => void) => client.subscribeMutation(mutationKeyToken, listener),\r\n [client, mutationKeyToken],\r\n )\r\n\r\n const getSnapshot = useCallback(\r\n () => client.getMutationState<TVariables, TData>(mutationKeyToken),\r\n [client, mutationKeyToken],\r\n )\r\n\r\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\r\n\r\n const mutateAsync = useCallback(\r\n async (variables: TVariables): Promise<TData> => {\r\n await onMutateRef.current?.(variables)\r\n\r\n const result = await client.executeMutation<TVariables, TMutationFnData, TData>({\r\n mutationKey: mutationKeyRef.current,\r\n mutationKeyToken,\r\n variables,\r\n mutationFn: currentVariables => mutationFnRef.current(currentVariables),\r\n select: selectRef.current,\r\n retry:\r\n retryRef.current ??\r\n client.defaultMutationOptions.retry ??\r\n 0,\r\n retryDelay:\r\n retryDelayRef.current ??\r\n client.defaultMutationOptions.retryDelay,\r\n })\r\n\r\n if (result.error) {\r\n onErrorRef.current?.(result.error, variables)\r\n onSettledRef.current?.(result.data, result.error, variables)\r\n throw result.error\r\n }\r\n\r\n const data = result.data as TData\r\n onSuccessRef.current?.(data, variables)\r\n onSettledRef.current?.(data, null, variables)\r\n return data\r\n },\r\n [client, mutationKeyToken],\r\n )\r\n\r\n const mutate = useCallback(\r\n (variables: TVariables) => {\r\n void mutateAsync(variables).catch(() => undefined)\r\n },\r\n [mutateAsync],\r\n )\r\n\r\n const reset = useCallback(() => {\r\n client.resetMutation(mutationKeyRef.current)\r\n }, [client])\r\n\r\n return {\r\n mutate,\r\n mutateAsync,\r\n data: snapshot.data,\r\n error: snapshot.error,\r\n isIdle: snapshot.status === 'idle',\r\n isLoading: snapshot.status === 'loading',\r\n isSuccess: snapshot.status === 'success',\r\n isError: snapshot.status === 'error',\r\n status: snapshot.status,\r\n reset,\r\n lastResponse: snapshot.lastResponse,\r\n lastVariables: snapshot.lastVariables,\r\n lastRequest: snapshot.lastRequest,\r\n }\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type {\n AthenaAuthCallOptions,\n AthenaAuthErrorCode,\n AthenaAuthErrorDetails,\n AthenaAuthFetchCompatibleInput,\n AthenaAuthResult,\n AthenaAuthSessionResponse,\n} from '../auth/types.ts'\n\nexport interface UseSessionOptions {\n enabled?: boolean\n refetchOnMount?: boolean\n fetchInput?: AthenaAuthFetchCompatibleInput\n callOptions?: AthenaAuthCallOptions\n}\n\nexport interface UseSessionResult<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> {\n data: TSessionData | null\n error: AthenaAuthErrorDetails | null\n isPending: boolean\n isRefetching: boolean\n refetch: () => Promise<TSessionData | null>\n}\n\ntype SessionGetter<TSessionData extends AthenaAuthSessionResponse> = (\n input?: AthenaAuthFetchCompatibleInput,\n options?: AthenaAuthCallOptions,\n) => Promise<AthenaAuthResult<TSessionData>>\n\ntype UseSessionAuthClient<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> =\n | { getSession: SessionGetter<TSessionData> }\n | { auth: { getSession: SessionGetter<TSessionData> } }\n\ntype InferSessionData<TClient> =\n TClient extends { getSession: (...args: unknown[]) => Promise<AthenaAuthResult<infer TSessionData>> }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : TClient extends {\n auth: { getSession: (...args: unknown[]) => Promise<AthenaAuthResult<infer TSessionData>> }\n }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : AthenaAuthSessionResponse\n\nfunction resolveGetSession<TSessionData extends AthenaAuthSessionResponse>(\n authClient: UseSessionAuthClient<TSessionData>,\n): SessionGetter<TSessionData> {\n if ('getSession' in authClient && typeof authClient.getSession === 'function') {\n return authClient.getSession\n }\n\n if (\n 'auth' in authClient &&\n authClient.auth &&\n typeof authClient.auth.getSession === 'function'\n ) {\n return authClient.auth.getSession\n }\n\n throw new Error('useSession requires an auth-capable client (createClient(...).auth or createAuthClient(...))')\n}\n\n/**\n * Better Auth style session hook parity for Athena auth clients.\n */\nexport function useSession<TClient extends UseSessionAuthClient>(\n authClient: TClient,\n options: UseSessionOptions = {},\n): UseSessionResult<InferSessionData<TClient>> {\n type SessionData = InferSessionData<TClient>\n const enabled = options.enabled ?? true\n const refetchOnMount = options.refetchOnMount ?? true\n\n const [data, setData] = useState<SessionData | null>(null)\n const [error, setError] = useState<AthenaAuthErrorDetails | null>(null)\n const [isPending, setIsPending] = useState<boolean>(enabled)\n const [isRefetching, setIsRefetching] = useState<boolean>(false)\n const requestIdRef = useRef(0)\n const mountedRef = useRef(true)\n const dataRef = useRef<SessionData | null>(null)\n const getSession = resolveGetSession<SessionData>(\n authClient as UseSessionAuthClient<SessionData>,\n )\n\n useEffect(() => {\n dataRef.current = data\n }, [data])\n\n const toFallbackErrorDetails = (\n code: AthenaAuthErrorCode,\n message: string,\n status: number,\n ): AthenaAuthErrorDetails => ({\n code,\n message,\n status,\n })\n\n const runFetch = useCallback(async () => {\n const requestId = ++requestIdRef.current\n const hasData = dataRef.current !== null\n\n if (hasData) {\n setIsRefetching(true)\n } else {\n setIsPending(true)\n }\n\n try {\n const result = await getSession(options.fetchInput, options.callOptions)\n if (!mountedRef.current || requestId !== requestIdRef.current) {\n return null\n }\n\n if (result.ok) {\n setData((result.data ?? null) as SessionData | null)\n setError(null)\n return (result.data ?? null) as SessionData | null\n }\n\n setError(\n result.errorDetails ??\n toFallbackErrorDetails(\n 'UNKNOWN_ERROR',\n result.error ?? 'Failed to fetch session',\n result.status,\n ),\n )\n return null\n } catch (requestError) {\n if (!mountedRef.current || requestId !== requestIdRef.current) {\n return null\n }\n\n const message =\n requestError instanceof Error ? requestError.message : 'Failed to fetch session'\n setError(toFallbackErrorDetails('NETWORK_ERROR', message, 0))\n return null\n } finally {\n if (mountedRef.current && requestId === requestIdRef.current) {\n setIsPending(false)\n setIsRefetching(false)\n }\n }\n }, [getSession, options.callOptions, options.fetchInput])\n\n useEffect(() => {\n mountedRef.current = true\n if (enabled && refetchOnMount) {\n void runFetch()\n } else {\n setIsPending(false)\n }\n return () => {\n mountedRef.current = false\n }\n }, [enabled, refetchOnMount, runFetch])\n\n const refetch = useCallback(async () => {\n return await runFetch()\n }, [runFetch])\n\n return {\n data,\n error,\n isPending,\n isRefetching,\n refetch,\n }\n}\n","import { useMemo } from 'react'\nimport type {\n AthenaAuthErrorDetails,\n AthenaAuthFetchCompatibleInput,\n AthenaAuthResult,\n AthenaAuthSessionResponse,\n AthenaAuthCallOptions,\n} from '../auth/types.ts'\nimport type {\n AthenaClientSessionLike,\n AthenaClientSessionOptions,\n} from '../client.ts'\nimport {\n useSession,\n type UseSessionOptions,\n type UseSessionResult,\n} from './use-session.ts'\n\ntype SessionGetter<TSessionData extends AthenaAuthSessionResponse> = (\n input?: AthenaAuthFetchCompatibleInput,\n options?: AthenaAuthCallOptions,\n) => Promise<AthenaAuthResult<TSessionData>>\n\ntype AthenaSessionScopedClient<\n TSessionData extends AthenaAuthSessionResponse = AthenaAuthSessionResponse,\n> = {\n auth: {\n getSession: SessionGetter<TSessionData>\n }\n withSession(\n session?: AthenaClientSessionLike | null,\n options?: AthenaClientSessionOptions,\n ): unknown\n}\n\ntype InferSessionData<TClient> =\n TClient extends {\n auth: {\n getSession: (\n ...args: unknown[]\n ) => Promise<AthenaAuthResult<infer TSessionData>>\n }\n }\n ? TSessionData extends AthenaAuthSessionResponse\n ? TSessionData\n : AthenaAuthSessionResponse\n : AthenaAuthSessionResponse\n\ntype InferScopedClient<TClient> = TClient extends {\n withSession(\n session?: AthenaClientSessionLike | null,\n options?: AthenaClientSessionOptions,\n ): infer TScopedClient\n}\n ? TScopedClient\n : TClient\n\nexport type UseAthenaSessionClientOptions = UseSessionOptions\n\nexport interface UseAthenaSessionClientResult<\n TClient,\n> {\n client: InferScopedClient<TClient>\n session: UseSessionResult<InferSessionData<TClient>>['data']\n userId: string | null\n organizationId: string | null\n error: AthenaAuthErrorDetails | null\n isPending: boolean\n isRefetching: boolean\n refetch: UseSessionResult<InferSessionData<TClient>>['refetch']\n}\n\nexport function useAthenaSessionClient<\n TClient extends AthenaSessionScopedClient,\n>(\n baseClient: TClient,\n options: UseAthenaSessionClientOptions = {},\n): UseAthenaSessionClientResult<TClient> {\n const sessionState = useSession(baseClient, options)\n const scopedClient = useMemo(\n () =>\n (sessionState.data\n ? baseClient.withSession(sessionState.data)\n : baseClient) as InferScopedClient<TClient>,\n [baseClient, sessionState.data],\n )\n const session =\n sessionState.data as UseAthenaSessionClientResult<TClient>['session']\n const refetch =\n sessionState.refetch as UseAthenaSessionClientResult<TClient>['refetch']\n\n return {\n client: scopedClient,\n session,\n userId: sessionState.data?.user.id ?? null,\n organizationId:\n sessionState.data?.session.activeOrganizationId ?? null,\n error: sessionState.error,\n isPending: sessionState.isPending,\n isRefetching: sessionState.isRefetching,\n refetch,\n } as UseAthenaSessionClientResult<TClient>\n}\n","import * as React from 'react'\nimport type { AthenaStorageCallOptions, AthenaStorageModule } from '../storage/module.ts'\nimport type {\n AthenaStorageFileUploadInput,\n AthenaStorageFileUploadResult,\n AthenaStorageUploadProgress,\n AthenaStorageUploadProgressHandler,\n AthenaStorageUploadSource,\n} from '../storage/file.ts'\n\nexport type UseStorageUploadInput =\n | AthenaStorageFileUploadInput\n | AthenaStorageUploadSource\n | readonly AthenaStorageUploadSource[]\n | ArrayLike<AthenaStorageUploadSource>\n\nexport interface UseStorageUploadOptions extends Omit<Partial<AthenaStorageFileUploadInput>, 'files' | 'onProgress'> {\n storage: Pick<AthenaStorageModule, 'file'>\n onProgress?: AthenaStorageUploadProgressHandler\n}\n\nexport interface UseStorageUploadResult {\n uploading: boolean\n progress: AthenaStorageUploadProgress | null\n percent: number\n error: unknown\n result: AthenaStorageFileUploadResult | null\n upload(\n input: UseStorageUploadInput,\n options?: AthenaStorageCallOptions,\n ): Promise<AthenaStorageFileUploadResult>\n abort(): void\n reset(): void\n}\n\nexport function useStorageUpload(options: UseStorageUploadOptions): UseStorageUploadResult {\n const {\n storage,\n onProgress,\n ...defaults\n } = options\n const [uploading, setUploading] = React.useState(false)\n const [progress, setProgress] = React.useState<AthenaStorageUploadProgress | null>(null)\n const [error, setError] = React.useState<unknown>(null)\n const [result, setResult] = React.useState<AthenaStorageFileUploadResult | null>(null)\n const controllerRef = React.useRef<AbortController | null>(null)\n\n const reset = React.useCallback(() => {\n setUploading(false)\n setProgress(null)\n setError(null)\n setResult(null)\n }, [])\n\n const abort = React.useCallback(() => {\n controllerRef.current?.abort()\n controllerRef.current = null\n }, [])\n\n const upload = React.useCallback(async (\n input: UseStorageUploadInput,\n callOptions?: AthenaStorageCallOptions,\n ) => {\n const controller = callOptions?.signal ? null : new AbortController()\n controllerRef.current = controller\n setUploading(true)\n setError(null)\n setResult(null)\n\n const request = normalizeHookUploadInput(defaults, input, progressEvent => {\n setProgress(progressEvent)\n onProgress?.(progressEvent)\n if (isStorageUploadInput(input)) {\n input.onProgress?.(progressEvent)\n }\n })\n\n try {\n const uploaded = await storage.file.upload(request, {\n ...callOptions,\n signal: callOptions?.signal ?? controller?.signal,\n })\n setResult(uploaded)\n return uploaded\n } catch (uploadError) {\n setError(uploadError)\n throw uploadError\n } finally {\n setUploading(false)\n if (controllerRef.current === controller) {\n controllerRef.current = null\n }\n }\n }, [defaults, onProgress, storage])\n\n return {\n uploading,\n progress,\n percent: progress?.aggregatePercent ?? 0,\n error,\n result,\n upload,\n abort,\n reset,\n }\n}\n\nfunction normalizeHookUploadInput(\n defaults: Omit<Partial<AthenaStorageFileUploadInput>, 'files' | 'onProgress'>,\n input: UseStorageUploadInput,\n onProgress: AthenaStorageUploadProgressHandler,\n): AthenaStorageFileUploadInput {\n if (isStorageUploadInput(input)) {\n return {\n ...defaults,\n ...input,\n onProgress,\n } as AthenaStorageFileUploadInput\n }\n return {\n ...defaults,\n files: input,\n onProgress,\n } as AthenaStorageFileUploadInput\n}\n\nfunction isStorageUploadInput(input: UseStorageUploadInput): input is AthenaStorageFileUploadInput {\n return Boolean(input)\n && typeof input === 'object'\n && 'files' in input\n && 's3_id' in input\n}\n","import type { AnyModelDef, InsertOf, RowOf, UpdateOf } from './types.ts'\r\n\r\ntype ModelValueRecord = Record<string, unknown>\r\n\r\nexport type ModelFormNullishMode = 'empty-string' | 'undefined' | 'null'\r\n\r\ntype NullishValueByMode = {\r\n 'empty-string': ''\r\n undefined: undefined\r\n null: null\r\n}\r\n\r\ntype MapNullableToFormValue<TField, TMode extends ModelFormNullishMode> =\r\n null extends TField\r\n ? Exclude<TField, null> | NullishValueByMode[TMode]\r\n : TField\r\n\r\n/**\r\n * Form value shape derived from a model insert payload.\r\n * Nullable fields are remapped to the selected nullish representation.\r\n */\r\nexport type ModelFormValues<\r\n TModel extends AnyModelDef,\r\n TMode extends ModelFormNullishMode = 'empty-string',\r\n> = {\r\n [K in keyof InsertOf<TModel>]: MapNullableToFormValue<InsertOf<TModel>[K], TMode>\r\n}\r\n\r\n/**\r\n * Alias for deriving form value types from any model contract.\r\n */\r\nexport type FormValuesOf<\r\n TModel extends AnyModelDef,\r\n TMode extends ModelFormNullishMode = 'empty-string',\r\n> = ModelFormValues<TModel, TMode>\r\n\r\n/**\r\n * Default value shape for form initialization.\r\n */\r\nexport type ModelFormDefaults<\r\n TModel extends AnyModelDef,\r\n TMode extends ModelFormNullishMode = 'empty-string',\r\n> = Partial<ModelFormValues<TModel, TMode>>\r\n\r\nexport interface ToModelFormDefaultsOptions<TMode extends ModelFormNullishMode = 'empty-string'> {\r\n /**\r\n * Controls how nullable model values are represented in form defaults.\r\n * - `empty-string` (default): `null -> \"\"`\r\n * - `undefined`: `null -> undefined`\r\n * - `null`: keeps `null`\r\n */\r\n nullishMode?: TMode\r\n}\r\n\r\nexport interface ToModelPayloadOptions {\r\n /**\r\n * Converts `\"\"` into `null` for nullable model fields.\r\n * Defaults to `true`.\r\n */\r\n emptyStringAsNull?: boolean\r\n /**\r\n * Omits `undefined` keys from the outgoing payload.\r\n * Defaults to `true`.\r\n */\r\n stripUndefined?: boolean\r\n}\r\n\r\nfunction resolveNullishValue(mode: ModelFormNullishMode): '' | undefined | null {\r\n if (mode === 'undefined') return undefined\r\n if (mode === 'null') return null\r\n return ''\r\n}\r\n\r\nfunction isRecord(value: unknown): value is ModelValueRecord {\r\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\r\n}\r\n\r\nfunction isNullableColumn(model: AnyModelDef, key: string): boolean {\r\n const nullable = model.meta.nullable as Partial<Record<string, boolean>> | undefined\r\n return nullable?.[key] === true\r\n}\r\n\r\n/**\r\n * Normalizes model data into form-safe defaults using model nullability metadata.\r\n */\r\nexport function toModelFormDefaults<\r\n TModel extends AnyModelDef,\r\n TMode extends ModelFormNullishMode = 'empty-string',\r\n>(\r\n model: TModel,\r\n values?: Partial<RowOf<TModel>> | Partial<InsertOf<TModel>> | null,\r\n options?: ToModelFormDefaultsOptions<TMode>,\r\n): ModelFormDefaults<TModel, TMode> {\r\n const source = values as ModelValueRecord | null | undefined\r\n if (!isRecord(source)) {\r\n return {} as ModelFormDefaults<TModel, TMode>\r\n }\r\n\r\n const mode = options?.nullishMode ?? ('empty-string' as TMode)\r\n const nullishValue = resolveNullishValue(mode)\r\n const result: ModelValueRecord = {}\r\n\r\n for (const [key, value] of Object.entries(source)) {\r\n if (value === null && isNullableColumn(model, key)) {\r\n result[key] = nullishValue\r\n continue\r\n }\r\n result[key] = value\r\n }\r\n\r\n return result as ModelFormDefaults<TModel, TMode>\r\n}\r\n\r\n/**\r\n * Normalizes form values back into model-compatible insert/update payloads.\r\n */\r\nexport function toModelPayload<TModel extends AnyModelDef>(\r\n model: TModel,\r\n formValues: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\r\n options?: ToModelPayloadOptions,\r\n): Partial<InsertOf<TModel>> {\r\n const emptyStringAsNull = options?.emptyStringAsNull ?? true\r\n const stripUndefined = options?.stripUndefined ?? true\r\n const result: ModelValueRecord = {}\r\n\r\n for (const [key, rawValue] of Object.entries(formValues as ModelValueRecord)) {\r\n if (rawValue === undefined && stripUndefined) {\r\n continue\r\n }\r\n\r\n if (emptyStringAsNull && rawValue === '' && isNullableColumn(model, key)) {\r\n result[key] = null\r\n continue\r\n }\r\n\r\n result[key] = rawValue\r\n }\r\n\r\n return result as Partial<InsertOf<TModel>>\r\n}\r\n\r\n/**\r\n * Runtime form adapter bound to a model contract.\r\n */\r\nexport interface ModelFormAdapter<TModel extends AnyModelDef> {\r\n model: TModel\r\n toDefaults<TMode extends ModelFormNullishMode = 'empty-string'>(\r\n values?: Partial<RowOf<TModel>> | Partial<InsertOf<TModel>> | null,\r\n options?: ToModelFormDefaultsOptions<TMode>,\r\n ): ModelFormDefaults<TModel, TMode>\r\n toInsert(\r\n values: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\r\n options?: ToModelPayloadOptions,\r\n ): Partial<InsertOf<TModel>>\r\n toUpdate(\r\n values: Partial<ModelFormValues<TModel, 'empty-string' | 'undefined' | 'null'>>,\r\n options?: ToModelPayloadOptions,\r\n ): Partial<UpdateOf<TModel>>\r\n}\r\n\r\n/**\r\n * Creates a small model-aware adapter for form defaults and payload normalization.\r\n */\r\nexport function createModelFormAdapter<TModel extends AnyModelDef>(model: TModel): ModelFormAdapter<TModel> {\r\n return {\r\n model,\r\n toDefaults(values, options) {\r\n return toModelFormDefaults(model, values, options)\r\n },\r\n toInsert(values, options) {\r\n return toModelPayload(model, values, options) as Partial<InsertOf<TModel>>\r\n },\r\n toUpdate(values, options) {\r\n return toModelPayload(model, values, options) as Partial<UpdateOf<TModel>>\r\n },\r\n }\r\n}\r\n"]}
|