@trieoh/identityx-sdk-ts 0.12.6 → 0.12.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react.js +2 -2
- package/dist/cjs/react.js.map +1 -1
- package/dist/esm/{api-DH83FB5b.d.ts → api-BjzcDj0c.d.ts} +2 -2
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react.d.ts +112 -3
- package/dist/esm/react.js +2 -2
- package/dist/esm/react.js.map +1 -1
- package/package.json +14 -6
|
@@ -2,8 +2,8 @@ import * as _trieoh_envoy_fetch_ts from '@trieoh/envoy-fetch-ts';
|
|
|
2
2
|
import { DefaultFetchClientConfig, FetchClientOptions, DefaultFailureEnvelope } from '@trieoh/envoy-fetch-ts';
|
|
3
3
|
|
|
4
4
|
interface AuthTokens {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
access_token: string;
|
|
6
|
+
refresh_token: string;
|
|
7
7
|
access_expires_at: string;
|
|
8
8
|
refresh_expires_at: string;
|
|
9
9
|
domain: string;
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as AuthInterceptor, R as RequestOptions, c as createAuthInterceptor, a as createAuthenticatedFetch, b as createFetcher, d as createQueryFetcher } from './api-
|
|
1
|
+
export { A as AuthInterceptor, R as RequestOptions, c as createAuthInterceptor, a as createAuthenticatedFetch, b as createFetcher, d as createQueryFetcher } from './api-BjzcDj0c.js';
|
|
2
2
|
export { FetchClientError as ApiError, DefaultFetchResult as ApiResponse } from '@trieoh/envoy-fetch-ts';
|
|
3
3
|
|
|
4
4
|
interface TrieOHEnv {
|
package/dist/esm/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {simpleFetch,logger,createDefaultFetchClient}from'@trieoh/envoy-fetch-ts';export{FetchClientError as ApiError}from'@trieoh/envoy-fetch-ts';function
|
|
2
|
-
export{
|
|
1
|
+
import {simpleFetch,logger,createDefaultFetchClient}from'@trieoh/envoy-fetch-ts';export{FetchClientError as ApiError}from'@trieoh/envoy-fetch-ts';function w(t,e){if(e.startsWith("http"))return e;let r=t.replace(/\/$/,""),n=e.replace(/^\//,"");return `${r}/${n}`}var m={isAuthenticated:false,isInitializing:true},_=new Set,q=()=>_.forEach(t=>t()),g={subscribe:t=>(_.add(t),()=>_.delete(t)),getSnapshot:()=>m,getServerSnapshot:()=>m,set:t=>{m={...m,...t},q();},reset:()=>{m={isAuthenticated:false,isInitializing:false},q();}};typeof window<"u"&&window.addEventListener("storage",t=>{if(t.key==="trieoh_access_expiry")if(!t.newValue)g.reset();else {let e=Number(t.newValue),r=!isNaN(e)&&e>Date.now();g.set({isAuthenticated:r,isInitializing:false});}});var i={getItem:t=>typeof window<"u"?localStorage.getItem(t):null,setItem:(t,e)=>{typeof window<"u"&&localStorage.setItem(t,e);},removeItem:t=>{typeof window<"u"&&localStorage.removeItem(t);}},T={getItem:t=>typeof window<"u"?sessionStorage.getItem(t):null,setItem:(t,e)=>{typeof window<"u"&&sessionStorage.setItem(t,e);},removeItem:t=>{typeof window<"u"&&sessionStorage.removeItem(t);}};var y="trieoh_access_token",c={getAccessToken:()=>T.getItem(y),setAccessToken:t=>{t?T.setItem(y,t):T.removeItem(y);},clear:()=>{T.removeItem(y);}};var R=null,S="trieoh_access_expiry",x="trieoh_refresh_expiry",C="trieoh_refresh_token";function D(t){try{let e=t.split(".")[1];if(!e)return null;let r=e.replace(/-/g,"+").replace(/_/g,"/");for(;r.length%4;)r+="=";let n=decodeURIComponent(atob(r).split("").map(s=>"%"+("00"+s.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(n)}catch(e){return logger.error("Error decoding JWT:",e),null}}function L(t){let{access_token:e,refresh_token:r,access_expires_at:n,refresh_expires_at:s}=t,E=D(e);if(!E){logger.error("Failed to decode tokens");return}c.setAccessToken(e);let f=new Date(s).getTime(),h=new Date(n).getTime();i.setItem(C,r),i.setItem(S,String(h)),i.setItem(x,String(f)),R={access_data:E,refresh_expiry_date:f},g.set({isAuthenticated:true,isInitializing:false}),logger.log("Auth session saved");}function O(){return i.getItem(C)}function B(){if(R)return R;let t=c.getAccessToken();if(!t)return null;let e=D(t);if(!e||e.exp*1e3<=Date.now())return null;let r=i.getItem(x);if(!r)return null;let n=Number(r);if(isNaN(n))return null;let s={access_data:e,refresh_expiry_date:n};return R=s,s}function N(t,e){try{let r=i.getItem(t);if(!r)return !0;let n=Number(r);return isNaN(n)?!0:n-Date.now()<=e*1e3}catch(r){return logger.warn("Error reading expiry:",r),true}}var b=(t=30)=>N(S,t),H=(t=10)=>N(x,t);function P(){R=null,c.clear(),i.removeItem(S),i.removeItem(x),i.removeItem(C),g.reset(),logger.log("Auth tokens and claims cleared");}function K(){let t=typeof window>"u",e=typeof import.meta<"u"&&import.meta.env?import.meta.env:{},r=typeof process<"u"?process.env:{},n=e.VITE_TRIEOH_AUTH_PROJECT_ID||r.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID||r.PUBLIC_TRIEOH_AUTH_PROJECT_ID||"",s=t&&r.TRIEOH_AUTH_API_KEY||"";return {PROJECT_ID:n,API_KEY:s,BASE_URL:"https://api.trieauth.trieoh.com"}}var I=null,F={};function Y(t){F={...F,...t},I=null;}function U(){return I||(I={...K(),...F}),I}var J={get BASE_URL(){return U().BASE_URL}};var p=class{constructor(e){this.isRefreshing=false;this.refreshPromise=null;this.baseURL=e?.baseURL||J.BASE_URL,this.authBaseURL=e?.authBaseURL||this.baseURL,this.onTokenRefreshed=e?.onTokenRefreshed,this.onRefreshFailed=e?.onRefreshFailed;}async refreshToken(){return this.isRefreshing&&this.refreshPromise?this.refreshPromise:(this.isRefreshing=true,this.refreshPromise=(async()=>{let e=true;try{let r=O();if(!r)throw e=!0,new Error("No refresh token available");let n=await simpleFetch(w(this.authBaseURL,"/auth/refresh"),{method:"POST",credentials:"omit",headers:{refresh_token:r}});if(n.code!==200||!n.data)throw e=n.code!==503,new Error(n.message||"Failed to refresh token");L(n.data);let s=B();s&&this.onTokenRefreshed?.(s),logger.log("Token refreshed successfully");}catch(r){throw logger.warn("Failed to refresh token:",r),e&&P(),this.onRefreshFailed?.(r),r}finally{this.isRefreshing=false,this.refreshPromise=null;}})(),this.refreshPromise)}async beforeRequest(){if(H()){P();return}if(!!!c.getAccessToken()||b(30))try{await this.refreshToken();}catch(r){logger.warn("Proactive refresh failed:",r);}}async fetch(e,r){let n=r?.requiresAuth!==false,s=e.includes("/auth/refresh");n&&!s&&!r?.skipRefresh&&await this.beforeRequest();let E=w(this.baseURL,e),f=async()=>{let d=c.getAccessToken(),l=new Headers(r?.headers);return n&&d&&l.set("Authorization",`Bearer ${d}`),l.has("Content-Type")||l.set("Content-Type","application/json"),fetch(E,{...r,headers:l,credentials:"omit"})},h=await f();if(h.status===401&&n&&!s){let d=!!O(),l=b(30);if(d&&l){logger.log("401 detected and token is expiring/expired, attempting refresh...");try{await this.refreshToken(),h=await f();}catch{logger.error("Retry failed after refresh error");}}}return h}},Te=t=>new p(t),Re=t=>{let e=new p(t);return (r,n)=>e.fetch(r,n)};function u(t){if(!t)return;let{requiresAuth:e,skipRefresh:r,...n}=t,s={};return e!==void 0&&(s.requiresAuth=e),r!==void 0&&(s.skipRefresh=r),{...n,adapterInit:{...n.adapterInit,...s}}}var v=class{constructor(e,r,n,s){this.interceptor=new p({baseURL:e,authBaseURL:r,onTokenRefreshed:n}),this.client=createDefaultFetchClient({...s,adapter:this.interceptor.fetch.bind(this.interceptor)});}request(e,r){return this.client.request(e,u(r))}get(e,r){return this.client.get(e,u(r))}post(e,r,n){return this.client.post(e,r,u(n))}put(e,r,n){return this.client.put(e,r,u(n))}patch(e,r,n){return this.client.patch(e,r,u(n))}delete(e,r,n){return this.client.delete(e,r,u(n))}query(e,r){return this.client.query(e,u(r))}};function z(t){let e=new v(t?.baseURL,t?.authBaseURL,void 0,t?.clientConfig);return {request:e.request.bind(e),get:e.get.bind(e),post:e.post.bind(e),put:e.put.bind(e),patch:e.patch.bind(e),delete:e.delete.bind(e),query:e.query.bind(e)}}function Q(t){let e=new v(t?.baseURL,t?.authBaseURL,void 0,t?.clientConfig);return (r,n)=>e.query(r,n)}
|
|
2
|
+
export{p as AuthInterceptor,Y as configure,Te as createAuthInterceptor,Re as createAuthenticatedFetch,z as createFetcher,Q as createQueryFetcher};//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/url-utils.ts","../../src/store/auth-store.ts","../../src/utils/storage-adapter.ts","../../src/store/token-store.ts","../../src/utils/token-utils.ts","../../src/core/env.ts","../../src/core/interceptor.ts","../../src/core/api.ts"],"names":["joinUrl","base","path","cleanBase","cleanPath","_state","_listeners","notify","l","authStore","cb","partial","event","expiry","isAuthenticated","browserStorage","key","value","sessionBrowserStorage","cookieStorage","name","nameEQ","ca","i","c","options","expires","domain","secure","sameSite","isLocalhost","cookieParts","ACCESS_TOKEN_KEY","tokenStore","token","_cachedClaims","ACCESS_EXPIRY_KEY","REFRESH_EXPIRY_KEY","REFRESH_DOMAIN_KEY","getCookieDomain","returnedDomain","hostname","decodeJwt","payload","base64","jsonPayload","error","logger","saveAuthSession","tokens","access_token_string","refresh_token_string","access_expires_at","refresh_expires_at","claims","refreshExpiry","accessExpiry","getTokenClaims","refreshExpiryStr","sessionData","isExpiringSoon","thresholdSeconds","stored","e","isTokenExpiringSoon","isRefreshSessionExpired","clearAuthTokens","resolveEnv","isServer","viteEnv","safeProcessEnv","resolvedProjectId","resolvedApiKey","memoizedEnv","overrides","configure","config","getEnv","env","AuthInterceptor","shouldClear","res","simpleFetch","url","shouldAuth","isRefreshReq","finalUrl","executeFetch","accessToken","headers","response","hasRefreshCookie","isExpiring","createAuthInterceptor","createAuthenticatedFetch","interceptor","toFetchOptions","requiresAuth","skipRefresh","rest","interceptorFields","Api","baseURL","authBaseURL","onTokenRefreshed","clientConfig","createDefaultFetchClient","body","createFetcher","api","createQueryFetcher"],"mappings":"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","file":"index.js","sourcesContent":["export function joinUrl(base: string, path: string): string {\n if (path.startsWith(\"http\")) return path;\n \n const cleanBase = base.replace(/\\/$/, \"\");\n const cleanPath = path.replace(/^\\//, \"\");\n \n return `${cleanBase}/${cleanPath}`;\n}\n","type AuthState = {\n isAuthenticated: boolean;\n isInitializing: boolean;\n};\n\nlet _state: AuthState = {\n isAuthenticated: false,\n isInitializing: true,\n};\nconst _listeners = new Set<() => void>();\n\nconst notify = () => _listeners.forEach((l) => l());\n\nexport const authStore = {\n subscribe: (cb: () => void) => {\n _listeners.add(cb);\n return () => _listeners.delete(cb);\n },\n getSnapshot: () => _state,\n getServerSnapshot: () => _state,\n set: (partial: Partial<AuthState>) => {\n _state = { ..._state, ...partial };\n notify();\n },\n reset: () => {\n _state = {\n isAuthenticated: false,\n isInitializing: false,\n };\n notify();\n },\n};\n\n// Sync between tabs\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", (event) => {\n if (event.key === \"trieoh_access_expiry\") {\n if (!event.newValue) authStore.reset();\n else {\n const expiry = Number(event.newValue);\n const isAuthenticated = !isNaN(expiry) && expiry > Date.now();\n authStore.set({ isAuthenticated, isInitializing: false });\n }\n }\n });\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport const browserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? localStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") localStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") localStorage.removeItem(key);\n },\n};\n\nexport const sessionBrowserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? sessionStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") sessionStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") sessionStorage.removeItem(key);\n },\n};\n\nexport interface CookieOptions {\n expires?: string;\n path?: string;\n domain?: string | null;\n secure?: boolean;\n sameSite?: \"Lax\" | \"None\" | \"Strict\";\n}\n\nexport const cookieStorage = {\n get: (name: string): string | null => {\n if (typeof window === \"undefined\") return null;\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n },\n\n set: (name: string, value: string, options: CookieOptions = {}) => {\n if (typeof window === \"undefined\") return;\n\n const {\n expires,\n path = \"/\",\n domain,\n secure = window.location.protocol === \"https:\",\n sameSite = secure ? \"None\" : \"Lax\",\n } = options;\n\n const isLocalhost = window.location.hostname === \"localhost\";\n\n const cookieParts = [\n `${name}=${value}`,\n domain && !isLocalhost ? `Domain=${domain}` : \"\",\n `Path=${path}`,\n `SameSite=${sameSite}`,\n secure ? \"Secure\" : \"\",\n expires ? `expires=${expires}` : \"\",\n ];\n\n document.cookie = cookieParts.filter(Boolean).join(\"; \");\n },\n\n remove: (name: string, domain?: string | null) => {\n cookieStorage.set(name, \"\", {\n expires: \"Thu, 01 Jan 1970 00:00:00 GMT\",\n domain: domain || undefined,\n });\n },\n};\n","import { sessionBrowserStorage } from \"../utils/storage-adapter\";\n\nconst ACCESS_TOKEN_KEY = \"trieoh_access_token\";\n\nexport const tokenStore = {\n getAccessToken: () => sessionBrowserStorage.getItem(ACCESS_TOKEN_KEY),\n setAccessToken: (token: string | null) => {\n if (token) sessionBrowserStorage.setItem(ACCESS_TOKEN_KEY, token);\n else sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n },\n clear: () => {\n sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n }\n};\n","import { authStore } from \"../store/auth-store\";\nimport { tokenStore } from \"../store/token-store\";\nimport { logger } from \"@trieoh/envoy-fetch-ts\";\nimport { browserStorage, cookieStorage } from \"./storage-adapter\";\n\nexport interface AuthTokens {\n access_token_string: string;\n refresh_token_string: string;\n access_expires_at: string;\n refresh_expires_at: string;\n domain: string;\n}\n\nexport interface TokenClaims {\n sub: {\n id: string;\n email: string;\n session_id: string;\n user_agent: string;\n user_ip: string;\n project_id: string | null;\n verified_at: string | null;\n is_verified: boolean;\n user_type: \"client\" | \"project\";\n metadata: Record<string, unknown> | null;\n };\n iss: string;\n exp: number;\n iat: number;\n jti: string;\n}\n\nexport interface AuthTokenClaims {\n access_data: TokenClaims;\n refresh_expiry_date: string | number;\n}\n\n// Stored only in memory\nlet _cachedClaims: AuthTokenClaims | null = null;\nconst ACCESS_EXPIRY_KEY = \"trieoh_access_expiry\";\nconst REFRESH_EXPIRY_KEY = \"trieoh_refresh_expiry\";\nconst REFRESH_DOMAIN_KEY = \"trieoh_refresh_domain\";\n\nexport function getCookieDomain(returnedDomain?: string) {\n if (typeof window === \"undefined\") return null;\n const hostname = window.location.hostname;\n const isLocalhost = hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname.includes(\"localhost\");\n if (isLocalhost) return null;\n\n if (returnedDomain) {\n try {\n let domain = returnedDomain;\n if (domain.startsWith(\"http\")) domain = new URL(domain).hostname;\n if (hostname === domain || hostname.endsWith(\".\" + domain)) return domain;\n return hostname;\n } catch { return hostname; }\n }\n\n return hostname;\n}\n\nexport function decodeJwt<T>(token: string): T | null {\n try {\n const payload = token.split(\".\")[1];\n if (!payload) return null;\n\n let base64 = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (base64.length % 4) {\n base64 += \"=\";\n }\n\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\")\n );\n\n return JSON.parse(jsonPayload);\n } catch (error) {\n logger.error(\"Error decoding JWT:\", error);\n return null;\n }\n}\n\nexport function saveAuthSession(tokens: AuthTokens): void {\n const {\n access_token_string,\n refresh_token_string,\n access_expires_at,\n refresh_expires_at,\n } = tokens;\n\n const claims = decodeJwt<TokenClaims>(access_token_string);\n\n if (!claims) {\n logger.error(\"Failed to decode tokens\");\n return;\n }\n\n tokenStore.setAccessToken(access_token_string);\n\n const refreshExpiry = new Date(refresh_expires_at).getTime();\n const accessExpiry = new Date(access_expires_at).getTime();\n const domain = getCookieDomain(tokens.domain);\n\n cookieStorage.set(\"refresh_token\", refresh_token_string, {\n expires: new Date(refreshExpiry).toUTCString(),\n domain\n });\n\n const sessionData: AuthTokenClaims = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n _cachedClaims = sessionData;\n\n browserStorage.setItem(ACCESS_EXPIRY_KEY, String(accessExpiry));\n browserStorage.setItem(REFRESH_EXPIRY_KEY, String(refreshExpiry));\n if (domain) browserStorage.setItem(REFRESH_DOMAIN_KEY, domain);\n else browserStorage.removeItem(REFRESH_DOMAIN_KEY);\n\n authStore.set({\n isAuthenticated: true,\n isInitializing: false,\n });\n\n logger.log(\"Auth session saved\");\n}\n\nexport function getTokenClaims(): AuthTokenClaims | null {\n if (_cachedClaims) return _cachedClaims;\n\n const token = tokenStore.getAccessToken();\n if (!token) return null;\n\n const claims = decodeJwt<TokenClaims>(token);\n if (!claims) return null;\n\n // Check if token is expired\n if (claims.exp * 1000 <= Date.now()) return null;\n\n const refreshExpiryStr = browserStorage.getItem(REFRESH_EXPIRY_KEY);\n if (!refreshExpiryStr) return null;\n\n const refreshExpiry = Number(refreshExpiryStr);\n if (isNaN(refreshExpiry)) return null;\n\n const sessionData = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n _cachedClaims = sessionData;\n\n return sessionData;\n}\n\nfunction isExpiringSoon(key: string, thresholdSeconds: number): boolean {\n try {\n const stored = browserStorage.getItem(key);\n if (!stored) return true;\n const expiry = Number(stored);\n if (isNaN(expiry)) return true;\n return (expiry - Date.now()) <= thresholdSeconds * 1000;\n } catch (e) {\n logger.warn(\"Error reading expiry:\", e);\n return true;\n }\n}\n\nexport const isTokenExpiringSoon = (t = 30) => isExpiringSoon(ACCESS_EXPIRY_KEY, t);\nexport const isRefreshSessionExpired = (t = 10) => isExpiringSoon(REFRESH_EXPIRY_KEY, t);\n\nexport function isAuthenticated(): boolean {\n if (!tokenStore.getAccessToken()) return false;\n const stored = browserStorage.getItem(ACCESS_EXPIRY_KEY);\n if (!stored) return false;\n const accessExpiryTimestamp = Number(stored);\n if (isNaN(accessExpiryTimestamp)) return false;\n return accessExpiryTimestamp > Date.now();\n}\n\nexport function clearAuthTokens(): void {\n _cachedClaims = null;\n tokenStore.clear();\n browserStorage.removeItem(ACCESS_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_EXPIRY_KEY);\n\n const domain = browserStorage.getItem(REFRESH_DOMAIN_KEY) || getCookieDomain();\n cookieStorage.remove(\"refresh_token\", domain);\n browserStorage.removeItem(REFRESH_DOMAIN_KEY);\n\n authStore.reset();\n\n logger.log(\"Auth tokens and claims cleared\");\n}\n\nexport function getUserInfo() {\n const claims = getTokenClaims();\n if (!claims) return null;\n\n return claims.access_data.sub\n}\n\nexport function decodeJwtExp(token: string): number | null {\n const decoded = decodeJwt<{ exp: number }>(token);\n return decoded?.exp ?? null;\n}\n","export interface TrieOHEnv {\n PROJECT_ID: string;\n API_KEY: string;\n BASE_URL: string;\n}\n\nexport function resolveEnv(): TrieOHEnv {\n const isServer = typeof window === \"undefined\";\n\n const viteEnv = (\n typeof import.meta !== \"undefined\" && import.meta.env\n ? import.meta.env\n : {}\n ) as Partial<ImportMetaEnv>;\n\n const safeProcessEnv: NodeJS.ProcessEnv =\n typeof process !== \"undefined\" ? process.env : {};\n\n const resolvedProjectId =\n viteEnv.VITE_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n \"\";\n\n const resolvedApiKey = isServer\n ? (safeProcessEnv.TRIEOH_AUTH_API_KEY || \"\")\n : \"\";\n\n return {\n PROJECT_ID: resolvedProjectId,\n API_KEY: resolvedApiKey,\n BASE_URL: \"https://api.trieauth.trieoh.com\",\n };\n}\nlet memoizedEnv: TrieOHEnv | null = null;\nlet overrides: Partial<TrieOHEnv> = {};\n\n/**\n * Configure the SDK manually. This will override any environment variables.\n */\nexport function configure(config: Partial<TrieOHEnv>) {\n overrides = { ...overrides, ...config };\n memoizedEnv = null; // Reset memoization to apply new config\n}\n\nfunction getEnv(): TrieOHEnv {\n if (!memoizedEnv) {\n const resolved = resolveEnv();\n memoizedEnv = {\n ...resolved,\n ...overrides,\n };\n }\n return memoizedEnv;\n}\nexport const env: TrieOHEnv = {\n get PROJECT_ID() {\n return getEnv().PROJECT_ID;\n },\n get API_KEY() {\n return getEnv().API_KEY;\n },\n get BASE_URL() {\n return getEnv().BASE_URL;\n },\n};\n","import { joinUrl } from \"../utils/url-utils\";\nimport {\n clearAuthTokens,\n isRefreshSessionExpired,\n isTokenExpiringSoon,\n saveAuthSession,\n getTokenClaims,\n type AuthTokenClaims,\n type AuthTokens\n} from \"../utils/token-utils\";\nimport { env } from \"./env\";\nimport { logger, simpleFetch } from \"@trieoh/envoy-fetch-ts\";\nimport { cookieStorage } from \"../utils/storage-adapter\";\nimport { tokenStore } from \"../store/token-store\";\n\nexport interface RequestOptions extends RequestInit {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\ninterface InterceptorConfig {\n baseURL?: string;\n authBaseURL?: string;\n onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n onRefreshFailed?: (error: Error) => void;\n}\n\nexport class AuthInterceptor {\n private baseURL: string;\n private authBaseURL: string;\n private isRefreshing = false;\n private refreshPromise: Promise<void> | null = null;\n private onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n private onRefreshFailed?: (error: Error) => void;\n\n constructor(config?: InterceptorConfig) {\n this.baseURL = config?.baseURL || env.BASE_URL;\n this.authBaseURL = config?.authBaseURL || this.baseURL;\n this.onTokenRefreshed = config?.onTokenRefreshed;\n this.onRefreshFailed = config?.onRefreshFailed;\n }\n\n async refreshToken(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) return this.refreshPromise;\n\n this.isRefreshing = true;\n this.refreshPromise = (async () => {\n let shouldClear = true;\n try {\n const res = await simpleFetch<{ code: number; data?: AuthTokens; message?: string }>(\n joinUrl(this.authBaseURL, \"/auth/refresh\"),\n { method: \"POST\", credentials: \"include\" }\n );\n\n if (res.code !== 200 || !res.data) {\n shouldClear = res.code !== 503;\n throw new Error(res.message || \"Failed to refresh token\");\n }\n\n saveAuthSession(res.data);\n\n const claims = getTokenClaims();\n if (claims) this.onTokenRefreshed?.(claims);\n\n logger.log(\"Token refreshed successfully\");\n } catch (error) {\n logger.warn(\"Failed to refresh token:\", error);\n if (shouldClear) clearAuthTokens();\n this.onRefreshFailed?.(error as Error);\n throw error;\n } finally {\n this.isRefreshing = false;\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n async beforeRequest(): Promise<void> {\n if (isRefreshSessionExpired()) {\n clearAuthTokens();\n return;\n }\n\n const hasAccessToken = !!tokenStore.getAccessToken();\n\n if (!hasAccessToken || isTokenExpiringSoon(30)) {\n try {\n await this.refreshToken();\n } catch (error) {\n logger.warn(\"Proactive refresh failed:\", error);\n }\n }\n }\n\n async fetch(url: string, options?: RequestOptions): Promise<Response> {\n const shouldAuth = options?.requiresAuth !== false;\n const isRefreshReq = url.includes(\"/auth/refresh\");\n\n if (shouldAuth && !isRefreshReq && !options?.skipRefresh) {\n await this.beforeRequest();\n }\n\n const finalUrl = joinUrl(this.baseURL, url);\n\n const executeFetch = async (): Promise<Response> => {\n const accessToken = tokenStore.getAccessToken();\n const headers = new Headers(options?.headers);\n\n if (shouldAuth && accessToken) {\n headers.set(\"Authorization\", `Bearer ${accessToken}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n return fetch(finalUrl, {\n ...options,\n headers,\n credentials: \"include\",\n });\n };\n\n let response = await executeFetch();\n\n if (response.status === 401 && shouldAuth && !isRefreshReq) {\n const hasRefreshCookie = !!cookieStorage.get(\"refresh_token\");\n const isExpiring = isTokenExpiringSoon(30);\n\n if (hasRefreshCookie && isExpiring) {\n logger.log(\"401 detected and token is expiring/expired, attempting refresh...\");\n try {\n await this.refreshToken();\n response = await executeFetch();\n } catch (e) {\n logger.error(\"Retry failed after refresh error\");\n }\n }\n }\n\n return response;\n }\n}\n\nexport const createAuthInterceptor = (config?: InterceptorConfig) => new AuthInterceptor(config);\n\nexport const createAuthenticatedFetch = (config?: InterceptorConfig) => {\n const interceptor = new AuthInterceptor(config);\n return (url: string, options?: RequestOptions) => interceptor.fetch(url, options);\n};\n","import { AuthInterceptor, type RequestOptions as InterceptorOptions } from \"./interceptor\";\nimport type { AuthTokenClaims } from \"../utils/token-utils\";\nimport {\n createDefaultFetchClient,\n type DefaultFetchClientConfig,\n type DefaultFetchResult,\n type DefaultSuccessEnvelope,\n type DefaultFailureEnvelope,\n type FetchClient,\n type FetchClientOptions\n} from \"@trieoh/envoy-fetch-ts\";\n\nexport type { DefaultFetchResult as ApiResponse };\n\nexport interface ApiRequestOptions extends FetchClientOptions {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\nfunction toFetchOptions(options?: ApiRequestOptions): FetchClientOptions | undefined {\n if (!options) return undefined;\n\n const { requiresAuth, skipRefresh, ...rest } = options;\n\n const interceptorFields: Partial<InterceptorOptions> = {};\n if (requiresAuth !== undefined) interceptorFields.requiresAuth = requiresAuth;\n if (skipRefresh !== undefined) interceptorFields.skipRefresh = skipRefresh;\n\n return {\n ...rest,\n adapterInit: {\n ...rest.adapterInit,\n ...interceptorFields,\n },\n };\n}\n\nexport class Api {\n readonly interceptor: AuthInterceptor;\n private readonly client: FetchClient<DefaultSuccessEnvelope, DefaultFailureEnvelope>;\n\n constructor(\n baseURL?: string,\n authBaseURL?: string,\n onTokenRefreshed?: (claims: AuthTokenClaims) => void,\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">,\n ) {\n this.interceptor = new AuthInterceptor({\n baseURL,\n authBaseURL,\n onTokenRefreshed,\n });\n\n this.client = createDefaultFetchClient({\n ...clientConfig,\n adapter: this.interceptor.fetch.bind(this.interceptor),\n });\n }\n\n request<T>(path: string, options?: ApiRequestOptions) {\n return this.client.request<T>(path, toFetchOptions(options));\n }\n\n get<T>(path: string, options?: ApiRequestOptions) {\n return this.client.get<T>(path, toFetchOptions(options));\n }\n\n post<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.post<T>(path, body, toFetchOptions(options));\n }\n\n put<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.put<T>(path, body, toFetchOptions(options));\n }\n\n patch<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.patch<T>(path, body, toFetchOptions(options));\n }\n\n delete<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.delete<T>(path, body, toFetchOptions(options));\n }\n\n query<T>(path: string, options?: ApiRequestOptions) {\n return this.client.query<T>(path, toFetchOptions(options));\n }\n}\n\nexport function createFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return {\n request: api.request.bind(api),\n get: api.get.bind(api),\n post: api.post.bind(api),\n put: api.put.bind(api),\n patch: api.patch.bind(api),\n delete: api.delete.bind(api),\n query: api.query.bind(api),\n };\n}\n\nexport function createQueryFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return <TData>(path: string, options?: ApiRequestOptions): Promise<TData> =>\n api.query<TData>(path, options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/url-utils.ts","../../src/store/auth-store.ts","../../src/utils/storage-adapter.ts","../../src/store/token-store.ts","../../src/utils/token-utils.ts","../../src/core/env.ts","../../src/core/interceptor.ts","../../src/core/api.ts"],"names":["joinUrl","base","path","cleanBase","cleanPath","_state","_listeners","notify","l","authStore","cb","partial","event","expiry","isAuthenticated","browserStorage","key","value","sessionBrowserStorage","ACCESS_TOKEN_KEY","tokenStore","token","_cachedClaims","ACCESS_EXPIRY_KEY","REFRESH_EXPIRY_KEY","REFRESH_TOKEN_KEY","decodeJwt","payload","base64","jsonPayload","c","error","logger","saveAuthSession","tokens","access_token","refresh_token","access_expires_at","refresh_expires_at","claims","refreshExpiry","accessExpiry","getStoredRefreshToken","getTokenClaims","refreshExpiryStr","sessionData","isExpiringSoon","thresholdSeconds","stored","e","isTokenExpiringSoon","isRefreshSessionExpired","clearAuthTokens","resolveEnv","isServer","viteEnv","safeProcessEnv","resolvedProjectId","resolvedApiKey","memoizedEnv","overrides","configure","config","getEnv","env","AuthInterceptor","shouldClear","refreshToken","res","simpleFetch","url","options","shouldAuth","isRefreshReq","finalUrl","executeFetch","accessToken","headers","response","hasRefreshToken","isExpiring","createAuthInterceptor","createAuthenticatedFetch","interceptor","toFetchOptions","requiresAuth","skipRefresh","rest","interceptorFields","Api","baseURL","authBaseURL","onTokenRefreshed","clientConfig","createDefaultFetchClient","body","createFetcher","api","createQueryFetcher"],"mappings":"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","file":"index.js","sourcesContent":["export function joinUrl(base: string, path: string): string {\n if (path.startsWith(\"http\")) return path;\n \n const cleanBase = base.replace(/\\/$/, \"\");\n const cleanPath = path.replace(/^\\//, \"\");\n \n return `${cleanBase}/${cleanPath}`;\n}\n","type AuthState = {\n isAuthenticated: boolean;\n isInitializing: boolean;\n};\n\nlet _state: AuthState = {\n isAuthenticated: false,\n isInitializing: true,\n};\nconst _listeners = new Set<() => void>();\n\nconst notify = () => _listeners.forEach((l) => l());\n\nexport const authStore = {\n subscribe: (cb: () => void) => {\n _listeners.add(cb);\n return () => _listeners.delete(cb);\n },\n getSnapshot: () => _state,\n getServerSnapshot: () => _state,\n set: (partial: Partial<AuthState>) => {\n _state = { ..._state, ...partial };\n notify();\n },\n reset: () => {\n _state = {\n isAuthenticated: false,\n isInitializing: false,\n };\n notify();\n },\n};\n\n// Sync between tabs\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", (event) => {\n if (event.key === \"trieoh_access_expiry\") {\n if (!event.newValue) authStore.reset();\n else {\n const expiry = Number(event.newValue);\n const isAuthenticated = !isNaN(expiry) && expiry > Date.now();\n authStore.set({ isAuthenticated, isInitializing: false });\n }\n }\n });\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport const browserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? localStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") localStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") localStorage.removeItem(key);\n },\n};\n\nexport const sessionBrowserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? sessionStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") sessionStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") sessionStorage.removeItem(key);\n },\n};\n\nexport interface CookieOptions {\n expires?: string;\n path?: string;\n domain?: string | null;\n secure?: boolean;\n sameSite?: \"Lax\" | \"None\" | \"Strict\";\n}\n\nexport const cookieStorage = {\n get: (name: string): string | null => {\n if (typeof window === \"undefined\") return null;\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n },\n\n set: (name: string, value: string, options: CookieOptions = {}) => {\n if (typeof window === \"undefined\") return;\n\n const {\n expires,\n path = \"/\",\n domain,\n secure = window.location.protocol === \"https:\",\n sameSite = secure ? \"None\" : \"Lax\",\n } = options;\n\n const isLocalhost = window.location.hostname === \"localhost\";\n\n const cookieParts = [\n `${name}=${value}`,\n domain && !isLocalhost ? `Domain=${domain}` : \"\",\n `Path=${path}`,\n `SameSite=${sameSite}`,\n secure ? \"Secure\" : \"\",\n expires ? `expires=${expires}` : \"\",\n ];\n\n document.cookie = cookieParts.filter(Boolean).join(\"; \");\n },\n\n remove: (name: string, domain?: string | null) => {\n cookieStorage.set(name, \"\", {\n expires: \"Thu, 01 Jan 1970 00:00:00 GMT\",\n domain: domain || undefined,\n });\n },\n};\n","import { sessionBrowserStorage } from \"../utils/storage-adapter\";\n\nconst ACCESS_TOKEN_KEY = \"trieoh_access_token\";\n\nexport const tokenStore = {\n getAccessToken: () => sessionBrowserStorage.getItem(ACCESS_TOKEN_KEY),\n setAccessToken: (token: string | null) => {\n if (token) sessionBrowserStorage.setItem(ACCESS_TOKEN_KEY, token);\n else sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n },\n clear: () => {\n sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n }\n};\n","import { authStore } from \"../store/auth-store\";\nimport { tokenStore } from \"../store/token-store\";\nimport { logger } from \"@trieoh/envoy-fetch-ts\";\nimport { browserStorage } from \"./storage-adapter\";\nimport type { AuthTokenClaims, AuthTokens, TokenClaims } from \"../types//token-types\";\n\n\n// Stored only in memory\nlet _cachedClaims: AuthTokenClaims | null = null;\nconst ACCESS_EXPIRY_KEY = \"trieoh_access_expiry\";\nconst REFRESH_EXPIRY_KEY = \"trieoh_refresh_expiry\";\nconst REFRESH_TOKEN_KEY = \"trieoh_refresh_token\";\n\nexport function decodeJwt<T>(token: string): T | null {\n try {\n const payload = token.split(\".\")[1];\n if (!payload) return null;\n\n let base64 = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (base64.length % 4) {\n base64 += \"=\";\n }\n\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\")\n );\n\n return JSON.parse(jsonPayload);\n } catch (error) {\n logger.error(\"Error decoding JWT:\", error);\n return null;\n }\n}\n\nexport function saveAuthSession(tokens: AuthTokens): void {\n const {\n access_token,\n refresh_token,\n access_expires_at,\n refresh_expires_at,\n } = tokens;\n\n const claims = decodeJwt<TokenClaims>(access_token);\n\n if (!claims) {\n logger.error(\"Failed to decode tokens\");\n return;\n }\n\n tokenStore.setAccessToken(access_token);\n\n const refreshExpiry = new Date(refresh_expires_at).getTime();\n const accessExpiry = new Date(access_expires_at).getTime();\n\n browserStorage.setItem(REFRESH_TOKEN_KEY, refresh_token);\n browserStorage.setItem(ACCESS_EXPIRY_KEY, String(accessExpiry));\n browserStorage.setItem(REFRESH_EXPIRY_KEY, String(refreshExpiry));\n\n const sessionData: AuthTokenClaims = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n _cachedClaims = sessionData;\n\n authStore.set({\n isAuthenticated: true,\n isInitializing: false,\n });\n\n logger.log(\"Auth session saved\");\n}\n\nexport function getStoredRefreshToken(): string | null {\n return browserStorage.getItem(REFRESH_TOKEN_KEY);\n}\n\nexport function getTokenClaims(): AuthTokenClaims | null {\n if (_cachedClaims) return _cachedClaims;\n\n const token = tokenStore.getAccessToken();\n if (!token) return null;\n\n const claims = decodeJwt<TokenClaims>(token);\n if (!claims) return null;\n\n // Check if token is expired\n if (claims.exp * 1000 <= Date.now()) return null;\n\n const refreshExpiryStr = browserStorage.getItem(REFRESH_EXPIRY_KEY);\n if (!refreshExpiryStr) return null;\n\n const refreshExpiry = Number(refreshExpiryStr);\n if (isNaN(refreshExpiry)) return null;\n\n const sessionData = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n _cachedClaims = sessionData;\n\n return sessionData;\n}\n\nfunction isExpiringSoon(key: string, thresholdSeconds: number): boolean {\n try {\n const stored = browserStorage.getItem(key);\n if (!stored) return true;\n const expiry = Number(stored);\n if (isNaN(expiry)) return true;\n return (expiry - Date.now()) <= thresholdSeconds * 1000;\n } catch (e) {\n logger.warn(\"Error reading expiry:\", e);\n return true;\n }\n}\n\nexport const isTokenExpiringSoon = (t = 30) => isExpiringSoon(ACCESS_EXPIRY_KEY, t);\nexport const isRefreshSessionExpired = (t = 10) => isExpiringSoon(REFRESH_EXPIRY_KEY, t);\n\nexport function isAuthenticated(): boolean {\n if (!tokenStore.getAccessToken()) return false;\n const stored = browserStorage.getItem(ACCESS_EXPIRY_KEY);\n if (!stored) return false;\n const accessExpiryTimestamp = Number(stored);\n if (isNaN(accessExpiryTimestamp)) return false;\n return accessExpiryTimestamp > Date.now();\n}\n\nexport function clearAuthTokens(): void {\n _cachedClaims = null;\n tokenStore.clear();\n browserStorage.removeItem(ACCESS_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_TOKEN_KEY);\n\n authStore.reset();\n\n logger.log(\"Auth tokens and claims cleared\");\n}\n\nexport function getUserInfo() {\n const claims = getTokenClaims();\n if (!claims) return null;\n\n return claims.access_data.sub\n}\n\nexport function decodeJwtExp(token: string): number | null {\n const decoded = decodeJwt<{ exp: number }>(token);\n return decoded?.exp ?? null;\n}\n","export interface TrieOHEnv {\n PROJECT_ID: string;\n API_KEY: string;\n BASE_URL: string;\n}\n\nexport function resolveEnv(): TrieOHEnv {\n const isServer = typeof window === \"undefined\";\n\n const viteEnv = (\n typeof import.meta !== \"undefined\" && import.meta.env\n ? import.meta.env\n : {}\n ) as Partial<ImportMetaEnv>;\n\n const safeProcessEnv: NodeJS.ProcessEnv =\n typeof process !== \"undefined\" ? process.env : {};\n\n const resolvedProjectId =\n viteEnv.VITE_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n \"\";\n\n const resolvedApiKey = isServer\n ? (safeProcessEnv.TRIEOH_AUTH_API_KEY || \"\")\n : \"\";\n\n return {\n PROJECT_ID: resolvedProjectId,\n API_KEY: resolvedApiKey,\n BASE_URL: \"https://api.trieauth.trieoh.com\",\n };\n}\nlet memoizedEnv: TrieOHEnv | null = null;\nlet overrides: Partial<TrieOHEnv> = {};\n\n/**\n * Configure the SDK manually. This will override any environment variables.\n */\nexport function configure(config: Partial<TrieOHEnv>) {\n overrides = { ...overrides, ...config };\n memoizedEnv = null; // Reset memoization to apply new config\n}\n\nfunction getEnv(): TrieOHEnv {\n if (!memoizedEnv) {\n const resolved = resolveEnv();\n memoizedEnv = {\n ...resolved,\n ...overrides,\n };\n }\n return memoizedEnv;\n}\nexport const env: TrieOHEnv = {\n get PROJECT_ID() {\n return getEnv().PROJECT_ID;\n },\n get API_KEY() {\n return getEnv().API_KEY;\n },\n get BASE_URL() {\n return getEnv().BASE_URL;\n },\n};\n","import { joinUrl } from \"../utils/url-utils\";\nimport {\n clearAuthTokens,\n isRefreshSessionExpired,\n isTokenExpiringSoon,\n saveAuthSession,\n getTokenClaims,\n getStoredRefreshToken,\n} from \"../utils/token-utils\";\nimport { env } from \"./env\";\nimport { logger, simpleFetch } from \"@trieoh/envoy-fetch-ts\";\nimport { tokenStore } from \"../store/token-store\";\nimport type { AuthTokenClaims, AuthTokens } from \"../types/token-types\";\n\nexport interface RequestOptions extends RequestInit {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\ninterface InterceptorConfig {\n baseURL?: string;\n authBaseURL?: string;\n onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n onRefreshFailed?: (error: Error) => void;\n}\n\nexport class AuthInterceptor {\n private baseURL: string;\n private authBaseURL: string;\n private isRefreshing = false;\n private refreshPromise: Promise<void> | null = null;\n private onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n private onRefreshFailed?: (error: Error) => void;\n\n constructor(config?: InterceptorConfig) {\n this.baseURL = config?.baseURL || env.BASE_URL;\n this.authBaseURL = config?.authBaseURL || this.baseURL;\n this.onTokenRefreshed = config?.onTokenRefreshed;\n this.onRefreshFailed = config?.onRefreshFailed;\n }\n\n async refreshToken(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) return this.refreshPromise;\n\n this.isRefreshing = true;\n this.refreshPromise = (async () => {\n let shouldClear = true;\n try {\n const refreshToken = getStoredRefreshToken();\n if (!refreshToken) {\n shouldClear = true;\n throw new Error(\"No refresh token available\");\n }\n\n const res = await simpleFetch<{ code: number; data?: AuthTokens; message?: string }>(\n joinUrl(this.authBaseURL, \"/auth/refresh\"),\n {\n method: \"POST\",\n credentials: \"omit\",\n headers: { \"refresh_token\": refreshToken },\n }\n );\n\n if (res.code !== 200 || !res.data) {\n shouldClear = res.code !== 503;\n throw new Error(res.message || \"Failed to refresh token\");\n }\n\n saveAuthSession(res.data);\n\n const claims = getTokenClaims();\n if (claims) this.onTokenRefreshed?.(claims);\n\n logger.log(\"Token refreshed successfully\");\n } catch (error) {\n logger.warn(\"Failed to refresh token:\", error);\n if (shouldClear) clearAuthTokens();\n this.onRefreshFailed?.(error as Error);\n throw error;\n } finally {\n this.isRefreshing = false;\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n async beforeRequest(): Promise<void> {\n if (isRefreshSessionExpired()) {\n clearAuthTokens();\n return;\n }\n\n const hasAccessToken = !!tokenStore.getAccessToken();\n\n if (!hasAccessToken || isTokenExpiringSoon(30)) {\n try {\n await this.refreshToken();\n } catch (error) {\n logger.warn(\"Proactive refresh failed:\", error);\n }\n }\n }\n\n async fetch(url: string, options?: RequestOptions): Promise<Response> {\n const shouldAuth = options?.requiresAuth !== false;\n const isRefreshReq = url.includes(\"/auth/refresh\");\n\n if (shouldAuth && !isRefreshReq && !options?.skipRefresh) {\n await this.beforeRequest();\n }\n\n const finalUrl = joinUrl(this.baseURL, url);\n\n const executeFetch = async (): Promise<Response> => {\n const accessToken = tokenStore.getAccessToken();\n const headers = new Headers(options?.headers);\n\n if (shouldAuth && accessToken) {\n headers.set(\"Authorization\", `Bearer ${accessToken}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n return fetch(finalUrl, {\n ...options,\n headers,\n credentials: \"omit\",\n });\n };\n\n let response = await executeFetch();\n\n if (response.status === 401 && shouldAuth && !isRefreshReq) {\n const hasRefreshToken = !!getStoredRefreshToken();\n const isExpiring = isTokenExpiringSoon(30);\n\n if (hasRefreshToken && isExpiring) {\n logger.log(\"401 detected and token is expiring/expired, attempting refresh...\");\n try {\n await this.refreshToken();\n response = await executeFetch();\n } catch (e) {\n logger.error(\"Retry failed after refresh error\");\n }\n }\n }\n\n return response;\n }\n}\n\nexport const createAuthInterceptor = (config?: InterceptorConfig) => new AuthInterceptor(config);\n\nexport const createAuthenticatedFetch = (config?: InterceptorConfig) => {\n const interceptor = new AuthInterceptor(config);\n return (url: string, options?: RequestOptions) => interceptor.fetch(url, options);\n};\n","import { AuthInterceptor, type RequestOptions as InterceptorOptions } from \"./interceptor\";\nimport type { AuthTokenClaims } from \"../types/token-types\";\nimport {\n createDefaultFetchClient,\n type DefaultFetchClientConfig,\n type DefaultFetchResult,\n type DefaultSuccessEnvelope,\n type DefaultFailureEnvelope,\n type FetchClient,\n type FetchClientOptions\n} from \"@trieoh/envoy-fetch-ts\";\n\nexport type { DefaultFetchResult as ApiResponse };\n\nexport interface ApiRequestOptions extends FetchClientOptions {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\nfunction toFetchOptions(options?: ApiRequestOptions): FetchClientOptions | undefined {\n if (!options) return undefined;\n\n const { requiresAuth, skipRefresh, ...rest } = options;\n\n const interceptorFields: Partial<InterceptorOptions> = {};\n if (requiresAuth !== undefined) interceptorFields.requiresAuth = requiresAuth;\n if (skipRefresh !== undefined) interceptorFields.skipRefresh = skipRefresh;\n\n return {\n ...rest,\n adapterInit: {\n ...rest.adapterInit,\n ...interceptorFields,\n },\n };\n}\n\nexport class Api {\n readonly interceptor: AuthInterceptor;\n private readonly client: FetchClient<DefaultSuccessEnvelope, DefaultFailureEnvelope>;\n\n constructor(\n baseURL?: string,\n authBaseURL?: string,\n onTokenRefreshed?: (claims: AuthTokenClaims) => void,\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">,\n ) {\n this.interceptor = new AuthInterceptor({\n baseURL,\n authBaseURL,\n onTokenRefreshed,\n });\n\n this.client = createDefaultFetchClient({\n ...clientConfig,\n adapter: this.interceptor.fetch.bind(this.interceptor),\n });\n }\n\n request<T>(path: string, options?: ApiRequestOptions) {\n return this.client.request<T>(path, toFetchOptions(options));\n }\n\n get<T>(path: string, options?: ApiRequestOptions) {\n return this.client.get<T>(path, toFetchOptions(options));\n }\n\n post<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.post<T>(path, body, toFetchOptions(options));\n }\n\n put<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.put<T>(path, body, toFetchOptions(options));\n }\n\n patch<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.patch<T>(path, body, toFetchOptions(options));\n }\n\n delete<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.delete<T>(path, body, toFetchOptions(options));\n }\n\n query<T>(path: string, options?: ApiRequestOptions) {\n return this.client.query<T>(path, toFetchOptions(options));\n }\n}\n\nexport function createFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return {\n request: api.request.bind(api),\n get: api.get.bind(api),\n post: api.post.bind(api),\n put: api.put.bind(api),\n patch: api.patch.bind(api),\n delete: api.delete.bind(api),\n query: api.query.bind(api),\n };\n}\n\nexport function createQueryFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return <TData>(path: string, options?: ApiRequestOptions): Promise<TData> =>\n api.query<TData>(path, options);\n}\n"]}
|
package/dist/esm/react.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import * as react from 'react';
|
|
|
3
3
|
import { MouseEvent } from 'react';
|
|
4
4
|
import * as _trieoh_envoy_fetch_ts from '@trieoh/envoy-fetch-ts';
|
|
5
5
|
import { DefaultFetchResult, DefaultFetchClientConfig } from '@trieoh/envoy-fetch-ts';
|
|
6
|
-
import { e as AuthTokens, f as Api } from './api-
|
|
6
|
+
import { e as AuthTokens, f as Api } from './api-BjzcDj0c.js';
|
|
7
7
|
|
|
8
8
|
interface SessionI {
|
|
9
9
|
session_id: string;
|
|
@@ -26,15 +26,44 @@ interface CurrentSessionI {
|
|
|
26
26
|
session_id: string | null;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
type IntrospectCredentialType = "token" | "api_key";
|
|
30
|
+
type IntrospectActorType = "human" | "service" | "machine";
|
|
31
|
+
interface IntrospectCredential {
|
|
32
|
+
/** Applicable for stateful credentials like api keys */
|
|
33
|
+
id?: string;
|
|
34
|
+
type: IntrospectCredentialType;
|
|
35
|
+
}
|
|
36
|
+
interface IntrospectSubject {
|
|
37
|
+
id: string;
|
|
38
|
+
project_id?: string;
|
|
39
|
+
email?: string;
|
|
40
|
+
type: IntrospectActorType;
|
|
41
|
+
capabilities: Record<string, unknown>;
|
|
42
|
+
metadata: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
interface IntrospectResponse {
|
|
45
|
+
cred: IntrospectCredential;
|
|
46
|
+
sub: IntrospectSubject;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
type OAuthProviderI = 'github' | 'google';
|
|
50
|
+
|
|
29
51
|
interface AuthCallbacks {
|
|
30
52
|
onLogin?: (res: DefaultFetchResult<AuthTokens>) => void;
|
|
53
|
+
onSetup?: (res: DefaultFetchResult<AuthTokens>) => void;
|
|
31
54
|
onRegister?: (res: DefaultFetchResult<void>) => void;
|
|
32
55
|
onVerify?: (res: DefaultFetchResult<void>) => void;
|
|
33
56
|
onResetPassword?: (res: DefaultFetchResult<void>) => void;
|
|
34
57
|
onRefresh?: (res?: DefaultFetchResult<AuthTokens>) => void;
|
|
35
58
|
}
|
|
36
59
|
declare const createAuthService: (apiInstance: Api, callbacks?: AuthCallbacks) => {
|
|
60
|
+
isSetupDone: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
61
|
+
setup: (email: string, password: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<AuthTokens, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
37
62
|
login: (email: string, password: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<AuthTokens, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
63
|
+
loginWithProvider: (provider: OAuthProviderI) => Promise<_trieoh_envoy_fetch_ts.FetchResult<{
|
|
64
|
+
url: string;
|
|
65
|
+
}, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
66
|
+
completeProviderLogin: (provider: OAuthProviderI, code: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<AuthTokens, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
38
67
|
register: (email: string, password: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
39
68
|
logout: (options?: {
|
|
40
69
|
forceLogout?: boolean;
|
|
@@ -60,6 +89,7 @@ declare const createAuthService: (apiInstance: Api, callbacks?: AuthCallbacks) =
|
|
|
60
89
|
resetPassword: (token: string, new_password: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
61
90
|
verifyEmail: (token: string) => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
62
91
|
resendVerifyEmail: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<void, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
92
|
+
introspect: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<IntrospectResponse, _trieoh_envoy_fetch_ts.DefaultBaseEnvelope, _trieoh_envoy_fetch_ts.DefaultFailureEnvelope>>;
|
|
63
93
|
health: () => Promise<_trieoh_envoy_fetch_ts.FetchResult<{
|
|
64
94
|
service: string;
|
|
65
95
|
status: string;
|
|
@@ -77,7 +107,7 @@ type AuthContextType = {
|
|
|
77
107
|
isInitializing: boolean;
|
|
78
108
|
isProjectMode?: boolean;
|
|
79
109
|
};
|
|
80
|
-
declare function AuthProvider({ children, baseURL, projectId, isProjectMode, fallback, waitSession, clientConfig, onLogin, onResetPassword, onRegister, onVerify, onRefresh, }: {
|
|
110
|
+
declare function AuthProvider({ children, baseURL, projectId, isProjectMode, fallback, waitSession, clientConfig, onLogin, onSetup, onResetPassword, onRegister, onVerify, onRefresh, }: {
|
|
81
111
|
children: React.ReactNode;
|
|
82
112
|
baseURL?: string;
|
|
83
113
|
projectId?: string;
|
|
@@ -196,4 +226,83 @@ interface BasicInputFieldProps {
|
|
|
196
226
|
}
|
|
197
227
|
declare function BasicInputField({ name, label, placeholder, type, value, onValueChange, onBlur, autoComplete, rulesStatus, submitted, inputRef, }: BasicInputFieldProps): react_jsx_runtime.JSX.Element;
|
|
198
228
|
|
|
199
|
-
|
|
229
|
+
interface ModernSignInProps {
|
|
230
|
+
onSuccess?: (message?: string) => Promise<void>;
|
|
231
|
+
onFailed?: (message: string, trace?: string[]) => Promise<void>;
|
|
232
|
+
signUpRedirect?: () => void;
|
|
233
|
+
forgotPasswordRedirect?: () => void;
|
|
234
|
+
providers?: OAuthProviderI[];
|
|
235
|
+
}
|
|
236
|
+
declare function ModernSignIn({ onSuccess, onFailed, signUpRedirect, forgotPasswordRedirect, providers, }: ModernSignInProps): react_jsx_runtime.JSX.Element;
|
|
237
|
+
|
|
238
|
+
interface ModernSignUpProps {
|
|
239
|
+
onSuccess?: (message?: string) => Promise<void>;
|
|
240
|
+
onFailed?: (message: string, trace?: string[]) => Promise<void>;
|
|
241
|
+
signInRedirect?: () => void;
|
|
242
|
+
}
|
|
243
|
+
declare function ModernSignUp({ onSuccess, onFailed, signInRedirect, }: ModernSignUpProps): react_jsx_runtime.JSX.Element;
|
|
244
|
+
|
|
245
|
+
interface ModernForgotPasswordProps {
|
|
246
|
+
onSuccess?: (message?: string) => Promise<void>;
|
|
247
|
+
onFailed?: (message: string, trace?: string[]) => Promise<void>;
|
|
248
|
+
signInRedirect?: () => void;
|
|
249
|
+
}
|
|
250
|
+
declare function ModernForgotPassword({ onSuccess, onFailed, signInRedirect, }: ModernForgotPasswordProps): react_jsx_runtime.JSX.Element;
|
|
251
|
+
|
|
252
|
+
interface ModernResetPasswordProps {
|
|
253
|
+
token: string;
|
|
254
|
+
onSuccess?: (message?: string) => Promise<void>;
|
|
255
|
+
onFailed?: (message: string, trace?: string[]) => Promise<void>;
|
|
256
|
+
signInRedirect?: () => void;
|
|
257
|
+
}
|
|
258
|
+
declare function ModernResetPassword({ token, onSuccess, onFailed, signInRedirect, }: ModernResetPasswordProps): react_jsx_runtime.JSX.Element;
|
|
259
|
+
|
|
260
|
+
interface ModernVerifyEmailProps {
|
|
261
|
+
token: string;
|
|
262
|
+
onSuccess?: (message?: string) => Promise<void>;
|
|
263
|
+
onFailed?: (message: string, trace?: string[]) => Promise<void>;
|
|
264
|
+
signInRedirect?: () => void;
|
|
265
|
+
}
|
|
266
|
+
declare function ModernVerifyEmail({ token, onSuccess, onFailed, signInRedirect, }: ModernVerifyEmailProps): react_jsx_runtime.JSX.Element;
|
|
267
|
+
|
|
268
|
+
interface ModernSetupProps {
|
|
269
|
+
onSuccess?: (message?: string) => Promise<void>;
|
|
270
|
+
onFailed?: (message: string, trace?: string[]) => Promise<void>;
|
|
271
|
+
backLink?: React.ReactNode;
|
|
272
|
+
}
|
|
273
|
+
declare function ModernSetup({ onSuccess, onFailed, backLink, }: ModernSetupProps): react_jsx_runtime.JSX.Element;
|
|
274
|
+
|
|
275
|
+
type AuthView = "signin" | "signup" | "forgot-password";
|
|
276
|
+
interface ModernAuthProps {
|
|
277
|
+
initialView?: AuthView;
|
|
278
|
+
onLoginSuccess?: (message?: string) => Promise<void>;
|
|
279
|
+
onSignUpSuccess?: (message?: string) => Promise<void>;
|
|
280
|
+
onFailed?: (message: string, trace?: string[]) => Promise<void>;
|
|
281
|
+
backLink?: React.ReactNode;
|
|
282
|
+
/** OAuth providers to show as login buttons (e.g. ["google", "github"]) */
|
|
283
|
+
providers?: OAuthProviderI[];
|
|
284
|
+
}
|
|
285
|
+
declare function ModernAuth({ initialView, onLoginSuccess, onSignUpSuccess, onFailed, backLink, providers, }: ModernAuthProps): react_jsx_runtime.JSX.Element;
|
|
286
|
+
|
|
287
|
+
type ActorType = "human" | "service" | "machine";
|
|
288
|
+
type CredentialType = "token" | "api_key";
|
|
289
|
+
interface IntrospectData {
|
|
290
|
+
cred: {
|
|
291
|
+
id?: string;
|
|
292
|
+
type?: CredentialType;
|
|
293
|
+
};
|
|
294
|
+
sub: {
|
|
295
|
+
capabilities?: number[];
|
|
296
|
+
email?: string;
|
|
297
|
+
id?: string;
|
|
298
|
+
metadata?: number[];
|
|
299
|
+
project_id?: string;
|
|
300
|
+
type?: ActorType;
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
interface IdentityCardProps {
|
|
304
|
+
data: IntrospectData;
|
|
305
|
+
}
|
|
306
|
+
declare function ModernIntrospect({ data }: IdentityCardProps): react_jsx_runtime.JSX.Element;
|
|
307
|
+
|
|
308
|
+
export { type AuthCallbacks, AuthProvider, BasicInputField, BasicLogoutButton, Copyright, ForgotPassword, ModernAuth, ModernForgotPassword, ModernIntrospect, ModernResetPassword, ModernSetup, ModernSignIn, ModernSignUp, ModernVerifyEmail, ResendVerifyEmail, ResetPassword, Sessions, SignIn, SignUp, VerifyEmail, useAuth };
|