fix: route workspace CRUD through addressed publication
This commit is contained in:
@@ -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))); }
|
||||
|
||||
Reference in New Issue
Block a user