Skip to content

Commit 3212bea

Browse files
author
Alexander Mays
committed
Gave up my reservations about relying on Node module caching to enforce the singleton pattern. The correct way is to not use the constructor but rather a 'setup', 'init' or other method.
Signed-off-by: Alexander Mays <[email protected]>
1 parent 3c63f28 commit 3212bea

File tree

10 files changed

+19
-28
lines changed

10 files changed

+19
-28
lines changed

classes/BaseProvider.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ var ServiceProviderInterface = require('../interfaces/ServiceProvider');
22
var util = require('util');
33

44
function BaseProvider(adapter) {
5-
this.adapter = adapter;
5+
if (adapter) {
6+
this.adapter = adapter;
7+
}
68
};
79

810
util.inherits(BaseProvider, ServiceProviderInterface);
@@ -17,5 +19,6 @@ function setAdapter(adapter) {
1719

1820
BaseProvider.prototype.getAdapter = getAdapter;
1921
BaseProvider.prototype.setAdapter = setAdapter;
22+
BaseProvider.prototype.BaseProvider = BaseProvider;
2023

21-
module.exports = BaseProvider;
24+
exports = module.exports = new BaseProvider();

classes/CacheProvider.js

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
1-
var BaseProvider = require('./BaseProvider');
1+
var BaseProvider = require('./BaseProvider').BaseProvider;
22
var util = require('util');
33

4-
// Singleton for the entire server.
5-
// TODO: Refactor away from singleton paradigm
6-
var instance = null;
7-
84
function CacheProvider(adapter) {
9-
if (instance) {
10-
return instance;
11-
}
12-
13-
instance = this;
14-
this.adapter = adapter;
5+
CacheProvider.super_.call(this)
156
};
167

178
util.inherits(CacheProvider, BaseProvider);
189

19-
module.exports = CacheProvider;
10+
CacheProvider.prototype.CacheProvider = CacheProvider;
11+
12+
exports = module.exports = new CacheProvider();

interfaces/ServiceProvider.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ ServiceProviderInterface.prototype.setAdapter = function() {
99
throw new Error('A service provider must implement setAdapter!');
1010
}
1111

12-
module.exports = ServiceProviderInterface;
12+
exports = module.exports = ServiceProviderInterface;

src/Auth.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ function nobody(config) {
4141

4242
// Returns a promise that resolves to an Auth object
4343
var getAuthForSessionToken = function(config, sessionToken) {
44-
var cacheProvider = new (require('./classes/CacheProvider'));
45-
var cache = cacheProvider.getAdapter();
44+
var cache = require('./classes/CacheProvider').getAdapter();
4645

4746
var cachedUser = cache.get(sessionToken);
4847
if (cachedUser) {

src/Config.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
// configured.
33
// mount is the URL for the root of the API; includes http, domain, etc.
44
function Config(applicationId, mount) {
5-
var cacheProvider = new (require('./classes/CacheProvider'));
6-
var cache = cacheProvider.getAdapter();
5+
var cache = require('./classes/CacheProvider').getAdapter();
76
var DatabaseAdapter = require('./DatabaseAdapter');
87

98
var cacheInfo = cache.get(applicationId);

src/DatabaseAdapter.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ function setAppDatabaseURI(appId, uri) {
3434
}
3535

3636
function getDatabaseConnection(appId) {
37-
var cacheProvider = new (require('./classes/CacheProvider'));
38-
var cache = cacheProvider.getAdapter();
37+
var cache = require('./classes/CacheProvider').getAdapter();
3938
if (dbConnections[appId]) {
4039
return dbConnections[appId];
4140
}

src/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ function setupCache(config) {
195195
config.adapter = config.adapter || DefaultCacheAdapter;
196196

197197
var adapter = this.resolveAdapter(config.adapter, config.options);
198-
this.cacheProvider = new CacheProvider(adapter);
198+
CacheProvider.setAdapter(adapter);
199+
this.cacheProvider = CacheProvider;
199200
}
200201

201202
ParseServer.prototype.setupCache = setupCache;

src/middlewares.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ var Config = require('./Config');
1010
// req.config - the Config for this app
1111
// req.auth - the Auth for this request
1212
function handleParseHeaders(req, res, next) {
13-
var cacheProvider = new (require('./classes/CacheProvider'));
14-
var cache = cacheProvider.getAdapter();
13+
var cache = require('./classes/CacheProvider').getAdapter();
1514
var mountPathLength = req.originalUrl.length - req.url.length;
1615
var mountPath = req.originalUrl.slice(0, mountPathLength);
1716
var mount = req.protocol + '://' + req.get('host') + mountPath;

src/rest.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ function del(config, auth, className, objectId) {
3535
enforceRoleSecurity('delete', className, auth);
3636

3737
var inflatedObject;
38-
var cacheProvider = new (require('./classes/CacheProvider'));
39-
var cache = cacheProvider.getAdapter();
38+
var cache = require('./classes/CacheProvider').getAdapter();
4039

4140
return Promise.resolve().then(() => {
4241
if (triggers.getTrigger(className, 'beforeDelete') ||

src/testing-routes.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ var router = express.Router();
88

99
// creates a unique app in the cache, with a collection prefix
1010
function createApp(req, res) {
11-
var cacheProvider = new (require('./classes/CacheProvider'));
12-
var cache = cacheProvider.getAdapter();
11+
var cache = require('./classes/CacheProvider').getAdapter();
1312
var appId = rack();
1413
cache.put(appId, {
1514
'collectionPrefix': appId + '_',

0 commit comments

Comments
 (0)