@@ -130,6 +130,28 @@ FileHandleReadWrap::~FileHandleReadWrap() {}
130130
131131FSReqBase::~FSReqBase () {}
132132
133+ void FSReqBase::Cancel (const v8::FunctionCallbackInfo<v8::Value>& args) {
134+ FSReqCallback* self;
135+ ASSIGN_OR_RETURN_UNWRAP (&self, args.Holder ());
136+ self->ReqWrap ::Cancel ();
137+
138+ Local<Value> argv[] = {
139+ FIXED_ONE_BYTE_STRING (self->env ()->isolate (), " Operation was cancelled." ),
140+ FIXED_ONE_BYTE_STRING (self->env ()->isolate (), " AbortError" ),
141+ };
142+ Local<Value> exception;
143+ Local<Function> domexception_ctor;
144+ if (!GetDOMException (self->env ()->context ()).ToLocal (&domexception_ctor) ||
145+ !domexception_ctor
146+ ->NewInstance (self->env ()->context (), arraysize (argv), argv)
147+ .ToLocal (&exception)) {
148+ return ;
149+ }
150+
151+ self->Reject (exception);
152+ args.GetReturnValue ().SetUndefined ();
153+ }
154+
133155void FSReqBase::MemoryInfo (MemoryTracker* tracker) const {
134156 tracker->TrackField (" continuation_data" , continuation_data_);
135157}
@@ -2455,6 +2477,7 @@ void Initialize(Local<Object> target,
24552477 fst->InstanceTemplate ()->SetInternalFieldCount (
24562478 FSReqBase::kInternalFieldCount );
24572479 fst->Inherit (AsyncWrap::GetConstructorTemplate (env));
2480+ env->SetProtoMethod (fst, " cancel" , FSReqBase::Cancel);
24582481 Local<String> wrapString =
24592482 FIXED_ONE_BYTE_STRING (isolate, " FSReqCallback" );
24602483 fst->SetClassName (wrapString);
@@ -2478,6 +2501,7 @@ void Initialize(Local<Object> target,
24782501 // Create Function Template for FSReqPromise
24792502 Local<FunctionTemplate> fpt = FunctionTemplate::New (isolate);
24802503 fpt->Inherit (AsyncWrap::GetConstructorTemplate (env));
2504+ env->SetProtoMethod (fpt, " cancel" , FSReqBase::Cancel);
24812505 Local<String> promiseString =
24822506 FIXED_ONE_BYTE_STRING (isolate, " FSReqPromise" );
24832507 fpt->SetClassName (promiseString);
0 commit comments