Browse Source

added zip data type that returns object of Uint8Arrays

Alexander Rose 5 years ago
parent
commit
c176313f7b
1 changed files with 10 additions and 5 deletions
  1. 10 5
      src/mol-util/data-source.ts

+ 10 - 5
src/mol-util/data-source.ts

@@ -28,13 +28,14 @@ export enum DataCompressionMethod {
     Zip,
 }
 
-type DataType = 'json' | 'xml' | 'string' | 'binary'
+type DataType = 'json' | 'xml' | 'string' | 'binary' | 'zip'
 type DataValue = 'string' | any | XMLDocument | Uint8Array
 type DataResponse<T extends DataType> =
     T extends 'json' ? any :
         T extends 'xml' ? XMLDocument :
             T extends 'string' ? string :
-                T extends 'binary' ? Uint8Array : never
+                T extends 'binary' ? Uint8Array :
+                    T extends 'zip' ? { [k: string]: Uint8Array } : never
 
 export interface AjaxGetParams<T extends DataType = 'string'> {
     url: string,
@@ -158,6 +159,8 @@ async function processFile<T extends DataType>(ctx: RuntimeContext, reader: File
 
     if (type === 'binary' && data instanceof Uint8Array) {
         return data as DataResponse<T>;
+    } else if (type === 'zip' && data instanceof Uint8Array) {
+        return await unzip(ctx, data.buffer) as DataResponse<T>;
     } else if (type === 'string' && typeof data === 'string') {
         return data as DataResponse<T>;
     } else if (type === 'xml' && typeof data === 'string') {
@@ -174,9 +177,10 @@ function readFromFileInternal<T extends DataType>(file: File, type: T): Task<Dat
     return Task.create('Read File', async ctx => {
         try {
             reader = new FileReader();
-            const compression = getCompression(file.name);
+            // unzipping for type 'zip' handled explicitly in `processFile`
+            const compression = type === 'zip' ? DataCompressionMethod.None : getCompression(file.name);
 
-            if (type === 'binary' || compression !== DataCompressionMethod.None) {
+            if (type === 'binary' || type === 'zip' || compression !== DataCompressionMethod.None) {
                 reader.readAsArrayBuffer(file);
             } else {
                 reader.readAsText(file);
@@ -224,7 +228,7 @@ function processAjax<T extends DataType>(req: XMLHttpRequest, type: T): DataResp
         const { response } = req;
         RequestPool.deposit(req);
 
-        if (type === 'binary' && response instanceof ArrayBuffer) {
+        if ((type === 'binary' || type === 'zip') && response instanceof ArrayBuffer) {
             return new Uint8Array(response) as DataResponse<T>;
         } else if (type === 'string' && typeof response === 'string') {
             return response as DataResponse<T>;
@@ -247,6 +251,7 @@ function getRequestResponseType(type: DataType): XMLHttpRequestResponseType {
         case 'xml': return 'document';
         case 'string': return 'text';
         case 'binary': return 'arraybuffer';
+        case 'zip': return 'arraybuffer';
     }
 }