|
1 | 1 | 'use strict'; |
2 | 2 |
|
3 | | -const fs = require('node:fs'); |
| 3 | +const fs = require('node:fs').promises; |
4 | 4 | const path = require('node:path'); |
5 | 5 | const v8 = require('node:v8'); |
6 | 6 |
|
7 | 7 | const PATH = `${__dirname}/sessions`; |
8 | 8 |
|
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'); |
15 | 11 | 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) |
21 | 14 | }; |
22 | 15 |
|
23 | 16 | const readSession = safePath(fs.readFile); |
24 | 17 | const writeSession = safePath(fs.writeFile); |
25 | 18 | const deleteSession = safePath(fs.unlink); |
26 | 19 |
|
27 | 20 | class Storage extends Map { |
28 | | - get(key, callback) { |
| 21 | + async get(key) { |
29 | 22 | 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; |
33 | 29 | } |
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; |
44 | 34 | } |
45 | 35 |
|
46 | | - save(key) { |
| 36 | + async save(key) { |
47 | 37 | const value = super.get(key); |
48 | 38 | if (value) { |
49 | 39 | 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}`); |
53 | 42 | } |
54 | 43 | } |
55 | 44 |
|
56 | | - delete(key) { |
| 45 | + async delete(key) { |
57 | 46 | console.log('Delete: ', key); |
58 | | - deleteSession(key, () => { |
59 | | - console.log(`Session deleted: ${key}`); |
60 | | - }); |
| 47 | + await deleteSession(key); |
| 48 | + console.log(`Session deleted: ${key}`); |
61 | 49 | } |
62 | 50 | } |
63 | 51 |
|
|
0 commit comments