import type { JoinToken, MutableAtomToken, RegularAtomFamilyToken, } from "atom.io" import { atomFamily, join, mutableAtom } from "atom.io" import type { Hierarchy } from "atom.io/experiments/realms" import type { RoomKey, Socket, SocketKey, UserKey } from "atom.io/realtime" import { isSocketKey, isUserKey } from "atom.io/realtime" import { UList } from "atom.io/transceivers/u-list" export type SocketSystemHierarchy = Hierarchy< [ { above: `root` below: [UserKey, SocketKey, RoomKey] }, ] > export const socketAtoms: RegularAtomFamilyToken = atomFamily({ key: `socket`, default: null, }) export const socketKeysAtom: MutableAtomToken> = mutableAtom({ key: `socketKeys`, class: UList, }) export const onlineUsersAtom: MutableAtomToken> = mutableAtom({ key: `onlineUsers`, class: UList, }) export const usersOfSockets: JoinToken< `user`, UserKey, `socket`, SocketKey, `1:n` > = join({ key: `usersOfSockets`, between: [`user`, `socket`], cardinality: `1:n`, isAType: isUserKey, isBType: isSocketKey, })