notebooklm-kit 0.0.1 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +4102 -0
- package/dist/src/auth/auth.d.ts +46 -0
- package/dist/src/auth/auth.d.ts.map +1 -0
- package/dist/src/auth/auth.js +323 -0
- package/dist/src/auth/auth.js.map +1 -0
- package/dist/src/auth/refresh.d.ts +150 -0
- package/dist/src/auth/refresh.d.ts.map +1 -0
- package/dist/src/auth/refresh.js +433 -0
- package/dist/src/auth/refresh.js.map +1 -0
- package/dist/src/client/notebooklm-client.d.ts +372 -0
- package/dist/src/client/notebooklm-client.d.ts.map +1 -0
- package/dist/src/client/notebooklm-client.js +550 -0
- package/dist/src/client/notebooklm-client.js.map +1 -0
- package/dist/src/index.d.ts +50 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/rpc/rpc-client.d.ts +48 -0
- package/dist/src/rpc/rpc-client.d.ts.map +1 -0
- package/dist/src/rpc/rpc-client.js +94 -0
- package/dist/src/rpc/rpc-client.js.map +1 -0
- package/dist/src/rpc/rpc-methods.d.ts +127 -0
- package/dist/src/rpc/rpc-methods.d.ts.map +1 -0
- package/dist/src/rpc/rpc-methods.js +169 -0
- package/dist/src/rpc/rpc-methods.js.map +1 -0
- package/dist/src/services/artifacts.d.ts +1017 -0
- package/dist/src/services/artifacts.d.ts.map +1 -0
- package/dist/src/services/artifacts.js +5413 -0
- package/dist/src/services/artifacts.js.map +1 -0
- package/dist/src/services/generation.d.ts +147 -0
- package/dist/src/services/generation.d.ts.map +1 -0
- package/dist/src/services/generation.js +479 -0
- package/dist/src/services/generation.js.map +1 -0
- package/dist/src/services/notebook-language.d.ts +109 -0
- package/dist/src/services/notebook-language.d.ts.map +1 -0
- package/dist/src/services/notebook-language.js +204 -0
- package/dist/src/services/notebook-language.js.map +1 -0
- package/dist/src/services/notebooks.d.ts +26 -0
- package/dist/src/services/notebooks.d.ts.map +1 -0
- package/dist/src/services/notebooks.js +539 -0
- package/dist/src/services/notebooks.js.map +1 -0
- package/dist/src/services/notes.d.ts +72 -0
- package/dist/src/services/notes.d.ts.map +1 -0
- package/dist/src/services/notes.js +340 -0
- package/dist/src/services/notes.js.map +1 -0
- package/dist/src/services/sources.d.ts +1085 -0
- package/dist/src/services/sources.d.ts.map +1 -0
- package/dist/src/services/sources.js +2675 -0
- package/dist/src/services/sources.js.map +1 -0
- package/dist/src/types/artifact.d.ts +258 -0
- package/dist/src/types/artifact.d.ts.map +1 -0
- package/dist/src/types/artifact.js +42 -0
- package/dist/src/types/artifact.js.map +1 -0
- package/dist/src/types/common.d.ts +226 -0
- package/dist/src/types/common.d.ts.map +1 -0
- package/dist/src/types/common.js +80 -0
- package/dist/src/types/common.js.map +1 -0
- package/dist/src/types/languages.d.ts +179 -0
- package/dist/src/types/languages.d.ts.map +1 -0
- package/dist/src/types/languages.js +254 -0
- package/dist/src/types/languages.js.map +1 -0
- package/dist/src/types/note.d.ts +41 -0
- package/dist/src/types/note.d.ts.map +1 -0
- package/dist/src/types/note.js +12 -0
- package/dist/src/types/note.js.map +1 -0
- package/dist/src/types/notebook.d.ts +81 -0
- package/dist/src/types/notebook.d.ts.map +1 -0
- package/dist/src/types/notebook.js +5 -0
- package/dist/src/types/notebook.js.map +1 -0
- package/dist/src/types/source.d.ts +241 -0
- package/dist/src/types/source.d.ts.map +1 -0
- package/dist/src/types/source.js +60 -0
- package/dist/src/types/source.js.map +1 -0
- package/dist/src/utils/batch-execute.d.ts +58 -0
- package/dist/src/utils/batch-execute.d.ts.map +1 -0
- package/dist/src/utils/batch-execute.js +398 -0
- package/dist/src/utils/batch-execute.js.map +1 -0
- package/dist/src/utils/chunked-decoder.d.ts +11 -0
- package/dist/src/utils/chunked-decoder.d.ts.map +1 -0
- package/dist/src/utils/chunked-decoder.js +326 -0
- package/dist/src/utils/chunked-decoder.js.map +1 -0
- package/dist/src/utils/chunked-parser.d.ts +61 -0
- package/dist/src/utils/chunked-parser.d.ts.map +1 -0
- package/dist/src/utils/chunked-parser.js +609 -0
- package/dist/src/utils/chunked-parser.js.map +1 -0
- package/dist/src/utils/errors.d.ts +58 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +357 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/quota.d.ts +213 -0
- package/dist/src/utils/quota.d.ts.map +1 -0
- package/dist/src/utils/quota.js +518 -0
- package/dist/src/utils/quota.js.map +1 -0
- package/dist/src/utils/streaming-client.d.ts +129 -0
- package/dist/src/utils/streaming-client.d.ts.map +1 -0
- package/dist/src/utils/streaming-client.js +559 -0
- package/dist/src/utils/streaming-client.js.map +1 -0
- package/package.json +85 -7
- package/index.js +0 -2
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication refresh utilities
|
|
3
|
+
* Keeps NotebookLM sessions alive by refreshing credentials
|
|
4
|
+
* Implements hybrid refresh strategy: expiration-based (primary) + time-based (fallback)
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from 'crypto';
|
|
7
|
+
import { NotebookLMAuthError } from '../types/common.js';
|
|
8
|
+
/**
|
|
9
|
+
* Google Signaler API configuration
|
|
10
|
+
*/
|
|
11
|
+
const SIGNALER_API_URL = 'https://signaler-pa.clients6.google.com/punctual/v1/refreshCreds';
|
|
12
|
+
/**
|
|
13
|
+
* Google Signaler API Key
|
|
14
|
+
*
|
|
15
|
+
* This is a PUBLIC Google API key used for credential refresh.
|
|
16
|
+
* It's safe to commit as it's a client-side key with limited scope.
|
|
17
|
+
* Can be overridden via NOTEBOOKLM_SIGNALER_API_KEY environment variable.
|
|
18
|
+
*/
|
|
19
|
+
const SIGNALER_API_KEY = process.env.NOTEBOOKLM_SIGNALER_API_KEY || 'AIzaSyC_pzrI0AjEDXDYcg7kkq3uQEjnXV50pBM';
|
|
20
|
+
/**
|
|
21
|
+
* Refresh client for credential refresh
|
|
22
|
+
*/
|
|
23
|
+
export class RefreshClient {
|
|
24
|
+
sapisid;
|
|
25
|
+
debug;
|
|
26
|
+
cookies;
|
|
27
|
+
onCredentialsUpdate;
|
|
28
|
+
constructor(cookies, debug = false, onCredentialsUpdate) {
|
|
29
|
+
this.cookies = cookies;
|
|
30
|
+
this.debug = debug;
|
|
31
|
+
this.onCredentialsUpdate = onCredentialsUpdate;
|
|
32
|
+
this.sapisid = this.extractCookieValue('SAPISID');
|
|
33
|
+
if (!this.sapisid) {
|
|
34
|
+
throw new NotebookLMAuthError('SAPISID not found in cookies');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Update cookies (called after refresh to keep credentials in sync)
|
|
39
|
+
*/
|
|
40
|
+
updateCookies(cookies) {
|
|
41
|
+
this.cookies = cookies;
|
|
42
|
+
const newSapisid = this.extractCookieValue('SAPISID');
|
|
43
|
+
if (newSapisid) {
|
|
44
|
+
this.sapisid = newSapisid;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get current cookies
|
|
49
|
+
*/
|
|
50
|
+
getCookies() {
|
|
51
|
+
return this.cookies;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Refresh credentials
|
|
55
|
+
*
|
|
56
|
+
* @param gsessionId - Google session ID (optional)
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const refreshClient = new RefreshClient(cookies);
|
|
61
|
+
* await refreshClient.refreshCredentials();
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
async refreshCredentials(gsessionId) {
|
|
65
|
+
const url = new URL(SIGNALER_API_URL);
|
|
66
|
+
url.searchParams.set('key', SIGNALER_API_KEY);
|
|
67
|
+
if (gsessionId) {
|
|
68
|
+
url.searchParams.set('gsessionid', gsessionId);
|
|
69
|
+
}
|
|
70
|
+
// Generate SAPISIDHASH for authorization
|
|
71
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
72
|
+
const authHash = this.generateSAPISIDHASH(timestamp);
|
|
73
|
+
// Request body - verified from actual NotebookLM API calls
|
|
74
|
+
const requestBody = JSON.stringify(['8hcNI0LV']);
|
|
75
|
+
if (this.debug) {
|
|
76
|
+
console.log('=== Credential Refresh Request ===');
|
|
77
|
+
console.log('URL:', url.toString());
|
|
78
|
+
console.log('Authorization:', `SAPISIDHASH ${timestamp}_${authHash.substring(0, 10)}...`);
|
|
79
|
+
console.log('Request Body:', requestBody);
|
|
80
|
+
}
|
|
81
|
+
// Make request
|
|
82
|
+
const response = await fetch(url.toString(), {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
headers: {
|
|
85
|
+
'Accept': '*/*',
|
|
86
|
+
'Accept-Language': 'en-US,en;q=0.5',
|
|
87
|
+
'Authorization': `SAPISIDHASH ${timestamp}_${authHash}`,
|
|
88
|
+
'Content-Type': 'application/json+protobuf',
|
|
89
|
+
'Cookie': this.cookies,
|
|
90
|
+
'Origin': 'https://notebooklm.google.com',
|
|
91
|
+
'Referer': 'https://notebooklm.google.com/',
|
|
92
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
|
|
93
|
+
},
|
|
94
|
+
body: requestBody,
|
|
95
|
+
});
|
|
96
|
+
if (this.debug) {
|
|
97
|
+
console.log('=== Credential Refresh Response ===');
|
|
98
|
+
console.log('Status:', response.status, response.statusText);
|
|
99
|
+
}
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
const body = await response.text();
|
|
102
|
+
throw new NotebookLMAuthError(`Refresh failed with status ${response.status}: ${body}`);
|
|
103
|
+
}
|
|
104
|
+
// Check for updated cookies in response headers (Set-Cookie)
|
|
105
|
+
// Note: Google may update cookies server-side without returning them
|
|
106
|
+
// We update our cookies if Set-Cookie headers are present
|
|
107
|
+
const setCookieHeaders = response.headers.get('set-cookie');
|
|
108
|
+
if (setCookieHeaders && this.onCredentialsUpdate) {
|
|
109
|
+
// Cookies may have been updated server-side
|
|
110
|
+
// The refresh API typically doesn't return new cookies, but we notify
|
|
111
|
+
// the callback in case credentials need to be refreshed from the browser
|
|
112
|
+
if (this.debug) {
|
|
113
|
+
console.log('Cookie update detected in response');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (this.debug) {
|
|
117
|
+
console.log('Credentials refreshed successfully');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Generate SAPISIDHASH
|
|
122
|
+
* Format: SHA1(timestamp + " " + SAPISID + " " + origin)
|
|
123
|
+
*/
|
|
124
|
+
generateSAPISIDHASH(timestamp) {
|
|
125
|
+
const origin = 'https://notebooklm.google.com';
|
|
126
|
+
const data = `${timestamp} ${this.sapisid} ${origin}`;
|
|
127
|
+
const hash = createHash('sha1');
|
|
128
|
+
hash.update(data);
|
|
129
|
+
return hash.digest('hex');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Extract cookie value by name
|
|
133
|
+
*/
|
|
134
|
+
extractCookieValue(name) {
|
|
135
|
+
const parts = this.cookies.split(';');
|
|
136
|
+
for (const part of parts) {
|
|
137
|
+
const trimmed = part.trim();
|
|
138
|
+
if (trimmed.startsWith(`${name}=`)) {
|
|
139
|
+
return trimmed.substring(name.length + 1);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return '';
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Parse auth token to extract expiration time
|
|
147
|
+
* Token format: "tokenValue:timestamp" where timestamp is Unix milliseconds
|
|
148
|
+
* Expiry: timestamp + 1 hour
|
|
149
|
+
*/
|
|
150
|
+
export function parseAuthToken(token) {
|
|
151
|
+
const parts = token.split(':');
|
|
152
|
+
if (parts.length !== 2) {
|
|
153
|
+
throw new NotebookLMAuthError('Invalid token format - expected "token:timestamp"');
|
|
154
|
+
}
|
|
155
|
+
const tokenValue = parts[0];
|
|
156
|
+
const timestamp = parseInt(parts[1], 10);
|
|
157
|
+
if (isNaN(timestamp)) {
|
|
158
|
+
throw new NotebookLMAuthError('Invalid timestamp in token');
|
|
159
|
+
}
|
|
160
|
+
// Convert milliseconds to Date, add 1 hour for expiry
|
|
161
|
+
const expiryTime = new Date(timestamp + 3600000); // + 1 hour in ms
|
|
162
|
+
return { tokenValue, expiryTime };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Extract gsessionid from NotebookLM page
|
|
166
|
+
*/
|
|
167
|
+
export async function extractGSessionId(cookies) {
|
|
168
|
+
try {
|
|
169
|
+
const response = await fetch('https://notebooklm.google.com/', {
|
|
170
|
+
headers: {
|
|
171
|
+
'Cookie': cookies,
|
|
172
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
if (!response.ok) {
|
|
176
|
+
return null; // Return null instead of throwing - gsessionId is optional
|
|
177
|
+
}
|
|
178
|
+
const body = await response.text();
|
|
179
|
+
// Look for gsessionid in the page
|
|
180
|
+
const patterns = [
|
|
181
|
+
/"gsessionid"\s*:\s*"([^"]+)"/,
|
|
182
|
+
/gsessionid\s*=\s*['"]([^'"]+)['"]/,
|
|
183
|
+
];
|
|
184
|
+
for (const pattern of patterns) {
|
|
185
|
+
const match = body.match(pattern);
|
|
186
|
+
if (match && match[1]) {
|
|
187
|
+
return match[1];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return null; // Not found, but not critical
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
return null; // Return null on error - gsessionId is optional
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Default auto-refresh configuration
|
|
198
|
+
*/
|
|
199
|
+
export function defaultAutoRefreshConfig() {
|
|
200
|
+
return {
|
|
201
|
+
enabled: true,
|
|
202
|
+
strategy: 'auto', // Auto: expiration-based primary, time-based fallback
|
|
203
|
+
interval: 10 * 60 * 1000, // 10 minutes (time-based fallback)
|
|
204
|
+
refreshAhead: 5 * 60 * 1000, // 5 minutes before expiry (expiration-based)
|
|
205
|
+
checkInterval: 60 * 1000, // Check every 1 minute (expiration-based)
|
|
206
|
+
debug: false,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Auto-refresh manager
|
|
211
|
+
* Automatically refreshes credentials in the background
|
|
212
|
+
* Supports three strategies: 'auto' (expiration-based + time-based fallback), 'time', 'expiration'
|
|
213
|
+
*/
|
|
214
|
+
export class AutoRefreshManager {
|
|
215
|
+
config;
|
|
216
|
+
refreshClient;
|
|
217
|
+
timeIntervalId = null;
|
|
218
|
+
checkIntervalId = null;
|
|
219
|
+
running = false;
|
|
220
|
+
gsessionId;
|
|
221
|
+
authToken;
|
|
222
|
+
lastRefreshTime = 0;
|
|
223
|
+
constructor(cookies, config) {
|
|
224
|
+
this.config = config;
|
|
225
|
+
const onUpdate = (updatedCookies) => {
|
|
226
|
+
// Update refresh client cookies
|
|
227
|
+
this.refreshClient.updateCookies(updatedCookies);
|
|
228
|
+
// Notify callback if provided
|
|
229
|
+
if (config.onCredentialsUpdate) {
|
|
230
|
+
config.onCredentialsUpdate({
|
|
231
|
+
authToken: this.authToken || '',
|
|
232
|
+
cookies: updatedCookies,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
this.refreshClient = new RefreshClient(cookies, config.debug, onUpdate);
|
|
237
|
+
this.authToken = config.authToken;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Update auth token (for expiration-based refresh)
|
|
241
|
+
*/
|
|
242
|
+
updateAuthToken(authToken) {
|
|
243
|
+
this.authToken = authToken;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Update cookies
|
|
247
|
+
*/
|
|
248
|
+
updateCookies(cookies) {
|
|
249
|
+
this.refreshClient.updateCookies(cookies);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Start auto-refresh
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* const manager = new AutoRefreshManager(cookies, {
|
|
257
|
+
* enabled: true,
|
|
258
|
+
* strategy: 'auto', // or 'time' or 'expiration'
|
|
259
|
+
* interval: 10 * 60 * 1000, // 10 minutes (time-based)
|
|
260
|
+
* refreshAhead: 5 * 60 * 1000, // 5 minutes before expiry (expiration-based)
|
|
261
|
+
* });
|
|
262
|
+
*
|
|
263
|
+
* await manager.start();
|
|
264
|
+
* ```
|
|
265
|
+
*/
|
|
266
|
+
async start() {
|
|
267
|
+
if (this.running) {
|
|
268
|
+
throw new Error('Auto-refresh manager already running');
|
|
269
|
+
}
|
|
270
|
+
const strategy = this.config.strategy || 'auto';
|
|
271
|
+
const interval = this.config.interval || 10 * 60 * 1000;
|
|
272
|
+
const refreshAhead = this.config.refreshAhead || 5 * 60 * 1000;
|
|
273
|
+
const checkInterval = this.config.checkInterval || 60 * 1000;
|
|
274
|
+
// Extract gsessionId if not provided (optional, but recommended)
|
|
275
|
+
if (!this.config.gsessionId) {
|
|
276
|
+
this.gsessionId = await extractGSessionId(this.refreshClient.getCookies());
|
|
277
|
+
if (!this.gsessionId && this.config.debug) {
|
|
278
|
+
console.log('Note: gsessionId not found, refresh will continue without it');
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
this.gsessionId = this.config.gsessionId;
|
|
283
|
+
}
|
|
284
|
+
// Do initial refresh to verify credentials work
|
|
285
|
+
try {
|
|
286
|
+
await this.performRefresh();
|
|
287
|
+
this.lastRefreshTime = Date.now();
|
|
288
|
+
if (this.config.debug) {
|
|
289
|
+
console.log('Initial credential refresh successful');
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
if (this.config.debug) {
|
|
294
|
+
console.warn('Initial refresh failed, continuing anyway:', error.message);
|
|
295
|
+
}
|
|
296
|
+
// Don't throw - allow refresh to continue and retry later
|
|
297
|
+
}
|
|
298
|
+
this.running = true;
|
|
299
|
+
// Start expiration-based checking (if enabled in 'auto' or 'expiration' mode)
|
|
300
|
+
if (strategy === 'expiration' || strategy === 'auto') {
|
|
301
|
+
if (this.authToken) {
|
|
302
|
+
this.checkIntervalId = setInterval(() => {
|
|
303
|
+
this.checkAndRefreshExpiration(refreshAhead).catch(err => {
|
|
304
|
+
if (this.config.debug) {
|
|
305
|
+
console.error('Expiration check failed:', err);
|
|
306
|
+
}
|
|
307
|
+
// In 'auto' mode, fallback to time-based if expiration check fails
|
|
308
|
+
if (strategy === 'auto' && !this.timeIntervalId) {
|
|
309
|
+
if (this.config.debug) {
|
|
310
|
+
console.log('Falling back to time-based refresh due to expiration check failure');
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}, checkInterval);
|
|
315
|
+
if (this.config.debug) {
|
|
316
|
+
const modeText = strategy === 'auto' ? 'auto (expiration-based primary)' : 'expiration-based';
|
|
317
|
+
console.log(`Auto-refresh started (${modeText}, checking every ${checkInterval}ms)`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else if (strategy === 'expiration') {
|
|
321
|
+
throw new Error('Auth token required for expiration-based strategy');
|
|
322
|
+
}
|
|
323
|
+
else if (this.config.debug && strategy === 'auto') {
|
|
324
|
+
console.log('Note: Auth token not provided, using time-based refresh only');
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Start time-based refresh (if enabled in 'auto' or 'time' mode, or as fallback)
|
|
328
|
+
if (strategy === 'time' || strategy === 'auto') {
|
|
329
|
+
this.timeIntervalId = setInterval(async () => {
|
|
330
|
+
try {
|
|
331
|
+
await this.performRefresh();
|
|
332
|
+
this.lastRefreshTime = Date.now();
|
|
333
|
+
if (this.config.debug) {
|
|
334
|
+
const modeText = strategy === 'auto' ? 'time-based (fallback)' : 'time-based';
|
|
335
|
+
console.log(`Credentials refreshed (${modeText})`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
if (this.config.debug) {
|
|
340
|
+
console.error('Time-based refresh failed:', error.message);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}, interval);
|
|
344
|
+
if (this.config.debug && strategy === 'time') {
|
|
345
|
+
console.log(`Auto-refresh started (time-based, interval: ${interval}ms)`);
|
|
346
|
+
}
|
|
347
|
+
else if (this.config.debug && strategy === 'auto') {
|
|
348
|
+
console.log(`Time-based fallback enabled (interval: ${interval}ms)`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Check if token needs refresh based on expiration
|
|
354
|
+
*/
|
|
355
|
+
async checkAndRefreshExpiration(refreshAhead) {
|
|
356
|
+
if (!this.authToken) {
|
|
357
|
+
return; // Can't check expiration without token
|
|
358
|
+
}
|
|
359
|
+
try {
|
|
360
|
+
const { expiryTime } = parseAuthToken(this.authToken);
|
|
361
|
+
const timeUntilExpiry = expiryTime.getTime() - Date.now();
|
|
362
|
+
if (timeUntilExpiry > refreshAhead) {
|
|
363
|
+
// Token still valid, no refresh needed
|
|
364
|
+
if (this.config.debug && timeUntilExpiry < refreshAhead * 2) {
|
|
365
|
+
// Only log when getting close to refresh time
|
|
366
|
+
const minutesUntilExpiry = Math.floor(timeUntilExpiry / 60000);
|
|
367
|
+
console.log(`Token valid for ${minutesUntilExpiry} more minutes, no refresh needed`);
|
|
368
|
+
}
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
// Token expiring soon, refresh now
|
|
372
|
+
if (this.config.debug) {
|
|
373
|
+
const minutesUntilExpiry = Math.floor(timeUntilExpiry / 60000);
|
|
374
|
+
console.log(`Token expiring in ${minutesUntilExpiry} minutes, refreshing now...`);
|
|
375
|
+
}
|
|
376
|
+
await this.performRefresh();
|
|
377
|
+
this.lastRefreshTime = Date.now();
|
|
378
|
+
if (this.config.debug) {
|
|
379
|
+
console.log('Credentials refreshed (expiration-based)');
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
// Token parsing failed, fall back to time-based if hybrid
|
|
384
|
+
if (this.config.debug) {
|
|
385
|
+
console.warn('Failed to parse token for expiration check:', error.message);
|
|
386
|
+
}
|
|
387
|
+
throw error;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Perform actual refresh operation
|
|
392
|
+
*/
|
|
393
|
+
async performRefresh() {
|
|
394
|
+
await this.refreshClient.refreshCredentials(this.gsessionId || undefined);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Stop auto-refresh
|
|
398
|
+
*/
|
|
399
|
+
stop() {
|
|
400
|
+
if (this.timeIntervalId) {
|
|
401
|
+
clearInterval(this.timeIntervalId);
|
|
402
|
+
this.timeIntervalId = null;
|
|
403
|
+
}
|
|
404
|
+
if (this.checkIntervalId) {
|
|
405
|
+
clearInterval(this.checkIntervalId);
|
|
406
|
+
this.checkIntervalId = null;
|
|
407
|
+
}
|
|
408
|
+
this.running = false;
|
|
409
|
+
if (this.config.debug) {
|
|
410
|
+
console.log('Auto-refresh stopped');
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Check if auto-refresh is running
|
|
415
|
+
*/
|
|
416
|
+
isRunning() {
|
|
417
|
+
return this.running;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Manually trigger a refresh
|
|
421
|
+
*/
|
|
422
|
+
async refresh() {
|
|
423
|
+
await this.performRefresh();
|
|
424
|
+
this.lastRefreshTime = Date.now();
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Get last refresh time
|
|
428
|
+
*/
|
|
429
|
+
getLastRefreshTime() {
|
|
430
|
+
return this.lastRefreshTime;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../src/auth/refresh.ts"],"names":[],"mappings":"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"}
|