@calimero-network/mero-js 2.0.0-beta.1 → 2.0.1
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 +358 -341
- package/dist/admin-api/admin-client.d.ts +90 -0
- package/dist/admin-api/admin-client.d.ts.map +1 -0
- package/dist/admin-api/admin-client.js +302 -0
- package/dist/admin-api/admin-client.js.map +1 -0
- package/dist/admin-api/admin-factory.d.ts +8 -0
- package/dist/admin-api/admin-factory.d.ts.map +1 -0
- package/dist/admin-api/admin-factory.js +42 -0
- package/dist/admin-api/admin-factory.js.map +1 -0
- package/dist/admin-api/admin-types.d.ts +497 -0
- package/dist/admin-api/admin-types.d.ts.map +1 -0
- package/dist/admin-api/admin-types.js +4 -0
- package/dist/admin-api/admin-types.js.map +1 -0
- package/dist/admin-api/index.d.ts +4 -0
- package/dist/admin-api/index.d.ts.map +1 -0
- package/dist/admin-api/index.js +5 -0
- package/dist/admin-api/index.js.map +1 -0
- package/dist/auth/index.d.ts +26 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +51 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth-api/auth-client.d.ts +34 -0
- package/dist/auth-api/auth-client.d.ts.map +1 -0
- package/dist/auth-api/auth-client.js +112 -0
- package/dist/auth-api/auth-client.js.map +1 -0
- package/dist/auth-api/auth-factory.d.ts +8 -0
- package/dist/auth-api/auth-factory.d.ts.map +1 -0
- package/dist/auth-api/auth-factory.js +42 -0
- package/dist/auth-api/auth-factory.js.map +1 -0
- package/dist/auth-api/auth-types.d.ts +127 -0
- package/dist/auth-api/auth-types.d.ts.map +1 -0
- package/dist/auth-api/auth-types.js +3 -0
- package/dist/auth-api/auth-types.js.map +1 -0
- package/dist/auth-api/index.d.ts +4 -0
- package/dist/auth-api/index.d.ts.map +1 -0
- package/dist/auth-api/index.js +5 -0
- package/dist/auth-api/index.js.map +1 -0
- package/dist/cloud/cloud-client.d.ts +20 -0
- package/dist/cloud/cloud-client.d.ts.map +1 -0
- package/dist/cloud/cloud-client.js +26 -0
- package/dist/cloud/cloud-client.js.map +1 -0
- package/dist/cloud/index.d.ts +3 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +2 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/sse.d.ts +41 -0
- package/dist/events/sse.d.ts.map +1 -0
- package/dist/events/sse.js +237 -0
- package/dist/events/sse.js.map +1 -0
- package/dist/events/ws.d.ts +42 -0
- package/dist/events/ws.d.ts.map +1 -0
- package/dist/events/ws.js +178 -0
- package/dist/events/ws.js.map +1 -0
- package/dist/http-client/api-response.d.ts +16 -0
- package/dist/http-client/api-response.d.ts.map +1 -0
- package/dist/http-client/api-response.js +2 -0
- package/dist/http-client/api-response.js.map +1 -0
- package/dist/http-client/index.d.ts +1 -1
- package/dist/http-client/index.d.ts.map +1 -1
- package/dist/http-client/index.js +1 -2
- package/dist/http-client/index.js.map +1 -1
- package/dist/http-client/web-client.d.ts +3 -3
- package/dist/http-client/web-client.d.ts.map +1 -1
- package/dist/http-client/web-client.js +6 -18
- package/dist/http-client/web-client.js.map +1 -1
- package/dist/index.browser.mjs +2 -1
- package/dist/index.browser.mjs.map +4 -4
- package/dist/index.cjs +1033 -1415
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1032 -1420
- package/dist/index.mjs.map +4 -4
- package/dist/mero-js.d.ts +44 -189
- package/dist/mero-js.d.ts.map +1 -1
- package/dist/mero-js.js +139 -314
- package/dist/mero-js.js.map +1 -1
- package/dist/rpc/index.d.ts +22 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/rpc/index.js +38 -0
- package/dist/rpc/index.js.map +1 -0
- package/dist/token-store/index.d.ts +20 -0
- package/dist/token-store/index.d.ts.map +1 -0
- package/dist/token-store/index.js +62 -0
- package/dist/token-store/index.js.map +1 -0
- package/package.json +7 -42
- package/dist/api/admin/aliases.d.ts +0 -54
- package/dist/api/admin/aliases.d.ts.map +0 -1
- package/dist/api/admin/aliases.js +0 -43
- package/dist/api/admin/aliases.js.map +0 -1
- package/dist/api/admin/applications.d.ts +0 -52
- package/dist/api/admin/applications.d.ts.map +0 -1
- package/dist/api/admin/applications.js +0 -31
- package/dist/api/admin/applications.js.map +0 -1
- package/dist/api/admin/blobs.d.ts +0 -24
- package/dist/api/admin/blobs.d.ts.map +0 -1
- package/dist/api/admin/blobs.js +0 -58
- package/dist/api/admin/blobs.js.map +0 -1
- package/dist/api/admin/capabilities.d.ts +0 -26
- package/dist/api/admin/capabilities.d.ts.map +0 -1
- package/dist/api/admin/capabilities.js +0 -13
- package/dist/api/admin/capabilities.js.map +0 -1
- package/dist/api/admin/client.d.ts +0 -63
- package/dist/api/admin/client.d.ts.map +0 -1
- package/dist/api/admin/client.js +0 -103
- package/dist/api/admin/client.js.map +0 -1
- package/dist/api/admin/contexts.d.ts +0 -110
- package/dist/api/admin/contexts.d.ts.map +0 -1
- package/dist/api/admin/contexts.js +0 -61
- package/dist/api/admin/contexts.js.map +0 -1
- package/dist/api/admin/factory.d.ts +0 -4
- package/dist/api/admin/factory.d.ts.map +0 -1
- package/dist/api/admin/factory.js +0 -5
- package/dist/api/admin/factory.js.map +0 -1
- package/dist/api/admin/identity.d.ts +0 -10
- package/dist/api/admin/identity.d.ts.map +0 -1
- package/dist/api/admin/identity.js +0 -10
- package/dist/api/admin/identity.js.map +0 -1
- package/dist/api/admin/index.d.ts +0 -23
- package/dist/api/admin/index.d.ts.map +0 -1
- package/dist/api/admin/index.js +0 -26
- package/dist/api/admin/index.js.map +0 -1
- package/dist/api/admin/network.d.ts +0 -10
- package/dist/api/admin/network.d.ts.map +0 -1
- package/dist/api/admin/network.js +0 -9
- package/dist/api/admin/network.js.map +0 -1
- package/dist/api/admin/proposals.d.ts +0 -49
- package/dist/api/admin/proposals.d.ts.map +0 -1
- package/dist/api/admin/proposals.js +0 -34
- package/dist/api/admin/proposals.js.map +0 -1
- package/dist/api/admin/public.d.ts +0 -15
- package/dist/api/admin/public.d.ts.map +0 -1
- package/dist/api/admin/public.js +0 -18
- package/dist/api/admin/public.js.map +0 -1
- package/dist/api/admin/tee.d.ts +0 -74
- package/dist/api/admin/tee.d.ts.map +0 -1
- package/dist/api/admin/tee.js +0 -16
- package/dist/api/admin/tee.js.map +0 -1
- package/dist/api/auth/client.d.ts +0 -55
- package/dist/api/auth/client.d.ts.map +0 -1
- package/dist/api/auth/client.js +0 -127
- package/dist/api/auth/client.js.map +0 -1
- package/dist/api/auth/factory.d.ts +0 -4
- package/dist/api/auth/factory.d.ts.map +0 -1
- package/dist/api/auth/factory.js +0 -5
- package/dist/api/auth/factory.js.map +0 -1
- package/dist/api/auth/index.d.ts +0 -4
- package/dist/api/auth/index.d.ts.map +0 -1
- package/dist/api/auth/index.js +0 -4
- package/dist/api/auth/index.js.map +0 -1
- package/dist/api/auth/types.d.ts +0 -94
- package/dist/api/auth/types.d.ts.map +0 -1
- package/dist/api/auth/types.js +0 -4
- package/dist/api/auth/types.js.map +0 -1
- package/dist/api/index.d.ts +0 -15
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -18
- package/dist/api/index.js.map +0 -1
- package/dist/api/rpc/client.d.ts +0 -76
- package/dist/api/rpc/client.d.ts.map +0 -1
- package/dist/api/rpc/client.js +0 -126
- package/dist/api/rpc/client.js.map +0 -1
- package/dist/api/rpc/index.d.ts +0 -3
- package/dist/api/rpc/index.d.ts.map +0 -1
- package/dist/api/rpc/index.js +0 -2
- package/dist/api/rpc/index.js.map +0 -1
- package/dist/api/rpc/types.d.ts +0 -74
- package/dist/api/rpc/types.d.ts.map +0 -1
- package/dist/api/rpc/types.js +0 -6
- package/dist/api/rpc/types.js.map +0 -1
- package/dist/api/sse/client.d.ts +0 -76
- package/dist/api/sse/client.d.ts.map +0 -1
- package/dist/api/sse/client.js +0 -203
- package/dist/api/sse/client.js.map +0 -1
- package/dist/api/sse/index.d.ts +0 -4
- package/dist/api/sse/index.d.ts.map +0 -1
- package/dist/api/sse/index.js +0 -2
- package/dist/api/sse/index.js.map +0 -1
- package/dist/api/sse/types.d.ts +0 -35
- package/dist/api/sse/types.d.ts.map +0 -1
- package/dist/api/sse/types.js +0 -6
- package/dist/api/sse/types.js.map +0 -1
- package/dist/api/utils.d.ts +0 -68
- package/dist/api/utils.d.ts.map +0 -1
- package/dist/api/utils.js +0 -83
- package/dist/api/utils.js.map +0 -1
- package/dist/api/ws/client.d.ts +0 -72
- package/dist/api/ws/client.d.ts.map +0 -1
- package/dist/api/ws/client.js +0 -202
- package/dist/api/ws/client.js.map +0 -1
- package/dist/api/ws/index.d.ts +0 -4
- package/dist/api/ws/index.d.ts.map +0 -1
- package/dist/api/ws/index.js +0 -2
- package/dist/api/ws/index.js.map +0 -1
- package/dist/api/ws/types.d.ts +0 -32
- package/dist/api/ws/types.d.ts.map +0 -1
- package/dist/api/ws/types.js +0 -6
- package/dist/api/ws/types.js.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/http-client/signal-utils.ts", "../src/http-client/web-client.ts", "../src/http-client/http-factory.ts", "../src/http-client/retry.ts", "../src/
|
|
4
|
-
"sourcesContent": ["// Utility for combining multiple AbortSignals\nexport function combineSignals(\n signals: Array<AbortSignal | undefined>,\n): AbortSignal | undefined {\n const list = signals.filter(Boolean) as AbortSignal[];\n if (list.length === 0) return undefined;\n\n // Prefer native any(), but fall back if unavailable or it throws\n const AbortSignalAny = AbortSignal as {\n any?: (signals: AbortSignal[]) => AbortSignal;\n };\n if (typeof AbortSignalAny.any === 'function') {\n try {\n return AbortSignalAny.any(list);\n } catch {\n // Fall through to manual implementation\n }\n }\n\n const controller = new AbortController();\n const onAbort = (evt: Event) => {\n controller.abort((evt.target as AbortSignal).reason);\n for (const s of list) s.removeEventListener('abort', onAbort);\n };\n\n for (const s of list) {\n if (s.aborted) return AbortSignal.abort(s.reason);\n s.addEventListener('abort', onAbort, { once: true });\n }\n\n return controller.signal;\n}\n\n// Helper to create a timeout signal\nexport function createTimeoutSignal(timeoutMs: number): AbortSignal {\n // Use AbortSignal.timeout if available (Node 18.17+, modern browsers)\n if (typeof AbortSignal.timeout === 'function') {\n return AbortSignal.timeout(timeoutMs);\n }\n\n // Fallback for older environments\n const controller = new AbortController();\n setTimeout(() => {\n controller.abort(new DOMException('Timeout', 'TimeoutError'));\n }, timeoutMs);\n\n return controller.signal;\n}\n", "// ErrorResponse import removed as it's not used\nimport {\n HttpClient,\n Transport,\n RequestOptions,\n ResponseParser,\n} from './http-types';\nimport { combineSignals, createTimeoutSignal } from './signal-utils';\n\n// Custom error class for HTTP errors\nexport class HTTPError extends Error {\n override readonly name = 'HTTPError' as const;\n\n constructor(\n public status: number,\n public statusText: string,\n public url: string,\n public headers: Headers,\n public bodyText?: string, // cap at ~64KB\n ) {\n super(`HTTP ${status} ${statusText}`);\n }\n\n toJSON(): {\n status: number;\n statusText: string;\n url: string;\n headers: Record<string, string>;\n bodyText?: string;\n } {\n return {\n status: this.status,\n statusText: this.statusText,\n url: this.url,\n headers: headersToRecord(this.headers),\n bodyText: this.bodyText,\n };\n }\n}\n\n// Helper function to convert Headers to Record\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const record: Record<string, string> = {};\n headers.forEach((value, key) => {\n record[key] = value;\n });\n return record;\n}\n\n// Web Standards HTTP client implementation\nexport class WebHttpClient implements HttpClient {\n // Cache for concurrent refresh token calls to prevent race conditions\n private refreshTokenPromise: Promise<string> | null = null;\n // Cache for concurrent onTokenRefresh calls to prevent duplicate callbacks\n private onTokenRefreshPromise: Promise<void> | null = null;\n \n constructor(private transport: Transport) {}\n\n async get<T>(path: string, init?: RequestOptions): Promise<T> {\n return this.request<T>(path, { ...init, method: 'GET' });\n }\n\n async post<T>(\n path: string,\n body?: unknown,\n init?: RequestOptions,\n ): Promise<T> {\n const jsonBody = body ? JSON.stringify(body) : undefined;\n // Debug: Log the exact request body for /refresh endpoint\n if (path.includes('/refresh')) {\n console.log('[HTTP POST /refresh] Body being sent:', jsonBody);\n console.log('[HTTP POST /refresh] Body type:', typeof body, body ? Object.keys(body as object) : 'undefined');\n }\n return this.request<T>(path, {\n ...init,\n method: 'POST',\n body: jsonBody,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n\n async put<T>(\n path: string,\n body?: unknown,\n init?: RequestOptions,\n ): Promise<T> {\n return this.request<T>(path, {\n ...init,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n\n async delete<T>(path: string, init?: RequestOptions): Promise<T> {\n return this.request<T>(path, { ...init, method: 'DELETE' });\n }\n\n async patch<T>(\n path: string,\n body?: unknown,\n init?: RequestOptions,\n ): Promise<T> {\n return this.request<T>(path, {\n ...init,\n method: 'PATCH',\n body: body ? JSON.stringify(body) : undefined,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n\n async head(\n path: string,\n init?: RequestOptions,\n ): Promise<{ headers: Record<string, string>; status: number }> {\n const response = await this.makeRequest<Response>(path, {\n ...init,\n method: 'HEAD',\n parse: 'response',\n });\n return {\n headers: headersToRecord(response.headers),\n status: response.status,\n };\n }\n\n async request<T>(path: string, init?: RequestOptions): Promise<T> {\n return this.makeRequest<T>(path, init);\n }\n\n private async makeRequest<T>(\n path: string,\n init?: RequestOptions,\n retryCount = 0,\n requestStartTime?: number,\n ): Promise<T> {\n // Maximum retry attempts to prevent infinite loops\n const MAX_RETRY_ATTEMPTS = 1;\n const url = this.buildUrl(path);\n \n // Track request start time for timeout calculation (only on first attempt)\n // Use per-request start time to avoid corruption from concurrent requests\n const startTime = requestStartTime ?? Date.now();\n // Note: Tauri proxy script now handles AbortSignal, so we can use full RequestInit\n // Removed Tauri-specific minimal path - proxy script handles AbortSignal properly\n const signal = this.createAbortSignal(init);\n const headers = await this.buildHeaders(init?.headers);\n let headersObj: Record<string, string>;\n if (headers instanceof Headers) {\n headersObj = {};\n headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n } else {\n headersObj = headers;\n }\n \n const requestInit: RequestInit = {\n method: init?.method || 'GET',\n headers: headersObj,\n };\n \n // Check if body is a stream (ReadableStream) that can't be reused\n // Note: Blob is reusable, so it's not included here\n const isStreamBody = init?.body instanceof ReadableStream ||\n (typeof init?.body === 'object' && init?.body !== null && 'getReader' in init.body && !(init.body instanceof Blob));\n \n if (init?.body !== undefined && !isStreamBody) {\n requestInit.body = init.body;\n } else if (init?.body !== undefined && isStreamBody && retryCount === 0) {\n // Only include stream body on first attempt - can't retry with streams\n requestInit.body = init.body;\n }\n \n // For retries, calculate remaining timeout to prevent timeout reset\n // Track elapsed time and use remaining timeout for retry\n // Note: This is calculated before the request, so it doesn't include token refresh time\n // The actual remaining timeout check happens after token refresh completes\n let retrySignal: AbortSignal | undefined;\n if (retryCount > 0 && requestStartTime !== undefined) {\n const timeoutMs = init?.timeoutMs || this.transport.timeoutMs;\n if (timeoutMs) {\n // Calculate elapsed time (will be recalculated after token refresh if needed)\n const elapsed = Date.now() - startTime;\n const remaining = Math.max(0, timeoutMs - elapsed);\n // Create signal with remaining timeout, preserving user's signal\n retrySignal = this.createAbortSignal({ ...init, timeoutMs: remaining });\n } else {\n // No timeout, just preserve user's signal\n retrySignal = this.createAbortSignal(init);\n }\n } else {\n retrySignal = signal;\n }\n \n if (retrySignal) {\n requestInit.signal = retrySignal;\n }\n \n if (this.transport.credentials !== undefined) {\n requestInit.credentials = this.transport.credentials;\n }\n \n if (init?.mode !== undefined) {\n requestInit.mode = init.mode;\n }\n if (init?.cache !== undefined) {\n requestInit.cache = init.cache;\n }\n if (init?.redirect !== undefined) {\n requestInit.redirect = init.redirect;\n }\n if (init?.referrer !== undefined) {\n requestInit.referrer = init.referrer;\n }\n if (init?.referrerPolicy !== undefined) {\n requestInit.referrerPolicy = init.referrerPolicy;\n }\n if (init?.integrity !== undefined) {\n requestInit.integrity = init.integrity;\n }\n if (init?.keepalive !== undefined) {\n requestInit.keepalive = init.keepalive;\n }\n\n try {\n const response = await this.transport.fetch(url, requestInit);\n\n if (!response.ok) {\n const bodyText = await this.getBodyText(response);\n const httpError = new HTTPError(\n response.status,\n response.statusText,\n url,\n response.headers,\n bodyText,\n );\n\n // Handle 401 - attempt automatic token refresh\n // Attempt refresh on ANY 401 when we have a refresh token callback,\n // not just when x-auth-error header is present (server implementations vary)\n // Don't retry if user aborted the request\n const userAborted = init?.signal?.aborted === true;\n const hasAuthError = response.headers.get('x-auth-error');\n const shouldAttemptRefresh = \n response.status === 401 &&\n this.transport.refreshToken &&\n retryCount < MAX_RETRY_ATTEMPTS &&\n !isStreamBody && // Can't retry with stream bodies\n !userAborted; // Don't retry if user aborted\n \n if (shouldAttemptRefresh && this.transport.refreshToken) {\n console.log('[mero-js] 401 received, attempting token refresh...', { hasAuthError });\n try {\n // Use cached refresh promise if one is in progress (prevents race conditions)\n let refreshPromise = this.refreshTokenPromise;\n if (!refreshPromise) {\n refreshPromise = this.transport.refreshToken();\n this.refreshTokenPromise = refreshPromise;\n }\n \n // Attempt to refresh the token\n const newToken = await refreshPromise;\n \n // Validate token - must be non-empty\n if (!newToken || newToken.trim() === '') {\n // Clear caches on error\n this.refreshTokenPromise = null;\n this.onTokenRefreshPromise = null;\n throw new Error('Refresh token returned empty token');\n }\n \n // onTokenRefresh is required when refreshToken is provided\n // Without it, the new token cannot be stored and getAuthToken() will return the old token\n if (!this.transport.onTokenRefresh) {\n // Clear caches on error\n this.refreshTokenPromise = null;\n this.onTokenRefreshPromise = null;\n throw new Error(\n 'onTokenRefresh callback is required when refreshToken is provided. ' +\n 'The callback must update the token storage so getAuthToken() returns the new token.'\n );\n }\n \n // Use cached onTokenRefresh promise if one is in progress (prevents duplicate callbacks)\n // This ensures onTokenRefresh is only called once per token refresh, even with concurrent requests\n let onTokenRefreshPromise = this.onTokenRefreshPromise;\n if (!onTokenRefreshPromise) {\n onTokenRefreshPromise = this.transport.onTokenRefresh(newToken);\n this.onTokenRefreshPromise = onTokenRefreshPromise;\n }\n \n // Update token via callback (only called once per refresh, even with concurrent requests)\n // Errors from onTokenRefresh callback should be preserved (don't mask as 401)\n // This helps developers debug token storage issues\n await onTokenRefreshPromise;\n \n // Clear caches after both refresh and callback complete\n this.refreshTokenPromise = null;\n this.onTokenRefreshPromise = null;\n \n // Check if timeout has expired during token refresh\n // If so, throw the original 401 error instead of retrying with 0ms timeout\n // This prevents timeout/abort errors that obscure the root cause (expired token)\n const timeoutMs = init?.timeoutMs || this.transport.timeoutMs;\n if (timeoutMs && requestStartTime !== undefined) {\n const elapsed = Date.now() - startTime;\n const remaining = timeoutMs - elapsed;\n if (remaining <= 0) {\n // Timeout expired during token refresh - throw original 401 error\n // This is better than retrying with 0ms timeout which would cause confusing timeout errors\n throw httpError;\n }\n }\n \n // Retry the request with the new token (increment retry count)\n // Preserve user's abort signal and start time in retry\n return this.makeRequest<T>(path, init, retryCount + 1, startTime);\n } catch (refreshError) {\n // Clear caches on error\n this.refreshTokenPromise = null;\n this.onTokenRefreshPromise = null;\n console.log('[mero-js] Token refresh failed:', refreshError);\n // Configuration errors (missing onTokenRefresh) should be thrown as-is\n if (refreshError instanceof Error && refreshError.message.includes('onTokenRefresh')) {\n throw refreshError;\n }\n // Errors from onTokenRefresh callback are already thrown above, so if we get here,\n // it's either a refreshToken() failure or empty token - throw original 401\n // This matches the PR description: \"If refresh fails, throws the original 401 error\"\n throw httpError;\n }\n }\n\n throw httpError;\n }\n\n return this.parseResponse<T>(response, init?.parse);\n } catch (error) {\n if (error instanceof HTTPError) {\n throw error;\n }\n // Preserve configuration errors (like missing onTokenRefresh)\n if (error instanceof Error && error.message.includes('onTokenRefresh')) {\n throw error;\n }\n throw new HTTPError(\n 0,\n 'Network Error',\n url,\n new Headers(),\n error instanceof Error ? error.message : 'Unknown error',\n );\n }\n }\n\n private buildUrl(path: string): string {\n // Handle absolute URLs\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n }\n\n // Handle baseUrl with path\n const baseUrl = this.transport.baseUrl;\n if (path.startsWith('/')) {\n // If path starts with /, combine with baseUrl\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return `${base}${path}`;\n } else {\n // If path doesn't start with /, append to baseUrl\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n return `${base}${path}`;\n }\n }\n\n private createAbortSignal(init?: RequestOptions): AbortSignal | undefined {\n const signals: AbortSignal[] = [];\n\n if (this.transport.defaultAbortSignal) {\n signals.push(this.transport.defaultAbortSignal);\n }\n\n if (init?.signal) {\n signals.push(init.signal);\n }\n\n const timeoutMs = init?.timeoutMs || this.transport.timeoutMs;\n if (timeoutMs) {\n signals.push(createTimeoutSignal(timeoutMs));\n }\n\n return signals.length > 0 ? combineSignals(signals) : undefined;\n }\n\n private async buildHeaders(\n initHeaders?: HeadersInit,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n ...this.transport.defaultHeaders,\n };\n\n // Add auth token if available and not empty\n if (this.transport.getAuthToken) {\n try {\n const token = await this.transport.getAuthToken();\n if (token && token.trim() !== '') {\n headers.Authorization = `Bearer ${token}`;\n }\n } catch (error) {\n // Ignore auth token errors\n }\n }\n\n // Add init headers\n if (initHeaders) {\n if (initHeaders instanceof Headers) {\n initHeaders.forEach((value, key) => {\n headers[key] = value;\n });\n } else if (Array.isArray(initHeaders)) {\n initHeaders.forEach(([key, value]) => {\n headers[key] = value;\n });\n } else {\n Object.assign(headers, initHeaders);\n }\n }\n\n return headers;\n }\n\n private async parseResponse<T>(\n response: Response,\n parse?: ResponseParser,\n ): Promise<T> {\n switch (parse) {\n case 'text':\n return (await response.text()) as T;\n case 'blob':\n return (await response.blob()) as T;\n case 'arrayBuffer':\n return (await response.arrayBuffer()) as T;\n case 'response':\n return response as T;\n case 'json':\n default:\n return await response.json();\n }\n }\n\n private async getBodyText(response: Response): Promise<string> {\n try {\n const text = await response.text();\n return text.length > 65536 ? text.slice(0, 65536) + '...' : text;\n } catch {\n return '';\n }\n }\n}\n", "import { WebHttpClient } from './web-client';\nimport { Transport, HttpClient } from './http-types';\n\n// Factory function to create HTTP client with sensible defaults\nexport function createHttpClient(transport: Transport): HttpClient {\n return new WebHttpClient(transport);\n}\n\n// Factory function for browser environments\nexport function createBrowserHttpClient(options: {\n baseUrl: string;\n getAuthToken?: () => Promise<string | undefined>;\n onTokenRefresh?: (newToken: string) => Promise<void>;\n /**\n * Callback to refresh the access token when a 401 error with 'token_expired' is detected.\n * Should return the new access token, or throw an error if refresh fails.\n * If provided, the client will automatically retry the request after a successful refresh.\n */\n refreshToken?: () => Promise<string>;\n defaultHeaders?: Record<string, string>;\n timeoutMs?: number;\n credentials?: RequestCredentials;\n defaultAbortSignal?: AbortSignal;\n}): HttpClient {\n const transport: Transport = {\n // Wrap fetch in arrow function to prevent \"Illegal invocation\" error\n // This preserves the correct 'this' context when fetch is called\n fetch: (url: RequestInfo | URL, init?: RequestInit) => globalThis.fetch(url, init),\n baseUrl: options.baseUrl,\n getAuthToken: options.getAuthToken,\n onTokenRefresh: options.onTokenRefresh,\n refreshToken: options.refreshToken,\n defaultHeaders: options.defaultHeaders,\n timeoutMs: options.timeoutMs,\n credentials: options.credentials, // No default credentials\n defaultAbortSignal: options.defaultAbortSignal,\n };\n\n return createHttpClient(transport);\n}\n\n// Factory function for Node.js environments\nexport function createNodeHttpClient(options: {\n baseUrl: string;\n fetch?: typeof fetch; // Allow injection of undici.fetch or other fetch implementations\n getAuthToken?: () => Promise<string | undefined>;\n onTokenRefresh?: (newToken: string) => Promise<void>;\n /**\n * Callback to refresh the access token when a 401 error with 'token_expired' is detected.\n * Should return the new access token, or throw an error if refresh fails.\n * If provided, the client will automatically retry the request after a successful refresh.\n */\n refreshToken?: () => Promise<string>;\n defaultHeaders?: Record<string, string>;\n timeoutMs?: number;\n credentials?: RequestCredentials;\n defaultAbortSignal?: AbortSignal;\n}): HttpClient {\n // Use provided fetch or try to use global fetch (Node 18+)\n const fetchImpl = options.fetch ?? globalThis.fetch;\n\n if (!fetchImpl) {\n throw new Error(\n 'No fetch implementation available. Please provide a fetch implementation ' +\n '(e.g., undici.fetch) or use Node.js 18+ which has native fetch support.',\n );\n }\n\n // Check if we're using the default globalThis.fetch to preserve context\n // When fetchImpl is globalThis.fetch, we must call it directly, not through a variable\n // Custom fetch implementations (like undici.fetch) can be called through the variable\n const isDefaultFetch = fetchImpl === globalThis.fetch;\n\n const transport: Transport = {\n // Wrap fetch in arrow function to prevent \"Illegal invocation\" error\n // For globalThis.fetch, call it directly to preserve 'this' context\n // For custom implementations, calling through the variable is safe\n fetch: isDefaultFetch\n ? (url: RequestInfo | URL, init?: RequestInit) => globalThis.fetch(url, init)\n : (url: RequestInfo | URL, init?: RequestInit) => fetchImpl(url, init),\n baseUrl: options.baseUrl,\n getAuthToken: options.getAuthToken,\n onTokenRefresh: options.onTokenRefresh,\n refreshToken: options.refreshToken,\n defaultHeaders: options.defaultHeaders,\n timeoutMs: options.timeoutMs,\n credentials: options.credentials, // Node.js doesn't have default credentials\n defaultAbortSignal: options.defaultAbortSignal,\n };\n\n return createHttpClient(transport);\n}\n\n// Universal factory that works in both environments\nexport function createUniversalHttpClient(options: {\n baseUrl: string;\n fetch?: typeof fetch;\n getAuthToken?: () => Promise<string | undefined>;\n onTokenRefresh?: (newToken: string) => Promise<void>;\n /**\n * Callback to refresh the access token when a 401 error with 'token_expired' is detected.\n * Should return the new access token, or throw an error if refresh fails.\n * If provided, the client will automatically retry the request after a successful refresh.\n */\n refreshToken?: () => Promise<string>;\n defaultHeaders?: Record<string, string>;\n timeoutMs?: number;\n credentials?: RequestCredentials;\n defaultAbortSignal?: AbortSignal;\n}): HttpClient {\n // Try to detect environment and use appropriate factory\n if (typeof window !== 'undefined') {\n // Browser environment\n return createBrowserHttpClient(options);\n } else {\n // Node.js environment\n return createNodeHttpClient(options);\n }\n}\n", "// Retry helper for HTTP requests\nexport interface RetryOptions {\n attempts?: number;\n}\n\n// Error types for retry logic\ninterface ErrorWithName extends Error {\n name: string;\n}\n\ninterface ErrorWithStatus extends Error {\n status: number;\n}\n\ninterface ErrorWithHeaders extends Error {\n headers?: Headers;\n}\n\n// Default retry condition - retry on network errors and 5xx status codes\nfunction defaultRetryCondition(error: Error, attempt: number): boolean {\n // Don't retry on the last attempt\n if (attempt <= 0) return false;\n\n // Distinguish timeout vs. user abort:\n // - Timeout: name === 'TimeoutError' (per spec/platforms)\n // - User abort: name === 'AbortError'\n const errorWithName = error as ErrorWithName;\n const name = errorWithName?.name;\n if (name === 'TimeoutError') return true;\n if (name === 'AbortError') return false;\n\n // HTTP 5xx and 429 (including HTTPError from web-client)\n const errorWithStatus = error as ErrorWithStatus;\n if (\n 'status' in errorWithStatus &&\n typeof errorWithStatus.status === 'number'\n ) {\n const status = errorWithStatus.status;\n return status >= 500 || status === 429;\n }\n // Network TypeError (DNS/reset) is reasonably retryable\n if (name === 'TypeError') return true;\n\n return false;\n}\n\n// Calculate delay with exponential backoff and jitter\nfunction calculateDelay(attempt: number): number {\n const baseDelayMs = 250; // Base 250ms as per spec\n const delay = baseDelayMs * Math.pow(2, attempt - 1);\n\n // Add \u00B120% jitter to reduce stampedes\n const jitter = (Math.random() - 0.5) * 0.4 * delay;\n return Math.max(0, delay + jitter);\n}\n\n// Retry helper function with new signature\nexport async function withRetry<T>(\n fn: (attempt: number) => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const { attempts = 3 } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn(attempt);\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry (this handles the last attempt check)\n if (!defaultRetryCondition(lastError, attempts - attempt)) {\n throw lastError;\n }\n\n // Calculate delay\n let delayMs = calculateDelay(attempt);\n\n // Check for Retry-After header if it's an HTTP error\n const errorWithHeaders = lastError as ErrorWithHeaders;\n const hdrs = errorWithHeaders.headers;\n const retryAfter = hdrs?.get?.('Retry-After');\n if (retryAfter) {\n // If it's a number, treat as seconds\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) {\n delayMs = Math.max(delayMs, seconds * 1000);\n } else {\n // If it's a date, calculate the difference\n const date = new Date(retryAfter);\n if (!isNaN(date.getTime())) {\n const waitTime = Math.max(0, date.getTime() - Date.now());\n // Cap wait at 60s per attempt as per spec\n delayMs = Math.max(delayMs, Math.min(waitTime, 60000));\n }\n }\n }\n\n // Wait before retrying\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n throw lastError || new Error('Retry failed without error');\n}\n\n// Helper to create a retry-enabled HTTP client method\nexport function createRetryableMethod<T extends unknown[], R>(\n method: (...args: T) => Promise<R>,\n retryOptions: RetryOptions = {},\n) {\n return async (...args: T): Promise<R> => {\n return withRetry(() => method(...args), retryOptions);\n };\n}\n", "export * from './types';\nexport * from './client';\nexport * from './factory';\n", "/**\n * Shared utilities for API clients\n */\n\n// Helper type for API responses that wrap data\n// Note: This is specifically for unwrapping { data: T } responses from the API\nexport type ApiResponseWrapper<T> = { data: T; error?: never } | { data?: never; error: ApiError };\n\n/**\n * API-level error structure (returned in response body even with HTTP 200)\n * Common in RPC-style APIs where errors are semantic, not transport-level.\n */\nexport interface ApiError {\n type?: string;\n code?: number;\n message: string;\n data?: unknown;\n}\n\n/**\n * Custom error class for API errors that includes structured error data.\n */\nexport class ApiResponseError extends Error {\n public readonly type?: string;\n public readonly code?: number;\n public readonly data?: unknown;\n\n constructor(error: ApiError) {\n super(error.message);\n this.name = 'ApiResponseError';\n this.type = error.type;\n this.code = error.code;\n this.data = error.data;\n }\n}\n\n/**\n * Type guard to check if a response contains an error payload.\n */\nfunction hasErrorPayload(\n response: unknown,\n): response is { error: ApiError } {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'error' in response &&\n response.error !== null &&\n response.error !== undefined &&\n typeof (response as { error: unknown }).error === 'object'\n );\n}\n\n/**\n * Unwraps a response from the API format { data: T } to T.\n *\n * This function handles:\n * 1. Standard success responses: { data: T }\n * 2. RPC-style error responses: { error: { message, type?, code? } }\n * 3. Null/undefined data detection\n *\n * @example\n * ```typescript\n * // Success case\n * const apps = await unwrap(client.get<{ data: App[] }>('/apps'));\n * // apps is App[]\n *\n * // Error case (throws ApiResponseError)\n * const result = await unwrap(client.post('/rpc', badRequest));\n * // throws ApiResponseError with message, type, code\n * ```\n *\n * @param response - Promise resolving to an ApiResponseWrapper<T>\n * @returns Promise resolving to the unwrapped data\n * @throws ApiResponseError if the response contains an error payload\n * @throws Error if data is null or undefined\n */\nexport async function unwrap<T>(\n response: Promise<ApiResponseWrapper<T> | { data: T }>,\n): Promise<T> {\n const result = await response;\n\n // Check for RPC-style error payload (even with HTTP 200)\n if (hasErrorPayload(result)) {\n throw new ApiResponseError(result.error);\n }\n\n // Check specifically for null/undefined, not falsy values\n // This allows valid responses like 0, false, or empty strings\n if (result.data === null || result.data === undefined) {\n throw new Error('Response data is null or undefined');\n }\n\n return result.data;\n}\n\n/**\n * Safely unwraps a response, returning null instead of throwing on missing data.\n * Still throws on explicit error payloads.\n *\n * @param response - Promise resolving to an ApiResponseWrapper<T>\n * @returns Promise resolving to the unwrapped data or null\n * @throws ApiResponseError if the response contains an error payload\n */\nexport async function unwrapOrNull<T>(\n response: Promise<ApiResponseWrapper<T> | { data: T }>,\n): Promise<T | null> {\n const result = await response;\n\n // Check for RPC-style error payload\n if (hasErrorPayload(result)) {\n throw new ApiResponseError(result.error);\n }\n\n if (result.data === null || result.data === undefined) {\n return null;\n }\n\n return result.data;\n}\n", "import { HttpClient } from '../../http-client';\nimport * as types from './types';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface AuthApiClientConfig {\n /**\n * Base URL for auth endpoints.\n * - Embedded mode: Use same base URL as admin API (e.g., 'http://localhost:8080')\n * - Proxied mode: Use external auth service URL (e.g., 'https://auth.example.com')\n */\n baseUrl: string;\n /**\n * Whether auth is embedded (uses /auth/ paths) or proxied (external service).\n * If not specified, will be auto-detected based on baseUrl.\n */\n embedded?: boolean;\n}\n\nexport class AuthApiClient {\n private embedded: boolean;\n\n constructor(\n private httpClient: HttpClient,\n config: AuthApiClientConfig,\n ) {\n // Auto-detect embedded mode if not specified\n // Embedded: baseUrl matches admin API base URL (or not specified, default to embedded)\n // Proxied: baseUrl is different (external service)\n this.embedded = config.embedded ?? true; // Default to embedded\n }\n\n private getAuthPath(path: string): string {\n if (this.embedded) {\n // Embedded mode: use /auth/ prefix (relative to HttpClient's baseUrl)\n return `/auth${path}`;\n }\n // Proxied mode: paths are relative to the external auth service\n // The HttpClient should have the external baseUrl set\n return path;\n }\n\n // Public endpoints\n async getLogin(): Promise<string> {\n return this.httpClient.get<string>(this.getAuthPath('/login'), {\n parse: 'text',\n });\n }\n\n async getChallenge(): Promise<types.AuthChallengeResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.AuthChallengeResponse>>(\n this.getAuthPath('/challenge'),\n ),\n );\n }\n\n async getToken(\n request: types.AuthTokenRequest,\n ): Promise<types.AuthTokenResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<types.AuthTokenResponse>>(\n this.getAuthPath('/token'),\n request,\n ),\n );\n }\n\n async refreshToken(\n request: types.RefreshTokenRequest,\n ): Promise<types.AuthTokenResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<types.AuthTokenResponse>>(\n this.getAuthPath('/refresh'),\n request,\n ),\n );\n }\n\n async getProviders(): Promise<types.AuthProvidersResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.AuthProvidersResponse>>(\n this.getAuthPath('/providers'),\n ),\n );\n }\n\n async getIdentity(): Promise<types.AuthIdentityResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.AuthIdentityResponse>>(\n this.getAuthPath('/identity'),\n ),\n );\n }\n\n /**\n * Validate a JWT token.\n *\n * Note: The server returns an empty string \"\" on success with auth info in headers\n * (X-Auth-User, X-Auth-Permissions). If no error is thrown, the token is valid.\n */\n async validateToken(\n request: types.TokenValidationRequest,\n ): Promise<types.TokenValidationResponse> {\n const response = await this.httpClient.post<\n ApiResponseWrapper<types.TokenValidationRawResponse | types.TokenValidationResponse>\n >(this.getAuthPath('/validate'), request);\n\n // Handle raw response (empty string = valid) vs structured response\n if (response.data === '' || response.data === undefined || response.data === null) {\n // Server returned empty string on success\n return { valid: true };\n }\n if (typeof response.data === 'object' && 'valid' in response.data) {\n // Server returned structured response\n return response.data as types.TokenValidationResponse;\n }\n // Fallback: if we got here without error, token is valid\n return { valid: true };\n }\n\n /**\n * Validate a JWT token using GET with Authorization header.\n *\n * Note: The server returns an empty string \"\" on success with auth info in headers\n * (X-Auth-User, X-Auth-Permissions). If no error is thrown, the token is valid.\n */\n async validateTokenGet(token: string): Promise<types.TokenValidationResponse> {\n const response = await this.httpClient.get<\n ApiResponseWrapper<types.TokenValidationRawResponse | types.TokenValidationResponse>\n >(this.getAuthPath('/validate'), {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n // Handle raw response (empty string = valid) vs structured response\n if (response.data === '' || response.data === undefined || response.data === null) {\n return { valid: true };\n }\n if (typeof response.data === 'object' && 'valid' in response.data) {\n return response.data as types.TokenValidationResponse;\n }\n return { valid: true };\n }\n\n async getHealth(): Promise<types.HealthResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.HealthResponse>>(\n this.getAuthPath('/health'),\n ),\n );\n }\n\n async getCallback(callbackUrl?: string): Promise<string> {\n const params = callbackUrl\n ? `?callback-url=${encodeURIComponent(callbackUrl)}`\n : '';\n return this.httpClient.get<string>(\n this.getAuthPath(`/callback${params}`),\n {\n parse: 'text',\n },\n );\n }\n\n // Protected endpoints (require JWT token)\n async revokeToken(): Promise<types.RevokeTokenResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<types.RevokeTokenResponse>>(\n this.getAuthPath('/admin/revoke'),\n {},\n ),\n );\n }\n\n async listRootKeys(): Promise<types.ListRootKeysResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.ListRootKeysResponse>>(\n this.getAuthPath('/admin/keys'),\n ),\n );\n }\n\n async createRootKey(\n request: types.CreateRootKeyRequest,\n ): Promise<types.CreateRootKeyResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<types.CreateRootKeyResponse>>(\n this.getAuthPath('/admin/keys'),\n request,\n ),\n );\n }\n\n async deleteRootKey(keyId: string): Promise<types.DeleteRootKeyResponse> {\n return unwrap(\n this.httpClient.delete<ApiResponseWrapper<types.DeleteRootKeyResponse>>(\n this.getAuthPath(`/admin/keys/${keyId}`),\n ),\n );\n }\n\n async listClientKeys(): Promise<types.ListClientKeysResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.ListClientKeysResponse>>(\n this.getAuthPath('/admin/keys/clients'),\n ),\n );\n }\n\n async generateClientKey(\n request: types.GenerateClientKeyRequest,\n ): Promise<types.GenerateClientKeyResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<types.GenerateClientKeyResponse>>(\n this.getAuthPath('/admin/client-key'),\n request,\n ),\n );\n }\n\n async deleteClientKey(\n keyId: string,\n clientId: string,\n ): Promise<types.DeleteClientKeyResponse> {\n return unwrap(\n this.httpClient.delete<ApiResponseWrapper<types.DeleteClientKeyResponse>>(\n this.getAuthPath(`/admin/keys/${keyId}/clients/${clientId}`),\n ),\n );\n }\n\n async getKeyPermissions(\n keyId: string,\n ): Promise<types.GetKeyPermissionsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.GetKeyPermissionsResponse>>(\n this.getAuthPath(`/admin/keys/${keyId}/permissions`),\n ),\n );\n }\n\n async updateKeyPermissions(\n keyId: string,\n request: types.UpdateKeyPermissionsRequest,\n ): Promise<types.UpdateKeyPermissionsResponse> {\n return unwrap(\n this.httpClient.put<ApiResponseWrapper<types.UpdateKeyPermissionsResponse>>(\n this.getAuthPath(`/admin/keys/${keyId}/permissions`),\n request,\n ),\n );\n }\n\n async getProtectedIdentity(): Promise<types.AuthIdentityResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.AuthIdentityResponse>>(\n this.getAuthPath('/admin/identity'),\n ),\n );\n }\n\n async getMetrics(): Promise<types.AuthMetricsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<types.AuthMetricsResponse>>(\n this.getAuthPath('/admin/metrics'),\n ),\n );\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { AuthApiClient, AuthApiClientConfig } from './client';\n\nexport function createAuthApiClient(\n httpClient: HttpClient,\n config: AuthApiClientConfig,\n): AuthApiClient {\n return new AuthApiClient(httpClient, config);\n}\n", "// Main unified client\nexport { AdminApiClient } from './client';\nexport { createAdminApiClient } from './factory';\n\n// Individual concept-based clients (for direct use if needed)\nexport { PublicApiClient } from './public';\nexport { ApplicationsApiClient } from './applications';\nexport { ContextsApiClient } from './contexts';\nexport { ProposalsApiClient } from './proposals';\nexport { CapabilitiesApiClient } from './capabilities';\nexport { IdentityApiClient } from './identity';\nexport { NetworkApiClient } from './network';\nexport { BlobsApiClient } from './blobs';\nexport { AliasesApiClient } from './aliases';\nexport { TeeApiClient } from './tee';\n\n// Types from each module (re-export all, including types)\nexport * from './public';\nexport * from './applications';\nexport * from './contexts';\nexport * from './proposals';\nexport * from './capabilities';\nexport * from './identity';\nexport * from './network';\nexport * from './blobs';\nexport * from './aliases';\nexport * from './tee';\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface HealthResponse {\n status: string;\n}\n\nexport interface IsAuthedResponse {\n status: string;\n}\n\nexport class PublicApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async health(): Promise<HealthResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<HealthResponse>>('/admin-api/health'),\n );\n }\n\n async isAuthed(): Promise<IsAuthedResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<IsAuthedResponse>>(\n '/admin-api/is-authed',\n ),\n );\n }\n\n async getCertificate(): Promise<string> {\n return this.httpClient.get<string>('/admin-api/certificate', {\n parse: 'text',\n });\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface Application {\n applicationId: string;\n metadata: string; // base64 encoded\n}\n\nexport interface InstallApplicationRequest {\n url: string;\n hash?: string;\n metadata: number[] | string; // byte array or base64 string (API accepts both but prefers array)\n package?: string;\n version?: string;\n}\n\nexport interface InstallDevApplicationRequest {\n path: string;\n metadata: number[] | string; // byte array or base64 string (API accepts both but prefers array)\n package?: string;\n version?: string;\n}\n\nexport interface InstallApplicationResponse {\n applicationId: string;\n}\n\nexport interface UninstallApplicationResponse {\n applicationId: string;\n}\n\nexport interface ListApplicationsResponse {\n apps: Application[];\n}\n\nexport interface GetApplicationResponse {\n application: Application;\n}\n\nexport interface ListPackagesResponse {\n packages: string[];\n}\n\nexport interface ListVersionsResponse {\n versions: string[];\n}\n\nexport interface GetLatestVersionResponse {\n applicationId: string | null;\n}\n\nexport class ApplicationsApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async installApplication(\n request: InstallApplicationRequest,\n ): Promise<InstallApplicationResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<InstallApplicationResponse>>(\n '/admin-api/install-application',\n request,\n ),\n );\n }\n\n async installDevApplication(\n request: InstallDevApplicationRequest,\n ): Promise<InstallApplicationResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<InstallApplicationResponse>>(\n '/admin-api/install-dev-application',\n request,\n ),\n );\n }\n\n async listApplications(): Promise<ListApplicationsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<ListApplicationsResponse>>(\n '/admin-api/applications',\n ),\n );\n }\n\n async getApplication(\n applicationId: string,\n ): Promise<GetApplicationResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetApplicationResponse>>(\n `/admin-api/applications/${applicationId}`,\n ),\n );\n }\n\n async uninstallApplication(\n applicationId: string,\n ): Promise<UninstallApplicationResponse> {\n return unwrap(\n this.httpClient.delete<ApiResponseWrapper<UninstallApplicationResponse>>(\n `/admin-api/applications/${applicationId}`,\n ),\n );\n }\n\n async listPackages(): Promise<ListPackagesResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<ListPackagesResponse>>(\n '/admin-api/packages',\n ),\n );\n }\n\n async listVersions(packageName: string): Promise<ListVersionsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<ListVersionsResponse>>(\n `/admin-api/packages/${packageName}/versions`,\n ),\n );\n }\n\n async getLatestVersion(\n packageName: string,\n ): Promise<GetLatestVersionResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetLatestVersionResponse>>(\n `/admin-api/packages/${packageName}/latest`,\n ),\n );\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface Context {\n /** Context ID - server may return as 'id' or 'contextId' */\n id: string;\n /** Application ID */\n applicationId: string;\n /** Protocol name */\n protocol?: string;\n /** Root hash (optional) */\n rootHash?: string;\n /** DAG heads (optional) */\n dagHeads?: string[];\n}\n\nexport interface CreateContextRequest {\n protocol: string;\n applicationId: string;\n contextSeed?: string;\n initializationParams: number[] | string; // byte array or base64 string (API accepts both but prefers array)\n}\n\nexport interface CreateContextResponse {\n contextId: string;\n memberPublicKey: string;\n}\n\nexport interface DeleteContextResponse {\n isDeleted: boolean;\n}\n\nexport interface GetContextResponse {\n contextId: string;\n applicationId: string;\n protocol: string;\n}\n\nexport interface GetContextStorageResponse {\n sizeInBytes: number;\n}\n\nexport interface GetContextIdentitiesResponse {\n identities: string[];\n}\n\nexport interface GetContextsResponse {\n contexts: Context[];\n}\n\nexport interface InviteToContextRequest {\n contextId: string;\n inviterId: string;\n inviteeId: string;\n}\n\nexport interface InviteToContextResponse {\n [key: string]: unknown;\n}\n\nexport interface InviteToContextOpenInvitationRequest {\n contextId: string;\n inviterId: string;\n validForBlocks: number;\n}\n\nexport interface InviteToContextOpenInvitationResponse {\n [key: string]: unknown;\n}\n\nexport interface InviteSpecializedNodeRequest {\n contextId: string;\n inviterId?: string;\n}\n\nexport interface InviteSpecializedNodeResponse {\n nonce: string;\n}\n\nexport interface JoinContextRequest {\n invitationPayload: Record<string, unknown>;\n}\n\nexport interface JoinContextByOpenInvitationRequest {\n invitation: Record<string, unknown>;\n newMemberPublicKey: string;\n}\n\nexport interface JoinContextResponse {\n contextId?: string;\n memberPublicKey?: string;\n}\n\nexport interface UpdateContextApplicationRequest {\n applicationId: string;\n executorPublicKey: string;\n}\n\nexport interface UpdateContextApplicationResponse {\n [key: string]: unknown;\n}\n\nexport interface GetProxyContractResponse {\n [key: string]: unknown;\n}\n\nexport interface SyncContextResponse {\n [key: string]: unknown;\n}\n\nexport class ContextsApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async listContexts(): Promise<GetContextsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetContextsResponse>>(\n '/admin-api/contexts',\n ),\n );\n }\n\n async createContext(\n request: CreateContextRequest,\n ): Promise<CreateContextResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<CreateContextResponse>>(\n '/admin-api/contexts',\n request,\n ),\n );\n }\n\n async getContext(contextId: string): Promise<GetContextResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetContextResponse>>(\n `/admin-api/contexts/${contextId}`,\n ),\n );\n }\n\n async deleteContext(contextId: string): Promise<DeleteContextResponse> {\n return unwrap(\n this.httpClient.delete<ApiResponseWrapper<DeleteContextResponse>>(\n `/admin-api/contexts/${contextId}`,\n ),\n );\n }\n\n async getContextStorage(\n contextId: string,\n ): Promise<GetContextStorageResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetContextStorageResponse>>(\n `/admin-api/contexts/${contextId}/storage`,\n ),\n );\n }\n\n async getContextIdentities(\n contextId: string,\n ): Promise<GetContextIdentitiesResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetContextIdentitiesResponse>>(\n `/admin-api/contexts/${contextId}/identities`,\n ),\n );\n }\n\n async getContextIdentitiesOwned(\n contextId: string,\n ): Promise<GetContextIdentitiesResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetContextIdentitiesResponse>>(\n `/admin-api/contexts/${contextId}/identities-owned`,\n ),\n );\n }\n\n async inviteToContext(\n request: InviteToContextRequest,\n ): Promise<InviteToContextResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<InviteToContextResponse>>(\n '/admin-api/contexts/invite',\n request,\n ),\n );\n }\n\n async inviteToContextOpenInvitation(\n request: InviteToContextOpenInvitationRequest,\n ): Promise<InviteToContextOpenInvitationResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<InviteToContextOpenInvitationResponse>>(\n '/admin-api/contexts/invite_by_open_invitation',\n request,\n ),\n );\n }\n\n async inviteSpecializedNode(\n request: InviteSpecializedNodeRequest,\n ): Promise<InviteSpecializedNodeResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<InviteSpecializedNodeResponse>>(\n '/admin-api/contexts/invite-specialized-node',\n request,\n ),\n );\n }\n\n async joinContext(request: JoinContextRequest): Promise<JoinContextResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<JoinContextResponse>>(\n '/admin-api/contexts/join',\n request,\n ),\n );\n }\n\n async joinContextByOpenInvitation(\n request: JoinContextByOpenInvitationRequest,\n ): Promise<JoinContextResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<JoinContextResponse>>(\n '/admin-api/contexts/join_by_open_invitation',\n request,\n ),\n );\n }\n\n async updateContextApplication(\n contextId: string,\n request: UpdateContextApplicationRequest,\n ): Promise<UpdateContextApplicationResponse> {\n return unwrap(\n this.httpClient.put<ApiResponseWrapper<UpdateContextApplicationResponse>>(\n `/admin-api/contexts/${contextId}/application`,\n request,\n ),\n );\n }\n\n async getContextsForApplication(\n applicationId: string,\n ): Promise<GetContextsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetContextsResponse>>(\n `/admin-api/contexts/for-application/${applicationId}`,\n ),\n );\n }\n\n async getContextsWithExecutorsForApplication(\n applicationId: string,\n ): Promise<GetContextsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetContextsResponse>>(\n `/admin-api/contexts/with-executors/for-application/${applicationId}`,\n ),\n );\n }\n\n async getProxyContract(\n contextId: string,\n ): Promise<GetProxyContractResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetProxyContractResponse>>(\n `/admin-api/contexts/${contextId}/proxy-contract`,\n ),\n );\n }\n\n async syncContext(): Promise<SyncContextResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<SyncContextResponse>>(\n '/admin-api/contexts/sync',\n {},\n ),\n );\n }\n\n async syncContextById(contextId: string): Promise<SyncContextResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<SyncContextResponse>>(\n `/admin-api/contexts/sync/${contextId}`,\n {},\n ),\n );\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface Proposal {\n [key: string]: unknown;\n}\n\nexport interface GetProposalsRequest {\n offset: number;\n limit: number;\n}\n\nexport type GetProposalsResponse = Proposal[];\n\nexport type GetProposalResponse = Proposal;\n\nexport type GetNumberOfActiveProposalsResponse = number;\n\nexport interface ProposalWithApprovals {\n [key: string]: unknown;\n}\n\nexport type GetNumberOfProposalApprovalsResponse = ProposalWithApprovals;\n\nexport type GetProposalApproversResponse = Record<string, unknown>[];\n\nexport interface CreateAndApproveProposalRequest {\n signerId: string;\n proposal: Proposal;\n}\n\nexport type CreateAndApproveProposalResponse = ProposalWithApprovals;\n\nexport interface ApproveProposalRequest {\n signerId: string;\n proposalId: string;\n}\n\nexport type ApproveProposalResponse = ProposalWithApprovals;\n\nexport interface GetContextValueRequest {\n key: string;\n}\n\nexport type GetContextValueResponse = number[];\n\nexport interface GetContextStorageEntriesRequest {\n offset: number;\n limit: number;\n}\n\nexport type GetContextStorageEntriesResponse = Record<string, unknown>[];\n\nexport class ProposalsApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async getProposals(\n contextId: string,\n request: GetProposalsRequest,\n ): Promise<GetProposalsResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<GetProposalsResponse>>(\n `/admin-api/contexts/${contextId}/proposals`,\n request,\n ),\n );\n }\n\n async getProposal(\n contextId: string,\n proposalId: string,\n ): Promise<GetProposalResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetProposalResponse>>(\n `/admin-api/contexts/${contextId}/proposals/${proposalId}`,\n ),\n );\n }\n\n async createAndApproveProposal(\n contextId: string,\n request: CreateAndApproveProposalRequest,\n ): Promise<CreateAndApproveProposalResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<CreateAndApproveProposalResponse>>(\n `/admin-api/contexts/${contextId}/proposals/create-and-approve`,\n request,\n ),\n );\n }\n\n async approveProposal(\n contextId: string,\n request: ApproveProposalRequest,\n ): Promise<ApproveProposalResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<ApproveProposalResponse>>(\n `/admin-api/contexts/${contextId}/proposals/approve`,\n request,\n ),\n );\n }\n\n async getNumberOfActiveProposals(\n contextId: string,\n ): Promise<GetNumberOfActiveProposalsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetNumberOfActiveProposalsResponse>>(\n `/admin-api/contexts/${contextId}/proposals/count`,\n ),\n );\n }\n\n async getNumberOfProposalApprovals(\n contextId: string,\n proposalId: string,\n ): Promise<GetNumberOfProposalApprovalsResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetNumberOfProposalApprovalsResponse>>(\n `/admin-api/contexts/${contextId}/proposals/${proposalId}/approvals/count`,\n ),\n );\n }\n\n async getProposalApprovers(\n contextId: string,\n proposalId: string,\n ): Promise<GetProposalApproversResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<GetProposalApproversResponse>>(\n `/admin-api/contexts/${contextId}/proposals/${proposalId}/approvals/users`,\n ),\n );\n }\n\n async getContextValue(\n contextId: string,\n request: GetContextValueRequest,\n ): Promise<GetContextValueResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<GetContextValueResponse>>(\n `/admin-api/contexts/${contextId}/proposals/get-context-value`,\n request,\n ),\n );\n }\n\n async getContextStorageEntries(\n contextId: string,\n request: GetContextStorageEntriesRequest,\n ): Promise<GetContextStorageEntriesResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<GetContextStorageEntriesResponse>>(\n `/admin-api/contexts/${contextId}/proposals/context-storage-entries`,\n request,\n ),\n );\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface GrantPermissionRequest {\n contextId: string;\n granterId: string;\n granteeId: string;\n capability: string;\n}\n\nexport interface GrantPermissionResponse {\n [key: string]: unknown;\n}\n\nexport interface RevokePermissionRequest {\n contextId: string;\n revokerId: string;\n revokeeId: string;\n capability: string;\n}\n\nexport interface RevokePermissionResponse {\n [key: string]: unknown;\n}\n\nexport class CapabilitiesApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async grantPermission(\n contextId: string,\n request: GrantPermissionRequest,\n ): Promise<GrantPermissionResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<GrantPermissionResponse>>(\n `/admin-api/contexts/${contextId}/capabilities/grant`,\n request,\n ),\n );\n }\n\n async revokePermission(\n contextId: string,\n request: RevokePermissionRequest,\n ): Promise<RevokePermissionResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<RevokePermissionResponse>>(\n `/admin-api/contexts/${contextId}/capabilities/revoke`,\n request,\n ),\n );\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface GenerateContextIdentityResponse {\n publicKey: string;\n}\n\nexport class IdentityApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async generateContextIdentity(): Promise<GenerateContextIdentityResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<GenerateContextIdentityResponse>>(\n '/admin-api/identity/context',\n {},\n ),\n );\n }\n}\n", "import { HttpClient } from '../../http-client';\n\nexport interface GetPeersCountResponse {\n count: number;\n}\n\nexport class NetworkApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async getPeersCount(): Promise<GetPeersCountResponse> {\n return this.httpClient.get<GetPeersCountResponse>('/admin-api/peers');\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface BlobInfo {\n blobId: string;\n size: number;\n hash: string | null;\n}\n\nexport type BlobUploadResponse = BlobInfo;\n\nexport interface BlobListResponse {\n blobs: BlobInfo[];\n}\n\nexport interface BlobDeleteResponse {\n blobId: string;\n deleted: boolean;\n}\n\nexport class BlobsApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async uploadBlob(blob: Blob | File): Promise<BlobUploadResponse> {\n // Blob upload uses PUT method with binary data (application/octet-stream)\n // We need to use request() directly to pass the blob without JSON.stringify\n const response = await unwrap(\n this.httpClient.request<ApiResponseWrapper<{ blob_id: string; size: number; hash?: string | null }>>(\n '/admin-api/blobs',\n {\n method: 'PUT',\n body: blob,\n headers: {\n 'Content-Type': 'application/octet-stream',\n },\n },\n ),\n );\n \n // Transform snake_case response to camelCase to match our interface\n return {\n blobId: response.blob_id,\n size: response.size,\n hash: response.hash ?? null,\n };\n }\n\n async listBlobs(): Promise<BlobListResponse> {\n const response = await unwrap(\n this.httpClient.get<ApiResponseWrapper<{ blobs: Array<{ blob_id: string; size: number; hash?: string | null }> }>>('/admin-api/blobs'),\n );\n \n // Transform snake_case response to camelCase to match our interface\n return {\n blobs: response.blobs.map((blob) => ({\n blobId: blob.blob_id,\n size: blob.size,\n hash: blob.hash ?? null,\n })),\n };\n }\n\n async getBlob(blobId: string): Promise<Blob> {\n return this.httpClient.get<Blob>(`/admin-api/blobs/${blobId}`, {\n parse: 'blob',\n });\n }\n\n async getBlobInfo(blobId: string): Promise<BlobInfo> {\n const response = await this.httpClient.head(`/admin-api/blobs/${blobId}`);\n // HEAD request returns headers with metadata\n // Note: This might need to be adjusted based on actual API response\n return {\n blobId,\n size: parseInt(response.headers['content-length'] || '0', 10),\n hash: response.headers['x-blob-hash'] || null,\n };\n }\n\n async deleteBlob(blobId: string): Promise<BlobDeleteResponse> {\n const response = await unwrap(\n this.httpClient.delete<ApiResponseWrapper<{ blob_id?: string; blobId?: string; deleted: boolean }>>(\n `/admin-api/blobs/${blobId}`,\n ),\n );\n \n // Transform snake_case response to camelCase to match our interface\n return {\n blobId: response.blob_id || response.blobId || blobId,\n deleted: response.deleted,\n };\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface CreateContextAliasRequest {\n alias: string;\n contextId: string;\n}\n\nexport interface CreateApplicationAliasRequest {\n alias: string;\n applicationId: string;\n}\n\nexport interface CreateIdentityAliasRequest {\n alias: string;\n identity: string;\n}\n\nexport interface CreateAliasResponse {\n [key: string]: unknown;\n}\n\nexport interface DeleteAliasResponse {\n [key: string]: unknown;\n}\n\nexport interface LookupContextAliasResponse {\n value: string | null;\n}\n\nexport interface LookupApplicationAliasResponse {\n value: string | null;\n}\n\nexport interface LookupIdentityAliasResponse {\n value: string | null;\n}\n\nexport interface ListContextAliasesResponse {\n [alias: string]: string;\n}\n\nexport interface ListApplicationAliasesResponse {\n [alias: string]: string;\n}\n\nexport interface ListIdentityAliasesResponse {\n [alias: string]: string;\n}\n\nexport class AliasesApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async createContextAlias(\n request: CreateContextAliasRequest,\n ): Promise<CreateAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<CreateAliasResponse>>(\n '/admin-api/alias/create/context',\n request,\n ),\n );\n }\n\n async createApplicationAlias(\n request: CreateApplicationAliasRequest,\n ): Promise<CreateAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<CreateAliasResponse>>(\n '/admin-api/alias/create/application',\n request,\n ),\n );\n }\n\n async createIdentityAlias(\n context: string,\n request: CreateIdentityAliasRequest,\n ): Promise<CreateAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<CreateAliasResponse>>(\n `/admin-api/alias/create/identity/${context}`,\n request,\n ),\n );\n }\n\n async lookupContextAlias(name: string): Promise<LookupContextAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<LookupContextAliasResponse>>(\n `/admin-api/alias/lookup/context/${name}`,\n {},\n ),\n );\n }\n\n async lookupApplicationAlias(\n name: string,\n ): Promise<LookupApplicationAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<LookupApplicationAliasResponse>>(\n `/admin-api/alias/lookup/application/${name}`,\n {},\n ),\n );\n }\n\n async lookupIdentityAlias(\n context: string,\n name: string,\n ): Promise<LookupIdentityAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<LookupIdentityAliasResponse>>(\n `/admin-api/alias/lookup/identity/${context}/${name}`,\n {},\n ),\n );\n }\n\n async listContextAliases(): Promise<ListContextAliasesResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<ListContextAliasesResponse>>(\n '/admin-api/alias/list/context',\n ),\n );\n }\n\n async listApplicationAliases(): Promise<ListApplicationAliasesResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<ListApplicationAliasesResponse>>(\n '/admin-api/alias/list/application',\n ),\n );\n }\n\n async listIdentityAliases(\n context: string,\n ): Promise<ListIdentityAliasesResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<ListIdentityAliasesResponse>>(\n `/admin-api/alias/list/identity/${context}`,\n ),\n );\n }\n\n async deleteContextAlias(name: string): Promise<DeleteAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<DeleteAliasResponse>>(\n `/admin-api/alias/delete/context/${name}`,\n {},\n ),\n );\n }\n\n async deleteApplicationAlias(name: string): Promise<DeleteAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<DeleteAliasResponse>>(\n `/admin-api/alias/delete/application/${name}`,\n {},\n ),\n );\n }\n\n async deleteIdentityAlias(\n context: string,\n name: string,\n ): Promise<DeleteAliasResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<DeleteAliasResponse>>(\n `/admin-api/alias/delete/identity/${context}/${name}`,\n {},\n ),\n );\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { unwrap, type ApiResponseWrapper } from '../utils';\n\nexport interface TeeAttestRequest {\n nonce: string;\n applicationId?: string;\n}\n\nexport interface QuoteHeader {\n version: number;\n attestationKeyType: number;\n teeType: number;\n qeVendorId: string;\n userData: string;\n}\n\nexport interface QuoteBody {\n tdxVersion: string;\n teeTcbSvn: string;\n mrseam: string;\n mrsignerseam: string;\n seamattributes: string;\n tdattributes: string;\n xfam: string;\n mrtd: string;\n mrconfigid: string;\n mrowner: string;\n mrownerconfig: string;\n rtmr0: string;\n rtmr1: string;\n rtmr2: string;\n rtmr3: string;\n reportdata: string;\n teeTcbSvn2?: string;\n mrservicetd?: string;\n}\n\nexport type CertificationData =\n | string\n | {\n qeReport: string;\n signature: string;\n qeAuthenticationData: string;\n certificationDataType: string;\n certificationData: string;\n };\n\nexport interface Quote {\n header: QuoteHeader;\n body: QuoteBody;\n signature: string;\n attestationKey: string;\n certificationData: CertificationData;\n}\n\nexport interface TeeAttestResponse {\n quoteB64: string;\n quote: Quote;\n}\n\nexport interface TeeInfoResponse {\n cloudProvider: string;\n osImage: string;\n mrtd: string;\n}\n\nexport interface TeeVerifyQuoteRequest {\n quoteB64: string;\n nonce: string;\n expectedApplicationHash?: string;\n}\n\nexport interface TeeVerifyQuoteResponse {\n quoteVerified: boolean;\n nonceVerified: boolean;\n applicationHashVerified?: boolean;\n quote: Quote;\n}\n\nexport class TeeApiClient {\n constructor(private httpClient: HttpClient) {}\n\n async getTeeInfo(): Promise<TeeInfoResponse> {\n return unwrap(\n this.httpClient.get<ApiResponseWrapper<TeeInfoResponse>>('/admin-api/tee/info'),\n );\n }\n\n async attestTee(request: TeeAttestRequest): Promise<TeeAttestResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<TeeAttestResponse>>(\n '/admin-api/tee/attest',\n request,\n ),\n );\n }\n\n async verifyTeeQuote(\n request: TeeVerifyQuoteRequest,\n ): Promise<TeeVerifyQuoteResponse> {\n return unwrap(\n this.httpClient.post<ApiResponseWrapper<TeeVerifyQuoteResponse>>(\n '/admin-api/tee/verify-quote',\n request,\n ),\n );\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { PublicApiClient } from './public';\nimport { ApplicationsApiClient } from './applications';\nimport { ContextsApiClient } from './contexts';\nimport { ProposalsApiClient } from './proposals';\nimport { CapabilitiesApiClient } from './capabilities';\nimport { IdentityApiClient } from './identity';\nimport { NetworkApiClient } from './network';\nimport { BlobsApiClient } from './blobs';\nimport { AliasesApiClient } from './aliases';\nimport { TeeApiClient } from './tee';\n\n/**\n * Unified Admin API Client that composes all domain-specific modules.\n *\n * Sub-clients are lazily initialized on first access to minimize memory\n * usage when only a subset of functionality is needed.\n *\n * @example\n * ```typescript\n * const admin = new AdminApiClient(httpClient);\n *\n * // Only ApplicationsApiClient is initialized\n * const apps = await admin.applications.listApplications();\n *\n * // Now ContextsApiClient is also initialized\n * const contexts = await admin.contexts.listContexts();\n * ```\n */\nexport class AdminApiClient {\n private readonly httpClient: HttpClient;\n\n // Lazy-initialized sub-clients\n private _public?: PublicApiClient;\n private _applications?: ApplicationsApiClient;\n private _contexts?: ContextsApiClient;\n private _proposals?: ProposalsApiClient;\n private _capabilities?: CapabilitiesApiClient;\n private _identity?: IdentityApiClient;\n private _network?: NetworkApiClient;\n private _blobs?: BlobsApiClient;\n private _aliases?: AliasesApiClient;\n private _tee?: TeeApiClient;\n\n constructor(httpClient: HttpClient) {\n this.httpClient = httpClient;\n }\n\n /** Public endpoints (health checks, etc.) - no authentication required */\n get public(): PublicApiClient {\n if (!this._public) {\n this._public = new PublicApiClient(this.httpClient);\n }\n return this._public;\n }\n\n /** Application management (install, list, uninstall) */\n get applications(): ApplicationsApiClient {\n if (!this._applications) {\n this._applications = new ApplicationsApiClient(this.httpClient);\n }\n return this._applications;\n }\n\n /** Context management (create, list, join, leave) */\n get contexts(): ContextsApiClient {\n if (!this._contexts) {\n this._contexts = new ContextsApiClient(this.httpClient);\n }\n return this._contexts;\n }\n\n /** Proposal management for context governance */\n get proposals(): ProposalsApiClient {\n if (!this._proposals) {\n this._proposals = new ProposalsApiClient(this.httpClient);\n }\n return this._proposals;\n }\n\n /** Capability queries for feature detection */\n get capabilities(): CapabilitiesApiClient {\n if (!this._capabilities) {\n this._capabilities = new CapabilitiesApiClient(this.httpClient);\n }\n return this._capabilities;\n }\n\n /** Identity management (key generation, context identities) */\n get identity(): IdentityApiClient {\n if (!this._identity) {\n this._identity = new IdentityApiClient(this.httpClient);\n }\n return this._identity;\n }\n\n /** Network and peer management */\n get network(): NetworkApiClient {\n if (!this._network) {\n this._network = new NetworkApiClient(this.httpClient);\n }\n return this._network;\n }\n\n /** Blob storage (upload, list, delete binary data) */\n get blobs(): BlobsApiClient {\n if (!this._blobs) {\n this._blobs = new BlobsApiClient(this.httpClient);\n }\n return this._blobs;\n }\n\n /** Alias management for human-readable names */\n get aliases(): AliasesApiClient {\n if (!this._aliases) {\n this._aliases = new AliasesApiClient(this.httpClient);\n }\n return this._aliases;\n }\n\n /** TEE (Trusted Execution Environment) operations */\n get tee(): TeeApiClient {\n if (!this._tee) {\n this._tee = new TeeApiClient(this.httpClient);\n }\n return this._tee;\n }\n}\n", "import { HttpClient } from '../../http-client';\nimport { AdminApiClient } from './client';\n\nexport function createAdminApiClient(\n httpClient: HttpClient,\n): AdminApiClient {\n return new AdminApiClient(httpClient);\n}\n", "export { RpcClient, JsonRpcError } from './client';\nexport type {\n ExecuteParams,\n ExecuteResult,\n ExecutionRequest,\n ExecutionResult,\n JsonRpcError as JsonRpcErrorType,\n JsonRpcId,\n JsonRpcRequest,\n JsonRpcResponse,\n JsonRpcVersion,\n} from './types';\n", "/**\n * JSON-RPC Client\n *\n * Handles execution of queries and mutations on Calimero contexts\n * via the /jsonrpc endpoint.\n */\n\nimport { HttpClient } from '../../http-client';\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n ExecuteParams,\n ExecuteResult,\n JsonRpcId,\n} from './types';\n\n/**\n * Error thrown when JSON-RPC execution fails\n */\nexport class JsonRpcError extends Error {\n constructor(\n public readonly type: string,\n public readonly data?: string | Record<string, unknown>,\n public readonly requestId?: JsonRpcId,\n ) {\n const message =\n typeof data === 'string'\n ? data\n : data?.message\n ? String(data.message)\n : type;\n super(message);\n this.name = 'JsonRpcError';\n }\n}\n\n/**\n * JSON-RPC Client for executing queries and mutations\n */\nexport class RpcClient {\n private readonly path = '/jsonrpc';\n\n constructor(private httpClient: HttpClient) {}\n\n /**\n * Generate a random request ID\n */\n private generateRequestId(): number {\n return Math.floor(Math.random() * Math.pow(2, 32));\n }\n\n /**\n * Execute a method on a context\n *\n * @param params - Execution parameters\n * @returns The execution result\n * @throws JsonRpcError if execution fails\n *\n * @example\n * ```typescript\n * // Query (view) operation\n * const result = await rpc.execute({\n * contextId: 'ctx_123',\n * method: 'get',\n * args: { key: 'myKey' },\n * executorPublicKey: 'ed25519:...',\n * });\n * console.log(result.output); // \"myValue\"\n *\n * // Mutate operation\n * await rpc.execute({\n * contextId: 'ctx_123',\n * method: 'set',\n * args: { key: 'myKey', value: 'myValue' },\n * executorPublicKey: 'ed25519:...',\n * });\n * ```\n */\n async execute<T = unknown>(params: ExecuteParams): Promise<ExecuteResult<T>> {\n const requestId = this.generateRequestId();\n\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: requestId,\n method: 'execute',\n params: {\n contextId: params.contextId,\n method: params.method,\n argsJson: params.args,\n executorPublicKey: params.executorPublicKey,\n substitute: params.substitute ?? [],\n },\n };\n\n const response = await this.httpClient.post<JsonRpcResponse<T>>(\n this.path,\n request,\n );\n\n // Validate response ID matches request ID\n if (response.id !== requestId) {\n throw new JsonRpcError(\n 'MismatchedRequestIdError',\n `Expected request ID ${requestId}, got ${response.id}`,\n response.id,\n );\n }\n\n // Check for error response\n if (response.error) {\n throw new JsonRpcError(\n response.error.type,\n response.error.data,\n response.id,\n );\n }\n\n // Return result\n return response.result ?? { output: null };\n }\n\n /**\n * Execute a query (view) method - convenience wrapper\n *\n * @param contextId - Context ID\n * @param method - Method name\n * @param args - Method arguments\n * @param executorPublicKey - Executor's public key\n */\n async query<T = unknown>(\n contextId: string,\n method: string,\n args: Record<string, unknown>,\n executorPublicKey: string,\n ): Promise<T | null> {\n const result = await this.execute<T>({\n contextId,\n method,\n args,\n executorPublicKey,\n });\n return result.output;\n }\n\n /**\n * Execute a mutate method - convenience wrapper\n *\n * @param contextId - Context ID\n * @param method - Method name\n * @param args - Method arguments\n * @param executorPublicKey - Executor's public key\n */\n async mutate<T = unknown>(\n contextId: string,\n method: string,\n args: Record<string, unknown>,\n executorPublicKey: string,\n ): Promise<T | null> {\n const result = await this.execute<T>({\n contextId,\n method,\n args,\n executorPublicKey,\n });\n return result.output;\n }\n}\n", "export { WebSocketClient } from './client';\nexport type {\n WebSocketClientOptions,\n} from './client';\nexport type {\n SubscribeParams,\n UnsubscribeParams,\n WebSocketRequest,\n WebSocketResponse,\n WebSocketEvent,\n WebSocketEventHandler,\n WebSocketErrorHandler,\n WebSocketCloseHandler,\n} from './types';\n", "/**\n * WebSocket Client\n *\n * Real-time event subscriptions via WebSocket.\n * Events are pushed from server to client.\n * For queries/mutations, use the JSON-RPC endpoint.\n */\n\nimport type {\n WebSocketRequest,\n WebSocketResponse,\n WebSocketEvent,\n WebSocketEventHandler,\n WebSocketErrorHandler,\n WebSocketCloseHandler,\n} from './types';\n\nexport interface WebSocketClientOptions {\n /** Base URL (will be converted to ws:// or wss://) */\n baseUrl: string;\n /** Function to get current auth token */\n getAuthToken?: () => Promise<string | null>;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect delay in ms */\n reconnectDelay?: number;\n /** Max reconnect attempts */\n maxReconnectAttempts?: number;\n}\n\nexport class WebSocketClient {\n private ws: WebSocket | null = null;\n private options: Required<WebSocketClientOptions>;\n private requestId = 0;\n private pendingRequests = new Map<number, {\n resolve: (value: WebSocketResponse) => void;\n reject: (error: Error) => void;\n }>();\n private eventHandlers: WebSocketEventHandler[] = [];\n private errorHandlers: WebSocketErrorHandler[] = [];\n private closeHandlers: WebSocketCloseHandler[] = [];\n private reconnectAttempts = 0;\n private subscribedContexts = new Set<string>();\n\n constructor(options: WebSocketClientOptions) {\n this.options = {\n autoReconnect: true,\n reconnectDelay: 1000,\n maxReconnectAttempts: 5,\n getAuthToken: async () => null,\n ...options,\n };\n }\n\n /**\n * Connect to the WebSocket server\n */\n async connect(): Promise<void> {\n if (this.ws?.readyState === WebSocket.OPEN) {\n return;\n }\n\n const wsUrl = this.options.baseUrl\n .replace(/^http:/, 'ws:')\n .replace(/^https:/, 'wss:')\n .replace(/\\/$/, '') + '/ws';\n\n const token = await this.options.getAuthToken();\n\n return new Promise((resolve, reject) => {\n // Note: Browser WebSocket doesn't support custom headers\n // Token is passed via query param or subprotocol\n const url = token ? `${wsUrl}?token=${encodeURIComponent(token)}` : wsUrl;\n \n this.ws = new WebSocket(url);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n resolve();\n };\n\n this.ws.onerror = (_event) => {\n const error = new Error('WebSocket error');\n this.errorHandlers.forEach(h => h(error));\n reject(error);\n };\n\n this.ws.onclose = (event) => {\n this.closeHandlers.forEach(h => h(event.code, event.reason));\n this.handleDisconnect();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n });\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.options.autoReconnect = false;\n this.ws?.close();\n this.ws = null;\n this.subscribedContexts.clear();\n }\n\n /**\n * Subscribe to context events\n */\n async subscribe(contextIds: string[]): Promise<WebSocketResponse> {\n const response = await this.send({\n id: ++this.requestId,\n method: 'subscribe',\n params: { contextIds },\n });\n \n if (!response.error) {\n contextIds.forEach(id => this.subscribedContexts.add(id));\n }\n \n return response;\n }\n\n /**\n * Unsubscribe from context events\n */\n async unsubscribe(contextIds: string[]): Promise<WebSocketResponse> {\n const response = await this.send({\n id: ++this.requestId,\n method: 'unsubscribe',\n params: { contextIds },\n });\n \n if (!response.error) {\n contextIds.forEach(id => this.subscribedContexts.delete(id));\n }\n \n return response;\n }\n\n /**\n * Add event handler\n */\n onEvent(handler: WebSocketEventHandler): () => void {\n this.eventHandlers.push(handler);\n return () => {\n this.eventHandlers = this.eventHandlers.filter(h => h !== handler);\n };\n }\n\n /**\n * Add error handler\n */\n onError(handler: WebSocketErrorHandler): () => void {\n this.errorHandlers.push(handler);\n return () => {\n this.errorHandlers = this.errorHandlers.filter(h => h !== handler);\n };\n }\n\n /**\n * Add close handler\n */\n onClose(handler: WebSocketCloseHandler): () => void {\n this.closeHandlers.push(handler);\n return () => {\n this.closeHandlers = this.closeHandlers.filter(h => h !== handler);\n };\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get subscribed context IDs\n */\n getSubscribedContexts(): string[] {\n return Array.from(this.subscribedContexts);\n }\n\n private async send(request: WebSocketRequest): Promise<WebSocketResponse> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket not connected');\n }\n\n return new Promise((resolve, reject) => {\n const id = request.id;\n if (id !== null) {\n this.pendingRequests.set(id, { resolve, reject });\n }\n\n this.ws!.send(JSON.stringify(request));\n\n // Timeout after 30 seconds\n setTimeout(() => {\n if (id !== null && this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error('WebSocket request timeout'));\n }\n }, 30000);\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data);\n\n // Check if it's a response to a request\n if (message.id !== undefined && this.pendingRequests.has(message.id)) {\n const { resolve } = this.pendingRequests.get(message.id)!;\n this.pendingRequests.delete(message.id);\n resolve(message as WebSocketResponse);\n return;\n }\n\n // Otherwise it's an event\n const event: WebSocketEvent = {\n contextId: message.contextId || message.context_id,\n type: message.type || message.event,\n data: message.data || message.payload,\n };\n this.eventHandlers.forEach(h => h(event));\n } catch (error) {\n this.errorHandlers.forEach(h => h(error instanceof Error ? error : new Error(String(error))));\n }\n }\n\n private handleDisconnect(): void {\n if (!this.options.autoReconnect) {\n return;\n }\n\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n this.errorHandlers.forEach(h => h(new Error('Max reconnect attempts reached')));\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.options.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n setTimeout(async () => {\n try {\n await this.connect();\n // Resubscribe to previous contexts\n if (this.subscribedContexts.size > 0) {\n await this.subscribe(Array.from(this.subscribedContexts));\n }\n } catch {\n // Will retry via handleDisconnect\n }\n }, delay);\n }\n}\n", "export { SseClient } from './client';\nexport type { SseClientOptions } from './client';\nexport type {\n SseSubscriptionRequest,\n SseSubscriptionResponse,\n SseSessionResponse,\n SseEvent,\n SseEventHandler,\n SseErrorHandler,\n} from './types';\n", "/**\n * SSE Client\n *\n * Server-Sent Events for real-time event streaming.\n * Uses standard EventSource with manual subscription management.\n */\n\nimport type { HttpClient } from '../../http-client';\nimport type {\n SseSubscriptionRequest,\n SseSubscriptionResponse,\n SseSessionResponse,\n SseEvent,\n SseEventHandler,\n SseErrorHandler,\n} from './types';\n\nexport interface SseClientOptions {\n /** Base URL */\n baseUrl: string;\n /** HTTP client for subscription requests */\n httpClient: HttpClient;\n /** Function to get current auth token */\n getAuthToken?: () => Promise<string | null>;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect delay in ms */\n reconnectDelay?: number;\n}\n\nexport class SseClient {\n private eventSource: EventSource | null = null;\n private options: Required<SseClientOptions>;\n private sessionId: string | null = null;\n private eventHandlers: SseEventHandler[] = [];\n private errorHandlers: SseErrorHandler[] = [];\n private subscribedContexts = new Set<string>();\n // Track last event ID for reconnection (used for resumable streams)\n private _lastEventId: string | null = null;\n\n constructor(options: SseClientOptions) {\n this.options = {\n autoReconnect: true,\n reconnectDelay: 1000,\n getAuthToken: async () => null,\n ...options,\n };\n }\n\n /**\n * Connect to the SSE stream\n */\n async connect(): Promise<string> {\n if (this.eventSource) {\n throw new Error('Already connected');\n }\n\n const token = await this.options.getAuthToken();\n let url = `${this.options.baseUrl}/sse`;\n \n if (token) {\n url += `?token=${encodeURIComponent(token)}`;\n }\n\n return new Promise((resolve, reject) => {\n this.eventSource = new EventSource(url, {\n withCredentials: true,\n });\n\n // Handle connect event (first event with session_id)\n this.eventSource.addEventListener('connect', (event) => {\n const messageEvent = event as MessageEvent;\n try {\n // Session ID may be in data or as plain string\n const data = messageEvent.data;\n this.sessionId = typeof data === 'string' && data.startsWith('{') \n ? JSON.parse(data).session_id || JSON.parse(data).sessionId\n : data;\n resolve(this.sessionId!);\n } catch {\n this.sessionId = messageEvent.data;\n resolve(this.sessionId!);\n }\n });\n\n this.eventSource.onmessage = (event) => {\n this._lastEventId = event.lastEventId;\n try {\n const data = JSON.parse(event.data);\n const sseEvent: SseEvent = {\n id: event.lastEventId,\n event: 'message',\n data,\n };\n this.eventHandlers.forEach(h => h(sseEvent));\n } catch {\n // Non-JSON message\n const sseEvent: SseEvent = {\n id: event.lastEventId,\n event: 'message',\n data: event.data,\n };\n this.eventHandlers.forEach(h => h(sseEvent));\n }\n };\n\n this.eventSource.onerror = (_event) => {\n const error = new Error('SSE connection error');\n this.errorHandlers.forEach(h => h(error));\n \n if (this.eventSource?.readyState === EventSource.CLOSED) {\n this.handleDisconnect();\n if (!this.sessionId) {\n reject(error);\n }\n }\n };\n });\n }\n\n /**\n * Disconnect from the SSE stream\n */\n disconnect(): void {\n this.options.autoReconnect = false;\n this.eventSource?.close();\n this.eventSource = null;\n this.sessionId = null;\n this.subscribedContexts.clear();\n }\n\n /**\n * Subscribe to context events\n */\n async subscribe(contextIds: string[]): Promise<SseSubscriptionResponse> {\n if (!this.sessionId) {\n throw new Error('Not connected');\n }\n\n const request: SseSubscriptionRequest = {\n id: this.sessionId,\n method: 'subscribe',\n params: { contextIds },\n };\n\n const response = await this.options.httpClient.post<SseSubscriptionResponse>(\n '/sse/subscription',\n request,\n );\n\n if (!response.error) {\n contextIds.forEach(id => this.subscribedContexts.add(id));\n }\n\n return response;\n }\n\n /**\n * Unsubscribe from context events\n */\n async unsubscribe(contextIds: string[]): Promise<SseSubscriptionResponse> {\n if (!this.sessionId) {\n throw new Error('Not connected');\n }\n\n const request: SseSubscriptionRequest = {\n id: this.sessionId,\n method: 'unsubscribe',\n params: { contextIds },\n };\n\n const response = await this.options.httpClient.post<SseSubscriptionResponse>(\n '/sse/subscription',\n request,\n );\n\n if (!response.error) {\n contextIds.forEach(id => this.subscribedContexts.delete(id));\n }\n\n return response;\n }\n\n /**\n * Get session information\n */\n async getSession(): Promise<SseSessionResponse> {\n if (!this.sessionId) {\n throw new Error('Not connected');\n }\n\n return this.options.httpClient.get<SseSessionResponse>(\n `/sse/session/${this.sessionId}`,\n );\n }\n\n /**\n * Add event handler\n */\n onEvent(handler: SseEventHandler): () => void {\n this.eventHandlers.push(handler);\n return () => {\n this.eventHandlers = this.eventHandlers.filter(h => h !== handler);\n };\n }\n\n /**\n * Add error handler\n */\n onError(handler: SseErrorHandler): () => void {\n this.errorHandlers.push(handler);\n return () => {\n this.errorHandlers = this.errorHandlers.filter(h => h !== handler);\n };\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.eventSource?.readyState === EventSource.OPEN;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n /**\n * Get subscribed context IDs\n */\n getSubscribedContexts(): string[] {\n return Array.from(this.subscribedContexts);\n }\n\n /**\n * Get the last event ID (useful for resumable connections)\n */\n getLastEventId(): string | null {\n return this._lastEventId;\n }\n\n private handleDisconnect(): void {\n if (!this.options.autoReconnect) {\n return;\n }\n\n setTimeout(async () => {\n try {\n await this.connect();\n // Resubscribe to previous contexts\n if (this.subscribedContexts.size > 0) {\n await this.subscribe(Array.from(this.subscribedContexts));\n }\n } catch {\n // Will retry via handleDisconnect on next error\n }\n }, this.options.reconnectDelay);\n }\n}\n", "import { createBrowserHttpClient } from './http-client';\nimport { createAuthApiClient } from './api/auth';\nimport { createAdminApiClient } from './api/admin';\nimport { RpcClient } from './api/rpc';\nimport { WebSocketClient } from './api/ws';\nimport { SseClient } from './api/sse';\nimport type { AuthApiClient } from './api/auth';\nimport type { AdminApiClient } from './api/admin';\nimport type { HttpClient } from './http-client';\nimport type { WebSocketClientOptions } from './api/ws';\nimport type { SseClientOptions } from './api/sse';\n\nexport interface MeroJsConfig {\n /** Base URL for the Calimero node */\n baseUrl: string;\n /** Auth service base URL (for proxied mode). If not specified, uses baseUrl (embedded mode) */\n authBaseUrl?: string;\n /** Initial credentials for authentication */\n credentials?: {\n username: string;\n password: string;\n };\n /** Custom HTTP client timeout in milliseconds */\n timeoutMs?: number;\n /** Request credentials mode for fetch (omit, same-origin, include) */\n requestCredentials?: RequestCredentials;\n /**\n * Optional token storage for persistence across sessions.\n * If not provided, tokens are stored in-memory only.\n * \n * @example Browser localStorage\n * ```typescript\n * const mero = new MeroJs({\n * baseUrl: 'http://localhost:3000',\n * tokenStorage: {\n * async get() {\n * const data = localStorage.getItem('mero-token');\n * return data ? JSON.parse(data) : null;\n * },\n * async set(token) {\n * localStorage.setItem('mero-token', JSON.stringify(token));\n * },\n * async clear() {\n * localStorage.removeItem('mero-token');\n * },\n * },\n * });\n * ```\n * \n * @example React Native AsyncStorage\n * ```typescript\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * \n * const mero = new MeroJs({\n * baseUrl: 'http://localhost:3000',\n * tokenStorage: {\n * async get() {\n * const data = await AsyncStorage.getItem('mero-token');\n * return data ? JSON.parse(data) : null;\n * },\n * async set(token) {\n * await AsyncStorage.setItem('mero-token', JSON.stringify(token));\n * },\n * async clear() {\n * await AsyncStorage.removeItem('mero-token');\n * },\n * },\n * });\n * ```\n */\n tokenStorage?: TokenStorage;\n}\n\n/**\n * Interface for custom token storage implementations.\n * Allows persistence of tokens across sessions in any environment.\n */\nexport interface TokenStorage {\n /** Get the stored token data */\n get(): Promise<TokenData | null>;\n /** Store the token data */\n set(token: TokenData): Promise<void>;\n /** Clear the stored token data */\n clear(): Promise<void>;\n}\n\nexport interface TokenData {\n access_token: string;\n refresh_token: string;\n expires_at: number;\n}\n\n/**\n * Main MeroJs SDK class that manages all API clients and authentication\n */\nexport class MeroJs {\n private config: MeroJsConfig;\n private httpClient: HttpClient;\n private authClient: AuthApiClient;\n private adminClient: AdminApiClient;\n private rpcClient: RpcClient;\n private tokenData: TokenData | null = null;\n private refreshPromise: Promise<TokenData> | null = null;\n private tokenStorage: TokenStorage | null = null;\n\n constructor(config: MeroJsConfig) {\n this.config = {\n timeoutMs: 10000,\n ...config,\n };\n\n this.tokenStorage = config.tokenStorage || null;\n\n // Create HTTP client with token management\n // For Tauri, explicitly set credentials to 'omit' to avoid network errors\n const isTauri = typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;\n \n // Determine auth base URL and whether we need separate HTTP clients\n const authBaseUrl = this.config.authBaseUrl ?? this.config.baseUrl;\n const isEmbedded = authBaseUrl === this.config.baseUrl;\n \n // Create admin HTTP client (always uses baseUrl) with automatic 401 refresh\n this.httpClient = createBrowserHttpClient({\n baseUrl: this.config.baseUrl,\n getAuthToken: async () => {\n const token = await this.getValidToken();\n return token?.access_token || '';\n },\n // Wire up automatic token refresh on 401\n refreshToken: async () => {\n const refreshed = await this.performTokenRefresh();\n return refreshed.access_token;\n },\n onTokenRefresh: async (_newToken: string) => {\n // Token is already updated in performTokenRefresh, but we need\n // to ensure storage is updated if provided\n if (this.tokenData && this.tokenStorage) {\n await this.tokenStorage.set(this.tokenData);\n }\n },\n timeoutMs: this.config.timeoutMs,\n credentials: this.config.requestCredentials ?? (isTauri ? 'omit' : undefined),\n });\n\n // Create auth HTTP client (uses authBaseUrl when different from baseUrl)\n // IMPORTANT: Auth client does NOT have refreshToken wired up to prevent infinite loops\n // when the refresh endpoint itself returns 401\n const authHttpClient = createBrowserHttpClient({\n baseUrl: authBaseUrl,\n getAuthToken: async () => {\n const token = await this.getValidToken();\n return token?.access_token || '';\n },\n // NO refreshToken callback - auth endpoints handle their own auth\n // Wiring refreshToken here would cause infinite loops when refresh fails\n timeoutMs: this.config.timeoutMs,\n credentials: this.config.requestCredentials ?? (isTauri ? 'omit' : undefined),\n });\n\n // Create API clients\n this.authClient = createAuthApiClient(authHttpClient, {\n baseUrl: authBaseUrl,\n embedded: isEmbedded,\n });\n\n this.adminClient = createAdminApiClient(this.httpClient);\n \n // Create RPC client for executing queries/mutations\n this.rpcClient = new RpcClient(this.httpClient);\n\n // Token management is in-memory by default, or uses provided storage\n }\n\n /**\n * Initialize the SDK by loading tokens from storage (if provided).\n * Call this after construction if using tokenStorage.\n * \n * @example\n * ```typescript\n * const mero = new MeroJs({ baseUrl: '...', tokenStorage: myStorage });\n * await mero.init(); // Load stored tokens\n * \n * if (!mero.isAuthenticated()) {\n * await mero.authenticate({ username: '...', password: '...' });\n * }\n * ```\n */\n async init(): Promise<void> {\n console.log('[mero-js] init() called, tokenStorage:', this.tokenStorage ? 'EXISTS' : 'NULL');\n if (this.tokenStorage) {\n const storedToken = await this.tokenStorage.get();\n console.log('[mero-js] init() storedToken:', storedToken ? 'LOADED' : 'NULL');\n if (storedToken) {\n this.tokenData = storedToken;\n console.log('[mero-js] init() tokenData set, expires_at:', storedToken.expires_at);\n }\n } else {\n console.log('[mero-js] init() no tokenStorage configured');\n }\n }\n\n /**\n * Get the Auth API client\n */\n get auth(): AuthApiClient {\n return this.authClient;\n }\n\n /**\n * Get the Admin API client\n */\n get admin(): AdminApiClient {\n return this.adminClient;\n }\n\n /**\n * Get the RPC client for executing queries and mutations\n *\n * @example\n * ```typescript\n * // Execute a query\n * const result = await meroJs.rpc.query(\n * 'context-id',\n * 'get',\n * { key: 'myKey' },\n * 'ed25519:executor-public-key'\n * );\n *\n * // Execute a mutation\n * await meroJs.rpc.mutate(\n * 'context-id',\n * 'set',\n * { key: 'myKey', value: 'myValue' },\n * 'ed25519:executor-public-key'\n * );\n *\n * // Or use the generic execute method\n * const result = await meroJs.rpc.execute({\n * contextId: 'context-id',\n * method: 'set',\n * args: { key: 'myKey', value: 'myValue' },\n * executorPublicKey: 'ed25519:...',\n * });\n * ```\n */\n get rpc(): RpcClient {\n return this.rpcClient;\n }\n\n /**\n * Authenticate with the provided credentials\n * This will create the root key on first use\n */\n async authenticate(credentials?: {\n username: string;\n password: string;\n }): Promise<TokenData> {\n const creds = credentials || this.config.credentials;\n if (!creds) {\n throw new Error('No credentials provided for authentication');\n }\n\n try {\n // Note: Auth API expects snake_case, not camelCase (despite OpenAPI spec showing camelCase)\n const requestBody = {\n auth_method: 'user_password' as const,\n public_key: creds.username,\n client_name: 'mero-js-sdk',\n permissions: ['admin'],\n timestamp: Math.floor(Date.now() / 1000),\n provider_data: {\n username: creds.username,\n password: creds.password,\n },\n };\n\n const response = await this.authClient.getToken(requestBody);\n\n // Extract expiry from JWT (more reliable than response.expires_in)\n let expiresAt: number;\n try {\n const payload = JSON.parse(atob(response.access_token.split('.')[1]));\n expiresAt = payload.exp * 1000; // JWT exp is in seconds, convert to ms\n console.log('[mero-js] Extracted exp from JWT:', payload.exp, '-> expires_at:', expiresAt);\n } catch (e) {\n // Fallback to response.expires_in if JWT parsing fails\n expiresAt = Date.now() + (response.expires_in || 3600) * 1000;\n console.warn('[mero-js] Failed to parse JWT, using expires_in fallback:', expiresAt);\n }\n\n this.tokenData = {\n access_token: response.access_token,\n refresh_token: response.refresh_token,\n expires_at: expiresAt,\n };\n\n // Persist to storage if provided\n if (this.tokenStorage) {\n await this.tokenStorage.set(this.tokenData);\n }\n\n return this.tokenData;\n } catch (error: unknown) {\n // Include HTTP error details if available\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const httpStatus =\n error && typeof error === 'object' && 'status' in error\n ? `HTTP ${String(error.status)}`\n : '';\n const httpStatusText =\n error && typeof error === 'object' && 'statusText' in error\n ? ` ${String(error.statusText)}`\n : '';\n const bodyText =\n error && typeof error === 'object' && 'bodyText' in error\n ? `: ${String(error.bodyText)}`\n : '';\n\n throw new Error(\n `Authentication failed: ${httpStatus}${httpStatusText}${bodyText || errorMessage}`,\n );\n }\n }\n\n /**\n * Get a valid token, refreshing if necessary.\n * This is called automatically by the HTTP client.\n * \n * Note: The HTTP client also handles 401 errors with automatic refresh,\n * so this preemptive check is an optimization to avoid unnecessary 401s.\n */\n private async getValidToken(): Promise<TokenData | null> {\n console.log('[mero-js] getValidToken called, tokenData:', this.tokenData ? 'EXISTS' : 'NULL');\n if (!this.tokenData) {\n console.log('[mero-js] No tokenData, returning null');\n return null;\n }\n\n // Check if token is actually expired\n const now = Date.now();\n const expiresAt = this.tokenData.expires_at;\n const isExpired = now >= expiresAt;\n console.log('[mero-js] Token check: now=', now, 'expires_at=', expiresAt, 'isExpired=', isExpired);\n \n if (isExpired) {\n console.log('[mero-js] Token expired, attempting preemptive refresh');\n return await this.refreshToken();\n }\n\n console.log('[mero-js] Token valid, returning tokenData');\n return this.tokenData;\n }\n\n /**\n * Refresh the access token using the refresh token.\n * Called automatically when token is about to expire or on 401.\n * \n * @deprecated Use performTokenRefresh instead - this is kept for compatibility\n */\n private async refreshToken(): Promise<TokenData> {\n return this.performTokenRefresh();\n }\n\n /**\n * Perform the actual token refresh.\n * This is used by both preemptive refresh and HTTP client's 401 handler.\n * \n * Uses a shared promise to prevent multiple simultaneous refresh attempts,\n * even when called from multiple sources (preemptive check, HTTP 401 handler, etc.)\n */\n private async performTokenRefresh(): Promise<TokenData> {\n // Prevent multiple simultaneous refresh attempts\n // This is critical for avoiding 100+ refresh requests when multiple 401s come in\n if (this.refreshPromise) {\n console.log('[mero-js] Refresh already in progress, waiting for existing promise');\n return this.refreshPromise;\n }\n\n console.log('[mero-js] Starting new refresh attempt');\n this.refreshPromise = this.doTokenRefresh();\n\n try {\n const newToken = await this.refreshPromise;\n return newToken;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n /**\n * Internal: Actually perform the refresh request.\n * Called only from performTokenRefresh() which manages the deduplication.\n */\n private async doTokenRefresh(): Promise<TokenData> {\n console.log('[mero-js doTokenRefresh] STARTING refresh...');\n console.log('[mero-js doTokenRefresh] tokenData exists:', !!this.tokenData);\n console.log('[mero-js doTokenRefresh] access_token exists:', !!this.tokenData?.access_token);\n console.log('[mero-js doTokenRefresh] refresh_token exists:', !!this.tokenData?.refresh_token);\n \n if (!this.tokenData?.refresh_token) {\n throw new Error('No refresh token available');\n }\n \n if (!this.tokenData?.access_token) {\n throw new Error('No access token available for refresh (server requires both tokens)');\n }\n\n try {\n // Server requires BOTH access_token and refresh_token (snake_case)\n const refreshPayload = {\n access_token: this.tokenData.access_token,\n refresh_token: this.tokenData.refresh_token,\n };\n console.log('[mero-js doTokenRefresh] Payload keys:', Object.keys(refreshPayload));\n console.log('[mero-js doTokenRefresh] access_token length:', refreshPayload.access_token?.length);\n console.log('[mero-js doTokenRefresh] refresh_token length:', refreshPayload.refresh_token?.length);\n const response = await this.authClient.refreshToken(refreshPayload);\n\n // Extract expiry from JWT (more reliable than response.expires_in)\n let expiresAt: number;\n try {\n const payload = JSON.parse(atob(response.access_token.split('.')[1]));\n expiresAt = payload.exp * 1000; // JWT exp is in seconds, convert to ms\n console.log('[mero-js] Extracted exp from JWT:', payload.exp, '-> expires_at:', expiresAt);\n } catch (e) {\n // Fallback to response.expires_in if JWT parsing fails\n expiresAt = Date.now() + (response.expires_in || 3600) * 1000;\n console.warn('[mero-js] Failed to parse JWT, using expires_in fallback:', expiresAt);\n }\n\n this.tokenData = {\n access_token: response.access_token,\n refresh_token: response.refresh_token,\n expires_at: expiresAt,\n };\n\n // Persist to storage if provided\n if (this.tokenStorage) {\n await this.tokenStorage.set(this.tokenData);\n }\n\n return this.tokenData;\n } catch (error) {\n console.error('[mero-js] Token refresh failed:', error);\n \n // Check if it's an HTTP error with status code\n const httpError = error as { status?: number; body?: string; message?: string };\n const status = httpError?.status;\n const errorBody = httpError?.body || httpError?.message || '';\n \n if (status) {\n console.error('[mero-js] Refresh error status:', status);\n console.error('[mero-js] Refresh error body:', errorBody);\n }\n \n // Special case: server says \"Access token still valid\"\n // This means the token IS valid but some other endpoint returned 401\n // Don't clear tokens, don't retry - something else is wrong\n if (errorBody.includes('still valid') || errorBody.includes('token valid')) {\n console.warn('[mero-js] Server says token is still valid - NOT clearing tokens');\n console.warn('[mero-js] This usually means the 401 came from a different issue (wrong endpoint, missing header, etc.)');\n // Create a special error that the HTTP client won't retry\n const tokenValidError = new Error('Token is valid but request failed. Check Authorization header.');\n (tokenValidError as any).tokenStillValid = true;\n throw tokenValidError;\n }\n \n // On ANY 4XX error, tokens are invalid - clear them and require re-auth\n // This handles: 400 (bad request), 401 (unauthorized), 403 (forbidden), etc.\n if (status && status >= 400 && status < 500) {\n console.warn('[mero-js] Refresh failed with 4XX - clearing tokens, user must re-authenticate');\n await this.clearToken();\n throw new Error(`Session expired. Please log in again. (${status})`);\n }\n \n // On 5XX errors, don't clear tokens - might be transient server issue\n // User can retry later\n if (status && status >= 500) {\n console.warn('[mero-js] Refresh failed with 5XX - server error, keeping tokens');\n throw new Error(`Server error during refresh. Please try again later. (${status})`);\n }\n \n // Unknown error - clear tokens to be safe\n console.warn('[mero-js] Refresh failed with unknown error - clearing tokens');\n await this.clearToken();\n throw new Error(\n `Token refresh failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n\n /**\n * Clear the current token from memory and storage\n */\n public async clearToken(): Promise<void> {\n this.tokenData = null;\n if (this.tokenStorage) {\n await this.tokenStorage.clear();\n }\n }\n\n /**\n * Check if the SDK is authenticated\n */\n public isAuthenticated(): boolean {\n return this.tokenData !== null;\n }\n\n /**\n * Get the current token data (for debugging)\n */\n public getTokenData(): TokenData | null {\n return this.tokenData;\n }\n\n /**\n * Manually set the token data.\n * Use this when handling authentication externally (e.g., OAuth flows).\n * \n * @param tokenData - The token data to set, or null to clear\n * @example\n * ```typescript\n * // After receiving tokens from external auth flow\n * await meroJs.setToken({\n * access_token: 'eyJ...',\n * refresh_token: 'eyJ...',\n * expires_at: Date.now() + 3600000,\n * });\n * ```\n */\n public async setToken(tokenData: TokenData | null): Promise<void> {\n this.tokenData = tokenData;\n if (this.tokenStorage) {\n if (tokenData) {\n await this.tokenStorage.set(tokenData);\n } else {\n await this.tokenStorage.clear();\n }\n }\n }\n\n /**\n * Create a WebSocket client for real-time event subscriptions\n *\n * @param options - Optional WebSocket client options to override defaults\n * @returns A new WebSocketClient instance\n *\n * @example\n * ```typescript\n * const ws = meroJs.createWebSocket();\n * await ws.connect();\n *\n * ws.onEvent((event) => {\n * console.log('Received event:', event);\n * });\n *\n * await ws.subscribe(['context-id-1', 'context-id-2']);\n *\n * // Later...\n * ws.disconnect();\n * ```\n */\n public createWebSocket(\n options?: Partial<Omit<WebSocketClientOptions, 'baseUrl' | 'getAuthToken'>>,\n ): WebSocketClient {\n return new WebSocketClient({\n baseUrl: this.config.baseUrl,\n getAuthToken: async () => this.tokenData?.access_token || null,\n ...options,\n });\n }\n\n /**\n * Create an SSE client for server-sent event streaming\n *\n * @param options - Optional SSE client options to override defaults\n * @returns A new SseClient instance\n *\n * @example\n * ```typescript\n * const sse = meroJs.createSse();\n * const sessionId = await sse.connect();\n *\n * sse.onEvent((event) => {\n * console.log('Received event:', event);\n * });\n *\n * await sse.subscribe(['context-id-1', 'context-id-2']);\n *\n * // Get session info\n * const session = await sse.getSession();\n *\n * // Later...\n * sse.disconnect();\n * ```\n */\n public createSse(\n options?: Partial<Omit<SseClientOptions, 'baseUrl' | 'httpClient' | 'getAuthToken'>>,\n ): SseClient {\n return new SseClient({\n baseUrl: this.config.baseUrl,\n httpClient: this.httpClient,\n getAuthToken: async () => this.tokenData?.access_token || null,\n ...options,\n });\n }\n}\n\n/**\n * Create a new MeroJs SDK instance\n */\nexport function createMeroJs(config: MeroJsConfig): MeroJs {\n return new MeroJs(config);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../src/http-client/signal-utils.ts", "../src/http-client/web-client.ts", "../src/http-client/http-factory.ts", "../src/http-client/retry.ts", "../src/auth-api/auth-client.ts", "../src/auth-api/auth-factory.ts", "../src/admin-api/admin-client.ts", "../src/admin-api/admin-factory.ts", "../src/auth/index.ts", "../src/rpc/index.ts", "../src/events/sse.ts", "../src/events/ws.ts", "../src/mero-js.ts", "../src/token-store/index.ts", "../src/cloud/cloud-client.ts"],
|
|
4
|
+
"sourcesContent": ["// Utility for combining multiple AbortSignals\nexport function combineSignals(\n signals: Array<AbortSignal | undefined>,\n): AbortSignal | undefined {\n const list = signals.filter(Boolean) as AbortSignal[];\n if (list.length === 0) return undefined;\n\n // Prefer native any(), but fall back if unavailable or it throws\n const AbortSignalAny = AbortSignal as {\n any?: (signals: AbortSignal[]) => AbortSignal;\n };\n if (typeof AbortSignalAny.any === 'function') {\n try {\n return AbortSignalAny.any(list);\n } catch {\n // Fall through to manual implementation\n }\n }\n\n const controller = new AbortController();\n const onAbort = (evt: Event) => {\n controller.abort((evt.target as AbortSignal).reason);\n for (const s of list) s.removeEventListener('abort', onAbort);\n };\n\n for (const s of list) {\n if (s.aborted) return AbortSignal.abort(s.reason);\n s.addEventListener('abort', onAbort, { once: true });\n }\n\n return controller.signal;\n}\n\n// Helper to create a timeout signal\nexport function createTimeoutSignal(timeoutMs: number): AbortSignal {\n // Use AbortSignal.timeout if available (Node 18.17+, modern browsers)\n if (typeof AbortSignal.timeout === 'function') {\n return AbortSignal.timeout(timeoutMs);\n }\n\n // Fallback for older environments\n const controller = new AbortController();\n setTimeout(() => {\n controller.abort(new DOMException('Timeout', 'TimeoutError'));\n }, timeoutMs);\n\n return controller.signal;\n}\n", "// ErrorResponse import removed as it's not used\nimport {\n HttpClient,\n Transport,\n RequestOptions,\n ResponseParser,\n} from './http-types';\nimport { combineSignals, createTimeoutSignal } from './signal-utils';\n\n// Custom error class for HTTP errors\nexport class HTTPError extends Error {\n name = 'HTTPError' as const;\n\n constructor(\n public status: number,\n public statusText: string,\n public url: string,\n public headers: Headers,\n public bodyText?: string, // cap at ~64KB\n ) {\n super(`HTTP ${status} ${statusText}`);\n }\n\n toJSON(): {\n status: number;\n statusText: string;\n url: string;\n headers: Record<string, string>;\n bodyText?: string;\n } {\n return {\n status: this.status,\n statusText: this.statusText,\n url: this.url,\n headers: headersToRecord(this.headers),\n bodyText: this.bodyText,\n };\n }\n}\n\n// Helper function to convert Headers to Record\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const record: Record<string, string> = {};\n headers.forEach((value, key) => {\n record[key] = value;\n });\n return record;\n}\n\n// Web Standards HTTP client implementation\nexport class WebHttpClient implements HttpClient {\n // Cache for concurrent refresh token calls to prevent race conditions\n private refreshTokenPromise: Promise<string> | null = null;\n // Cache for concurrent onTokenRefresh calls to prevent duplicate callbacks\n private onTokenRefreshPromise: Promise<void> | null = null;\n \n constructor(private transport: Transport) {}\n\n async get<T>(path: string, init?: RequestOptions): Promise<T> {\n return this.request<T>(path, { ...init, method: 'GET' });\n }\n\n async post<T>(\n path: string,\n body?: unknown,\n init?: RequestOptions,\n ): Promise<T> {\n return this.request<T>(path, {\n ...init,\n method: 'POST',\n body: body ? JSON.stringify(body) : undefined,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n\n async put<T>(\n path: string,\n body?: unknown,\n init?: RequestOptions,\n ): Promise<T> {\n return this.request<T>(path, {\n ...init,\n method: 'PUT',\n body: body ? JSON.stringify(body) : undefined,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n\n async delete<T>(path: string, init?: RequestOptions): Promise<T> {\n return this.request<T>(path, { ...init, method: 'DELETE' });\n }\n\n async patch<T>(\n path: string,\n body?: unknown,\n init?: RequestOptions,\n ): Promise<T> {\n return this.request<T>(path, {\n ...init,\n method: 'PATCH',\n body: body ? JSON.stringify(body) : undefined,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n\n async head(\n path: string,\n init?: RequestOptions,\n ): Promise<{ headers: Record<string, string>; status: number }> {\n const response = await this.makeRequest<Response>(path, {\n ...init,\n method: 'HEAD',\n parse: 'response',\n });\n return {\n headers: headersToRecord(response.headers),\n status: response.status,\n };\n }\n\n async request<T>(path: string, init?: RequestOptions): Promise<T> {\n return this.makeRequest<T>(path, init);\n }\n\n private async makeRequest<T>(\n path: string,\n init?: RequestOptions,\n retryCount = 0,\n requestStartTime?: number,\n ): Promise<T> {\n // Maximum retry attempts to prevent infinite loops\n const MAX_RETRY_ATTEMPTS = 1;\n const url = this.buildUrl(path);\n \n // Track request start time for timeout calculation (only on first attempt)\n // Use per-request start time to avoid corruption from concurrent requests\n const startTime = requestStartTime ?? Date.now();\n // Note: Tauri proxy script now handles AbortSignal, so we can use full RequestInit\n // Removed Tauri-specific minimal path - proxy script handles AbortSignal properly\n const signal = this.createAbortSignal(init);\n const headers = await this.buildHeaders(init?.headers);\n let headersObj: Record<string, string>;\n if (headers instanceof Headers) {\n headersObj = {};\n headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n } else {\n headersObj = headers;\n }\n \n const requestInit: RequestInit = {\n method: init?.method || 'GET',\n headers: headersObj,\n };\n \n // Check if body is a stream (ReadableStream) that can't be reused\n // Note: Blob is reusable, so it's not included here\n const isStreamBody = init?.body instanceof ReadableStream ||\n (typeof init?.body === 'object' && init?.body !== null && 'getReader' in init.body && !(init.body instanceof Blob));\n \n if (init?.body !== undefined && !isStreamBody) {\n requestInit.body = init.body;\n } else if (init?.body !== undefined && isStreamBody && retryCount === 0) {\n // Only include stream body on first attempt - can't retry with streams\n requestInit.body = init.body;\n }\n \n // For retries, calculate remaining timeout to prevent timeout reset\n // Track elapsed time and use remaining timeout for retry\n // Note: This is calculated before the request, so it doesn't include token refresh time\n // The actual remaining timeout check happens after token refresh completes\n let retrySignal: AbortSignal | undefined;\n if (retryCount > 0 && requestStartTime !== undefined) {\n const timeoutMs = init?.timeoutMs || this.transport.timeoutMs;\n if (timeoutMs) {\n // Calculate elapsed time (will be recalculated after token refresh if needed)\n const elapsed = Date.now() - startTime;\n const remaining = Math.max(0, timeoutMs - elapsed);\n // Create signal with remaining timeout, preserving user's signal\n retrySignal = this.createAbortSignal({ ...init, timeoutMs: remaining });\n } else {\n // No timeout, just preserve user's signal\n retrySignal = this.createAbortSignal(init);\n }\n } else {\n retrySignal = signal;\n }\n \n if (retrySignal) {\n requestInit.signal = retrySignal;\n }\n \n if (this.transport.credentials !== undefined) {\n requestInit.credentials = this.transport.credentials;\n }\n \n if (init?.mode !== undefined) {\n requestInit.mode = init.mode;\n }\n if (init?.cache !== undefined) {\n requestInit.cache = init.cache;\n }\n if (init?.redirect !== undefined) {\n requestInit.redirect = init.redirect;\n }\n if (init?.referrer !== undefined) {\n requestInit.referrer = init.referrer;\n }\n if (init?.referrerPolicy !== undefined) {\n requestInit.referrerPolicy = init.referrerPolicy;\n }\n if (init?.integrity !== undefined) {\n requestInit.integrity = init.integrity;\n }\n if (init?.keepalive !== undefined) {\n requestInit.keepalive = init.keepalive;\n }\n\n try {\n const response = await this.transport.fetch(url, requestInit);\n\n if (!response.ok) {\n const bodyText = await this.getBodyText(response);\n const httpError = new HTTPError(\n response.status,\n response.statusText,\n url,\n response.headers,\n bodyText,\n );\n\n // Handle 401 with token_expired - attempt automatic token refresh\n const userAborted = init?.signal?.aborted === true;\n if (\n response.status === 401 &&\n this.transport.refreshToken &&\n response.headers.get('x-auth-error') === 'token_expired' &&\n retryCount < MAX_RETRY_ATTEMPTS &&\n !isStreamBody &&\n !userAborted\n ) {\n try {\n // Use cached refresh promise if one is in progress (prevents race conditions)\n let refreshPromise = this.refreshTokenPromise;\n if (!refreshPromise) {\n refreshPromise = this.transport.refreshToken();\n this.refreshTokenPromise = refreshPromise;\n }\n \n // Attempt to refresh the token\n const newToken = await refreshPromise;\n \n // Validate token - must be non-empty\n if (!newToken || newToken.trim() === '') {\n // Clear caches on error\n this.refreshTokenPromise = null;\n this.onTokenRefreshPromise = null;\n throw new Error('Refresh token returned empty token');\n }\n \n // onTokenRefresh is required when refreshToken is provided\n // Without it, the new token cannot be stored and getAuthToken() will return the old token\n if (!this.transport.onTokenRefresh) {\n // Clear caches on error\n this.refreshTokenPromise = null;\n this.onTokenRefreshPromise = null;\n throw new Error(\n 'onTokenRefresh callback is required when refreshToken is provided. ' +\n 'The callback must update the token storage so getAuthToken() returns the new token.'\n );\n }\n \n // Use cached onTokenRefresh promise if one is in progress (prevents duplicate callbacks)\n // This ensures onTokenRefresh is only called once per token refresh, even with concurrent requests\n let onTokenRefreshPromise = this.onTokenRefreshPromise;\n if (!onTokenRefreshPromise) {\n onTokenRefreshPromise = this.transport.onTokenRefresh(newToken);\n this.onTokenRefreshPromise = onTokenRefreshPromise;\n }\n \n // Update token via callback (only called once per refresh, even with concurrent requests)\n // Errors from onTokenRefresh callback should be preserved (don't mask as 401)\n // This helps developers debug token storage issues\n await onTokenRefreshPromise;\n \n // Clear caches after both refresh and callback complete\n this.refreshTokenPromise = null;\n this.onTokenRefreshPromise = null;\n \n // Check if timeout has expired during token refresh\n // If so, throw the original 401 error instead of retrying with 0ms timeout\n // This prevents timeout/abort errors that obscure the root cause (expired token)\n const timeoutMs = init?.timeoutMs || this.transport.timeoutMs;\n if (timeoutMs && requestStartTime !== undefined) {\n const elapsed = Date.now() - startTime;\n const remaining = timeoutMs - elapsed;\n if (remaining <= 0) {\n // Timeout expired during token refresh - throw original 401 error\n // This is better than retrying with 0ms timeout which would cause confusing timeout errors\n throw httpError;\n }\n }\n \n // Retry the request with the new token (increment retry count)\n // Preserve user's abort signal and start time in retry\n return this.makeRequest<T>(path, init, retryCount + 1, startTime);\n } catch (refreshError) {\n // Clear caches on error\n this.refreshTokenPromise = null;\n this.onTokenRefreshPromise = null;\n // Configuration errors (missing onTokenRefresh) should be thrown as-is\n if (refreshError instanceof Error && refreshError.message.includes('onTokenRefresh')) {\n throw refreshError;\n }\n // Errors from onTokenRefresh callback are already thrown above, so if we get here,\n // it's either a refreshToken() failure or empty token - throw original 401\n // This matches the PR description: \"If refresh fails, throws the original 401 error\"\n throw httpError;\n }\n }\n\n throw httpError;\n }\n\n return this.parseResponse<T>(response, init?.parse);\n } catch (error) {\n if (error instanceof HTTPError) {\n throw error;\n }\n // Preserve configuration errors (like missing onTokenRefresh)\n if (error instanceof Error && error.message.includes('onTokenRefresh')) {\n throw error;\n }\n throw new HTTPError(\n 0,\n 'Network Error',\n url,\n new Headers(),\n error instanceof Error ? error.message : 'Unknown error',\n );\n }\n }\n\n private buildUrl(path: string): string {\n // Handle absolute URLs\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n }\n\n // Handle baseUrl with path\n const baseUrl = this.transport.baseUrl;\n if (path.startsWith('/')) {\n // If path starts with /, combine with baseUrl\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return `${base}${path}`;\n } else {\n // If path doesn't start with /, append to baseUrl\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n return `${base}${path}`;\n }\n }\n\n private createAbortSignal(init?: RequestOptions): AbortSignal | undefined {\n const signals: AbortSignal[] = [];\n\n if (this.transport.defaultAbortSignal) {\n signals.push(this.transport.defaultAbortSignal);\n }\n\n if (init?.signal) {\n signals.push(init.signal);\n }\n\n const timeoutMs = init?.timeoutMs || this.transport.timeoutMs;\n if (timeoutMs) {\n signals.push(createTimeoutSignal(timeoutMs));\n }\n\n return signals.length > 0 ? combineSignals(signals) : undefined;\n }\n\n private async buildHeaders(\n initHeaders?: HeadersInit,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n ...this.transport.defaultHeaders,\n };\n\n // Add auth token if available and not empty\n if (this.transport.getAuthToken) {\n try {\n const token = await this.transport.getAuthToken();\n if (token && token.trim() !== '') {\n headers.Authorization = `Bearer ${token}`;\n }\n } catch (error) {\n // Ignore auth token errors\n }\n }\n\n // Add init headers\n if (initHeaders) {\n if (initHeaders instanceof Headers) {\n initHeaders.forEach((value, key) => {\n headers[key] = value;\n });\n } else if (Array.isArray(initHeaders)) {\n initHeaders.forEach(([key, value]) => {\n headers[key] = value;\n });\n } else {\n Object.assign(headers, initHeaders);\n }\n }\n\n return headers;\n }\n\n private async parseResponse<T>(\n response: Response,\n parse?: ResponseParser,\n ): Promise<T> {\n switch (parse) {\n case 'text':\n return (await response.text()) as T;\n case 'blob':\n return (await response.blob()) as T;\n case 'arrayBuffer':\n return (await response.arrayBuffer()) as T;\n case 'response':\n return response as T;\n case 'json':\n default:\n return await response.json();\n }\n }\n\n private async getBodyText(response: Response): Promise<string> {\n try {\n const text = await response.text();\n return text.length > 65536 ? text.slice(0, 65536) + '...' : text;\n } catch {\n return '';\n }\n }\n}\n", "import { WebHttpClient } from './web-client';\nimport { Transport, HttpClient } from './http-types';\n\n// Factory function to create HTTP client with sensible defaults\nexport function createHttpClient(transport: Transport): HttpClient {\n return new WebHttpClient(transport);\n}\n\n// Factory function for browser environments\nexport function createBrowserHttpClient(options: {\n baseUrl: string;\n getAuthToken?: () => Promise<string | undefined>;\n onTokenRefresh?: (newToken: string) => Promise<void>;\n /**\n * Callback to refresh the access token when a 401 error with 'token_expired' is detected.\n * Should return the new access token, or throw an error if refresh fails.\n * If provided, the client will automatically retry the request after a successful refresh.\n */\n refreshToken?: () => Promise<string>;\n defaultHeaders?: Record<string, string>;\n timeoutMs?: number;\n credentials?: RequestCredentials;\n defaultAbortSignal?: AbortSignal;\n}): HttpClient {\n const transport: Transport = {\n // Wrap fetch in arrow function to prevent \"Illegal invocation\" error\n // This preserves the correct 'this' context when fetch is called\n fetch: (url: RequestInfo | URL, init?: RequestInit) => globalThis.fetch(url, init),\n baseUrl: options.baseUrl,\n getAuthToken: options.getAuthToken,\n onTokenRefresh: options.onTokenRefresh,\n refreshToken: options.refreshToken,\n defaultHeaders: options.defaultHeaders,\n timeoutMs: options.timeoutMs,\n credentials: options.credentials, // No default credentials\n defaultAbortSignal: options.defaultAbortSignal,\n };\n\n return createHttpClient(transport);\n}\n\n// Factory function for Node.js environments\nexport function createNodeHttpClient(options: {\n baseUrl: string;\n fetch?: typeof fetch; // Allow injection of undici.fetch or other fetch implementations\n getAuthToken?: () => Promise<string | undefined>;\n onTokenRefresh?: (newToken: string) => Promise<void>;\n /**\n * Callback to refresh the access token when a 401 error with 'token_expired' is detected.\n * Should return the new access token, or throw an error if refresh fails.\n * If provided, the client will automatically retry the request after a successful refresh.\n */\n refreshToken?: () => Promise<string>;\n defaultHeaders?: Record<string, string>;\n timeoutMs?: number;\n credentials?: RequestCredentials;\n defaultAbortSignal?: AbortSignal;\n}): HttpClient {\n // Use provided fetch or try to use global fetch (Node 18+)\n const fetchImpl = options.fetch ?? globalThis.fetch;\n\n if (!fetchImpl) {\n throw new Error(\n 'No fetch implementation available. Please provide a fetch implementation ' +\n '(e.g., undici.fetch) or use Node.js 18+ which has native fetch support.',\n );\n }\n\n // Check if we're using the default globalThis.fetch to preserve context\n // When fetchImpl is globalThis.fetch, we must call it directly, not through a variable\n // Custom fetch implementations (like undici.fetch) can be called through the variable\n const isDefaultFetch = fetchImpl === globalThis.fetch;\n\n const transport: Transport = {\n // Wrap fetch in arrow function to prevent \"Illegal invocation\" error\n // For globalThis.fetch, call it directly to preserve 'this' context\n // For custom implementations, calling through the variable is safe\n fetch: isDefaultFetch\n ? (url: RequestInfo | URL, init?: RequestInit) => globalThis.fetch(url, init)\n : (url: RequestInfo | URL, init?: RequestInit) => fetchImpl(url, init),\n baseUrl: options.baseUrl,\n getAuthToken: options.getAuthToken,\n onTokenRefresh: options.onTokenRefresh,\n refreshToken: options.refreshToken,\n defaultHeaders: options.defaultHeaders,\n timeoutMs: options.timeoutMs,\n credentials: options.credentials, // Node.js doesn't have default credentials\n defaultAbortSignal: options.defaultAbortSignal,\n };\n\n return createHttpClient(transport);\n}\n\n// Universal factory that works in both environments\nexport function createUniversalHttpClient(options: {\n baseUrl: string;\n fetch?: typeof fetch;\n getAuthToken?: () => Promise<string | undefined>;\n onTokenRefresh?: (newToken: string) => Promise<void>;\n /**\n * Callback to refresh the access token when a 401 error with 'token_expired' is detected.\n * Should return the new access token, or throw an error if refresh fails.\n * If provided, the client will automatically retry the request after a successful refresh.\n */\n refreshToken?: () => Promise<string>;\n defaultHeaders?: Record<string, string>;\n timeoutMs?: number;\n credentials?: RequestCredentials;\n defaultAbortSignal?: AbortSignal;\n}): HttpClient {\n // Try to detect environment and use appropriate factory\n if (typeof window !== 'undefined') {\n // Browser environment\n return createBrowserHttpClient(options);\n } else {\n // Node.js environment\n return createNodeHttpClient(options);\n }\n}\n", "// Retry helper for HTTP requests\nexport interface RetryOptions {\n attempts?: number;\n}\n\n// Error types for retry logic\ninterface ErrorWithName extends Error {\n name: string;\n}\n\ninterface ErrorWithStatus extends Error {\n status: number;\n}\n\ninterface ErrorWithHeaders extends Error {\n headers?: Headers;\n}\n\n// Default retry condition - retry on network errors and 5xx status codes\nfunction defaultRetryCondition(error: Error, attempt: number): boolean {\n // Don't retry on the last attempt\n if (attempt <= 0) return false;\n\n // Distinguish timeout vs. user abort:\n // - Timeout: name === 'TimeoutError' (per spec/platforms)\n // - User abort: name === 'AbortError'\n const errorWithName = error as ErrorWithName;\n const name = errorWithName?.name;\n if (name === 'TimeoutError') return true;\n if (name === 'AbortError') return false;\n\n // HTTP 5xx and 429 (including HTTPError from web-client)\n const errorWithStatus = error as ErrorWithStatus;\n if (\n 'status' in errorWithStatus &&\n typeof errorWithStatus.status === 'number'\n ) {\n const status = errorWithStatus.status;\n return status >= 500 || status === 429;\n }\n // Network TypeError (DNS/reset) is reasonably retryable\n if (name === 'TypeError') return true;\n\n return false;\n}\n\n// Calculate delay with exponential backoff and jitter\nfunction calculateDelay(attempt: number): number {\n const baseDelayMs = 250; // Base 250ms as per spec\n const delay = baseDelayMs * Math.pow(2, attempt - 1);\n\n // Add \u00B120% jitter to reduce stampedes\n const jitter = (Math.random() - 0.5) * 0.4 * delay;\n return Math.max(0, delay + jitter);\n}\n\n// Retry helper function with new signature\nexport async function withRetry<T>(\n fn: (attempt: number) => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const { attempts = 3 } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn(attempt);\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry (this handles the last attempt check)\n if (!defaultRetryCondition(lastError, attempts - attempt)) {\n throw lastError;\n }\n\n // Calculate delay\n let delayMs = calculateDelay(attempt);\n\n // Check for Retry-After header if it's an HTTP error\n const errorWithHeaders = lastError as ErrorWithHeaders;\n const hdrs = errorWithHeaders.headers;\n const retryAfter = hdrs?.get?.('Retry-After');\n if (retryAfter) {\n // If it's a number, treat as seconds\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) {\n delayMs = Math.max(delayMs, seconds * 1000);\n } else {\n // If it's a date, calculate the difference\n const date = new Date(retryAfter);\n if (!isNaN(date.getTime())) {\n const waitTime = Math.max(0, date.getTime() - Date.now());\n // Cap wait at 60s per attempt as per spec\n delayMs = Math.max(delayMs, Math.min(waitTime, 60000));\n }\n }\n }\n\n // Wait before retrying\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n throw lastError || new Error('Retry failed without error');\n}\n\n// Helper to create a retry-enabled HTTP client method\nexport function createRetryableMethod<T extends unknown[], R>(\n method: (...args: T) => Promise<R>,\n retryOptions: RetryOptions = {},\n) {\n return async (...args: T): Promise<R> => {\n return withRetry(() => method(...args), retryOptions);\n };\n}\n", "import { HttpClient } from '../http-client';\nimport {\n // Common types\n ApiResponse,\n // Health and Status\n HealthResponse,\n IdentityResponse,\n ProvidersResponse,\n // Authentication\n TokenRequest,\n TokenResponse,\n RefreshTokenRequest,\n ChallengeResponse,\n // Mock Token (testing)\n MockTokenRequest,\n // Token Management\n RevokeTokenRequest,\n RevokeTokenResponse,\n // Key Management\n CreateKeyRequest,\n CreateKeyResponse,\n DeleteKeyResponse,\n RootKeysResponse,\n // Client Management\n ClientKeysResponse,\n GenerateClientKeyRequest,\n DeleteClientResponse,\n // Permissions\n PermissionResponse,\n // Auth Status\n AuthStatus,\n} from './auth-types';\n\nexport class AuthApiClient {\n constructor(private httpClient: HttpClient) {}\n\n // Health and Status Endpoints\n async getHealth(): Promise<HealthResponse> {\n const response =\n await this.httpClient.get<ApiResponse<HealthResponse>>('/auth/health');\n if (!response.data) {\n throw new Error('Health response data is null');\n }\n return response.data;\n }\n\n async getIdentity(): Promise<IdentityResponse> {\n const response =\n await this.httpClient.get<ApiResponse<IdentityResponse>>(\n '/admin/identity',\n );\n if (!response.data) {\n throw new Error('Identity response data is null');\n }\n return response.data;\n }\n\n async getProviders(): Promise<ProvidersResponse> {\n const response =\n await this.httpClient.get<ApiResponse<ProvidersResponse>>(\n '/auth/providers',\n );\n if (!response.data) {\n throw new Error('Providers response data is null');\n }\n return response.data;\n }\n\n // Authentication Endpoints\n async getLoginPage(): Promise<string> {\n return this.httpClient.get<string>('/auth/login', { parse: 'text' });\n }\n\n async generateTokens(request: TokenRequest): Promise<TokenResponse> {\n return this.httpClient.post<TokenResponse>('/auth/token', request);\n }\n\n async refreshToken(request: RefreshTokenRequest): Promise<TokenResponse> {\n return this.httpClient.post<TokenResponse>('/auth/refresh', request);\n }\n\n async generateMockTokens(request: MockTokenRequest): Promise<TokenResponse> {\n return this.httpClient.post<TokenResponse>('/auth/mock-token', request);\n }\n\n async getChallenge(): Promise<ChallengeResponse> {\n return this.httpClient.get<ChallengeResponse>('/auth/challenge');\n }\n\n async validateToken(token: string): Promise<{\n valid: boolean;\n headers: Record<string, string>;\n status: number;\n }> {\n try {\n const response = await this.validateTokenGet(token);\n return {\n valid: response.status === 200,\n headers: response.headers,\n status: response.status,\n };\n } catch (error) {\n return {\n valid: false,\n headers: {},\n status: 401,\n };\n }\n }\n\n async validateTokenGet(\n token: string,\n ): Promise<{ status: number; headers: Record<string, string> }> {\n const response = await this.httpClient.head('/auth/validate', {\n headers: { Authorization: `Bearer ${token}` },\n });\n return {\n status: response.status,\n headers: response.headers,\n };\n }\n\n async isAuthed(): Promise<AuthStatus> {\n return this.httpClient.get<AuthStatus>('/auth/is-authed');\n }\n\n // Token Management Endpoints\n async revokeTokens(\n request: RevokeTokenRequest,\n ): Promise<RevokeTokenResponse> {\n return this.httpClient.post<RevokeTokenResponse>('/admin/revoke', request);\n }\n\n // Key Management Endpoints\n async listRootKeys(): Promise<RootKeysResponse> {\n const response =\n await this.httpClient.get<ApiResponse<RootKeysResponse>>('/admin/keys');\n if (!response.data) {\n throw new Error('Root keys response data is null');\n }\n return response.data;\n }\n\n async createRootKey(request: CreateKeyRequest): Promise<CreateKeyResponse> {\n return this.httpClient.post<CreateKeyResponse>('/admin/keys', request);\n }\n\n async deleteRootKey(keyId: string): Promise<DeleteKeyResponse> {\n return this.httpClient.delete<DeleteKeyResponse>(`/admin/keys/${keyId}`);\n }\n\n // Client Management Endpoints\n async listClientKeys(): Promise<ClientKeysResponse> {\n const response = await this.httpClient.get<ApiResponse<ClientKeysResponse>>(\n '/admin/keys/clients',\n );\n if (!response.data) {\n throw new Error('Client keys response data is null');\n }\n return response.data;\n }\n\n async generateClientKey(\n request: GenerateClientKeyRequest,\n ): Promise<TokenResponse> {\n return this.httpClient.post<TokenResponse>('/admin/client-key', request);\n }\n\n async deleteClientKey(\n keyId: string,\n clientId: string,\n ): Promise<DeleteClientResponse> {\n return this.httpClient.delete<DeleteClientResponse>(\n `/admin/keys/${keyId}/clients/${clientId}`,\n );\n }\n\n // Permission Management Endpoints\n async getKeyPermissions(keyId: string): Promise<PermissionResponse> {\n return this.httpClient.get<PermissionResponse>(\n `/admin/keys/${keyId}/permissions`,\n );\n }\n\n async updateKeyPermissions(\n keyId: string,\n permissions: string[],\n ): Promise<PermissionResponse> {\n return this.httpClient.put<PermissionResponse>(\n `/admin/keys/${keyId}/permissions`,\n { permissions },\n );\n }\n}\n", "import { AuthApiClient } from './auth-client';\nimport { AuthApiClientConfig } from './auth-types';\nimport { HttpClient } from '../http-client';\n\n// Mock HTTP client for testing\nclass MockHttpClient implements HttpClient {\n async get<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAuthApiClientFromHttpClient with a real HTTP client',\n );\n }\n async post<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAuthApiClientFromHttpClient with a real HTTP client',\n );\n }\n async put<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAuthApiClientFromHttpClient with a real HTTP client',\n );\n }\n async delete<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAuthApiClientFromHttpClient with a real HTTP client',\n );\n }\n async patch<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAuthApiClientFromHttpClient with a real HTTP client',\n );\n }\n async head(): Promise<{ headers: Record<string, string>; status: number }> {\n throw new Error(\n 'HTTP client not implemented - use createAuthApiClientFromHttpClient with a real HTTP client',\n );\n }\n async request<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAuthApiClientFromHttpClient with a real HTTP client',\n );\n }\n}\n\n// Factory functions for creating Auth API clients\nexport function createBrowserAuthApiClient(\n _config: AuthApiClientConfig,\n): AuthApiClient {\n const httpClient = new MockHttpClient();\n return new AuthApiClient(httpClient);\n}\n\nexport function createNodeAuthApiClient(\n _config: AuthApiClientConfig,\n): AuthApiClient {\n const httpClient = new MockHttpClient();\n return new AuthApiClient(httpClient);\n}\n\nexport function createAuthApiClient(\n _config: AuthApiClientConfig,\n): AuthApiClient {\n const httpClient = new MockHttpClient();\n return new AuthApiClient(httpClient);\n}\n\nexport function createAuthApiClientFromHttpClient(\n httpClient: HttpClient,\n _config: AuthApiClientConfig,\n): AuthApiClient {\n return new AuthApiClient(httpClient);\n}\n", "import { HttpClient } from '../http-client';\nimport type {\n HealthStatus,\n AdminAuthStatus,\n InstallApplicationRequest,\n InstallApplicationResponseData,\n InstallDevApplicationRequest,\n UninstallApplicationResponseData,\n ListApplicationsResponseData,\n GetApplicationResponseData,\n GetLatestVersionResponseData,\n ListPackagesResponseData,\n ListVersionsResponseData,\n CreateContextRequest,\n CreateContextResponseData,\n DeleteContextRequest,\n DeleteContextResponseData,\n GetContextsResponseData,\n Context,\n GenerateContextIdentityResponseData,\n GetContextIdentitiesResponseData,\n JoinContextResponseData,\n ContextGroupResponseData,\n ContextStorageResponseData,\n InviteSpecializedNodeRequest,\n InviteSpecializedNodeResponseData,\n UpdateContextApplicationRequest,\n ContextsWithExecutorsResponseData,\n UploadBlobRequest,\n UploadBlobResponseData,\n DeleteBlobResponseData,\n ListBlobsResponseData,\n GetBlobResponseData,\n CreateAliasRequest,\n CreateAliasResponseData,\n LookupAliasResponseData,\n DeleteAliasResponseData,\n ListAliasesResponseData,\n ListContextIdentityAliasesResponseData,\n CreateContextIdentityAliasResponseData,\n LookupContextIdentityAliasResponseData,\n DeleteContextIdentityAliasResponseData,\n ListNamespacesResponseData,\n CreateNamespaceRequest,\n CreateNamespaceResponseData,\n DeleteNamespaceRequest,\n DeleteNamespaceResponseData,\n CreateNamespaceInvitationRequest,\n CreateNamespaceInvitationResponseData,\n CreateRecursiveInvitationResponseData,\n JoinNamespaceRequest,\n JoinNamespaceResponseData,\n CreateGroupInNamespaceRequest,\n CreateGroupInNamespaceResponseData,\n SubgroupEntry,\n Namespace,\n NamespaceIdentity,\n GroupInfoResponseData,\n DeleteGroupRequest,\n DeleteGroupResponseData,\n ListGroupMembersResponseData,\n ListGroupContextsResponseData,\n AddGroupMembersRequest,\n RemoveGroupMembersRequest,\n UpdateMemberRoleRequest,\n MemberCapabilities,\n SetMemberCapabilitiesRequest,\n SetDefaultCapabilitiesRequest,\n SetSubgroupVisibilityRequest,\n SetTeeAdmissionPolicyRequest,\n UpdateGroupSettingsRequest,\n SetGroupAliasRequest,\n SetMemberAliasRequest,\n SyncGroupRequest,\n SyncGroupResponseData,\n RegisterGroupSigningKeyRequest,\n RegisterGroupSigningKeyResponseData,\n UpgradeGroupRequest,\n UpgradeGroupResponseData,\n GroupUpgradeStatusResponseData,\n RetryGroupUpgradeRequest,\n RetryGroupUpgradeResponseData,\n NestGroupRequest,\n UnnestGroupRequest,\n DetachContextFromGroupRequest,\n CreateGroupInvitationRequest,\n CreateGroupInvitationResponseData,\n CreateRecursiveGroupInvitationResponseData,\n JoinGroupRequest,\n JoinGroupResponseData,\n TeeInfoResponseData,\n TeeAttestRequest,\n TeeAttestResponseData,\n TeeVerifyQuoteRequest,\n TeeVerifyQuoteResponseData,\n} from './admin-types';\n\n/**\n * Helper: server wraps most responses in `{ data: T }`.\n * This extracts `.data` so callers get the inner payload directly.\n */\nfunction unwrap<T>(response: { data: T }): T {\n return response.data;\n}\n\nexport class AdminApiClient {\n constructor(private httpClient: HttpClient) {}\n\n // ---- Health and Status (public, no auth) ----\n\n async healthCheck(): Promise<HealthStatus> {\n return unwrap(await this.httpClient.get<{ data: HealthStatus }>('/admin-api/health'));\n }\n\n async isAuthed(): Promise<AdminAuthStatus> {\n return this.httpClient.get<AdminAuthStatus>('/admin-api/is-authed');\n }\n\n // ---- Application Management ----\n\n async installApplication(request: InstallApplicationRequest): Promise<InstallApplicationResponseData> {\n return unwrap(await this.httpClient.post<{ data: InstallApplicationResponseData }>('/admin-api/install-application', request));\n }\n\n async installDevApplication(request: InstallDevApplicationRequest): Promise<InstallApplicationResponseData> {\n return unwrap(await this.httpClient.post<{ data: InstallApplicationResponseData }>('/admin-api/install-dev-application', request));\n }\n\n async uninstallApplication(appId: string): Promise<UninstallApplicationResponseData> {\n return unwrap(await this.httpClient.delete<{ data: UninstallApplicationResponseData }>(`/admin-api/applications/${appId}`));\n }\n\n async listApplications(): Promise<ListApplicationsResponseData> {\n return unwrap(await this.httpClient.get<{ data: ListApplicationsResponseData }>('/admin-api/applications'));\n }\n\n async getApplication(appId: string): Promise<GetApplicationResponseData> {\n return unwrap(await this.httpClient.get<{ data: GetApplicationResponseData }>(`/admin-api/applications/${appId}`));\n }\n\n // ---- Package Management ----\n\n async listPackages(): Promise<ListPackagesResponseData> {\n return unwrap(await this.httpClient.get<{ data: ListPackagesResponseData }>('/admin-api/packages'));\n }\n\n async listPackageVersions(packageName: string): Promise<ListVersionsResponseData> {\n return unwrap(\n await this.httpClient.get<{ data: ListVersionsResponseData }>(\n `/admin-api/packages/${encodeURIComponent(packageName)}/versions`,\n ),\n );\n }\n\n async getLatestPackageVersion(packageName: string): Promise<GetLatestVersionResponseData> {\n return this.httpClient.get<GetLatestVersionResponseData>(\n `/admin-api/packages/${encodeURIComponent(packageName)}/latest`,\n );\n }\n\n // ---- Context Management ----\n\n async createContext(request: CreateContextRequest): Promise<CreateContextResponseData> {\n return unwrap(await this.httpClient.post<{ data: CreateContextResponseData }>('/admin-api/contexts', request));\n }\n\n async deleteContext(contextId: string, request?: DeleteContextRequest): Promise<DeleteContextResponseData> {\n if (request) {\n return unwrap(\n await this.httpClient.request<{ data: DeleteContextResponseData }>(`/admin-api/contexts/${contextId}`, {\n method: 'DELETE',\n body: JSON.stringify(request),\n headers: { 'Content-Type': 'application/json' },\n }),\n );\n }\n return unwrap(await this.httpClient.delete<{ data: DeleteContextResponseData }>(`/admin-api/contexts/${contextId}`));\n }\n\n async getContexts(): Promise<GetContextsResponseData> {\n return unwrap(await this.httpClient.get<{ data: GetContextsResponseData }>('/admin-api/contexts'));\n }\n\n async getContext(contextId: string): Promise<Context> {\n return unwrap(await this.httpClient.get<{ data: Context }>(`/admin-api/contexts/${contextId}`));\n }\n\n async getContextsForApplication(applicationId: string): Promise<GetContextsResponseData> {\n return unwrap(await this.httpClient.get<{ data: GetContextsResponseData }>(`/admin-api/contexts/for-application/${applicationId}`));\n }\n\n // ---- Context Identity ----\n\n async generateContextIdentity(): Promise<GenerateContextIdentityResponseData> {\n return unwrap(await this.httpClient.post<{ data: GenerateContextIdentityResponseData }>('/admin-api/identity/context', {}));\n }\n\n async getContextIdentities(contextId: string): Promise<GetContextIdentitiesResponseData> {\n return unwrap(await this.httpClient.get<{ data: GetContextIdentitiesResponseData }>(`/admin-api/contexts/${contextId}/identities`));\n }\n\n async getContextIdentitiesOwned(contextId: string): Promise<GetContextIdentitiesResponseData> {\n return unwrap(await this.httpClient.get<{ data: GetContextIdentitiesResponseData }>(`/admin-api/contexts/${contextId}/identities-owned`));\n }\n\n // ---- Context join (group membership) ----\n\n async joinContext(contextId: string): Promise<JoinContextResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: JoinContextResponseData }>(`/admin-api/contexts/${contextId}/join`, {}),\n );\n }\n\n // ---- Context group / storage / sync ----\n\n async getContextGroup(contextId: string): Promise<ContextGroupResponseData> {\n return unwrap(await this.httpClient.get<{ data: ContextGroupResponseData }>(`/admin-api/contexts/${contextId}/group`));\n }\n\n async getContextStorage(contextId: string): Promise<ContextStorageResponseData> {\n return unwrap(await this.httpClient.get<{ data: ContextStorageResponseData }>(`/admin-api/contexts/${contextId}/storage`));\n }\n\n async syncContext(contextId?: string): Promise<void> {\n await this.httpClient.post(`/admin-api/contexts/sync/${contextId ?? ''}`, {});\n }\n\n async inviteSpecializedNode(request: InviteSpecializedNodeRequest): Promise<InviteSpecializedNodeResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: InviteSpecializedNodeResponseData }>(\n '/admin-api/contexts/invite-specialized-node',\n request,\n ),\n );\n }\n\n async updateContextApplication(\n contextId: string,\n request: UpdateContextApplicationRequest,\n ): Promise<void> {\n await this.httpClient.post(`/admin-api/contexts/${contextId}/application`, request);\n }\n\n async getContextsWithExecutorsForApplication(applicationId: string): Promise<ContextsWithExecutorsResponseData> {\n return unwrap(\n await this.httpClient.get<{ data: ContextsWithExecutorsResponseData }>(\n `/admin-api/contexts/with-executors/for-application/${applicationId}`,\n ),\n );\n }\n\n // ---- Blob Management ----\n\n async uploadBlob(data: UploadBlobRequest): Promise<UploadBlobResponseData> {\n return unwrap(await this.httpClient.put<{ data: UploadBlobResponseData }>('/admin-api/blobs', data));\n }\n\n async deleteBlob(blobId: string): Promise<DeleteBlobResponseData> {\n return unwrap(await this.httpClient.delete<{ data: DeleteBlobResponseData }>(`/admin-api/blobs/${blobId}`));\n }\n\n async listBlobs(): Promise<ListBlobsResponseData> {\n return unwrap(await this.httpClient.get<{ data: ListBlobsResponseData }>('/admin-api/blobs'));\n }\n\n async getBlob(blobId: string): Promise<GetBlobResponseData> {\n return unwrap(await this.httpClient.get<{ data: GetBlobResponseData }>(`/admin-api/blobs/${blobId}`));\n }\n\n // ---- Alias Management ----\n\n async createContextAlias(request: CreateAliasRequest): Promise<CreateAliasResponseData> {\n return unwrap(await this.httpClient.post<{ data: CreateAliasResponseData }>('/admin-api/alias/create/context', request));\n }\n\n async createApplicationAlias(request: CreateAliasRequest): Promise<CreateAliasResponseData> {\n return unwrap(await this.httpClient.post<{ data: CreateAliasResponseData }>('/admin-api/alias/create/application', request));\n }\n\n async lookupContextAlias(name: string): Promise<LookupAliasResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: LookupAliasResponseData }>(\n `/admin-api/alias/lookup/context/${encodeURIComponent(name)}`,\n {},\n ),\n );\n }\n\n async lookupApplicationAlias(name: string): Promise<LookupAliasResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: LookupAliasResponseData }>(\n `/admin-api/alias/lookup/application/${encodeURIComponent(name)}`,\n {},\n ),\n );\n }\n\n async deleteContextAlias(name: string): Promise<DeleteAliasResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: DeleteAliasResponseData }>(\n `/admin-api/alias/delete/context/${encodeURIComponent(name)}`,\n {},\n ),\n );\n }\n\n async deleteApplicationAlias(name: string): Promise<DeleteAliasResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: DeleteAliasResponseData }>(\n `/admin-api/alias/delete/application/${encodeURIComponent(name)}`,\n {},\n ),\n );\n }\n\n async listContextAliases(): Promise<ListAliasesResponseData> {\n return unwrap(await this.httpClient.get<{ data: ListAliasesResponseData }>('/admin-api/alias/list/context'));\n }\n\n async listApplicationAliases(): Promise<ListAliasesResponseData> {\n return unwrap(await this.httpClient.get<{ data: ListAliasesResponseData }>('/admin-api/alias/list/application'));\n }\n\n // ---- Context Identity Aliases ----\n\n async listContextIdentityAliases(contextId: string): Promise<ListContextIdentityAliasesResponseData> {\n return unwrap(\n await this.httpClient.get<{ data: ListContextIdentityAliasesResponseData }>(\n `/admin-api/alias/list/identity/${contextId}`,\n ),\n );\n }\n\n async createContextIdentityAlias(\n contextId: string,\n request: CreateAliasRequest,\n ): Promise<CreateContextIdentityAliasResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: CreateContextIdentityAliasResponseData }>(\n `/admin-api/alias/create/identity/${contextId}`,\n request,\n ),\n );\n }\n\n async lookupContextIdentityAlias(\n contextId: string,\n name: string,\n ): Promise<LookupContextIdentityAliasResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: LookupContextIdentityAliasResponseData }>(\n `/admin-api/alias/lookup/identity/${contextId}/${encodeURIComponent(name)}`,\n {},\n ),\n );\n }\n\n async deleteContextIdentityAlias(\n contextId: string,\n name: string,\n ): Promise<DeleteContextIdentityAliasResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: DeleteContextIdentityAliasResponseData }>(\n `/admin-api/alias/delete/identity/${contextId}/${encodeURIComponent(name)}`,\n {},\n ),\n );\n }\n\n // ---- Namespace Management ----\n\n async listNamespaces(): Promise<ListNamespacesResponseData> {\n return unwrap(await this.httpClient.get<{ data: ListNamespacesResponseData }>('/admin-api/namespaces'));\n }\n\n async getNamespace(namespaceId: string): Promise<Namespace> {\n return unwrap(await this.httpClient.get<{ data: Namespace }>(`/admin-api/namespaces/${namespaceId}`));\n }\n\n async getNamespaceIdentity(namespaceId: string): Promise<NamespaceIdentity> {\n return unwrap(await this.httpClient.get<{ data: NamespaceIdentity }>(`/admin-api/namespaces/${namespaceId}/identity`));\n }\n\n async listNamespacesForApplication(applicationId: string): Promise<ListNamespacesResponseData> {\n return unwrap(await this.httpClient.get<{ data: ListNamespacesResponseData }>(`/admin-api/namespaces/for-application/${applicationId}`));\n }\n\n async createNamespace(request: CreateNamespaceRequest): Promise<CreateNamespaceResponseData> {\n return unwrap(await this.httpClient.post<{ data: CreateNamespaceResponseData }>('/admin-api/namespaces', request));\n }\n\n async deleteNamespace(\n namespaceId: string,\n request?: DeleteNamespaceRequest,\n ): Promise<DeleteNamespaceResponseData> {\n return unwrap(\n await this.httpClient.request<{ data: DeleteNamespaceResponseData }>(`/admin-api/namespaces/${namespaceId}`, {\n method: 'DELETE',\n body: request ? JSON.stringify(request) : undefined,\n headers: request ? { 'Content-Type': 'application/json' } : undefined,\n }),\n );\n }\n\n async createNamespaceInvitation(\n namespaceId: string,\n request?: CreateNamespaceInvitationRequest,\n ): Promise<CreateNamespaceInvitationResponseData | CreateRecursiveInvitationResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: CreateNamespaceInvitationResponseData | CreateRecursiveInvitationResponseData }>(\n `/admin-api/namespaces/${namespaceId}/invite`,\n request ?? {},\n ),\n );\n }\n\n async joinNamespace(\n namespaceId: string,\n request: JoinNamespaceRequest,\n ): Promise<JoinNamespaceResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: JoinNamespaceResponseData }>(\n `/admin-api/namespaces/${namespaceId}/join`,\n request,\n { timeoutMs: 65000 },\n ),\n );\n }\n\n async createGroupInNamespace(\n namespaceId: string,\n request?: CreateGroupInNamespaceRequest,\n ): Promise<CreateGroupInNamespaceResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: CreateGroupInNamespaceResponseData }>(\n `/admin-api/namespaces/${namespaceId}/groups`,\n request ?? {},\n ),\n );\n }\n\n async listNamespaceGroups(namespaceId: string): Promise<SubgroupEntry[]> {\n return unwrap(await this.httpClient.get<{ data: SubgroupEntry[] }>(`/admin-api/namespaces/${namespaceId}/groups`));\n }\n\n // ---- Group Management ----\n\n async getGroupInfo(groupId: string): Promise<GroupInfoResponseData> {\n return unwrap(await this.httpClient.get<{ data: GroupInfoResponseData }>(`/admin-api/groups/${groupId}`));\n }\n\n async deleteGroup(groupId: string, request?: DeleteGroupRequest): Promise<DeleteGroupResponseData> {\n if (request) {\n return unwrap(\n await this.httpClient.request<{ data: DeleteGroupResponseData }>(`/admin-api/groups/${groupId}`, {\n method: 'DELETE',\n body: JSON.stringify(request),\n headers: { 'Content-Type': 'application/json' },\n }),\n );\n }\n return unwrap(await this.httpClient.delete<{ data: DeleteGroupResponseData }>(`/admin-api/groups/${groupId}`));\n }\n\n async listGroupMembers(groupId: string): Promise<ListGroupMembersResponseData> {\n const response = await this.httpClient.get<ListGroupMembersResponseData>(\n `/admin-api/groups/${groupId}/members`,\n );\n // Validate the field we declare as non-optional in the type so a\n // contract-violating response (proxy error body, future API drift,\n // etc.) surfaces as a clear error rather than silently producing an\n // empty list. Empty groups still satisfy this \u2014 merod returns\n // `members: []`, not an omitted field.\n if (!Array.isArray(response?.members)) {\n // Sanitize before interpolation: groupId reaches us from caller code,\n // not parsed input, but defending the message keeps untrusted bytes\n // out of error logs and downstream UIs.\n const safeId = String(groupId).replace(/[\\r\\n\\t\\s]/g, '').slice(0, 64);\n throw new Error(\n `Invalid listGroupMembers response for group ${safeId}: missing or non-array \\`members\\` field`,\n );\n }\n return response;\n }\n\n async listGroupContexts(groupId: string): Promise<ListGroupContextsResponseData> {\n return unwrap(await this.httpClient.get<{ data: ListGroupContextsResponseData }>(`/admin-api/groups/${groupId}/contexts`));\n }\n\n async addGroupMembers(groupId: string, request: AddGroupMembersRequest): Promise<void> {\n await this.httpClient.post(`/admin-api/groups/${groupId}/members`, request);\n }\n\n async removeGroupMembers(groupId: string, request: RemoveGroupMembersRequest): Promise<void> {\n await this.httpClient.post(`/admin-api/groups/${groupId}/members/remove`, request);\n }\n\n async updateMemberRole(\n groupId: string,\n identity: string,\n request: UpdateMemberRoleRequest,\n ): Promise<void> {\n await this.httpClient.put(`/admin-api/groups/${groupId}/members/${identity}/role`, request);\n }\n\n async getMemberCapabilities(groupId: string, identity: string): Promise<MemberCapabilities> {\n return unwrap(\n await this.httpClient.get<{ data: MemberCapabilities }>(\n `/admin-api/groups/${groupId}/members/${identity}/capabilities`,\n ),\n );\n }\n\n async setMemberCapabilities(\n groupId: string,\n identity: string,\n request: SetMemberCapabilitiesRequest,\n ): Promise<void> {\n await this.httpClient.put(`/admin-api/groups/${groupId}/members/${identity}/capabilities`, request);\n }\n\n async setDefaultCapabilities(\n groupId: string,\n request: SetDefaultCapabilitiesRequest,\n ): Promise<void> {\n await this.httpClient.put(`/admin-api/groups/${groupId}/settings/default-capabilities`, request);\n }\n\n async setSubgroupVisibility(\n groupId: string,\n request: SetSubgroupVisibilityRequest,\n ): Promise<void> {\n await this.httpClient.put(`/admin-api/groups/${groupId}/settings/subgroup-visibility`, request);\n }\n\n async setTeeAdmissionPolicy(\n groupId: string,\n request: SetTeeAdmissionPolicyRequest,\n ): Promise<void> {\n await this.httpClient.put(`/admin-api/groups/${groupId}/settings/tee-admission-policy`, request);\n }\n\n async updateGroupSettings(\n groupId: string,\n request: UpdateGroupSettingsRequest,\n ): Promise<void> {\n await this.httpClient.patch(`/admin-api/groups/${groupId}`, request);\n }\n\n async setGroupAlias(groupId: string, request: SetGroupAliasRequest): Promise<void> {\n await this.httpClient.put(`/admin-api/groups/${groupId}/alias`, request);\n }\n\n async setMemberAlias(\n groupId: string,\n identity: string,\n request: SetMemberAliasRequest,\n ): Promise<void> {\n await this.httpClient.put(`/admin-api/groups/${groupId}/members/${identity}/alias`, request);\n }\n\n async syncGroup(groupId: string, request?: SyncGroupRequest): Promise<SyncGroupResponseData> {\n return unwrap(await this.httpClient.post<{ data: SyncGroupResponseData }>(`/admin-api/groups/${groupId}/sync`, request ?? {}));\n }\n\n async registerGroupSigningKey(\n groupId: string,\n request: RegisterGroupSigningKeyRequest,\n ): Promise<RegisterGroupSigningKeyResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: RegisterGroupSigningKeyResponseData }>(\n `/admin-api/groups/${groupId}/signing-key`,\n request,\n ),\n );\n }\n\n async upgradeGroup(groupId: string, request: UpgradeGroupRequest): Promise<UpgradeGroupResponseData> {\n return unwrap(await this.httpClient.post<{ data: UpgradeGroupResponseData }>(`/admin-api/groups/${groupId}/upgrade`, request));\n }\n\n async getGroupUpgradeStatus(groupId: string): Promise<GroupUpgradeStatusResponseData> {\n return unwrap(\n await this.httpClient.get<{ data: GroupUpgradeStatusResponseData }>(`/admin-api/groups/${groupId}/upgrade/status`),\n );\n }\n\n async retryGroupUpgrade(\n groupId: string,\n request?: RetryGroupUpgradeRequest,\n ): Promise<RetryGroupUpgradeResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: RetryGroupUpgradeResponseData }>(\n `/admin-api/groups/${groupId}/upgrade/retry`,\n request ?? {},\n ),\n );\n }\n\n async nestGroup(parentGroupId: string, request: NestGroupRequest): Promise<void> {\n await this.httpClient.post(`/admin-api/groups/${parentGroupId}/nest`, request);\n }\n\n async unnestGroup(parentGroupId: string, request: UnnestGroupRequest): Promise<void> {\n await this.httpClient.post(`/admin-api/groups/${parentGroupId}/unnest`, request);\n }\n\n async listSubgroups(groupId: string): Promise<SubgroupEntry[]> {\n return unwrap(await this.httpClient.get<{ data: SubgroupEntry[] }>(`/admin-api/groups/${groupId}/subgroups`));\n }\n\n async detachContextFromGroup(\n groupId: string,\n contextId: string,\n request?: DetachContextFromGroupRequest,\n ): Promise<void> {\n await this.httpClient.post(`/admin-api/groups/${groupId}/contexts/${contextId}/remove`, request ?? {});\n }\n\n // ---- Group Invitation & Join ----\n\n async createGroupInvitation(\n groupId: string,\n request?: CreateGroupInvitationRequest,\n ): Promise<CreateGroupInvitationResponseData | CreateRecursiveGroupInvitationResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: CreateGroupInvitationResponseData | CreateRecursiveGroupInvitationResponseData }>(\n `/admin-api/groups/${groupId}/invite`,\n request ?? {},\n ),\n );\n }\n\n async joinGroup(request: JoinGroupRequest): Promise<JoinGroupResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: JoinGroupResponseData }>('/admin-api/groups/join', request),\n );\n }\n\n // ---- TEE ----\n\n async getTeeInfo(): Promise<TeeInfoResponseData> {\n return unwrap(await this.httpClient.get<{ data: TeeInfoResponseData }>('/admin-api/tee/info'));\n }\n\n async teeAttest(request: TeeAttestRequest): Promise<TeeAttestResponseData> {\n return unwrap(await this.httpClient.post<{ data: TeeAttestResponseData }>('/admin-api/tee/attest', request));\n }\n\n async teeVerifyQuote(request: TeeVerifyQuoteRequest): Promise<TeeVerifyQuoteResponseData> {\n return unwrap(\n await this.httpClient.post<{ data: TeeVerifyQuoteResponseData }>('/admin-api/tee/verify-quote', request),\n );\n }\n\n // ---- Network ----\n\n async getPeersCount(): Promise<{ count: number }> {\n return this.httpClient.get<{ count: number }>('/admin-api/peers');\n }\n}\n", "import { AdminApiClient } from './admin-client';\nimport { AdminApiClientConfig } from './admin-types';\nimport { HttpClient } from '../http-client';\n\n// Mock HTTP client for testing\nclass MockHttpClient implements HttpClient {\n async get<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAdminApiClientFromHttpClient with a real HTTP client',\n );\n }\n async post<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAdminApiClientFromHttpClient with a real HTTP client',\n );\n }\n async put<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAdminApiClientFromHttpClient with a real HTTP client',\n );\n }\n async delete<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAdminApiClientFromHttpClient with a real HTTP client',\n );\n }\n async patch<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAdminApiClientFromHttpClient with a real HTTP client',\n );\n }\n async head(): Promise<{ headers: Record<string, string>; status: number }> {\n throw new Error(\n 'HTTP client not implemented - use createAdminApiClientFromHttpClient with a real HTTP client',\n );\n }\n async request<T>(): Promise<T> {\n throw new Error(\n 'HTTP client not implemented - use createAdminApiClientFromHttpClient with a real HTTP client',\n );\n }\n}\n\n// Factory functions for creating Admin API clients\nexport function createBrowserAdminApiClient(\n _config: AdminApiClientConfig,\n): AdminApiClient {\n const httpClient = new MockHttpClient();\n return new AdminApiClient(httpClient);\n}\n\nexport function createNodeAdminApiClient(\n _config: AdminApiClientConfig,\n): AdminApiClient {\n const httpClient = new MockHttpClient();\n return new AdminApiClient(httpClient);\n}\n\nexport function createAdminApiClient(\n _config: AdminApiClientConfig,\n): AdminApiClient {\n const httpClient = new MockHttpClient();\n return new AdminApiClient(httpClient);\n}\n\nexport function createAdminApiClientFromHttpClient(\n httpClient: HttpClient,\n _config: AdminApiClientConfig,\n): AdminApiClient {\n return new AdminApiClient(httpClient);\n}\n", "export interface AuthCallbackResult {\n accessToken: string;\n refreshToken: string;\n applicationId: string;\n contextId: string;\n contextIdentity: string;\n nodeUrl: string;\n}\n\nexport interface AuthLoginOptions {\n callbackUrl: string;\n packageName?: string;\n mode: string;\n permissions?: string[];\n registryUrl?: string;\n packageVersion?: string;\n}\n\n/**\n * Parse an auth callback URL hash fragment.\n * Returns null if access_token is missing.\n */\nexport function parseAuthCallback(url: string): AuthCallbackResult | null {\n try {\n const hashIndex = url.indexOf('#');\n if (hashIndex === -1) return null;\n\n const hash = url.substring(hashIndex + 1);\n const params = new URLSearchParams(hash);\n\n const accessToken = params.get('access_token');\n if (!accessToken) return null;\n\n return {\n accessToken,\n refreshToken: params.get('refresh_token') ?? '',\n applicationId: params.get('application_id') ?? '',\n contextId: params.get('context_id') ?? '',\n contextIdentity: params.get('context_identity') ?? '',\n nodeUrl: params.get('node_url') ?? '',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Build the auth login URL for redirecting users to the node's auth page.\n */\nexport function buildAuthLoginUrl(nodeUrl: string, opts: AuthLoginOptions): string {\n const params = new URLSearchParams();\n params.set('callback-url', opts.callbackUrl);\n\n if (opts.permissions && opts.permissions.length > 0) {\n params.set('permissions', opts.permissions.join(','));\n }\n\n params.set('mode', opts.mode);\n\n if (opts.packageName) {\n params.set('package-name', opts.packageName);\n if (opts.packageVersion) {\n params.set('package-version', opts.packageVersion);\n }\n if (opts.registryUrl) {\n params.set('registry-url', opts.registryUrl);\n }\n }\n\n // Trim trailing slash from nodeUrl\n const base = nodeUrl.replace(/\\/+$/, '');\n return `${base}/auth/login?${params.toString()}`;\n}\n", "import type { HttpClient } from '../http-client';\n\nexport interface ExecuteParams {\n contextId: string;\n method: string;\n argsJson?: Record<string, unknown>;\n /** @deprecated No longer used by the server. Ignored if provided. */\n executorPublicKey?: string;\n}\n\nexport class RpcError extends Error {\n code: number;\n type?: string;\n data?: unknown;\n\n constructor(code: number, message: string, data?: unknown, type?: string) {\n super(message);\n this.name = 'RpcError';\n this.code = code;\n this.data = data;\n this.type = type;\n }\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number;\n result?: {\n output?: unknown;\n [key: string]: unknown;\n };\n error?: {\n // Standard JSON-RPC fields\n code?: number;\n message?: string;\n // Server-specific fields\n type?: string;\n data?: unknown;\n };\n}\n\nexport class RpcClient {\n private httpClient: HttpClient;\n\n constructor(opts: { httpClient: HttpClient }) {\n this.httpClient = opts.httpClient;\n }\n\n async execute<T = unknown>(params: ExecuteParams): Promise<T> {\n const body = {\n jsonrpc: '2.0',\n id: 1,\n method: 'execute',\n params: {\n contextId: params.contextId,\n method: params.method,\n argsJson: params.argsJson ?? {},\n },\n };\n\n const response = await this.httpClient.post<JsonRpcResponse>(\n '/jsonrpc',\n body,\n );\n\n if (response.error) {\n const err = response.error;\n const code = err.code ?? -1;\n const message = err.message ?? err.type ?? 'RPC error';\n throw new RpcError(code, message, err.data, err.type);\n }\n\n if (response.result && 'output' in response.result) {\n return response.result.output as T;\n }\n\n return response.result as T;\n }\n}\n", "export interface SseEventData {\n contextId: string;\n data: unknown;\n}\n\ntype SseEventHandler = (event: SseEventData) => void;\ntype SseConnectHandler = (sessionId: string) => void;\ntype SseErrorHandler = (error: Error) => void;\n\ninterface SseListeners {\n connect: SseConnectHandler[];\n event: SseEventHandler[];\n error: SseErrorHandler[];\n}\n\nexport class SseClient {\n private baseUrl: string;\n private getAuthToken: () => Promise<string>;\n private reconnectDelayMs: number;\n private sessionId: string | null = null;\n private abortController: AbortController | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private subscribedContextIds: Set<string> = new Set();\n private closed = false;\n private listeners: SseListeners = { connect: [], event: [], error: [] };\n\n constructor(opts: {\n baseUrl: string;\n getAuthToken: () => Promise<string>;\n reconnectDelayMs?: number;\n }) {\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, '');\n this.getAuthToken = opts.getAuthToken;\n this.reconnectDelayMs = opts.reconnectDelayMs ?? 3000;\n }\n\n on(event: 'connect', handler: SseConnectHandler): void;\n on(event: 'event', handler: SseEventHandler): void;\n on(event: 'error', handler: SseErrorHandler): void;\n on(event: string, handler: SseConnectHandler | SseEventHandler | SseErrorHandler): void {\n const key = event as keyof SseListeners;\n if (key in this.listeners) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const arr = this.listeners[key] as any[];\n if (!arr.includes(handler)) arr.push(handler);\n }\n }\n\n off(event: 'connect', handler: SseConnectHandler): void;\n off(event: 'event', handler: SseEventHandler): void;\n off(event: 'error', handler: SseErrorHandler): void;\n off(event: string, handler: SseConnectHandler | SseEventHandler | SseErrorHandler): void {\n const key = event as keyof SseListeners;\n if (key in this.listeners) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const arr = this.listeners[key] as any[];\n const idx = arr.indexOf(handler);\n if (idx !== -1) arr.splice(idx, 1);\n }\n }\n\n private emit(event: 'connect', sessionId: string): void;\n private emit(event: 'event', data: SseEventData): void;\n private emit(event: 'error', error: Error): void;\n private emit(event: string, arg?: string | SseEventData | Error): void {\n const key = event as keyof SseListeners;\n if (key in this.listeners) {\n for (const handler of this.listeners[key]) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (handler as any)(arg);\n } catch {\n // Swallow handler errors\n }\n }\n }\n }\n\n async connect(): Promise<void> {\n // Already connected \u2014 don't reconnect\n if (this.abortController && !this.closed) {\n return;\n }\n this.closed = false;\n this.abortController = new AbortController();\n\n try {\n const token = await this.getAuthToken();\n const response = await fetch(`${this.baseUrl}/sse`, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'text/event-stream',\n },\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE connection failed: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error('SSE response has no body');\n }\n\n this.readStream(response.body).catch((err) => {\n if (this.closed) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', error);\n this.scheduleReconnect();\n });\n } catch (err) {\n if (this.closed) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', error);\n this.scheduleReconnect();\n }\n }\n\n private async readStream(body: ReadableStream<Uint8Array>): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n // Keep the last partial line in the buffer\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n const jsonStr = line.slice(5).trim();\n if (jsonStr) {\n this.handleMessage(jsonStr);\n }\n }\n }\n }\n // Flush remaining bytes from the decoder\n buffer += decoder.decode();\n if (buffer.startsWith('data:')) {\n const jsonStr = buffer.slice(5).trim();\n if (jsonStr) {\n this.handleMessage(jsonStr);\n }\n }\n } catch (err) {\n if (this.closed) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', error);\n }\n\n // Stream ended, reconnect\n if (!this.closed) {\n this.scheduleReconnect();\n }\n }\n\n private handleMessage(jsonStr: string): void {\n try {\n const msg = JSON.parse(jsonStr);\n\n // Connection message\n if (msg.type === 'connect' && msg.session_id) {\n this.sessionId = msg.session_id;\n this.emit('connect', msg.session_id);\n // Re-subscribe after reconnect\n if (this.subscribedContextIds.size > 0) {\n this.sendSubscription('subscribe', [...this.subscribedContextIds]);\n }\n return;\n }\n\n // Context event message\n if (msg.result && msg.result.contextId) {\n let eventData = msg.result.data;\n // Decode byte-array data if needed\n if (Array.isArray(eventData)) {\n try {\n const bytes = new Uint8Array(eventData);\n const text = new TextDecoder().decode(bytes);\n eventData = JSON.parse(text);\n } catch {\n // Keep raw data\n }\n }\n\n this.emit('event', {\n contextId: msg.result.contextId,\n data: eventData,\n });\n }\n } catch {\n // Invalid JSON, ignore\n }\n }\n\n async subscribe(contextIds: string[]): Promise<void> {\n const newIds = contextIds.filter(id => !this.subscribedContextIds.has(id));\n for (const id of contextIds) {\n this.subscribedContextIds.add(id);\n }\n if (newIds.length > 0 && this.sessionId) {\n await this.sendSubscription('subscribe', newIds);\n }\n }\n\n async unsubscribe(contextIds: string[]): Promise<void> {\n const hadIds = contextIds.filter(id => this.subscribedContextIds.has(id));\n for (const id of contextIds) {\n this.subscribedContextIds.delete(id);\n }\n if (hadIds.length > 0 && this.sessionId) {\n await this.sendSubscription('unsubscribe', hadIds);\n }\n }\n\n private async sendSubscription(method: 'subscribe' | 'unsubscribe', contextIds: string[]): Promise<void> {\n try {\n const token = await this.getAuthToken();\n const response = await fetch(`${this.baseUrl}/sse/subscription`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n id: this.sessionId,\n method,\n params: { contextIds },\n }),\n });\n if (!response.ok) {\n this.emit('error', new Error(`SSE ${method} failed: ${response.status}`));\n }\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(`SSE ${method} failed`));\n }\n }\n\n private forceReconnect(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n this.sessionId = null;\n this.connect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed) return;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.forceReconnect();\n }, this.reconnectDelayMs);\n }\n\n close(): void {\n this.closed = true;\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.sessionId = null;\n this.subscribedContextIds.clear();\n }\n}\n", "export interface WsEventData {\n contextId: string;\n data: unknown;\n}\n\ntype WsEventHandler = (event: WsEventData) => void;\ntype WsConnectHandler = () => void;\ntype WsErrorHandler = (error: Error) => void;\n\ninterface WsListeners {\n connect: WsConnectHandler[];\n event: WsEventHandler[];\n error: WsErrorHandler[];\n}\n\n/**\n * @experimental WebSocket event client. The SSE client (`SseClient`) is the\n * recommended transport for production \u2014 use `MeroJs.events` instead of `MeroJs.ws`.\n */\nexport class WsClient {\n private baseUrl: string;\n private getAuthToken: () => Promise<string>;\n private ws: WebSocket | null = null;\n private closed = false;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private subscribedContextIds: Set<string> = new Set();\n private listeners: WsListeners = { connect: [], event: [], error: [] };\n\n private static readonly MAX_BACKOFF_MS = 30000;\n\n constructor(opts: {\n baseUrl: string;\n getAuthToken: () => Promise<string>;\n }) {\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, '');\n this.getAuthToken = opts.getAuthToken;\n }\n\n on(event: 'connect', handler: WsConnectHandler): void;\n on(event: 'event', handler: WsEventHandler): void;\n on(event: 'error', handler: WsErrorHandler): void;\n on(event: string, handler: WsConnectHandler | WsEventHandler | WsErrorHandler): void {\n const key = event as keyof WsListeners;\n if (key in this.listeners) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const arr = this.listeners[key] as any[];\n if (!arr.includes(handler)) arr.push(handler);\n }\n }\n\n off(event: 'connect', handler: WsConnectHandler): void;\n off(event: 'event', handler: WsEventHandler): void;\n off(event: 'error', handler: WsErrorHandler): void;\n off(event: string, handler: WsConnectHandler | WsEventHandler | WsErrorHandler): void {\n const key = event as keyof WsListeners;\n if (key in this.listeners) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const arr = this.listeners[key] as any[];\n const idx = arr.indexOf(handler);\n if (idx !== -1) arr.splice(idx, 1);\n }\n }\n\n private emit(event: 'connect'): void;\n private emit(event: 'event', data: WsEventData): void;\n private emit(event: 'error', error: Error): void;\n private emit(event: string, arg?: WsEventData | Error): void {\n const key = event as keyof WsListeners;\n if (key in this.listeners) {\n for (const handler of this.listeners[key]) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (handler as any)(arg);\n } catch {\n // Swallow handler errors\n }\n }\n }\n }\n\n async connect(): Promise<void> {\n if (this.ws && (this.ws.readyState === WebSocket.CONNECTING || this.ws.readyState === WebSocket.OPEN)) {\n return;\n }\n this.closed = false;\n\n try {\n const token = await this.getAuthToken();\n if (!token) {\n throw new Error('No authentication token available for WebSocket connection');\n }\n // Browser WebSocket API can't set headers, use query param\n const wsUrl = this.baseUrl.replace(/^http/, 'ws');\n this.ws = new WebSocket(`${wsUrl}/ws?token=${encodeURIComponent(token)}`);\n\n this.ws.onopen = () => {\n this.reconnectAttempt = 0;\n this.emit('connect');\n // Re-subscribe on reconnect\n if (this.subscribedContextIds.size > 0) {\n this.sendMessage({\n id: null,\n method: 'subscribe',\n params: { contextIds: [...this.subscribedContextIds] },\n });\n }\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = () => {\n this.emit('error', new Error('WebSocket error'));\n };\n\n this.ws.onclose = () => {\n if (!this.closed) {\n this.scheduleReconnect();\n }\n };\n } catch (err) {\n if (this.closed) return;\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', error);\n this.scheduleReconnect();\n }\n }\n\n private handleMessage(raw: string | ArrayBuffer | Blob): void {\n if (typeof raw !== 'string') return;\n\n try {\n const msg = JSON.parse(raw);\n\n if (msg.result && msg.result.contextId) {\n let eventData = msg.result.data;\n if (Array.isArray(eventData)) {\n try {\n const bytes = new Uint8Array(eventData);\n const text = new TextDecoder().decode(bytes);\n eventData = JSON.parse(text);\n } catch {\n // Keep raw data\n }\n }\n\n this.emit('event', {\n contextId: msg.result.contextId,\n data: eventData,\n });\n }\n } catch {\n // Invalid JSON, ignore\n }\n }\n\n subscribe(contextIds: string[]): void {\n for (const id of contextIds) {\n this.subscribedContextIds.add(id);\n }\n\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.sendMessage({\n id: null,\n method: 'subscribe',\n params: { contextIds },\n });\n }\n }\n\n unsubscribe(contextIds: string[]): void {\n for (const id of contextIds) {\n this.subscribedContextIds.delete(id);\n }\n\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.sendMessage({\n id: null,\n method: 'unsubscribe',\n params: { contextIds },\n });\n }\n }\n\n private sendMessage(msg: unknown): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg));\n }\n }\n\n private scheduleReconnect(): void {\n if (this.closed) return;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n const delay = Math.min(\n 1000 * Math.pow(2, this.reconnectAttempt),\n WsClient.MAX_BACKOFF_MS,\n );\n this.reconnectAttempt++;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n }\n this.subscribedContextIds.clear();\n }\n}\n", "import { createBrowserHttpClient } from './http-client';\nimport { createAuthApiClientFromHttpClient } from './auth-api';\nimport { createAdminApiClientFromHttpClient } from './admin-api';\nimport type { AuthApiClient } from './auth-api';\nimport type { AdminApiClient } from './admin-api';\nimport type { HttpClient } from './http-client';\nimport type { TokenStore } from './token-store';\nimport { parseAuthCallback, buildAuthLoginUrl } from './auth';\nimport type { AuthCallbackResult, AuthLoginOptions } from './auth';\nimport { RpcClient } from './rpc';\nimport { SseClient } from './events/sse';\nimport { WsClient } from './events/ws';\n\nexport interface MeroJsConfig {\n /** Base URL for the Calimero node */\n baseUrl: string;\n /** Initial credentials for authentication */\n credentials?: {\n username: string;\n password: string;\n };\n /** Custom HTTP client timeout in milliseconds */\n timeoutMs?: number;\n /** Request credentials mode for fetch (omit, same-origin, include) */\n requestCredentials?: RequestCredentials;\n /** Optional token store for persistence */\n tokenStore?: TokenStore;\n}\n\nexport interface TokenData {\n access_token: string;\n refresh_token: string;\n expires_at: number;\n}\n\n/** Try to extract `exp` (seconds) from a JWT, return ms timestamp or fallback. */\nfunction expiresAtFromJwt(token: string, fallbackMs: number): number {\n try {\n const parts = token.split('.');\n if (parts.length === 3) {\n // JWT uses base64url encoding: replace -/_ with +// and add padding\n let b64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n while (b64.length % 4) b64 += '=';\n const payload = JSON.parse(atob(b64));\n if (typeof payload.exp === 'number') {\n return payload.exp * 1000;\n }\n }\n } catch {\n // not a JWT or can't parse\n }\n return fallbackMs;\n}\n\n/**\n * Main MeroJs SDK class that manages all API clients and authentication\n */\nexport class MeroJs {\n private config: MeroJsConfig;\n private httpClient: HttpClient;\n private authClient: AuthApiClient;\n private adminClient: AdminApiClient;\n private tokenData: TokenData | null = null;\n private refreshPromise: Promise<TokenData> | null = null;\n private tokenStore: TokenStore | null;\n private rpcClient: RpcClient | null = null;\n private sseClient: SseClient | null = null;\n private wsClient: WsClient | null = null;\n private wsWarned = false;\n\n constructor(config: MeroJsConfig) {\n this.config = {\n timeoutMs: 10000,\n ...config,\n };\n\n this.tokenStore = config.tokenStore ?? null;\n\n // Restore tokens from store if available\n if (this.tokenStore) {\n this.tokenData = this.tokenStore.getTokens();\n }\n\n // Create HTTP client with token management\n // For Tauri, explicitly set credentials to 'omit' to avoid network errors\n const isTauri = typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;\n this.httpClient = createBrowserHttpClient({\n baseUrl: this.config.baseUrl,\n getAuthToken: async () => {\n const token = await this.getValidToken();\n return token?.access_token || '';\n },\n refreshToken: async () => {\n const refreshed = await this.performTokenRefresh();\n return refreshed.access_token;\n },\n onTokenRefresh: async (newToken: string) => {\n if (this.tokenData) {\n this.tokenData.access_token = newToken;\n this.tokenStore?.setTokens(this.tokenData);\n }\n },\n timeoutMs: this.config.timeoutMs,\n credentials: this.config.requestCredentials ?? (isTauri ? 'omit' : undefined),\n });\n\n // Create API clients\n this.authClient = createAuthApiClientFromHttpClient(this.httpClient, {\n baseUrl: this.config.baseUrl,\n getAuthToken: async () => {\n const token = await this.getValidToken();\n return token?.access_token || '';\n },\n timeoutMs: this.config.timeoutMs,\n });\n\n this.adminClient = createAdminApiClientFromHttpClient(this.httpClient, {\n baseUrl: this.config.baseUrl,\n getAuthToken: async () => {\n const token = await this.getValidToken();\n return token?.access_token || '';\n },\n timeoutMs: this.config.timeoutMs,\n });\n }\n\n /**\n * Get the Auth API client\n */\n get auth(): AuthApiClient {\n return this.authClient;\n }\n\n /**\n * Get the Admin API client\n */\n get admin(): AdminApiClient {\n return this.adminClient;\n }\n\n /**\n * Get the RPC client (lazy initialized)\n */\n get rpc(): RpcClient {\n if (!this.rpcClient) {\n this.rpcClient = new RpcClient({ httpClient: this.httpClient });\n }\n return this.rpcClient;\n }\n\n /**\n * Get the SSE event client (lazy initialized)\n */\n get events(): SseClient {\n if (!this.sseClient) {\n this.sseClient = new SseClient({\n baseUrl: this.config.baseUrl,\n getAuthToken: async () => {\n const token = await this.getValidToken();\n return token?.access_token || '';\n },\n });\n }\n return this.sseClient;\n }\n\n /**\n * Get the WebSocket event client (lazy initialized).\n * @experimental Use `events` (SSE) for production. WsClient is experimental.\n */\n get ws(): WsClient {\n if (!this.wsWarned) {\n this.wsWarned = true;\n console.warn('[mero-js] WsClient is experimental. Use mero.events (SSE) for production.');\n }\n if (!this.wsClient) {\n this.wsClient = new WsClient({\n baseUrl: this.config.baseUrl,\n getAuthToken: async () => {\n const token = await this.getValidToken();\n return token?.access_token || '';\n },\n });\n }\n return this.wsClient;\n }\n\n /**\n * Authenticate with the provided credentials\n * This will create the root key on first use\n */\n async authenticate(credentials?: {\n username: string;\n password: string;\n }): Promise<TokenData> {\n const creds = credentials || this.config.credentials;\n if (!creds) {\n throw new Error('No credentials provided for authentication');\n }\n\n try {\n const requestBody = {\n auth_method: 'user_password',\n public_key: creds.username,\n client_name: 'mero-js-sdk',\n permissions: ['admin'],\n timestamp: Math.floor(Date.now() / 1000),\n provider_data: {\n username: creds.username,\n password: creds.password,\n },\n };\n\n const response = await this.authClient.generateTokens(requestBody);\n\n const accessToken = response.data.access_token;\n this.tokenData = {\n access_token: accessToken,\n refresh_token: response.data.refresh_token,\n expires_at: expiresAtFromJwt(accessToken, Date.now() + 3600_000),\n };\n\n this.tokenStore?.setTokens(this.tokenData);\n\n return this.tokenData;\n } catch (error) {\n throw new Error(\n `Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n\n /**\n * Get a valid token. Returns the current token as-is.\n * The server rejects refresh attempts while the access token is still valid,\n * so we never proactively refresh. Instead, the WebHttpClient handles 401\n * responses reactively via the refreshToken transport hook.\n */\n private async getValidToken(): Promise<TokenData | null> {\n return this.tokenData;\n }\n\n /**\n * Refresh the access token using the refresh token\n */\n private async refreshToken(): Promise<TokenData> {\n if (!this.tokenData?.refresh_token) {\n throw new Error('No refresh token available');\n }\n\n // Prevent multiple simultaneous refresh attempts\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = this.performTokenRefresh();\n\n try {\n const newToken = await this.refreshPromise;\n return newToken;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n /**\n * Perform the actual token refresh\n */\n private async performTokenRefresh(): Promise<TokenData> {\n if (!this.tokenData?.refresh_token) {\n throw new Error('No refresh token available');\n }\n\n try {\n const response = await this.authClient.refreshToken({\n access_token: this.tokenData.access_token,\n refresh_token: this.tokenData.refresh_token,\n });\n\n const accessToken = response.data.access_token;\n this.tokenData = {\n access_token: accessToken,\n refresh_token: response.data.refresh_token,\n expires_at: expiresAtFromJwt(accessToken, Date.now() + 3600_000),\n };\n\n this.tokenStore?.setTokens(this.tokenData);\n\n return this.tokenData;\n } catch (error) {\n // Don't clear tokens on refresh failure \u2014 the access token may still be\n // valid (server rejects refresh while access token hasn't expired yet).\n // Let the caller handle the error.\n throw new Error(\n `Token refresh failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n\n /**\n * Clear the current token\n */\n public clearToken(): void {\n this.tokenData = null;\n this.tokenStore?.clear();\n }\n\n /**\n * Check if the SDK is authenticated\n */\n public isAuthenticated(): boolean {\n return this.tokenData !== null;\n }\n\n /**\n * Set token data directly (e.g., from auth callback).\n * If `expires_at` is missing or 0, attempts to parse the JWT exp claim,\n * falling back to 1 hour from now.\n */\n public setTokenData(data: TokenData): void {\n const expiresAt = data.expires_at || expiresAtFromJwt(data.access_token, Date.now() + 3600_000);\n this.tokenData = { ...data, expires_at: expiresAt };\n this.tokenStore?.setTokens(this.tokenData);\n }\n\n /**\n * Get the current token data (for debugging)\n */\n public getTokenData(): TokenData | null {\n return this.tokenData;\n }\n\n /**\n * Close all event connections and clean up resources\n */\n public close(): void {\n this.sseClient?.close();\n this.wsClient?.close();\n }\n\n /**\n * Parse an auth callback URL hash fragment (static utility)\n */\n static parseAuthCallback(url: string): AuthCallbackResult | null {\n return parseAuthCallback(url);\n }\n\n /**\n * Build an auth login URL (static utility)\n */\n static buildAuthLoginUrl(nodeUrl: string, opts: AuthLoginOptions): string {\n return buildAuthLoginUrl(nodeUrl, opts);\n }\n}\n\n/**\n * Create a new MeroJs SDK instance\n */\nexport function createMeroJs(config: MeroJsConfig): MeroJs {\n return new MeroJs(config);\n}\n", "import type { TokenData } from '../mero-js';\n\nexport interface TokenStore {\n getTokens(): TokenData | null;\n setTokens(data: TokenData): void;\n clear(): void;\n}\n\nexport class MemoryTokenStore implements TokenStore {\n private tokens: TokenData | null = null;\n\n getTokens(): TokenData | null {\n return this.tokens;\n }\n\n setTokens(data: TokenData): void {\n this.tokens = data;\n }\n\n clear(): void {\n this.tokens = null;\n }\n}\n\nconst STORAGE_KEY = 'mero-tokens';\n\nexport class LocalStorageTokenStore implements TokenStore {\n private readonly key: string;\n\n constructor(key: string = STORAGE_KEY) {\n this.key = key;\n }\n\n getTokens(): TokenData | null {\n try {\n if (typeof localStorage === 'undefined') return null;\n const raw = localStorage.getItem(this.key);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (parsed && parsed.access_token && parsed.refresh_token) {\n return {\n access_token: parsed.access_token,\n refresh_token: parsed.refresh_token,\n expires_at: typeof parsed.expires_at === 'number' ? parsed.expires_at : Date.now() + 3600_000,\n };\n }\n return null;\n } catch {\n return null;\n }\n }\n\n setTokens(data: TokenData): void {\n try {\n if (typeof localStorage === 'undefined') return;\n localStorage.setItem(this.key, JSON.stringify(data));\n } catch {\n // Storage unavailable\n }\n }\n\n clear(): void {\n try {\n if (typeof localStorage === 'undefined') return;\n localStorage.removeItem(this.key);\n } catch {\n // Storage unavailable\n }\n }\n}\n", "export interface CloudClientConfig {\n cloudBaseUrl?: string;\n}\n\nexport interface EnableHAOptions {\n groupId: string;\n contextId: string;\n redirectUrl?: string;\n}\n\nexport interface DisableHAOptions {\n groupId: string;\n contextId: string;\n redirectUrl?: string;\n}\n\nexport class CloudClient {\n private baseUrl: string;\n\n constructor(config: CloudClientConfig = {}) {\n this.baseUrl = (config.cloudBaseUrl || 'https://cloud.calimero.network').replace(/\\/+$/, '');\n }\n\n enableHA(options: EnableHAOptions): void {\n const params = new URLSearchParams({\n group_id: options.groupId,\n context_id: options.contextId,\n });\n if (options.redirectUrl) {\n params.set('redirect_url', options.redirectUrl);\n }\n window.open(`${this.baseUrl}/enable-ha?${params.toString()}`);\n }\n\n disableHA(options: DisableHAOptions): void {\n const params = new URLSearchParams({\n group_id: options.groupId,\n context_id: options.contextId,\n });\n if (options.redirectUrl) {\n params.set('redirect_url', options.redirectUrl);\n }\n window.open(`${this.baseUrl}/disable-ha?${params.toString()}`);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["MockHttpClient"]
|
|
7
7
|
}
|