@calimero-network/mero-js 1.1.0 → 2.0.0-beta.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.
Files changed (172) hide show
  1. package/README.md +341 -319
  2. package/dist/api/admin/aliases.d.ts +54 -0
  3. package/dist/api/admin/aliases.d.ts.map +1 -0
  4. package/dist/api/admin/aliases.js +43 -0
  5. package/dist/api/admin/aliases.js.map +1 -0
  6. package/dist/api/admin/applications.d.ts +52 -0
  7. package/dist/api/admin/applications.d.ts.map +1 -0
  8. package/dist/api/admin/applications.js +31 -0
  9. package/dist/api/admin/applications.js.map +1 -0
  10. package/dist/api/admin/blobs.d.ts +24 -0
  11. package/dist/api/admin/blobs.d.ts.map +1 -0
  12. package/dist/api/admin/blobs.js +58 -0
  13. package/dist/api/admin/blobs.js.map +1 -0
  14. package/dist/api/admin/capabilities.d.ts +26 -0
  15. package/dist/api/admin/capabilities.d.ts.map +1 -0
  16. package/dist/api/admin/capabilities.js +13 -0
  17. package/dist/api/admin/capabilities.js.map +1 -0
  18. package/dist/api/admin/client.d.ts +63 -0
  19. package/dist/api/admin/client.d.ts.map +1 -0
  20. package/dist/api/admin/client.js +103 -0
  21. package/dist/api/admin/client.js.map +1 -0
  22. package/dist/api/admin/contexts.d.ts +110 -0
  23. package/dist/api/admin/contexts.d.ts.map +1 -0
  24. package/dist/api/admin/contexts.js +61 -0
  25. package/dist/api/admin/contexts.js.map +1 -0
  26. package/dist/api/admin/factory.d.ts +4 -0
  27. package/dist/api/admin/factory.d.ts.map +1 -0
  28. package/dist/api/admin/factory.js +5 -0
  29. package/dist/api/admin/factory.js.map +1 -0
  30. package/dist/api/admin/identity.d.ts +10 -0
  31. package/dist/api/admin/identity.d.ts.map +1 -0
  32. package/dist/api/admin/identity.js +10 -0
  33. package/dist/api/admin/identity.js.map +1 -0
  34. package/dist/api/admin/index.d.ts +23 -0
  35. package/dist/api/admin/index.d.ts.map +1 -0
  36. package/dist/api/admin/index.js +26 -0
  37. package/dist/api/admin/index.js.map +1 -0
  38. package/dist/api/admin/network.d.ts +10 -0
  39. package/dist/api/admin/network.d.ts.map +1 -0
  40. package/dist/api/admin/network.js +9 -0
  41. package/dist/api/admin/network.js.map +1 -0
  42. package/dist/api/admin/proposals.d.ts +49 -0
  43. package/dist/api/admin/proposals.d.ts.map +1 -0
  44. package/dist/api/admin/proposals.js +34 -0
  45. package/dist/api/admin/proposals.js.map +1 -0
  46. package/dist/api/admin/public.d.ts +15 -0
  47. package/dist/api/admin/public.d.ts.map +1 -0
  48. package/dist/api/admin/public.js +18 -0
  49. package/dist/api/admin/public.js.map +1 -0
  50. package/dist/api/admin/tee.d.ts +74 -0
  51. package/dist/api/admin/tee.d.ts.map +1 -0
  52. package/dist/api/admin/tee.js +16 -0
  53. package/dist/api/admin/tee.js.map +1 -0
  54. package/dist/api/auth/client.d.ts +55 -0
  55. package/dist/api/auth/client.d.ts.map +1 -0
  56. package/dist/api/auth/client.js +127 -0
  57. package/dist/api/auth/client.js.map +1 -0
  58. package/dist/api/auth/factory.d.ts +4 -0
  59. package/dist/api/auth/factory.d.ts.map +1 -0
  60. package/dist/api/auth/factory.js +5 -0
  61. package/dist/api/auth/factory.js.map +1 -0
  62. package/dist/api/auth/index.d.ts +4 -0
  63. package/dist/api/auth/index.d.ts.map +1 -0
  64. package/dist/api/auth/index.js +4 -0
  65. package/dist/api/auth/index.js.map +1 -0
  66. package/dist/api/auth/types.d.ts +94 -0
  67. package/dist/api/auth/types.d.ts.map +1 -0
  68. package/dist/api/auth/types.js +4 -0
  69. package/dist/api/auth/types.js.map +1 -0
  70. package/dist/api/index.d.ts +15 -0
  71. package/dist/api/index.d.ts.map +1 -0
  72. package/dist/api/index.js +18 -0
  73. package/dist/api/index.js.map +1 -0
  74. package/dist/api/rpc/client.d.ts +76 -0
  75. package/dist/api/rpc/client.d.ts.map +1 -0
  76. package/dist/api/rpc/client.js +126 -0
  77. package/dist/api/rpc/client.js.map +1 -0
  78. package/dist/api/rpc/index.d.ts +3 -0
  79. package/dist/api/rpc/index.d.ts.map +1 -0
  80. package/dist/api/rpc/index.js +2 -0
  81. package/dist/api/rpc/index.js.map +1 -0
  82. package/dist/api/rpc/types.d.ts +74 -0
  83. package/dist/api/rpc/types.d.ts.map +1 -0
  84. package/dist/api/rpc/types.js +6 -0
  85. package/dist/api/rpc/types.js.map +1 -0
  86. package/dist/api/sse/client.d.ts +76 -0
  87. package/dist/api/sse/client.d.ts.map +1 -0
  88. package/dist/api/sse/client.js +203 -0
  89. package/dist/api/sse/client.js.map +1 -0
  90. package/dist/api/sse/index.d.ts +4 -0
  91. package/dist/api/sse/index.d.ts.map +1 -0
  92. package/dist/api/sse/index.js +2 -0
  93. package/dist/api/sse/index.js.map +1 -0
  94. package/dist/api/sse/types.d.ts +35 -0
  95. package/dist/api/sse/types.d.ts.map +1 -0
  96. package/dist/api/sse/types.js +6 -0
  97. package/dist/api/sse/types.js.map +1 -0
  98. package/dist/api/utils.d.ts +68 -0
  99. package/dist/api/utils.d.ts.map +1 -0
  100. package/dist/api/utils.js +83 -0
  101. package/dist/api/utils.js.map +1 -0
  102. package/dist/api/ws/client.d.ts +72 -0
  103. package/dist/api/ws/client.d.ts.map +1 -0
  104. package/dist/api/ws/client.js +202 -0
  105. package/dist/api/ws/client.js.map +1 -0
  106. package/dist/api/ws/index.d.ts +4 -0
  107. package/dist/api/ws/index.d.ts.map +1 -0
  108. package/dist/api/ws/index.js +2 -0
  109. package/dist/api/ws/index.js.map +1 -0
  110. package/dist/api/ws/types.d.ts +32 -0
  111. package/dist/api/ws/types.d.ts.map +1 -0
  112. package/dist/api/ws/types.js +6 -0
  113. package/dist/api/ws/types.js.map +1 -0
  114. package/dist/http-client/index.d.ts +1 -1
  115. package/dist/http-client/index.d.ts.map +1 -1
  116. package/dist/http-client/index.js +2 -1
  117. package/dist/http-client/index.js.map +1 -1
  118. package/dist/http-client/web-client.d.ts +3 -3
  119. package/dist/http-client/web-client.d.ts.map +1 -1
  120. package/dist/http-client/web-client.js +16 -6
  121. package/dist/http-client/web-client.js.map +1 -1
  122. package/dist/index.browser.mjs +1 -1
  123. package/dist/index.browser.mjs.map +4 -4
  124. package/dist/index.cjs +1590 -281
  125. package/dist/index.cjs.map +4 -4
  126. package/dist/index.d.ts +8 -3
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +7 -5
  129. package/dist/index.js.map +1 -1
  130. package/dist/index.mjs +1596 -281
  131. package/dist/index.mjs.map +4 -4
  132. package/dist/mero-js.d.ts +198 -7
  133. package/dist/mero-js.d.ts.map +1 -1
  134. package/dist/mero-js.js +329 -38
  135. package/dist/mero-js.js.map +1 -1
  136. package/package.json +42 -7
  137. package/dist/admin-api/admin-client.d.ts +0 -38
  138. package/dist/admin-api/admin-client.d.ts.map +0 -1
  139. package/dist/admin-api/admin-client.js +0 -104
  140. package/dist/admin-api/admin-client.js.map +0 -1
  141. package/dist/admin-api/admin-factory.d.ts +0 -8
  142. package/dist/admin-api/admin-factory.d.ts.map +0 -1
  143. package/dist/admin-api/admin-factory.js +0 -42
  144. package/dist/admin-api/admin-factory.js.map +0 -1
  145. package/dist/admin-api/admin-types.d.ts +0 -213
  146. package/dist/admin-api/admin-types.d.ts.map +0 -1
  147. package/dist/admin-api/admin-types.js +0 -3
  148. package/dist/admin-api/admin-types.js.map +0 -1
  149. package/dist/admin-api/index.d.ts +0 -4
  150. package/dist/admin-api/index.d.ts.map +0 -1
  151. package/dist/admin-api/index.js +0 -5
  152. package/dist/admin-api/index.js.map +0 -1
  153. package/dist/auth-api/auth-client.d.ts +0 -34
  154. package/dist/auth-api/auth-client.d.ts.map +0 -1
  155. package/dist/auth-api/auth-client.js +0 -112
  156. package/dist/auth-api/auth-client.js.map +0 -1
  157. package/dist/auth-api/auth-factory.d.ts +0 -8
  158. package/dist/auth-api/auth-factory.d.ts.map +0 -1
  159. package/dist/auth-api/auth-factory.js +0 -42
  160. package/dist/auth-api/auth-factory.js.map +0 -1
  161. package/dist/auth-api/auth-types.d.ts +0 -127
  162. package/dist/auth-api/auth-types.d.ts.map +0 -1
  163. package/dist/auth-api/auth-types.js +0 -3
  164. package/dist/auth-api/auth-types.js.map +0 -1
  165. package/dist/auth-api/index.d.ts +0 -4
  166. package/dist/auth-api/index.d.ts.map +0 -1
  167. package/dist/auth-api/index.js +0 -5
  168. package/dist/auth-api/index.js.map +0 -1
  169. package/dist/http-client/api-response.d.ts +0 -16
  170. package/dist/http-client/api-response.d.ts.map +0 -1
  171. package/dist/http-client/api-response.js +0 -2
  172. package/dist/http-client/api-response.js.map +0 -1
@@ -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/auth-api/auth-client.ts", "../src/auth-api/auth-factory.ts", "../src/admin-api/admin-client.ts", "../src/admin-api/admin-factory.ts", "../src/mero-js.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 // Don't retry if user aborted the request\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 && // Can't retry with stream bodies\n !userAborted // Don't retry if user aborted\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 {\n // Common types\n ApiResponse,\n // Health and Status\n HealthStatus,\n AdminAuthStatus,\n\n // Applications\n InstallApplicationRequest,\n InstallDevApplicationRequest,\n InstallApplicationResponse,\n UninstallApplicationResponse,\n ListApplicationsResponse,\n GetApplicationResponse,\n\n // Contexts\n CreateContextRequest,\n CreateContextResponse,\n DeleteContextResponse,\n ListContextsResponse,\n GetContextResponse,\n\n // Blobs\n UploadBlobRequest,\n UploadBlobResponse,\n DeleteBlobResponse,\n ListBlobsResponse,\n GetBlobResponse,\n\n // Aliases\n CreateAliasRequest,\n CreateAliasResponse,\n DeleteAliasResponse,\n ListAliasesResponse,\n GetAliasResponse,\n\n // Network\n GetNetworkPeersResponse,\n GetNetworkStatsResponse,\n GetNetworkConfigResponse,\n UpdateNetworkConfigRequest,\n UpdateNetworkConfigResponse,\n\n // System\n GetSystemInfoResponse,\n GetSystemLogsResponse,\n GetSystemMetricsResponse,\n RestartSystemResponse,\n ShutdownSystemResponse,\n} from './admin-types';\n\nexport class AdminApiClient {\n constructor(private httpClient: HttpClient) {}\n\n // Health and Status Endpoints\n async healthCheck(): Promise<HealthStatus> {\n const response =\n await this.httpClient.get<ApiResponse<HealthStatus>>('/health');\n if (!response.data) {\n throw new Error('Health response data is null');\n }\n return response.data;\n }\n\n async isAuthed(): Promise<AdminAuthStatus> {\n return this.httpClient.get<AdminAuthStatus>('/is-authed');\n }\n\n // Application Management Endpoints\n async installApplication(\n request: InstallApplicationRequest,\n ): Promise<InstallApplicationResponse> {\n return this.httpClient.post<InstallApplicationResponse>(\n '/install-application',\n request,\n );\n }\n\n async installDevApplication(\n request: InstallDevApplicationRequest,\n ): Promise<InstallApplicationResponse> {\n return this.httpClient.post<InstallApplicationResponse>(\n '/install-dev-application',\n request,\n );\n }\n\n async uninstallApplication(\n appId: string,\n ): Promise<UninstallApplicationResponse> {\n return this.httpClient.delete<UninstallApplicationResponse>(\n `/applications/${appId}`,\n );\n }\n\n async listApplications(): Promise<ListApplicationsResponse> {\n return this.httpClient.get<ListApplicationsResponse>('/applications');\n }\n\n async getApplication(appId: string): Promise<GetApplicationResponse> {\n return this.httpClient.get<GetApplicationResponse>(\n `/applications/${appId}`,\n );\n }\n\n // Context Management Endpoints\n async createContext(\n request: CreateContextRequest,\n ): Promise<CreateContextResponse> {\n return this.httpClient.post<CreateContextResponse>('/contexts', request);\n }\n\n async deleteContext(contextId: string): Promise<DeleteContextResponse> {\n return this.httpClient.delete<DeleteContextResponse>(\n `/contexts/${contextId}`,\n );\n }\n\n async getContexts(): Promise<ListContextsResponse> {\n return this.httpClient.get<ListContextsResponse>('/contexts');\n }\n\n async getContext(contextId: string): Promise<GetContextResponse> {\n return this.httpClient.get<GetContextResponse>(`/contexts/${contextId}`);\n }\n\n // Blob Management Endpoints\n async uploadBlob(request: UploadBlobRequest): Promise<UploadBlobResponse> {\n return this.httpClient.post<UploadBlobResponse>('/blobs', request);\n }\n\n async deleteBlob(blobId: string): Promise<DeleteBlobResponse> {\n return this.httpClient.delete<DeleteBlobResponse>(`/blobs/${blobId}`);\n }\n\n async listBlobs(): Promise<ListBlobsResponse> {\n return this.httpClient.get<ListBlobsResponse>('/blobs');\n }\n\n async getBlob(blobId: string): Promise<GetBlobResponse> {\n return this.httpClient.get<GetBlobResponse>(`/blobs/${blobId}`);\n }\n\n // Alias Management Endpoints\n async createAlias(request: CreateAliasRequest): Promise<CreateAliasResponse> {\n return this.httpClient.post<CreateAliasResponse>('/alias', request);\n }\n\n async deleteAlias(aliasId: string): Promise<DeleteAliasResponse> {\n return this.httpClient.delete<DeleteAliasResponse>(`/alias/${aliasId}`);\n }\n\n async listAliases(): Promise<ListAliasesResponse> {\n return this.httpClient.get<ListAliasesResponse>('/alias');\n }\n\n async getAlias(aliasId: string): Promise<GetAliasResponse> {\n return this.httpClient.get<GetAliasResponse>(`/alias/${aliasId}`);\n }\n\n // Network Management Endpoints\n async getNetworkPeers(): Promise<GetNetworkPeersResponse> {\n return this.httpClient.get<GetNetworkPeersResponse>('/network/peers');\n }\n\n async getNetworkStats(): Promise<GetNetworkStatsResponse> {\n return this.httpClient.get<GetNetworkStatsResponse>('/network/stats');\n }\n\n async getNetworkConfig(): Promise<GetNetworkConfigResponse> {\n return this.httpClient.get<GetNetworkConfigResponse>('/network/config');\n }\n\n async updateNetworkConfig(\n request: UpdateNetworkConfigRequest,\n ): Promise<UpdateNetworkConfigResponse> {\n return this.httpClient.put<UpdateNetworkConfigResponse>(\n '/network/config',\n request,\n );\n }\n\n async getPeersCount(): Promise<{ count: number }> {\n return this.httpClient.get<{ count: number }>('/network/peers/count');\n }\n\n // System Management Endpoints\n async getSystemInfo(): Promise<GetSystemInfoResponse> {\n return this.httpClient.get<GetSystemInfoResponse>('/system/info');\n }\n\n async getSystemLogs(): Promise<GetSystemLogsResponse> {\n return this.httpClient.get<GetSystemLogsResponse>('/system/logs');\n }\n\n async getSystemMetrics(): Promise<GetSystemMetricsResponse> {\n return this.httpClient.get<GetSystemMetricsResponse>('/system/metrics');\n }\n\n async restartSystem(): Promise<RestartSystemResponse> {\n return this.httpClient.post<RestartSystemResponse>('/system/restart');\n }\n\n async shutdownSystem(): Promise<ShutdownSystemResponse> {\n return this.httpClient.post<ShutdownSystemResponse>('/system/shutdown');\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", "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';\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}\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 tokenData: TokenData | null = null;\n private refreshPromise: Promise<TokenData> | null = null;\n\n constructor(config: MeroJsConfig) {\n this.config = {\n timeoutMs: 10000,\n ...config,\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 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 // Token management is in-memory only\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 * 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 this.tokenData = {\n access_token: response.data.access_token,\n refresh_token: response.data.refresh_token,\n expires_at: Date.now() + 24 * 60 * 60 * 1000, // Default to 24 hours\n };\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, refreshing if necessary\n */\n private async getValidToken(): Promise<TokenData | null> {\n if (!this.tokenData) {\n return null;\n }\n\n // Check if token is expired (with 5 minute buffer)\n const bufferTime = 5 * 60 * 1000; // 5 minutes\n if (Date.now() >= this.tokenData.expires_at - bufferTime) {\n return await this.refreshToken();\n }\n\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 this.tokenData = {\n access_token: response.data.access_token,\n refresh_token: response.data.refresh_token,\n expires_at: Date.now() + 24 * 60 * 60 * 1000, // Default to 24 hours\n };\n\n return this.tokenData;\n } catch (error) {\n // If refresh fails, clear the token and require re-authentication\n 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\n */\n public clearToken(): void {\n this.tokenData = null;\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/**\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": ["MockHttpClient"]
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/api/auth/index.ts", "../src/api/utils.ts", "../src/api/auth/client.ts", "../src/api/auth/factory.ts", "../src/api/admin/index.ts", "../src/api/admin/public.ts", "../src/api/admin/applications.ts", "../src/api/admin/contexts.ts", "../src/api/admin/proposals.ts", "../src/api/admin/capabilities.ts", "../src/api/admin/identity.ts", "../src/api/admin/network.ts", "../src/api/admin/blobs.ts", "../src/api/admin/aliases.ts", "../src/api/admin/tee.ts", "../src/api/admin/client.ts", "../src/api/admin/factory.ts", "../src/api/rpc/index.ts", "../src/api/rpc/client.ts", "../src/api/ws/index.ts", "../src/api/ws/client.ts", "../src/api/sse/index.ts", "../src/api/sse/client.ts", "../src/mero-js.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 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": []
7
7
  }