@@ -324,10 +324,10 @@ class Runtime {
324
324
/** @type {import('solid-js').Resource<Result<AnyWidget & { url: string }>> } */
325
325
// @ts -expect-error - Set synchronously in constructor.
326
326
#widget_result;
327
- /** @type {Promise<void> } */
328
- ready ;
329
327
/** @type {AbortSignal } */
330
328
#signal;
329
+ /** @type {Promise<void> } */
330
+ ready ;
331
331
332
332
/**
333
333
* @param {base.DOMWidgetModel } model
@@ -361,9 +361,9 @@ class Runtime {
361
361
} ) ;
362
362
/** @type {void | (() => Awaitable<void>) } */
363
363
let cleanup ;
364
- this . #widget_result = solid . createResource ( esm , async ( update ) => {
365
- await safe_cleanup ( cleanup , "initialize" ) ;
364
+ [ this . #widget_result] = solid . createResource ( esm , async ( update ) => {
366
365
try {
366
+ await safe_cleanup ( cleanup , "esm update" ) ;
367
367
model . off ( null , null , INITIALIZE_MARKER ) ;
368
368
let widget = await load_widget ( update , model . get ( "_anywidget_id" ) ) ;
369
369
resolvers . resolve ( ) ;
@@ -378,9 +378,9 @@ class Runtime {
378
378
} catch ( e ) {
379
379
return error ( e ) ;
380
380
}
381
- } ) [ 0 ] ;
382
- return ( ) => {
383
- cleanup ?. ( ) ;
381
+ } ) ;
382
+ return async ( ) => {
383
+ await safe_cleanup ( cleanup , "esm update" ) ;
384
384
model . off ( "change:_css" ) ;
385
385
model . off ( "change:_esm" ) ;
386
386
dispose ( ) ;
@@ -401,10 +401,10 @@ class Runtime {
401
401
let dispose = solid . createRoot ( ( dispose ) => {
402
402
/** @type {void | (() => Awaitable<void>) } */
403
403
let cleanup ;
404
- let resource = solid . createResource (
404
+ let [ resource ] = solid . createResource (
405
405
this . #widget_result,
406
406
async ( widget_result ) => {
407
- cleanup ?. ( ) ;
407
+ await safe_cleanup ( cleanup , "dispose view" ) ;
408
408
// Clear all previous event listeners from this hook.
409
409
model . off ( null , null , view ) ;
410
410
view . $el . empty ( ) ;
@@ -425,15 +425,15 @@ class Runtime {
425
425
throw_anywidget_error ( e ) ;
426
426
}
427
427
} ,
428
- ) [ 0 ] ;
428
+ ) ;
429
429
solid . createEffect ( ( ) => {
430
430
if ( resource . error ) {
431
431
// TODO: Show error in the view?
432
432
}
433
433
} ) ;
434
- return ( ) => {
434
+ return async ( ) => {
435
+ await safe_cleanup ( cleanup , "dispose view" ) ;
435
436
dispose ( ) ;
436
- cleanup ?. ( ) ;
437
437
} ;
438
438
} ) ;
439
439
}
@@ -463,20 +463,16 @@ export default function ({ DOMWidgetModel, DOMWidgetView }) {
463
463
initialize ( ...args ) {
464
464
super . initialize ( ...args ) ;
465
465
let controller = new AbortController ( ) ;
466
- let runtime = new Runtime ( this , { signal : controller . signal } ) ;
467
466
this . once ( "destroy" , ( ) => {
468
- try {
469
- controller . abort ( "[anywidget] Runtime destroyed." ) ;
470
- } finally {
471
- RUNTIMES . delete ( this ) ;
472
- }
467
+ controller . abort ( "[anywidget] Runtime destroyed." ) ;
468
+ RUNTIMES . delete ( this ) ;
473
469
} ) ;
474
- RUNTIMES . set ( this , runtime ) ;
470
+ RUNTIMES . set ( this , new Runtime ( this , { signal : controller . signal } ) ) ;
475
471
}
476
472
477
473
/** @param {Parameters<InstanceType<DOMWidgetModel>["_handle_comm_msg"]> } msg */
478
474
async _handle_comm_msg ( ...msg ) {
479
- const runtime = RUNTIMES . get ( this ) ;
475
+ let runtime = RUNTIMES . get ( this ) ;
480
476
await runtime ?. ready ;
481
477
return super . _handle_comm_msg ( ...msg ) ;
482
478
}
0 commit comments