@amaster.ai/auth-client 1.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.
package/dist/auth.d.ts ADDED
@@ -0,0 +1,138 @@
1
+ /**
2
+ * ============================================================================
3
+ * @amaster.ai/auth-client - Type Definitions
4
+ * ============================================================================
5
+ *
6
+ * 🤖 AI NAVIGATION - Read these files based on your task:
7
+ *
8
+ * 1. Need LOGIN/REGISTER/LOGOUT? → Read: ./auth.d.ts
9
+ * 2. Need PERMISSION checks? → Read: ./permissions.d.ts
10
+ * 3. Need USER profile management? → Read: ./user.d.ts
11
+ * 4. Need OAUTH binding? → Read: ./oauth.d.ts
12
+ * 5. Need SESSION management? → Read: ./sessions.d.ts
13
+ *
14
+ * ============================================================================
15
+ */
16
+ import { HttpClient, ClientResult } from '@amaster.ai/http-client';
17
+ import { s as User, k as RegisterParams, f as LoginResponse, L as LoginParams, d as CodeLoginParams, S as SendCodeParams, r as SuccessResponse, b as CaptchaResponse, h as OAuthProvider, R as RefreshTokenResponse } from './types-4MBObpYA.js';
18
+
19
+ /**
20
+ * Authentication Module
21
+ *
22
+ * @module auth
23
+ * @category Authentication
24
+ *
25
+ * Handles user authentication including:
26
+ * - Registration
27
+ * - Login (email/username/phone + password)
28
+ * - Verification code login
29
+ * - OAuth social login
30
+ * - Logout and token refresh
31
+ */
32
+
33
+ interface AuthModuleDeps {
34
+ http: HttpClient;
35
+ onLoginSuccess: (user: User, accessToken: string) => void;
36
+ storage: {
37
+ getItem: (key: string) => string | null;
38
+ };
39
+ clearAuth: () => void;
40
+ }
41
+ declare function createAuthModule(deps: AuthModuleDeps): {
42
+ /**
43
+ * Register a new user account
44
+ *
45
+ * @category Authentication
46
+ * @example
47
+ * ```typescript
48
+ * const result = await auth.register({
49
+ * email: "user@example.com",
50
+ * password: "Password@123",
51
+ * displayName: "John Doe",
52
+ * });
53
+ * ```
54
+ */
55
+ register(params: RegisterParams): Promise<ClientResult<LoginResponse>>;
56
+ /**
57
+ * Login with username/email/phone and password
58
+ *
59
+ * @category Authentication
60
+ * @example
61
+ * ```typescript
62
+ * await auth.login({
63
+ * loginType: "email",
64
+ * email: "user@example.com",
65
+ * password: "Password@123",
66
+ * });
67
+ * ```
68
+ */
69
+ login(params: LoginParams): Promise<ClientResult<LoginResponse>>;
70
+ /**
71
+ * Login with verification code
72
+ *
73
+ * @category Authentication
74
+ * @example
75
+ * ```typescript
76
+ * await auth.loginWithCode({
77
+ * loginType: "email",
78
+ * email: "user@example.com",
79
+ * code: "123456",
80
+ * });
81
+ * ```
82
+ */
83
+ loginWithCode(params: CodeLoginParams): Promise<ClientResult<LoginResponse>>;
84
+ /**
85
+ * Send verification code to email or phone
86
+ *
87
+ * @category Authentication
88
+ * @example
89
+ * ```typescript
90
+ * await auth.sendCode({
91
+ * type: "email",
92
+ * email: "user@example.com",
93
+ * });
94
+ * ```
95
+ */
96
+ sendCode(params: SendCodeParams): Promise<ClientResult<SuccessResponse>>;
97
+ /**
98
+ * Get captcha image
99
+ *
100
+ * @category Authentication
101
+ */
102
+ getCaptcha(): Promise<ClientResult<CaptchaResponse>>;
103
+ /**
104
+ * Redirect to OAuth provider for authentication
105
+ *
106
+ * @category Authentication
107
+ * @example
108
+ * ```typescript
109
+ * auth.loginWithOAuth("google");
110
+ * ```
111
+ */
112
+ loginWithOAuth(provider: OAuthProvider, redirectUrl?: string): void;
113
+ /**
114
+ * Handle OAuth callback
115
+ *
116
+ * @category Authentication
117
+ */
118
+ handleOAuthCallback(): Promise<ClientResult<LoginResponse>>;
119
+ /**
120
+ * Logout current user
121
+ *
122
+ * @category Authentication
123
+ * @example
124
+ * ```typescript
125
+ * await auth.logout();
126
+ * ```
127
+ */
128
+ logout(): Promise<ClientResult<SuccessResponse>>;
129
+ /**
130
+ * Refresh access token
131
+ *
132
+ * @category Authentication
133
+ */
134
+ refreshToken(): Promise<ClientResult<RefreshTokenResponse>>;
135
+ };
136
+ type AuthModule = ReturnType<typeof createAuthModule>;
137
+
138
+ export { type AuthModule, type AuthModuleDeps, createAuthModule };
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var httpClient=require('@amaster.ai/http-client');var g=class{constructor(){this.events={};}on(e,n){this.events[e]||(this.events[e]=[]),this.events[e].push(n);}off(e,n){this.events[e]&&(this.events[e]=this.events[e].filter(s=>s!==n));}emit(e,...n){this.events[e]&&this.events[e].forEach(s=>{try{s(...n);}catch(r){console.error(`[AuthClient] Error in event handler for "${e}":`,r);}});}removeAllListeners(){this.events={};}};var l={ACCESS_TOKEN:"amaster_access_token",REFRESH_TOKEN:"amaster_refresh_token",USER:"amaster_user"};function R(i="localStorage"){if(!(typeof window<"u"&&typeof window[i]<"u"))return b();let n=window[i==="sessionStorage"?"sessionStorage":"localStorage"];return {getItem(s){try{return n.getItem(s)}catch(r){return console.error(`[AuthClient] Failed to get item from ${i}:`,r),null}},setItem(s,r){try{n.setItem(s,r);}catch(t){console.error(`[AuthClient] Failed to set item in ${i}:`,t);}},removeItem(s){try{n.removeItem(s);}catch(r){console.error(`[AuthClient] Failed to remove item from ${i}:`,r);}},clear(){try{n.removeItem(l.ACCESS_TOKEN),n.removeItem(l.REFRESH_TOKEN),n.removeItem(l.USER);}catch(s){console.error(`[AuthClient] Failed to clear ${i}:`,s);}}}}function b(){return {getItem(){return null},setItem(){},removeItem(){},clear(){}}}function _(i){try{let e=i.split(".");if(e.length!==3)return null;let s=(e[1]||"").replace(/-/g,"+").replace(/_/g,"/");if(typeof atob<"u"){let r=decodeURIComponent(atob(s).split("").map(t=>"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(r)}if(typeof Buffer<"u"){let r=Buffer.from(s,"base64").toString("utf-8");return JSON.parse(r)}return null}catch(e){return console.error("[AuthClient] Failed to parse JWT token:",e),null}}var f=class{constructor(){this.refreshTimer=null;this.isRefreshing=false;this.refreshCallback=null;}setRefreshCallback(e){this.refreshCallback=e;}scheduleRefresh(e){this.clearSchedule(),!(e<=0)&&(this.refreshTimer=setTimeout(()=>{this.refresh();},e));}scheduleRefreshFromToken(e,n=300){let s=_(e);if(!s||!s.exp){console.warn("[AuthClient] Cannot schedule refresh: invalid token or missing exp claim");return}let r=s.exp*1e3,t=Date.now(),u=r-t-n*1e3;u<=0?(console.warn("[AuthClient] Token already expired or expiring soon, refreshing immediately"),this.refresh()):this.scheduleRefresh(u);}async refresh(){if(!this.isRefreshing){if(!this.refreshCallback){console.error("[AuthClient] No refresh callback set");return}this.isRefreshing=true;try{await this.refreshCallback();}catch(e){console.error("[AuthClient] Token refresh failed:",e);}finally{this.isRefreshing=false;}}}clearSchedule(){this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null);}isCurrentlyRefreshing(){return this.isRefreshing}destroy(){this.clearSchedule(),this.refreshCallback=null,this.isRefreshing=false;}};function C(i){let{http:e,onLoginSuccess:n,storage:s,clearAuth:r}=i;return {async register(t){let o=await e.request({url:"/api/auth/register",method:"post",headers:{"Content-Type":"application/json"},data:t});return o.data?.user&&o.data?.accessToken&&n(o.data.user,o.data.accessToken),o},async login(t){let o=await e.request({url:"/api/auth/login",method:"post",headers:{"Content-Type":"application/json"},data:t});return o.data?.user&&o.data?.accessToken&&n(o.data.user,o.data.accessToken),o},async loginWithCode(t){let o=await e.request({url:"/api/auth/login-with-code",method:"post",headers:{"Content-Type":"application/json"},data:t});return o.data?.user&&o.data?.accessToken&&n(o.data.user,o.data.accessToken),o},async sendCode(t){return e.request({url:"/api/auth/send-code",method:"post",headers:{"Content-Type":"application/json"},data:t})},async getCaptcha(){return e.request({url:"/api/auth/captcha",method:"get"})},loginWithOAuth(t,o){if(typeof window>"u"){console.error("[AuthClient] OAuth login is only available in browser environment");return}let u=o?`/api/auth/oauth/${t}?redirect_url=${encodeURIComponent(o)}`:`/api/auth/oauth/${t}`;window.location.href=u;},async handleOAuthCallback(){if(typeof window>"u")return {data:null,error:{message:"OAuth callback is only available in browser environment",status:400},status:400};try{let t=window.location.hash.substring(1),o=new URLSearchParams(t),u=o.get("access_token"),c=o.get("user");if(!u||!c)return {data:null,error:{message:"OAuth callback failed: missing token or user data",status:400},status:400};let d=JSON.parse(decodeURIComponent(c));return n(d,u),{data:{user:d,accessToken:u},error:null,status:200}}catch(t){return {data:null,error:{message:`OAuth callback failed: ${t instanceof Error?t.message:String(t)}`,status:400},status:400}}},async logout(){let t=s.getItem("amaster_access_token"),o=await e.request({url:"/api/auth/logout",method:"post",headers:t?{Authorization:`Bearer ${t}`}:void 0});return r(),o},async refreshToken(){return e.request({url:"/api/auth/refresh",method:"post"})}}}function A(i){let{http:e,getCurrentUser:n,storage:s}=i;return {hasRole(r){let t=n();return !t||!t.roles?false:t.roles.includes(r)},hasPermission(r){let t=n();return !t||!t.permissions?false:t.permissions.includes(r)},hasAnyPermission(r){return r.some(t=>this.hasPermission(t))},hasAllPermissions(r){return r.every(t=>this.hasPermission(t))},async getPermissionScope(r){let t=s.getItem("amaster_access_token");return t?r?e.request({url:`/api/auth/permissions/${r}/scope`,method:"get",headers:{Authorization:`Bearer ${t}`}}):{data:null,error:{message:"Permission name is required",status:400},status:400}:{data:null,error:{message:"Not authenticated",status:401},status:401}}}}function v(i){let{http:e,storage:n,onUserUpdate:s}=i;return {async getMe(){let r=n.getItem("amaster_access_token");if(!r)return {data:null,error:{message:"Not authenticated",status:401},status:401};let t=await e.request({url:"/api/auth/me",method:"get",headers:{Authorization:`Bearer ${r}`}});return t.data&&s(t.data),t},async updateMe(r){let t=n.getItem("amaster_access_token");if(!t)return {data:null,error:{message:"Not authenticated",status:401},status:401};let o=await e.request({url:"/api/auth/me",method:"put",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},data:r});return o.data&&s(o.data),o},async changePassword(r){let t=n.getItem("amaster_access_token");return t?e.request({url:"/api/auth/change-password",method:"post",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},data:r}):{data:null,error:{message:"Not authenticated",status:401},status:401}}}}function S(i){let{http:e,storage:n}=i;return {async getOAuthBindings(){let s=n.getItem("amaster_access_token");return s?e.request({url:"/api/auth/oauth-bindings",method:"get",headers:{Authorization:`Bearer ${s}`}}):{data:null,error:{message:"Not authenticated",status:401},status:401}},bindOAuth(s){if(typeof window>"u"){console.error("[AuthClient] OAuth binding is only available in browser environment");return}window.location.href=`/api/auth/oauth/${s}/bind`;},async unbindOAuth(s){let r=n.getItem("amaster_access_token");return r?e.request({url:`/api/auth/oauth/${s}/unbind`,method:"delete",headers:{Authorization:`Bearer ${r}`}}):{data:null,error:{message:"Not authenticated",status:401},status:401}}}}function k(i){let{http:e,storage:n}=i;return {async getSessions(){let s=n.getItem("amaster_access_token");return s?e.request({url:"/api/auth/sessions",method:"get",headers:{Authorization:`Bearer ${s}`}}):{data:null,error:{message:"Not authenticated",status:401},status:401}},async revokeSession(s){let r=n.getItem("amaster_access_token");return r?s?e.request({url:`/api/auth/sessions/${s}`,method:"delete",headers:{Authorization:`Bearer ${r}`}}):{data:null,error:{message:"Session ID is required",status:400},status:400}:{data:null,error:{message:"Not authenticated",status:401},status:401}},async revokeAllSessions(){let s=n.getItem("amaster_access_token");return s?e.request({url:"/api/auth/sessions",method:"delete",headers:{Authorization:`Bearer ${s}`}}):{data:null,error:{message:"Not authenticated",status:401},status:401}}}}function H(i={},e=httpClient.createHttpClient()){let {storage:n="localStorage",onTokenExpired:s,onUnauthorized:r}=i,o=300,u=R(n),c=new g,d=new f,m=null;try{let a=u.getItem(l.USER);a&&(m=JSON.parse(a));}catch(a){console.error("[AuthClient] Failed to load user from storage:",a);}let h;d.setRefreshCallback(async()=>{let a=await h.refreshToken();a.data?(await h.getMe(),c.emit("tokenRefreshed",a.data.accessToken)):(c.emit("tokenExpired"),s?.());});function P(a,p){u.setItem(l.ACCESS_TOKEN,p),u.setItem(l.USER,JSON.stringify(a)),m=a,d.scheduleRefreshFromToken(p,o),c.emit("login",a);}function T(a){m=a,u.setItem(l.USER,JSON.stringify(a));}function y(){u.clear(),m=null,d.clearSchedule();}function E(){return m}let M=C({http:e,onLoginSuccess:P,storage:u,clearAuth:y}),U=A({http:e,getCurrentUser:E,storage:u}),w=v({http:e,storage:u,onUserUpdate:T}),O=S({http:e,storage:u}),I=k({http:e,storage:u});return h={...M,...U,...w,...O,...I,on(a,p){c.on(a,p);},off(a,p){c.off(a,p);},isAuthenticated(){return !!u.getItem(l.ACCESS_TOKEN)},getAccessToken(){return u.getItem(l.ACCESS_TOKEN)},setAccessToken(a){u.setItem(l.ACCESS_TOKEN,a),d.scheduleRefreshFromToken(a,o);},clearAuth:y},h.on("unauthorized",()=>{r?.();}),h.isAuthenticated()&&h.getMe().catch(a=>{console.warn("[AuthClient] Failed to sync user info on init:",a);}),h}exports.createAuthClient=H;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/event-emitter.ts","../src/storage.ts","../src/token-manager.ts","../src/modules/auth.ts","../src/modules/permissions.ts","../src/modules/user.ts","../src/modules/oauth.ts","../src/modules/sessions.ts","../src/client.ts"],"names":["EventEmitter","event","handler","h","args","error","STORAGE_KEYS","createStorageAdapter","type","createNoOpStorage","storage","key","value","parseJwt","token","parts","base64","jsonPayload","c","TokenManager","callback","delayMs","accessToken","thresholdSeconds","payload","expiresAtMs","nowMs","refreshDelayMs","createAuthModule","deps","http","onLoginSuccess","clearAuth","params","result","provider","redirectUrl","url","hash","userJson","user","createPermissionsModule","getCurrentUser","roleCode","permissionName","permissionNames","name","createUserModule","onUserUpdate","createOAuthModule","createSessionsModule","sessionId","createAuthClient","options","createHttpClient","storageType","onTokenExpired","onUnauthorized","refreshThreshold","eventEmitter","tokenManager","currentUser","authClient","handleLoginSuccess","handleUserUpdate","authModule","permissionsModule","userModule","oauthModule","sessionsModule"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Simple event emitter for auth events\n */\n\nimport type { AuthEvent, EventHandler } from \"./types\";\n\ntype EventMap = Record<string, EventHandler[]>;\n\nexport class EventEmitter {\n private events: EventMap = {};\n\n /**\n * Subscribe to an event\n */\n on(event: AuthEvent, handler: EventHandler): void {\n if (!this.events[event]) {\n this.events[event] = [];\n }\n this.events[event].push(handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: AuthEvent, handler: EventHandler): void {\n if (!this.events[event]) {\n return;\n }\n this.events[event] = this.events[event].filter((h) => h !== handler);\n }\n\n /**\n * Emit an event with arguments\n */\n emit(event: AuthEvent, ...args: any[]): void {\n if (!this.events[event]) {\n return;\n }\n this.events[event].forEach((handler) => {\n try {\n handler(...args);\n } catch (error) {\n console.error(`[AuthClient] Error in event handler for \"${event}\":`, error);\n }\n });\n }\n\n /**\n * Remove all event listeners\n */\n removeAllListeners(): void {\n this.events = {};\n }\n}\n","/**\n * Storage adapter for token and user data persistence\n * Supports localStorage and sessionStorage with SSR compatibility\n */\n\nexport interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n}\n\n/**\n * Storage keys for auth data\n */\nexport const STORAGE_KEYS = {\n ACCESS_TOKEN: \"amaster_access_token\",\n REFRESH_TOKEN: \"amaster_refresh_token\",\n USER: \"amaster_user\",\n} as const;\n\n/**\n * Create a storage adapter that works in both browser and SSR environments\n */\nexport function createStorageAdapter(\n type: \"localStorage\" | \"sessionStorage\" = \"localStorage\"\n): StorageAdapter {\n // Check if we're in a browser environment\n const isBrowser = typeof window !== \"undefined\" && typeof window[type] !== \"undefined\";\n\n if (!isBrowser) {\n // Return a no-op adapter for SSR/Node.js environments\n return createNoOpStorage();\n }\n\n const storage = window[type === \"sessionStorage\" ? \"sessionStorage\" : \"localStorage\"];\n\n return {\n getItem(key: string): string | null {\n try {\n return storage.getItem(key);\n } catch (error) {\n console.error(`[AuthClient] Failed to get item from ${type}:`, error);\n return null;\n }\n },\n\n setItem(key: string, value: string): void {\n try {\n storage.setItem(key, value);\n } catch (error) {\n console.error(`[AuthClient] Failed to set item in ${type}:`, error);\n }\n },\n\n removeItem(key: string): void {\n try {\n storage.removeItem(key);\n } catch (error) {\n console.error(`[AuthClient] Failed to remove item from ${type}:`, error);\n }\n },\n\n clear(): void {\n try {\n // Only clear auth-related keys, not all storage\n storage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);\n storage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n storage.removeItem(STORAGE_KEYS.USER);\n } catch (error) {\n console.error(`[AuthClient] Failed to clear ${type}:`, error);\n }\n },\n };\n}\n\n/**\n * No-op storage adapter for SSR environments\n */\nfunction createNoOpStorage(): StorageAdapter {\n return {\n getItem(): string | null {\n return null;\n },\n setItem(): void {\n // No-op\n },\n removeItem(): void {\n // No-op\n },\n clear(): void {\n // No-op\n },\n };\n}\n","/**\n * Token manager for automatic token refresh\n */\n\n/**\n * JWT token payload interface\n */\ninterface JwtPayload {\n exp: number; // Expiration timestamp (seconds)\n [key: string]: any;\n}\n\n/**\n * Parse JWT token to extract payload\n * Note: This does NOT verify the token signature, only decodes the payload\n */\nexport function parseJwt(token: string): JwtPayload | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n return null;\n }\n\n const base64Url = parts[1] || \"\";\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Decode base64 in browser environment\n if (typeof atob !== \"undefined\") {\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\")\n );\n return JSON.parse(jsonPayload);\n }\n\n // Fallback for Node.js environment\n if (typeof Buffer !== \"undefined\") {\n const jsonPayload = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n return JSON.parse(jsonPayload);\n }\n\n return null;\n } catch (error) {\n console.error(\"[AuthClient] Failed to parse JWT token:\", error);\n return null;\n }\n}\n\n/**\n * Token manager class for handling automatic token refresh\n */\nexport class TokenManager {\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private isRefreshing = false;\n private refreshCallback: (() => Promise<void>) | null = null;\n\n /**\n * Set the refresh callback function\n */\n setRefreshCallback(callback: () => Promise<void>): void {\n this.refreshCallback = callback;\n }\n\n /**\n * Schedule a token refresh after a delay\n * @param delayMs Delay in milliseconds before refreshing\n */\n scheduleRefresh(delayMs: number): void {\n // Clear existing timer\n this.clearSchedule();\n\n // Don't schedule if delay is negative or zero\n if (delayMs <= 0) {\n return;\n }\n\n this.refreshTimer = setTimeout(() => {\n this.refresh();\n }, delayMs);\n }\n\n /**\n * Schedule token refresh based on token expiration and threshold\n * @param accessToken JWT access token\n * @param thresholdSeconds Refresh threshold in seconds (default: 300)\n */\n scheduleRefreshFromToken(accessToken: string, thresholdSeconds: number = 300): void {\n const payload = parseJwt(accessToken);\n if (!payload || !payload.exp) {\n console.warn(\"[AuthClient] Cannot schedule refresh: invalid token or missing exp claim\");\n return;\n }\n\n const expiresAtMs = payload.exp * 1000; // Convert to milliseconds\n const nowMs = Date.now();\n const expiresInMs = expiresAtMs - nowMs;\n\n // Calculate when to refresh (before expiration by thresholdSeconds)\n const refreshDelayMs = expiresInMs - thresholdSeconds * 1000;\n\n if (refreshDelayMs <= 0) {\n // Token already expired or will expire very soon\n console.warn(\"[AuthClient] Token already expired or expiring soon, refreshing immediately\");\n this.refresh();\n } else {\n this.scheduleRefresh(refreshDelayMs);\n }\n }\n\n /**\n * Manually trigger token refresh\n */\n async refresh(): Promise<void> {\n if (this.isRefreshing) {\n return;\n }\n\n if (!this.refreshCallback) {\n console.error(\"[AuthClient] No refresh callback set\");\n return;\n }\n\n this.isRefreshing = true;\n\n try {\n await this.refreshCallback();\n } catch (error) {\n console.error(\"[AuthClient] Token refresh failed:\", error);\n } finally {\n this.isRefreshing = false;\n }\n }\n\n /**\n * Clear the scheduled refresh timer\n */\n clearSchedule(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /**\n * Check if currently refreshing\n */\n isCurrentlyRefreshing(): boolean {\n return this.isRefreshing;\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n this.clearSchedule();\n this.refreshCallback = null;\n this.isRefreshing = false;\n }\n}\n","/**\n * Authentication Module\n *\n * @module auth\n * @category Authentication\n *\n * Handles user authentication including:\n * - Registration\n * - Login (email/username/phone + password)\n * - Verification code login\n * - OAuth social login\n * - Logout and token refresh\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type {\n RegisterParams,\n LoginParams,\n LoginResponse,\n CodeLoginParams,\n SendCodeParams,\n SuccessResponse,\n CaptchaResponse,\n OAuthProvider,\n RefreshTokenResponse,\n User,\n} from \"../types\";\n\nexport interface AuthModuleDeps {\n http: HttpClient;\n onLoginSuccess: (user: User, accessToken: string) => void;\n storage: { getItem: (key: string) => string | null };\n clearAuth: () => void;\n}\n\nexport function createAuthModule(deps: AuthModuleDeps) {\n const { http, onLoginSuccess, storage, clearAuth } = deps;\n\n return {\n /**\n * Register a new user account\n *\n * @category Authentication\n * @example\n * ```typescript\n * const result = await auth.register({\n * email: \"user@example.com\",\n * password: \"Password@123\",\n * displayName: \"John Doe\",\n * });\n * ```\n */\n async register(params: RegisterParams): Promise<ClientResult<LoginResponse>> {\n const result = await http.request<LoginResponse>({\n url: \"/api/auth/register\",\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: params,\n });\n\n if (result.data?.user && result.data?.accessToken) {\n onLoginSuccess(result.data.user, result.data.accessToken);\n }\n\n return result;\n },\n\n /**\n * Login with username/email/phone and password\n *\n * @category Authentication\n * @example\n * ```typescript\n * await auth.login({\n * loginType: \"email\",\n * email: \"user@example.com\",\n * password: \"Password@123\",\n * });\n * ```\n */\n async login(params: LoginParams): Promise<ClientResult<LoginResponse>> {\n const result = await http.request<LoginResponse>({\n url: \"/api/auth/login\",\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: params,\n });\n\n if (result.data?.user && result.data?.accessToken) {\n onLoginSuccess(result.data.user, result.data.accessToken);\n }\n\n return result;\n },\n\n /**\n * Login with verification code\n *\n * @category Authentication\n * @example\n * ```typescript\n * await auth.loginWithCode({\n * loginType: \"email\",\n * email: \"user@example.com\",\n * code: \"123456\",\n * });\n * ```\n */\n async loginWithCode(params: CodeLoginParams): Promise<ClientResult<LoginResponse>> {\n const result = await http.request<LoginResponse>({\n url: \"/api/auth/login-with-code\",\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: params,\n });\n\n if (result.data?.user && result.data?.accessToken) {\n onLoginSuccess(result.data.user, result.data.accessToken);\n }\n\n return result;\n },\n\n /**\n * Send verification code to email or phone\n *\n * @category Authentication\n * @example\n * ```typescript\n * await auth.sendCode({\n * type: \"email\",\n * email: \"user@example.com\",\n * });\n * ```\n */\n async sendCode(params: SendCodeParams): Promise<ClientResult<SuccessResponse>> {\n return http.request<SuccessResponse>({\n url: \"/api/auth/send-code\",\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: params,\n });\n },\n\n /**\n * Get captcha image\n *\n * @category Authentication\n */\n async getCaptcha(): Promise<ClientResult<CaptchaResponse>> {\n return http.request<CaptchaResponse>({\n url: \"/api/auth/captcha\",\n method: \"get\",\n });\n },\n\n /**\n * Redirect to OAuth provider for authentication\n *\n * @category Authentication\n * @example\n * ```typescript\n * auth.loginWithOAuth(\"google\");\n * ```\n */\n loginWithOAuth(provider: OAuthProvider, redirectUrl?: string): void {\n if (typeof window === \"undefined\") {\n console.error(\"[AuthClient] OAuth login is only available in browser environment\");\n return;\n }\n\n const url = redirectUrl\n ? `/api/auth/oauth/${provider}?redirect_url=${encodeURIComponent(redirectUrl)}`\n : `/api/auth/oauth/${provider}`;\n\n window.location.href = url;\n },\n\n /**\n * Handle OAuth callback\n *\n * @category Authentication\n */\n async handleOAuthCallback(): Promise<ClientResult<LoginResponse>> {\n if (typeof window === \"undefined\") {\n return {\n data: null,\n error: {\n message: \"OAuth callback is only available in browser environment\",\n status: 400,\n },\n status: 400,\n };\n }\n\n try {\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const accessToken = params.get(\"access_token\");\n const userJson = params.get(\"user\");\n\n if (!accessToken || !userJson) {\n return {\n data: null,\n error: { message: \"OAuth callback failed: missing token or user data\", status: 400 },\n status: 400,\n };\n }\n\n const user = JSON.parse(decodeURIComponent(userJson)) as User;\n onLoginSuccess(user, accessToken);\n\n return { data: { user, accessToken }, error: null, status: 200 };\n } catch (error) {\n return {\n data: null,\n error: {\n message: `OAuth callback failed: ${error instanceof Error ? error.message : String(error)}`,\n status: 400,\n },\n status: 400,\n };\n }\n },\n\n /**\n * Logout current user\n *\n * @category Authentication\n * @example\n * ```typescript\n * await auth.logout();\n * ```\n */\n async logout(): Promise<ClientResult<SuccessResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n\n const result = await http.request<SuccessResponse>({\n url: \"/api/auth/logout\",\n method: \"post\",\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n });\n\n clearAuth();\n return result;\n },\n\n /**\n * Refresh access token\n *\n * @category Authentication\n */\n async refreshToken(): Promise<ClientResult<RefreshTokenResponse>> {\n return http.request<RefreshTokenResponse>({\n url: \"/api/auth/refresh\",\n method: \"post\",\n });\n },\n };\n}\n\nexport type AuthModule = ReturnType<typeof createAuthModule>;\n","/**\n * Permissions Module\n *\n * @module permissions\n * @category Permissions\n *\n * Handles permission and role checks:\n * - Role-based access control (RBAC)\n * - Permission checks (fast, local)\n * - Data scope queries (async, server-side)\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { User, PermissionScopeResponse } from \"../types\";\n\nexport interface PermissionsModuleDeps {\n http: HttpClient;\n getCurrentUser: () => User | null;\n storage: { getItem: (key: string) => string | null };\n}\n\nexport function createPermissionsModule(deps: PermissionsModuleDeps) {\n const { http, getCurrentUser, storage } = deps;\n\n return {\n /**\n * Check if user has a specific role (fast, local check)\n *\n * @category Permissions\n * @performance O(1) - Fast\n * @example\n * ```typescript\n * if (permissions.hasRole(\"admin\")) {\n * showAdminPanel();\n * }\n * ```\n */\n hasRole(roleCode: string): boolean {\n const user = getCurrentUser();\n if (!user || !user.roles) return false;\n return user.roles.includes(roleCode);\n },\n\n /**\n * Check if user has a specific permission (fast, local check)\n *\n * @category Permissions\n * @performance O(1) - Fast\n * @example\n * ```typescript\n * if (permissions.hasPermission(\"user.delete\")) {\n * showDeleteButton();\n * }\n * ```\n */\n hasPermission(permissionName: string): boolean {\n const user = getCurrentUser();\n if (!user || !user.permissions) return false;\n return user.permissions.includes(permissionName);\n },\n\n /**\n * Check if user has ANY of the specified permissions\n *\n * @category Permissions\n * @performance O(n) - Fast\n * @example\n * ```typescript\n * if (permissions.hasAnyPermission([\"user.read\", \"user.write\"])) {\n * showUserSection();\n * }\n * ```\n */\n hasAnyPermission(permissionNames: string[]): boolean {\n return permissionNames.some((name) => this.hasPermission(name));\n },\n\n /**\n * Check if user has ALL of the specified permissions\n *\n * @category Permissions\n * @performance O(n) - Fast\n * @example\n * ```typescript\n * if (permissions.hasAllPermissions([\"user.read\", \"user.write\"])) {\n * showFullEditor();\n * }\n * ```\n */\n hasAllPermissions(permissionNames: string[]): boolean {\n return permissionNames.every((name) => this.hasPermission(name));\n },\n\n /**\n * Get data scope for a permission (async, server-side query)\n *\n * @category Permissions\n * @performance Network call required\n * @example\n * ```typescript\n * const result = await permissions.getPermissionScope(\"user.read\");\n * if (result.data?.dataScope.scopeType === \"department\") {\n * loadUsers({ departmentId: result.data.dataScope.scopeFilter.departmentId });\n * }\n * ```\n */\n async getPermissionScope(\n permissionName: string\n ): Promise<ClientResult<PermissionScopeResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n if (!permissionName) {\n return {\n data: null,\n error: { message: \"Permission name is required\", status: 400 },\n status: 400,\n };\n }\n\n return http.request<PermissionScopeResponse>({\n url: `/api/auth/permissions/${permissionName}/scope`,\n method: \"get\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n };\n}\n\nexport type PermissionsModule = ReturnType<typeof createPermissionsModule>;\n","/**\n * User Management Module\n *\n * @module user\n * @category User\n *\n * Handles user profile and account management:\n * - Get current user info\n * - Update profile\n * - Change password\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { User, UpdateMeParams, ChangePasswordParams, SuccessResponse } from \"../types\";\n\nexport interface UserModuleDeps {\n http: HttpClient;\n storage: {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n };\n onUserUpdate: (user: User) => void;\n}\n\nexport function createUserModule(deps: UserModuleDeps) {\n const { http, storage, onUserUpdate } = deps;\n\n return {\n /**\n * Get current logged-in user information\n *\n * @category User\n * @example\n * ```typescript\n * const result = await user.getMe();\n * if (result.data) {\n * console.log(\"User:\", result.data.displayName);\n * }\n * ```\n */\n async getMe(): Promise<ClientResult<User>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n const result = await http.request<User>({\n url: \"/api/auth/me\",\n method: \"get\",\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (result.data) {\n onUserUpdate(result.data);\n }\n\n return result;\n },\n\n /**\n * Update current user's profile\n *\n * @category User\n * @example\n * ```typescript\n * await user.updateMe({\n * displayName: \"New Name\",\n * avatarUrl: \"https://example.com/avatar.jpg\",\n * });\n * ```\n */\n async updateMe(params: UpdateMeParams): Promise<ClientResult<User>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n const result = await http.request<User>({\n url: \"/api/auth/me\",\n method: \"put\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n data: params,\n });\n\n if (result.data) {\n onUserUpdate(result.data);\n }\n\n return result;\n },\n\n /**\n * Change current user's password\n *\n * @category User\n * @example\n * ```typescript\n * await user.changePassword({\n * oldPassword: \"OldPass@123\",\n * newPassword: \"NewPass@456\",\n * });\n * ```\n */\n async changePassword(params: ChangePasswordParams): Promise<ClientResult<SuccessResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<SuccessResponse>({\n url: \"/api/auth/change-password\",\n method: \"post\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n data: params,\n });\n },\n };\n}\n\nexport type UserModule = ReturnType<typeof createUserModule>;\n","/**\n * OAuth Module\n *\n * @module oauth\n * @category OAuth\n *\n * Handles OAuth account binding management:\n * - List connected OAuth accounts\n * - Bind new OAuth account\n * - Unbind OAuth account\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { OAuthBinding, OAuthProvider, SuccessResponse } from \"../types\";\n\nexport interface OAuthModuleDeps {\n http: HttpClient;\n storage: { getItem: (key: string) => string | null };\n}\n\nexport function createOAuthModule(deps: OAuthModuleDeps) {\n const { http, storage } = deps;\n\n return {\n /**\n * Get list of OAuth accounts bound to current user\n *\n * @category OAuth\n * @example\n * ```typescript\n * const result = await oauth.getOAuthBindings();\n * if (result.data) {\n * result.data.forEach(binding => {\n * console.log(`${binding.provider}: ${binding.email}`);\n * });\n * }\n * ```\n */\n async getOAuthBindings(): Promise<ClientResult<OAuthBinding[]>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<OAuthBinding[]>({\n url: \"/api/auth/oauth-bindings\",\n method: \"get\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n\n /**\n * Bind an OAuth account to current user\n *\n * @category OAuth\n * @example\n * ```typescript\n * oauth.bindOAuth(\"google\"); // Redirects to Google OAuth\n * ```\n */\n bindOAuth(provider: OAuthProvider): void {\n if (typeof window === \"undefined\") {\n console.error(\"[AuthClient] OAuth binding is only available in browser environment\");\n return;\n }\n\n window.location.href = `/api/auth/oauth/${provider}/bind`;\n },\n\n /**\n * Unbind an OAuth account from current user\n *\n * @category OAuth\n * @example\n * ```typescript\n * await oauth.unbindOAuth(\"google\");\n * ```\n */\n async unbindOAuth(provider: OAuthProvider): Promise<ClientResult<SuccessResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<SuccessResponse>({\n url: `/api/auth/oauth/${provider}/unbind`,\n method: \"delete\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n };\n}\n\nexport type OAuthModule = ReturnType<typeof createOAuthModule>;\n","/**\n * Sessions Module\n *\n * @module sessions\n * @category Sessions\n *\n * Handles multi-device session management:\n * - View all active sessions\n * - Revoke specific session\n * - Revoke all other sessions\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { Session, SuccessResponse, RevokeAllSessionsResponse } from \"../types\";\n\nexport interface SessionsModuleDeps {\n http: HttpClient;\n storage: { getItem: (key: string) => string | null };\n}\n\nexport function createSessionsModule(deps: SessionsModuleDeps) {\n const { http, storage } = deps;\n\n return {\n /**\n * Get all active sessions for current user\n *\n * @category Sessions\n * @example\n * ```typescript\n * const result = await sessions.getSessions();\n * if (result.data) {\n * result.data.forEach(session => {\n * console.log(`${session.ip} - ${session.isCurrent ? \"Current\" : \"Other\"}`);\n * });\n * }\n * ```\n */\n async getSessions(): Promise<ClientResult<Session[]>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<Session[]>({\n url: \"/api/auth/sessions\",\n method: \"get\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n\n /**\n * Revoke a specific session\n *\n * @category Sessions\n * @example\n * ```typescript\n * await sessions.revokeSession(\"session-id-123\");\n * ```\n */\n async revokeSession(sessionId: string): Promise<ClientResult<SuccessResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n if (!sessionId) {\n return {\n data: null,\n error: { message: \"Session ID is required\", status: 400 },\n status: 400,\n };\n }\n\n return http.request<SuccessResponse>({\n url: `/api/auth/sessions/${sessionId}`,\n method: \"delete\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n\n /**\n * Revoke all sessions except current one\n *\n * @category Sessions\n * @example\n * ```typescript\n * const result = await sessions.revokeAllSessions();\n * if (result.data) {\n * console.log(`Revoked ${result.data.revokedCount} sessions`);\n * }\n * ```\n */\n async revokeAllSessions(): Promise<ClientResult<RevokeAllSessionsResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<RevokeAllSessionsResponse>({\n url: \"/api/auth/sessions\",\n method: \"delete\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n };\n}\n\nexport type SessionsModule = ReturnType<typeof createSessionsModule>;\n","/**\n * Main Authentication Client\n *\n * Combines all modules into a unified client interface\n */\n\nimport { createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport { EventEmitter } from \"./event-emitter\";\nimport { createStorageAdapter, STORAGE_KEYS, type StorageAdapter } from \"./storage\";\nimport { TokenManager } from \"./token-manager\";\nimport { createAuthModule } from \"./modules/auth\";\nimport { createPermissionsModule } from \"./modules/permissions\";\nimport { createUserModule } from \"./modules/user\";\nimport { createOAuthModule } from \"./modules/oauth\";\nimport { createSessionsModule } from \"./modules/sessions\";\nimport type { AuthClientOptions, AuthEvent, EventHandler, User } from \"./types\";\n\nexport type AuthClient = ReturnType<typeof createAuthModule> &\n ReturnType<typeof createPermissionsModule> &\n ReturnType<typeof createUserModule> &\n ReturnType<typeof createOAuthModule> &\n ReturnType<typeof createSessionsModule> & {\n // Events\n on(event: AuthEvent, handler: EventHandler): void;\n off(event: AuthEvent, handler: EventHandler): void;\n\n // Utilities\n isAuthenticated(): boolean;\n getAccessToken(): string | null;\n setAccessToken(token: string): void;\n clearAuth(): void;\n };\n\nexport function createAuthClient(\n options: AuthClientOptions = {},\n http: HttpClient = createHttpClient()\n): AuthClient {\n const { storage: storageType = \"localStorage\", onTokenExpired, onUnauthorized } = options;\n\n const autoRefresh = true;\n const refreshThreshold = 300;\n\n const storage: StorageAdapter = createStorageAdapter(storageType);\n const eventEmitter = new EventEmitter();\n const tokenManager = new TokenManager();\n\n let currentUser: User | null = null;\n\n // Load user from storage\n try {\n const userJson = storage.getItem(STORAGE_KEYS.USER);\n if (userJson) {\n currentUser = JSON.parse(userJson);\n }\n } catch (error) {\n console.error(\"[AuthClient] Failed to load user from storage:\", error);\n }\n\n // Forward declare for circular dependency\n let authClient: AuthClient;\n\n // Setup token refresh callback\n tokenManager.setRefreshCallback(async () => {\n const result = await authClient.refreshToken();\n if (result.data) {\n await authClient.getMe();\n eventEmitter.emit(\"tokenRefreshed\", result.data.accessToken);\n } else {\n eventEmitter.emit(\"tokenExpired\");\n onTokenExpired?.();\n }\n });\n\n function handleLoginSuccess(user: User, accessToken: string): void {\n storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, accessToken);\n storage.setItem(STORAGE_KEYS.USER, JSON.stringify(user));\n currentUser = user;\n\n if (autoRefresh) {\n tokenManager.scheduleRefreshFromToken(accessToken, refreshThreshold);\n }\n\n eventEmitter.emit(\"login\", user);\n }\n\n function handleUserUpdate(user: User): void {\n currentUser = user;\n storage.setItem(STORAGE_KEYS.USER, JSON.stringify(user));\n }\n\n function clearAuth(): void {\n storage.clear();\n currentUser = null;\n tokenManager.clearSchedule();\n }\n\n function getCurrentUser(): User | null {\n return currentUser;\n }\n\n // Create modules\n const authModule = createAuthModule({\n http,\n onLoginSuccess: handleLoginSuccess,\n storage,\n clearAuth,\n });\n\n const permissionsModule = createPermissionsModule({\n http,\n getCurrentUser,\n storage,\n });\n\n const userModule = createUserModule({\n http,\n storage,\n onUserUpdate: handleUserUpdate,\n });\n\n const oauthModule = createOAuthModule({\n http,\n storage,\n });\n\n const sessionsModule = createSessionsModule({\n http,\n storage,\n });\n\n // Combine all modules\n authClient = {\n ...authModule,\n ...permissionsModule,\n ...userModule,\n ...oauthModule,\n ...sessionsModule,\n\n // Events\n on(event: AuthEvent, handler: EventHandler): void {\n eventEmitter.on(event, handler);\n },\n\n off(event: AuthEvent, handler: EventHandler): void {\n eventEmitter.off(event, handler);\n },\n\n // Utilities\n isAuthenticated(): boolean {\n const token = storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n return !!token;\n },\n\n getAccessToken(): string | null {\n return storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n },\n\n setAccessToken(token: string): void {\n storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, token);\n if (autoRefresh) {\n tokenManager.scheduleRefreshFromToken(token, refreshThreshold);\n }\n },\n\n clearAuth,\n };\n\n // Setup unauthorized handler\n authClient.on(\"unauthorized\", () => {\n onUnauthorized?.();\n });\n\n // Auto sync user info on initialization\n if (authClient.isAuthenticated()) {\n authClient.getMe().catch((error) => {\n console.warn(\"[AuthClient] Failed to sync user info on init:\", error);\n });\n }\n\n return authClient;\n}\n"]}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * ============================================================================
3
+ * @amaster.ai/auth-client - Type Definitions
4
+ * ============================================================================
5
+ *
6
+ * 🤖 AI NAVIGATION - Read these files based on your task:
7
+ *
8
+ * 1. Need LOGIN/REGISTER/LOGOUT? → Read: ./auth.d.ts
9
+ * 2. Need PERMISSION checks? → Read: ./permissions.d.ts
10
+ * 3. Need USER profile management? → Read: ./user.d.ts
11
+ * 4. Need OAUTH binding? → Read: ./oauth.d.ts
12
+ * 5. Need SESSION management? → Read: ./sessions.d.ts
13
+ *
14
+ * ============================================================================
15
+ */
16
+ import { HttpClient } from '@amaster.ai/http-client';
17
+ import { createAuthModule } from './auth.cjs';
18
+ import { createPermissionsModule } from './permissions.cjs';
19
+ import { createUserModule } from './user.cjs';
20
+ import { createOAuthModule } from './oauth.cjs';
21
+ import { createSessionsModule } from './sessions.cjs';
22
+ import { A as AuthClientOptions, a as AuthEvent, E as EventHandler } from './types-4MBObpYA.cjs';
23
+ export { B as BatchCheckPermissionsResponse, b as CaptchaResponse, C as ChangePasswordParams, c as CheckPermissionResponse, d as CodeLoginParams, e as CodeLoginType, D as DataScope, L as LoginParams, f as LoginResponse, g as LoginType, O as OAuthBinding, h as OAuthProvider, P as Permission, i as PermissionDetail, j as PermissionScopeResponse, R as RefreshTokenResponse, k as RegisterParams, l as RegisterResponse, m as RevokeAllSessionsResponse, n as Role, o as RoleDetail, S as SendCodeParams, p as SendCodeType, q as Session, r as SuccessResponse, U as UpdateMeParams, s as User } from './types-4MBObpYA.cjs';
24
+
25
+ /**
26
+ * Main Authentication Client
27
+ *
28
+ * Combines all modules into a unified client interface
29
+ */
30
+
31
+ type AuthClient = ReturnType<typeof createAuthModule> & ReturnType<typeof createPermissionsModule> & ReturnType<typeof createUserModule> & ReturnType<typeof createOAuthModule> & ReturnType<typeof createSessionsModule> & {
32
+ on(event: AuthEvent, handler: EventHandler): void;
33
+ off(event: AuthEvent, handler: EventHandler): void;
34
+ isAuthenticated(): boolean;
35
+ getAccessToken(): string | null;
36
+ setAccessToken(token: string): void;
37
+ clearAuth(): void;
38
+ };
39
+ declare function createAuthClient(options?: AuthClientOptions, http?: HttpClient): AuthClient;
40
+
41
+ export { type AuthClient, AuthClientOptions, AuthEvent, EventHandler, createAuthClient };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * ============================================================================
3
+ * @amaster.ai/auth-client - Type Definitions
4
+ * ============================================================================
5
+ *
6
+ * 🤖 AI NAVIGATION - Read these files based on your task:
7
+ *
8
+ * 1. Need LOGIN/REGISTER/LOGOUT? → Read: ./auth.d.ts
9
+ * 2. Need PERMISSION checks? → Read: ./permissions.d.ts
10
+ * 3. Need USER profile management? → Read: ./user.d.ts
11
+ * 4. Need OAUTH binding? → Read: ./oauth.d.ts
12
+ * 5. Need SESSION management? → Read: ./sessions.d.ts
13
+ *
14
+ * ============================================================================
15
+ */
16
+ import { HttpClient } from '@amaster.ai/http-client';
17
+ import { createAuthModule } from './auth.js';
18
+ import { createPermissionsModule } from './permissions.js';
19
+ import { createUserModule } from './user.js';
20
+ import { createOAuthModule } from './oauth.js';
21
+ import { createSessionsModule } from './sessions.js';
22
+ import { A as AuthClientOptions, a as AuthEvent, E as EventHandler } from './types-4MBObpYA.js';
23
+ export { B as BatchCheckPermissionsResponse, b as CaptchaResponse, C as ChangePasswordParams, c as CheckPermissionResponse, d as CodeLoginParams, e as CodeLoginType, D as DataScope, L as LoginParams, f as LoginResponse, g as LoginType, O as OAuthBinding, h as OAuthProvider, P as Permission, i as PermissionDetail, j as PermissionScopeResponse, R as RefreshTokenResponse, k as RegisterParams, l as RegisterResponse, m as RevokeAllSessionsResponse, n as Role, o as RoleDetail, S as SendCodeParams, p as SendCodeType, q as Session, r as SuccessResponse, U as UpdateMeParams, s as User } from './types-4MBObpYA.js';
24
+
25
+ /**
26
+ * Main Authentication Client
27
+ *
28
+ * Combines all modules into a unified client interface
29
+ */
30
+
31
+ type AuthClient = ReturnType<typeof createAuthModule> & ReturnType<typeof createPermissionsModule> & ReturnType<typeof createUserModule> & ReturnType<typeof createOAuthModule> & ReturnType<typeof createSessionsModule> & {
32
+ on(event: AuthEvent, handler: EventHandler): void;
33
+ off(event: AuthEvent, handler: EventHandler): void;
34
+ isAuthenticated(): boolean;
35
+ getAccessToken(): string | null;
36
+ setAccessToken(token: string): void;
37
+ clearAuth(): void;
38
+ };
39
+ declare function createAuthClient(options?: AuthClientOptions, http?: HttpClient): AuthClient;
40
+
41
+ export { type AuthClient, AuthClientOptions, AuthEvent, EventHandler, createAuthClient };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import {createHttpClient}from'@amaster.ai/http-client';var g=class{constructor(){this.events={};}on(e,n){this.events[e]||(this.events[e]=[]),this.events[e].push(n);}off(e,n){this.events[e]&&(this.events[e]=this.events[e].filter(s=>s!==n));}emit(e,...n){this.events[e]&&this.events[e].forEach(s=>{try{s(...n);}catch(r){console.error(`[AuthClient] Error in event handler for "${e}":`,r);}});}removeAllListeners(){this.events={};}};var l={ACCESS_TOKEN:"amaster_access_token",REFRESH_TOKEN:"amaster_refresh_token",USER:"amaster_user"};function R(i="localStorage"){if(!(typeof window<"u"&&typeof window[i]<"u"))return b();let n=window[i==="sessionStorage"?"sessionStorage":"localStorage"];return {getItem(s){try{return n.getItem(s)}catch(r){return console.error(`[AuthClient] Failed to get item from ${i}:`,r),null}},setItem(s,r){try{n.setItem(s,r);}catch(t){console.error(`[AuthClient] Failed to set item in ${i}:`,t);}},removeItem(s){try{n.removeItem(s);}catch(r){console.error(`[AuthClient] Failed to remove item from ${i}:`,r);}},clear(){try{n.removeItem(l.ACCESS_TOKEN),n.removeItem(l.REFRESH_TOKEN),n.removeItem(l.USER);}catch(s){console.error(`[AuthClient] Failed to clear ${i}:`,s);}}}}function b(){return {getItem(){return null},setItem(){},removeItem(){},clear(){}}}function _(i){try{let e=i.split(".");if(e.length!==3)return null;let s=(e[1]||"").replace(/-/g,"+").replace(/_/g,"/");if(typeof atob<"u"){let r=decodeURIComponent(atob(s).split("").map(t=>"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(r)}if(typeof Buffer<"u"){let r=Buffer.from(s,"base64").toString("utf-8");return JSON.parse(r)}return null}catch(e){return console.error("[AuthClient] Failed to parse JWT token:",e),null}}var f=class{constructor(){this.refreshTimer=null;this.isRefreshing=false;this.refreshCallback=null;}setRefreshCallback(e){this.refreshCallback=e;}scheduleRefresh(e){this.clearSchedule(),!(e<=0)&&(this.refreshTimer=setTimeout(()=>{this.refresh();},e));}scheduleRefreshFromToken(e,n=300){let s=_(e);if(!s||!s.exp){console.warn("[AuthClient] Cannot schedule refresh: invalid token or missing exp claim");return}let r=s.exp*1e3,t=Date.now(),u=r-t-n*1e3;u<=0?(console.warn("[AuthClient] Token already expired or expiring soon, refreshing immediately"),this.refresh()):this.scheduleRefresh(u);}async refresh(){if(!this.isRefreshing){if(!this.refreshCallback){console.error("[AuthClient] No refresh callback set");return}this.isRefreshing=true;try{await this.refreshCallback();}catch(e){console.error("[AuthClient] Token refresh failed:",e);}finally{this.isRefreshing=false;}}}clearSchedule(){this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null);}isCurrentlyRefreshing(){return this.isRefreshing}destroy(){this.clearSchedule(),this.refreshCallback=null,this.isRefreshing=false;}};function C(i){let{http:e,onLoginSuccess:n,storage:s,clearAuth:r}=i;return {async register(t){let o=await e.request({url:"/api/auth/register",method:"post",headers:{"Content-Type":"application/json"},data:t});return o.data?.user&&o.data?.accessToken&&n(o.data.user,o.data.accessToken),o},async login(t){let o=await e.request({url:"/api/auth/login",method:"post",headers:{"Content-Type":"application/json"},data:t});return o.data?.user&&o.data?.accessToken&&n(o.data.user,o.data.accessToken),o},async loginWithCode(t){let o=await e.request({url:"/api/auth/login-with-code",method:"post",headers:{"Content-Type":"application/json"},data:t});return o.data?.user&&o.data?.accessToken&&n(o.data.user,o.data.accessToken),o},async sendCode(t){return e.request({url:"/api/auth/send-code",method:"post",headers:{"Content-Type":"application/json"},data:t})},async getCaptcha(){return e.request({url:"/api/auth/captcha",method:"get"})},loginWithOAuth(t,o){if(typeof window>"u"){console.error("[AuthClient] OAuth login is only available in browser environment");return}let u=o?`/api/auth/oauth/${t}?redirect_url=${encodeURIComponent(o)}`:`/api/auth/oauth/${t}`;window.location.href=u;},async handleOAuthCallback(){if(typeof window>"u")return {data:null,error:{message:"OAuth callback is only available in browser environment",status:400},status:400};try{let t=window.location.hash.substring(1),o=new URLSearchParams(t),u=o.get("access_token"),c=o.get("user");if(!u||!c)return {data:null,error:{message:"OAuth callback failed: missing token or user data",status:400},status:400};let d=JSON.parse(decodeURIComponent(c));return n(d,u),{data:{user:d,accessToken:u},error:null,status:200}}catch(t){return {data:null,error:{message:`OAuth callback failed: ${t instanceof Error?t.message:String(t)}`,status:400},status:400}}},async logout(){let t=s.getItem("amaster_access_token"),o=await e.request({url:"/api/auth/logout",method:"post",headers:t?{Authorization:`Bearer ${t}`}:void 0});return r(),o},async refreshToken(){return e.request({url:"/api/auth/refresh",method:"post"})}}}function A(i){let{http:e,getCurrentUser:n,storage:s}=i;return {hasRole(r){let t=n();return !t||!t.roles?false:t.roles.includes(r)},hasPermission(r){let t=n();return !t||!t.permissions?false:t.permissions.includes(r)},hasAnyPermission(r){return r.some(t=>this.hasPermission(t))},hasAllPermissions(r){return r.every(t=>this.hasPermission(t))},async getPermissionScope(r){let t=s.getItem("amaster_access_token");return t?r?e.request({url:`/api/auth/permissions/${r}/scope`,method:"get",headers:{Authorization:`Bearer ${t}`}}):{data:null,error:{message:"Permission name is required",status:400},status:400}:{data:null,error:{message:"Not authenticated",status:401},status:401}}}}function v(i){let{http:e,storage:n,onUserUpdate:s}=i;return {async getMe(){let r=n.getItem("amaster_access_token");if(!r)return {data:null,error:{message:"Not authenticated",status:401},status:401};let t=await e.request({url:"/api/auth/me",method:"get",headers:{Authorization:`Bearer ${r}`}});return t.data&&s(t.data),t},async updateMe(r){let t=n.getItem("amaster_access_token");if(!t)return {data:null,error:{message:"Not authenticated",status:401},status:401};let o=await e.request({url:"/api/auth/me",method:"put",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},data:r});return o.data&&s(o.data),o},async changePassword(r){let t=n.getItem("amaster_access_token");return t?e.request({url:"/api/auth/change-password",method:"post",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},data:r}):{data:null,error:{message:"Not authenticated",status:401},status:401}}}}function S(i){let{http:e,storage:n}=i;return {async getOAuthBindings(){let s=n.getItem("amaster_access_token");return s?e.request({url:"/api/auth/oauth-bindings",method:"get",headers:{Authorization:`Bearer ${s}`}}):{data:null,error:{message:"Not authenticated",status:401},status:401}},bindOAuth(s){if(typeof window>"u"){console.error("[AuthClient] OAuth binding is only available in browser environment");return}window.location.href=`/api/auth/oauth/${s}/bind`;},async unbindOAuth(s){let r=n.getItem("amaster_access_token");return r?e.request({url:`/api/auth/oauth/${s}/unbind`,method:"delete",headers:{Authorization:`Bearer ${r}`}}):{data:null,error:{message:"Not authenticated",status:401},status:401}}}}function k(i){let{http:e,storage:n}=i;return {async getSessions(){let s=n.getItem("amaster_access_token");return s?e.request({url:"/api/auth/sessions",method:"get",headers:{Authorization:`Bearer ${s}`}}):{data:null,error:{message:"Not authenticated",status:401},status:401}},async revokeSession(s){let r=n.getItem("amaster_access_token");return r?s?e.request({url:`/api/auth/sessions/${s}`,method:"delete",headers:{Authorization:`Bearer ${r}`}}):{data:null,error:{message:"Session ID is required",status:400},status:400}:{data:null,error:{message:"Not authenticated",status:401},status:401}},async revokeAllSessions(){let s=n.getItem("amaster_access_token");return s?e.request({url:"/api/auth/sessions",method:"delete",headers:{Authorization:`Bearer ${s}`}}):{data:null,error:{message:"Not authenticated",status:401},status:401}}}}function H(i={},e=createHttpClient()){let {storage:n="localStorage",onTokenExpired:s,onUnauthorized:r}=i,o=300,u=R(n),c=new g,d=new f,m=null;try{let a=u.getItem(l.USER);a&&(m=JSON.parse(a));}catch(a){console.error("[AuthClient] Failed to load user from storage:",a);}let h;d.setRefreshCallback(async()=>{let a=await h.refreshToken();a.data?(await h.getMe(),c.emit("tokenRefreshed",a.data.accessToken)):(c.emit("tokenExpired"),s?.());});function P(a,p){u.setItem(l.ACCESS_TOKEN,p),u.setItem(l.USER,JSON.stringify(a)),m=a,d.scheduleRefreshFromToken(p,o),c.emit("login",a);}function T(a){m=a,u.setItem(l.USER,JSON.stringify(a));}function y(){u.clear(),m=null,d.clearSchedule();}function E(){return m}let M=C({http:e,onLoginSuccess:P,storage:u,clearAuth:y}),U=A({http:e,getCurrentUser:E,storage:u}),w=v({http:e,storage:u,onUserUpdate:T}),O=S({http:e,storage:u}),I=k({http:e,storage:u});return h={...M,...U,...w,...O,...I,on(a,p){c.on(a,p);},off(a,p){c.off(a,p);},isAuthenticated(){return !!u.getItem(l.ACCESS_TOKEN)},getAccessToken(){return u.getItem(l.ACCESS_TOKEN)},setAccessToken(a){u.setItem(l.ACCESS_TOKEN,a),d.scheduleRefreshFromToken(a,o);},clearAuth:y},h.on("unauthorized",()=>{r?.();}),h.isAuthenticated()&&h.getMe().catch(a=>{console.warn("[AuthClient] Failed to sync user info on init:",a);}),h}export{H as createAuthClient};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/event-emitter.ts","../src/storage.ts","../src/token-manager.ts","../src/modules/auth.ts","../src/modules/permissions.ts","../src/modules/user.ts","../src/modules/oauth.ts","../src/modules/sessions.ts","../src/client.ts"],"names":["EventEmitter","event","handler","h","args","error","STORAGE_KEYS","createStorageAdapter","type","createNoOpStorage","storage","key","value","parseJwt","token","parts","base64","jsonPayload","c","TokenManager","callback","delayMs","accessToken","thresholdSeconds","payload","expiresAtMs","nowMs","refreshDelayMs","createAuthModule","deps","http","onLoginSuccess","clearAuth","params","result","provider","redirectUrl","url","hash","userJson","user","createPermissionsModule","getCurrentUser","roleCode","permissionName","permissionNames","name","createUserModule","onUserUpdate","createOAuthModule","createSessionsModule","sessionId","createAuthClient","options","createHttpClient","storageType","onTokenExpired","onUnauthorized","refreshThreshold","eventEmitter","tokenManager","currentUser","authClient","handleLoginSuccess","handleUserUpdate","authModule","permissionsModule","userModule","oauthModule","sessionsModule"],"mappings":"uDAQO,IAAMA,CAAAA,CAAN,KAAmB,CAAnB,WAAA,EAAA,CACL,IAAA,CAAQ,MAAA,CAAmB,GAAC,CAK5B,GAAGC,CAAAA,CAAkBC,CAAAA,CAA6B,CAC3C,IAAA,CAAK,MAAA,CAAOD,CAAK,IACpB,IAAA,CAAK,MAAA,CAAOA,CAAK,CAAA,CAAI,EAAC,CAAA,CAExB,KAAK,MAAA,CAAOA,CAAK,CAAA,CAAE,IAAA,CAAKC,CAAO,EACjC,CAKA,GAAA,CAAID,CAAAA,CAAkBC,CAAAA,CAA6B,CAC5C,IAAA,CAAK,MAAA,CAAOD,CAAK,CAAA,GAGtB,IAAA,CAAK,MAAA,CAAOA,CAAK,CAAA,CAAI,IAAA,CAAK,OAAOA,CAAK,CAAA,CAAE,MAAA,CAAQE,CAAAA,EAAMA,CAAAA,GAAMD,CAAO,GACrE,CAKA,IAAA,CAAKD,CAAAA,CAAAA,GAAqBG,CAAAA,CAAmB,CACtC,IAAA,CAAK,OAAOH,CAAK,CAAA,EAGtB,IAAA,CAAK,MAAA,CAAOA,CAAK,CAAA,CAAE,QAASC,CAAAA,EAAY,CACtC,GAAI,CACFA,CAAAA,CAAQ,GAAGE,CAAI,EACjB,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,4CAA4CJ,CAAK,CAAA,EAAA,CAAA,CAAMI,CAAK,EAC5E,CACF,CAAC,EACH,CAKA,kBAAA,EAA2B,CACzB,IAAA,CAAK,MAAA,CAAS,GAChB,CACF,CAAA,CCtCO,IAAMC,CAAAA,CAAe,CAC1B,YAAA,CAAc,sBAAA,CACd,aAAA,CAAe,uBAAA,CACf,IAAA,CAAM,cACR,CAAA,CAKO,SAASC,CAAAA,CACdC,EAA0C,cAAA,CAC1B,CAIhB,GAAI,EAFc,OAAO,MAAA,CAAW,KAAe,OAAO,MAAA,CAAOA,CAAI,CAAA,CAAM,GAAA,CAAA,CAIzE,OAAOC,GAAkB,CAG3B,IAAMC,CAAAA,CAAU,MAAA,CAAOF,CAAAA,GAAS,gBAAA,CAAmB,iBAAmB,cAAc,CAAA,CAEpF,OAAO,CACL,OAAA,CAAQG,CAAAA,CAA4B,CAClC,GAAI,CACF,OAAOD,CAAAA,CAAQ,OAAA,CAAQC,CAAG,CAC5B,CAAA,MAASN,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwCG,CAAI,CAAA,CAAA,CAAA,CAAKH,CAAK,CAAA,CAC7D,IACT,CACF,CAAA,CAEA,OAAA,CAAQM,CAAAA,CAAaC,CAAAA,CAAqB,CACxC,GAAI,CACFF,CAAAA,CAAQ,OAAA,CAAQC,EAAKC,CAAK,EAC5B,CAAA,MAASP,CAAAA,CAAO,CACd,OAAA,CAAQ,MAAM,CAAA,mCAAA,EAAsCG,CAAI,CAAA,CAAA,CAAA,CAAKH,CAAK,EACpE,CACF,EAEA,UAAA,CAAWM,CAAAA,CAAmB,CAC5B,GAAI,CACFD,CAAAA,CAAQ,WAAWC,CAAG,EACxB,CAAA,MAASN,CAAAA,CAAO,CACd,OAAA,CAAQ,MAAM,CAAA,wCAAA,EAA2CG,CAAI,CAAA,CAAA,CAAA,CAAKH,CAAK,EACzE,CACF,EAEA,KAAA,EAAc,CACZ,GAAI,CAEFK,CAAAA,CAAQ,UAAA,CAAWJ,EAAa,YAAY,CAAA,CAC5CI,CAAAA,CAAQ,UAAA,CAAWJ,CAAAA,CAAa,aAAa,CAAA,CAC7CI,CAAAA,CAAQ,UAAA,CAAWJ,CAAAA,CAAa,IAAI,EACtC,CAAA,MAASD,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgCG,CAAI,CAAA,CAAA,CAAA,CAAKH,CAAK,EAC9D,CACF,CACF,CACF,CAKA,SAASI,CAAAA,EAAoC,CAC3C,OAAO,CACL,OAAA,EAAyB,CACvB,OAAO,IACT,EACA,OAAA,EAAgB,CAEhB,CAAA,CACA,UAAA,EAAmB,CAEnB,CAAA,CACA,OAAc,CAEd,CACF,CACF,CC9EO,SAASI,CAAAA,CAASC,EAAkC,CACzD,GAAI,CACF,IAAMC,CAAAA,CAAQD,CAAAA,CAAM,MAAM,GAAG,CAAA,CAC7B,GAAIC,CAAAA,CAAM,MAAA,GAAW,CAAA,CACnB,OAAO,IAAA,CAIT,IAAMC,CAAAA,CAAAA,CADYD,CAAAA,CAAM,CAAC,CAAA,EAAK,IACL,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CAG7D,GAAI,OAAO,IAAA,CAAS,GAAA,CAAa,CAC/B,IAAME,CAAAA,CAAc,kBAAA,CAClB,IAAA,CAAKD,CAAM,CAAA,CACR,KAAA,CAAM,EAAE,CAAA,CACR,GAAA,CAAKE,CAAAA,EAAM,GAAA,CAAA,CAAO,IAAA,CAAOA,CAAAA,CAAE,WAAW,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,EAAG,KAAA,CAAM,EAAE,CAAC,CAAA,CAChE,IAAA,CAAK,EAAE,CACZ,CAAA,CACA,OAAO,IAAA,CAAK,KAAA,CAAMD,CAAW,CAC/B,CAGA,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,CACjC,IAAMA,CAAAA,CAAc,MAAA,CAAO,IAAA,CAAKD,EAAQ,QAAQ,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,CAClE,OAAO,KAAK,KAAA,CAAMC,CAAW,CAC/B,CAEA,OAAO,IACT,OAASZ,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,yCAAA,CAA2CA,CAAK,EACvD,IACT,CACF,CAKO,IAAMc,CAAAA,CAAN,KAAmB,CAAnB,WAAA,EAAA,CACL,IAAA,CAAQ,YAAA,CAAqD,IAAA,CAC7D,IAAA,CAAQ,YAAA,CAAe,MACvB,IAAA,CAAQ,eAAA,CAAgD,KAAA,CAKxD,kBAAA,CAAmBC,CAAAA,CAAqC,CACtD,KAAK,eAAA,CAAkBA,EACzB,CAMA,eAAA,CAAgBC,CAAAA,CAAuB,CAErC,IAAA,CAAK,aAAA,EAAc,CAGf,EAAAA,CAAAA,EAAW,CAAA,CAAA,GAIf,IAAA,CAAK,YAAA,CAAe,WAAW,IAAM,CACnC,IAAA,CAAK,OAAA,GACP,CAAA,CAAGA,CAAO,CAAA,EACZ,CAOA,wBAAA,CAAyBC,CAAAA,CAAqBC,CAAAA,CAA2B,GAAA,CAAW,CAClF,IAAMC,CAAAA,CAAUX,CAAAA,CAASS,CAAW,CAAA,CACpC,GAAI,CAACE,CAAAA,EAAW,CAACA,CAAAA,CAAQ,GAAA,CAAK,CAC5B,OAAA,CAAQ,KAAK,0EAA0E,CAAA,CACvF,MACF,CAEA,IAAMC,CAAAA,CAAcD,EAAQ,GAAA,CAAM,GAAA,CAC5BE,CAAAA,CAAQ,IAAA,CAAK,GAAA,EAAI,CAIjBC,EAHcF,CAAAA,CAAcC,CAAAA,CAGGH,CAAAA,CAAmB,GAAA,CAEpDI,CAAAA,EAAkB,CAAA,EAEpB,OAAA,CAAQ,IAAA,CAAK,6EAA6E,CAAA,CAC1F,IAAA,CAAK,OAAA,EAAQ,EAEb,IAAA,CAAK,gBAAgBA,CAAc,EAEvC,CAKA,MAAM,OAAA,EAAyB,CAC7B,GAAI,CAAA,IAAA,CAAK,YAAA,CAIT,CAAA,GAAI,CAAC,IAAA,CAAK,eAAA,CAAiB,CACzB,OAAA,CAAQ,KAAA,CAAM,sCAAsC,CAAA,CACpD,MACF,CAEA,KAAK,YAAA,CAAe,IAAA,CAEpB,GAAI,CACF,MAAM,IAAA,CAAK,kBACb,CAAA,MAAStB,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,qCAAsCA,CAAK,EAC3D,CAAA,OAAE,CACA,IAAA,CAAK,YAAA,CAAe,MACtB,CAAA,CACF,CAKA,aAAA,EAAsB,CAChB,IAAA,CAAK,YAAA,GACP,aAAa,IAAA,CAAK,YAAY,CAAA,CAC9B,IAAA,CAAK,YAAA,CAAe,IAAA,EAExB,CAKA,qBAAA,EAAiC,CAC/B,OAAO,IAAA,CAAK,YACd,CAKA,SAAgB,CACd,IAAA,CAAK,aAAA,EAAc,CACnB,IAAA,CAAK,eAAA,CAAkB,KACvB,IAAA,CAAK,YAAA,CAAe,MACtB,CACF,CAAA,CC7HO,SAASuB,EAAiBC,CAAAA,CAAsB,CACrD,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,eAAAC,CAAAA,CAAgB,OAAA,CAAArB,CAAAA,CAAS,SAAA,CAAAsB,CAAU,CAAA,CAAIH,EAErD,OAAO,CAcL,MAAM,QAAA,CAASI,CAAAA,CAA8D,CAC3E,IAAMC,CAAAA,CAAS,MAAMJ,CAAAA,CAAK,OAAA,CAAuB,CAC/C,GAAA,CAAK,oBAAA,CACL,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,KAAMG,CACR,CAAC,CAAA,CAED,OAAIC,CAAAA,CAAO,IAAA,EAAM,MAAQA,CAAAA,CAAO,IAAA,EAAM,WAAA,EACpCH,CAAAA,CAAeG,CAAAA,CAAO,IAAA,CAAK,KAAMA,CAAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAGnDA,CACT,CAAA,CAeA,MAAM,KAAA,CAAMD,CAAAA,CAA2D,CACrE,IAAMC,CAAAA,CAAS,MAAMJ,EAAK,OAAA,CAAuB,CAC/C,GAAA,CAAK,iBAAA,CACL,MAAA,CAAQ,MAAA,CACR,QAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAMG,CACR,CAAC,CAAA,CAED,OAAIC,CAAAA,CAAO,IAAA,EAAM,IAAA,EAAQA,CAAAA,CAAO,IAAA,EAAM,WAAA,EACpCH,CAAAA,CAAeG,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAMA,CAAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAGnDA,CACT,CAAA,CAeA,MAAM,aAAA,CAAcD,CAAAA,CAA+D,CACjF,IAAMC,CAAAA,CAAS,MAAMJ,CAAAA,CAAK,OAAA,CAAuB,CAC/C,IAAK,2BAAA,CACL,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAMG,CACR,CAAC,CAAA,CAED,OAAIC,EAAO,IAAA,EAAM,IAAA,EAAQA,CAAAA,CAAO,IAAA,EAAM,WAAA,EACpCH,CAAAA,CAAeG,EAAO,IAAA,CAAK,IAAA,CAAMA,CAAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAGnDA,CACT,CAAA,CAcA,MAAM,QAAA,CAASD,CAAAA,CAAgE,CAC7E,OAAOH,CAAAA,CAAK,OAAA,CAAyB,CACnC,GAAA,CAAK,qBAAA,CACL,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAMG,CACR,CAAC,CACH,CAAA,CAOA,MAAM,UAAA,EAAqD,CACzD,OAAOH,CAAAA,CAAK,QAAyB,CACnC,GAAA,CAAK,mBAAA,CACL,MAAA,CAAQ,KACV,CAAC,CACH,CAAA,CAWA,cAAA,CAAeK,CAAAA,CAAyBC,CAAAA,CAA4B,CAClE,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,CACjC,OAAA,CAAQ,KAAA,CAAM,mEAAmE,EACjF,MACF,CAEA,IAAMC,CAAAA,CAAMD,CAAAA,CACR,CAAA,gBAAA,EAAmBD,CAAQ,CAAA,cAAA,EAAiB,kBAAA,CAAmBC,CAAW,CAAC,CAAA,CAAA,CAC3E,CAAA,gBAAA,EAAmBD,CAAQ,CAAA,CAAA,CAE/B,MAAA,CAAO,QAAA,CAAS,IAAA,CAAOE,EACzB,CAAA,CAOA,MAAM,mBAAA,EAA4D,CAChE,GAAI,OAAO,MAAA,CAAW,GAAA,CACpB,OAAO,CACL,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,CACL,OAAA,CAAS,0DACT,MAAA,CAAQ,GACV,CAAA,CACA,MAAA,CAAQ,GACV,CAAA,CAGF,GAAI,CACF,IAAMC,CAAAA,CAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,UAAU,CAAC,CAAA,CACvCL,CAAAA,CAAS,IAAI,eAAA,CAAgBK,CAAI,EACjChB,CAAAA,CAAcW,CAAAA,CAAO,GAAA,CAAI,cAAc,CAAA,CACvCM,CAAAA,CAAWN,EAAO,GAAA,CAAI,MAAM,CAAA,CAElC,GAAI,CAACX,CAAAA,EAAe,CAACiB,CAAAA,CACnB,OAAO,CACL,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,CAAE,QAAS,mDAAA,CAAqD,MAAA,CAAQ,GAAI,CAAA,CACnF,MAAA,CAAQ,GACV,EAGF,IAAMC,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmBD,CAAQ,CAAC,CAAA,CACpD,OAAAR,CAAAA,CAAeS,CAAAA,CAAMlB,CAAW,CAAA,CAEzB,CAAE,IAAA,CAAM,CAAE,IAAA,CAAAkB,CAAAA,CAAM,WAAA,CAAAlB,CAAY,EAAG,KAAA,CAAO,IAAA,CAAM,MAAA,CAAQ,GAAI,CACjE,CAAA,MAASjB,EAAO,CACd,OAAO,CACL,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,CACL,OAAA,CAAS,CAAA,uBAAA,EAA0BA,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAAC,CAAA,CAAA,CACzF,MAAA,CAAQ,GACV,CAAA,CACA,MAAA,CAAQ,GACV,CACF,CACF,CAAA,CAWA,MAAM,MAAA,EAAiD,CACrD,IAAMS,CAAAA,CAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CAE9CwB,CAAAA,CAAS,MAAMJ,CAAAA,CAAK,OAAA,CAAyB,CACjD,GAAA,CAAK,kBAAA,CACL,MAAA,CAAQ,OACR,OAAA,CAAShB,CAAAA,CAAQ,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUA,CAAK,EAAG,CAAA,CAAI,MAC1D,CAAC,CAAA,CAED,OAAAkB,CAAAA,GACOE,CACT,CAAA,CAOA,MAAM,YAAA,EAA4D,CAChE,OAAOJ,EAAK,OAAA,CAA8B,CACxC,GAAA,CAAK,mBAAA,CACL,MAAA,CAAQ,MACV,CAAC,CACH,CACF,CACF,CC9OO,SAASW,CAAAA,CAAwBZ,CAAAA,CAA6B,CACnE,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,cAAA,CAAAY,CAAAA,CAAgB,QAAAhC,CAAQ,CAAA,CAAImB,CAAAA,CAE1C,OAAO,CAaL,OAAA,CAAQc,EAA2B,CACjC,IAAMH,CAAAA,CAAOE,CAAAA,EAAe,CAC5B,OAAI,CAACF,CAAAA,EAAQ,CAACA,CAAAA,CAAK,KAAA,CAAc,KAAA,CAC1BA,CAAAA,CAAK,MAAM,QAAA,CAASG,CAAQ,CACrC,CAAA,CAcA,aAAA,CAAcC,CAAAA,CAAiC,CAC7C,IAAMJ,CAAAA,CAAOE,CAAAA,EAAe,CAC5B,OAAI,CAACF,GAAQ,CAACA,CAAAA,CAAK,WAAA,CAAoB,KAAA,CAChCA,CAAAA,CAAK,WAAA,CAAY,SAASI,CAAc,CACjD,CAAA,CAcA,gBAAA,CAAiBC,CAAAA,CAAoC,CACnD,OAAOA,CAAAA,CAAgB,IAAA,CAAMC,CAAAA,EAAS,IAAA,CAAK,aAAA,CAAcA,CAAI,CAAC,CAChE,CAAA,CAcA,iBAAA,CAAkBD,CAAAA,CAAoC,CACpD,OAAOA,EAAgB,KAAA,CAAOC,CAAAA,EAAS,IAAA,CAAK,aAAA,CAAcA,CAAI,CAAC,CACjE,CAAA,CAeA,MAAM,kBAAA,CACJF,CAAAA,CACgD,CAChD,IAAM9B,EAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,OAAKI,CAAAA,CAQA8B,EAQEd,CAAAA,CAAK,OAAA,CAAiC,CAC3C,GAAA,CAAK,CAAA,sBAAA,EAAyBc,CAAc,SAC5C,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CAAE,aAAA,CAAe,CAAA,OAAA,EAAU9B,CAAK,CAAA,CAAG,CAC9C,CAAC,CAAA,CAXQ,CACL,IAAA,CAAM,IAAA,CACN,MAAO,CAAE,OAAA,CAAS,6BAAA,CAA+B,MAAA,CAAQ,GAAI,CAAA,CAC7D,OAAQ,GACV,CAAA,CAZO,CACL,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,CAAA,CACnD,MAAA,CAAQ,GACV,CAgBJ,CACF,CACF,CC7GO,SAASiC,CAAAA,CAAiBlB,EAAsB,CACrD,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,OAAA,CAAApB,EAAS,YAAA,CAAAsC,CAAa,CAAA,CAAInB,CAAAA,CAExC,OAAO,CAaL,MAAM,KAAA,EAAqC,CACzC,IAAMf,CAAAA,CAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,GAAI,CAACI,CAAAA,CACH,OAAO,CACL,IAAA,CAAM,KACN,KAAA,CAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,EACnD,MAAA,CAAQ,GACV,CAAA,CAGF,IAAMoB,CAAAA,CAAS,MAAMJ,EAAK,OAAA,CAAc,CACtC,GAAA,CAAK,cAAA,CACL,MAAA,CAAQ,KAAA,CACR,QAAS,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUhB,CAAK,CAAA,CAAG,CAC9C,CAAC,CAAA,CAED,OAAIoB,CAAAA,CAAO,IAAA,EACTc,CAAAA,CAAad,CAAAA,CAAO,IAAI,CAAA,CAGnBA,CACT,CAAA,CAcA,MAAM,QAAA,CAASD,CAAAA,CAAqD,CAClE,IAAMnB,CAAAA,CAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,GAAI,CAACI,CAAAA,CACH,OAAO,CACL,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,CAAA,CACnD,MAAA,CAAQ,GACV,CAAA,CAGF,IAAMoB,CAAAA,CAAS,MAAMJ,CAAAA,CAAK,OAAA,CAAc,CACtC,GAAA,CAAK,cAAA,CACL,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAe,CAAA,OAAA,EAAUhB,CAAK,CAAA,CAAA,CAC9B,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAMmB,CACR,CAAC,CAAA,CAED,OAAIC,CAAAA,CAAO,IAAA,EACTc,EAAad,CAAAA,CAAO,IAAI,CAAA,CAGnBA,CACT,CAAA,CAcA,MAAM,eAAeD,CAAAA,CAAsE,CACzF,IAAMnB,CAAAA,CAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,OAAKI,CAAAA,CAQEgB,CAAAA,CAAK,OAAA,CAAyB,CACnC,IAAK,2BAAA,CACL,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,aAAA,CAAe,UAAUhB,CAAK,CAAA,CAAA,CAC9B,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAMmB,CACR,CAAC,CAAA,CAfQ,CACL,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,CAAA,CACnD,MAAA,CAAQ,GACV,CAYJ,CACF,CACF,CCnHO,SAASgB,CAAAA,CAAkBpB,EAAuB,CACvD,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,OAAA,CAAApB,CAAQ,CAAA,CAAImB,CAAAA,CAE1B,OAAO,CAeL,MAAM,gBAAA,EAA0D,CAC9D,IAAMf,CAAAA,CAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,OAAKI,EAQEgB,CAAAA,CAAK,OAAA,CAAwB,CAClC,GAAA,CAAK,0BAAA,CACL,MAAA,CAAQ,MACR,OAAA,CAAS,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUhB,CAAK,CAAA,CAAG,CAC9C,CAAC,CAAA,CAXQ,CACL,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,CAAA,CACnD,MAAA,CAAQ,GACV,CAQJ,CAAA,CAWA,SAAA,CAAUqB,CAAAA,CAA+B,CACvC,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,CACjC,OAAA,CAAQ,KAAA,CAAM,qEAAqE,EACnF,MACF,CAEA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAO,CAAA,gBAAA,EAAmBA,CAAQ,CAAA,KAAA,EACpD,CAAA,CAWA,MAAM,WAAA,CAAYA,CAAAA,CAAiE,CACjF,IAAMrB,EAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,OAAKI,CAAAA,CAQEgB,EAAK,OAAA,CAAyB,CACnC,GAAA,CAAK,CAAA,gBAAA,EAAmBK,CAAQ,CAAA,OAAA,CAAA,CAChC,OAAQ,QAAA,CACR,OAAA,CAAS,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUrB,CAAK,EAAG,CAC9C,CAAC,CAAA,CAXQ,CACL,IAAA,CAAM,IAAA,CACN,MAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,CAAA,CACnD,OAAQ,GACV,CAQJ,CACF,CACF,CC/EO,SAASoC,EAAqBrB,CAAAA,CAA0B,CAC7D,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,OAAA,CAAApB,CAAQ,CAAA,CAAImB,CAAAA,CAE1B,OAAO,CAeL,MAAM,WAAA,EAAgD,CACpD,IAAMf,CAAAA,CAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,OAAKI,CAAAA,CAQEgB,CAAAA,CAAK,OAAA,CAAmB,CAC7B,GAAA,CAAK,oBAAA,CACL,OAAQ,KAAA,CACR,OAAA,CAAS,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUhB,CAAK,EAAG,CAC9C,CAAC,CAAA,CAXQ,CACL,IAAA,CAAM,IAAA,CACN,MAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,CAAA,CACnD,OAAQ,GACV,CAQJ,CAAA,CAWA,MAAM,aAAA,CAAcqC,CAAAA,CAA2D,CAC7E,IAAMrC,CAAAA,CAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,OAAKI,CAAAA,CAQAqC,CAAAA,CAQErB,CAAAA,CAAK,OAAA,CAAyB,CACnC,GAAA,CAAK,sBAAsBqB,CAAS,CAAA,CAAA,CACpC,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,CAAE,cAAe,CAAA,OAAA,EAAUrC,CAAK,CAAA,CAAG,CAC9C,CAAC,CAAA,CAXQ,CACL,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,CAAE,OAAA,CAAS,wBAAA,CAA0B,OAAQ,GAAI,CAAA,CACxD,MAAA,CAAQ,GACV,CAAA,CAZO,CACL,KAAM,IAAA,CACN,KAAA,CAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,CAAA,CACnD,MAAA,CAAQ,GACV,CAgBJ,CAAA,CAcA,MAAM,mBAAsE,CAC1E,IAAMA,CAAAA,CAAQJ,CAAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,CACpD,OAAKI,CAAAA,CAQEgB,CAAAA,CAAK,OAAA,CAAmC,CAC7C,GAAA,CAAK,oBAAA,CACL,OAAQ,QAAA,CACR,OAAA,CAAS,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUhB,CAAK,EAAG,CAC9C,CAAC,CAAA,CAXQ,CACL,IAAA,CAAM,IAAA,CACN,MAAO,CAAE,OAAA,CAAS,mBAAA,CAAqB,MAAA,CAAQ,GAAI,CAAA,CACnD,OAAQ,GACV,CAQJ,CACF,CACF,CCrFO,SAASsC,EACdC,CAAAA,CAA6B,EAAC,CAC9BvB,CAAAA,CAAmBwB,gBAAAA,EAAiB,CACxB,CACZ,IAAM,CAAE,OAAA,CAASC,CAAAA,CAAc,cAAA,CAAgB,cAAA,CAAAC,EAAgB,cAAA,CAAAC,CAAe,CAAA,CAAIJ,CAAAA,CAG5EK,CAAAA,CAAmB,GAAA,CAEnBhD,CAAAA,CAA0BH,CAAAA,CAAqBgD,CAAW,CAAA,CAC1DI,CAAAA,CAAe,IAAI3D,EACnB4D,CAAAA,CAAe,IAAIzC,CAAAA,CAErB0C,CAAAA,CAA2B,KAG/B,GAAI,CACF,IAAMtB,CAAAA,CAAW7B,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAa,IAAI,EAC9CiC,CAAAA,GACFsB,CAAAA,CAAc,IAAA,CAAK,KAAA,CAAMtB,CAAQ,CAAA,EAErC,OAASlC,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,gDAAA,CAAkDA,CAAK,EACvE,CAGA,IAAIyD,CAAAA,CAGJF,CAAAA,CAAa,kBAAA,CAAmB,SAAY,CAC1C,IAAM1B,CAAAA,CAAS,MAAM4B,CAAAA,CAAW,YAAA,EAAa,CACzC5B,EAAO,IAAA,EACT,MAAM4B,CAAAA,CAAW,KAAA,EAAM,CACvBH,CAAAA,CAAa,IAAA,CAAK,gBAAA,CAAkBzB,CAAAA,CAAO,IAAA,CAAK,WAAW,CAAA,GAE3DyB,CAAAA,CAAa,IAAA,CAAK,cAAc,CAAA,CAChCH,CAAAA,IAAiB,EAErB,CAAC,CAAA,CAED,SAASO,EAAmBvB,CAAAA,CAAYlB,CAAAA,CAA2B,CACjEZ,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAa,aAAcgB,CAAW,CAAA,CACtDZ,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAa,IAAA,CAAM,KAAK,SAAA,CAAUkC,CAAI,CAAC,CAAA,CACvDqB,CAAAA,CAAcrB,CAAAA,CAGZoB,CAAAA,CAAa,wBAAA,CAAyBtC,CAAAA,CAAaoC,CAAgB,CAAA,CAGrEC,CAAAA,CAAa,KAAK,OAAA,CAASnB,CAAI,EACjC,CAEA,SAASwB,CAAAA,CAAiBxB,EAAkB,CAC1CqB,CAAAA,CAAcrB,CAAAA,CACd9B,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAa,KAAM,IAAA,CAAK,SAAA,CAAUkC,CAAI,CAAC,EACzD,CAEA,SAASR,CAAAA,EAAkB,CACzBtB,CAAAA,CAAQ,KAAA,EAAM,CACdmD,CAAAA,CAAc,KACdD,CAAAA,CAAa,aAAA,GACf,CAEA,SAASlB,CAAAA,EAA8B,CACrC,OAAOmB,CACT,CAGA,IAAMI,CAAAA,CAAarC,CAAAA,CAAiB,CAClC,IAAA,CAAAE,CAAAA,CACA,cAAA,CAAgBiC,CAAAA,CAChB,OAAA,CAAArD,CAAAA,CACA,UAAAsB,CACF,CAAC,CAAA,CAEKkC,CAAAA,CAAoBzB,CAAAA,CAAwB,CAChD,KAAAX,CAAAA,CACA,cAAA,CAAAY,CAAAA,CACA,OAAA,CAAAhC,CACF,CAAC,EAEKyD,CAAAA,CAAapB,CAAAA,CAAiB,CAClC,IAAA,CAAAjB,CAAAA,CACA,OAAA,CAAApB,CAAAA,CACA,YAAA,CAAcsD,CAChB,CAAC,CAAA,CAEKI,CAAAA,CAAcnB,CAAAA,CAAkB,CACpC,KAAAnB,CAAAA,CACA,OAAA,CAAApB,CACF,CAAC,CAAA,CAEK2D,CAAAA,CAAiBnB,EAAqB,CAC1C,IAAA,CAAApB,CAAAA,CACA,OAAA,CAAApB,CACF,CAAC,EAGD,OAAAoD,CAAAA,CAAa,CACX,GAAGG,CAAAA,CACH,GAAGC,EACH,GAAGC,CAAAA,CACH,GAAGC,CAAAA,CACH,GAAGC,CAAAA,CAGH,GAAGpE,CAAAA,CAAkBC,CAAAA,CAA6B,CAChDyD,CAAAA,CAAa,EAAA,CAAG1D,CAAAA,CAAOC,CAAO,EAChC,CAAA,CAEA,GAAA,CAAID,CAAAA,CAAkBC,CAAAA,CAA6B,CACjDyD,EAAa,GAAA,CAAI1D,CAAAA,CAAOC,CAAO,EACjC,CAAA,CAGA,eAAA,EAA2B,CAEzB,OAAO,CAAC,CADMQ,CAAAA,CAAQ,OAAA,CAAQJ,CAAAA,CAAa,YAAY,CAEzD,CAAA,CAEA,cAAA,EAAgC,CAC9B,OAAOI,CAAAA,CAAQ,OAAA,CAAQJ,EAAa,YAAY,CAClD,CAAA,CAEA,cAAA,CAAeQ,CAAAA,CAAqB,CAClCJ,EAAQ,OAAA,CAAQJ,CAAAA,CAAa,YAAA,CAAcQ,CAAK,CAAA,CAE9C8C,EAAa,wBAAA,CAAyB9C,CAAAA,CAAO4C,CAAgB,EAEjE,CAAA,CAEA,SAAA,CAAA1B,CACF,CAAA,CAGA8B,CAAAA,CAAW,EAAA,CAAG,cAAA,CAAgB,IAAM,CAClCL,MACF,CAAC,CAAA,CAGGK,CAAAA,CAAW,eAAA,EAAgB,EAC7BA,EAAW,KAAA,EAAM,CAAE,KAAA,CAAOzD,CAAAA,EAAU,CAClC,OAAA,CAAQ,IAAA,CAAK,gDAAA,CAAkDA,CAAK,EACtE,CAAC,CAAA,CAGIyD,CACT","file":"index.js","sourcesContent":["/**\n * Simple event emitter for auth events\n */\n\nimport type { AuthEvent, EventHandler } from \"./types\";\n\ntype EventMap = Record<string, EventHandler[]>;\n\nexport class EventEmitter {\n private events: EventMap = {};\n\n /**\n * Subscribe to an event\n */\n on(event: AuthEvent, handler: EventHandler): void {\n if (!this.events[event]) {\n this.events[event] = [];\n }\n this.events[event].push(handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off(event: AuthEvent, handler: EventHandler): void {\n if (!this.events[event]) {\n return;\n }\n this.events[event] = this.events[event].filter((h) => h !== handler);\n }\n\n /**\n * Emit an event with arguments\n */\n emit(event: AuthEvent, ...args: any[]): void {\n if (!this.events[event]) {\n return;\n }\n this.events[event].forEach((handler) => {\n try {\n handler(...args);\n } catch (error) {\n console.error(`[AuthClient] Error in event handler for \"${event}\":`, error);\n }\n });\n }\n\n /**\n * Remove all event listeners\n */\n removeAllListeners(): void {\n this.events = {};\n }\n}\n","/**\n * Storage adapter for token and user data persistence\n * Supports localStorage and sessionStorage with SSR compatibility\n */\n\nexport interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n}\n\n/**\n * Storage keys for auth data\n */\nexport const STORAGE_KEYS = {\n ACCESS_TOKEN: \"amaster_access_token\",\n REFRESH_TOKEN: \"amaster_refresh_token\",\n USER: \"amaster_user\",\n} as const;\n\n/**\n * Create a storage adapter that works in both browser and SSR environments\n */\nexport function createStorageAdapter(\n type: \"localStorage\" | \"sessionStorage\" = \"localStorage\"\n): StorageAdapter {\n // Check if we're in a browser environment\n const isBrowser = typeof window !== \"undefined\" && typeof window[type] !== \"undefined\";\n\n if (!isBrowser) {\n // Return a no-op adapter for SSR/Node.js environments\n return createNoOpStorage();\n }\n\n const storage = window[type === \"sessionStorage\" ? \"sessionStorage\" : \"localStorage\"];\n\n return {\n getItem(key: string): string | null {\n try {\n return storage.getItem(key);\n } catch (error) {\n console.error(`[AuthClient] Failed to get item from ${type}:`, error);\n return null;\n }\n },\n\n setItem(key: string, value: string): void {\n try {\n storage.setItem(key, value);\n } catch (error) {\n console.error(`[AuthClient] Failed to set item in ${type}:`, error);\n }\n },\n\n removeItem(key: string): void {\n try {\n storage.removeItem(key);\n } catch (error) {\n console.error(`[AuthClient] Failed to remove item from ${type}:`, error);\n }\n },\n\n clear(): void {\n try {\n // Only clear auth-related keys, not all storage\n storage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);\n storage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n storage.removeItem(STORAGE_KEYS.USER);\n } catch (error) {\n console.error(`[AuthClient] Failed to clear ${type}:`, error);\n }\n },\n };\n}\n\n/**\n * No-op storage adapter for SSR environments\n */\nfunction createNoOpStorage(): StorageAdapter {\n return {\n getItem(): string | null {\n return null;\n },\n setItem(): void {\n // No-op\n },\n removeItem(): void {\n // No-op\n },\n clear(): void {\n // No-op\n },\n };\n}\n","/**\n * Token manager for automatic token refresh\n */\n\n/**\n * JWT token payload interface\n */\ninterface JwtPayload {\n exp: number; // Expiration timestamp (seconds)\n [key: string]: any;\n}\n\n/**\n * Parse JWT token to extract payload\n * Note: This does NOT verify the token signature, only decodes the payload\n */\nexport function parseJwt(token: string): JwtPayload | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n return null;\n }\n\n const base64Url = parts[1] || \"\";\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Decode base64 in browser environment\n if (typeof atob !== \"undefined\") {\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\")\n );\n return JSON.parse(jsonPayload);\n }\n\n // Fallback for Node.js environment\n if (typeof Buffer !== \"undefined\") {\n const jsonPayload = Buffer.from(base64, \"base64\").toString(\"utf-8\");\n return JSON.parse(jsonPayload);\n }\n\n return null;\n } catch (error) {\n console.error(\"[AuthClient] Failed to parse JWT token:\", error);\n return null;\n }\n}\n\n/**\n * Token manager class for handling automatic token refresh\n */\nexport class TokenManager {\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private isRefreshing = false;\n private refreshCallback: (() => Promise<void>) | null = null;\n\n /**\n * Set the refresh callback function\n */\n setRefreshCallback(callback: () => Promise<void>): void {\n this.refreshCallback = callback;\n }\n\n /**\n * Schedule a token refresh after a delay\n * @param delayMs Delay in milliseconds before refreshing\n */\n scheduleRefresh(delayMs: number): void {\n // Clear existing timer\n this.clearSchedule();\n\n // Don't schedule if delay is negative or zero\n if (delayMs <= 0) {\n return;\n }\n\n this.refreshTimer = setTimeout(() => {\n this.refresh();\n }, delayMs);\n }\n\n /**\n * Schedule token refresh based on token expiration and threshold\n * @param accessToken JWT access token\n * @param thresholdSeconds Refresh threshold in seconds (default: 300)\n */\n scheduleRefreshFromToken(accessToken: string, thresholdSeconds: number = 300): void {\n const payload = parseJwt(accessToken);\n if (!payload || !payload.exp) {\n console.warn(\"[AuthClient] Cannot schedule refresh: invalid token or missing exp claim\");\n return;\n }\n\n const expiresAtMs = payload.exp * 1000; // Convert to milliseconds\n const nowMs = Date.now();\n const expiresInMs = expiresAtMs - nowMs;\n\n // Calculate when to refresh (before expiration by thresholdSeconds)\n const refreshDelayMs = expiresInMs - thresholdSeconds * 1000;\n\n if (refreshDelayMs <= 0) {\n // Token already expired or will expire very soon\n console.warn(\"[AuthClient] Token already expired or expiring soon, refreshing immediately\");\n this.refresh();\n } else {\n this.scheduleRefresh(refreshDelayMs);\n }\n }\n\n /**\n * Manually trigger token refresh\n */\n async refresh(): Promise<void> {\n if (this.isRefreshing) {\n return;\n }\n\n if (!this.refreshCallback) {\n console.error(\"[AuthClient] No refresh callback set\");\n return;\n }\n\n this.isRefreshing = true;\n\n try {\n await this.refreshCallback();\n } catch (error) {\n console.error(\"[AuthClient] Token refresh failed:\", error);\n } finally {\n this.isRefreshing = false;\n }\n }\n\n /**\n * Clear the scheduled refresh timer\n */\n clearSchedule(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /**\n * Check if currently refreshing\n */\n isCurrentlyRefreshing(): boolean {\n return this.isRefreshing;\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n this.clearSchedule();\n this.refreshCallback = null;\n this.isRefreshing = false;\n }\n}\n","/**\n * Authentication Module\n *\n * @module auth\n * @category Authentication\n *\n * Handles user authentication including:\n * - Registration\n * - Login (email/username/phone + password)\n * - Verification code login\n * - OAuth social login\n * - Logout and token refresh\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type {\n RegisterParams,\n LoginParams,\n LoginResponse,\n CodeLoginParams,\n SendCodeParams,\n SuccessResponse,\n CaptchaResponse,\n OAuthProvider,\n RefreshTokenResponse,\n User,\n} from \"../types\";\n\nexport interface AuthModuleDeps {\n http: HttpClient;\n onLoginSuccess: (user: User, accessToken: string) => void;\n storage: { getItem: (key: string) => string | null };\n clearAuth: () => void;\n}\n\nexport function createAuthModule(deps: AuthModuleDeps) {\n const { http, onLoginSuccess, storage, clearAuth } = deps;\n\n return {\n /**\n * Register a new user account\n *\n * @category Authentication\n * @example\n * ```typescript\n * const result = await auth.register({\n * email: \"user@example.com\",\n * password: \"Password@123\",\n * displayName: \"John Doe\",\n * });\n * ```\n */\n async register(params: RegisterParams): Promise<ClientResult<LoginResponse>> {\n const result = await http.request<LoginResponse>({\n url: \"/api/auth/register\",\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: params,\n });\n\n if (result.data?.user && result.data?.accessToken) {\n onLoginSuccess(result.data.user, result.data.accessToken);\n }\n\n return result;\n },\n\n /**\n * Login with username/email/phone and password\n *\n * @category Authentication\n * @example\n * ```typescript\n * await auth.login({\n * loginType: \"email\",\n * email: \"user@example.com\",\n * password: \"Password@123\",\n * });\n * ```\n */\n async login(params: LoginParams): Promise<ClientResult<LoginResponse>> {\n const result = await http.request<LoginResponse>({\n url: \"/api/auth/login\",\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: params,\n });\n\n if (result.data?.user && result.data?.accessToken) {\n onLoginSuccess(result.data.user, result.data.accessToken);\n }\n\n return result;\n },\n\n /**\n * Login with verification code\n *\n * @category Authentication\n * @example\n * ```typescript\n * await auth.loginWithCode({\n * loginType: \"email\",\n * email: \"user@example.com\",\n * code: \"123456\",\n * });\n * ```\n */\n async loginWithCode(params: CodeLoginParams): Promise<ClientResult<LoginResponse>> {\n const result = await http.request<LoginResponse>({\n url: \"/api/auth/login-with-code\",\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: params,\n });\n\n if (result.data?.user && result.data?.accessToken) {\n onLoginSuccess(result.data.user, result.data.accessToken);\n }\n\n return result;\n },\n\n /**\n * Send verification code to email or phone\n *\n * @category Authentication\n * @example\n * ```typescript\n * await auth.sendCode({\n * type: \"email\",\n * email: \"user@example.com\",\n * });\n * ```\n */\n async sendCode(params: SendCodeParams): Promise<ClientResult<SuccessResponse>> {\n return http.request<SuccessResponse>({\n url: \"/api/auth/send-code\",\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: params,\n });\n },\n\n /**\n * Get captcha image\n *\n * @category Authentication\n */\n async getCaptcha(): Promise<ClientResult<CaptchaResponse>> {\n return http.request<CaptchaResponse>({\n url: \"/api/auth/captcha\",\n method: \"get\",\n });\n },\n\n /**\n * Redirect to OAuth provider for authentication\n *\n * @category Authentication\n * @example\n * ```typescript\n * auth.loginWithOAuth(\"google\");\n * ```\n */\n loginWithOAuth(provider: OAuthProvider, redirectUrl?: string): void {\n if (typeof window === \"undefined\") {\n console.error(\"[AuthClient] OAuth login is only available in browser environment\");\n return;\n }\n\n const url = redirectUrl\n ? `/api/auth/oauth/${provider}?redirect_url=${encodeURIComponent(redirectUrl)}`\n : `/api/auth/oauth/${provider}`;\n\n window.location.href = url;\n },\n\n /**\n * Handle OAuth callback\n *\n * @category Authentication\n */\n async handleOAuthCallback(): Promise<ClientResult<LoginResponse>> {\n if (typeof window === \"undefined\") {\n return {\n data: null,\n error: {\n message: \"OAuth callback is only available in browser environment\",\n status: 400,\n },\n status: 400,\n };\n }\n\n try {\n const hash = window.location.hash.substring(1);\n const params = new URLSearchParams(hash);\n const accessToken = params.get(\"access_token\");\n const userJson = params.get(\"user\");\n\n if (!accessToken || !userJson) {\n return {\n data: null,\n error: { message: \"OAuth callback failed: missing token or user data\", status: 400 },\n status: 400,\n };\n }\n\n const user = JSON.parse(decodeURIComponent(userJson)) as User;\n onLoginSuccess(user, accessToken);\n\n return { data: { user, accessToken }, error: null, status: 200 };\n } catch (error) {\n return {\n data: null,\n error: {\n message: `OAuth callback failed: ${error instanceof Error ? error.message : String(error)}`,\n status: 400,\n },\n status: 400,\n };\n }\n },\n\n /**\n * Logout current user\n *\n * @category Authentication\n * @example\n * ```typescript\n * await auth.logout();\n * ```\n */\n async logout(): Promise<ClientResult<SuccessResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n\n const result = await http.request<SuccessResponse>({\n url: \"/api/auth/logout\",\n method: \"post\",\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n });\n\n clearAuth();\n return result;\n },\n\n /**\n * Refresh access token\n *\n * @category Authentication\n */\n async refreshToken(): Promise<ClientResult<RefreshTokenResponse>> {\n return http.request<RefreshTokenResponse>({\n url: \"/api/auth/refresh\",\n method: \"post\",\n });\n },\n };\n}\n\nexport type AuthModule = ReturnType<typeof createAuthModule>;\n","/**\n * Permissions Module\n *\n * @module permissions\n * @category Permissions\n *\n * Handles permission and role checks:\n * - Role-based access control (RBAC)\n * - Permission checks (fast, local)\n * - Data scope queries (async, server-side)\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { User, PermissionScopeResponse } from \"../types\";\n\nexport interface PermissionsModuleDeps {\n http: HttpClient;\n getCurrentUser: () => User | null;\n storage: { getItem: (key: string) => string | null };\n}\n\nexport function createPermissionsModule(deps: PermissionsModuleDeps) {\n const { http, getCurrentUser, storage } = deps;\n\n return {\n /**\n * Check if user has a specific role (fast, local check)\n *\n * @category Permissions\n * @performance O(1) - Fast\n * @example\n * ```typescript\n * if (permissions.hasRole(\"admin\")) {\n * showAdminPanel();\n * }\n * ```\n */\n hasRole(roleCode: string): boolean {\n const user = getCurrentUser();\n if (!user || !user.roles) return false;\n return user.roles.includes(roleCode);\n },\n\n /**\n * Check if user has a specific permission (fast, local check)\n *\n * @category Permissions\n * @performance O(1) - Fast\n * @example\n * ```typescript\n * if (permissions.hasPermission(\"user.delete\")) {\n * showDeleteButton();\n * }\n * ```\n */\n hasPermission(permissionName: string): boolean {\n const user = getCurrentUser();\n if (!user || !user.permissions) return false;\n return user.permissions.includes(permissionName);\n },\n\n /**\n * Check if user has ANY of the specified permissions\n *\n * @category Permissions\n * @performance O(n) - Fast\n * @example\n * ```typescript\n * if (permissions.hasAnyPermission([\"user.read\", \"user.write\"])) {\n * showUserSection();\n * }\n * ```\n */\n hasAnyPermission(permissionNames: string[]): boolean {\n return permissionNames.some((name) => this.hasPermission(name));\n },\n\n /**\n * Check if user has ALL of the specified permissions\n *\n * @category Permissions\n * @performance O(n) - Fast\n * @example\n * ```typescript\n * if (permissions.hasAllPermissions([\"user.read\", \"user.write\"])) {\n * showFullEditor();\n * }\n * ```\n */\n hasAllPermissions(permissionNames: string[]): boolean {\n return permissionNames.every((name) => this.hasPermission(name));\n },\n\n /**\n * Get data scope for a permission (async, server-side query)\n *\n * @category Permissions\n * @performance Network call required\n * @example\n * ```typescript\n * const result = await permissions.getPermissionScope(\"user.read\");\n * if (result.data?.dataScope.scopeType === \"department\") {\n * loadUsers({ departmentId: result.data.dataScope.scopeFilter.departmentId });\n * }\n * ```\n */\n async getPermissionScope(\n permissionName: string\n ): Promise<ClientResult<PermissionScopeResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n if (!permissionName) {\n return {\n data: null,\n error: { message: \"Permission name is required\", status: 400 },\n status: 400,\n };\n }\n\n return http.request<PermissionScopeResponse>({\n url: `/api/auth/permissions/${permissionName}/scope`,\n method: \"get\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n };\n}\n\nexport type PermissionsModule = ReturnType<typeof createPermissionsModule>;\n","/**\n * User Management Module\n *\n * @module user\n * @category User\n *\n * Handles user profile and account management:\n * - Get current user info\n * - Update profile\n * - Change password\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { User, UpdateMeParams, ChangePasswordParams, SuccessResponse } from \"../types\";\n\nexport interface UserModuleDeps {\n http: HttpClient;\n storage: {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n };\n onUserUpdate: (user: User) => void;\n}\n\nexport function createUserModule(deps: UserModuleDeps) {\n const { http, storage, onUserUpdate } = deps;\n\n return {\n /**\n * Get current logged-in user information\n *\n * @category User\n * @example\n * ```typescript\n * const result = await user.getMe();\n * if (result.data) {\n * console.log(\"User:\", result.data.displayName);\n * }\n * ```\n */\n async getMe(): Promise<ClientResult<User>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n const result = await http.request<User>({\n url: \"/api/auth/me\",\n method: \"get\",\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (result.data) {\n onUserUpdate(result.data);\n }\n\n return result;\n },\n\n /**\n * Update current user's profile\n *\n * @category User\n * @example\n * ```typescript\n * await user.updateMe({\n * displayName: \"New Name\",\n * avatarUrl: \"https://example.com/avatar.jpg\",\n * });\n * ```\n */\n async updateMe(params: UpdateMeParams): Promise<ClientResult<User>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n const result = await http.request<User>({\n url: \"/api/auth/me\",\n method: \"put\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n data: params,\n });\n\n if (result.data) {\n onUserUpdate(result.data);\n }\n\n return result;\n },\n\n /**\n * Change current user's password\n *\n * @category User\n * @example\n * ```typescript\n * await user.changePassword({\n * oldPassword: \"OldPass@123\",\n * newPassword: \"NewPass@456\",\n * });\n * ```\n */\n async changePassword(params: ChangePasswordParams): Promise<ClientResult<SuccessResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<SuccessResponse>({\n url: \"/api/auth/change-password\",\n method: \"post\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n data: params,\n });\n },\n };\n}\n\nexport type UserModule = ReturnType<typeof createUserModule>;\n","/**\n * OAuth Module\n *\n * @module oauth\n * @category OAuth\n *\n * Handles OAuth account binding management:\n * - List connected OAuth accounts\n * - Bind new OAuth account\n * - Unbind OAuth account\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { OAuthBinding, OAuthProvider, SuccessResponse } from \"../types\";\n\nexport interface OAuthModuleDeps {\n http: HttpClient;\n storage: { getItem: (key: string) => string | null };\n}\n\nexport function createOAuthModule(deps: OAuthModuleDeps) {\n const { http, storage } = deps;\n\n return {\n /**\n * Get list of OAuth accounts bound to current user\n *\n * @category OAuth\n * @example\n * ```typescript\n * const result = await oauth.getOAuthBindings();\n * if (result.data) {\n * result.data.forEach(binding => {\n * console.log(`${binding.provider}: ${binding.email}`);\n * });\n * }\n * ```\n */\n async getOAuthBindings(): Promise<ClientResult<OAuthBinding[]>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<OAuthBinding[]>({\n url: \"/api/auth/oauth-bindings\",\n method: \"get\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n\n /**\n * Bind an OAuth account to current user\n *\n * @category OAuth\n * @example\n * ```typescript\n * oauth.bindOAuth(\"google\"); // Redirects to Google OAuth\n * ```\n */\n bindOAuth(provider: OAuthProvider): void {\n if (typeof window === \"undefined\") {\n console.error(\"[AuthClient] OAuth binding is only available in browser environment\");\n return;\n }\n\n window.location.href = `/api/auth/oauth/${provider}/bind`;\n },\n\n /**\n * Unbind an OAuth account from current user\n *\n * @category OAuth\n * @example\n * ```typescript\n * await oauth.unbindOAuth(\"google\");\n * ```\n */\n async unbindOAuth(provider: OAuthProvider): Promise<ClientResult<SuccessResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<SuccessResponse>({\n url: `/api/auth/oauth/${provider}/unbind`,\n method: \"delete\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n };\n}\n\nexport type OAuthModule = ReturnType<typeof createOAuthModule>;\n","/**\n * Sessions Module\n *\n * @module sessions\n * @category Sessions\n *\n * Handles multi-device session management:\n * - View all active sessions\n * - Revoke specific session\n * - Revoke all other sessions\n */\n\nimport type { HttpClient, ClientResult } from \"@amaster.ai/http-client\";\nimport type { Session, SuccessResponse, RevokeAllSessionsResponse } from \"../types\";\n\nexport interface SessionsModuleDeps {\n http: HttpClient;\n storage: { getItem: (key: string) => string | null };\n}\n\nexport function createSessionsModule(deps: SessionsModuleDeps) {\n const { http, storage } = deps;\n\n return {\n /**\n * Get all active sessions for current user\n *\n * @category Sessions\n * @example\n * ```typescript\n * const result = await sessions.getSessions();\n * if (result.data) {\n * result.data.forEach(session => {\n * console.log(`${session.ip} - ${session.isCurrent ? \"Current\" : \"Other\"}`);\n * });\n * }\n * ```\n */\n async getSessions(): Promise<ClientResult<Session[]>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<Session[]>({\n url: \"/api/auth/sessions\",\n method: \"get\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n\n /**\n * Revoke a specific session\n *\n * @category Sessions\n * @example\n * ```typescript\n * await sessions.revokeSession(\"session-id-123\");\n * ```\n */\n async revokeSession(sessionId: string): Promise<ClientResult<SuccessResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n if (!sessionId) {\n return {\n data: null,\n error: { message: \"Session ID is required\", status: 400 },\n status: 400,\n };\n }\n\n return http.request<SuccessResponse>({\n url: `/api/auth/sessions/${sessionId}`,\n method: \"delete\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n\n /**\n * Revoke all sessions except current one\n *\n * @category Sessions\n * @example\n * ```typescript\n * const result = await sessions.revokeAllSessions();\n * if (result.data) {\n * console.log(`Revoked ${result.data.revokedCount} sessions`);\n * }\n * ```\n */\n async revokeAllSessions(): Promise<ClientResult<RevokeAllSessionsResponse>> {\n const token = storage.getItem(\"amaster_access_token\");\n if (!token) {\n return {\n data: null,\n error: { message: \"Not authenticated\", status: 401 },\n status: 401,\n };\n }\n\n return http.request<RevokeAllSessionsResponse>({\n url: \"/api/auth/sessions\",\n method: \"delete\",\n headers: { Authorization: `Bearer ${token}` },\n });\n },\n };\n}\n\nexport type SessionsModule = ReturnType<typeof createSessionsModule>;\n","/**\n * Main Authentication Client\n *\n * Combines all modules into a unified client interface\n */\n\nimport { createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport { EventEmitter } from \"./event-emitter\";\nimport { createStorageAdapter, STORAGE_KEYS, type StorageAdapter } from \"./storage\";\nimport { TokenManager } from \"./token-manager\";\nimport { createAuthModule } from \"./modules/auth\";\nimport { createPermissionsModule } from \"./modules/permissions\";\nimport { createUserModule } from \"./modules/user\";\nimport { createOAuthModule } from \"./modules/oauth\";\nimport { createSessionsModule } from \"./modules/sessions\";\nimport type { AuthClientOptions, AuthEvent, EventHandler, User } from \"./types\";\n\nexport type AuthClient = ReturnType<typeof createAuthModule> &\n ReturnType<typeof createPermissionsModule> &\n ReturnType<typeof createUserModule> &\n ReturnType<typeof createOAuthModule> &\n ReturnType<typeof createSessionsModule> & {\n // Events\n on(event: AuthEvent, handler: EventHandler): void;\n off(event: AuthEvent, handler: EventHandler): void;\n\n // Utilities\n isAuthenticated(): boolean;\n getAccessToken(): string | null;\n setAccessToken(token: string): void;\n clearAuth(): void;\n };\n\nexport function createAuthClient(\n options: AuthClientOptions = {},\n http: HttpClient = createHttpClient()\n): AuthClient {\n const { storage: storageType = \"localStorage\", onTokenExpired, onUnauthorized } = options;\n\n const autoRefresh = true;\n const refreshThreshold = 300;\n\n const storage: StorageAdapter = createStorageAdapter(storageType);\n const eventEmitter = new EventEmitter();\n const tokenManager = new TokenManager();\n\n let currentUser: User | null = null;\n\n // Load user from storage\n try {\n const userJson = storage.getItem(STORAGE_KEYS.USER);\n if (userJson) {\n currentUser = JSON.parse(userJson);\n }\n } catch (error) {\n console.error(\"[AuthClient] Failed to load user from storage:\", error);\n }\n\n // Forward declare for circular dependency\n let authClient: AuthClient;\n\n // Setup token refresh callback\n tokenManager.setRefreshCallback(async () => {\n const result = await authClient.refreshToken();\n if (result.data) {\n await authClient.getMe();\n eventEmitter.emit(\"tokenRefreshed\", result.data.accessToken);\n } else {\n eventEmitter.emit(\"tokenExpired\");\n onTokenExpired?.();\n }\n });\n\n function handleLoginSuccess(user: User, accessToken: string): void {\n storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, accessToken);\n storage.setItem(STORAGE_KEYS.USER, JSON.stringify(user));\n currentUser = user;\n\n if (autoRefresh) {\n tokenManager.scheduleRefreshFromToken(accessToken, refreshThreshold);\n }\n\n eventEmitter.emit(\"login\", user);\n }\n\n function handleUserUpdate(user: User): void {\n currentUser = user;\n storage.setItem(STORAGE_KEYS.USER, JSON.stringify(user));\n }\n\n function clearAuth(): void {\n storage.clear();\n currentUser = null;\n tokenManager.clearSchedule();\n }\n\n function getCurrentUser(): User | null {\n return currentUser;\n }\n\n // Create modules\n const authModule = createAuthModule({\n http,\n onLoginSuccess: handleLoginSuccess,\n storage,\n clearAuth,\n });\n\n const permissionsModule = createPermissionsModule({\n http,\n getCurrentUser,\n storage,\n });\n\n const userModule = createUserModule({\n http,\n storage,\n onUserUpdate: handleUserUpdate,\n });\n\n const oauthModule = createOAuthModule({\n http,\n storage,\n });\n\n const sessionsModule = createSessionsModule({\n http,\n storage,\n });\n\n // Combine all modules\n authClient = {\n ...authModule,\n ...permissionsModule,\n ...userModule,\n ...oauthModule,\n ...sessionsModule,\n\n // Events\n on(event: AuthEvent, handler: EventHandler): void {\n eventEmitter.on(event, handler);\n },\n\n off(event: AuthEvent, handler: EventHandler): void {\n eventEmitter.off(event, handler);\n },\n\n // Utilities\n isAuthenticated(): boolean {\n const token = storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n return !!token;\n },\n\n getAccessToken(): string | null {\n return storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);\n },\n\n setAccessToken(token: string): void {\n storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, token);\n if (autoRefresh) {\n tokenManager.scheduleRefreshFromToken(token, refreshThreshold);\n }\n },\n\n clearAuth,\n };\n\n // Setup unauthorized handler\n authClient.on(\"unauthorized\", () => {\n onUnauthorized?.();\n });\n\n // Auto sync user info on initialization\n if (authClient.isAuthenticated()) {\n authClient.getMe().catch((error) => {\n console.warn(\"[AuthClient] Failed to sync user info on init:\", error);\n });\n }\n\n return authClient;\n}\n"]}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ============================================================================
3
+ * @amaster.ai/auth-client - Type Definitions
4
+ * ============================================================================
5
+ *
6
+ * 🤖 AI NAVIGATION - Read these files based on your task:
7
+ *
8
+ * 1. Need LOGIN/REGISTER/LOGOUT? → Read: ./auth.d.ts
9
+ * 2. Need PERMISSION checks? → Read: ./permissions.d.ts
10
+ * 3. Need USER profile management? → Read: ./user.d.ts
11
+ * 4. Need OAUTH binding? → Read: ./oauth.d.ts
12
+ * 5. Need SESSION management? → Read: ./sessions.d.ts
13
+ *
14
+ * ============================================================================
15
+ */
16
+ import { HttpClient, ClientResult } from '@amaster.ai/http-client';
17
+ import { O as OAuthBinding, h as OAuthProvider, r as SuccessResponse } from './types-4MBObpYA.cjs';
18
+
19
+ /**
20
+ * OAuth Module
21
+ *
22
+ * @module oauth
23
+ * @category OAuth
24
+ *
25
+ * Handles OAuth account binding management:
26
+ * - List connected OAuth accounts
27
+ * - Bind new OAuth account
28
+ * - Unbind OAuth account
29
+ */
30
+
31
+ interface OAuthModuleDeps {
32
+ http: HttpClient;
33
+ storage: {
34
+ getItem: (key: string) => string | null;
35
+ };
36
+ }
37
+ declare function createOAuthModule(deps: OAuthModuleDeps): {
38
+ /**
39
+ * Get list of OAuth accounts bound to current user
40
+ *
41
+ * @category OAuth
42
+ * @example
43
+ * ```typescript
44
+ * const result = await oauth.getOAuthBindings();
45
+ * if (result.data) {
46
+ * result.data.forEach(binding => {
47
+ * console.log(`${binding.provider}: ${binding.email}`);
48
+ * });
49
+ * }
50
+ * ```
51
+ */
52
+ getOAuthBindings(): Promise<ClientResult<OAuthBinding[]>>;
53
+ /**
54
+ * Bind an OAuth account to current user
55
+ *
56
+ * @category OAuth
57
+ * @example
58
+ * ```typescript
59
+ * oauth.bindOAuth("google"); // Redirects to Google OAuth
60
+ * ```
61
+ */
62
+ bindOAuth(provider: OAuthProvider): void;
63
+ /**
64
+ * Unbind an OAuth account from current user
65
+ *
66
+ * @category OAuth
67
+ * @example
68
+ * ```typescript
69
+ * await oauth.unbindOAuth("google");
70
+ * ```
71
+ */
72
+ unbindOAuth(provider: OAuthProvider): Promise<ClientResult<SuccessResponse>>;
73
+ };
74
+ type OAuthModule = ReturnType<typeof createOAuthModule>;
75
+
76
+ export { type OAuthModule, type OAuthModuleDeps, createOAuthModule };