Skip to content

Commit fe609fd

Browse files
committed
Update code style
1 parent 7f52ee6 commit fe609fd

4 files changed

Lines changed: 92 additions & 84 deletions

File tree

‎JavaScript/client.js‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ class Client {
2727

2828
static async getInstance(req, res) {
2929
const client = new Client(req, res);
30-
await Session.restore(client);
30+
try {
31+
await Session.restore(client);
32+
} catch (err) {
33+
console.log(err.message);
34+
}
3135
return client;
3236
}
3337

@@ -58,7 +62,7 @@ class Client {
5862

5963
sendCookie() {
6064
const { res, preparedCookie } = this;
61-
if (preparedCookie.length && !res.headersSent) {
65+
if (preparedCookie.length > 0 && !res.headersSent) {
6266
console.dir({ preparedCookie });
6367
res.setHeader('Set-Cookie', preparedCookie);
6468
}

‎JavaScript/server.js‎

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ const routing = {
1212
return `Session token is: ${client.token}`;
1313
},
1414
'/destroy': async (client) => {
15-
const result = `Session destroyed: ${client.token}`;
16-
Session.delete(client);
17-
return result;
15+
const { token } = await Session.delete(client);
16+
return token ? `Session destroyed: ${token}` : 'Session not found!';
1817
},
1918
'/api/method1': async (client) => {
2019
if (client.session) {
@@ -24,18 +23,20 @@ const routing = {
2423
return { data: 'access is denied' };
2524
}
2625
},
27-
'/api/method2': async (client) => ({
28-
url: client.req.url,
29-
headers: client.req.headers,
30-
}),
31-
'/api/method3': async (client) => {
32-
if (client.session) {
33-
return [...client.session.entries()]
34-
.map(([key, value]) => `<b>${key}</b>: ${value}<br>`)
35-
.join();
36-
}
37-
return 'No session found';
26+
'/api/method2': async (client) => {
27+
if (client.session) client.session.set('method2', 'called');
28+
return {
29+
url: client.req.url,
30+
headers: client.req.headers,
31+
};
3832
},
33+
'/api/method3': async (client) => {
34+
if (!client.session) return 'No session found';
35+
client.session.set('method3', 'called');
36+
return [...client.session.entries()]
37+
.map(([key, value]) => `<b>${key}</b>: ${value}<br>`)
38+
.join();
39+
}
3940
};
4041

4142
const types = {
@@ -45,6 +46,11 @@ const types = {
4546
undefined: () => 'not found',
4647
};
4748

49+
const httpError = (res, code, msg) => {
50+
res.statusCode = code;
51+
res.end(msg);
52+
};
53+
4854
http.createServer(async (req, res) => {
4955
const client = await Client.getInstance(req, res);
5056
const { method, url, headers } = req;
@@ -53,20 +59,19 @@ http.createServer(async (req, res) => {
5359
res.on('finish', () => {
5460
if (client.session) client.session.save();
5561
});
56-
if (!handler) {
57-
res.statusCode = 404;
58-
res.end('Not found 404');
59-
return;
60-
}
61-
handler(client).then((data) => {
62-
const type = typeof data;
63-
const serializer = types[type];
64-
const result = serializer(data);
65-
client.sendCookie();
66-
res.end(result);
67-
}, (err) => {
68-
res.statusCode = 500;
69-
res.end('Internal Server Error 500');
70-
console.log(err);
71-
});
62+
if (!handler) return void httpError(res, 404, 'Not Found 404');
63+
handler(client)
64+
.then(
65+
(data) => {
66+
const type = typeof data;
67+
const serializer = types[type];
68+
const result = serializer(data);
69+
client.sendCookie();
70+
res.end(result);
71+
},
72+
(err) => {
73+
httpError(res, 500, 'Server Error 500');
74+
console.log(err);
75+
}
76+
);
7277
}).listen(8000);

‎JavaScript/session.js‎

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,33 @@ class Session extends Map {
3636
return session;
3737
}
3838

39-
static restore(client) {
39+
static async restore(client) {
4040
const { cookie } = client;
41-
if (!cookie) return;
41+
if (!cookie) throw new Error('No session');
4242
const sessionToken = cookie.token;
43-
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-
});
43+
if (!sessionToken) throw new Error('No session');
44+
try {
45+
const session = await storage.get(sessionToken);
46+
Object.setPrototypeOf(session, Session.prototype);
47+
client.token = sessionToken;
48+
client.session = session;
49+
return session;
50+
} catch (err) {
51+
throw new Error('No session');
5352
}
5453
}
5554

56-
static delete(client) {
55+
static async delete(client) {
5756
const { token } = client;
58-
if (token) {
59-
client.deleteCookie('token');
60-
client.token = undefined;
61-
client.session = null;
62-
storage.delete(token);
57+
if (!token) return false;
58+
client.deleteCookie('token');
59+
client.token = undefined;
60+
client.session = null;
61+
try {
62+
await storage.delete(token);
63+
return { token };
64+
} catch (err) {
65+
return { token: undefined };
6366
}
6467
}
6568

‎JavaScript/storage.js‎

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

3-
const fs = require('node:fs');
3+
const fsp = 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];
9+
const exist = async (file) => {
10+
const toBool = [() => true, () => false];
11+
const isExist = await fsp.access(file).then(...toBool);
12+
return isExist;
13+
};
14+
15+
const safePath = (fn) => async (token, ...args) => {
1116
if (typeof token !== 'string') {
12-
callback(new Error('Invalid session token'));
13-
return;
17+
throw new Error('Invalid session token');
1418
}
1519
const fileName = path.join(PATH, token);
1620
if (!fileName.startsWith(PATH)) {
17-
callback(new Error('Invalid session token'));
18-
return;
21+
throw new Error('Invalid session token');
22+
}
23+
if (!exist(fileName)) {
24+
console.log('Token not found!');
25+
throw new Error('Invalid session token');
1926
}
20-
fn(fileName, ...args);
27+
return await fn(fileName, ...args);
2128
};
2229

23-
const readSession = safePath(fs.readFile);
24-
const writeSession = safePath(fs.writeFile);
25-
const deleteSession = safePath(fs.unlink);
30+
const readSession = safePath(fsp.readFile);
31+
const writeSession = safePath(fsp.writeFile);
32+
const deleteSession = safePath(fsp.unlink);
2633

2734
class Storage extends Map {
28-
get(key, callback) {
35+
async get(key) {
2936
const value = super.get(key);
30-
if (value) {
31-
callback(null, value);
32-
return;
33-
}
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-
});
37+
if (value) return value;
38+
const data = await readSession(key);
39+
console.log(`Session loaded: ${key}`);
40+
const session = v8.deserialize(data);
41+
super.set(key, session);
42+
return session;
4443
}
4544

46-
save(key) {
45+
async save(key) {
4746
const value = super.get(key);
4847
if (value) {
4948
const data = v8.serialize(value);
50-
writeSession(key, data, () => {
51-
console.log(`Session saved: ${key}`);
52-
});
49+
await writeSession(key, data);
50+
console.log(`Session saved: ${key}`);
5351
}
5452
}
5553

56-
delete(key) {
54+
async delete(key) {
5755
console.log('Delete: ', key);
58-
deleteSession(key, () => {
59-
console.log(`Session deleted: ${key}`);
60-
});
56+
return await deleteSession(key);
6157
}
6258
}
6359

0 commit comments

Comments
 (0)