@@ -7,7 +7,7 @@ import { JSONExt, JSONObject, JSONValue } from '@lumino/coreutils';
77import { ISignal , Signal } from '@lumino/signaling' ;
88import { Awareness } from 'y-protocols/awareness' ;
99import * as Y from 'yjs' ;
10- import type { DocumentChange , ISharedDocument , StateChange } from './api.js ' ;
10+ import type { DocumentChange , IDocumentProvider , ISharedDocument , StateChange } from './api' ;
1111
1212/**
1313 * Generic shareable document.
@@ -28,13 +28,37 @@ export abstract class YDocument<T extends DocumentChange>
2828 this . _awareness = new Awareness ( this . _ydoc ) ;
2929
3030 this . _ystate . observe ( this . onStateChanged ) ;
31+
32+ this . _providers = { } ;
3133 }
3234
3335 /**
3436 * Document version
3537 */
3638 abstract readonly version : string ;
3739
40+ addFork ( forkId : string ) {
41+ this . ystate . set ( `fork_${ forkId } ` , 'new' ) ;
42+ }
43+
44+ getProvider ( providerId : string , sharedModel ?: ISharedDocument ) : IDocumentProvider {
45+ if ( ! ( providerId in this . _providers ) ) {
46+ if ( providerId === 'root' ) {
47+ throw new Error ( 'Cannot get a new provider for root document' ) ;
48+ }
49+ if ( sharedModel === undefined ) {
50+ throw new Error ( 'New provider needs a shared document' ) ;
51+ }
52+ const root_provider = this . _providers [ 'root' ] ;
53+ this . _providers [ providerId ] = root_provider . connectFork ( providerId , sharedModel ! ) ;
54+ }
55+ return this . _providers [ providerId ] ;
56+ }
57+
58+ setProvider ( providerId : string , provider : IDocumentProvider ) {
59+ this . _providers [ providerId ] = provider ;
60+ }
61+
3862 /**
3963 * YJS document.
4064 */
@@ -200,6 +224,7 @@ export abstract class YDocument<T extends DocumentChange>
200224 private _awareness : Awareness ;
201225 private _isDisposed = false ;
202226 private _disposed = new Signal < this, void > ( this ) ;
227+ private _providers : { [ key : string ] : IDocumentProvider } ;
203228}
204229
205230/**
0 commit comments