-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
85 lines (72 loc) · 2.05 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
'use strict'
const session = require('express-session')
const RedisStore = require('connect-redis')(session)
const redis = require('redis')
const oneHour = 3600 // time in seconds!
const defaults = {
useRedis: false,
key: '',
redisOptions: {
host: 'localhost',
port: 6379,
},
sessionOptions: {
secret: '',
resave: true, // update time to live on usage
saveUninitialized: false,
cookie: { secure: true, httpOnly: true, sameSite: 'Lax', path: '/' },
proxy: true,
},
storeOptions: {
ttl: oneHour,
},
}
let redisClient
function createOptions(options) {
if (typeof options !== 'object') return options
if (Array.isArray(options)) {
return [...options]
}
const rval = JSON.parse(JSON.stringify(defaults))
for (const key in options) {
if (Object.prototype.hasOwnProperty.call(options, key)) {
if (Array.isArray(options[key])) {
rval[key] = [...options[key]]
} else if (typeof options[key] === 'object') {
rval[key] = { ...rval[key], ...options[key] }
} else {
rval[key] = options[key]
}
}
}
return rval
}
module.exports = function nodeSession(inOptions) {
const options = createOptions(inOptions, defaults)
if (!options.redisOptions.prefix) {
if (options.key) {
options.redisOptions.prefix = `${options.key}:`
} else {
throw new Error('No Redis prefix provided, "options.key" must be set.')
}
}
if (!options.sessionOptions.secret) {
throw new Error('Session secret must be set.')
}
if (!options.sessionOptions.name) {
if (options.key) {
options.sessionOptions.name = options.key
} else {
throw new Error('No session name provided, "options.key" must be set.')
}
}
if (options.useRedis) {
redisClient = redis.createClient(options.redisOptions)
redisClient.on('error', err => {
err.cause = '@kth/session redisCLient.on.error'
throw err
})
options.sessionOptions.store = new RedisStore({ ...options.storeOptions, client: redisClient })
}
return session(options.sessionOptions)
}