1010import elemental2 .core .JsArray ;
1111import elemental2 .core .JsObject ;
1212import elemental2 .core .Uint8Array ;
13+ import elemental2 .dom .AbortController ;
1314import elemental2 .dom .DomGlobal ;
1415import elemental2 .promise .IThenable ;
1516import elemental2 .promise .Promise ;
1819import io .deephaven .javascript .proto .dhinternal .io .deephaven_core .proto .hierarchicaltable_pb .HierarchicalTableSourceExportRequest ;
1920import io .deephaven .javascript .proto .dhinternal .io .deephaven_core .proto .hierarchicaltable_pb .HierarchicalTableViewKeyTableDescriptor ;
2021import io .deephaven .javascript .proto .dhinternal .io .deephaven_core .proto .hierarchicaltable_pb .HierarchicalTableViewRequest ;
22+ import io .deephaven .javascript .proto .dhinternal .io .deephaven_core .proto .hierarchicaltable_pb_service .UnaryResponse ;
2123import io .deephaven .javascript .proto .dhinternal .io .deephaven_core .proto .table_pb .Condition ;
2224import io .deephaven .javascript .proto .dhinternal .io .deephaven_core .proto .table_pb .ExportedTableCreationResponse ;
2325import io .deephaven .javascript .proto .dhinternal .io .deephaven_core .proto .table_pb .SortDescriptor ;
@@ -354,24 +356,34 @@ private TicketAndPromise<ClientTableState> makeView(TicketAndPromise<?> prevTick
354356 }
355357 Ticket ticket = connection .getConfig ().newTicket ();
356358 Promise <JsTable > keyTable = makeKeyTable ();
359+ AbortController controller = new AbortController ();
360+
357361 viewTicket = new TicketAndPromise <>(ticket , Callbacks .grpcUnaryPromise (c -> {
358362 HierarchicalTableViewRequest viewRequest = new HierarchicalTableViewRequest ();
359363 viewRequest .setHierarchicalTableId (prevTicket .ticket ());
360364 viewRequest .setResultViewId (ticket );
361365 keyTable .then (t -> {
366+ if (controller .signal .aborted ) {
367+ return Promise .resolve (controller .signal .reason );
368+ }
362369 if (keyTableData [0 ].length > 0 ) {
363370 HierarchicalTableViewKeyTableDescriptor expansions = new HierarchicalTableViewKeyTableDescriptor ();
364371 expansions .setKeyTableId (t .getHandle ().makeTicket ());
365372 expansions .setKeyTableActionColumn (actionCol .getName ());
366373 viewRequest .setExpansions (expansions );
367374 }
368- connection .hierarchicalTableServiceClient ().view (viewRequest , connection .metadata (), c ::apply );
375+ UnaryResponse viewCreationCall =
376+ connection .hierarchicalTableServiceClient ().view (viewRequest , connection .metadata (), c ::apply );
377+ controller .signal .addEventListener ("abort" , e -> viewCreationCall .cancel ());
369378 return null ;
370379 }, error -> {
371380 c .apply (error , null );
372381 return null ;
373382 });
374383 }).then (result -> {
384+ if (controller .signal .aborted ) {
385+ return Promise .reject (controller .signal .reason );
386+ }
375387 ClientTableState state = new ClientTableState (connection ,
376388 new TableTicket (viewTicket .ticket ().getTicket_asU8 ()), (callback , newState , metadata ) -> {
377389 callback .apply ("fail, trees dont reconnect like this" , null );
@@ -389,6 +401,7 @@ private TicketAndPromise<ClientTableState> makeView(TicketAndPromise<?> prevTick
389401 @ Override
390402 public void release () {
391403 super .release ();
404+ controller .abort ();
392405 then (state -> {
393406 state .unretain (JsTreeTable .this );
394407 return null ;
0 commit comments