@@ -10,6 +10,12 @@ import { LRUCache } from "./LRUCache";
1010
1111const uuidCache = new LRUCache < string , string > ( 1000 ) ;
1212
13+ // Used to avoid main thread blocking
14+ // even though it slows operations
15+ export function waitForAnimationFrame ( ) {
16+ return new Promise ( ( resolve ) => requestAnimationFrame ( resolve ) ) ;
17+ }
18+
1319function isValidHex ( hex : string ) : boolean {
1420 return / ^ [ 0 - 9 a - f A - F ] { 128 } $ / . test ( hex ) ;
1521}
@@ -55,6 +61,7 @@ export async function deterministicUUID(key: string): Promise<string> {
5561
5662 const encoder = new TextEncoder ( ) ;
5763 const data = encoder . encode ( key ) ;
64+ // Usually under 1 ms; not outsourced to worker
5865 const hashBuffer = await crypto . subtle . digest ( "SHA-512" , data ) ;
5966 const hashHex = bufferToHex ( hashBuffer ) ;
6067
@@ -126,6 +133,7 @@ export async function openDatabase<T extends DBSchema>(
126133 dbVersion : number
127134) : Promise < import ( "idb" ) . IDBPDatabase < T > > {
128135 try {
136+ await waitForAnimationFrame ( ) ;
129137 return await openDB < T > ( dbName , dbVersion , {
130138 upgrade ( db ) {
131139 createStoreWithIndexes ( db , storeName ) ;
@@ -135,6 +143,7 @@ export async function openDatabase<T extends DBSchema>(
135143 if ( error instanceof DOMException && error . name === "VersionError" ) {
136144 console . warn ( `VersionError: Deleting database ${ dbName } and retrying...` ) ;
137145 await deleteDB ( dbName ) ;
146+ await waitForAnimationFrame ( ) ;
138147 return await openDB < T > ( dbName , dbVersion , {
139148 upgrade ( db ) {
140149 createStoreWithIndexes ( db , storeName ) ;
0 commit comments