@@ -2832,6 +2832,51 @@ static void Mkdtemp(const FunctionCallbackInfo<Value>& args) {
2832
2832
}
2833
2833
}
2834
2834
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
+
2835
2880
static bool FileURLToPath (
2836
2881
Environment* env,
2837
2882
const ada::url_aggregator& file_url,
@@ -3244,6 +3289,10 @@ static void CreatePerIsolateProperties(IsolateData* isolate_data,
3244
3289
Local<ObjectTemplate> target) {
3245
3290
Isolate* isolate = isolate_data->isolate ();
3246
3291
3292
+ SetMethod (isolate,
3293
+ target,
3294
+ " getFormatOfExtensionlessFile" ,
3295
+ GetFormatOfExtensionlessFile);
3247
3296
SetMethod (isolate, target, " access" , Access);
3248
3297
SetMethod (isolate, target, " close" , Close);
3249
3298
SetMethod (isolate, target, " existsSync" , ExistsSync);
@@ -3364,6 +3413,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
3364
3413
StatWatcher::RegisterExternalReferences (registry);
3365
3414
BindingData::RegisterExternalReferences (registry);
3366
3415
3416
+ registry->Register (GetFormatOfExtensionlessFile);
3367
3417
registry->Register (Close);
3368
3418
registry->Register (ExistsSync);
3369
3419
registry->Register (Open);
0 commit comments