@@ -836,6 +836,7 @@ def generate_js(data_target, data_files, metadata):
836
836
var DB_VERSION = 1;
837
837
var METADATA_STORE_NAME = 'METADATA';
838
838
var PACKAGE_STORE_NAME = 'PACKAGES';
839
+
839
840
async function openDatabase() {
840
841
if (typeof indexedDB == 'undefined') {
841
842
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):
869
870
// We set the chunk size to 64MB to stay well-below the limit
870
871
var CHUNK_SIZE = 64 * 1024 * 1024;
871
872
872
- function cacheRemotePackage(
873
- db,
874
- packageName,
875
- packageData,
876
- packageMeta,
877
- callback,
878
- errback
879
- ) {
873
+ async function cacheRemotePackage(db, packageName, packageData, packageMeta) {
880
874
var transactionPackages = db.transaction([PACKAGE_STORE_NAME], IDB_RW);
881
875
var packages = transactionPackages.objectStore(PACKAGE_STORE_NAME);
882
876
var chunkSliceStart = 0;
883
877
var nextChunkSliceStart = 0;
884
878
var chunkCount = Math.ceil(packageData.byteLength / CHUNK_SIZE);
885
879
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
+ });
914
911
}
915
912
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) {
918
918
var transaction = db.transaction([METADATA_STORE_NAME], IDB_RO);
919
919
var metadata = transaction.objectStore(METADATA_STORE_NAME);
920
920
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
+ }
927
929
}
928
- } ;
929
- getRequest.onerror = (error) => errback(error );
930
+ getRequest.onerror = reject ;
931
+ } );
930
932
}
931
933
932
- function fetchCachedPackage(db, packageName, metadata, callback, errback ) {
934
+ async function fetchCachedPackage(db, packageName, metadata) {
933
935
var transaction = db.transaction([PACKAGE_STORE_NAME], IDB_RO);
934
936
var packages = transaction.objectStore(PACKAGE_STORE_NAME);
935
937
@@ -938,41 +940,43 @@ def generate_js(data_target, data_files, metadata):
938
940
var chunkCount = metadata['chunkCount'];
939
941
var chunks = new Array(chunkCount);
940
942
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;
966
973
}
967
- chunks = undefined;
968
- callback(tempTyped.buffer);
969
- tempTyped = undefined;
970
974
}
971
975
}
972
- }
973
- } ;
974
- getRequest.onerror = (error) => errback(error);
975
- }
976
+ };
977
+ getRequest.onerror = reject ;
978
+ }
979
+ });
976
980
}\n '''
977
981
978
982
# add Node.js support code, if necessary
@@ -1078,24 +1082,26 @@ def generate_js(data_target, data_files, metadata):
1078
1082
};
1079
1083
1080
1084
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);
1099
1105
1100
1106
Module['setStatus']?.('Downloading...');\n '''
1101
1107
else :
0 commit comments