Skip to content

Commit 315b5f0

Browse files
committed
fix: use promise instead of await when checking opfs support #3
1 parent 08c341a commit 315b5f0

File tree

1 file changed

+30
-26
lines changed

1 file changed

+30
-26
lines changed

src/utils.ts

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,38 @@ export function isIdbSupported(): boolean {
1212
* check if [OPFS SyncAccessHandle](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemSyncAccessHandle) supported
1313
*/
1414
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
3120
}
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+
3342
if ('importScripts' in globalThis) {
34-
return inner()
43+
return await inner()
3544
}
3645
try {
37-
if (typeof Worker === 'undefined') {
46+
if (typeof Worker === 'undefined' || typeof Promise === 'undefined') {
3847
return false
3948
}
4049

@@ -47,13 +56,8 @@ export async function isOpfsSupported(): Promise<boolean> {
4756
const worker = new Worker(url)
4857

4958
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))
5761
})
5862

5963
worker.terminate()

0 commit comments

Comments
 (0)