Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Events

Client.events is the event stream for a client protocol.

Events arrive as a tagged union keyed by _tag.

Effect.gen(function* () {
  yield* TicTacToeClient.events.pipe(
    Stream.runForEach(
      Effect.fn(function* (event) {
        switch (event._tag) {
          case "AwaitingPartner": {
            break
          }
          case "GameStarted": {
            const { player } = event
            break
          }
          case "MoveMade": {
            const { player, position } = event
            break
          }
          case "GameEnded": {
            const { winner } = event
            break
          }
        }
      }),
    ),
  )
})

For larger apps, many screens should not consume Client.events directly. Feed the event stream into an Client State instead.

Replay

Replay only affects client.events.

Client.layerSocket({
  client: TicTacToeClient,
  url: "/play",
  replay: {
    mode: "startup",
    limit: 16,
  },
})

Important details:

  • No replay: subscribers only see events once they are connected.
  • mode: "startup": the first subscriber gets the buffered events once.
  • mode: "all-subscribers": every subscriber gets the buffer.
  • limit caps buffer size. When omitted, the buffer is unbounded.
  • Method successes and failures are never replayed.