@rool-dev/client 0.3.0-dev.52960ac → 0.3.0-dev.f9b91b8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,11 +13,11 @@ npm install @rool-dev/client
13
13
  ```typescript
14
14
  import { RoolClient } from '@rool-dev/client';
15
15
 
16
- const client = new RoolClient({ baseUrl: 'https://use.rool.dev' });
17
- client.initialize(); // Process auth callback if returning from login
16
+ const client = new RoolClient({ baseUrl: 'https://use.rool.dev/rool-server' });
17
+ client.initialize();
18
18
 
19
19
  if (!client.isAuthenticated()) {
20
- client.login(); // Redirects to auth page
20
+ client.login(); // Redirects to auth page
21
21
  }
22
22
 
23
23
  // Subscribe to real-time events
@@ -46,64 +46,18 @@ graph.close();
46
46
 
47
47
  ```typescript
48
48
  interface RoolClientConfig {
49
- baseUrl: string; // Base URL (e.g., 'https://use.rool.dev')
50
- graphqlUrl?: string; // Override GraphQL endpoint (default: {baseUrl}/graphql)
51
- mediaUrl?: string; // Override media endpoint (default: {baseUrl}/media)
52
- authUrl?: string; // Override auth endpoint (default: {baseUrl}/auth)
53
- authProvider?: AuthProvider; // Optional, defaults to browser auth
49
+ baseUrl: string; // Server URL (see below)
50
+ storagePrefix?: string; // localStorage prefix (default: 'rool_')
51
+ authProvider?: AuthProvider; // Custom auth (e.g., for Electron)
54
52
  }
55
53
  ```
56
54
 
57
- ### Base URLs
55
+ ### Server URLs
58
56
 
59
57
  | Environment | URL |
60
58
  |-------------|-----|
61
- | Development | `https://use.rool.dev` |
62
- | Production | `https://use.rool.app` |
63
-
64
- ### Auth Providers
65
-
66
- **Browser (default)** — No configuration needed. Uses localStorage for tokens, redirects to login page.
67
-
68
- ```typescript
69
- const client = new RoolClient({ baseUrl: 'https://use.rool.dev' });
70
- client.initialize(); // Process auth callbacks if this is a callback from the auth page
71
-
72
- if (!client.isAuthenticated()) {
73
- client.login(); // Redirect to the auth page
74
- }
75
- ```
76
-
77
- **Node.js** — For CLI tools and scripts. Stores credentials in `~/.config/rool/`, opens browser for login.
78
-
79
- ```typescript
80
- import { NodeAuthProvider } from '@rool-dev/client/node';
81
-
82
- const client = new RoolClient({
83
- baseUrl: 'https://use.rool.dev',
84
- authProvider: new NodeAuthProvider()
85
- });
86
-
87
- if (!client.isAuthenticated()) {
88
- await client.login(); // Open auth page in system browser, await callback
89
- }
90
- ```
91
-
92
- **Custom** — Implement the `AuthProvider` interface for full control.
93
-
94
- ```typescript
95
- const client = new RoolClient({
96
- baseUrl: 'https://use.rool.dev',
97
- authProvider: {
98
- initialize: () => false,
99
- getToken: async () => myStore.getAccessToken(),
100
- getUser: () => ({ email: 'user@example.com', name: 'User' }),
101
- isAuthenticated: () => myStore.hasValidToken(),
102
- login: async () => { /* your login flow */ },
103
- logout: () => myStore.clear(),
104
- }
105
- });
106
- ```
59
+ | Development | `https://use.rool.dev/rool-server` |
60
+ | Production | `https://use.rool.app/rool-server` |
107
61
 
108
62
 
109
63
  ---
@@ -114,7 +68,7 @@ const client = new RoolClient({
114
68
 
115
69
  | Method | Description |
116
70
  |--------|-------------|
117
- | `initialize(): boolean` | **Call on app startup if running in browser.** Processes auth callback from URL, sets up token refresh. |
71
+ | `initialize(): boolean` | **Call on app startup.** Processes auth callback from URL, sets up token refresh. |
118
72
  | `login(): void` | Redirect to login page |
119
73
  | `logout(): void` | Clear tokens and state |
120
74
  | `isAuthenticated(): boolean` | Check auth status |
@@ -339,6 +293,25 @@ interface PromptOptions {
339
293
 
340
294
  ---
341
295
 
296
+ ## Custom Auth Provider
297
+
298
+ For Electron or custom auth flows:
299
+
300
+ ```typescript
301
+ const client = new RoolClient({
302
+ baseUrl: 'https://use.rool.dev',
303
+ authProvider: {
304
+ getToken: async () => myTokenStore.getAccessToken(),
305
+ getUser: () => ({ email: 'user@example.com', name: 'User' }),
306
+ isAuthenticated: () => myTokenStore.hasValidToken(),
307
+ login: () => myAuthFlow.startLogin(),
308
+ logout: () => myTokenStore.clear(),
309
+ }
310
+ });
311
+ ```
312
+
313
+ ---
314
+
342
315
  ## License
343
316
 
344
317
  Proprietary - © Lightpost One. All rights reserved.
package/dist/auth.d.ts CHANGED
@@ -1,15 +1,27 @@
1
1
  import type { UserInfo, AuthProvider } from './types.js';
2
2
  export interface AuthManagerConfig {
3
- authUrl: string;
3
+ baseUrl: string;
4
+ storagePrefix: string;
4
5
  onAuthStateChanged?: (authenticated: boolean) => void;
5
6
  /** External auth provider - when set, delegates all auth to this provider */
6
7
  authProvider?: AuthProvider;
7
8
  }
8
9
  export declare class AuthManager {
9
- private provider;
10
+ private config;
11
+ private apiKey;
12
+ private apiKeyFetchPromise;
13
+ private refreshPromise;
14
+ private refreshTimeoutId;
15
+ private get storageKeys();
16
+ /** Check if using external auth provider */
17
+ private get hasExternalProvider();
18
+ /** Get the auth base URL (origin only, no path like /rool-server) */
19
+ private get authBaseUrl();
10
20
  constructor(config: AuthManagerConfig);
11
21
  /**
12
22
  * Initialize auth manager - should be called on app startup.
23
+ * Processes any auth callback in the URL and sets up auto-refresh.
24
+ * No-op when using external auth provider.
13
25
  */
14
26
  initialize(): boolean;
15
27
  /**
@@ -17,18 +29,18 @@ export declare class AuthManager {
17
29
  */
18
30
  isAuthenticated(): boolean;
19
31
  /**
20
- * Get current access token.
32
+ * Get current access token, refreshing if expired.
21
33
  * Returns undefined if not authenticated.
22
34
  */
23
35
  getToken(): Promise<string | undefined>;
24
36
  /**
25
- * Get user info from current session.
37
+ * Get user info decoded from JWT token.
26
38
  */
27
39
  getUser(): UserInfo;
28
40
  /**
29
- * Initiate login.
41
+ * Initiate login by redirecting to auth page.
30
42
  */
31
- login(): Promise<void> | void;
43
+ login(): void;
32
44
  /**
33
45
  * Logout - clear all tokens and state.
34
46
  */
@@ -40,8 +52,24 @@ export declare class AuthManager {
40
52
  */
41
53
  processCallback(): boolean;
42
54
  /**
43
- * Destroy auth manager - cleanup resources.
55
+ * Destroy auth manager - clear refresh timers.
44
56
  */
45
57
  destroy(): void;
58
+ /**
59
+ * Get the API key, fetching from server if not provided in config.
60
+ */
61
+ private getApiKey;
62
+ private tryRefreshToken;
63
+ private scheduleTokenRefresh;
64
+ private cancelScheduledRefresh;
65
+ private readAccessToken;
66
+ private readExpiresAt;
67
+ private writeTokens;
68
+ private clearTokens;
69
+ private storeState;
70
+ private readState;
71
+ private clearState;
72
+ private generateState;
73
+ private decodeUserInfo;
46
74
  }
47
75
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGzD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,6EAA6E;IAC7E,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAe;gBAEnB,MAAM,EAAE,iBAAiB;IAmBrC;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI7C;;OAEG;IACH,OAAO,IAAI,QAAQ;IAInB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI7B;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;;;OAIG;IACH,eAAe,IAAI,OAAO;IAQ1B;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKzD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,6EAA6E;IAC7E,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,kBAAkB,CAAuC;IACjE,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,gBAAgB,CAA8C;IAEtE,OAAO,KAAK,WAAW,GAOtB;IAED,4CAA4C;IAC5C,OAAO,KAAK,mBAAmB,GAE9B;IAED,qEAAqE;IACrE,OAAO,KAAK,WAAW,GAQtB;gBAEW,MAAM,EAAE,iBAAiB;IAIrC;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAOrB;;OAEG;IACH,eAAe,IAAI,OAAO;IAc1B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAoB7C;;OAEG;IACH,OAAO,IAAI,QAAQ;IASnB;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;OAEG;IACH,MAAM,IAAI,IAAI;IAiBd;;;;OAIG;IACH,eAAe,IAAI,OAAO;IAyC1B;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;YACW,SAAS;YAgCT,eAAe;IAyD7B,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,cAAc;CAYvB"}
package/dist/auth.js CHANGED
@@ -1,65 +1,141 @@
1
1
  // =============================================================================
2
2
  // Auth Manager
3
- // Handles authentication via configurable AuthProvider
3
+ // Handles authentication via GCIP redirect flow, token storage, and refresh
4
+ // Supports external auth providers (e.g., Electron) via AuthProvider interface
4
5
  // =============================================================================
5
- import { BrowserAuthProvider } from './auth-browser.js';
6
+ const GCIP_REFRESH_ENDPOINT = 'https://securetoken.googleapis.com/v1/token';
7
+ const REFRESH_BUFFER_MS = 5 * 60 * 1000; // Refresh 5 minutes before expiry
6
8
  export class AuthManager {
7
- provider;
8
- constructor(config) {
9
- if (config.authProvider) {
10
- this.provider = config.authProvider;
11
- // Inject auth URL if the provider supports it (e.g. NodeAuthProvider)
12
- if ('setAuthUrl' in this.provider && typeof this.provider.setAuthUrl === 'function') {
13
- this.provider.setAuthUrl(config.authUrl);
14
- }
9
+ config;
10
+ apiKey = null;
11
+ apiKeyFetchPromise = null;
12
+ refreshPromise = null;
13
+ refreshTimeoutId = null;
14
+ get storageKeys() {
15
+ return {
16
+ access: `${this.config.storagePrefix}access_token`,
17
+ refresh: `${this.config.storagePrefix}refresh_token`,
18
+ expiresAt: `${this.config.storagePrefix}token_expires_at`,
19
+ state: `${this.config.storagePrefix}auth_state`,
20
+ };
21
+ }
22
+ /** Check if using external auth provider */
23
+ get hasExternalProvider() {
24
+ return !!this.config.authProvider;
25
+ }
26
+ /** Get the auth base URL (origin only, no path like /rool-server) */
27
+ get authBaseUrl() {
28
+ try {
29
+ const url = new URL(this.config.baseUrl);
30
+ return url.origin;
15
31
  }
16
- else {
17
- // Default to BrowserAuthProvider if no external provider specified
18
- // This preserves existing behavior for browser usage
19
- this.provider = new BrowserAuthProvider({
20
- authUrl: config.authUrl,
21
- onAuthStateChanged: (authenticated) => {
22
- config.onAuthStateChanged?.(authenticated);
23
- },
24
- });
32
+ catch {
33
+ // Fallback for relative URLs
34
+ return this.config.baseUrl.replace(/\/rool-server\/?$/, '');
25
35
  }
26
36
  }
37
+ constructor(config) {
38
+ this.config = config;
39
+ }
27
40
  /**
28
41
  * Initialize auth manager - should be called on app startup.
42
+ * Processes any auth callback in the URL and sets up auto-refresh.
43
+ * No-op when using external auth provider.
29
44
  */
30
45
  initialize() {
31
- return this.provider.initialize?.() ?? false;
46
+ if (this.hasExternalProvider)
47
+ return false;
48
+ const wasCallback = this.processCallback();
49
+ this.scheduleTokenRefresh();
50
+ return wasCallback;
32
51
  }
33
52
  /**
34
53
  * Check if user is currently authenticated (has valid token).
35
54
  */
36
55
  isAuthenticated() {
37
- return this.provider.isAuthenticated();
56
+ if (this.config.authProvider?.isAuthenticated) {
57
+ return this.config.authProvider.isAuthenticated();
58
+ }
59
+ if (this.hasExternalProvider) {
60
+ // For external providers without isAuthenticated, assume true if getToken would work
61
+ return true;
62
+ }
63
+ const accessToken = this.readAccessToken();
64
+ const expiresAt = this.readExpiresAt();
65
+ if (!accessToken || !expiresAt)
66
+ return false;
67
+ return Date.now() < expiresAt;
38
68
  }
39
69
  /**
40
- * Get current access token.
70
+ * Get current access token, refreshing if expired.
41
71
  * Returns undefined if not authenticated.
42
72
  */
43
73
  async getToken() {
44
- return this.provider.getToken();
74
+ if (this.config.authProvider) {
75
+ return this.config.authProvider.getToken();
76
+ }
77
+ const accessToken = this.readAccessToken();
78
+ const expiresAt = this.readExpiresAt();
79
+ if (!accessToken)
80
+ return undefined;
81
+ // Token expired or about to expire - try refresh
82
+ if (expiresAt && Date.now() >= expiresAt - REFRESH_BUFFER_MS) {
83
+ const refreshed = await this.tryRefreshToken();
84
+ if (!refreshed)
85
+ return undefined;
86
+ return this.readAccessToken() ?? undefined;
87
+ }
88
+ return accessToken;
45
89
  }
46
90
  /**
47
- * Get user info from current session.
91
+ * Get user info decoded from JWT token.
48
92
  */
49
93
  getUser() {
50
- return this.provider.getUser();
94
+ if (this.config.authProvider) {
95
+ return this.config.authProvider.getUser();
96
+ }
97
+ const accessToken = this.readAccessToken();
98
+ if (!accessToken)
99
+ return { email: null, name: null };
100
+ return this.decodeUserInfo(accessToken);
51
101
  }
52
102
  /**
53
- * Initiate login.
103
+ * Initiate login by redirecting to auth page.
54
104
  */
55
105
  login() {
56
- return this.provider.login();
106
+ if (this.config.authProvider?.login) {
107
+ this.config.authProvider.login();
108
+ return;
109
+ }
110
+ if (this.hasExternalProvider) {
111
+ console.warn('[RoolClient] External auth provider does not support login()');
112
+ return;
113
+ }
114
+ const loginUrl = new URL(`${this.authBaseUrl}/auth/`);
115
+ const redirectTarget = window.location.origin + window.location.pathname + window.location.search;
116
+ loginUrl.searchParams.set('redirect_uri', redirectTarget);
117
+ const state = this.generateState();
118
+ this.storeState(state);
119
+ loginUrl.searchParams.set('state', state);
120
+ window.location.href = loginUrl.toString();
57
121
  }
58
122
  /**
59
123
  * Logout - clear all tokens and state.
60
124
  */
61
125
  logout() {
62
- this.provider.logout();
126
+ if (this.config.authProvider?.logout) {
127
+ this.config.authProvider.logout();
128
+ this.config.onAuthStateChanged?.(false);
129
+ return;
130
+ }
131
+ if (this.hasExternalProvider) {
132
+ console.warn('[RoolClient] External auth provider does not support logout()');
133
+ return;
134
+ }
135
+ this.clearTokens();
136
+ this.clearState();
137
+ this.cancelScheduledRefresh();
138
+ this.config.onAuthStateChanged?.(false);
63
139
  }
64
140
  /**
65
141
  * Process auth callback from URL fragment.
@@ -67,17 +143,233 @@ export class AuthManager {
67
143
  * @returns true if callback was processed
68
144
  */
69
145
  processCallback() {
70
- // Only BrowserAuthProvider knows how to process URL callbacks
71
- if (this.provider instanceof BrowserAuthProvider) {
72
- return this.provider.processCallback();
146
+ const hash = window.location.hash ?? '';
147
+ const trimmed = hash.startsWith('#') ? hash.slice(1) : hash;
148
+ if (!trimmed)
149
+ return false;
150
+ const params = new URLSearchParams(trimmed);
151
+ const idToken = params.get('id_token');
152
+ if (!idToken)
153
+ return false;
154
+ const refreshToken = params.get('refresh_token');
155
+ const expiresIn = params.get('expires_in');
156
+ const expiresAt = expiresIn ? Date.now() + Number(expiresIn) * 1000 : NaN;
157
+ const incomingState = params.get('state');
158
+ const storedState = this.readState();
159
+ // Validate state
160
+ if (incomingState && storedState && incomingState !== storedState) {
161
+ console.error('[RoolClient] Auth state mismatch. Token fragment ignored.');
162
+ return false;
73
163
  }
74
- return false;
164
+ if (!Number.isFinite(expiresAt)) {
165
+ console.error('[RoolClient] Auth response missing expires_in. Token ignored.');
166
+ return false;
167
+ }
168
+ // Clear state and store tokens
169
+ this.clearState();
170
+ this.writeTokens(idToken, refreshToken, expiresAt);
171
+ // Clean URL
172
+ const cleanUrl = window.location.origin + window.location.pathname + window.location.search;
173
+ window.history.replaceState({}, document.title, cleanUrl);
174
+ // Schedule refresh and notify
175
+ this.scheduleTokenRefresh();
176
+ this.config.onAuthStateChanged?.(true);
177
+ return true;
75
178
  }
76
179
  /**
77
- * Destroy auth manager - cleanup resources.
180
+ * Destroy auth manager - clear refresh timers.
78
181
  */
79
182
  destroy() {
80
- this.provider.destroy?.();
183
+ this.cancelScheduledRefresh();
184
+ }
185
+ // ===========================================================================
186
+ // Private methods
187
+ // ===========================================================================
188
+ /**
189
+ * Get the API key, fetching from server if not provided in config.
190
+ */
191
+ async getApiKey() {
192
+ // Already have it
193
+ if (this.apiKey)
194
+ return this.apiKey;
195
+ // Already fetching
196
+ if (this.apiKeyFetchPromise)
197
+ return this.apiKeyFetchPromise;
198
+ // Fetch from server
199
+ this.apiKeyFetchPromise = fetch(`${this.authBaseUrl}/auth/config.json`)
200
+ .then(async (response) => {
201
+ if (!response.ok) {
202
+ console.warn('[RoolClient] Failed to fetch API key from server');
203
+ return null;
204
+ }
205
+ const data = await response.json();
206
+ if (data.apiKey && typeof data.apiKey === 'string') {
207
+ this.apiKey = data.apiKey;
208
+ return this.apiKey;
209
+ }
210
+ return null;
211
+ })
212
+ .catch((error) => {
213
+ console.warn('[RoolClient] Failed to fetch API key:', error);
214
+ return null;
215
+ })
216
+ .finally(() => {
217
+ this.apiKeyFetchPromise = null;
218
+ });
219
+ return this.apiKeyFetchPromise;
220
+ }
221
+ async tryRefreshToken() {
222
+ // Deduplicate concurrent refresh attempts
223
+ if (this.refreshPromise) {
224
+ return this.refreshPromise;
225
+ }
226
+ const refreshToken = localStorage.getItem(this.storageKeys.refresh);
227
+ if (!refreshToken)
228
+ return false;
229
+ // Get API key (from config or server)
230
+ const apiKey = await this.getApiKey();
231
+ if (!apiKey) {
232
+ console.warn('[RoolClient] Cannot refresh token: no API key available');
233
+ return false;
234
+ }
235
+ const refreshUrl = new URL(GCIP_REFRESH_ENDPOINT);
236
+ refreshUrl.searchParams.set('key', apiKey);
237
+ this.refreshPromise = fetch(refreshUrl.toString(), {
238
+ method: 'POST',
239
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
240
+ body: new URLSearchParams({
241
+ grant_type: 'refresh_token',
242
+ refresh_token: refreshToken,
243
+ }),
244
+ })
245
+ .then(async (response) => {
246
+ if (!response.ok) {
247
+ throw new Error(`Refresh failed: ${response.status} ${response.statusText}`);
248
+ }
249
+ const data = await response.json();
250
+ const accessToken = data.id_token ?? data.access_token ?? null;
251
+ const nextRefreshToken = data.refresh_token ?? refreshToken;
252
+ const expiresAt = data.expires_in ? Date.now() + data.expires_in * 1000 : NaN;
253
+ if (!accessToken || !Number.isFinite(expiresAt)) {
254
+ throw new Error('Refresh response missing access token or expires_in');
255
+ }
256
+ this.writeTokens(accessToken, nextRefreshToken, expiresAt);
257
+ this.scheduleTokenRefresh();
258
+ return true;
259
+ })
260
+ .catch((error) => {
261
+ console.error('[RoolClient] Token refresh failed:', error);
262
+ this.clearTokens();
263
+ this.config.onAuthStateChanged?.(false);
264
+ return false;
265
+ })
266
+ .finally(() => {
267
+ this.refreshPromise = null;
268
+ });
269
+ return this.refreshPromise;
270
+ }
271
+ scheduleTokenRefresh() {
272
+ this.cancelScheduledRefresh();
273
+ const expiresAt = this.readExpiresAt();
274
+ if (!expiresAt)
275
+ return;
276
+ const refreshAt = expiresAt - REFRESH_BUFFER_MS;
277
+ const delay = refreshAt - Date.now();
278
+ if (delay <= 0) {
279
+ // Already needs refresh
280
+ void this.tryRefreshToken();
281
+ }
282
+ else {
283
+ this.refreshTimeoutId = setTimeout(() => {
284
+ void this.tryRefreshToken();
285
+ }, delay);
286
+ }
287
+ }
288
+ cancelScheduledRefresh() {
289
+ if (this.refreshTimeoutId !== null) {
290
+ clearTimeout(this.refreshTimeoutId);
291
+ this.refreshTimeoutId = null;
292
+ }
293
+ }
294
+ readAccessToken() {
295
+ return localStorage.getItem(this.storageKeys.access);
296
+ }
297
+ readExpiresAt() {
298
+ const raw = localStorage.getItem(this.storageKeys.expiresAt);
299
+ if (!raw)
300
+ return null;
301
+ const parsed = Number.parseInt(raw, 10);
302
+ return Number.isFinite(parsed) ? parsed : null;
303
+ }
304
+ writeTokens(accessToken, refreshToken, expiresAt) {
305
+ if (accessToken) {
306
+ localStorage.setItem(this.storageKeys.access, accessToken);
307
+ }
308
+ else {
309
+ localStorage.removeItem(this.storageKeys.access);
310
+ }
311
+ if (refreshToken) {
312
+ localStorage.setItem(this.storageKeys.refresh, refreshToken);
313
+ }
314
+ else {
315
+ localStorage.removeItem(this.storageKeys.refresh);
316
+ }
317
+ if (expiresAt !== null && Number.isFinite(expiresAt)) {
318
+ localStorage.setItem(this.storageKeys.expiresAt, Math.floor(expiresAt).toString());
319
+ }
320
+ else {
321
+ localStorage.removeItem(this.storageKeys.expiresAt);
322
+ }
323
+ }
324
+ clearTokens() {
325
+ this.writeTokens(null, null, null);
326
+ }
327
+ storeState(value) {
328
+ try {
329
+ sessionStorage.setItem(this.storageKeys.state, value);
330
+ }
331
+ catch {
332
+ // Ignore storage restrictions
333
+ }
334
+ }
335
+ readState() {
336
+ try {
337
+ return sessionStorage.getItem(this.storageKeys.state);
338
+ }
339
+ catch {
340
+ return null;
341
+ }
342
+ }
343
+ clearState() {
344
+ try {
345
+ sessionStorage.removeItem(this.storageKeys.state);
346
+ }
347
+ catch {
348
+ // Ignore storage restrictions
349
+ }
350
+ }
351
+ generateState() {
352
+ try {
353
+ const buffer = new Uint8Array(16);
354
+ window.crypto.getRandomValues(buffer);
355
+ return Array.from(buffer, (value) => value.toString(16).padStart(2, '0')).join('');
356
+ }
357
+ catch {
358
+ return Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2);
359
+ }
360
+ }
361
+ decodeUserInfo(accessToken) {
362
+ try {
363
+ const payload = JSON.parse(atob(accessToken.split('.')[1]));
364
+ return {
365
+ email: payload.email || null,
366
+ name: payload.name || null,
367
+ };
368
+ }
369
+ catch (error) {
370
+ console.error('[RoolClient] Failed to decode token:', error);
371
+ return { email: null, name: null };
372
+ }
81
373
  }
82
374
  }
83
375
  //# sourceMappingURL=auth.js.map
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,eAAe;AACf,uDAAuD;AACvD,gFAAgF;AAGhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AASxD,MAAM,OAAO,WAAW;IACd,QAAQ,CAAe;IAE/B,YAAY,MAAyB;QACnC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC;YACpC,sEAAsE;YACtE,IAAI,YAAY,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAQ,IAAI,CAAC,QAAgB,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBAC5F,IAAI,CAAC,QAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,mEAAmE;YACnE,qDAAqD;YACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAmB,CAAC;gBACtC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,kBAAkB,EAAE,CAAC,aAAa,EAAE,EAAE;oBACpC,MAAM,CAAC,kBAAkB,EAAE,CAAC,aAAa,CAAC,CAAC;gBAC7C,CAAC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,KAAK,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,eAAe;QACb,8DAA8D;QAC9D,IAAI,IAAI,CAAC,QAAQ,YAAY,mBAAmB,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -15,7 +15,7 @@ import type { RoolClientConfig, RoolClientEvents, RoolGraphInfo, Account, UserRe
15
15
  * - AI operations (promptGraph, image generation)
16
16
  */
17
17
  export declare class RoolClient extends EventEmitter<RoolClientEvents> {
18
- private urls;
18
+ private config;
19
19
  private authManager;
20
20
  private graphqlClient;
21
21
  private subscriptionManager;
@@ -35,7 +35,7 @@ export declare class RoolClient extends EventEmitter<RoolClientEvents> {
35
35
  /**
36
36
  * Initiate login by redirecting to auth page.
37
37
  */
38
- login(): Promise<void>;
38
+ login(): void;
39
39
  /**
40
40
  * Logout - clear all tokens and state.
41
41
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,OAAO,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,aAAa,EAEb,OAAO,EACP,UAAU,EACV,QAAQ,EAET,MAAM,YAAY,CAAC;AAUpB;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAW,SAAQ,YAAY,CAAC,gBAAgB,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,YAAY,CAAS;IAG7B,OAAO,CAAC,gBAAgB,CAAgC;gBAE5C,MAAM,EAAE,gBAAgB;IA+BpC;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,OAAO,IAAI,IAAI;IAiBf;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,MAAM,IAAI,IAAI;IAWd;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI7C;;OAEG;IACH,OAAO,IAAI,QAAQ;IAQnB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAI5C;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAoBpD;;;OAGG;IACG,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAoBpD;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAIpC;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQ3D,OAAO,KAAK,WAAW,GAKtB;IAMD;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBhC;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;OAEG;IACH,YAAY,IAAI,OAAO;IAQvB;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAI3B;;;;;;;;;OASG;IACG,OAAO,CAAC,CAAC,EACb,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC;IAQb,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,gBAAgB;CA8DzB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,OAAO,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,aAAa,EAEb,OAAO,EACP,UAAU,EACV,QAAQ,EAET,MAAM,YAAY,CAAC;AASpB;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAW,SAAQ,YAAY,CAAC,gBAAgB,CAAC;IAC5D,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,YAAY,CAAS;IAG7B,OAAO,CAAC,gBAAgB,CAAgC;gBAE5C,MAAM,EAAE,gBAAgB;IA8BpC;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,OAAO,IAAI,IAAI;IAiBf;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,IAAI;IAWd;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI7C;;OAEG;IACH,OAAO,IAAI,QAAQ;IAQnB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAI5C;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAoBpD;;;OAGG;IACG,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAoBpD;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAIpC;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQ3D,OAAO,KAAK,WAAW,GAKtB;IAMD;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBhC;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;OAEG;IACH,YAAY,IAAI,OAAO;IAQvB;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAI3B;;;;;;;;;OASG;IACG,OAAO,CAAC,CAAC,EACb,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC;IAQb,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,gBAAgB;CA8DzB"}