expand ci quality gates
All checks were successful
CI / Validate (push) Successful in 1m13s

This commit is contained in:
dirtydishes 2026-05-30 02:34:28 -04:00
parent 65139bf8d0
commit 44431c4e66
71 changed files with 2262 additions and 1173 deletions

View file

@ -16,7 +16,11 @@ import {
nanos,
millis
} from "nats";
import { getKnownStreamDefinitions, getStreamDefinition, type StreamRetentionClass } from "./streams";
import {
getKnownStreamDefinitions,
getStreamDefinition,
type StreamRetentionClass
} from "./streams";
export type NatsConnectionOptions = {
servers: string | string[];
@ -251,9 +255,10 @@ const diffConfigFields = (
for (const field of fields) {
const currentValue = getFieldValue(current, field);
const desiredValue = getFieldValue(desired, field);
const matches = Array.isArray(currentValue) && Array.isArray(desiredValue)
? arraysEqual(currentValue, desiredValue)
: currentValue === desiredValue;
const matches =
Array.isArray(currentValue) && Array.isArray(desiredValue)
? arraysEqual(currentValue, desiredValue)
: currentValue === desiredValue;
if (!matches) {
deltas.push({
@ -391,7 +396,10 @@ const formatStructuredValue = (value: unknown): string => {
const formatStructuralMismatchMessage = (audit: StreamAuditReport): string => {
const details = audit.structuralMismatch
.map((delta) => `${delta.field} current=${formatStructuredValue(delta.current)} desired=${formatStructuredValue(delta.desired)}`)
.map(
(delta) =>
`${delta.field} current=${formatStructuredValue(delta.current)} desired=${formatStructuredValue(delta.desired)}`
)
.join("; ");
return `Refusing to reconcile stream ${audit.name}: structural mismatch (${details})`;
};
@ -447,16 +455,18 @@ const formatReportLine = (
case "retention_drift": {
const details = report.retentionDrift
.map((delta) => {
const desiredValue = delta.field === "max_age"
? formatDurationMs(millis(Number(delta.desired)))
: delta.field === "max_bytes"
? formatBytes(Number(delta.desired))
: formatStructuredValue(delta.desired);
const currentValue = delta.field === "max_age"
? formatDurationMs(millis(Number(delta.current)))
: delta.field === "max_bytes"
? formatBytes(Number(delta.current))
: formatStructuredValue(delta.current);
const desiredValue =
delta.field === "max_age"
? formatDurationMs(millis(Number(delta.desired)))
: delta.field === "max_bytes"
? formatBytes(Number(delta.desired))
: formatStructuredValue(delta.desired);
const currentValue =
delta.field === "max_age"
? formatDurationMs(millis(Number(delta.current)))
: delta.field === "max_bytes"
? formatBytes(Number(delta.current))
: formatStructuredValue(delta.current);
return `${delta.field}:${currentValue}->${desiredValue}`;
})
.join(" ");
@ -464,7 +474,10 @@ const formatReportLine = (
}
case "structural_mismatch": {
const details = report.structuralMismatch
.map((delta) => `${delta.field}:${formatStructuredValue(delta.current)}->${formatStructuredValue(delta.desired)}`)
.map(
(delta) =>
`${delta.field}:${formatStructuredValue(delta.current)}->${formatStructuredValue(delta.desired)}`
)
.join(" ");
return `${report.name} structural-mismatch ${details}`;
}

View file

@ -59,7 +59,9 @@ export const STREAM_CATALOG: readonly KnownStreamDefinition[] = [
{ name: STREAM_NEWS, subject: SUBJECT_NEWS, retentionClass: "derived" }
];
const STREAM_CATALOG_BY_NAME = new Map(STREAM_CATALOG.map((definition) => [definition.name, definition]));
const STREAM_CATALOG_BY_NAME = new Map(
STREAM_CATALOG.map((definition) => [definition.name, definition])
);
export const getKnownStreamDefinitions = (): readonly KnownStreamDefinition[] => {
return STREAM_CATALOG;

View file

@ -11,44 +11,31 @@ export const SYNTHETIC_CONTROL_GLOBAL_KEY = "global";
const codec = JSONCodec<SyntheticControlState>();
const decodeSyntheticControlEntry = (
entry: KvEntry | null | undefined
): SyntheticControlState => {
const decodeSyntheticControlEntry = (entry: KvEntry | null | undefined): SyntheticControlState => {
if (!entry || entry.operation !== "PUT") {
return DEFAULT_SYNTHETIC_CONTROL_STATE;
}
return SyntheticControlStateSchema.parse(entry.json());
};
export const openSyntheticControlKv = async (
js: JetStreamClient
): Promise<KV> => {
export const openSyntheticControlKv = async (js: JetStreamClient): Promise<KV> => {
return js.views.kv(SYNTHETIC_CONTROL_BUCKET, {
description: "Hosted synthetic market internal control state",
history: 8
});
};
export const readSyntheticControlState = async (
kv: KV
): Promise<SyntheticControlState> => {
return decodeSyntheticControlEntry(
await kv.get(SYNTHETIC_CONTROL_GLOBAL_KEY)
);
export const readSyntheticControlState = async (kv: KV): Promise<SyntheticControlState> => {
return decodeSyntheticControlEntry(await kv.get(SYNTHETIC_CONTROL_GLOBAL_KEY));
};
export const ensureSyntheticControlState = async (
kv: KV
): Promise<SyntheticControlState> => {
export const ensureSyntheticControlState = async (kv: KV): Promise<SyntheticControlState> => {
const current = await kv.get(SYNTHETIC_CONTROL_GLOBAL_KEY);
if (current && current.operation === "PUT") {
return SyntheticControlStateSchema.parse(current.json());
}
await kv.put(
SYNTHETIC_CONTROL_GLOBAL_KEY,
codec.encode(DEFAULT_SYNTHETIC_CONTROL_STATE)
);
await kv.put(SYNTHETIC_CONTROL_GLOBAL_KEY, codec.encode(DEFAULT_SYNTHETIC_CONTROL_STATE));
return DEFAULT_SYNTHETIC_CONTROL_STATE;
};
@ -57,10 +44,7 @@ export const writeSyntheticControlState = async (
control: Partial<SyntheticControlState>
): Promise<SyntheticControlState> => {
const normalized = normalizeSyntheticControlState(control);
await kv.put(
SYNTHETIC_CONTROL_GLOBAL_KEY,
codec.encode(normalized)
);
await kv.put(SYNTHETIC_CONTROL_GLOBAL_KEY, codec.encode(normalized));
return normalized;
};

View file

@ -43,10 +43,9 @@ const buildMockStreamManager = (configs: Record<string, StreamConfig | null>) =>
};
const buildAllKnownConfigs = (env: Record<string, string | undefined> = {}) => {
return Object.fromEntries(STREAMS.map((name) => [name, buildKnownStreamConfig(name, env)])) as Record<
string,
StreamConfig
>;
return Object.fromEntries(
STREAMS.map((name) => [name, buildKnownStreamConfig(name, env)])
) as Record<string, StreamConfig>;
};
describe("jetstream retention defaults", () => {
@ -194,7 +193,9 @@ describe("runReconcileStreamsCommand", () => {
});
expect(exitCode).toBe(1);
expect(outputs.some((line) => line.includes("OPTIONS_PRINTS") && line.includes("drift"))).toBe(true);
expect(outputs.some((line) => line.includes("OPTIONS_PRINTS") && line.includes("drift"))).toBe(
true
);
});
it("updates drift in --apply mode and reports actions", async () => {
@ -240,7 +241,11 @@ describe("runReconcileStreamsCommand", () => {
});
expect(exitCode).toBe(1);
expect(outputs.some((line) => line.includes("OPTIONS_PRINTS") && line.includes("structural-mismatch"))).toBe(true);
expect(
outputs.some(
(line) => line.includes("OPTIONS_PRINTS") && line.includes("structural-mismatch")
)
).toBe(true);
expect(errors.some((line) => line.includes("OPTIONS_PRINTS"))).toBe(true);
});
});