-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathSession.ts
90 lines (78 loc) · 3.11 KB
/
Session.ts
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
import { CreateEvent } from "./Events.js";
export type SessionKey = string;
function nextKey () {
var charset = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890-=_';
let key = '';
for ( let i = 0; i < 64; i++ ) {
key += charset[ Math.floor( Math.random() * charset.length ) ];
}
return key;
}
export default function CreateSessionPool<Tdata> ( name?: string ) {
var sessions: { [key: SessionKey]: Tdata } = {};
var [entryAddedEvent, entryAddedTrigger] = CreateEvent<Tdata>();
var [entryRemovedEvent, entryRemovedTrigger] = CreateEvent<Tdata>();
function generateSession ( data: Tdata ) {
do {
var key = nextKey();
}
while ( sessions[key] != undefined );
sessions[key] = data;
entryAddedTrigger( data );
return key;
}
var pool = {
name: name,
createSession: generateSession,
sessionExists: ( key: SessionKey ) => sessions[key] != undefined,
getSession: ( key: SessionKey ): Tdata | undefined => sessions[key],
destroySession: ( key: SessionKey ) => {
var data = sessions[key];
if ( data != undefined ) {
delete sessions[key];
entryRemovedTrigger( data );
}
},
getAll: (): Readonly<typeof sessions> => sessions,
getValues: (): Readonly<Array<Tdata>> => Object.values( sessions ),
entryAdded: entryAddedEvent,
entryRemoved: entryRemovedEvent,
WithIndex: <Tindex>( fn: (data: Tdata) => Tindex ) => {
var index = new Map<Tindex, SessionKey>();
return {
name: name,
getAll: pool.getAll,
getValues: pool.getValues,
createSession: ( data: Tdata ) => {
var key = pool.createSession( data );
index.set( fn( data ), key );
return key;
},
sessionExists: pool.sessionExists,
indexExists: ( key: Tindex ) => index.has( key ),
getSession: pool.getSession,
getIndexed: ( key: Tindex ): Tdata | undefined => {
var k = index.get( key );
if ( k == undefined ) return undefined;
return pool.getSession( k );
},
getIndex: ( key: Tindex ): SessionKey | undefined => index.get( key ),
destroySession: ( key: SessionKey ) => {
var session = pool.getSession( key );
if ( session == undefined ) return;
index.delete( fn( session ) );
pool.destroySession( key );
},
destroyIndex: ( key: Tindex ) => {
var session = index.get( key );
if ( session == undefined ) return;
index.delete( key );
pool.destroySession( session );
},
entryAdded: pool.entryAdded,
entryRemoved: pool.entryRemoved
};
}
};
return pool;
};