@c1m-public/realtime
v0.1.1
Published
Realtime client and notification-inbox core for C1M surfaces. The root is framework-neutral (typed Ably client, token parsing, per-tab origin); ./react adds the status hook, provider factory and status dot; ./inbox adds the TanStack Query cache patches, t
Readme
@c1m-public/realtime
The realtime client and notification-inbox core shared by SaaSDash and the Platform Admin Center. Both apps had byte-identical copies of the Ably client, the token parser, the per-tab origin id and the cache patches; this is that code, once.
Entries
| Import | Contains | Peers |
|---|---|---|
| @c1m-public/realtime | createAblyRealtimeClient, parseRealtimeTokenPayload, RealtimeDisabledError, getRealtimeOrigin, REALTIME_ORIGIN_HEADER, types | ably (lazily imported at connect) |
| @c1m-public/realtime/react | useRealtimeStatus, createRealtimeProvider, RealtimeStatusDot | react |
| @c1m-public/realtime/inbox | useNotificationInbox, the cache patches, mountNotificationBridge, formatNotificationDate | react, @tanstack/react-query |
What stays in the app
Token fetching. Each surface has its own BFF route, session cookie and error
mapping, so it fetches the payload and hands it to parseRealtimeTokenPayload.
The package never imports next/*, so no entry can drag the Next runtime into
a bundle that does not want it.
Query keys and the transport. useNotificationInbox takes both, so one hook
serves a workspace inbox, a dash-level inbox and an operator inbox without
knowing which is which.
Notes
Tokens are minted by the backend with a five-minute TTL and are re-fetched on every Ably authorization callback, so workspace suspension and membership changes take effect on renewal rather than being replayed from a cached credential. The client never holds an API key.
The badge counts unseen notifications: rows with no seen_at and no
read_at. Opening a tray marks everything up to the newest rendered row seen;
reading or dismissing implies seen. Seen-all decrements the count by the number
of rows it changed rather than recomputing it from the cached page, because the
page holds at most limit items.
