Skip to content

Commit c687d5a

Browse files
brandonmankedougwilson
authored andcommitted
add: promise support for sessionStore regenerate
1 parent 55b218b commit c687d5a

File tree

2 files changed

+101
-5
lines changed

2 files changed

+101
-5
lines changed

Diff for: session/session.js

+17-3
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,23 @@ defineMethod(Session.prototype, 'destroy', function destroy(fn) {
165165
*/
166166

167167
defineMethod(Session.prototype, 'regenerate', function regenerate(fn) {
168-
this.req.sessionStore.regenerate(this.req, fn);
169-
return this;
170-
});
168+
if (fn) {
169+
this.req.sessionStore.regenerate(this.req, fn)
170+
return
171+
}
172+
173+
if (!fn && !global.Promise) {
174+
throw new Error('must use callback without promises')
175+
}
176+
177+
var sess = this
178+
return new Promise(function (resolve, reject) {
179+
sess.req.sessionStore.regenerate(sess.req, function(err) {
180+
if (err) reject(err)
181+
resolve()
182+
})
183+
})
184+
})
171185

172186
/**
173187
* Helper function for creating a method on a prototype.

Diff for: test/session.js

+84-2
Original file line numberDiff line numberDiff line change
@@ -1603,7 +1603,7 @@ describe('session()', function(){
16031603
})
16041604
})
16051605

1606-
describe('.regenerate()', function(){
1606+
describe('.regenerate()', function () {
16071607
it('should destroy/replace the previous session', function(done){
16081608
var server = createServer(null, function (req, res) {
16091609
var id = req.session.id
@@ -1626,6 +1626,83 @@ describe('session()', function(){
16261626
.expect(200, 'false', done)
16271627
});
16281628
})
1629+
1630+
describe('with global Promise', function () {
1631+
beforeEach(function () {
1632+
global.Promise = Promise
1633+
})
1634+
1635+
afterEach(function () {
1636+
global.Promise = undefined
1637+
})
1638+
1639+
it('should return Promise without callback', function (done) {
1640+
var server = createServer(null, function (req, res) {
1641+
var id = req.session.id
1642+
req.session.regenerate()
1643+
.then(function() {
1644+
res.end(String(req.session.id === id))
1645+
})
1646+
.catch(function () {
1647+
res.statusCode = 500
1648+
})
1649+
})
1650+
1651+
request(server)
1652+
.get('/')
1653+
.expect(200, 'false', done)
1654+
})
1655+
1656+
it('should not return Promise with callback', function(done){
1657+
var server = createServer(null, function (req, res) {
1658+
var id = req.session.id
1659+
var ret = req.session.regenerate(function (err) {
1660+
res.statusCode = (!err && ret === undefined) ? 200 : 500
1661+
res.end(String(req.session.id === id))
1662+
})
1663+
})
1664+
1665+
request(server)
1666+
.get('/')
1667+
.expect(200, 'false', done)
1668+
})
1669+
})
1670+
1671+
describe('without global Promise', function () {
1672+
beforeEach(function () {
1673+
global.Promise = undefined
1674+
})
1675+
1676+
afterEach(function () {
1677+
global.Promise = Promise
1678+
})
1679+
1680+
it('should error without callback', function (done) {
1681+
var server = createServer(null, function (req, res) {
1682+
req.session.regenerate()
1683+
res.end()
1684+
})
1685+
1686+
request(server)
1687+
.get('/')
1688+
.expect(500, 'must use callback without promises', done)
1689+
})
1690+
1691+
it('should not return Promise with callback', function(done){
1692+
var server = createServer(null, function (req, res) {
1693+
var id = req.session.id
1694+
var ret = req.session.regenerate(function (err) {
1695+
res.statusCode = (!err && ret === undefined) ? 200 : 500
1696+
res.end(String(req.session.id === id))
1697+
})
1698+
})
1699+
1700+
request(server)
1701+
.get('/')
1702+
.expect(shouldSetCookie('connect.sid'))
1703+
.expect(200, 'false', done)
1704+
})
1705+
})
16291706
})
16301707

16311708
describe('.reload()', function () {
@@ -2371,7 +2448,12 @@ function createRequestListener(opts, fn) {
23712448
return
23722449
}
23732450

2374-
respond(req, res)
2451+
try {
2452+
respond(req, res)
2453+
} catch (e) {
2454+
res.statusCode = 500
2455+
res.end(e.message)
2456+
}
23752457
})
23762458
}
23772459
}

0 commit comments

Comments
 (0)