Skip to content

Commit

Permalink
Initial Commit for SSDB Functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrick Walker committed Sep 26, 2016
1 parent 9061b73 commit f39f01f
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 52 deletions.
4 changes: 2 additions & 2 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -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
Expand Down
5 changes: 4 additions & 1 deletion bower.conf.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"registryFile": "./bowerRepository.json",
"private":{
"type" : "SSDB",
"target" : "localhost:8888"
},
"timeout": 144000,
"server": {
"port": 5678,
Expand Down
4 changes: 2 additions & 2 deletions lib/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ module.exports = function Application() {
_siteBaseUrl = siteBaseUrl;
}

function _startPrivatePackageStore(registryFile) {
function _startPrivatePackageStore(persitenceConfig) {
privatePackageStore.start({
persistFilePath: registryFile
persistenceConfig: persitenceConfig
});
}

Expand Down
10 changes: 9 additions & 1 deletion lib/infrastructure/configurationManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
2 changes: 1 addition & 1 deletion lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ module.exports = function Main() {
}

function _initializePackageStores() {
application.startPrivatePackageStore(_config.registryFile);
application.startPrivatePackageStore( _config.private);

if(!_config.public.disabled) {
application.startPublicPackageStore();
Expand Down
131 changes: 92 additions & 39 deletions lib/service/packageStores/privatePackageStore.js
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -12,18 +16,29 @@ module.exports = function PackageStore() {
removePackages: _removePackages,

searchPackage: _searchPackage,

persistPackage: _persistPackage,
persistPackages: _persistPackages
};

var _options;

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];

Expand All @@ -36,8 +51,7 @@ module.exports = function PackageStore() {
item.hits++;

//could use yield
setTimeout(_persistPackages, 10);

setTimeout(_persistPackage(packageName,item), 10)
return item;
}

Expand All @@ -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) {
Expand Down
14 changes: 8 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"name": "private-bower",
"name": "private-bower-ssdb",
"version": "1.1.7",
"author": "Hacklone <toakak@gmail.com>",
"description": "A simple private bower registry",
"author": "Patrick Walker <bpatrick.walker@gmail.com>",
"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",
Expand All @@ -17,6 +17,7 @@
"cache",
"git",
"svn",
"ssdb",
"package"
],
"scripts": {
Expand All @@ -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": {
Expand All @@ -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,
Expand Down

0 comments on commit f39f01f

Please sign in to comment.