okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

nekomimi.petsession: publish text and thinking deltas once a frame, cheaper per-delta bookkeeping, replay window fits one response6b74a53

main
2.3 KiB57 linesraw
1/// Unicode eviction and replay gaps are impractical on the shared E2E event stream.
2import albedo/daemon/event_buffer as buffer
3import gleam/int
4import gleam/json
5import gleam/list
6import gleam/result
7import gleam/string
8import gleeunit/should
9
10/// Replayed events as the text a client receives: the buffer keeps them encoded.
11fn texts(replayed: Result(List(json.Json), Nil)) -> Result(List(String), Nil) {
12  result.map(replayed, list.map(_, json.to_string))
13}
14
15pub fn replay_is_ordered_and_only_a_gap_requires_reset_test() -> Nil {
16  let events =
17    int.range(1, 301, buffer.new(), fn(events, n) {
18      buffer.push(events, n, json.int(n))
19    })
20  buffer.since(events, 42, 300) |> should.equal(Error(Nil))
21  buffer.since(events, -1, 300) |> should.equal(Error(Nil))
22  buffer.since(events, 301, 300) |> should.equal(Error(Nil))
23  let assert Ok(retained) = buffer.since(events, 44, 300)
24  list.length(retained) |> should.equal(256)
25  list.first(retained) |> should.equal(Ok(json.int(45)))
26  buffer.since(events, 298, 300)
27  |> should.equal(Ok([json.int(299), json.int(300)]))
28  buffer.since(events, 300, 300) |> should.equal(Ok([]))
29  buffer.since(buffer.new(), 0, 0) |> should.equal(Ok([]))
30}
31
32pub fn byte_budget_evicts_oldest_without_splitting_unicode_test() -> Nil {
33  // Two of these fit the budget; a third event evicts the oldest.
34  let large = json.string(string.repeat("é", buffer.budget / 4 - 1))
35  let events =
36    buffer.new()
37    |> buffer.push(1, large)
38    |> buffer.push(2, large)
39  let large = json.to_string(large)
40  buffer.since(events, 0, 2) |> texts |> should.equal(Ok([large, large]))
41  let events = buffer.push(events, 3, json.string("next"))
42  buffer.since(events, 0, 3) |> should.equal(Error(Nil))
43  buffer.since(events, 1, 3)
44  |> texts
45  |> should.equal(Ok([large, "\"next\""]))
46}
47
48pub fn oversized_event_leaves_a_replay_gap_until_the_client_resets_test() -> Nil {
49  let events = buffer.new() |> buffer.push(1, json.string("before"))
50  let events =
51    buffer.push(events, 2, json.string(string.repeat("x", buffer.budget)))
52  buffer.since(events, 1, 2) |> should.equal(Error(Nil))
53  buffer.since(events, 2, 2) |> should.equal(Ok([]))
54  let events = buffer.push(events, 3, json.string("after"))
55  buffer.since(events, 1, 3) |> should.equal(Error(Nil))
56  buffer.since(events, 2, 3) |> texts |> should.equal(Ok(["\"after\""]))
57}