-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhttp-session.js
More file actions
67 lines (58 loc) · 1.59 KB
/
http-session.js
File metadata and controls
67 lines (58 loc) · 1.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const SESSION_FILE = process.env.SESSION_FILE || (() => {
try {
fs.mkdirSync('/data', { recursive: true });
return '/data/sessions.json';
} catch (e) {
return path.join(path.dirname(fileURLToPath(import.meta.url)), 'sessions.json');
}
})();
export class SessionManager {
constructor() {
this.sessionMap = new Map();
this.loadSessions();
}
loadSessions() {
try {
if (!fs.existsSync(SESSION_FILE)) return;
const data = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf8'));
for (const [id, session] of Object.entries(data)) {
this.sessionMap.set(id, session);
}
console.log(`[sessions] Loaded ${this.sessionMap.size} sessions`);
} catch (err) {
console.error('[sessions] Load failed:', err.message);
}
}
saveSessions() {
try {
const dir = path.dirname(SESSION_FILE);
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
const data = {};
for (const [id, session] of this.sessionMap.entries()) {
data[id] = session;
}
fs.writeFileSync(SESSION_FILE, JSON.stringify(data, null, 2), 'utf8');
} catch (err) {
console.error('[sessions] Save failed:', err.message);
}
}
setSession(id, session) {
this.sessionMap.set(id, session);
this.saveSessions();
}
getSession(id) {
return this.sessionMap.get(id);
}
size() {
return this.sessionMap.size;
}
entries() {
return this.sessionMap.entries();
}
has(id) {
return this.sessionMap.has(id);
}
}