@@ -16,10 +16,10 @@ import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
16
16
import { INotebookContent } from '@jupyterlab/nbformat' ;
17
17
import { ServiceManager , Kernel as JupyterKernel } from '@jupyterlab/services' ;
18
18
import { WebsocketProvider as YWebsocketProvider } from 'y-websocket' ;
19
- import { useJupyter , Lite , Kernel , requestDocSession , COLLABORATION_ROOM_URL_PATH } from './../../jupyter' ;
19
+ import { useJupyter , Lite , Kernel , requestDocSession , ICollaborative , COLLABORATION_ROOM_URL_PATH } from './../../jupyter' ;
20
20
import { asObservable , Lumino } from '../lumino' ;
21
21
import { newUuid } from '../../utils' ;
22
- import { OnSessionConnection , KernelTransfer } from '../../state' ;
22
+ import { OnSessionConnection , KernelTransfer , jupyterReactStore } from '../../state' ;
23
23
import { CellMetadataEditor } from './cell/metadata' ;
24
24
import { ICellSidebarProps } from './cell/sidebar' ;
25
25
import { INotebookToolbarProps } from './toolbar/NotebookToolbar' ;
@@ -52,7 +52,7 @@ export type INotebookProps = {
52
52
Toolbar ?: ( props : INotebookToolbarProps ) => JSX . Element ;
53
53
cellMetadataPanel : boolean ;
54
54
cellSidebarMargin : number ;
55
- collaborative ?: boolean ;
55
+ collaborative ?: ICollaborative ;
56
56
extensions : DatalayerNotebookExtension [ ]
57
57
height ?: string ;
58
58
id : string ;
@@ -118,7 +118,7 @@ export const Notebook = (props: INotebookProps) => {
118
118
const notebookStore = useNotebookStore ( ) ;
119
119
const portals = notebookStore . selectNotebookPortals ( id ) ;
120
120
// Bootstrap the Notebook Adapter.
121
- const bootstrapAdapter = async ( collaborative : boolean , serviceManager ?: ServiceManager . IManager , kernel ?: Kernel ) => {
121
+ const bootstrapAdapter = async ( collaborative : ICollaborative , serviceManager ?: ServiceManager . IManager , kernel ?: Kernel ) => {
122
122
const adapter = new NotebookAdapter ( {
123
123
...props ,
124
124
id,
@@ -136,28 +136,48 @@ export const Notebook = (props: INotebookProps) => {
136
136
extension . createNew ( adapter . notebookPanel ! , adapter . context ! ) ;
137
137
setExtensionComponents ( extensionComponents . concat ( extension . component ?? < > </ > ) ) ;
138
138
} ) ;
139
- if ( collaborative ) {
140
- // Setup Collaboration.
139
+ // Setup Collaboration.
140
+ if ( collaborative == 'jupyter' ) {
141
141
const ydoc = ( adapter . notebookPanel ?. model ?. sharedModel as any ) . ydoc ;
142
+ const token = jupyterReactStore . getState ( ) . jupyterConfig ?. jupyterServerToken ;
142
143
const session = await requestDocSession ( "json" , "notebook" , path ! ) ;
143
- const yWebsocketProvider = new YWebsocketProvider (
144
- URLExt . join ( serviceManager ?. serverSettings . wsUrl ! , COLLABORATION_ROOM_URL_PATH ) ,
145
- `${ session . format } :${ session . type } :${ session . fileId } ` ,
146
- ydoc ,
144
+ const roomURL = URLExt . join ( serviceManager ?. serverSettings . wsUrl ! , COLLABORATION_ROOM_URL_PATH ) ;
145
+ const roomName = `${ session . format } :${ session . type } :${ session . fileId } ` ;
146
+ const yWebsocketProvider = new YWebsocketProvider ( roomURL , roomName , ydoc ,
147
147
{
148
148
disableBc : true ,
149
- params : { sessionId : session . sessionId } ,
150
- // awareness: this._awareness
149
+ params : {
150
+ sessionId : session . sessionId ,
151
+ token : token ! ,
152
+ } ,
153
+ // awareness: this._awareness
151
154
}
152
155
) ;
153
156
console . log ( 'Collaboration is setup with websocket provider.' , yWebsocketProvider ) ;
154
- // Update the notebook state with the adapter.
155
- notebookStore . update ( { id, state : { adapter } } ) ;
156
- // Update the notebook state further to events.
157
- adapter . notebookPanel ?. model ?. contentChanged . connect ( ( notebookModel , _ ) => {
158
- notebookStore . changeModel ( { id, notebookModel } ) ;
159
- } ) ;
160
157
}
158
+ else if ( collaborative == 'datalayer' ) {
159
+ const ydoc = ( adapter . notebookPanel ?. model ?. sharedModel as any ) . ydoc ;
160
+ const token = jupyterReactStore . getState ( ) . datalayerConfig ?. token ;
161
+ const runURL = jupyterReactStore . getState ( ) . datalayerConfig ?. runUrl ;
162
+ const roomName = id ;
163
+ const roomURL = URLExt . join ( runURL ! . replace ( 'http' , 'ws' ) , `/api/spacer/v1/rooms` ) ;
164
+ const yWebsocketProvider = new YWebsocketProvider ( roomURL , roomName , ydoc ,
165
+ {
166
+ disableBc : true ,
167
+ params : {
168
+ token : token ! ,
169
+ }
170
+ // awareness: this._awareness
171
+ }
172
+ ) ;
173
+ console . log ( 'Collaboration is setup with websocket provider.' , yWebsocketProvider ) ;
174
+ }
175
+ // Update the notebook state with the adapter.
176
+ notebookStore . update ( { id, state : { adapter } } ) ;
177
+ // Update the notebook state further to events.
178
+ adapter . notebookPanel ?. model ?. contentChanged . connect ( ( notebookModel , _ ) => {
179
+ notebookStore . changeModel ( { id, notebookModel } ) ;
180
+ } ) ;
161
181
/*
162
182
adapter.notebookPanel?.model?.sharedModel.changed.connect((_, notebookChange) => {
163
183
notebookStore.changeNotebook({ id, notebookChange });
@@ -206,7 +226,7 @@ export const Notebook = (props: INotebookProps) => {
206
226
} ) ;
207
227
}
208
228
//
209
- const createAdapter = ( collaborative : boolean , serviceManager ?: ServiceManager . IManager , kernel ?: Kernel ) => {
229
+ const createAdapter = ( collaborative : ICollaborative , serviceManager ?: ServiceManager . IManager , kernel ?: Kernel ) => {
210
230
if ( ! kernel ) {
211
231
bootstrapAdapter ( collaborative , serviceManager , kernel ) ;
212
232
} else {
@@ -227,10 +247,10 @@ export const Notebook = (props: INotebookProps) => {
227
247
// Mutation Effects.
228
248
useEffect ( ( ) => {
229
249
if ( serviceManager && serverless ) {
230
- createAdapter ( collaborative ?? false , serviceManager , kernel ) ;
250
+ createAdapter ( collaborative , serviceManager , kernel ) ;
231
251
}
232
252
else if ( serviceManager && kernel ) {
233
- createAdapter ( collaborative ?? false , serviceManager , kernel ) ;
253
+ createAdapter ( collaborative , serviceManager , kernel ) ;
234
254
}
235
255
} , [ collaborative , serviceManager , kernel ] ) ;
236
256
useEffect ( ( ) => {
@@ -256,13 +276,13 @@ export const Notebook = (props: INotebookProps) => {
256
276
useEffect ( ( ) => {
257
277
if ( adapter && path && adapter . path !== path ) {
258
278
disposeAdapter ( ) ;
259
- createAdapter ( collaborative ?? false , serviceManager ) ;
279
+ createAdapter ( collaborative , serviceManager ) ;
260
280
}
261
281
} , [ path ] ) ;
262
282
useEffect ( ( ) => {
263
283
if ( adapter && url && adapter . url !== url ) {
264
284
disposeAdapter ( ) ;
265
- createAdapter ( collaborative ?? false , serviceManager ) ;
285
+ createAdapter ( collaborative , serviceManager ) ;
266
286
}
267
287
} , [ collaborative , url ] ) ;
268
288
// Dispose Effects.
@@ -360,7 +380,7 @@ export const Notebook = (props: INotebookProps) => {
360
380
Notebook . defaultProps = {
361
381
cellMetadataPanel : false ,
362
382
cellSidebarMargin : 120 ,
363
- collaborative : false ,
383
+ collaborative : undefined ,
364
384
extensions : [ ] ,
365
385
height : '100vh' ,
366
386
kernelClients : [ ] ,
0 commit comments