Skip to content

Commit 1963e41

Browse files
committed
Fix non-atomic ref update race and options spread signal override
- ProviderRegistry: Use Ref.modify for atomic read-modify-write in upsertProviders to prevent concurrent provider data loss when multiple fibers update providersRef simultaneously. - Desktop main: Reorder spread in waitForBackendHttpReady so the internal abort controller signal always takes precedence over any signal passed via options.
1 parent 9f02bea commit 1963e41

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

apps/desktop/src/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ async function waitForBackendHttpReady(
365365

366366
try {
367367
await waitForHttpReady(baseUrl, {
368-
signal: controller.signal,
369368
...options,
369+
signal: controller.signal,
370370
});
371371
} finally {
372372
if (backendReadinessAbortController === controller) {

apps/server/src/provider/Layers/ProviderRegistry.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,21 @@ export const ProviderRegistryLive = Layer.effect(
108108
readonly publish?: boolean;
109109
},
110110
) {
111-
const previousProviders = yield* Ref.get(providersRef);
112-
const mergedProviders = new Map(
113-
previousProviders.map((provider) => [provider.provider, provider] as const),
114-
);
111+
const [previousProviders, providers] = yield* Ref.modify(
112+
providersRef,
113+
(previousProviders) => {
114+
const mergedProviders = new Map(
115+
previousProviders.map((provider) => [provider.provider, provider] as const),
116+
);
115117

116-
for (const provider of nextProviders) {
117-
mergedProviders.set(provider.provider, provider);
118-
}
118+
for (const provider of nextProviders) {
119+
mergedProviders.set(provider.provider, provider);
120+
}
119121

120-
const providers = orderProviderSnapshots([...mergedProviders.values()]);
121-
yield* Ref.set(providersRef, providers);
122+
const providers = orderProviderSnapshots([...mergedProviders.values()]);
123+
return [[previousProviders, providers] as const, providers];
124+
},
125+
);
122126

123127
if (haveProvidersChanged(previousProviders, providers)) {
124128
yield* Effect.forEach(nextProviders, persistProvider, {

0 commit comments

Comments
 (0)