UNPKG

@logux/client

Version:

Logux base components to build web client

78 lines (73 loc) 2.2 kB
import type { Action, Log } from '@logux/core' import type { Unsubscribe } from 'nanoevents' import { Client } from '../client/index.js' import type { ClientActionListener, ClientMeta } from '../client/index.js' /** * Low-level browser API for Logux. * * Instead of {@link Client}, this class prevents conflicts * between Logux instances in different tabs on single browser. * * ```js * import { CrossTabClient } from '@logux/client' * * const userId = document.querySelector('meta[name=user]').content * const token = document.querySelector('meta[name=token]').content * * const client = new CrossTabClient({ * subprotocol: 1, * server: 'wss://example.com:1337', * userId, * token * }) * client.start() * ``` */ export class CrossTabClient< Headers extends object = object, ClientLog extends Log = Log<ClientMeta> > extends Client<Headers, ClientLog> { /** * Cache for localStorage detection. Can be overridden to disable leader tab * election in tests. */ isLocalStorage: boolean /** * Current tab role. Only `leader` tab connects to server. `followers` just * listen to events from `leader`. * * ```js * client.on('role', () => { * console.log('Tab role:', client.role) * }) * ``` */ role: 'follower' | 'leader' on( event: 'add' | 'clean' | 'preadd', listener: ClientActionListener<Action> ): Unsubscribe /** * Subscribe for synchronization events. It implements nanoevents API. * Supported events: * * * `preadd`: action is going to be added (in current tab). * * `add`: action has been added to log (by any tab). * * `clean`: action has been removed from log (by any tab). * * `role`: tab role has been changed. * * `state`: leader tab synchronization state has been changed. * * `user`: user ID was changed. * * ```js * client.on('add', (action, meta) => { * dispatch(action) * }) * ``` * * @param event The event name. * @param listener The listener function. * @returns Unbind listener from event. */ on(event: 'role' | 'state', listener: () => void): Unsubscribe on(event: 'user', listener: (userId: string) => void): Unsubscribe }