-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.js
More file actions
93 lines (78 loc) · 2.36 KB
/
Copy pathindex.js
File metadata and controls
93 lines (78 loc) · 2.36 KB
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
86
87
88
89
90
91
92
93
'use strict'
const session = require('express-session')
const { RedisStore } = require('connect-redis')
const { createClient } = require('kth-node-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.storeOptions.prefix) {
if (options.key) {
options.storeOptions.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 = createClient('session', options.redisOptions)
redisClient.connect().catch(error => {
process.nextTick(() => {
// force an "exception" rather than an "unhandled rejection"
throw new Error('@kth/session redisCLient.connect.error', { cause: error })
})
})
redisClient.on('end', () => {
console.error('Force app termination', new Error('@kth/session redisCLient.has_ended'))
process.exit(1)
})
options.sessionOptions.store = new RedisStore({ ...options.storeOptions, client: redisClient })
}
return session(options.sessionOptions)
}