@@ -66,15 +66,7 @@ export const WIDGET_STATE_MIMETYPE =
66
66
/**
67
67
* A widget manager that returns Lumino widgets.
68
68
*/
69
- export abstract class LabWidgetManager
70
- extends ManagerBase
71
- implements IDisposable
72
- {
73
- constructor ( rendermime : IRenderMimeRegistry ) {
74
- super ( ) ;
75
- this . _rendermime = rendermime ;
76
- }
77
-
69
+ abstract class LabWidgetManager extends ManagerBase implements IDisposable {
78
70
/**
79
71
* Default callback handler to emit unhandled kernel messages.
80
72
*/
@@ -181,7 +173,6 @@ export abstract class LabWidgetManager
181
173
return ;
182
174
}
183
175
this . _isDisposed = true ;
184
- this . _rendermime = null ! ;
185
176
186
177
if ( this . _commRegistration ) {
187
178
this . _commRegistration . dispose ( ) ;
@@ -245,10 +236,6 @@ export abstract class LabWidgetManager
245
236
246
237
abstract get kernel ( ) : Kernel . IKernelConnection | null ;
247
238
248
- get rendermime ( ) : IRenderMimeRegistry {
249
- return this . _rendermime ;
250
- }
251
-
252
239
/**
253
240
* A signal emitted when state is restored to the widget manager.
254
241
*
@@ -298,6 +285,7 @@ export abstract class LabWidgetManager
298
285
* @return Promise that resolves when the widget state is cleared.
299
286
*/
300
287
async clear_state ( ) : Promise < void > {
288
+ this . _restoredStatus = false ;
301
289
await super . clear_state ( ) ;
302
290
this . _modelsSync = new Map ( ) ;
303
291
}
@@ -331,15 +319,13 @@ export abstract class LabWidgetManager
331
319
await this . handle_comm_open ( oldComm , msg ) ;
332
320
} ;
333
321
334
- static globalRendermime : IRenderMimeRegistry ;
322
+ static rendermime : IRenderMimeRegistry ;
335
323
336
324
protected _restored = new Signal < this, void > ( this ) ;
337
325
protected _restoredStatus = false ;
338
- protected _kernelRestoreInProgress = false ;
339
326
340
327
private _isDisposed = false ;
341
328
private _registry : SemVerCache < ExportData > = new SemVerCache < ExportData > ( ) ;
342
- private _rendermime : IRenderMimeRegistry ;
343
329
344
330
private _commRegistration : IDisposable ;
345
331
@@ -352,46 +338,31 @@ export abstract class LabWidgetManager
352
338
}
353
339
354
340
/**
355
- * A singleton widget manager per kernel for the lifecycle of the kernel.
356
- * The factory of the rendermime will be updated to use the widgetManager
357
- * directly if it isn't the globalRendermime.
358
- *
359
- * Note: The rendermime of the instance is always the global rendermime.
341
+ * KernelWidgetManager is singleton widget manager per kernel.id.
342
+ * This class should not be created directly or subclassed, instead use
343
+ * the class method `KernelWidgetManager.getManager(kernel)`.
360
344
*/
361
345
export class KernelWidgetManager extends LabWidgetManager {
362
- constructor (
363
- kernel : Kernel . IKernelConnection ,
364
- rendermime ?: IRenderMimeRegistry ,
365
- pendingManagerMessage = 'Loading widget ...'
366
- ) {
367
- const instance = Private . managers . get ( kernel . id ) ;
368
- if ( instance ) {
369
- instance . _useKernel ( kernel ) ;
370
- KernelWidgetManager . configureRendermime (
371
- rendermime ,
372
- instance ,
373
- pendingManagerMessage
374
- ) ;
375
- return instance ;
346
+ constructor ( kernel : Kernel . IKernelConnection ) {
347
+ if ( Private . managers . has ( kernel . id ) ) {
348
+ throw new Error ( 'A manager already exists!' ) ;
376
349
}
377
350
if ( ! kernel . handleComms ) {
378
351
throw new Error ( 'Kernel does not have handleComms enabled' ) ;
379
352
}
380
- super ( LabWidgetManager . globalRendermime ) ;
353
+ super ( ) ;
381
354
Private . managers . set ( kernel . id , this ) ;
382
355
this . loadCustomWidgetDefinitions ( ) ;
383
356
LabWidgetManager . WIDGET_REGISTRY . changed . connect ( ( ) =>
384
357
this . loadCustomWidgetDefinitions ( )
385
358
) ;
386
- this . _useKernel ( kernel ) ;
387
- KernelWidgetManager . configureRendermime (
388
- rendermime ,
389
- this ,
390
- pendingManagerMessage
391
- ) ;
359
+ this . _updateKernel ( kernel ) ;
392
360
}
393
361
394
- _useKernel ( this : KernelWidgetManager , kernel : Kernel . IKernelConnection ) {
362
+ private _updateKernel (
363
+ this : KernelWidgetManager ,
364
+ kernel : Kernel . IKernelConnection
365
+ ) {
395
366
if ( ! kernel . handleComms || this . _kernel === kernel ) {
396
367
return ;
397
368
}
@@ -409,13 +380,15 @@ export class KernelWidgetManager extends LabWidgetManager {
409
380
this . _handleKernelConnectionStatusChange ,
410
381
this
411
382
) ;
383
+ this . _kernel . disposed . disconnect ( this . _onKernelDisposed , this ) ;
412
384
}
413
385
this . _kernel = kernel ;
414
- this . _kernel . statusChanged . connect ( this . _handleKernelStatusChange , this ) ;
415
- this . _kernel . connectionStatusChanged . connect (
386
+ kernel . statusChanged . connect ( this . _handleKernelStatusChange , this ) ;
387
+ kernel . connectionStatusChanged . connect (
416
388
this . _handleKernelConnectionStatusChange ,
417
389
this
418
390
) ;
391
+ kernel . disposed . connect ( this . _onKernelDisposed , this ) ;
419
392
this . restoreWidgets ( ) ;
420
393
}
421
394
@@ -437,7 +410,7 @@ export class KernelWidgetManager extends LabWidgetManager {
437
410
manager ?: KernelWidgetManager ,
438
411
pendingManagerMessage = ''
439
412
) {
440
- if ( ! rendermime || rendermime === LabWidgetManager . globalRendermime ) {
413
+ if ( ! rendermime || rendermime === LabWidgetManager . rendermime ) {
441
414
return ;
442
415
}
443
416
rendermime . removeMimeType ( WIDGET_VIEW_MIMETYPE ) ;
@@ -457,27 +430,18 @@ export class KernelWidgetManager extends LabWidgetManager {
457
430
) : void {
458
431
switch ( status ) {
459
432
case 'connected' :
460
- // Only restore if we aren't currently trying to restore from the kernel
461
- // (for example, in our initial restore from the constructor).
462
- if ( ! this . _kernelRestoreInProgress ) {
463
- this . restoreWidgets ( ) ;
464
- }
433
+ this . restoreWidgets ( ) ;
465
434
break ;
466
435
case 'disconnected' :
467
436
this . disconnect ( ) ;
468
437
break ;
469
438
}
470
439
}
471
440
472
- static existsWithActiveKenel ( id : string ) {
473
- const widgetManager = Private . managers . get ( id ) ;
474
- return widgetManager ?. _restoredStatus ;
475
- }
476
-
477
441
/**
478
- * Get the KernelWidgetManager that owns the model.
442
+ * Find the KernelWidgetManager that owns the model.
479
443
*/
480
- static async getManager (
444
+ static async findManager (
481
445
model_id : string ,
482
446
delays = [ 100 , 1000 ]
483
447
) : Promise < KernelWidgetManager > {
@@ -494,6 +458,28 @@ export class KernelWidgetManager extends LabWidgetManager {
494
458
) ;
495
459
}
496
460
461
+ /**
462
+ * The correct way to get a KernelWidgetManager
463
+ * @param kernel IKernelConnection
464
+ * @returns
465
+ */
466
+ static async getManager (
467
+ kernel : Kernel . IKernelConnection
468
+ ) : Promise < KernelWidgetManager > {
469
+ let manager = Private . managers . get ( kernel . id ) ;
470
+ if ( ! manager ) {
471
+ manager = new KernelWidgetManager ( kernel ) ;
472
+ }
473
+ if ( kernel . handleComms ) {
474
+ manager . _updateKernel ( kernel ) ;
475
+ if ( ! manager . restoredStatus ) {
476
+ const restored = manager . restored ;
477
+ await new Promise ( ( resolve ) => restored . connect ( resolve ) ) ;
478
+ }
479
+ }
480
+ return manager ;
481
+ }
482
+
497
483
_handleKernelStatusChange (
498
484
sender : Kernel . IKernelConnection ,
499
485
status : Kernel . Status
@@ -506,23 +492,36 @@ export class KernelWidgetManager extends LabWidgetManager {
506
492
}
507
493
}
508
494
495
+ async _onKernelDisposed ( ) {
496
+ const model = await KernelWidgetManager . kernels . findById ( this . kernel ?. id ) ;
497
+ if ( model ) {
498
+ const kernel = KernelWidgetManager . kernels . connectTo ( { model } ) ;
499
+ this . _updateKernel ( kernel ) ;
500
+ }
501
+ }
502
+
509
503
/**
510
504
* Restore widgets from kernel.
511
505
*/
512
506
async restoreWidgets ( ) : Promise < void > {
507
+ if ( this . _kernelRestoreInProgress ) {
508
+ return ;
509
+ }
513
510
this . _restoredStatus = false ;
514
511
this . _kernelRestoreInProgress = true ;
515
512
try {
516
513
await this . clear_state ( ) ;
517
514
await this . _loadFromKernel ( ) ;
518
- } catch ( err ) {
519
- // Do nothing
515
+ } catch {
516
+ /* empty */
517
+ } finally {
518
+ this . _restoredStatus = true ;
519
+ this . _kernelRestoreInProgress = false ;
520
+ this . triggerRestored ( ) ;
520
521
}
521
- this . triggerRestored ( ) ;
522
522
}
523
523
524
524
triggerRestored ( ) {
525
- this . _restoredStatus = true ;
526
525
this . _restored . emit ( ) ;
527
526
}
528
527
/**
@@ -533,7 +532,6 @@ export class KernelWidgetManager extends LabWidgetManager {
533
532
return ;
534
533
}
535
534
super . dispose ( ) ;
536
- KernelWidgetManager . configureRendermime ( this . rendermime ) ;
537
535
Private . managers . delete ( this . kernel . id ) ;
538
536
this . _handleKernelChanged ( {
539
537
name : 'kernel' ,
@@ -557,9 +555,9 @@ export class KernelWidgetManager extends LabWidgetManager {
557
555
filterModelState ( serialized_state : any ) : any {
558
556
return this . filterExistingModelState ( serialized_state ) ;
559
557
}
560
-
558
+ static kernels : Kernel . IManager ;
561
559
private _kernel : Kernel . IKernelConnection ;
562
- protected _kernelRestoreInProgress = false ;
560
+ private _kernelRestoreInProgress = false ;
563
561
}
564
562
565
563
/**
@@ -630,7 +628,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
630
628
rendermime : IRenderMimeRegistry ,
631
629
manager : WidgetManager
632
630
) {
633
- if ( rendermime === LabWidgetManager . globalRendermime ) {
631
+ if ( rendermime === LabWidgetManager . rendermime ) {
634
632
return ;
635
633
}
636
634
rendermime . removeMimeType ( WIDGET_VIEW_MIMETYPE ) ;
@@ -648,7 +646,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
648
646
let wManager : KernelWidgetManager | undefined ;
649
647
await this . context . sessionContext . ready ;
650
648
if ( this . kernel ) {
651
- wManager = new KernelWidgetManager ( this . kernel ) ;
649
+ wManager = await KernelWidgetManager . getManager ( this . kernel ) ;
652
650
}
653
651
if ( wManager === this . _widgetManager ) {
654
652
return ;
@@ -796,7 +794,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
796
794
this . _renderers = null ! ;
797
795
this . _context = null ! ;
798
796
this . _context = null ! ;
799
- this . _rendermime = null ! ;
800
797
this . _settings = null ! ;
801
798
}
802
799
@@ -831,8 +828,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
831
828
}
832
829
}
833
830
static loggerRegistry : ILoggerRegistry | null ;
834
- // protected _restored = new Signal<this, void>(this);
835
- // protected _restoredStatus = false;
836
831
private _isDisposed = false ;
837
832
private _context : DocumentRegistry . Context ;
838
833
private _rendermime : IRenderMimeRegistry ;
0 commit comments