From 7f67d00fe60f46cb11513e8c675019af411398dc Mon Sep 17 00:00:00 2001 From: Oleg Shulga Date: Wed, 22 Mar 2023 20:26:07 +0300 Subject: [PATCH 1/2] Use promises instead callbacks. Now server not crashed if send invalid token. --- JavaScript/session.js | 17 ++++++------- JavaScript/storage.js | 56 +++++++++++++++++-------------------------- 2 files changed, 29 insertions(+), 44 deletions(-) diff --git a/JavaScript/session.js b/JavaScript/session.js index ea66627..61355c8 100644 --- a/JavaScript/session.js +++ b/JavaScript/session.js @@ -36,20 +36,17 @@ class Session extends Map { return session; } - static restore(client) { + static async restore(client) { const { cookie } = client; if (!cookie) return; const sessionToken = cookie.token; if (sessionToken) { - return new Promise((resolve, reject) => { - storage.get(sessionToken, (err, session) => { - if (err) reject(new Error('No session')); - Object.setPrototypeOf(session, Session.prototype); - client.token = sessionToken; - client.session = session; - resolve(session); - }); - }); + const session = await storage.get(sessionToken); + if (!session) return; + Object.setPrototypeOf(session, Session.prototype); + client.token = sessionToken; + client.session = session; + return session; } } diff --git a/JavaScript/storage.js b/JavaScript/storage.js index a114315..c0b48bd 100644 --- a/JavaScript/storage.js +++ b/JavaScript/storage.js @@ -1,23 +1,16 @@ 'use strict'; -const fs = require('node:fs'); +const fs = require('node:fs').promises; const path = require('node:path'); const v8 = require('node:v8'); const PATH = `${__dirname}/sessions`; -const safePath = (fn) => (token, ...args) => { - const callback = args[args.length - 1]; - if (typeof token !== 'string') { - callback(new Error('Invalid session token')); - return; - } +const safePath = (promise) => (token, ...args) => { + if (typeof token !== 'string') throw new Error('Invalid session token'); const fileName = path.join(PATH, token); - if (!fileName.startsWith(PATH)) { - callback(new Error('Invalid session token')); - return; - } - fn(fileName, ...args); + if (!fileName.startsWith(PATH)) throw new Error('Invalid session token'); + return promise(fileName, ...args) }; const readSession = safePath(fs.readFile); @@ -25,39 +18,34 @@ const writeSession = safePath(fs.writeFile); const deleteSession = safePath(fs.unlink); class Storage extends Map { - get(key, callback) { + async get(key) { const value = super.get(key); - if (value) { - callback(null, value); - return; + if (value) return value; + let data; + try { + data = await readSession(key); + } catch (err) { + return undefined; } - readSession(key, (err, data) => { - if (err) { - callback(err); - return; - } - console.log(`Session loaded: ${key}`); - const session = v8.deserialize(data); - super.set(key, session); - callback(null, session); - }); + console.log('Session loaded: ${key}'); + const session = v8.deserialize(data); + super.set(key, session); + return session; } - save(key) { + async save(key) { const value = super.get(key); if (value) { const data = v8.serialize(value); - writeSession(key, data, () => { - console.log(`Session saved: ${key}`); - }); + await writeSession(key, data); + console.log(`Session saved: ${key}`); } } - delete(key) { + async delete(key) { console.log('Delete: ', key); - deleteSession(key, () => { - console.log(`Session deleted: ${key}`); - }); + await deleteSession(key); + console.log(`Session deleted: ${key}`); } } From 20c165c54e95761580d2e04ec0441f600028e90b Mon Sep 17 00:00:00 2001 From: Oleg Shulga <96260496+OsirisAnubis@users.noreply.github.com> Date: Wed, 22 Mar 2023 23:03:18 +0300 Subject: [PATCH 2/2] Update session.js --- JavaScript/session.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/JavaScript/session.js b/JavaScript/session.js index 61355c8..86295a3 100644 --- a/JavaScript/session.js +++ b/JavaScript/session.js @@ -40,14 +40,13 @@ class Session extends Map { const { cookie } = client; if (!cookie) return; const sessionToken = cookie.token; - if (sessionToken) { - const session = await storage.get(sessionToken); - if (!session) return; - Object.setPrototypeOf(session, Session.prototype); - client.token = sessionToken; - client.session = session; - return session; - } + if (!sessionToken) return; + const session = await storage.get(sessionToken); + if (!session) return; + Object.setPrototypeOf(session, Session.prototype); + client.token = sessionToken; + client.session = session; + return session; } static delete(client) {