mirror of
https://github.com/Spengreb/sync.git
synced 2026-05-14 11:42:04 +00:00
44 lines
1.4 KiB
JavaScript
44 lines
1.4 KiB
JavaScript
import fs from 'fs';
|
|
|
|
const logger = require('@calzoneman/jsli')('redis/lualoader');
|
|
const CACHE = {};
|
|
const EVALSHA_CACHE = {};
|
|
|
|
export function loadLuaScript(filename) {
|
|
if (CACHE.hasOwnProperty(filename)) {
|
|
return CACHE[filename];
|
|
}
|
|
|
|
CACHE[filename] = fs.readFileSync(filename).toString('utf8');
|
|
return CACHE[filename];
|
|
}
|
|
|
|
function loadAndExecuteScript(redisClient, filename, args) {
|
|
return redisClient.scriptAsync('load', loadLuaScript(filename))
|
|
.then(sha => {
|
|
EVALSHA_CACHE[filename] = sha;
|
|
logger.debug(`Cached ${filename} as ${sha}`);
|
|
return runEvalSha(redisClient, filename, args);
|
|
});
|
|
}
|
|
|
|
function runEvalSha(redisClient, filename, args) {
|
|
const evalInput = args.slice();
|
|
evalInput.unshift(EVALSHA_CACHE[filename])
|
|
return redisClient.evalshaAsync.apply(redisClient, evalInput);
|
|
}
|
|
|
|
export function runLuaScript(redisClient, filename, args) {
|
|
if (EVALSHA_CACHE.hasOwnProperty(filename)) {
|
|
return runEvalSha(redisClient, filename, args).catch(error => {
|
|
if (error.code === 'NOSCRIPT') {
|
|
logger.warn(`Got NOSCRIPT error for ${filename}, reloading script`);
|
|
return loadAndExecuteScript(redisClient, filename, args);
|
|
} else {
|
|
throw error;
|
|
}
|
|
});
|
|
} else {
|
|
return loadAndExecuteScript(redisClient, filename, args);
|
|
}
|
|
}
|