37 using v8::FunctionCallbackInfo;
38 using v8::FunctionTemplate;
39 using v8::HandleScope;
49 class FSEventWrap:
public HandleWrap {
53 Local<Context> context);
54 static void New(
const FunctionCallbackInfo<Value>& args);
55 static void Start(
const FunctionCallbackInfo<Value>& args);
56 static void Close(
const FunctionCallbackInfo<Value>& args);
58 size_t self_size()
const override {
return sizeof(*this); }
63 FSEventWrap(Environment* env, Local<Object>
object);
64 ~FSEventWrap()
override;
66 static void OnEvent(uv_fs_event_t* handle,
const char* filename,
int events,
69 uv_fs_event_t handle_;
70 bool initialized_ =
false;
75 FSEventWrap::FSEventWrap(Environment* env, Local<Object>
object)
78 reinterpret_cast<uv_handle_t*>(&handle_),
79 AsyncWrap::PROVIDER_FSEVENTWRAP) {}
82 FSEventWrap::~FSEventWrap() {
83 CHECK_EQ(initialized_,
false);
89 Local<Context> context) {
90 Environment* env = Environment::GetCurrent(context);
92 auto fsevent_string = FIXED_ONE_BYTE_STRING(env->isolate(),
"FSEvent");
93 Local<FunctionTemplate>
t = env->NewFunctionTemplate(
New);
94 t->InstanceTemplate()->SetInternalFieldCount(1);
95 t->SetClassName(fsevent_string);
97 AsyncWrap::AddWrapMethods(env, t);
98 env->SetProtoMethod(t,
"start",
Start);
99 env->SetProtoMethod(t,
"close", Close);
101 target->Set(fsevent_string, t->GetFunction());
106 CHECK(args.IsConstructCall());
107 Environment* env = Environment::GetCurrent(args);
108 new FSEventWrap(env, args.This());
113 Environment* env = Environment::GetCurrent(args);
116 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
117 CHECK_EQ(wrap->initialized_,
false);
119 static const char kErrMsg[] =
"filename must be a string or Buffer";
120 if (args.Length() < 1)
121 return env->ThrowTypeError(kErrMsg);
123 BufferValue path(env->isolate(), args[0]);
124 if (*path ==
nullptr)
125 return env->ThrowTypeError(kErrMsg);
127 unsigned int flags = 0;
128 if (args[2]->IsTrue())
129 flags |= UV_FS_EVENT_RECURSIVE;
131 wrap->encoding_ =
ParseEncoding(env->isolate(), args[3], kDefaultEncoding);
133 int err = uv_fs_event_init(wrap->env()->event_loop(), &wrap->handle_);
135 wrap->initialized_ =
true;
137 err = uv_fs_event_start(&wrap->handle_, OnEvent, *path, flags);
141 if (!args[1]->IsTrue()) {
142 uv_unref(reinterpret_cast<uv_handle_t*>(&wrap->handle_));
145 FSEventWrap::Close(args);
149 args.GetReturnValue().Set(err);
153 void FSEventWrap::OnEvent(uv_fs_event_t* handle,
const char* filename,
155 FSEventWrap* wrap =
static_cast<FSEventWrap*
>(handle->data);
156 Environment* env = wrap->env();
158 HandleScope handle_scope(env->isolate());
159 Context::Scope context_scope(env->context());
161 CHECK_EQ(wrap->persistent().IsEmpty(),
false);
174 Local<String> event_string;
176 event_string = String::Empty(env->isolate());
177 }
else if (events & UV_RENAME) {
178 event_string = env->rename_string();
179 }
else if (events & UV_CHANGE) {
180 event_string = env->change_string();
182 CHECK(0 &&
"bad fs events flag");
185 Local<Value> argv[] = {
191 if (filename !=
nullptr) {
203 &error).ToLocalChecked();
205 argv[2] = fn.ToLocalChecked();
209 wrap->MakeCallback(env->onchange_string(), arraysize(argv), argv);
213 void FSEventWrap::Close(
const FunctionCallbackInfo<Value>& args) {
215 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
217 if (wrap ==
nullptr || wrap->initialized_ ==
false)
219 wrap->initialized_ =
false;
221 HandleWrap::Close(args);
NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector, node::inspector::Agent::InitInspector)
void Initialize(Local< Object > target, Local< Value > unused, Local< Context > context, void *priv)
enum encoding ParseEncoding(const char *encoding, enum encoding default_encoding)
MaybeLocal< Object > New(Isolate *isolate, Local< String > string, enum encoding enc)
int Start(Isolate *isolate, IsolateData *isolate_data, int argc, const char *const *argv, int exec_argc, const char *const *exec_argv)
NODE_DEPRECATED("Use ParseEncoding(isolate, ...)", inline enum encoding ParseEncoding(v8::Local< v8::Value > encoding_v, enum encoding default_encoding=LATIN1) { return ParseEncoding(v8::Isolate::GetCurrent(), encoding_v, default_encoding);}) NODE_EXTERN void FatalException(v8 NODE_DEPRECATED("Use FatalException(isolate, ...)", inline void FatalException(const v8::TryCatch &try_catch) { return FatalException(v8::Isolate::GetCurrent(), try_catch);}) NODE_EXTERN v8 NODE_EXTERN v8::Local< v8::Value > Encode(v8::Isolate *isolate, const uint16_t *buf, size_t len)