Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/client/lib/CoreSessions.ts
1028 views
1
import Queue from '@secret-agent/commons/Queue';
2
import CoreSession from './CoreSession';
3
4
export default class CoreSessions {
5
public set concurrency(value: number) {
6
this.queue.concurrency = value;
7
}
8
9
public get size(): number {
10
return this.sessionsById.size;
11
}
12
13
private readonly sessionsById = new Map<string, CoreSession>();
14
private readonly queue: Queue;
15
private readonly sessionTimeoutMillis: number;
16
17
constructor(concurrency?: number, sessionTimeoutMillis?: number) {
18
this.queue = new Queue('AGENT QUEUE');
19
this.queue.concurrency = concurrency ?? 1;
20
this.sessionTimeoutMillis = sessionTimeoutMillis;
21
}
22
23
public waitForAvailable(callbackFn: () => Promise<any>): Promise<void> {
24
return this.queue.run(callbackFn, this.sessionTimeoutMillis);
25
}
26
27
public hasAvailability(): boolean {
28
return this.queue.canRunMoreConcurrently();
29
}
30
31
public get(sessionId: string): CoreSession | null {
32
return this.sessionsById.get(sessionId);
33
}
34
35
public willStop(): void {
36
this.queue.willStop();
37
}
38
39
public stop(closeError: Error): boolean {
40
const hasSessions = this.sessionsById.size > 0;
41
this.queue.stop(closeError);
42
this.sessionsById.clear();
43
return hasSessions;
44
}
45
46
public track(coreSession: CoreSession): void {
47
this.sessionsById.set(coreSession.sessionId, coreSession);
48
}
49
50
public untrack(sessionId: string): void {
51
this.sessionsById.delete(sessionId);
52
}
53
}
54
55