@@ -1994,6 +1994,66 @@ static inline Maybe<void> CheckOpenPermissions(Environment* env,
19941994 return JustVoid ();
19951995}
19961996
1997+ static void ReadFileSync (const FunctionCallbackInfo<Value>& args) {
1998+ Environment* env = Environment::GetCurrent (args);
1999+
2000+ CHECK_GE (args.Length (), 2 );
2001+
2002+ BufferValue path (env->isolate (), args[0 ]);
2003+ CHECK_NOT_NULL (*path);
2004+
2005+ CHECK (args[1 ]->IsInt32 ());
2006+ const int flags = args[1 ].As <Int32>()->Value ();
2007+
2008+ if (CheckOpenPermissions (env, path, flags).IsNothing ()) return ;
2009+
2010+ uv_fs_t req;
2011+ auto defer_req_cleanup = OnScopeLeave ([&req]() { uv_fs_req_cleanup (&req); });
2012+
2013+ FS_SYNC_TRACE_BEGIN (open);
2014+ uv_file file = uv_fs_open (nullptr , &req, *path, flags, 438 , nullptr );
2015+ FS_SYNC_TRACE_END (open);
2016+ if (req.result < 0 ) {
2017+ // req will be cleaned up by scope leave.
2018+ return args.GetReturnValue ().Set (
2019+ v8::Integer::New (env->isolate (), req.result ));
2020+ }
2021+ uv_fs_req_cleanup (&req);
2022+
2023+ auto defer_close = OnScopeLeave ([file]() {
2024+ uv_fs_t close_req;
2025+ CHECK_EQ (0 , uv_fs_close (nullptr , &close_req, file, nullptr ));
2026+ uv_fs_req_cleanup (&close_req);
2027+ });
2028+
2029+ std::string result{};
2030+ char buffer[8192 ];
2031+ uv_buf_t buf = uv_buf_init (buffer, sizeof (buffer));
2032+
2033+ FS_SYNC_TRACE_BEGIN (read);
2034+ while (true ) {
2035+ auto r = uv_fs_read (nullptr , &req, file, &buf, 1 , -1 , nullptr );
2036+ if (req.result < 0 ) {
2037+ FS_SYNC_TRACE_END (read);
2038+ // req will be cleaned up by scope leave.
2039+ return args.GetReturnValue ().Set (
2040+ v8::Integer::New (env->isolate (), req.result ));
2041+ }
2042+ uv_fs_req_cleanup (&req);
2043+ if (r <= 0 ) {
2044+ break ;
2045+ }
2046+ result.append (buf.base , r);
2047+ }
2048+ FS_SYNC_TRACE_END (read);
2049+
2050+ args.GetReturnValue ().Set (String::NewFromUtf8 (env->isolate (),
2051+ result.data (),
2052+ v8::NewStringType::kNormal ,
2053+ result.size ())
2054+ .ToLocalChecked ());
2055+ }
2056+
19972057static void Open (const FunctionCallbackInfo<Value>& args) {
19982058 Environment* env = Environment::GetCurrent (args);
19992059
@@ -3149,6 +3209,7 @@ static void CreatePerIsolateProperties(IsolateData* isolate_data,
31493209 SetMethod (isolate, target, " stat" , Stat);
31503210 SetMethod (isolate, target, " lstat" , LStat);
31513211 SetMethod (isolate, target, " fstat" , FStat);
3212+ SetMethodNoSideEffect (isolate, target, " readFileSync" , ReadFileSync);
31523213 SetMethod (isolate, target, " statfs" , StatFs);
31533214 SetMethod (isolate, target, " link" , Link);
31543215 SetMethod (isolate, target, " symlink" , Symlink);
@@ -3266,6 +3327,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
32663327 registry->Register (Stat);
32673328 registry->Register (LStat);
32683329 registry->Register (FStat);
3330+ registry->Register (ReadFileSync);
32693331 registry->Register (StatFs);
32703332 registry->Register (Link);
32713333 registry->Register (Symlink);
0 commit comments