28 lines
1.1 KiB
TypeScript
28 lines
1.1 KiB
TypeScript
import { MikrotikClient, MikrotikError } from "./mikrotik.js"
|
|
|
|
/** Request-local evidence only: never claims that an unacknowledged request failed to apply. */
|
|
export function trackIpsecMutation(client: MikrotikClient) {
|
|
let confirmedWrites = 0, uncertainWrite = false, completed = false
|
|
const methods = client as unknown as Record<string, (...args: unknown[]) => Promise<unknown>>
|
|
for (const method of ["put", "patch", "delete", "post"]) {
|
|
const original = methods[method]!.bind(client)
|
|
methods[method] = async (...args) => {
|
|
try { const result = await original(...args); confirmedWrites++; return result }
|
|
catch (error) {
|
|
if (!(error instanceof MikrotikError && error.statusCode >= 400 && error.statusCode < 500)) uncertainWrite = true
|
|
throw error
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
client,
|
|
complete: () => { completed = true },
|
|
receipt: () => {
|
|
const state = completed ? "applied" : uncertainWrite ? "unknown" : confirmedWrites ? "partial" : undefined
|
|
return state ? { state, confirmedWrites, needsReview: true } : undefined
|
|
},
|
|
}
|
|
}
|
|
export type IpsecMutationProgress = ReturnType<typeof trackIpsecMutation>
|
|
|