fix: route workspace CRUD through addressed publication

This commit is contained in:
2026-08-11 18:30:06 +02:00
parent 4a0ec61da3
commit 29a2e507a9
5 changed files with 120 additions and 35 deletions
+22 -6
View File
@@ -206,14 +206,30 @@ export async function runUnderOrderedWorkspaceWriterLocks<T>(rootLeases: readonl
const sorted = [...rootLeases].sort((a, b) => a.identity.workspaceId.localeCompare(b.identity.workspaceId)); if (new Set(sorted.map(x => x.identity.workspaceId)).size !== sorted.length) throw fail();
const caps: WorkspaceWriterLockCapability[] = []; let set: OrderedWorkspaceWriterCapabilitySet | undefined; let result: T | undefined; let callbackError: unknown;
try {
for (const source of sorted) { const root = source.transfer(); let writer: WorkspaceRootLock | undefined; try { writer = await root.acquireWriterLock(); caps.push(makeWriterCapability(root.identity.workspaceId, root.identity, root, writer)); } catch (error) { try { writer?.close(); } catch {} try { await root.close(); } catch {} throw error; } }
set = OrderedWorkspaceWriterCapabilitySet[INTERNAL_STATE](new Map(caps.map(c => [c.workspaceId, c])));
for (const capability of caps) capability.assertWriterPath();
try { result = await action(set); for (const capability of caps) capability.assertWriterPath(); }
catch (error) { callbackError = error; }
for (const source of sorted) {
const root = source.transfer();
let writer: WorkspaceRootLock | undefined;
try {
writer = await root.acquireWriterLock();
caps.push(makeWriterCapability(root.identity.workspaceId, root.identity, root, writer));
} catch (error) {
try { writer?.close(); } catch {}
try { await root.close(); } catch {}
callbackError = error;
break;
}
}
if (!callbackError) {
set = OrderedWorkspaceWriterCapabilitySet[INTERNAL_STATE](new Map(caps.map(c => [c.workspaceId, c])));
for (const capability of caps) capability.assertWriterPath();
try { result = await action(set); for (const capability of caps) capability.assertWriterPath(); }
catch (error) { callbackError = error; }
}
} catch (error) { callbackError ??= error; }
set?.invalidate();
for (const cap of [...caps].reverse()) await cap.close().catch(() => undefined);
for (const cap of [...caps].reverse()) {
try { await cap.close(); } catch (error) { callbackError ??= error; }
}
if (callbackError) throw callbackError; return result as T;
}
export function runUnderWorkspaceWriterLock<T>(rootLease: VerifiedWorkspaceLockRootLease, action: (capability: WorkspaceWriterLockCapability) => Promise<T>) { return runUnderOrderedWorkspaceWriterLocks([rootLease], set => set.forWorkspace(rootLease.identity.workspaceId, x => action(x.writerCapability))); }