79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 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<ClientID, Cursor>;
							 | 
						||
| 
								 | 
							
								  cursorsContainer: null | HTMLElement;
							 | 
						||
| 
								 | 
							
								  doc: Doc;
							 | 
						||
| 
								 | 
							
								  docMap: Map<string, Doc>;
							 | 
						||
| 
								 | 
							
								  editor: LexicalEditor;
							 | 
						||
| 
								 | 
							
								  id: string;
							 | 
						||
| 
								 | 
							
								  nodeProperties: Map<string, Array<string>>;
							 | 
						||
| 
								 | 
							
								  root: CollabElementNode;
							 | 
						||
| 
								 | 
							
								  excludedProperties: ExcludedProperties;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								export type ExcludedProperties = Map<Klass<LexicalNode>, Set<string>>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function createBinding(
							 | 
						||
| 
								 | 
							
								  editor: LexicalEditor,
							 | 
						||
| 
								 | 
							
								  provider: Provider,
							 | 
						||
| 
								 | 
							
								  id: string,
							 | 
						||
| 
								 | 
							
								  doc: Doc | null | undefined,
							 | 
						||
| 
								 | 
							
								  docMap: Map<string, Doc>,
							 | 
						||
| 
								 | 
							
								  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,
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |