Files
HiveGrid-Wireframes/hivegrid-cloud/scripts/verify-plugin-runtime-live.mjs
T

90 lines
2.8 KiB
JavaScript

#!/usr/bin/env node
const TRUSTED_KEY_PATTERN = /^[a-f0-9]{64}$/i;
export function verifyPluginRuntimeLiveEnv(env = process.env) {
const passes = [];
const failures = [];
const group = (env.WORKER_QUEUE_GROUP || "").trim();
const requireValue = (key, expected) => {
if (env[key] === expected) {
passes.push(`${key}=${expected}`);
} else {
failures.push(`${key} must be ${expected}`);
}
};
const requirePresent = (key) => {
if (typeof env[key] === "string" && env[key].trim()) {
passes.push(`${key} is configured`);
} else {
failures.push(`${key} must be configured`);
}
};
requireValue("PLUGIN_RUNTIME_PRODUCTION_ENABLED", "true");
requireValue("WORKER_ENABLED", "true");
requirePresent("DATABASE_URL");
requirePresent("BULLMQ_REDIS_URL");
if (group === "general" || group === "plugin") {
passes.push(`WORKER_QUEUE_GROUP=${group}`);
} else {
failures.push("WORKER_QUEUE_GROUP must be general or plugin for plugin runtime live verification");
}
const keys = (env.PLUGIN_TRUSTED_PUBLIC_KEYS || "")
.split(",")
.map((key) => key.trim())
.filter(Boolean);
if (keys.length > 0 && keys.every((key) => TRUSTED_KEY_PATTERN.test(key))) {
passes.push("PLUGIN_TRUSTED_PUBLIC_KEYS has valid hex trust roots");
} else {
failures.push("PLUGIN_TRUSTED_PUBLIC_KEYS must contain at least one 64-char hex Ed25519 public key");
}
if (group === "general") {
requireValue("OUTBOX_DISPATCHER_ENABLED", "true");
requireValue("PLUGIN_HOOK_FANOUT_REQUIRED", "true");
if (env.PLUGIN_HOOK_FANOUT_ENABLED === "false") {
failures.push("PLUGIN_HOOK_FANOUT_ENABLED must be unset or true");
} else {
passes.push("PLUGIN_HOOK_FANOUT_ENABLED is not disabled");
}
if (env.PLUGIN_CAPABILITY_USE_ENABLED === "false") {
failures.push("PLUGIN_CAPABILITY_USE_ENABLED must be unset or true");
} else {
passes.push("PLUGIN_CAPABILITY_USE_ENABLED is not disabled");
}
}
if (group === "plugin") {
passes.push("worker-plugin live gate checks the isolated invocation worker configuration");
}
return { passes, failures };
}
export function formatPluginRuntimeLiveResult(result) {
const status = result.failures.length > 0 ? "FAIL" : "PASS";
return [
`${status} plugin runtime live verification`,
...result.passes.map((pass) => `PASS ${pass}`),
...result.failures.map((failure) => `FAIL ${failure}`),
`Summary: ${result.passes.length} passed, ${result.failures.length} failed`,
"",
].join("\n");
}
if (import.meta.url === `file://${process.argv[1]}`) {
const result = verifyPluginRuntimeLiveEnv(process.env);
const output = formatPluginRuntimeLiveResult(result);
if (result.failures.length > 0) {
process.stderr.write(output);
process.exitCode = 1;
} else {
process.stdout.write(output);
}
}