From f39f01fe4f492f33350972d7152b14ae63a00acf Mon Sep 17 00:00:00 2001 From: Patrick Walker Date: Mon, 26 Sep 2016 14:56:05 +0100 Subject: [PATCH] Initial Commit for SSDB Functionality --- LICENSE | 4 +- bower.conf.json | 5 +- lib/application.js | 4 +- lib/infrastructure/configurationManager.js | 10 +- lib/main.js | 2 +- .../packageStores/privatePackageStore.js | 131 ++++++++++++------ package.json | 14 +- 7 files changed, 118 insertions(+), 52 deletions(-) diff --git a/LICENSE b/LICENSE index ecda33f..005686f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ The MIT License (MIT) -Copyright (c) 2014 Hacklone -https://github.com/Hacklone +Copyright (c) 2016 Patrick Walker +https://github.com/PatrickWalker Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/bower.conf.json b/bower.conf.json index 4a3b9ed..2933754 100644 --- a/bower.conf.json +++ b/bower.conf.json @@ -1,5 +1,8 @@ { - "registryFile": "./bowerRepository.json", + "private":{ + "type" : "SSDB", + "target" : "localhost:8888" + }, "timeout": 144000, "server": { "port": 5678, diff --git a/lib/application.js b/lib/application.js index e259d8f..6e1cc3e 100644 --- a/lib/application.js +++ b/lib/application.js @@ -20,9 +20,9 @@ module.exports = function Application() { _siteBaseUrl = siteBaseUrl; } - function _startPrivatePackageStore(registryFile) { + function _startPrivatePackageStore(persitenceConfig) { privatePackageStore.start({ - persistFilePath: registryFile + persistenceConfig: persitenceConfig }); } diff --git a/lib/infrastructure/configurationManager.js b/lib/infrastructure/configurationManager.js index 13f876e..080a455 100644 --- a/lib/infrastructure/configurationManager.js +++ b/lib/infrastructure/configurationManager.js @@ -33,7 +33,15 @@ module.exports = function ConfigurationManager() { configureLog4Js(); function setConfigValues() { - self.config.registryFile = getRelativeFilePath(configFile.registryFile || './bowerRepository.json'); + + self.config.private = self.config.private || {}; + self.config.private.type = self.config.private.type || "SSDB"; + if(self.config.private.target.toLowerCase()==="file"){ + self.config.private.target = getRelativeFilePath(self.config.private.target || './bowerRepository.json'); + } + else{ + self.config.private.target = self.config.private.target || "0.0.0.0:8888"; + } self.config.server = self.config.server || {}; self.config.server.port = utils.process.env.PORT || self.config.server.port || self.config.port; self.config.server.hostName = utils.process.env.IP || self.config.server.hostName || self.config.hostName || '0.0.0.0'; diff --git a/lib/main.js b/lib/main.js index 9dd7f55..99e1a90 100644 --- a/lib/main.js +++ b/lib/main.js @@ -42,7 +42,7 @@ module.exports = function Main() { } function _initializePackageStores() { - application.startPrivatePackageStore(_config.registryFile); + application.startPrivatePackageStore( _config.private); if(!_config.public.disabled) { application.startPublicPackageStore(); diff --git a/lib/service/packageStores/privatePackageStore.js b/lib/service/packageStores/privatePackageStore.js index fd55103..e09e21f 100644 --- a/lib/service/packageStores/privatePackageStore.js +++ b/lib/service/packageStores/privatePackageStore.js @@ -1,6 +1,10 @@ -var fs = require('fs'); var logger = require('../../infrastructure/logger'); +//This should come out into the adapter logic +var ssdb = require('ssdb'); +var pool; +var conn; + module.exports = function PackageStore() { var self = { start: _start, @@ -12,7 +16,7 @@ module.exports = function PackageStore() { removePackages: _removePackages, searchPackage: _searchPackage, - + persistPackage: _persistPackage, persistPackages: _persistPackages }; @@ -20,10 +24,21 @@ module.exports = function PackageStore() { function _start(options) { _options = options; - + //we will pass the persistenceConfig option into a method which will then set our persistence adapter + _createSSDBConnection(options.persistenceConfig); _loadPackages(); } + function _createSSDBConnection(config) + { + var ssdbConfig = config.target.split(":"); + pool = ssdb.createPool({ + host: ssdbConfig[0], + port: ssdbConfig[1] + }); + conn = pool.acquire(); + } + function _getPackage(packageName) { var item = self.packages[packageName]; @@ -36,8 +51,7 @@ module.exports = function PackageStore() { item.hits++; //could use yield - setTimeout(_persistPackages, 10); - + setTimeout(_persistPackage(packageName,item), 10) return item; } @@ -50,68 +64,107 @@ module.exports = function PackageStore() { continue; } - - self.packages[registerPackage.name] = { + + var packInfo = { name: registerPackage.name, url: registerPackage.url, hits: 0 }; + self.packages[registerPackage.name] = packInfo; logger.log('Registered package: ' + registerPackage.name); + _persistPackage(registerPackage.name, packInfo); } - _persistPackages(); } function _removePackages(remove) { for(var i = 0, len = remove.length; i < len; i++) { delete self.packages[remove[i]]; - + _persistRemoval(remove[i]) logger.log('Removed package: ' + remove[i]); } + + } - _persistPackages(); + + function _persistRemoval(key) + { + conn.del(key, function(err,data){ + if(err) + { + throw err; + } + }); + } + + function _persistPackage(key,package) { + var pack = JSON.stringify(package, null, ' '); + conn.set(key, pack,function(err, data) { + if (err) { + throw err; + } + // data => '1' + }); + } function _persistPackages() { - if(fs.existsSync(_options.persistFilePath)) { - fs.unlinkSync(_options.persistFilePath); - } - fs.writeFileSync(_options.persistFilePath, JSON.stringify(self.packages, null, ' ')); + for(var key in self.packages) { + var pack = JSON.stringify(self.packages[key], null, ' '); + conn.set(key, pack,function(err, data) { + if (err) { + throw err; + } + // data => '1' + }); + } } function _loadPackages() { - if(!fs.existsSync(_options.persistFilePath)) { - return; - } - - var json = fs.readFileSync(_options.persistFilePath).toString(); - try { - self.packages = modifyRepoProperty(JSON.parse(json)); + try{ + var b = conn.keys("","",-1, function(err, data) + { + if(err) + { + throw err; + } + + var loadedPackages = {}; + for (i = 0; i < data.length; i++) { + conn.get(data[i], function(err,dbPack){ + try { + dbPack = JSON.parse(dbPack); + + loadedPackages[dbPack.name]= { + name: dbPack.name, + url: dbPack.repo || dbPack.url, + hits: dbPack.hits + } + } + catch(e) { + logger.error("Malformed Entry for " + data[i] + " so skipping it"); + } + + if(err) + { + throw err; + } + }); + + } + self.packages = loadedPackages; + } ); + } - catch(e) { - logger.error('Malformed registry file. It must be a valid json: ' + _options.persistFilePath, e); - + catch(e) + { + logger.error("Problem reading information from SSDB"); throw e; } - function modifyRepoProperty(packages) { - var loadedPackages = {}; - - for(var key in packages) { - var pack = packages[key]; - - loadedPackages[pack.name] = { - name: pack.name, - url: pack.repo || pack.url, - hits: pack.hits - }; - } - - return loadedPackages; - } } function _searchPackage(name) { diff --git a/package.json b/package.json index 2e1b4f7..ec93897 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { - "name": "private-bower", + "name": "private-bower-ssdb", "version": "1.1.7", - "author": "Hacklone ", - "description": "A simple private bower registry", + "author": "Patrick Walker ", + "description": "A simple private bower registry using SSDB rather than filesystem", "main": "./bin/private-bower", "repository": { "type": "git", - "url": "git://github.com/Hacklone/private-bower.git" + "url": "git://github.com/PatrickWalker/private-bower" }, "keywords": [ "bower", @@ -17,6 +17,7 @@ "cache", "git", "svn", + "ssdb", "package" ], "scripts": { @@ -33,6 +34,7 @@ "node-rest-client": "^1.0.0", "optimist": "^0.5.2", "path-is-absolute": "^1.0.0", + "ssdb": "^0.3.8", "URIjs": "^1.5.0" }, "devDependencies": { @@ -46,13 +48,13 @@ "superagent": "^1.1.0" }, "bugs": { - "url": "https://github.com/Hacklone/private-bower/issues" + "url": "https://github.com/PatrickWalker/private-bower/issues" }, "homepage": "http://hacklone.github.io/private-bower", "licenses": [ { "type": "MIT", - "url": "https://github.com/Hacklone/private-bower/raw/master/LICENSE" + "url": "https://github.com/PatrickWalker/private-bower/raw/master/LICENSE" } ], "analyze": false,