@@ -2832,6 +2832,51 @@ static void Mkdtemp(const FunctionCallbackInfo<Value>& args) {
28322832 }
28332833}
28342834
2835+ static void GetFormatOfExtensionlessFile (
2836+ const FunctionCallbackInfo<Value>& args) {
2837+ CHECK_EQ (args.Length (), 1 );
2838+ CHECK (args[0 ]->IsString ());
2839+
2840+ Environment* env = Environment::GetCurrent (args);
2841+ node::Utf8Value input (args.GetIsolate (), args[0 ]);
2842+
2843+ THROW_IF_INSUFFICIENT_PERMISSIONS (
2844+ env, permission::PermissionScope::kFileSystemRead , input.ToStringView ());
2845+
2846+ uv_fs_t req;
2847+ FS_SYNC_TRACE_BEGIN (open)
2848+ uv_file file = uv_fs_open (nullptr , &req, input.out (), O_RDONLY, 0 , nullptr );
2849+ FS_SYNC_TRACE_END (open);
2850+
2851+ if (req.result < 0 ) {
2852+ return args.GetReturnValue ().Set (EXTENSIONLESS_FORMAT_JAVASCRIPT);
2853+ }
2854+
2855+ auto cleanup = OnScopeLeave ([&req, &file]() {
2856+ FS_SYNC_TRACE_BEGIN (close);
2857+ CHECK_EQ (0 , uv_fs_close (nullptr , &req, file, nullptr ));
2858+ FS_SYNC_TRACE_END (close);
2859+ uv_fs_req_cleanup (&req);
2860+ });
2861+
2862+ char buffer[4 ];
2863+ uv_buf_t buf = uv_buf_init (buffer, sizeof (buffer));
2864+ int err = uv_fs_read (nullptr , &req, file, &buf, 1 , 0 , nullptr );
2865+
2866+ if (err < 0 ) {
2867+ return args.GetReturnValue ().Set (EXTENSIONLESS_FORMAT_JAVASCRIPT);
2868+ }
2869+
2870+ // We do this by taking advantage of the fact that all Wasm files start with
2871+ // the header `0x00 0x61 0x73 0x6d`
2872+ if (buffer[0 ] == 0x00 && buffer[1 ] == 0x61 && buffer[2 ] == 0x73 &&
2873+ buffer[3 ] == 0x6d ) {
2874+ return args.GetReturnValue ().Set (EXTENSIONLESS_FORMAT_WASM);
2875+ }
2876+
2877+ return args.GetReturnValue ().Set (EXTENSIONLESS_FORMAT_JAVASCRIPT);
2878+ }
2879+
28352880static bool FileURLToPath (
28362881 Environment* env,
28372882 const ada::url_aggregator& file_url,
@@ -3244,6 +3289,10 @@ static void CreatePerIsolateProperties(IsolateData* isolate_data,
32443289 Local<ObjectTemplate> target) {
32453290 Isolate* isolate = isolate_data->isolate ();
32463291
3292+ SetMethod (isolate,
3293+ target,
3294+ " getFormatOfExtensionlessFile" ,
3295+ GetFormatOfExtensionlessFile);
32473296 SetMethod (isolate, target, " access" , Access);
32483297 SetMethod (isolate, target, " close" , Close);
32493298 SetMethod (isolate, target, " existsSync" , ExistsSync);
@@ -3364,6 +3413,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
33643413 StatWatcher::RegisterExternalReferences (registry);
33653414 BindingData::RegisterExternalReferences (registry);
33663415
3416+ registry->Register (GetFormatOfExtensionlessFile);
33673417 registry->Register (Close);
33683418 registry->Register (ExistsSync);
33693419 registry->Register (Open);
0 commit comments