Skip to content

Commit 5f9ae76

Browse files
committed
[file_packager] Convert checkCachedPackage to async/await. NFC
Followup to #24882 and #24883
1 parent f4a5267 commit 5f9ae76

File tree

2 files changed

+113
-106
lines changed

2 files changed

+113
-106
lines changed

test/test_browser.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ def test_preload_caching(self, extra_size):
617617

618618
def test_preload_caching_indexeddb_name(self):
619619
self.set_setting('EXIT_RUNTIME')
620-
create_file('somefile.txt', '''load me right before running the code please''')
620+
create_file('somefile.txt', 'load me right before running the code please')
621621

622622
def make_main(path):
623623
print(path)
@@ -640,20 +640,21 @@ def make_main(path):
640640
int result = 0;
641641
642642
assert(strcmp("load me right before", buf) == 0);
643-
return checkPreloadResults();
643+
int num_cached = checkPreloadResults();
644+
printf("got %%d preloadResults from cache\n", num_cached);
645+
return num_cached;
644646
}
645647
''' % path)
646648

647649
create_file('test.js', '''
648650
addToLibrary({
649-
checkPreloadResults: function() {
651+
checkPreloadResults: () => {
650652
var cached = 0;
651-
var packages = Object.keys(Module['preloadResults']);
652-
packages.forEach(function(package) {
653-
var fromCache = Module['preloadResults'][package]['fromCache'];
654-
if (fromCache)
655-
++ cached;
656-
});
653+
for (var result of Object.values(Module['preloadResults'])) {
654+
if (result['fromCache']) {
655+
cached++;
656+
}
657+
}
657658
return cached;
658659
}
659660
});
@@ -663,6 +664,7 @@ def make_main(path):
663664
self.run_process([FILE_PACKAGER, 'somefile.data', '--use-preload-cache', '--indexedDB-name=testdb', '--preload', 'somefile.txt', '--js-output=' + 'somefile.js'])
664665
self.compile_btest('main.c', ['--js-library', 'test.js', '--pre-js', 'somefile.js', '-o', 'page.html', '-sFORCE_FILESYSTEM'], reporting=Reporting.JS_ONLY)
665666
self.run_browser('page.html', '/report_result?exit:0')
667+
print("Re-running ..")
666668
self.run_browser('page.html', '/report_result?exit:1')
667669

668670
def test_multifile(self):

tools/file_packager.py

Lines changed: 102 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -838,67 +838,68 @@ def generate_js(data_target, data_files, metadata):
838838
// We set the chunk size to 64MB to stay well-below the limit
839839
var CHUNK_SIZE = 64 * 1024 * 1024;
840840
841-
function cacheRemotePackage(
842-
db,
843-
packageName,
844-
packageData,
845-
packageMeta,
846-
callback,
847-
errback
848-
) {
841+
function cacheRemotePackage(db, packageName, packageData, packageMeta) {
849842
var transactionPackages = db.transaction([PACKAGE_STORE_NAME], IDB_RW);
850843
var packages = transactionPackages.objectStore(PACKAGE_STORE_NAME);
851844
var chunkSliceStart = 0;
852845
var nextChunkSliceStart = 0;
853846
var chunkCount = Math.ceil(packageData.byteLength / CHUNK_SIZE);
854847
var finishedChunks = 0;
855-
for (var chunkId = 0; chunkId < chunkCount; chunkId++) {
856-
nextChunkSliceStart += CHUNK_SIZE;
857-
var putPackageRequest = packages.put(
858-
packageData.slice(chunkSliceStart, nextChunkSliceStart),
859-
`package/${packageName}/${chunkId}`
860-
);
861-
chunkSliceStart = nextChunkSliceStart;
862-
putPackageRequest.onsuccess = (event) => {
863-
finishedChunks++;
864-
if (finishedChunks == chunkCount) {
865-
var transaction_metadata = db.transaction(
866-
[METADATA_STORE_NAME],
867-
IDB_RW
868-
);
869-
var metadata = transaction_metadata.objectStore(METADATA_STORE_NAME);
870-
var putMetadataRequest = metadata.put(
871-
{
872-
'uuid': packageMeta.uuid,
873-
'chunkCount': chunkCount
874-
},
875-
`metadata/${packageName}`
876-
);
877-
putMetadataRequest.onsuccess = (event) => callback(packageData);
878-
putMetadataRequest.onerror = (error) => errback(error);
879-
}
880-
};
881-
putPackageRequest.onerror = (error) => errback(error);
882-
}
848+
849+
return new Promise((resolve, reject) => {
850+
for (var chunkId = 0; chunkId < chunkCount; chunkId++) {
851+
nextChunkSliceStart += CHUNK_SIZE;
852+
var putPackageRequest = packages.put(
853+
packageData.slice(chunkSliceStart, nextChunkSliceStart),
854+
`package/${packageName}/${chunkId}`
855+
);
856+
chunkSliceStart = nextChunkSliceStart;
857+
putPackageRequest.onsuccess = (event) => {
858+
finishedChunks++;
859+
if (finishedChunks == chunkCount) {
860+
var transaction_metadata = db.transaction(
861+
[METADATA_STORE_NAME],
862+
IDB_RW
863+
);
864+
var metadata = transaction_metadata.objectStore(METADATA_STORE_NAME);
865+
var putMetadataRequest = metadata.put(
866+
{
867+
'uuid': packageMeta.uuid,
868+
'chunkCount': chunkCount
869+
},
870+
`metadata/${packageName}`
871+
);
872+
putMetadataRequest.onsuccess = (event) => resolve(packageData);
873+
putMetadataRequest.onerror = reject;
874+
}
875+
};
876+
putPackageRequest.onerror = reject;
877+
}
878+
});
883879
}
884880
885-
/* Check if there's a cached package, and if so whether it's the latest available */
886-
function checkCachedPackage(db, packageName, callback, errback) {
881+
/*
882+
* Check if there's a cached package, and if so whether it's the latest available.
883+
* Resolves to the cached metadata, or `null` if it is missing or out-of-date.
884+
*/
885+
async function checkCachedPackage(db, packageName) {
887886
var transaction = db.transaction([METADATA_STORE_NAME], IDB_RO);
888887
var metadata = transaction.objectStore(METADATA_STORE_NAME);
889888
var getRequest = metadata.get(`metadata/${packageName}`);
890-
getRequest.onsuccess = (event) => {
891-
var result = event.target.result;
892-
if (!result) {
893-
return callback(false, null);
894-
} else {
895-
return callback(PACKAGE_UUID === result['uuid'], result);
889+
return new Promise((resolve, reject) => {
890+
getRequest.onsuccess = (event) => {
891+
var result = event.target.result;
892+
if (result && PACKAGE_UUID === result['uuid']) {
893+
resolve(result);
894+
} else {
895+
resolve(null);
896+
}
896897
}
897-
};
898-
getRequest.onerror = (error) => errback(error);
898+
getRequest.onerror = reject;
899+
});
899900
}
900901
901-
function fetchCachedPackage(db, packageName, metadata, callback, errback) {
902+
async function fetchCachedPackage(db, packageName, metadata) {
902903
var transaction = db.transaction([PACKAGE_STORE_NAME], IDB_RO);
903904
var packages = transaction.objectStore(PACKAGE_STORE_NAME);
904905
@@ -907,41 +908,43 @@ def generate_js(data_target, data_files, metadata):
907908
var chunkCount = metadata['chunkCount'];
908909
var chunks = new Array(chunkCount);
909910
910-
for (var chunkId = 0; chunkId < chunkCount; chunkId++) {
911-
var getRequest = packages.get(`package/${packageName}/${chunkId}`);
912-
getRequest.onsuccess = (event) => {
913-
if (!event.target.result) {
914-
errback(new Error(`CachedPackageNotFound for: ${packageName}`));
915-
return;
916-
}
917-
// If there's only 1 chunk, there's nothing to concatenate it with so we can just return it now
918-
if (chunkCount == 1) {
919-
callback(event.target.result);
920-
} else {
921-
chunksDone++;
922-
totalSize += event.target.result.byteLength;
923-
chunks.push(event.target.result);
924-
if (chunksDone == chunkCount) {
925-
if (chunksDone == 1) {
926-
callback(event.target.result);
927-
} else {
928-
var tempTyped = new Uint8Array(totalSize);
929-
var byteOffset = 0;
930-
for (var chunkId in chunks) {
931-
var buffer = chunks[chunkId];
932-
tempTyped.set(new Uint8Array(buffer), byteOffset);
933-
byteOffset += buffer.byteLength;
934-
buffer = undefined;
911+
return new Promise((resolve, reject) => {
912+
for (var chunkId = 0; chunkId < chunkCount; chunkId++) {
913+
var getRequest = packages.get(`package/${packageName}/${chunkId}`);
914+
getRequest.onsuccess = (event) => {
915+
if (!event.target.result) {
916+
reject(`CachedPackageNotFound for: ${packageName}`);
917+
return;
918+
}
919+
// If there's only 1 chunk, there's nothing to concatenate it with so we can just return it now
920+
if (chunkCount == 1) {
921+
resolve(event.target.result);
922+
} else {
923+
chunksDone++;
924+
totalSize += event.target.result.byteLength;
925+
chunks.push(event.target.result);
926+
if (chunksDone == chunkCount) {
927+
if (chunksDone == 1) {
928+
resolve(event.target.result);
929+
} else {
930+
var tempTyped = new Uint8Array(totalSize);
931+
var byteOffset = 0;
932+
for (var chunkId in chunks) {
933+
var buffer = chunks[chunkId];
934+
tempTyped.set(new Uint8Array(buffer), byteOffset);
935+
byteOffset += buffer.byteLength;
936+
buffer = undefined;
937+
}
938+
chunks = undefined;
939+
resolve(tempTyped.buffer);
940+
tempTyped = undefined;
935941
}
936-
chunks = undefined;
937-
callback(tempTyped.buffer);
938-
tempTyped = undefined;
939942
}
940943
}
941-
}
942-
};
943-
getRequest.onerror = (error) => errback(error);
944-
}
944+
};
945+
getRequest.onerror = reject;
946+
}
947+
});
945948
}\n'''
946949

947950
# add Node.js support code, if necessary
@@ -1044,24 +1047,26 @@ def generate_js(data_target, data_files, metadata):
10441047
};
10451048
10461049
openDatabase()
1047-
.then((db) => checkCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME,
1048-
(useCached, metadata) => {
1049-
Module['preloadResults'][PACKAGE_NAME] = {fromCache: useCached};
1050-
if (useCached) {
1051-
fetchCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME, metadata, processPackageData, preloadFallback);
1052-
} else {
1053-
fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE,
1054-
(packageData) => {
1055-
cacheRemotePackage(db, PACKAGE_PATH + PACKAGE_NAME, packageData, {uuid:PACKAGE_UUID}, processPackageData,
1056-
(error) => {
1057-
console.error(error);
1058-
processPackageData(packageData);
1059-
});
1060-
}
1061-
, preloadFallback);
1062-
}
1063-
}, preloadFallback))
1064-
.catch(preloadFallback);
1050+
.then((db) => {
1051+
checkCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME)
1052+
.then((cachedData) => {
1053+
Module['preloadResults'][PACKAGE_NAME] = {fromCache: !!cachedData};
1054+
if (cachedData) {
1055+
fetchCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME, cachedData).then(processPackageData);
1056+
} else {
1057+
fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE,
1058+
(packageData) => {
1059+
cacheRemotePackage(db, PACKAGE_PATH + PACKAGE_NAME, packageData, {uuid:PACKAGE_UUID})
1060+
.then(processPackageData)
1061+
.catch((error) => {
1062+
console.error(error);
1063+
processPackageData(packageData);
1064+
});
1065+
}
1066+
, preloadFallback);
1067+
}
1068+
})
1069+
}).catch(preloadFallback);
10651070
10661071
Module['setStatus']?.('Downloading...');\n'''
10671072
else:

0 commit comments

Comments
 (0)