Skip to content

Commit 892382e

Browse files
committed
fix(usage): verify settings events and deduplicate failure notices
1 parent d65a0e3 commit 892382e

3 files changed

Lines changed: 43 additions & 4 deletions

File tree

‎apps/server/src/usage/UsageLimitSources.test.ts‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import * as Fiber from "effect/Fiber";
1010
import * as Duration from "effect/Duration";
1111
import * as Effect from "effect/Effect";
1212
import * as Layer from "effect/Layer";
13+
import * as Queue from "effect/Queue";
1314
import * as Ref from "effect/Ref";
1415
import * as Schema from "effect/Schema";
1516
import * as Stream from "effect/Stream";
@@ -116,7 +117,19 @@ const decodeProbe = Schema.decodeUnknownSync(
116117
);
117118
const encodeBody = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown));
118119
const makeHubTest = Effect.fn("test.makeHubTest")(function* (failed: string[] = []) {
119-
const settings = yield* ServerSettings.ServerSettingsService;
120+
const baseSettings = yield* ServerSettings.ServerSettingsService;
121+
const changeObserved = yield* Deferred.make<void>();
122+
const changes = yield* Queue.unbounded<import("@t3tools/contracts").ServerSettings>();
123+
const settings = {
124+
...baseSettings,
125+
streamChanges: Stream.fromQueue(changes).pipe(
126+
Stream.flatMap((next) =>
127+
Stream.make(next).pipe(Stream.ensuring(Deferred.succeed(changeObserved, undefined))),
128+
),
129+
),
130+
updateSettings: (...args: Parameters<typeof baseSettings.updateSettings>) =>
131+
baseSettings.updateSettings(...args).pipe(Effect.tap((next) => Queue.offer(changes, next))),
132+
};
120133
const readStarted = yield* Deferred.make<void>();
121134
const releaseRead = yield* Deferred.make<void>();
122135
const mode = yield* Ref.make({
@@ -196,7 +209,7 @@ const makeHubTest = Effect.fn("test.makeHubTest")(function* (failed: string[] =
196209
Stream.filter((snapshots) => snapshots.length === 1),
197210
Stream.runHead,
198211
);
199-
return { sources, settings, mode, readStarted, releaseRead };
212+
return { sources, settings, mode, readStarted, releaseRead, changeObserved };
200213
});
201214
const provideHubTest = <A, E>(
202215
effect: Effect.Effect<A, E, ServerSettings.ServerSettingsService | import("effect/Scope").Scope>,
@@ -328,7 +341,8 @@ it.effect(
328341
() =>
329342
provideHubTest(
330343
Effect.gen(function* () {
331-
const { sources, settings, mode, readStarted, releaseRead } = yield* makeHubTest();
344+
const { sources, settings, mode, readStarted, releaseRead, changeObserved } =
345+
yield* makeHubTest();
332346
yield* Ref.update(mode, (m) => ({ ...m, blocked: true, listFailed: true }));
333347
const pending = yield* sources.refresh.pipe(Effect.forkChild);
334348
yield* Deferred.await(readStarted);
@@ -339,6 +353,7 @@ it.effect(
339353
yield* Ref.update(mode, (m) => ({ ...m, blocked: false }));
340354
yield* Deferred.succeed(releaseRead, undefined);
341355
yield* Fiber.join(pending);
356+
yield* Deferred.await(changeObserved);
342357
yield* sources.refresh;
343358
expect((yield* sources.current)[0]?.accounts).toEqual([]);
344359
}),

‎packages/shared/src/usageLimits.test.ts‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,30 @@ describe("pools", () => {
232232
" (stale).",
233233
"hub: The hub could not read this account's usage.",
234234
]);
235+
expect(
236+
collectLimitNotices(
237+
new Map([
238+
[
239+
EnvironmentId.make("env-a"),
240+
{
241+
...laptop,
242+
serverConfig: {
243+
providers: [],
244+
usageLimitSources: [
245+
{
246+
...source,
247+
accounts: [
248+
accounts[1]!,
249+
{ ...accounts[1]!, id: "c.json", email: "[email protected]" },
250+
],
251+
},
252+
],
253+
},
254+
},
255+
],
256+
]),
257+
),
258+
).toEqual(["hub: The hub could not read this account's usage."]);
235259
const selected = provider({ driver: claude });
236260
const report = collectProviderUsageLimits(
237261
selected.instanceId,

‎packages/shared/src/usageLimits.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ export function collectLimitNotices(presentations: LimitPresentations): readonly
418418
}
419419
}
420420
}
421-
return notices;
421+
return [...new Set(notices)];
422422
}
423423

424424
export interface LimitPoolMember {

0 commit comments

Comments
 (0)