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, | ||
|  |   }; | ||
|  | } |