@@ -48,6 +48,7 @@ const {
48
48
inspect,
49
49
} = require ( 'internal/util/inspect' ) ;
50
50
const { promisify } = require ( 'internal/util' ) ;
51
+ const { validateAbortSignal } = require ( 'internal/validators' ) ;
51
52
52
53
/**
53
54
* @typedef {import('./stream.js').Readable } Readable
@@ -130,13 +131,22 @@ Interface.prototype.question = function(query, options, cb) {
130
131
options = typeof options === 'object' && options !== null ? options : { } ;
131
132
132
133
if ( options . signal ) {
134
+ validateAbortSignal ( options . signal , 'options.signal' ) ;
133
135
if ( options . signal . aborted ) {
134
136
return ;
135
137
}
136
138
137
- options . signal . addEventListener ( 'abort' , ( ) => {
139
+ const onAbort = ( ) => {
138
140
this [ kQuestionCancel ] ( ) ;
139
- } , { once : true } ) ;
141
+ } ;
142
+ options . signal . addEventListener ( 'abort' , onAbort , { once : true } ) ;
143
+ const cleanup = ( ) => {
144
+ options . signal . removeEventListener ( onAbort ) ;
145
+ } ;
146
+ cb = typeof cb === 'function' ? ( answer ) => {
147
+ cleanup ( ) ;
148
+ return cb ( answer ) ;
149
+ } : cleanup ;
140
150
}
141
151
142
152
if ( typeof cb === 'function' ) {
@@ -151,13 +161,20 @@ Interface.prototype.question[promisify.custom] = function(query, options) {
151
161
}
152
162
153
163
return new Promise ( ( resolve , reject ) => {
154
- this . question ( query , options , resolve ) ;
164
+ let cb = resolve ;
155
165
156
166
if ( options . signal ) {
157
- options . signal . addEventListener ( 'abort' , ( ) => {
167
+ const onAbort = ( ) => {
158
168
reject ( new AbortError ( ) ) ;
159
- } , { once : true } ) ;
169
+ } ;
170
+ options . signal . addEventListener ( 'abort' , onAbort , { once : true } ) ;
171
+ cb = ( answer ) => {
172
+ options . signal . removeEventListener ( 'abort' , onAbort ) ;
173
+ resolve ( answer ) ;
174
+ } ;
160
175
}
176
+
177
+ this . question ( query , options , cb ) ;
161
178
} ) ;
162
179
} ;
163
180
0 commit comments