@rool-dev/client 0.1.0-dev.1a6a7a3

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 ADDED
@@ -0,0 +1,186 @@
1
+ # Rool Client
2
+
3
+ Generic TypeScript client library for the Rool server API. Framework-agnostic, works with any graph-based application.
4
+
5
+ ## Features
6
+
7
+ - **Stateful**: Maintains local graph cache with optimistic updates
8
+ - **Real-time sync**: SSE subscriptions with auto-reconnect
9
+ - **Automatic token refresh**: Handles GCIP authentication seamlessly
10
+ - **Event-driven**: EventEmitter pattern for change notifications
11
+ - **Type-safe**: Full TypeScript support with generic node types
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install @rool-dev/client
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ```typescript
22
+ import { RoolClient } from '@rool-dev/client';
23
+
24
+ // Create client (API key auto-fetched from server)
25
+ const client = new RoolClient({
26
+ baseUrl: 'https://use.rool.dev',
27
+ });
28
+
29
+ // Initialize (processes auth callback if present)
30
+ client.initialize();
31
+
32
+ // Check authentication
33
+ if (!client.isAuthenticated()) {
34
+ client.login(); // Redirects to auth page
35
+ }
36
+
37
+ // Listen for events
38
+ client.on('graphPatched', (graphId, patch, graph) => {
39
+ console.log(`Graph ${graphId} updated:`, graph);
40
+ });
41
+
42
+ client.on('authStateChanged', (authenticated) => {
43
+ console.log('Auth state:', authenticated);
44
+ });
45
+
46
+ // Subscribe to real-time events
47
+ await client.subscribe();
48
+
49
+ // Work with graphs
50
+ const graphs = await client.listGraphs();
51
+ const graph = await client.getGraph('my-graph-id');
52
+
53
+ // Apply patches (optimistic updates)
54
+ await client.patch('my-graph-id', [
55
+ { op: 'add', path: '/nodes/new-node', value: { type: 'text', content: 'Hello' } }
56
+ ]);
57
+ ```
58
+
59
+ ## API Reference
60
+
61
+ ### Configuration
62
+
63
+ ```typescript
64
+ interface RoolClientConfig {
65
+ baseUrl: string; // e.g., 'https://use.rool.dev'
66
+ storagePrefix?: string; // localStorage prefix (default: 'rool_')
67
+ }
68
+ ```
69
+
70
+ ### Authentication
71
+
72
+ ```typescript
73
+ client.initialize(): boolean // Initialize client, returns true if auth callback processed
74
+ client.login(): void // Redirect to login page
75
+ client.logout(): void // Clear tokens and local state
76
+ client.isAuthenticated(): boolean
77
+ client.getToken(): Promise<string | undefined>
78
+ client.getUser(): { email: string | null; name: string | null }
79
+ ```
80
+
81
+ ### Graph Operations
82
+
83
+ ```typescript
84
+ client.listGraphs(): Promise<GraphInfo[]>
85
+ client.getGraph(graphId, options?): Promise<Graph>
86
+ client.getLocalGraph(graphId): Graph | undefined
87
+ client.setGraph(graphId, graph): Promise<void>
88
+ client.deleteGraph(graphId): Promise<void>
89
+ client.renameGraph(graphId, name): Promise<void>
90
+ client.patch(graphId, patch): Promise<void>
91
+ ```
92
+
93
+ ### AI Operations
94
+
95
+ ```typescript
96
+ client.promptGraph(graphId, prompt, options?): Promise<string | null>
97
+ ```
98
+
99
+ ### Collaboration
100
+
101
+ ```typescript
102
+ client.getCurrentUser(): Promise<CurrentUser>
103
+ client.searchUser(email): Promise<UserResult | null>
104
+ client.listGraphUsers(graphId): Promise<GraphUser[]>
105
+ client.addGraphUser(graphId, userId, role): Promise<void>
106
+ client.removeGraphUser(graphId, userId): Promise<void>
107
+ ```
108
+
109
+ ### Media
110
+
111
+ ```typescript
112
+ client.listMedia(graphId): Promise<MediaItem[]>
113
+ client.uploadMedia(graphId, file): Promise<MediaItem>
114
+ client.downloadMedia(graphId, uuid): Promise<Blob>
115
+ client.deleteMedia(graphId, uuid): Promise<void>
116
+ client.getMediaUrl(graphId, uuid): string
117
+ ```
118
+
119
+ ### Subscriptions
120
+
121
+ ```typescript
122
+ client.subscribe(): Promise<void>
123
+ client.unsubscribe(): void
124
+ client.isSubscribed(): boolean
125
+ ```
126
+
127
+ ### Events
128
+
129
+ ```typescript
130
+ client.on('authStateChanged', (authenticated: boolean) => void)
131
+ client.on('graphPatched', (graphId, patch, graph) => void)
132
+ client.on('graphChanged', (graphId, graph) => void)
133
+ client.on('graphCreated', (graphId) => void)
134
+ client.on('graphDeleted', (graphId) => void)
135
+ client.on('graphNameChanged', (graphId) => void)
136
+ client.on('connectionStateChanged', (state: 'connected' | 'disconnected' | 'reconnecting') => void)
137
+ client.on('error', (error, context?) => void)
138
+ ```
139
+
140
+ ### Utilities
141
+
142
+ ```typescript
143
+ client.getConnectionId(): string // For echo suppression
144
+ client.generateId(): string // UUID generator
145
+ client.clearCache(): void // Clear local graph cache
146
+ client.destroy(): void // Clean up resources
147
+ ```
148
+
149
+ ## Graph Structure
150
+
151
+ Graphs are flexible data structures with typed nodes:
152
+
153
+ ```typescript
154
+ interface Graph {
155
+ nodes: Record<string, Node>;
156
+ edges: Record<string, Edge>;
157
+ _meta?: Record<string, unknown>; // Client metadata, hidden from AI
158
+ }
159
+
160
+ interface Node {
161
+ type: string; // Required: node type identifier
162
+ [key: string]: unknown; // Arbitrary additional fields
163
+ }
164
+
165
+ interface Edge {
166
+ sources: string[]; // Source node IDs
167
+ targets: string[]; // Target node IDs
168
+ type: string; // Edge type identifier
169
+ [key: string]: unknown; // Arbitrary additional fields
170
+ }
171
+ ```
172
+
173
+ ## Testing
174
+
175
+ A test page is provided at `test/index.html`. To use it:
176
+
177
+ 1. Build the library: `npm run build`
178
+ 2. Serve the test directory (e.g., `npx serve .`)
179
+ 3. Open `test/index.html` in a browser
180
+ 4. Enter your base URL and API key
181
+ 5. Test authentication and graph operations
182
+
183
+ ## License
184
+
185
+ Proprietary - © Lightpost One. All rights reserved.
186
+
package/dist/auth.d.ts ADDED
@@ -0,0 +1,75 @@
1
+ import type { UserInfo, AuthProvider } from './types.js';
2
+ export interface AuthManagerConfig {
3
+ baseUrl: string;
4
+ storagePrefix: string;
5
+ onAuthStateChanged?: (authenticated: boolean) => void;
6
+ /** External auth provider - when set, delegates all auth to this provider */
7
+ authProvider?: AuthProvider;
8
+ }
9
+ export declare class AuthManager {
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();
20
+ constructor(config: AuthManagerConfig);
21
+ /**
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.
25
+ */
26
+ initialize(): boolean;
27
+ /**
28
+ * Check if user is currently authenticated (has valid token).
29
+ */
30
+ isAuthenticated(): boolean;
31
+ /**
32
+ * Get current access token, refreshing if expired.
33
+ * Returns undefined if not authenticated.
34
+ */
35
+ getToken(): Promise<string | undefined>;
36
+ /**
37
+ * Get user info decoded from JWT token.
38
+ */
39
+ getUser(): UserInfo;
40
+ /**
41
+ * Initiate login by redirecting to auth page.
42
+ */
43
+ login(): void;
44
+ /**
45
+ * Logout - clear all tokens and state.
46
+ */
47
+ logout(): void;
48
+ /**
49
+ * Process auth callback from URL fragment.
50
+ * Should be called on page load.
51
+ * @returns true if callback was processed
52
+ */
53
+ processCallback(): boolean;
54
+ /**
55
+ * Destroy auth manager - clear refresh timers.
56
+ */
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;
74
+ }
75
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
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 ADDED
@@ -0,0 +1,375 @@
1
+ // =============================================================================
2
+ // Auth Manager
3
+ // Handles authentication via GCIP redirect flow, token storage, and refresh
4
+ // Supports external auth providers (e.g., Electron) via AuthProvider interface
5
+ // =============================================================================
6
+ const GCIP_REFRESH_ENDPOINT = 'https://securetoken.googleapis.com/v1/token';
7
+ const REFRESH_BUFFER_MS = 5 * 60 * 1000; // Refresh 5 minutes before expiry
8
+ export class AuthManager {
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;
31
+ }
32
+ catch {
33
+ // Fallback for relative URLs
34
+ return this.config.baseUrl.replace(/\/rool-server\/?$/, '');
35
+ }
36
+ }
37
+ constructor(config) {
38
+ this.config = config;
39
+ }
40
+ /**
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.
44
+ */
45
+ initialize() {
46
+ if (this.hasExternalProvider)
47
+ return false;
48
+ const wasCallback = this.processCallback();
49
+ this.scheduleTokenRefresh();
50
+ return wasCallback;
51
+ }
52
+ /**
53
+ * Check if user is currently authenticated (has valid token).
54
+ */
55
+ 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;
68
+ }
69
+ /**
70
+ * Get current access token, refreshing if expired.
71
+ * Returns undefined if not authenticated.
72
+ */
73
+ async 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;
89
+ }
90
+ /**
91
+ * Get user info decoded from JWT token.
92
+ */
93
+ 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);
101
+ }
102
+ /**
103
+ * Initiate login by redirecting to auth page.
104
+ */
105
+ 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();
121
+ }
122
+ /**
123
+ * Logout - clear all tokens and state.
124
+ */
125
+ 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);
139
+ }
140
+ /**
141
+ * Process auth callback from URL fragment.
142
+ * Should be called on page load.
143
+ * @returns true if callback was processed
144
+ */
145
+ 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;
163
+ }
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;
178
+ }
179
+ /**
180
+ * Destroy auth manager - clear refresh timers.
181
+ */
182
+ 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
+ }
373
+ }
374
+ }
375
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}