mirror of
https://github.com/multipleof4/KalBot.git
synced 2026-03-17 05:51:02 +00:00
Fix: Auto-reconnect to SurrealDB on token expiration
This commit is contained in:
40
lib/db.js
40
lib/db.js
@@ -7,8 +7,6 @@ class Database {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async connect() {
|
async connect() {
|
||||||
if (this.connected) return;
|
|
||||||
|
|
||||||
const url = process.env.SURREAL_URL;
|
const url = process.env.SURREAL_URL;
|
||||||
const user = process.env.SURREAL_USER;
|
const user = process.env.SURREAL_USER;
|
||||||
const pass = process.env.SURREAL_PASS;
|
const pass = process.env.SURREAL_PASS;
|
||||||
@@ -20,7 +18,9 @@ class Database {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if (!this.client) {
|
||||||
this.client = new Surreal();
|
this.client = new Surreal();
|
||||||
|
}
|
||||||
await this.client.connect(url);
|
await this.client.connect(url);
|
||||||
await this.client.signin({ username: user, password: pass });
|
await this.client.signin({ username: user, password: pass });
|
||||||
await this.client.use({ namespace: 'kalbot', database: 'kalbot' });
|
await this.client.use({ namespace: 'kalbot', database: 'kalbot' });
|
||||||
@@ -44,6 +44,16 @@ class Database {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async _handleTokenExpiration(e) {
|
||||||
|
if (e.message && e.message.toLowerCase().includes('token has expired')) {
|
||||||
|
console.log('[DB] Session token expired! Attempting to re-authenticate...');
|
||||||
|
this.connected = false;
|
||||||
|
await this.connect();
|
||||||
|
return this.connected; // Returns true if reconnection was successful
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
async query(sql, vars = {}) {
|
async query(sql, vars = {}) {
|
||||||
if (!this.connected) return [[]];
|
if (!this.connected) return [[]];
|
||||||
|
|
||||||
@@ -51,6 +61,16 @@ class Database {
|
|||||||
const raw = await this.client.query(sql, vars);
|
const raw = await this.client.query(sql, vars);
|
||||||
return this._normalizeQueryResult(raw);
|
return this._normalizeQueryResult(raw);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
// Check if it's an expiration issue, if so, reconnect and retry once
|
||||||
|
if (await this._handleTokenExpiration(e)) {
|
||||||
|
try {
|
||||||
|
const retryRaw = await this.client.query(sql, vars);
|
||||||
|
return this._normalizeQueryResult(retryRaw);
|
||||||
|
} catch (retryErr) {
|
||||||
|
console.error('[DB] Query retry error:', retryErr.message);
|
||||||
|
return [[]];
|
||||||
|
}
|
||||||
|
}
|
||||||
console.error('[DB] Query error:', e.message);
|
console.error('[DB] Query error:', e.message);
|
||||||
return [[]];
|
return [[]];
|
||||||
}
|
}
|
||||||
@@ -61,6 +81,14 @@ class Database {
|
|||||||
try {
|
try {
|
||||||
return await this.client.create(table, data);
|
return await this.client.create(table, data);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
if (await this._handleTokenExpiration(e)) {
|
||||||
|
try {
|
||||||
|
return await this.client.create(table, data);
|
||||||
|
} catch (retryErr) {
|
||||||
|
console.error('[DB] Create retry error:', retryErr.message);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
console.error('[DB] Create error:', e.message);
|
console.error('[DB] Create error:', e.message);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -71,6 +99,14 @@ class Database {
|
|||||||
try {
|
try {
|
||||||
return await this.client.select(table);
|
return await this.client.select(table);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
if (await this._handleTokenExpiration(e)) {
|
||||||
|
try {
|
||||||
|
return await this.client.select(table);
|
||||||
|
} catch (retryErr) {
|
||||||
|
console.error('[DB] Select retry error:', retryErr.message);
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
console.error('[DB] Select error:', e.message);
|
console.error('[DB] Select error:', e.message);
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user