import * as Y from "yjs"; import { type EventObject, type InspectedEventEvent, type SnapshotFrom, type AnyStateMachine } from "xstate"; import { yArrayIterator } from "@/yjs"; export type Emitted= { id?: string, format?: string, data?: any, type: string, offset?: number // milliseconds after start timestamp: number //actual time of event, milliseconds since epoch defer?: number // milliseconds to defer event } & EventObject export function createYjsHub(doc?:Y.Doc | undefined) { doc = doc || new Y.Doc(); function emit (emitted: Y.Array, event: Emitted){ emitted.push([event]); } return { doc: doc, emit: emit.bind(null, doc.getArray('emitted')), inspected: yArrayIterator(doc.getArray('inspection')), emitted: yArrayIterator(doc.getArray('emitted')), snapshot: yArrayIterator(doc.getArray>('snapshot')), array (key: string) { return yArrayIterator(doc.getArray(key)); }, get state(){ return { next: doc.getMap('current').get('next') as string, state: doc.getMap('current').get('state')as string, event: doc.getMap('current').get('event')as string, } } , set state(value: {next: string, state: string, event: string }) { doc?.transact(() => { doc.getMap('current').set('next', value.next); doc.getMap('current').set('state', value.state); doc.getMap('current').set('event', value.event); }) }, children: doc.getMap('children'), child(id: string) { if (doc?.getMap('services').get(id)) { return { isNew: false, hub: createYjsHub(doc?.getMap('services').get(id)!) } } return { hub: createYjsHub(doc?.getMap('services').set(id, new Y.Doc())), isNew: true } } } } export type serviceHub = ReturnType;