Skip to content

Commit fafa2e2

Browse files
committed
Merge branch 'custom-stores'
2 parents 6879a76 + 060415c commit fafa2e2

File tree

2 files changed

+75
-34
lines changed

2 files changed

+75
-34
lines changed

lib/hooks/session/index.js

+75-32
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
var util = require('sails-util'),
66
uuid = require('node-uuid'),
7+
path = require('path'),
78
generateSecret = require('./generateSecret'),
89
cookie = require('express/node_modules/cookie'),
910
parseSignedCookie = require('express/node_modules/connect').utils.parseSignedCookie,
@@ -116,6 +117,15 @@ module.exports = function(sails) {
116117

117118
sails.config.session.secret = generateSecret();
118119
}
120+
121+
// Backwards-compatibility / shorthand notation
122+
// (allow mongo or redis session stores to be specified directly)
123+
if (sails.config.session.adapter === 'redis') {
124+
sails.config.session.adapter = 'connect-redis';
125+
}
126+
else if (sails.config.session.adapter === 'mongo') {
127+
sails.config.session.adapter = 'connect-mongo';
128+
}
119129
},
120130

121131
/**
@@ -129,42 +139,75 @@ module.exports = function(sails) {
129139

130140
// Intepret session adapter config and "new up" a session store
131141
if (util.isObject(sessionConfig) && !util.isObject(sessionConfig.store)) {
132-
switch (sessionConfig.adapter) {
133-
134-
// Session explicitly disabled
135-
case null:
136-
// Do nothing...
137-
break;
138-
139-
// Supported session adapters
140-
case 'memory':
141-
sessionConfig.store = new(require('express').session.MemoryStore)();
142-
break;
143-
case 'redis':
144-
try {
145-
sessionConfig.store = new(require('connect-redis')(require('express')))(sessionConfig);
146-
} catch (e) {
147-
return cb(new Error('Could not load session adapter :: ' + sessionConfig.adapter));
148-
}
149-
break;
150-
case 'mongo':
151-
try {
152-
sessionConfig.store = new(require('connect-mongo')(require('express')))(sessionConfig);
153-
} catch (e) {
154-
return cb(new Error('Could not load session adapter :: ' + sessionConfig.adapter));
155-
}
156-
break;
157142

158-
// Unknown session adapter
159-
default:
160-
// try and load the adapter, catch and throw error
143+
// Unless the session is explicitly disabled, require the appropriate adapter
144+
if (sessionConfig.adapter) {
145+
146+
// 'memory' is a special case
147+
if (sessionConfig.adapter === 'memory') {
148+
var MemoryStore = require('express').session.MemoryStore;
149+
sessionConfig.store = new MemoryStore();
150+
}
151+
// Try and load the specified adapter from the local sails project,
152+
// or catch and return error:
153+
else {
154+
155+
var COULD_NOT_REQUIRE_CONNECT_ADAPTER_ERR = function (adapter, packagejson, e) {
156+
var errMsg;
157+
if (e && typeof e === 'object' && e instanceof Error) {
158+
errMsg = e.stack;
159+
}
160+
else {
161+
errMsg = util.inspect(e);
162+
}
163+
164+
var output = 'Could not load Connect session adapter :: ' + adapter + '\n';
165+
if (packagejson && !packagejson.main) {
166+
output+='(If this is your module, make sure that the module has a "main" configuration in its package.json file)';
167+
}
168+
output+='\nError from adapter:\n'+ errMsg+'\n\n';
169+
170+
171+
// Recommend installation of the session adapter:
172+
output += 'Do you have the Connect session adapter installed in this project?\n';
173+
output += 'Try running the following command in your project\'s root directory:\n';
174+
var installRecommendation = 'npm install ';
175+
if (adapter === 'connect-redis') {
176+
installRecommendation += 'connect-redis@1.4.5';
177+
installRecommendation += '\n(Note that `connect-redis@1.5.0` introduced breaking changes- make sure you have v1.4.5 installed!)';
178+
}
179+
else {
180+
installRecommendation += adapter;
181+
installRecommendation +='\n(Note: Make sure the version of the Connet adapter you install is compatible with Express 3/Sails v0.10)';
182+
}
183+
installRecommendation += '\n';
184+
185+
output += installRecommendation;
186+
187+
return output;
188+
};
189+
161190
try {
162-
sessionConfig.store = new(require(sessionConfig.adapter)(require('express')))(sessionConfig);
163-
break;
191+
192+
// Determine the path to the adapter by using the "main" described in its package.json file:
193+
var pathToAdapterDependency;
194+
var pathToAdapterPackage = path.resolve(sails.config.appPath, 'node_modules', sessionConfig.adapter ,'package.json');
195+
var adapterPackage;
196+
try {
197+
adapterPackage = require(pathToAdapterPackage);
198+
pathToAdapterDependency = path.resolve(sails.config.appPath, 'node_modules', sessionConfig.adapter, adapterPackage.main);
199+
}
200+
catch (e) {
201+
return cb(COULD_NOT_REQUIRE_CONNECT_ADAPTER_ERR(sessionConfig.adapter, adapterPackage, e));
202+
}
203+
var SessionAdapter = require(pathToAdapterDependency);
204+
var CustomStore = SessionAdapter(require('express'));
205+
sessionConfig.store = new CustomStore(sessionConfig);
164206
} catch (e) {
165-
return cb(new Error('Could not load session adapter :: ' + sessionConfig.adapter));
207+
// TODO: negotiate error
208+
return cb(COULD_NOT_REQUIRE_CONNECT_ADAPTER_ERR(sessionConfig.adapter, adapterPackage, e));
166209
}
167-
210+
}
168211
}
169212
}
170213

package.json

-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@
4747
"i18n": "~0.4.1",
4848
"sails-generate": "~0.10.2",
4949
"sails-build-dictionary": "~0.10.1",
50-
"connect-redis": "~1.4.5",
51-
"connect-mongo": "~0.4.0",
5250
"grunt-cli": "~0.1.11",
5351
"ejs": "~0.8.4",
5452
"sails-disk": "~0.10.0",

0 commit comments

Comments
 (0)