fix(autosave) : retry constellation version conflicts
This commit is contained in:
@@ -12,6 +12,22 @@ export type AutosaveStatus =
|
||||
| { state: "conflict"; currentVersion: number }
|
||||
| { state: "error"; message: string; issues?: string[] };
|
||||
|
||||
export async function saveWithConflictRetry<Value, Response extends { status: string; currentVersion?: number }>(
|
||||
save: (value: Value, expectedVersion: number) => Promise<Response>,
|
||||
value: Value,
|
||||
expectedVersion: number,
|
||||
): Promise<{ response: Response; version: number; retried: boolean }> {
|
||||
const first = await save(value, expectedVersion);
|
||||
if (first.status !== "conflict" || !first.currentVersion || first.currentVersion === expectedVersion) {
|
||||
return { response: first, version: expectedVersion, retried: false };
|
||||
}
|
||||
return {
|
||||
response: await save(value, first.currentVersion),
|
||||
version: first.currentVersion,
|
||||
retried: true,
|
||||
};
|
||||
}
|
||||
|
||||
interface AutosaveCoordinatorOptions<Draft, Payload, Snapshot> {
|
||||
initialVersion: number;
|
||||
createPayload: (draft: Draft, expectedVersion: number) => Payload;
|
||||
|
||||
Reference in New Issue
Block a user