Skip to content

Commit 3402f19

Browse files
committed
Updated code.
1 parent 417a3eb commit 3402f19

2 files changed

Lines changed: 103 additions & 61 deletions

File tree

session.js

Lines changed: 99 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,115 +1,157 @@
11
const Sessions = {};
2-
const Fs = require('fs');
32

43
global.SESSION = function(group) {
54
return Sessions[group] ? Sessions[group] : (Sessions[group] = new Session(group));
65
};
76

87
function 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

1615
var 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

5627
SP.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

6538
SP.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

8767
SP.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+
105148
ON('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

113156
F.session = global.SESSION;
114-
global.Session = Session;
115157
exports.Session = Session;

test/controllers/default.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,11 @@ exports.install = function() {
109109
self.plain('408');
110110
});
111111

112-
assert.ok(F.encrypt('123456', 'key', false) === 'a79aad6f9b92c0d3f1beb3812179863d8e', 'F.encrypt(string)');
113-
assert.ok(F.decrypt('a79aad6f9b92c0d3f1beb3812179863d8e', 'key', false) === '123456', 'F.decrypt(string)');
112+
assert.ok(F.encrypt('123456', 'key', false) === '5787-32333d411f0713195a1d0250071706004a1a150a061a0016', 'F.encrypt(string)');
113+
assert.ok(F.decrypt('5787-32333d411f0713195a1d0250071706004a1a150a061a0016', 'key', false) === '123456', 'F.decrypt(string)');
114114

115-
assert.ok(F.encrypt({ name: 'Peter' }, 'key', false) === 'bb99af6f9b93c1dff0beb3cb3124d365dd06c70c0a81ec1a3dce8a', 'F.encrypt(object)');
116-
assert.ok(F.decrypt('bb99af6f9b93c1dff0beb3cb3124d365dd06c70c0a81ec1a3dce8a', 'key').name === 'Peter', 'F.decrypt(object)');
115+
assert.ok(F.encrypt({ name: 'Peter' }, 'key', false) === '6931-33333d4155174e4c024e105b17745741195806450555174e4c024e105b1774574119', 'F.encrypt(object)');
116+
assert.ok(F.decrypt('6931-33333d4155174e4c024e105b17745741195806450555174e4c024e105b1774574119', 'key').name === 'Peter', 'F.decrypt(object)');
117117

118118
assert.ok(SOURCE('main').hello() === 'world', 'source');
119119
assert.ok(INCLUDE('main').hello() === 'world', 'source');

0 commit comments

Comments
 (0)