History

Classify missing provider bindings

Julius Marminge committed 4 months ago

Commit d59b5911 parent 4934dc23 files · +28 −6Browse files

Unified · Split

3 files
  1. apps/server/src/provider/Errors.ts +2 −0
  2. apps/server/src/provider/ProviderSessionDirectory.test.ts +12 −0
  3. apps/server/src/provider/ProviderSessionDirectory.ts +14 −6
apps/server/src/provider/Errors.ts+2−0
@@ -171,6 +171,8 @@ export class ProviderSessionNotFoundError extends Schema.TaggedErrorClass<Provid · 170 unmodified lines
171 }171 }
172}172}
173 173
174export const isProviderSessionNotFoundError = Schema.is(ProviderSessionNotFoundError);
175
174/**176/**
175 * ProviderSessionDirectoryPersistenceError - Session directory persistence failure.177 * ProviderSessionDirectoryPersistenceError - Session directory persistence failure.
176 */178 */
apps/server/src/provider/ProviderSessionDirectory.test.ts+12−0
@@ -17,6 +17,7 @@ import { · 16 unmodified lines
17 SqlitePersistenceMemory,17 SqlitePersistenceMemory,
18} from "../persistence/Layers/Sqlite.ts";18} from "../persistence/Layers/Sqlite.ts";
19import * as ProviderSessionRuntime from "../persistence/ProviderSessionRuntime.ts";19import * as ProviderSessionRuntime from "../persistence/ProviderSessionRuntime.ts";
20import { isProviderSessionNotFoundError } from "./Errors.ts";
20import * as ProviderSessionDirectory from "./ProviderSessionDirectory.ts";21import * as ProviderSessionDirectory from "./ProviderSessionDirectory.ts";
21 22
22function makeDirectoryLayer<E, R>(persistenceLayer: Layer.Layer<SqlClient.SqlClient, E, R>) {23function makeDirectoryLayer<E, R>(persistenceLayer: Layer.Layer<SqlClient.SqlClient, E, R>) {
@@ -76,6 +77,17 @@ it.layer(makeDirectoryLayer(SqlitePersistenceMemory))("ProviderSessionDirectoryL · 53 unmodified lines
76 assert.deepEqual(threadIds, [nextThreadId]);77 assert.deepEqual(threadIds, [nextThreadId]);
77 }));78 }));
78 79
80 it("reports a missing provider binding as a domain not-found error", () =>
81 Effect.gen(function* () {
82 const directory = yield* ProviderSessionDirectory.ProviderSessionDirectory;
83 const threadId = ThreadId.make("thread-missing");
84
85 const error = yield* directory.getProvider(threadId).pipe(Effect.flip);
86
87 assert(isProviderSessionNotFoundError(error));
88 assert.equal(error.threadId, threadId);
89 }));
90
79 it("persists runtime fields and merges payload updates", () =>91 it("persists runtime fields and merges payload updates", () =>
80 Effect.gen(function* () {92 Effect.gen(function* () {
81 const directory = yield* ProviderSessionDirectory.ProviderSessionDirectory;93 const directory = yield* ProviderSessionDirectory.ProviderSessionDirectory;
apps/server/src/provider/ProviderSessionDirectory.ts+14−6
@@ -13,7 +13,11 @@ import * as Layer from "effect/Layer"; · 12 unmodified lines
13import * as Option from "effect/Option";13import * as Option from "effect/Option";
14import * as Schema from "effect/Schema";14import * as Schema from "effect/Schema";
15 15
16import { ProviderSessionDirectoryPersistenceError, ProviderValidationError } from "./Errors.ts";16import {
17 ProviderSessionDirectoryPersistenceError,
18 ProviderSessionNotFoundError,
19 ProviderValidationError,
20} from "./Errors.ts";
17import * as ProviderSessionRuntime from "../persistence/ProviderSessionRuntime.ts";21import * as ProviderSessionRuntime from "../persistence/ProviderSessionRuntime.ts";
18 22
19export interface ProviderRuntimeBinding {23export interface ProviderRuntimeBinding {
@@ -36,7 +40,9 @@ export interface ProviderRuntimeBindingWithMetadata extends ProviderRuntimeBindi · 16 unmodified lines
36 readonly lastSeenAt: string;40 readonly lastSeenAt: string;
37}41}
38 42
39export type ProviderSessionDirectoryReadError = ProviderSessionDirectoryPersistenceError;43export type ProviderSessionDirectoryReadError =
44 | ProviderSessionDirectoryPersistenceError
45 | ProviderSessionNotFoundError;
40 46
41export type ProviderSessionDirectoryWriteError =47export type ProviderSessionDirectoryWriteError =
42 | ProviderValidationError48 | ProviderValidationError
@@ -53,7 +59,10 @@ export class ProviderSessionDirectory extends Context.Service< · 10 unmodified lines
53 ) => Effect.Effect<ProviderDriverKind, ProviderSessionDirectoryReadError>;59 ) => Effect.Effect<ProviderDriverKind, ProviderSessionDirectoryReadError>;
54 readonly getBinding: (60 readonly getBinding: (
55 threadId: ThreadId,61 threadId: ThreadId,
56 ) => Effect.Effect<Option.Option<ProviderRuntimeBinding>, ProviderSessionDirectoryReadError>;62 ) => Effect.Effect<
63 Option.Option<ProviderRuntimeBinding>,
64 ProviderSessionDirectoryPersistenceError
65 >;
57 readonly listThreadIds: () => Effect.Effect<66 readonly listThreadIds: () => Effect.Effect<
58 ReadonlyArray<ThreadId>,67 ReadonlyArray<ThreadId>,
59 ProviderSessionDirectoryPersistenceError68 ProviderSessionDirectoryPersistenceError
@@ -222,9 +231,8 @@ export const make = Effect.gen(function* () { · 162 unmodified lines
222 onSome: (value) => Effect.succeed(value.provider),231 onSome: (value) => Effect.succeed(value.provider),
223 onNone: () =>232 onNone: () =>
224 Effect.fail(233 Effect.fail(
225 new ProviderSessionDirectoryPersistenceError({234 new ProviderSessionNotFoundError({
226 operation: "ProviderSessionDirectory.getProvider",235 threadId,
227 detail: `No persisted provider binding found for thread '${threadId}'.`,
228 }),236 }),
229 ),237 ),
230 }),238 }),