11const Sessions = { } ;
2- const Fs = require ( 'fs' ) ;
32
43global . SESSION = function ( group ) {
54 return Sessions [ group ] ? Sessions [ group ] : ( Sessions [ group ] = new Session ( group ) ) ;
65} ;
76
87function Session ( group ) {
98 var t = this ;
9+ t . group = group ;
1010 t . data = { } ;
11- t . group = group . crc32 ( true ) ;
12- t . filename = F . path . temp ( ( F . id ? 'i-' + F . id + '_' : '' ) + 'framework_sessions_' + group . crc32 ( true ) + '.jsoncache' ) ;
13- t . load ( ) ;
11+ t . $events = { } ;
12+ t . expire = F . config [ 'default-session' ] ;
1413}
1514
1615var SP = Session . prototype ;
1716
18- SP . load = function ( ) {
17+ SP . set = function ( id , data ) {
1918 var self = this ;
20- try {
21- self . data = Fs . readFileSync ( self . filename ) . toString ( 'utf8' ) . parseJSON ( true ) ;
22- } catch ( e ) { }
23- return self ;
24- } ;
25-
26- SP . save = function ( ) {
27- var self = this ;
28- setTimeout2 ( 'session_' + self . group , function ( ) {
29- Fs . writeFile ( self . filename , JSON . stringify ( self . data ) , F . error ( ) ) ;
30- } , 1000 , 10 ) ;
31- return self ;
32- } ;
33-
34- SP . key = function ( ) {
35- return this . group + 'X' + GUID ( 10 ) ;
36- } ;
37-
38- SP . set = function ( data , expire ) {
39-
40- var self = this ;
41- var id = self . key ( ) ;
42- var session = self . data [ id ] ;
43-
44- if ( ! session )
45- session = self . data [ id ] = { } ;
46-
47- session . data = data ;
48- session . id = id ;
49- session . expire = ( expire || NOW . add ( '5 minutes' ) ) . getTime ( ) ;
50-
19+ var session = data ;
20+ session . $id = id ;
21+ session . $expire = NOW . add ( self . expire ) . getTime ( ) ;
22+ self . data [ id ] = session ;
5123 self . $events . set && self . emit ( 'set' , session ) ;
52- self . save ( ) ;
5324 return id ;
5425} ;
5526
5627SP . list = function ( ) {
5728 var self = this ;
5829 var arr = Object . keys ( self . data ) ;
5930 var online = [ ] ;
60- for ( var i = 0 ; i < arr . length ; i ++ )
61- online . push ( self . data [ arr [ i ] ] ) ;
31+ for ( var i = 0 ; i < arr . length ; i ++ ) {
32+ var item = self . data [ arr [ i ] ] ;
33+ item . $expire && online . push ( item ) ;
34+ }
6235 return online ;
6336} ;
6437
6538SP . count = function ( ) {
66- return Object . keys ( this . data ) . length ;
39+ return this . list ( ) . length ;
6740} ;
6841
69- SP . get = function ( key ) {
70- return this . data [ key ] ? this . data [ key ] . data : null ;
42+ SP . get = function ( key , noextend ) {
43+ var item = this . data [ key ] ;
44+ if ( item && item . $expire ) {
45+ ! noextend && ( item . $expire = NOW . add ( this . expire ) ) ;
46+ return item ;
47+ }
7148} ;
7249
73- SP . meta = function ( key ) {
74- return this . data [ key ] ? this . data [ key ] : null ;
75- } ;
50+ SP . remove = function ( key ) {
7651
77- SP . rem = function ( key ) {
7852 var self = this ;
79- if ( self . data [ key ] ) {
80- self . $events . remove && self . emit ( 'remove' , self . data [ key ] ) ;
53+ var item ;
54+
55+ if ( key instanceof Object ) {
56+ key . $expire = 0 ;
57+ item = key ;
58+ } else if ( self . data [ key ] ) {
59+ item = self . data [ key ] ;
8160 delete self . data [ key ] ;
82- self . save ( ) ;
8361 }
62+
63+ item && self . $events . remove && self . emit ( 'remove' , key ) ;
8464 return self ;
8565} ;
8666
8767SP . clear = function ( ) {
68+ var self = this ;
69+ self . $events . clear && self . emit ( 'clear' ) ;
70+ self . data = { } ;
71+ return self ;
72+ } ;
73+
74+ SP . clean = function ( ) {
8875 var self = this ;
8976 var arr = Object . keys ( self . data ) ;
90- var count = 0 ;
9177 var time = NOW . getTime ( ) ;
9278 for ( var i = 0 ; i < arr . length ; i ++ ) {
93- var key = arr [ key ] ;
79+ var key = arr [ i ] ;
9480 var obj = self . data [ key ] ;
95- if ( obj . expire < time ) {
96- self . $events . expire && self . emit ( 'expire' , obj ) ;
81+ if ( ! obj . $expire || obj . $ expire < time ) {
82+ obj . $expire && self . $events . expire && self . emit ( 'expire' , obj ) ;
9783 delete self . data [ key ] ;
98- count ++ ;
9984 }
10085 }
101- count && self . save ( ) ;
10286 return self ;
10387} ;
10488
89+ SP . emit = function ( name , a , b , c , d , e , f , g ) {
90+ var evt = this . $events [ name ] ;
91+ if ( evt ) {
92+ var clean = false ;
93+ for ( var i = 0 , length = evt . length ; i < length ; i ++ ) {
94+ if ( evt [ i ] . $once )
95+ clean = true ;
96+ evt [ i ] . call ( this , a , b , c , d , e , f , g ) ;
97+ }
98+ if ( clean ) {
99+ evt = evt . remove ( n => n . $once ) ;
100+ if ( evt . length )
101+ this . $events [ name ] = evt ;
102+ else
103+ this . $events [ name ] = undefined ;
104+ }
105+ }
106+ return this ;
107+ } ;
108+
109+ SP . on = function ( name , fn ) {
110+
111+ if ( ! fn . $once )
112+ this . $free = false ;
113+
114+ if ( this . $events [ name ] )
115+ this . $events [ name ] . push ( fn ) ;
116+ else
117+ this . $events [ name ] = [ fn ] ;
118+ return this ;
119+ } ;
120+
121+ SP . once = function ( name , fn ) {
122+ fn . $once = true ;
123+ return this . on ( name , fn ) ;
124+ } ;
125+
126+ SP . removeListener = function ( name , fn ) {
127+ var evt = this . $events [ name ] ;
128+ if ( evt ) {
129+ evt = evt . remove ( n => n === fn ) ;
130+ if ( evt . length )
131+ this . $events [ name ] = evt ;
132+ else
133+ this . $events [ name ] = undefined ;
134+ }
135+ return this ;
136+ } ;
137+
138+ SP . removeAllListeners = function ( name ) {
139+ if ( name === true )
140+ this . $events = EMPTYOBJECT ;
141+ else if ( name )
142+ this . $events [ name ] = undefined ;
143+ else
144+ this . $events [ name ] = { } ;
145+ return this ;
146+ } ;
147+
105148ON ( 'service' , function ( interval ) {
106149 if ( interval % 5 === 0 ) {
107150 var arr = Object . keys ( Sessions ) ;
108151 for ( var i = 0 ; i < arr . length ; i ++ )
109- Sessions [ arr [ i ] ] . clear ( ) ;
152+ Sessions [ arr [ i ] ] . clean ( ) ;
110153 }
111154} ) ;
112155
113156F . session = global . SESSION ;
114- global . Session = Session ;
115157exports . Session = Session ;
0 commit comments