Open History to see the last commit
1import { assert, it } from "@effect/vitest";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Schema from "effect/Schema";
5import * as Stream from "effect/Stream";
6import { HttpClient, HttpClientResponse } from "effect/http";
7import { describe } from "vite-plus/test";
8
9import * as OpenCode2Client from "@t3tools/provider-opencode/server/v2/OpenCode2Client";
10
11const encodeJson = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown));
12
13const layerServing = (events: ReadonlyArray<unknown>) =>
14 Layer.succeed(
15 HttpClient.HttpClient,
16 HttpClient.make((request) =>
17 Effect.succeed(
18 HttpClientResponse.fromWeb(
19 request,
20 new Response(events.map((event) => `data: ${encodeJson(event)}\n\n`).join(""), {
21 headers: { "content-type": "text/event-stream" },
22 }),
23 ),
24 ),
25 ),
26 );
27
28const connect = Effect.gen(function* () {
29 const opencode = yield* OpenCode2Client.OpenCode2Client;
30 return yield* opencode.connect({ baseUrl: "http://127.0.0.1:4096", password: "secret" });
31});
32
33describe("OpenCode2Client events", () => {
34 it.effect(
35 "keeps an execution's end and start it cannot decode, and skips other unknown events",
36 () =>
37 Effect.gen(function* () {
38 const { events } = yield* connect.pipe(
39 Effect.provide(
40 OpenCode2Client.layer.pipe(
41 Layer.provide(
42 layerServing([
43 {
44 id: "evt_1",
45 created: 1,
46 type: "session.hologram.projected",
47 data: { sessionID: "ses_x" },
48 },
49 {
50 id: "evt_0",
51 created: 1,
52 type: "session.execution.started",
53 data: { sessionID: "ses_x", lane: 7 },
54 durable: "not-an-envelope",
55 },
56 {
57 id: "evt_2",
58 created: 1,
59 type: "session.execution.interrupted",
60 data: { sessionID: "ses_x", reason: "budget" },
61 durable: { aggregateID: "ses_x", seq: 1, version: 1 },
62 },
63 ]),
64 ),
65 ),
66 ),
67 );
68 const received = yield* (yield* events).pipe(Stream.runCollect);
69 assert.deepStrictEqual(received, [
70 { type: "unreadable.execution.started", sessionID: "ses_x" },
71 {
72 type: "unreadable.execution.ended",
73 executionType: "session.execution.interrupted",
74 sessionID: "ses_x",
75 },
76 ]);
77 }),
78 );
79});