Files
MikrotikManager/backend/src/services/ipsec-operation.ts
T

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>