Add --url flag to ccc-client and ccc-queue

Overrides CONDUIT_URL env var. Resolved through load_client_config and
threaded into create_conduit_client as base_url parameter.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-07 21:20:59 +00:00
parent 0d1e25019e
commit 62d2480cd4
5 changed files with 32 additions and 23 deletions

View File

@@ -3,16 +3,16 @@
import { sign_request } from "./auth.mjs";
const BASE_URL = process.env.CONDUIT_URL || "http://localhost:3015";
const DEFAULT_URL = 'http://localhost:3015';
export function create_conduit_client(username, secret) {
export function create_conduit_client(username, secret, base_url = process.env.CONDUIT_URL || DEFAULT_URL) {
function auth_headers(body_string) {
return sign_request(secret, username, body_string);
}
async function call_action(action, params = {}) {
const body_string = JSON.stringify({ action, ...params });
const res = await fetch(`${BASE_URL}/action`, {
const res = await fetch(`${base_url}/action`, {
method: "POST",
headers: { "Content-Type": "application/json", ...auth_headers(body_string) },
body: body_string,
@@ -25,14 +25,14 @@ export function create_conduit_client(username, secret) {
}
async function get_queue() {
const res = await fetch(`${BASE_URL}/queue`, {
const res = await fetch(`${base_url}/queue`, {
headers: auth_headers(''),
});
return res.json();
}
async function resolve_queue_item(id, decision) {
const res = await fetch(`${BASE_URL}/queue/${id}/${decision}`, {
const res = await fetch(`${base_url}/queue/${id}/${decision}`, {
method: 'POST',
headers: auth_headers(''),
});

View File

@@ -1,12 +1,15 @@
// Resolve client config from CLI args or environment variables.
// Precedence: CLI args > env vars > error
// Precedence: CLI args > env vars > defaults
//
// Env vars:
// CCC_SECRETS path to secrets file
// CCC_USER username to authenticate as
// CCC_SECRETS path to secrets file
// CCC_USER username to authenticate as
// CONDUIT_URL server URL
import { readFileSync } from 'fs';
const DEFAULT_URL = 'http://localhost:3015';
function get_arg(argv, flag) {
const i = argv.indexOf(flag);
return i !== -1 ? argv[i + 1] : null;
@@ -15,6 +18,7 @@ function get_arg(argv, flag) {
export function load_client_config(argv) {
const secrets_path = get_arg(argv, '--secrets') || process.env.CCC_SECRETS;
const username = get_arg(argv, '--user') || process.env.CCC_USER;
const url = get_arg(argv, '--url') || process.env.CONDUIT_URL || DEFAULT_URL;
if (!secrets_path) {
console.error('Secrets file required: --secrets <path> or CCC_SECRETS=<path>');
@@ -39,14 +43,14 @@ export function load_client_config(argv) {
process.exit(1);
}
return { username, secret: user_entry.secret };
return { username, secret: user_entry.secret, url };
}
export function get_remaining(argv) {
const result = [];
let i = 2;
while (i < argv.length) {
if (argv[i] === '--secrets' || argv[i] === '--user') {
if (argv[i] === '--secrets' || argv[i] === '--user' || argv[i] === '--url') {
i += 2;
} else {
result.push(argv[i]);

View File

@@ -7,11 +7,9 @@
import { sign_request } from './auth.mjs';
import { load_client_config, get_remaining } from './config.mjs';
const BASE_URL = process.env.CONDUIT_URL || 'http://localhost:3015';
async function call_action(payload, username, secret) {
async function call_action(payload, username, secret, url) {
const body_string = JSON.stringify(payload);
const res = await fetch(`${BASE_URL}/action`, {
const res = await fetch(`${url}/action`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...sign_request(secret, username, body_string) },
body: body_string,
@@ -21,7 +19,7 @@ async function call_action(payload, username, secret) {
}
async function main() {
const { username, secret } = load_client_config(process.argv);
const { username, secret, url } = load_client_config(process.argv);
const remaining = get_remaining(process.argv);
if (!remaining.length) {
@@ -37,7 +35,7 @@ async function main() {
process.exit(1);
}
const { status, body } = await call_action(payload, username, secret);
const { status, body } = await call_action(payload, username, secret, url);
console.log(JSON.stringify(body, null, 2));
process.exit(status >= 400 ? 1 : 0);
}