Skip to content

Commit c08fbb5

Browse files
authored
Merge branch 'emscripten-core:main' into file_packager_modularize
2 parents fd1ff56 + 592d12d commit c08fbb5

File tree

1 file changed

+103
-97
lines changed

1 file changed

+103
-97
lines changed

tools/file_packager.py

Lines changed: 103 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,7 @@ def generate_js(data_target, data_files, metadata):
836836
var DB_VERSION = 1;
837837
var METADATA_STORE_NAME = 'METADATA';
838838
var PACKAGE_STORE_NAME = 'PACKAGES';
839+
839840
async function openDatabase() {
840841
if (typeof indexedDB == 'undefined') {
841842
throw 'using IndexedDB to cache data can only be done on a web page or in a web worker';
@@ -869,67 +870,68 @@ def generate_js(data_target, data_files, metadata):
869870
// We set the chunk size to 64MB to stay well-below the limit
870871
var CHUNK_SIZE = 64 * 1024 * 1024;
871872
872-
function cacheRemotePackage(
873-
db,
874-
packageName,
875-
packageData,
876-
packageMeta,
877-
callback,
878-
errback
879-
) {
873+
async function cacheRemotePackage(db, packageName, packageData, packageMeta) {
880874
var transactionPackages = db.transaction([PACKAGE_STORE_NAME], IDB_RW);
881875
var packages = transactionPackages.objectStore(PACKAGE_STORE_NAME);
882876
var chunkSliceStart = 0;
883877
var nextChunkSliceStart = 0;
884878
var chunkCount = Math.ceil(packageData.byteLength / CHUNK_SIZE);
885879
var finishedChunks = 0;
886-
for (var chunkId = 0; chunkId < chunkCount; chunkId++) {
887-
nextChunkSliceStart += CHUNK_SIZE;
888-
var putPackageRequest = packages.put(
889-
packageData.slice(chunkSliceStart, nextChunkSliceStart),
890-
`package/${packageName}/${chunkId}`
891-
);
892-
chunkSliceStart = nextChunkSliceStart;
893-
putPackageRequest.onsuccess = (event) => {
894-
finishedChunks++;
895-
if (finishedChunks == chunkCount) {
896-
var transaction_metadata = db.transaction(
897-
[METADATA_STORE_NAME],
898-
IDB_RW
899-
);
900-
var metadata = transaction_metadata.objectStore(METADATA_STORE_NAME);
901-
var putMetadataRequest = metadata.put(
902-
{
903-
'uuid': packageMeta.uuid,
904-
'chunkCount': chunkCount
905-
},
906-
`metadata/${packageName}`
907-
);
908-
putMetadataRequest.onsuccess = (event) => callback(packageData);
909-
putMetadataRequest.onerror = (error) => errback(error);
910-
}
911-
};
912-
putPackageRequest.onerror = (error) => errback(error);
913-
}
880+
881+
return new Promise((resolve, reject) => {
882+
for (var chunkId = 0; chunkId < chunkCount; chunkId++) {
883+
nextChunkSliceStart += CHUNK_SIZE;
884+
var putPackageRequest = packages.put(
885+
packageData.slice(chunkSliceStart, nextChunkSliceStart),
886+
`package/${packageName}/${chunkId}`
887+
);
888+
chunkSliceStart = nextChunkSliceStart;
889+
putPackageRequest.onsuccess = (event) => {
890+
finishedChunks++;
891+
if (finishedChunks == chunkCount) {
892+
var transaction_metadata = db.transaction(
893+
[METADATA_STORE_NAME],
894+
IDB_RW
895+
);
896+
var metadata = transaction_metadata.objectStore(METADATA_STORE_NAME);
897+
var putMetadataRequest = metadata.put(
898+
{
899+
'uuid': packageMeta.uuid,
900+
'chunkCount': chunkCount
901+
},
902+
`metadata/${packageName}`
903+
);
904+
putMetadataRequest.onsuccess = (event) => resolve(packageData);
905+
putMetadataRequest.onerror = reject;
906+
}
907+
};
908+
putPackageRequest.onerror = reject;
909+
}
910+
});
914911
}
915912
916-
/* Check if there's a cached package, and if so whether it's the latest available */
917-
function checkCachedPackage(db, packageName, callback, errback) {
913+
/*
914+
* Check if there's a cached package, and if so whether it's the latest available.
915+
* Resolves to the cached metadata, or `null` if it is missing or out-of-date.
916+
*/
917+
async function checkCachedPackage(db, packageName) {
918918
var transaction = db.transaction([METADATA_STORE_NAME], IDB_RO);
919919
var metadata = transaction.objectStore(METADATA_STORE_NAME);
920920
var getRequest = metadata.get(`metadata/${packageName}`);
921-
getRequest.onsuccess = (event) => {
922-
var result = event.target.result;
923-
if (!result) {
924-
return callback(false, null);
925-
} else {
926-
return callback(PACKAGE_UUID === result['uuid'], result);
921+
return new Promise((resolve, reject) => {
922+
getRequest.onsuccess = (event) => {
923+
var result = event.target.result;
924+
if (result && PACKAGE_UUID === result['uuid']) {
925+
resolve(result);
926+
} else {
927+
resolve(null);
928+
}
927929
}
928-
};
929-
getRequest.onerror = (error) => errback(error);
930+
getRequest.onerror = reject;
931+
});
930932
}
931933
932-
function fetchCachedPackage(db, packageName, metadata, callback, errback) {
934+
async function fetchCachedPackage(db, packageName, metadata) {
933935
var transaction = db.transaction([PACKAGE_STORE_NAME], IDB_RO);
934936
var packages = transaction.objectStore(PACKAGE_STORE_NAME);
935937
@@ -938,41 +940,43 @@ def generate_js(data_target, data_files, metadata):
938940
var chunkCount = metadata['chunkCount'];
939941
var chunks = new Array(chunkCount);
940942
941-
for (var chunkId = 0; chunkId < chunkCount; chunkId++) {
942-
var getRequest = packages.get(`package/${packageName}/${chunkId}`);
943-
getRequest.onsuccess = (event) => {
944-
if (!event.target.result) {
945-
errback(new Error(`CachedPackageNotFound for: ${packageName}`));
946-
return;
947-
}
948-
// If there's only 1 chunk, there's nothing to concatenate it with so we can just return it now
949-
if (chunkCount == 1) {
950-
callback(event.target.result);
951-
} else {
952-
chunksDone++;
953-
totalSize += event.target.result.byteLength;
954-
chunks.push(event.target.result);
955-
if (chunksDone == chunkCount) {
956-
if (chunksDone == 1) {
957-
callback(event.target.result);
958-
} else {
959-
var tempTyped = new Uint8Array(totalSize);
960-
var byteOffset = 0;
961-
for (var chunkId in chunks) {
962-
var buffer = chunks[chunkId];
963-
tempTyped.set(new Uint8Array(buffer), byteOffset);
964-
byteOffset += buffer.byteLength;
965-
buffer = undefined;
943+
return new Promise((resolve, reject) => {
944+
for (var chunkId = 0; chunkId < chunkCount; chunkId++) {
945+
var getRequest = packages.get(`package/${packageName}/${chunkId}`);
946+
getRequest.onsuccess = (event) => {
947+
if (!event.target.result) {
948+
reject(`CachedPackageNotFound for: ${packageName}`);
949+
return;
950+
}
951+
// If there's only 1 chunk, there's nothing to concatenate it with so we can just return it now
952+
if (chunkCount == 1) {
953+
resolve(event.target.result);
954+
} else {
955+
chunksDone++;
956+
totalSize += event.target.result.byteLength;
957+
chunks.push(event.target.result);
958+
if (chunksDone == chunkCount) {
959+
if (chunksDone == 1) {
960+
resolve(event.target.result);
961+
} else {
962+
var tempTyped = new Uint8Array(totalSize);
963+
var byteOffset = 0;
964+
for (var chunkId in chunks) {
965+
var buffer = chunks[chunkId];
966+
tempTyped.set(new Uint8Array(buffer), byteOffset);
967+
byteOffset += buffer.byteLength;
968+
buffer = undefined;
969+
}
970+
chunks = undefined;
971+
resolve(tempTyped.buffer);
972+
tempTyped = undefined;
966973
}
967-
chunks = undefined;
968-
callback(tempTyped.buffer);
969-
tempTyped = undefined;
970974
}
971975
}
972-
}
973-
};
974-
getRequest.onerror = (error) => errback(error);
975-
}
976+
};
977+
getRequest.onerror = reject;
978+
}
979+
});
976980
}\n'''
977981

978982
# add Node.js support code, if necessary
@@ -1078,24 +1082,26 @@ def generate_js(data_target, data_files, metadata):
10781082
};
10791083
10801084
openDatabase()
1081-
.then((db) => checkCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME,
1082-
(useCached, metadata) => {
1083-
Module['preloadResults'][PACKAGE_NAME] = {fromCache: useCached};
1084-
if (useCached) {
1085-
fetchCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME, metadata, processPackageData, preloadFallback);
1086-
} else {
1087-
fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE,
1088-
(packageData) => {
1089-
cacheRemotePackage(db, PACKAGE_PATH + PACKAGE_NAME, packageData, {uuid:PACKAGE_UUID}, processPackageData,
1090-
(error) => {
1091-
console.error(error);
1092-
processPackageData(packageData);
1093-
});
1094-
}
1095-
, preloadFallback);
1096-
}
1097-
}, preloadFallback))
1098-
.catch(preloadFallback);
1085+
.then((db) => {
1086+
checkCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME)
1087+
.then((cachedData) => {
1088+
Module['preloadResults'][PACKAGE_NAME] = {fromCache: !!cachedData};
1089+
if (cachedData) {
1090+
fetchCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME, cachedData).then(processPackageData);
1091+
} else {
1092+
fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE,
1093+
(packageData) => {
1094+
cacheRemotePackage(db, PACKAGE_PATH + PACKAGE_NAME, packageData, {uuid:PACKAGE_UUID})
1095+
.then(processPackageData)
1096+
.catch((error) => {
1097+
console.error(error);
1098+
processPackageData(packageData);
1099+
});
1100+
}
1101+
, preloadFallback);
1102+
}
1103+
})
1104+
}).catch(preloadFallback);
10991105
11001106
Module['setStatus']?.('Downloading...');\n'''
11011107
else:

0 commit comments

Comments
 (0)