redis-smq-common
Version:
RedisSMQ Common Library provides many components that are mainly used by RedisSMQ and RedisSMQ Monitor.
65 lines • 2.88 kB
JavaScript
import { spawn } from 'child_process';
import { copyFile, chmod } from 'node:fs/promises';
import os from 'node:os';
import * as path from 'path';
import { archive } from '../archive/index.js';
import { env } from '../env/index.js';
import { FileLock } from '../file-lock/index.js';
import { getSupportedPlatform } from './get-supported-platform.js';
import { constants } from './constants.js';
const { REDIS_BINARY_PATH, REDIS_SETUP_LOCK_FILE, REDIS_SERVER_VERSION, REDIS_CACHE_DIRECTORY, } = constants;
async function compileRedis(sourceDir) {
console.log(`Compiling Redis (${sourceDir})...`);
return new Promise((resolve, reject) => {
const makeProcess = spawn('make', [], {
cwd: sourceDir,
stdio: 'inherit',
});
const onError = (err) => {
makeProcess.removeListener('close', onClose);
makeProcess.kill();
reject(err);
};
const onClose = (code) => {
makeProcess.removeListener('error', onError);
if (code === 0) {
console.log('Redis compilation completed successfully.');
resolve();
}
else {
reject(new Error(`Redis compilation failed with exit code ${code}.`));
}
};
makeProcess.once('error', onError);
makeProcess.once('close', onClose);
});
}
export async function buildRedisBinary() {
getSupportedPlatform();
const fileLock = new FileLock();
try {
await env.ensureDirectoryExists(REDIS_CACHE_DIRECTORY);
await fileLock.acquireLock(REDIS_SETUP_LOCK_FILE);
const cacheExists = await env.doesPathExist(REDIS_BINARY_PATH);
if (!cacheExists) {
const tempDirectory = path.join(os.tmpdir(), String(Date.now()));
await env.ensureDirectoryExists(tempDirectory);
const sourcePath = `https://github.com/valkey-io/valkey/archive/refs/tags/${REDIS_SERVER_VERSION}.tar.gz`;
const savePath = path.join(tempDirectory, `redis-${REDIS_SERVER_VERSION}.tar.gz`);
await env.downloadFile(sourcePath, savePath);
const extractDirectory = path.join(tempDirectory, 'extracted');
await env.ensureDirectoryExists(extractDirectory);
await archive.extractTgz(savePath, extractDirectory);
const sourceDir = path.join(extractDirectory, `valkey-${REDIS_SERVER_VERSION}`);
await compileRedis(sourceDir);
const redisBin = path.join(extractDirectory, `valkey-${REDIS_SERVER_VERSION}`, 'src', 'valkey-server');
await copyFile(redisBin, REDIS_BINARY_PATH);
await chmod(REDIS_BINARY_PATH, 0o755);
}
return REDIS_BINARY_PATH;
}
finally {
await fileLock.releaseLock(REDIS_SETUP_LOCK_FILE);
}
}
//# sourceMappingURL=build-redis.js.map