|
import cfg from "./config.js" |
|
import { createClient } from "redis" |
|
import { exec } from "node:child_process" |
|
|
|
|
|
|
|
|
|
export default async function redisInit() { |
|
const rc = cfg.redis |
|
if (!rc?.open) return |
|
const redisUn = rc.username || "" |
|
let redisPw = rc.password ? `:${rc.password}` : "" |
|
if (rc.username || rc.password) |
|
redisPw += "@" |
|
const redisUrl = `redis://${redisUn}${redisPw}${rc.host}:${rc.port}/${rc.db}` |
|
let client = createClient({ url: redisUrl }) |
|
|
|
try { |
|
logger.info(`正在连接 ${logger.blue(redisUrl)}`) |
|
await client.connect() |
|
} catch (err) { |
|
logger.error(`Redis 错误:${logger.red(err)}`) |
|
|
|
const cmd = "redis-server --save 900 1 --save 300 10 --daemonize yes" + await aarch64() |
|
logger.info("正在启动 Redis...") |
|
await execSync(cmd) |
|
await new Promise((resolve) => setTimeout(resolve, 1000)) |
|
|
|
try { |
|
client = createClient({ url: redisUrl }) |
|
await client.connect() |
|
} catch (err) { |
|
logger.error(`Redis 错误:${logger.red(err)}`) |
|
logger.error(`请先启动 Redis:${logger.blue(cmd)}`) |
|
process.exit() |
|
} |
|
} |
|
|
|
client.on("error", async err => { |
|
logger.error(`Redis 错误:${logger.red(err)}`) |
|
const cmd = "redis-server --save 900 1 --save 300 10 --daemonize yes" + await aarch64() |
|
logger.error(`请先启动 Redis:${cmd}`) |
|
process.exit() |
|
}) |
|
|
|
|
|
global.redis = client |
|
logger.info("Redis 连接成功") |
|
return client |
|
} |
|
|
|
async function aarch64() { |
|
if (process.platform == "win32") |
|
return "" |
|
|
|
const arch = await execSync("uname -m") |
|
if (arch.stdout && arch.stdout.includes("aarch64")) { |
|
|
|
let v = await execSync("redis-server -v") |
|
if (v.stdout) { |
|
v = v.stdout.match(/v=(\d)./) |
|
|
|
if (v && v[1] >= 6) |
|
return " --ignore-warnings ARM64-COW-BUG" |
|
} |
|
} |
|
return "" |
|
} |
|
|
|
function execSync (cmd) { |
|
return new Promise((resolve, reject) => { |
|
exec(cmd, (error, stdout, stderr) => { |
|
resolve({ error, stdout, stderr }) |
|
}) |
|
}) |
|
} |