@@ -3,11 +3,12 @@ import { performance } from 'node:perf_hooks';
33import { AsyncResource } from 'node:async_hooks' ;
44
55import type { WorkerInfo } from '../worker_pool' ;
6- import type { AbortSignalAny , AbortSignalEventEmitter } from '../abort' ;
6+ import type { Task , TaskQueue , PiscinaTask } from './common' ;
7+
8+ import { onabort , type AbortSignalAny } from '../abort' ;
79import { isMovable } from '../common' ;
810import { kTransferable , kValue , kQueueOptions } from '../symbols' ;
911
10- import type { Task , TaskQueue , PiscinaTask } from './common' ;
1112
1213export { ArrayTaskQueue } from './array_queue' ;
1314export { FixedQueue } from './fixed_queue' ;
@@ -23,6 +24,15 @@ export type TransferList = MessagePort extends {
2324 : never
2425export type TransferListItem = TransferList extends Array < infer T > ? T : never
2526
27+ type TaskInfoParameters = {
28+ task : any ;
29+ transferList : TransferList ;
30+ filename : string ;
31+ name : string ;
32+ abortSignal : AbortSignalAny | null ;
33+ triggerAsyncId : number ;
34+ }
35+
2636/**
2737 * Verifies if a given TaskQueue is valid
2838 *
@@ -62,21 +72,22 @@ export class TaskInfo extends AsyncResource implements Task {
6272 name : string ;
6373 taskId : string ;
6474 abortSignal : AbortSignalAny | null ;
65- // abortListener : (() => void) | null = null;
6675 workerInfo : WorkerInfo | null = null ;
6776 created : number ;
6877 started : number ;
6978 aborted = false ;
70- _abortListener : ( ( ) => void ) | null = null ;
71-
72- constructor (
73- task : any ,
74- transferList : TransferList ,
75- filename : string ,
76- name : string ,
77- callback : TaskCallback ,
78- abortSignal : AbortSignalAny | null ,
79- triggerAsyncId : number ) {
79+ _abortListener : ( ( ) => void ) = ( ) => { this . aborted = true ; } ;
80+ _abortCleaner : ( ( ) => void ) | null = null ;
81+
82+ constructor ( {
83+ task,
84+ transferList,
85+ filename,
86+ name,
87+ abortSignal,
88+ triggerAsyncId,
89+ } : TaskInfoParameters ,
90+ callback : TaskCallback ) {
8091 super ( 'Piscina.Task' , { requireManualDestroy : true , triggerAsyncId } ) ;
8192 this . callback = callback ;
8293 this . task = task ;
@@ -88,12 +99,11 @@ export class TaskInfo extends AsyncResource implements Task {
8899 if ( isMovable ( task ) ) {
89100 // This condition should never be hit but typescript
90101 // complains if we dont do the check.
91- /* istanbul ignore if */
102+ /* c8 ignore next */
92103 if ( this . transferList == null ) {
93104 this . transferList = [ ] ;
94105 }
95- this . transferList =
96- this . transferList . concat ( task [ kTransferable ] ) ;
106+ this . transferList = this . transferList . concat ( task [ kTransferable ] ) ;
97107 this . task = task [ kValue ] ;
98108 }
99109
@@ -105,16 +115,15 @@ export class TaskInfo extends AsyncResource implements Task {
105115 this . started = 0 ;
106116 }
107117
108- // TODO: improve this handling - ideally should be extended
109- set abortListener ( value : ( ( ) => void ) ) {
118+ onAbort ( value : ( ( ) => void ) ) {
110119 this . _abortListener = ( ) => {
111120 this . aborted = true ;
112121 value ( ) ;
113122 } ;
114123 }
115124
116- get abortListener ( ) : ( ( ) => void ) | null {
117- return this . _abortListener ;
125+ setAbortListener ( signal : AbortSignalAny ) : void {
126+ this . _abortCleaner = onabort ( signal , this . _abortListener ) ;
118127 }
119128
120129 releaseTask ( ) : any {
@@ -123,19 +132,15 @@ export class TaskInfo extends AsyncResource implements Task {
123132 return ret ;
124133 }
125134
135+ // TODO: implement - helpful for streaming chunks of data from worker to parent
136+ onResponse ( _result : any ) { }
137+
126138 done ( err : Error | null , result ? : any ) : void {
127139 this . runInAsyncScope ( this . callback , null , err , result ) ;
128140 this . emitDestroy ( ) ; // `TaskInfo`s are used only once.
129141 // If an abort signal was used, remove the listener from it when
130142 // done to make sure we do not accidentally leak.
131- if ( this . abortSignal && this . abortListener ) {
132- if ( 'removeEventListener' in this . abortSignal && this . abortListener ) {
133- this . abortSignal . removeEventListener ( 'abort' , this . abortListener ) ;
134- } else {
135- ( this . abortSignal as AbortSignalEventEmitter ) . off (
136- 'abort' , this . abortListener ) ;
137- }
138- }
143+ this . _abortCleaner ?.( ) ;
139144 }
140145
141146 get [ kQueueOptions ] ( ) : { } | null {
0 commit comments