@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 +29 -56
- package/dist/auth.d.ts +35 -7
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +326 -34
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +2 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +12 -12
- package/dist/client.js.map +1 -1
- package/dist/graphql.d.ts +1 -1
- package/dist/graphql.d.ts.map +1 -1
- package/dist/graphql.js +1 -1
- package/dist/graphql.js.map +1 -1
- package/dist/media.d.ts +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +1 -1
- package/dist/media.js.map +1 -1
- package/dist/subscription.d.ts +1 -1
- package/dist/subscription.d.ts.map +1 -1
- package/dist/subscription.js +1 -1
- package/dist/subscription.js.map +1 -1
- package/dist/types.d.ts +10 -18
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -8
- package/dist/auth-browser.d.ts +0 -71
- package/dist/auth-browser.d.ts.map +0 -1
- package/dist/auth-browser.js +0 -328
- package/dist/auth-browser.js.map +0 -1
- package/dist/auth-node.d.ts +0 -33
- package/dist/auth-node.d.ts.map +0 -1
- package/dist/auth-node.js +0 -271
- package/dist/auth-node.js.map +0 -1
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();
|
|
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();
|
|
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; //
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
###
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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():
|
|
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 -
|
|
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
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
17
|
-
//
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
91
|
+
* Get user info decoded from JWT token.
|
|
48
92
|
*/
|
|
49
93
|
getUser() {
|
|
50
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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 -
|
|
180
|
+
* Destroy auth manager - clear refresh timers.
|
|
78
181
|
*/
|
|
79
182
|
destroy() {
|
|
80
|
-
this.
|
|
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":"AAAA,gFAAgF;AAChF,eAAe;AACf,4EAA4E;AAC5E,+EAA+E;AAC/E,gFAAgF;AAIhF,MAAM,qBAAqB,GAAG,6CAA6C,CAAC;AAC5E,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,kCAAkC;AAU3E,MAAM,OAAO,WAAW;IACd,MAAM,CAAoB;IAC1B,MAAM,GAAkB,IAAI,CAAC;IAC7B,kBAAkB,GAAkC,IAAI,CAAC;IACzD,cAAc,GAA4B,IAAI,CAAC;IAC/C,gBAAgB,GAAyC,IAAI,CAAC;IAEtE,IAAY,WAAW;QACrB,OAAO;YACL,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,cAAc;YAClD,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,eAAe;YACpD,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,kBAAkB;YACzD,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,YAAY;SACvC,CAAC;IACb,CAAC;IAED,4CAA4C;IAC5C,IAAY,mBAAmB;QAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IACpC,CAAC;IAED,qEAAqE;IACrE,IAAY,WAAW;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,GAAG,CAAC,MAAM,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO,KAAK,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,eAAe;QACb,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;QACpD,CAAC;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,qFAAqF;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAEvC,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QAEnC,iDAAiD;QACjD,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,GAAG,iBAAiB,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/C,IAAI,CAAC,SAAS;gBAAE,OAAO,SAAS,CAAC;YACjC,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,SAAS,CAAC;QAC7C,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3C,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,QAAQ,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE1C,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,eAAe;QACb,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAErC,iBAAiB;QACjB,IAAI,aAAa,IAAI,WAAW,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC3E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;YAC/E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAEnD,YAAY;QACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5F,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE1D,8BAA8B;QAC9B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC;QAEvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;OAEG;IACK,KAAK,CAAC,SAAS;QACrB,kBAAkB;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAEpC,mBAAmB;QACnB,IAAI,IAAI,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC;QAE5D,oBAAoB;QACpB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,mBAAmB,CAAC;aACpE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACvB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;gBACjE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACnD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC1B,OAAO,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAC,CAAC;QAEL,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,0CAA0C;QAC1C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAEhC,sCAAsC;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAClD,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE3C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,UAAU,EAAE,eAAe;gBAC3B,aAAa,EAAE,YAAY;aAC5B,CAAC;SACH,CAAC;aACC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACvB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,WAAW,GAAkB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;YAC9E,MAAM,gBAAgB,GAAkB,IAAI,CAAC,aAAa,IAAI,YAAY,CAAC;YAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAE9E,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACzE,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;YAC3D,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEL,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,SAAS,GAAG,SAAS,GAAG,iBAAiB,CAAC;QAChD,MAAM,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAErC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,wBAAwB;YACxB,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtC,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YAC9B,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACnC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAEO,aAAa;QACnB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAEO,WAAW,CACjB,WAA0B,EAC1B,YAA2B,EAC3B,SAAwB;QAExB,IAAI,WAAW,EAAE,CAAC;YAChB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,IAAI,CAAC;YACH,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,CAAC;YACH,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC;YACH,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,WAAmB;QACxC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;gBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;aAC3B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;CACF"}
|
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
|
|
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():
|
|
38
|
+
login(): void;
|
|
39
39
|
/**
|
|
40
40
|
* Logout - clear all tokens and state.
|
|
41
41
|
*/
|
package/dist/client.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|