@@ -838,67 +838,68 @@ def generate_js(data_target, data_files, metadata):
838
838
// We set the chunk size to 64MB to stay well-below the limit
839
839
var CHUNK_SIZE = 64 * 1024 * 1024;
840
840
841
- function cacheRemotePackage(
842
- db,
843
- packageName,
844
- packageData,
845
- packageMeta,
846
- callback,
847
- errback
848
- ) {
841
+ function cacheRemotePackage(db, packageName, packageData, packageMeta) {
849
842
var transactionPackages = db.transaction([PACKAGE_STORE_NAME], IDB_RW);
850
843
var packages = transactionPackages.objectStore(PACKAGE_STORE_NAME);
851
844
var chunkSliceStart = 0;
852
845
var nextChunkSliceStart = 0;
853
846
var chunkCount = Math.ceil(packageData.byteLength / CHUNK_SIZE);
854
847
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
+ });
883
879
}
884
880
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) {
887
886
var transaction = db.transaction([METADATA_STORE_NAME], IDB_RO);
888
887
var metadata = transaction.objectStore(METADATA_STORE_NAME);
889
888
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
+ }
896
897
}
897
- } ;
898
- getRequest.onerror = (error) => errback(error );
898
+ getRequest.onerror = reject ;
899
+ } );
899
900
}
900
901
901
- function fetchCachedPackage(db, packageName, metadata, callback, errback ) {
902
+ async function fetchCachedPackage(db, packageName, metadata) {
902
903
var transaction = db.transaction([PACKAGE_STORE_NAME], IDB_RO);
903
904
var packages = transaction.objectStore(PACKAGE_STORE_NAME);
904
905
@@ -907,41 +908,43 @@ def generate_js(data_target, data_files, metadata):
907
908
var chunkCount = metadata['chunkCount'];
908
909
var chunks = new Array(chunkCount);
909
910
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;
935
941
}
936
- chunks = undefined;
937
- callback(tempTyped.buffer);
938
- tempTyped = undefined;
939
942
}
940
943
}
941
- }
942
- } ;
943
- getRequest.onerror = (error) => errback(error);
944
- }
944
+ };
945
+ getRequest.onerror = reject ;
946
+ }
947
+ });
945
948
}\n '''
946
949
947
950
# add Node.js support code, if necessary
@@ -1044,24 +1047,26 @@ def generate_js(data_target, data_files, metadata):
1044
1047
};
1045
1048
1046
1049
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);
1065
1070
1066
1071
Module['setStatus']?.('Downloading...');\n '''
1067
1072
else :
0 commit comments