Skip to content

Commit fa4e9e2

Browse files
committed
fs: Expose uv_cancel() method on FSReq
This adds a FSReqBase::Cancel() method which calls uv_cancel(). This shows up in JS as a cancel() method on FSReqCallback and FSReqPromise.
1 parent 8fecbb7 commit fa4e9e2

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/node_file.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,28 @@ FileHandleReadWrap::~FileHandleReadWrap() {}
130130

131131
FSReqBase::~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+
133155
void 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);

src/node_file.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ class FSReqBase : public ReqWrap<uv_fs_t> {
8585
virtual void SetReturnValue(
8686
const v8::FunctionCallbackInfo<v8::Value>& args) = 0;
8787

88+
// JS-exposed method to cancel the UV request.
89+
static void Cancel(const v8::FunctionCallbackInfo<v8::Value>& args);
90+
8891
const char* syscall() const { return syscall_; }
8992
const char* data() const { return has_data_ ? *buffer_ : nullptr; }
9093
enum encoding encoding() const { return encoding_; }

0 commit comments

Comments
 (0)