Skip to content

Commit 56323b4

Browse files
committed
refactor: extract session affinity wrapper
1 parent ce5f910 commit 56323b4

3 files changed

Lines changed: 80 additions & 4 deletions

File tree

index.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ import {
220220
ensureRefreshGuardianState,
221221
ensureSessionAffinityState,
222222
} from "./lib/runtime/runtime-services.js";
223+
import { ensureSessionAffinityEntry } from "./lib/runtime/session-affinity-entry.js";
223224
import { applyAccountStorageScopeFromConfig } from "./lib/runtime/storage-scope.js";
224225
import {
225226
applyUiRuntimeFromConfig,
@@ -610,14 +611,16 @@ export const OpenAIOAuthPlugin: Plugin = async ({ client }: PluginInput) => {
610611
const ensureSessionAffinity = (
611612
pluginConfig: ReturnType<typeof loadPluginConfig>,
612613
): void => {
613-
const next = ensureSessionAffinityState({
614-
enabled: getSessionAffinity(pluginConfig),
615-
ttlMs: getSessionAffinityTtlMs(pluginConfig),
616-
maxEntries: getSessionAffinityMaxEntries(pluginConfig),
614+
const next = ensureSessionAffinityEntry({
615+
pluginConfig,
617616
currentStore: sessionAffinityStore,
618617
currentConfigKey: sessionAffinityConfigKey,
618+
getSessionAffinity,
619+
getSessionAffinityTtlMs,
620+
getSessionAffinityMaxEntries,
619621
createStore: ({ ttlMs, maxEntries }) =>
620622
new SessionAffinityStore({ ttlMs, maxEntries }),
623+
ensureSessionAffinityState,
621624
});
622625
sessionAffinityStore = next.sessionAffinityStore;
623626
sessionAffinityConfigKey = next.sessionAffinityConfigKey;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
export function ensureSessionAffinityEntry<TStore>(params: {
2+
pluginConfig: ReturnType<typeof import("../config.js").loadPluginConfig>;
3+
currentStore: TStore | null;
4+
currentConfigKey: string | null;
5+
getSessionAffinity: (
6+
config: ReturnType<typeof import("../config.js").loadPluginConfig>,
7+
) => boolean;
8+
getSessionAffinityTtlMs: (
9+
config: ReturnType<typeof import("../config.js").loadPluginConfig>,
10+
) => number;
11+
getSessionAffinityMaxEntries: (
12+
config: ReturnType<typeof import("../config.js").loadPluginConfig>,
13+
) => number;
14+
createStore: (options: { ttlMs: number; maxEntries: number }) => TStore;
15+
ensureSessionAffinityState: (args: {
16+
enabled: boolean;
17+
ttlMs: number;
18+
maxEntries: number;
19+
currentStore: TStore | null;
20+
currentConfigKey: string | null;
21+
createStore: (options: { ttlMs: number; maxEntries: number }) => TStore;
22+
}) => {
23+
sessionAffinityStore: TStore | null;
24+
sessionAffinityConfigKey: string | null;
25+
};
26+
}): {
27+
sessionAffinityStore: TStore | null;
28+
sessionAffinityConfigKey: string | null;
29+
} {
30+
return params.ensureSessionAffinityState({
31+
enabled: params.getSessionAffinity(params.pluginConfig),
32+
ttlMs: params.getSessionAffinityTtlMs(params.pluginConfig),
33+
maxEntries: params.getSessionAffinityMaxEntries(params.pluginConfig),
34+
currentStore: params.currentStore,
35+
currentConfigKey: params.currentConfigKey,
36+
createStore: params.createStore,
37+
});
38+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { describe, expect, it, vi } from "vitest";
2+
import { ensureSessionAffinityEntry } from "../lib/runtime/session-affinity-entry.js";
3+
4+
describe("session affinity entry", () => {
5+
it("delegates config-derived arguments into the session affinity state helper", () => {
6+
const ensureSessionAffinityState = vi.fn(() => ({
7+
sessionAffinityStore: { id: 1 },
8+
sessionAffinityConfigKey: "1000:10",
9+
}));
10+
11+
const result = ensureSessionAffinityEntry({
12+
pluginConfig: {} as never,
13+
currentStore: null,
14+
currentConfigKey: null,
15+
getSessionAffinity: () => true,
16+
getSessionAffinityTtlMs: () => 1000,
17+
getSessionAffinityMaxEntries: () => 10,
18+
createStore: vi.fn(() => ({ id: 1 })),
19+
ensureSessionAffinityState,
20+
});
21+
22+
expect(ensureSessionAffinityState).toHaveBeenCalledWith({
23+
enabled: true,
24+
ttlMs: 1000,
25+
maxEntries: 10,
26+
currentStore: null,
27+
currentConfigKey: null,
28+
createStore: expect.any(Function),
29+
});
30+
expect(result).toEqual({
31+
sessionAffinityStore: { id: 1 },
32+
sessionAffinityConfigKey: "1000:10",
33+
});
34+
});
35+
});

0 commit comments

Comments
 (0)