Skip to content

Commit 7f67d00

Browse files
committed
Use promises instead callbacks. Now server not crashed if send invalid
token.
1 parent 7f52ee6 commit 7f67d00

2 files changed

Lines changed: 29 additions & 44 deletions

File tree

JavaScript/session.js

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,17 @@ class Session extends Map {
3636
return session;
3737
}
3838

39-
static restore(client) {
39+
static async restore(client) {
4040
const { cookie } = client;
4141
if (!cookie) return;
4242
const sessionToken = cookie.token;
4343
if (sessionToken) {
44-
return new Promise((resolve, reject) => {
45-
storage.get(sessionToken, (err, session) => {
46-
if (err) reject(new Error('No session'));
47-
Object.setPrototypeOf(session, Session.prototype);
48-
client.token = sessionToken;
49-
client.session = session;
50-
resolve(session);
51-
});
52-
});
44+
const session = await storage.get(sessionToken);
45+
if (!session) return;
46+
Object.setPrototypeOf(session, Session.prototype);
47+
client.token = sessionToken;
48+
client.session = session;
49+
return session;
5350
}
5451
}
5552

JavaScript/storage.js

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,51 @@
11
'use strict';
22

3-
const fs = require('node:fs');
3+
const fs = require('node:fs').promises;
44
const path = require('node:path');
55
const v8 = require('node:v8');
66

77
const PATH = `${__dirname}/sessions`;
88

9-
const safePath = (fn) => (token, ...args) => {
10-
const callback = args[args.length - 1];
11-
if (typeof token !== 'string') {
12-
callback(new Error('Invalid session token'));
13-
return;
14-
}
9+
const safePath = (promise) => (token, ...args) => {
10+
if (typeof token !== 'string') throw new Error('Invalid session token');
1511
const fileName = path.join(PATH, token);
16-
if (!fileName.startsWith(PATH)) {
17-
callback(new Error('Invalid session token'));
18-
return;
19-
}
20-
fn(fileName, ...args);
12+
if (!fileName.startsWith(PATH)) throw new Error('Invalid session token');
13+
return promise(fileName, ...args)
2114
};
2215

2316
const readSession = safePath(fs.readFile);
2417
const writeSession = safePath(fs.writeFile);
2518
const deleteSession = safePath(fs.unlink);
2619

2720
class Storage extends Map {
28-
get(key, callback) {
21+
async get(key) {
2922
const value = super.get(key);
30-
if (value) {
31-
callback(null, value);
32-
return;
23+
if (value) return value;
24+
let data;
25+
try {
26+
data = await readSession(key);
27+
} catch (err) {
28+
return undefined;
3329
}
34-
readSession(key, (err, data) => {
35-
if (err) {
36-
callback(err);
37-
return;
38-
}
39-
console.log(`Session loaded: ${key}`);
40-
const session = v8.deserialize(data);
41-
super.set(key, session);
42-
callback(null, session);
43-
});
30+
console.log('Session loaded: ${key}');
31+
const session = v8.deserialize(data);
32+
super.set(key, session);
33+
return session;
4434
}
4535

46-
save(key) {
36+
async save(key) {
4737
const value = super.get(key);
4838
if (value) {
4939
const data = v8.serialize(value);
50-
writeSession(key, data, () => {
51-
console.log(`Session saved: ${key}`);
52-
});
40+
await writeSession(key, data);
41+
console.log(`Session saved: ${key}`);
5342
}
5443
}
5544

56-
delete(key) {
45+
async delete(key) {
5746
console.log('Delete: ', key);
58-
deleteSession(key, () => {
59-
console.log(`Session deleted: ${key}`);
60-
});
47+
await deleteSession(key);
48+
console.log(`Session deleted: ${key}`);
6149
}
6250
}
6351

0 commit comments

Comments
 (0)