Skip to content

Minor modernization updates #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
262 changes: 124 additions & 138 deletions lib/scripto.js
Original file line number Diff line number Diff line change
@@ -1,160 +1,146 @@
var fs = require('fs');
var path = require('path');
var debug = require('debug')('scripto');

function Scripto (redisClient) {

var scripts = {};
var scriptShas = this._scriptShas = {};

this.load = function load(scriptObject) {

mergeObjects(scripts, scriptObject);
loadScriptsIntoRedis(redisClient, scriptObject, afterShasLoaded);
};

this.loadFromFile = function loadFromFile(name, filepath) {

var loadedScripts = {};
loadedScripts[name] = fs.readFileSync(filepath, 'utf8');
this.load(loadedScripts);
};

this.loadFromDir = function loadFromDir(scriptsDir) {

var loadedScripts = loadScriptsFromDir(scriptsDir);
this.load(loadedScripts);
};


this.run = function run(scriptName, keys, args, callback) {

if(scripts[scriptName]) {
if(scriptShas[scriptName]) {
var sha = scriptShas[scriptName];
evalShaScript(redisClient, sha, keys, args, callback);
} else {
var script = scripts[scriptName];
evalScript(redisClient, script, keys, args, callback);
}
} else {
callback(new Error('NO_SUCH_SCRIPT'));
}
};

this.eval = function eval(scriptName, keys, args, callback) {

if(scripts[scriptName]) {
var script = scripts[scriptName];
evalScript(redisClient, script, keys, args, callback);
} else {
callback(new Error('NO_SUCH_SCRIPT'));
}
};

this.evalSha = function evalSha(scriptName, keys, args, callback) {

if(scriptShas[scriptName]) {
var sha = scriptShas[scriptName];
evalShaScript(redisClient, sha, keys, args, callback);
} else {
callback(new Error('NO_SUCH_SCRIPT_SHA'));
}
};

//load scripts into redis in every time it connects to it
redisClient.on('connect', function() {

debug('loading scripts into redis again, aftet-reconnect');
loadScriptsIntoRedis(redisClient, scripts, afterShasLoaded);
});

//reset shas after error occured
redisClient.on('error', function(err) {

var errorMessage = (err)? err.toString() : "";
debug('resetting scriptShas due to redis connection error: ' + errorMessage);
scriptShas = {};
});

function afterShasLoaded(err, shas) {

if(err) {
debug('scripts loading failed due to redis command error: ' + err.toString());
} else {
debug('loaded scriptShas');
mergeObjects(scriptShas, shas);
}
const fs = require("fs");
const path = require("path");
const debug = require("debug")("scripto");

function Scripto(redisClient) {
const scripts = {};
const scriptShas = {};
this.load = function (scriptObject) {
mergeObjects(scripts, scriptObject);
loadScriptsIntoRedis(redisClient, scriptObject, afterShasLoaded);
};

this.loadFromFile = function (name, filepath) {
const loadedScripts = {};
loadedScripts[name] = fs.readFileSync(filepath, "utf8");
this.load(loadedScripts);
};

this.loadFromDir = function (scriptsDir) {
const loadedScripts = loadScriptsFromDir(scriptsDir);
this.load(loadedScripts);
};

this.run = function (scriptName, keys, args, callback) {
if (scripts[scriptName]) {
if (scriptShas[scriptName]) {
const sha = scriptShas[scriptName];
evalShaScript(redisClient, sha, keys, args, callback);
} else {
const script = scripts[scriptName];
evalScript(redisClient, script, keys, args, callback);
}
} else {
callback(new Error("NO_SUCH_SCRIPT"));
}

function mergeObjects (obj1, obj2) {

for(var key in obj2) {
obj1[key] = obj2[key];
}
};

this.eval = function (scriptName, keys, args, callback) {
if (scripts[scriptName]) {
const script = scripts[scriptName];
evalScript(redisClient, script, keys, args, callback);
} else {
callback(new Error("NO_SUCH_SCRIPT"));
}
};

this.evalSha = function (scriptName, keys, args, callback) {
if (scriptShas[scriptName]) {
const sha = scriptShas[scriptName];
evalShaScript(redisClient, sha, keys, args, callback);
} else {
callback(new Error("NO_SUCH_SCRIPT_SHA"));
}
};

//load scripts into redis in every time it connects to it
redisClient.on("connect", function () {
debug("loading scripts into redis again, aftet-reconnect");
loadScriptsIntoRedis(redisClient, scripts, afterShasLoaded);
});

//reset shas after error occured
redisClient.on("error", function (err) {
const errorMessage = err ? err.toString() : "";
debug(
"resetting scriptShas due to redis connection error: " + errorMessage
);
scriptShas = {};
});

function afterShasLoaded(err, shas) {
if (err) {
debug(
"scripts loading failed due to redis command error: " + err.toString()
);
} else {
debug("loaded scriptShas");
mergeObjects(scriptShas, shas);
}
}

function mergeObjects(obj1, obj2) {
for (const key in obj2) {
obj1[key] = obj2[key];
}
}
}

module.exports = Scripto;

function loadScriptsFromDir(scriptsDir) {
const names = fs.readdirSync(scriptsDir);
const scripts = {};

var names = fs.readdirSync(scriptsDir);
var scripts = {};

names.forEach(function(name) {

var filename = path.resolve(scriptsDir, name);
var key = name.replace('.lua', '');
names.forEach(function (name) {
const filename = path.resolve(scriptsDir, name);
const key = name.replace(".lua", "");

scripts[key] = fs.readFileSync(filename, 'utf8');
});
scripts[key] = fs.readFileSync(filename, "utf8");
});

return scripts;
return scripts;
}

function loadScriptsIntoRedis (redisClient, scripts, callback) {

var cnt = 0;
var keys = Object.keys(scripts);
var shas = {};

(function doLoad() {

if(cnt < keys.length) {
var key = keys[cnt++];

redisClient.send_command('script', ['load', scripts[key]], function(err, sha) {

if(err) {
callback(err);
} else {
shas[key] = sha;
doLoad();
}
});
} else {
callback(null, shas);
function loadScriptsIntoRedis(redisClient, scripts, callback) {
let cnt = 0;
const keys = Object.keys(scripts);
const shas = {};

(function doLoad() {
if (cnt < keys.length) {
const key = keys[cnt++];

redisClient.send_command(
"script",
["load", scripts[key]],
function (err, sha) {
if (err) {
callback(err);
} else {
shas[key] = sha;
doLoad();
}
}

})();
);
} else {
callback(null, shas);
}
})();
}

function evalScript(redisClient, script, keys, args, callback) {
const keysLength = keys.length || 0;
const arguments = [keysLength].concat(keys, args);
arguments.unshift(script);

var keysLength= keys.length || 0;
var arguments = [keysLength].concat(keys, args);
arguments.unshift(script);

redisClient.send_command('eval', arguments, callback);
redisClient.send_command("eval", arguments, callback);
}

function evalShaScript(redisClient, sha, keys, args, callback) {
const keysLength = keys.length || 0;
const arguments = [keysLength].concat(keys, args);
arguments.unshift(sha);

var keysLength= keys.length || 0;
var arguments = [keysLength].concat(keys, args);
arguments.unshift(sha);

redisClient.send_command('evalsha', arguments, callback);
}
redisClient.send_command("evalsha", arguments, callback);
}
Loading