import type * as AtomIO from "atom.io" import type { Canonical } from "atom.io/foundations/canonical" import type { AsJSON, SignalFrom, Store, Transceiver } from "atom.io/internal" import { findInStore, getJsonTokenFromStore, getUpdateToken, setIntoStore, } from "atom.io/internal" import { employSocket, type Socket } from "atom.io/realtime" import { createSubscriber } from "./create-subscriber.ts" export function pullMutableAtomFamilyMember< T extends Transceiver, K extends Canonical, >( store: Store, socket: Socket, family: AtomIO.MutableAtomFamilyToken, key: NoInfer, ): () => void { const token = findInStore(store, family, key) const jsonToken = getJsonTokenFromStore(store, token) const trackerToken = getUpdateToken(token) return createSubscriber(socket, token.key, () => { const stopWatchingForInit = employSocket( socket, `init:${token.key}`, (data: AsJSON) => { setIntoStore(store, jsonToken, data) }, ) const stopWatchingForUpdate = employSocket( socket, `next:${token.key}`, (data: SignalFrom) => { setIntoStore(store, trackerToken, data) }, ) socket.emit(`sub:${family.key}`, key) return () => { socket.emit(`unsub:${token.key}`) stopWatchingForInit() stopWatchingForUpdate() } }) }