@@ -12,29 +12,38 @@ export function isIdbSupported(): boolean {
12
12
* check if [OPFS SyncAccessHandle](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemSyncAccessHandle) supported
13
13
*/
14
14
export async function isOpfsSupported ( ) : Promise < boolean > {
15
- // must call and test, see https://stackoverflow.com/questions/76113945/file-system-access-api-on-safari-ios-createsyncaccesshandle-unknownerror-i
16
- const inner = async ( ) : Promise < boolean > => {
17
- const root = await navigator ?. storage . getDirectory ?.( )
18
- if ( ! root ) {
19
- return false
20
- }
21
- try {
22
- const handle = await root . getFileHandle ( '_CHECK' , { create : true } )
23
- // @ts -expect-error check
24
- const access = await handle . createSyncAccessHandle ( )
25
- access . close ( )
26
- return true
27
- } catch {
28
- return false
29
- } finally {
30
- await root . removeEntry ( '_CHECK' )
15
+ // must write file to test, see https://stackoverflow.com/questions/76113945/file-system-access-api-on-safari-ios-createsyncaccesshandle-unknownerror-i
16
+ const inner = ( ) : Promise < boolean > => new Promise ( ( resolve ) => {
17
+ if ( typeof navigator ?. storage ?. getDirectory !== 'function' ) {
18
+ resolve ( false )
19
+ return
31
20
}
32
- }
21
+
22
+ navigator . storage . getDirectory ( )
23
+ . then ( ( root ) => {
24
+ if ( ! root ) {
25
+ resolve ( false )
26
+ return
27
+ }
28
+
29
+ root . getFileHandle ( '_CHECK' , { create : true } )
30
+ // @ts -expect-error no type
31
+ . then ( handle => handle . createSyncAccessHandle ( ) )
32
+ . then ( access => ( access . close ( ) , root . removeEntry ( '_CHECK' ) ) )
33
+ . then ( ( ) => resolve ( true ) )
34
+ . catch ( ( ) => root . removeEntry ( '_CHECK' )
35
+ . then ( ( ) => resolve ( false ) )
36
+ . catch ( ( ) => resolve ( false ) ) ,
37
+ )
38
+ } )
39
+ . catch ( ( ) => resolve ( false ) )
40
+ } )
41
+
33
42
if ( 'importScripts' in globalThis ) {
34
- return inner ( )
43
+ return await inner ( )
35
44
}
36
45
try {
37
- if ( typeof Worker === 'undefined' ) {
46
+ if ( typeof Worker === 'undefined' || typeof Promise === 'undefined' ) {
38
47
return false
39
48
}
40
49
@@ -47,13 +56,8 @@ export async function isOpfsSupported(): Promise<boolean> {
47
56
const worker = new Worker ( url )
48
57
49
58
const result = await new Promise < boolean > ( ( resolve , reject ) => {
50
- worker . onmessage = ( { data } ) => {
51
- resolve ( data )
52
- }
53
- worker . onerror = ( err ) => {
54
- err . preventDefault ( )
55
- reject ( false )
56
- }
59
+ worker . onmessage = ( { data } ) => resolve ( data )
60
+ worker . onerror = err => ( err . preventDefault ( ) , reject ( false ) )
57
61
} )
58
62
59
63
worker . terminate ( )
0 commit comments