-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconcurrencyManager.js
More file actions
102 lines (89 loc) · 3.07 KB
/
concurrencyManager.js
File metadata and controls
102 lines (89 loc) · 3.07 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
const fs = require('fs');
const path = require('path');
class ConcurrencyManager {
constructor() {
this.stateFile = path.join(__dirname, '../config/concurrency-state.json');
this.loadState();
this.saveInterval = setInterval(() => this.saveState(), 5000);
}
loadState() {
try {
if (fs.existsSync(this.stateFile)) {
const state = JSON.parse(fs.readFileSync(this.stateFile, 'utf8'));
// Clean up stale entries older than 5 minutes
const now = Date.now();
Object.keys(state).forEach(key => {
if (now - state[key].timestamp > 300000) {
delete state[key];
}
});
this.state = state;
} else {
this.state = {
processing: 0,
cooldowns: {}
};
}
} catch (error) {
console.error('Error loading concurrency state:', error);
this.state = {
processing: 0,
cooldowns: {}
};
}
}
saveState() {
try {
fs.writeFileSync(this.stateFile, JSON.stringify(this.state));
} catch (error) {
console.error('Error saving concurrency state:', error);
}
}
isProcessingAvailable() {
this.cleanupStaleProcessing();
return this.state.processing < 3; // MAX_CONCURRENT
}
incrementProcessing() {
this.cleanupStaleProcessing();
this.state.processing++;
this.state.lastProcessingUpdate = Date.now();
return this.state.processing;
}
decrementProcessing() {
this.cleanupStaleProcessing();
if (this.state.processing > 0) {
this.state.processing--;
}
this.state.lastProcessingUpdate = Date.now();
return this.state.processing;
}
cleanupStaleProcessing() {
// Reset processing count if last update was more than 5 minutes ago
if (this.state.lastProcessingUpdate && Date.now() - this.state.lastProcessingUpdate > 300000) {
this.state.processing = 0;
}
}
isOnCooldown(userId) {
const cooldown = this.state.cooldowns[userId];
if (!cooldown) return false;
const now = Date.now();
if (now - cooldown.timestamp > cooldown.duration) {
delete this.state.cooldowns[userId];
return false;
}
return true;
}
setCooldown(userId, duration) {
this.state.cooldowns[userId] = {
timestamp: Date.now(),
duration: duration
};
}
getRemainingCooldown(userId) {
const cooldown = this.state.cooldowns[userId];
if (!cooldown) return 0;
const remaining = cooldown.duration - (Date.now() - cooldown.timestamp);
return remaining > 0 ? remaining : 0;
}
}
module.exports = new ConcurrencyManager();