@@ -1963,6 +1963,63 @@ static void ReadDir(const FunctionCallbackInfo<Value>& args) {
19631963 }
19641964}
19651965
1966+ static void ReadFileSync (const FunctionCallbackInfo<Value>& args) {
1967+ Environment* env = Environment::GetCurrent (args);
1968+
1969+ CHECK_GE (args.Length (), 1 );
1970+
1971+ BufferValue path (env->isolate (), args[0 ]);
1972+ CHECK_NOT_NULL (*path);
1973+
1974+ uv_fs_t req;
1975+ auto defer_req_cleanup = OnScopeLeave ([&req]() { uv_fs_req_cleanup (&req); });
1976+
1977+ FS_SYNC_TRACE_BEGIN (open);
1978+ uv_file file = uv_fs_open (nullptr , &req, *path, O_RDONLY, 0 , nullptr );
1979+ FS_SYNC_TRACE_END (open);
1980+ if (req.result < 0 ) {
1981+ // req will be cleaned up by scope leave.
1982+ return args.GetReturnValue ().Set (
1983+ v8::Integer::New (env->isolate (), req.result ));
1984+ }
1985+ uv_fs_req_cleanup (&req);
1986+
1987+ auto defer_close = OnScopeLeave ([file]() {
1988+ uv_fs_t close_req;
1989+ CHECK_EQ (0 , uv_fs_close (nullptr , &close_req, file, nullptr ));
1990+ uv_fs_req_cleanup (&close_req);
1991+ });
1992+
1993+ std::string result{};
1994+ char buffer[4096 ];
1995+ uv_buf_t buf = uv_buf_init (buffer, sizeof (buffer));
1996+ size_t read_characters;
1997+
1998+ FS_SYNC_TRACE_BEGIN (read);
1999+ while (true ) {
2000+ read_characters =
2001+ uv_fs_read (nullptr , &req, file, &buf, 1 , result.size (), nullptr );
2002+ if (req.result < 0 ) {
2003+ FS_SYNC_TRACE_END (read);
2004+ // req will be cleaned up by scope leave.
2005+ return args.GetReturnValue ().Set (
2006+ v8::Integer::New (env->isolate (), req.result ));
2007+ }
2008+ uv_fs_req_cleanup (&req);
2009+ if (read_characters <= 0 ) {
2010+ break ;
2011+ }
2012+ result.append (buf.base , read_characters);
2013+ }
2014+ FS_SYNC_TRACE_END (read);
2015+
2016+ args.GetReturnValue ().Set (String::NewFromUtf8 (env->isolate (),
2017+ result.data (),
2018+ v8::NewStringType::kNormal ,
2019+ result.size ())
2020+ .ToLocalChecked ());
2021+ }
2022+
19662023static inline Maybe<void > CheckOpenPermissions (Environment* env,
19672024 const BufferValue& path,
19682025 int flags) {
@@ -3149,6 +3206,7 @@ static void CreatePerIsolateProperties(IsolateData* isolate_data,
31493206 SetMethod (isolate, target, " stat" , Stat);
31503207 SetMethod (isolate, target, " lstat" , LStat);
31513208 SetMethod (isolate, target, " fstat" , FStat);
3209+ SetMethodNoSideEffect (isolate, target, " readFileSync" , ReadFileSync);
31523210 SetMethod (isolate, target, " statfs" , StatFs);
31533211 SetMethod (isolate, target, " link" , Link);
31543212 SetMethod (isolate, target, " symlink" , Symlink);
@@ -3266,6 +3324,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
32663324 registry->Register (Stat);
32673325 registry->Register (LStat);
32683326 registry->Register (FStat);
3327+ registry->Register (ReadFileSync);
32693328 registry->Register (StatFs);
32703329 registry->Register (Link);
32713330 registry->Register (Symlink);
0 commit comments