Skip to content

Commit 29da2bd

Browse files
author
Alan Fleming
committed
Changed getWidgetManager to be a static method of KernelWidgetManager and renamed to getManager.
1 parent 63e47d3 commit 29da2bd

File tree

4 files changed

+44
-42
lines changed

4 files changed

+44
-42
lines changed

packages/base-manager/src/manager-base.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,10 @@ export abstract class ManagerBase implements IWidgetManager {
214214
*
215215
* If you would like to synchronously test if a model exists, use .has_model().
216216
*/
217-
async get_model(model_id: string): Promise<WidgetModel> {
217+
async get_model(model_id: string, delays = [500]): Promise<WidgetModel> {
218218
let i = 0;
219-
while (!this._models[model_id] && i < this._sleepTimes.length) {
220-
await new Promise((resolve) =>
221-
setTimeout(resolve, this._sleepTimes[i++])
222-
);
219+
while (!this._models[model_id] && i < delays.length) {
220+
await new Promise((resolve) => setTimeout(resolve, delays[i++]));
223221
}
224222
const modelPromise = this._models[model_id];
225223
if (modelPromise === undefined) {
@@ -875,7 +873,6 @@ export abstract class ManagerBase implements IWidgetManager {
875873
/**
876874
* Dictionary of model ids and model instance promises
877875
*/
878-
private _sleepTimes = [2, 50, 200, 800];
879876
private _models: { [key: string]: Promise<WidgetModel> } =
880877
Object.create(null);
881878
}

python/jupyterlab_widgets/src/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@ export default WidgetManagerProvider;
88

99
export { registerWidgetManager } from './plugin';
1010

11-
export {
12-
KernelWidgetManager,
13-
LabWidgetManager,
14-
WidgetManager,
15-
} from './manager';
11+
export { KernelWidgetManager, WidgetManager } from './manager';
1612

1713
export { WidgetRenderer } from './renderer';
1814

python/jupyterlab_widgets/src/manager.ts

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ export class KernelWidgetManager extends LabWidgetManager {
367367
rendermime?: IRenderMimeRegistry,
368368
pendingManagerMessage = 'Loading widget ...'
369369
) {
370-
const instance = Private.kernelWidgetManagers.get(kernel.id);
370+
const instance = Private.managers.get(kernel.id);
371371
if (instance) {
372372
instance._useKernel(kernel);
373373
KernelWidgetManager.configureRendermime(
@@ -381,7 +381,7 @@ export class KernelWidgetManager extends LabWidgetManager {
381381
throw new Error('Kernel does not have handleComms enabled');
382382
}
383383
super(LabWidgetManager.globalRendermime);
384-
Private.kernelWidgetManagers.set(kernel.id, this);
384+
Private.managers.set(kernel.id, this);
385385
this.loadCustomWidgetDefinitions();
386386
LabWidgetManager.WIDGET_REGISTRY.changed.connect(() =>
387387
this.loadCustomWidgetDefinitions()
@@ -475,10 +475,30 @@ export class KernelWidgetManager extends LabWidgetManager {
475475
}
476476

477477
static existsWithActiveKenel(id: string) {
478-
const widgetManager = Private.kernelWidgetManagers.get(id);
478+
const widgetManager = Private.managers.get(id);
479479
return !widgetManager?.disconnected;
480480
}
481481

482+
/**
483+
* Get the KernelWidgetManager that owns the model.
484+
*/
485+
static async getManager(
486+
model_id: string,
487+
delays = [100, 1000]
488+
): Promise<KernelWidgetManager> {
489+
for (const sleepTime of delays) {
490+
for (const wManager of Private.managers.values()) {
491+
if (wManager.has_model(model_id)) {
492+
return wManager;
493+
}
494+
}
495+
await new Promise((resolve) => setTimeout(resolve, sleepTime));
496+
}
497+
throw new Error(
498+
`Failed to locate the KernelWidgetManager for model_id='${model_id}'`
499+
);
500+
}
501+
482502
_handleKernelStatusChange(
483503
sender: Kernel.IKernelConnection,
484504
status: Kernel.Status
@@ -516,7 +536,7 @@ export class KernelWidgetManager extends LabWidgetManager {
516536
}
517537
super.dispose();
518538
KernelWidgetManager.configureRendermime(this.rendermime);
519-
Private.kernelWidgetManagers.delete(this.kernel.id);
539+
Private.managers.delete(this.kernel.id);
520540
this._handleKernelChanged({
521541
name: 'kernel',
522542
oldValue: this._kernel,
@@ -829,28 +849,12 @@ export namespace WidgetManager {
829849
};
830850
}
831851

832-
/**
833-
* Get the widgetManager that owns the model.
834-
*/
835-
export async function getWidgetManager(
836-
model_id: string
837-
): Promise<KernelWidgetManager | undefined> {
838-
for (const sleepTime of [0, 50, 1000]) {
839-
await new Promise((resolve) => setTimeout(resolve, sleepTime));
840-
for (const wManager of Private.kernelWidgetManagers.values()) {
841-
if (wManager.has_model(model_id)) {
842-
return wManager;
843-
}
844-
}
845-
}
846-
return undefined;
847-
}
848-
849852
/**
850853
* A namespace for private data
851854
*/
852855
namespace Private {
853-
export const kernelWidgetManagers = new Map<string, KernelWidgetManager>();
856+
export const managers = new Map<string, KernelWidgetManager>();
857+
854858
export const widgetManagerProperty = new AttachedProperty<
855859
DocumentRegistry.Context,
856860
WidgetManager | undefined

python/jupyterlab_widgets/src/renderer.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
1111

1212
import { DOMWidgetModel } from '@jupyter-widgets/base';
1313

14-
import { LabWidgetManager, getWidgetManager } from './manager';
14+
import { KernelWidgetManager } from './manager';
1515

1616
/**
1717
* A renderer for widgets.
@@ -35,7 +35,7 @@ export class WidgetRenderer
3535
{
3636
constructor(
3737
options: IRenderMime.IRendererOptions,
38-
manager?: LabWidgetManager,
38+
manager?: KernelWidgetManager,
3939
pendingManagerMessage = ''
4040
) {
4141
super();
@@ -50,7 +50,7 @@ export class WidgetRenderer
5050
* Will accept the first non-null manager and ignore anything afterwards.
5151
*/
5252

53-
set manager(value: LabWidgetManager | undefined) {
53+
set manager(value: KernelWidgetManager | undefined) {
5454
if (value && !this._managerIsSet) {
5555
// Can only set the manager once
5656
this._manager.resolve(value);
@@ -68,15 +68,20 @@ export class WidgetRenderer
6868
// If there is no model id, the view was removed, so hide the node.
6969
if (source.model_id === '') {
7070
this.hide();
71-
return Promise.resolve();
71+
return;
7272
}
7373
if (!this._pendingManagerMessage && !this._managerIsSet) {
74-
this.manager = await getWidgetManager(source.model_id);
74+
try {
75+
this.manager = await KernelWidgetManager.getManager(source.model_id);
76+
} catch {
77+
this.node.textContent = `KernelWidgetManager not found for model: ${model.data['text/plain']}`;
78+
return;
79+
}
7580
}
7681
this.node.textContent = `${
7782
this._pendingManagerMessage || model.data['text/plain']
7883
}`;
79-
const manager: LabWidgetManager = await this._manager.promise;
84+
const manager = await this._manager.promise;
8085
this._rerenderMimeModel = model;
8186

8287
let wModel: DOMWidgetModel;
@@ -85,15 +90,15 @@ export class WidgetRenderer
8590
wModel = (await manager.get_model(source.model_id)) as DOMWidgetModel;
8691
} catch (err) {
8792
if (this._pendingManagerMessage === 'No kernel') {
88-
this.node.textContent = `Model not found for this kernel: ${model.data['text/plain']}`;
93+
this.node.textContent = `Model not found: ${model.data['text/plain']}`;
8994
} else if (manager.restoredStatus) {
9095
// The manager has been restored, so this error won't be going away.
9196
this.node.textContent = 'Error displaying widget: model not found';
9297
this.addClass('jupyter-widgets');
9398
console.error(err);
9499
}
95100
// Store the model for a possible rerender
96-
return Promise.resolve();
101+
return;
97102
}
98103
let widget: LuminoWidget;
99104
try {
@@ -146,7 +151,7 @@ export class WidgetRenderer
146151
* The mimetype being rendered.
147152
*/
148153
readonly mimeType: string;
149-
private _manager = new PromiseDelegate<LabWidgetManager>();
154+
private _manager = new PromiseDelegate<KernelWidgetManager>();
150155
private _managerIsSet = false;
151156
private _pendingManagerMessage: string;
152157
private _rerenderMimeModel: IRenderMime.IMimeModel | null = null;

0 commit comments

Comments
 (0)