Skip to report

Durable event streams connect the client and Cloudflare

Trace oRPC’s durable event iterator through shared token schemas, its WebSocket client, and Cloudflare Durable Object handlers.

middleapi/orpc #668 · PR by dinwwwh · Merged

middleapi/orpc 32e1281f..866cc1e5

base and head as given

  • Durable event streaming entered the product as a new package
  • Cloudflare chat now depends on the worker's application router
  • A token-signing dependency entered durable event streaming
  • Reconnectable WebSocket support entered durable event streaming
files changed
49
in a component
26
lines in components
1,238
components
8
public routes changed
0
schema statements
0
new dependencies
6
excluded by role
23
Based on 12 of 26 eligible changed files

Durable event streaming

Added
Before
did not exist
After
signed durable iterators are available

Applications can return a signed asynchronous event iterator from an RPC call. Clients open a reconnecting WebSocket for events, replay retained events after reconnecting, and can call only token-listed iterator methods remotely.

In favour

  • In favour: Restricts remote iterator calls to token-listed methods
  • In favour: Retains recent events for reconnect recovery

Against

  • Against: Root and client layers form a 10-edge import cycle

Chat room transport

Modified
Before
Chat opened a dedicated WebSocket
After
Chat uses shared RPC and iterator plugin

The chat screen now requests its event stream through the application's shared RPC client and receives an asynchronous iterator. Messages continue to be sent through the same client while the worker upgrades event connections through the durable iterator layer.

In favour

  • In favour: Uses one client path for chat requests and events

The model found nothing to weigh against this.

Files changed in 8 components (6 shown). Dependencies shown: 5 new, 1 removed, 1 unchanged
unchanged · 1new · 5removed · 13 components added

5 new dependencies between components — Durable Objects → Event Iterator API · Event Iterator API → Event Iterator Client · Event Iterator Client → Event Iterator API · Durable Objects → Event Iterator Client · Chat Room Library → Worker Routing

1 dependency no longer there — Chat Room Library → Chat Room Objects

What else could behave differently

7 components · 20 files

These components import changed code, directly or through other files. A traced dependency is a place to review, not a confirmed runtime failure.

Reached 3

ComponentSymbolCited atFilesReached by
Chat Room Libraryplaygrounds/cloudflare-worker/src/lib/Removed 1 of 3 changed symbols reaching itplaygrounds/cloudflare-worker/worker/dos/chat-room.ts:17-37before22 direct
Trace path

Shortest component path from the changed symbol:

  1. Chat Room Objects
  2. Chat Room Library

Later steps follow file imports; they do not prove this symbol is called.

Event Iterator APIpackages/durable-event-iterator/src/Added 1 of 12 changed symbols reaching itpackages/durable-event-iterator/src/client/event-iterator.ts:24-3154 direct · 1 at two steps
Trace path

Shortest component path from the changed symbol:

  1. Event Iterator Client
  2. Event Iterator API

Later steps follow file imports; they do not prove this symbol is called.

Worker Routingplaygrounds/cloudflare-worker/worker/Signature changed playgrounds/cloudflare-worker/worker/dos/chat-room.ts:5-1811 direct
Trace path

Shortest component path from the changed symbol:

  1. Chat Room Objects
  2. Worker Routing

Later steps follow file imports; they do not prove this symbol is called.

Ranked lower 4

ComponentFilesReached by
packages/durable-event-iterator/src/client/43 direct · 1 at two steps
packages/durable-event-iterator/src/durable-object/54 direct · 1 at two steps
playgrounds/cloudflare-worker/src/21 direct · 1 at two steps
playgrounds/cloudflare-worker/src/components/11 direct

Statements 3

Removing the chat-room router reached 2 files in the Chat Room Library. 2
playgrounds/cloudflare-worker/worker/dos/chat-room.ts:17-37before
Adding ClientDurableEventIterator reached 5 files in the Event Iterator API. 41
packages/durable-event-iterator/src/client/event-iterator.ts:24-31
ChatRoom's signature change reached 1 file in Worker Routing. 1
playgrounds/cloudflare-worker/worker/dos/chat-room.ts:5-18

9 reached files belong to no component — tests, docs and config.

Routes, schema, dependencies

WhatObjectWhere
+ dependency@cloudflare/workers-types@^4.20250617.0declared, and used by no file in any component
+ dependency@orpc/experimental-durable-event-iterator@nextplaygrounds/cloudflare-worker/worker/index.ts:3
+ dependency@types/better-sqlite3@^7.6.13declared, and used by no file in any component
+ dependencybetter-sqlite3@^12.0.0declared, and used by no file in any component
+ dependencyjose@^6.0.11packages/durable-event-iterator/src/client/event-iterator.ts:6
+ dependencypartysocket@^1.1.4packages/durable-event-iterator/src/client/plugin.ts:12
6 statements, with the lines behind them
Declared, and used by no file in any component.
@orpc/experimental-durable-event-iterator version next was added.
playgrounds/cloudflare-worker/worker/index.ts:3
Declared, and used by no file in any component.
Declared, and used by no file in any component.
partysocket version ^1.1.4 was added.
packages/durable-event-iterator/src/client/plugin.ts:12

Inspect components, files and symbols

Component

Chat Room ObjectsModified
playgrounds/cloudflare-worker/worker/dos/

1 file · 81 lines

exports, dependency, 1 dependent

Chat Room Objects removed the router export.

Chat room transport, modified

Chat Room LibraryModified
playgrounds/cloudflare-worker/src/lib/

2 files · 32 lines

exports, dependency, 1 dependent

The Chat Room Library added client and removed chatRoomClient from its exports.
One Chat Room Library file was dissolved, and Git tracked 0 moves as renames.

Chat room transport, modified

Event Iterator APIAdded
packages/durable-event-iterator/src/

8 files · 327 lines

dependency, 2 dependents

The Event Iterator API added 13 exports.

Durable event streaming, added

Worker RoutingModified
playgrounds/cloudflare-worker/worker/

1 file · 63 lines

dependency, 1 dependent

Worker Routing added the router export.

Chat room transport, modified

Event Iterator ClientAdded
packages/durable-event-iterator/src/client/

5 files · 237 lines

dependency, 2 dependents

The Event Iterator Client added 10 exports.

Durable event streaming, added

Durable ObjectsAdded
packages/durable-event-iterator/src/durable-object/

7 files · 484 lines

dependency

Durable Objects added 14 exports.

Durable event streaming, added

Shared UtilitiesModified
packages/shared/src/

1 file · 2 lines

1 dependent

ranked lower · 0.09

Shared Utilities added the JsonValue export.

Durable event streaming, added

Chat Room ComponentsModified
playgrounds/cloudflare-worker/src/components/

1 file · 12 lines

1 dependent

ranked lower · 0.07

Chat room transport, modified

File

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/event-iterator.ts

+108 −0

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/event-iterator.test-d.ts

+81 −0

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/plugin.ts

+70 −0

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/object.ts

+24 −0

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/object.test-d.ts

+19 −0

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/schemas.ts

+17 −0

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/index.ts

+5 −0

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/consts.ts

+3 −0

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/plugin.ts

+124 −0

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/event-iterator.ts

+80 −0

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/event-iterator.test-d.ts

+18 −0

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/contract.ts

+13 −0

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/index.ts

+2 −0

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/event-storage.ts

+145 −0

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/object.ts

+104 −0

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/websocket-manager.ts

+103 −0

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/upgrade.ts

+66 −0

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/handler.ts

+59 −0

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/index.ts

+5 −0

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/consts.ts

+2 −0

Durable event streaming, added

Shared Utilitiespackages/shared/src/
packages/shared/src/index.ts

+1 −1

Durable event streaming, added

Chat Room Objectsplaygrounds/cloudflare-worker/worker/dos/
playgrounds/cloudflare-worker/worker/dos/chat-room.ts

+12 −69

Chat room transport, modified

Chat Room Libraryplaygrounds/cloudflare-worker/src/lib/
playgrounds/cloudflare-worker/src/lib/chat-room.ts

+0 −16

Chat room transport, modified

Chat Room Libraryplaygrounds/cloudflare-worker/src/lib/
playgrounds/cloudflare-worker/src/lib/orpc.ts

+16 −0

Chat room transport, modified

Worker Routingplaygrounds/cloudflare-worker/worker/
playgrounds/cloudflare-worker/worker/index.ts

+50 −13

Chat room transport, modified

Chat Room Componentsplaygrounds/cloudflare-worker/src/components/
playgrounds/cloudflare-worker/src/components/chat-room.tsx

+8 −4

Chat room transport, modified

Function

imports what changeddownstream of it, one mark per step

durableEventIteratorContract()packages/durable-event-iterator/src/client/contract.ts

reaches 2 components

Adding durableEventIteratorContract reached 4 files in the Event Iterator Client. 31
packages/durable-event-iterator/src/client/contract.ts:5-13
Adding durableEventIteratorContract reached 5 files in Durable Objects. 41
packages/durable-event-iterator/src/client/contract.ts:5-13

Durable event streaming, added

Diff

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/event-iterator.ts

1–108

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/event-iterator.test-d.ts

1–81

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/plugin.ts

1–70

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/object.ts

1–24

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/object.test-d.ts

1–19

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/schemas.ts

1–17

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/index.ts

1–5

Durable event streaming, added

Event Iterator APIpackages/durable-event-iterator/src/
packages/durable-event-iterator/src/consts.ts

1–3

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/plugin.ts

1–124

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/event-iterator.ts

1–80

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/event-iterator.test-d.ts

1–18

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/contract.ts

1–13

Durable event streaming, added

Event Iterator Clientpackages/durable-event-iterator/src/client/
packages/durable-event-iterator/src/client/index.ts

1–2

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/event-storage.ts

1–145

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/object.ts

1–104

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/websocket-manager.ts

1–103

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/upgrade.ts

1–66

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/handler.ts

1–59

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/index.ts

1–5

Durable event streaming, added

Durable Objectspackages/durable-event-iterator/src/durable-object/
packages/durable-event-iterator/src/durable-object/consts.ts

1–2

Durable event streaming, added

Shared Utilitiespackages/shared/src/
packages/shared/src/index.ts

16–16

Durable event streaming, added

Chat Room Objectsplaygrounds/cloudflare-worker/worker/dos/
playgrounds/cloudflare-worker/worker/dos/chat-room.ts

1–2, 5–12, 15–16

Chat room transport, modified

Chat Room Libraryplaygrounds/cloudflare-worker/src/lib/
playgrounds/cloudflare-worker/src/lib/chat-room.ts

1–16

Chat room transport, modified

Chat Room Libraryplaygrounds/cloudflare-worker/src/lib/
playgrounds/cloudflare-worker/src/lib/orpc.ts

1–16

Chat room transport, modified

Worker Routingplaygrounds/cloudflare-worker/worker/
playgrounds/cloudflare-worker/worker/index.ts

1–35, 37–44, 47–53

Chat room transport, modified

Chat Room Componentsplaygrounds/cloudflare-worker/src/components/
playgrounds/cloudflare-worker/src/components/chat-room.tsx

2–2, 6–6, 12–16 and 1 more span

Chat room transport, modified

Analysis scope

1145 → 8
  1. 1,145
    files at head
  2. 117
    components
  3. 8
    changed by this change
  4. 6
    shown above of 8

Where the new files landed

21 new files
New fileBelongs toUsed byCallsServes
playgrounds/cloudflare-worker/src/lib/orpc.tsimports 1 package this change added
Chat Room Librarybase frame
Chat Room Components
Worker Routing
packages/durable-event-iterator/src/8 new filesimports 1 package this change added
Event Iterator APInew territory
Event Iterator ClientDurable Objects
Event Iterator Client
.
packages/durable-event-iterator/src/client/5 new filesimports 2 packages this change added
Event Iterator Clientnew territory
Event Iterator APIDurable Objects
Event Iterator API
./client
packages/durable-event-iterator/src/durable-object/7 new filesimports 1 package this change added
Durable Objectsnew territory
Event Iterator APIEvent Iterator Client
./durable-object

17 added files carry no component — 11 test, 4 config, 2 docs.

8components changed
1reached, not changed
3components added/removed
5dependencies added between components
1dependencies removed between components
0files moved to another path

49 files changed, 29 claims stated. 7 components reached in total.

naming: “model

narrative: “model

analyzer 0.1.0, config v1.9.0-phase8

Every line above is derived from 32e1281f..866cc1e5 and nothing else.