/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * */ import type {CollabDecoratorNode} from './CollabDecoratorNode'; import type {CollabElementNode} from './CollabElementNode'; import type {CollabLineBreakNode} from './CollabLineBreakNode'; import type {CollabTextNode} from './CollabTextNode'; import type {Cursor} from './SyncCursors'; import type {LexicalEditor, NodeKey} from 'lexical'; import type {Doc} from 'yjs'; import {Klass, LexicalNode} from 'lexical'; import invariant from 'lexical/shared/invariant'; import {XmlText} from 'yjs'; import {Provider} from '.'; import {$createCollabElementNode} from './CollabElementNode'; export type ClientID = number; export type Binding = { clientID: number; collabNodeMap: Map< NodeKey, | CollabElementNode | CollabTextNode | CollabDecoratorNode | CollabLineBreakNode >; cursors: Map; cursorsContainer: null | HTMLElement; doc: Doc; docMap: Map; editor: LexicalEditor; id: string; nodeProperties: Map>; root: CollabElementNode; excludedProperties: ExcludedProperties; }; export type ExcludedProperties = Map, Set>; export function createBinding( editor: LexicalEditor, provider: Provider, id: string, doc: Doc | null | undefined, docMap: Map, excludedProperties?: ExcludedProperties, ): Binding { invariant( doc !== undefined && doc !== null, 'createBinding: doc is null or undefined', ); const rootXmlText = doc.get('root', XmlText) as XmlText; const root: CollabElementNode = $createCollabElementNode( rootXmlText, null, 'root', ); root._key = 'root'; return { clientID: doc.clientID, collabNodeMap: new Map(), cursors: new Map(), cursorsContainer: null, doc, docMap, editor, excludedProperties: excludedProperties || new Map(), id, nodeProperties: new Map(), root, }; }