@@ -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
*
@@ -331,15 +318,13 @@ export abstract class LabWidgetManager
331
318
await this . handle_comm_open ( oldComm , msg ) ;
332
319
} ;
333
320
334
- static globalRendermime : IRenderMimeRegistry ;
321
+ static rendermime : IRenderMimeRegistry ;
335
322
336
323
protected _restored = new Signal < this, void > ( this ) ;
337
324
protected _restoredStatus = false ;
338
- protected _kernelRestoreInProgress = false ;
339
325
340
326
private _isDisposed = false ;
341
327
private _registry : SemVerCache < ExportData > = new SemVerCache < ExportData > ( ) ;
342
- private _rendermime : IRenderMimeRegistry ;
343
328
344
329
private _commRegistration : IDisposable ;
345
330
@@ -352,46 +337,32 @@ export abstract class LabWidgetManager
352
337
}
353
338
354
339
/**
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.
340
+ * KernelWidgetManager is singleton widget manager per kernel.id.
341
+ * This class should not be created directly or subclassed, instead use
342
+ * the class method `KernelWidgetManager.getManager(kernel)`. See also
343
+ * `KernelWidgetManager.getManagerById`.
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,36 @@ 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
+
483
+ /**
484
+ * Get a KernelWidgetManager by kernel.id
485
+ * @param id The kernel id
486
+ */
487
+ static getManagerById ( id : string ) : KernelWidgetManager | undefined {
488
+ return Private . managers . get ( id ) ;
489
+ }
490
+
497
491
_handleKernelStatusChange (
498
492
sender : Kernel . IKernelConnection ,
499
493
status : Kernel . Status
@@ -506,23 +500,34 @@ export class KernelWidgetManager extends LabWidgetManager {
506
500
}
507
501
}
508
502
503
+ async _onKernelDisposed ( ) {
504
+ const model = await KernelWidgetManager . kernels . findById ( this . kernel ?. id ) ;
505
+ if ( model ) {
506
+ const kernel = KernelWidgetManager . kernels . connectTo ( { model } ) ;
507
+ this . _updateKernel ( kernel ) ;
508
+ }
509
+ }
510
+
509
511
/**
510
512
* Restore widgets from kernel.
511
513
*/
512
514
async restoreWidgets ( ) : Promise < void > {
515
+ if ( this . _kernelRestoreInProgress ) {
516
+ return ;
517
+ }
513
518
this . _restoredStatus = false ;
514
519
this . _kernelRestoreInProgress = true ;
515
520
try {
516
521
await this . clear_state ( ) ;
517
522
await this . _loadFromKernel ( ) ;
518
- } catch ( err ) {
519
- // Do nothing
523
+ } finally {
524
+ this . _restoredStatus = true ;
525
+ this . _kernelRestoreInProgress = false ;
526
+ this . triggerRestored ( ) ;
520
527
}
521
- this . triggerRestored ( ) ;
522
528
}
523
529
524
530
triggerRestored ( ) {
525
- this . _restoredStatus = true ;
526
531
this . _restored . emit ( ) ;
527
532
}
528
533
/**
@@ -533,7 +538,6 @@ export class KernelWidgetManager extends LabWidgetManager {
533
538
return ;
534
539
}
535
540
super . dispose ( ) ;
536
- KernelWidgetManager . configureRendermime ( this . rendermime ) ;
537
541
Private . managers . delete ( this . kernel . id ) ;
538
542
this . _handleKernelChanged ( {
539
543
name : 'kernel' ,
@@ -557,7 +561,7 @@ export class KernelWidgetManager extends LabWidgetManager {
557
561
filterModelState ( serialized_state : any ) : any {
558
562
return this . filterExistingModelState ( serialized_state ) ;
559
563
}
560
-
564
+ static kernels : Kernel . IManager ;
561
565
private _kernel : Kernel . IKernelConnection ;
562
566
protected _kernelRestoreInProgress = false ;
563
567
}
@@ -630,7 +634,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
630
634
rendermime : IRenderMimeRegistry ,
631
635
manager : WidgetManager
632
636
) {
633
- if ( rendermime === LabWidgetManager . globalRendermime ) {
637
+ if ( rendermime === LabWidgetManager . rendermime ) {
634
638
return ;
635
639
}
636
640
rendermime . removeMimeType ( WIDGET_VIEW_MIMETYPE ) ;
@@ -648,7 +652,7 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
648
652
let wManager : KernelWidgetManager | undefined ;
649
653
await this . context . sessionContext . ready ;
650
654
if ( this . kernel ) {
651
- wManager = new KernelWidgetManager ( this . kernel ) ;
655
+ wManager = await KernelWidgetManager . getManager ( this . kernel ) ;
652
656
}
653
657
if ( wManager === this . _widgetManager ) {
654
658
return ;
@@ -796,7 +800,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
796
800
this . _renderers = null ! ;
797
801
this . _context = null ! ;
798
802
this . _context = null ! ;
799
- this . _rendermime = null ! ;
800
803
this . _settings = null ! ;
801
804
}
802
805
@@ -831,8 +834,6 @@ export class WidgetManager extends Backbone.Model implements IDisposable {
831
834
}
832
835
}
833
836
static loggerRegistry : ILoggerRegistry | null ;
834
- // protected _restored = new Signal<this, void>(this);
835
- // protected _restoredStatus = false;
836
837
private _isDisposed = false ;
837
838
private _context : DocumentRegistry . Context ;
838
839
private _rendermime : IRenderMimeRegistry ;
0 commit comments