#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CREDS_DIR="${SCRIPT_DIR}/creds"
NATS_SERVER="tls://localhost:4222"
# Use an array to avoid unquoted variable expansion (shellcheck SC2086)
NATS_TLS_FLAGS=(--tlsskipverify)
log() { echo "[provision-streams.sh] $*"; }
die() { echo "[provision-streams.sh] ERROR: $*" >&2; exit 1; }
command -v nats &>/dev/null || die "nats CLI not found. Install from https://github.com/nats-io/natscli/releases"
for PROJECT in edgesync go-libfossil; do
STREAM=$(echo "$PROJECT" | tr '[:lower:]' '[:upper:]' | tr '-' '_')
CREDS="${CREDS_DIR}/${PROJECT}-admin.creds"
[[ -f "$CREDS" ]] || die "Missing $CREDS — run bootstrap-creds.sh first."
if nats stream info "$STREAM" \
--server "$NATS_SERVER" "${NATS_TLS_FLAGS[@]}" \
--creds "$CREDS" &>/dev/null; then
log "Stream $STREAM already exists, skipping."
continue
fi
log "Creating stream $STREAM (subjects: fossil.${PROJECT}.>)..."
# All fields specified explicitly to avoid interactive prompts in non-TTY contexts
nats stream add "$STREAM" \
--server "$NATS_SERVER" "${NATS_TLS_FLAGS[@]}" \
--creds "$CREDS" \
--subjects "fossil.${PROJECT}.>" \
--retention limits \
--max-age 168h \
--max-bytes 1073741824 \
--max-msgs -1 \
--max-msgs-per-subject -1 \
--max-msg-size -1 \
--max-consumers -1 \
--discard old \
--storage file \
--replicas 1 \
--dupe-window 2m \
--defaults
log "Stream $STREAM created."
done
log ""
log "Phase 4 complete. NATS is fully provisioned."
log ""
log "Verify streams:"
log " nats stream ls --server tls://localhost:4222 --tlsskipverify --creds ${CREDS_DIR}/edgesync-admin.creds"