90 lines
2.8 KiB
JavaScript
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);
|
|
}
|
|
}
|