Re: [w3c/FileAPI] Consider substituting optional BlobPart or sequence<BlobPart> for optional sequence<BlobPart> blobParts at constructor (#150)

The adjacent, or opposite, case is passing an array of `TypedArray`s, to `Blob()` with `[]` included, e.g., `new Blob([[Uint8Array, Uint8Array, ..., Uint8Array]])` where when the data is attempted to be converted back to original values, the result will not be expected. In brief,

```
          Promise.all(promises)
          .then(result => {
            console.log(result); // (890) [Uint8Array(36), Uint8Array(38), ... Uint8Array(38)]
            /*
              0: Uint8Array(36) [82, 73, 70, 70, 28, 0, 0, 0, 87, 69, 66, 80, 86, 80, 56, 76, 16, 0, 0, 0, 47, 149, 64, 37, 0, 7, 80, 194, 168, 66, 255, 3, 17, 209, 255, 0]
              ...
            */
            let blob, file;
            // RangeError: Invalid string length
            // Array.join (<anonymous>)
            // Array.toString (<anonymous>)
            try {
              blob = new Blob([result]);
              console.log(blob);
              blob.arrayBuffer().then(buffer => {
                console.log(new Uint8Array(buffer)); // Uint8Array(94848) [56, 50, 44, 55, 51, 44, 55, 48, 44, 55, 48, 44, 50, 56, 44, 48, 44, 48, 44, 48, 44, 56, 55
              })
            } catch (e) {
                console.error(e);
            }
          });
```

Now, if we try we will get an error

```
createImageBitmap(new Blob([new Uint8Array([56, 50, 44, 55, 51, 44, 55, 48, 44, 55, 48, 44, 50, 56, 44, 48, 44, 48, 44, 48, 44, 56, 55, 44, 54, 57, 44, 54, 54, 44, 56, 48, 44, 56, 54, 44])]))
.then(console.log).catch(console.error);
Promise {<pending>}
663a7444cff629a41b76.js:109 DOMException: The source image could not be decoded.
```
where if we got back the same results we will get

```
createImageBitmap(new Blob([new Uint8Array([82, 73, 70, 70, 28, 0, 0, 0, 87, 69, 66, 80, 86, 80, 56, 76, 16, 0, 0, 0, 47, 149, 64, 37, 0, 7, 80, 194, 168, 66, 255, 3, 17, 209, 255, 0])]))
.then(console.log);
Promise {<pending>}
663a7444cff629a41b76.js:109 ImageBitmap {width: 150, height: 150}
```

What happened to the original input data? Simply using `[]` directly affected the result when converting back to original data?

Evidently, yes. In this case, potentially relatively common, the resulting promise value from `Promise.all()`, we do not need to use `[]` 


```
          Promise.all(promises)
          .then(result => {
            console.log(result); // (892) [Uint8Array(36), Uint8Array(36), Uint8Array(38)...]
            /*
            0: Uint8Array(36) [82, 73, 70, 70, 28, 0, 0, 0, 87, 69, 66, 80, 86, 80, 56, 76, 16, 0, 0, ...]
            */
            let blob, file;
            // RangeError: Invalid string length
            // Array.join (<anonymous>)
            // Array.toString (<anonymous>)
            try {
              blob = new Blob(result);
              console.log(blob); // Blob {size: 33164, type: ""}
              blob.arrayBuffer().then(buffer => {
                // now we can use subarray(), slice(), ReadableStream/WritableStream, etc. to re-create the ImageBitmap, in sequence, or by specific offset(s)
                console.log(new Uint8Array(buffer)); // Uint8Array(33164) [82, 73, 70, 70, 28, 0, 0, 0, 87, 69, 66, 80, 86, 80, 56, 76, 16, 0, 0, 0, ...]
              })
            } catch (e) {
                console.error(e);
            }
            ...
         })
```

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/FileAPI/issues/150#issuecomment-609477046

Received on Sunday, 5 April 2020 20:26:25 UTC