Merge pull request #4 from jaspermayone-forks/jsp-better-rate-limit-handling

Add better rate limit handling
This commit is contained in:
Maclean Dunkin 2025-07-12 22:09:03 -04:00 committed by GitHub
commit 8be0273474
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 50 additions and 16 deletions

62
main.ts
View file

@ -233,6 +233,8 @@ class LimitlessAPI {
private apiKey: string;
private baseUrl = 'https://api.limitless.ai';
private batchSize = 10;
private maxRetries = 5;
private retryDelay = 1000; // 1 second
constructor(apiKey: string) {
this.apiKey = apiKey;
@ -261,20 +263,7 @@ class LimitlessAPI {
}
try {
const response = await requestUrl({
url: `${this.baseUrl}/v1/lifelogs?${params.toString()}`,
method: 'GET',
headers: {
'X-API-Key': this.apiKey,
'Content-Type': 'application/json'
}
});
if (!response.json) {
throw new Error('Invalid response format');
}
const data = response.json;
const data = await this.makeRequest(`${this.baseUrl}/v1/lifelogs`, params);
const lifelogs = data.data?.lifelogs || [];
allLifelogs.push(...lifelogs);
@ -287,4 +276,49 @@ class LimitlessAPI {
return allLifelogs;
}
private async makeRequest(url: string, params: URLSearchParams): Promise<any> {
let retries = 0;
while (true) {
try {
const response = await requestUrl({
url: `${url}?${params.toString()}`,
method: 'GET',
headers: {
'X-API-Key': this.apiKey,
'Content-Type': 'application/json'
}
});
if (!response.json) {
throw new Error('Invalid response format');
}
return response.json;
} catch (error) {
if (error.status === 429 && retries < this.maxRetries) {
let delay = this.retryDelay * Math.pow(2, retries);
const retryAfter = error.headers?.['retry-after'];
if (retryAfter) {
const retryAfterSeconds = parseInt(retryAfter, 10);
if (!isNaN(retryAfterSeconds)) {
delay = retryAfterSeconds * 1000;
} else {
const retryAfterDate = new Date(retryAfter);
const now = new Date();
delay = retryAfterDate.getTime() - now.getTime();
}
}
new Notice(`Rate limit exceeded. Retrying in ${Math.round(delay / 1000)} seconds...`);
await new Promise(resolve => setTimeout(resolve, delay));
retries++;
} else {
console.error('Error making request:', error);
throw error;
}
}
}
}
}

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "obsidian-limitless-lifelogs",
"version": "1.0.4",
"version": "1.0.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "obsidian-limitless-lifelogs",
"version": "1.0.4",
"version": "1.0.5",
"license": "MIT",
"devDependencies": {
"@types/node": "^16.11.6",