Skip to content

Commit

Permalink
Add simpler reading methods to Blob interface.
Browse files Browse the repository at this point in the history
This fixes #40
  • Loading branch information
mkruisselbrink committed Mar 15, 2019
1 parent 795750f commit 26bf46a
Showing 1 changed file with 63 additions and 2 deletions.
65 changes: 63 additions & 2 deletions index.bs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ spec: url
text: url; for:/
type: interface
text: URL
spec: fetch
type:interface
text:ReadableStream
</pre>

<pre class="anchors">
Expand Down Expand Up @@ -215,7 +218,7 @@ which must be initially set to the state of the underlying storage,
if any such underlying storage exists.
Further normative definition of <a>snapshot state</a> can be found for {{File}}s.

<pre class="idl">
<xmp class="idl">
[Constructor(optional sequence&lt;BlobPart> blobParts,
optional BlobPropertyBag options),
Exposed=(Window,Worker), Serializable]
Expand All @@ -228,6 +231,11 @@ interface Blob {
Blob slice(optional [Clamp] long long start,
optional [Clamp] long long end,
optional DOMString contentType);

// read from the Blob.
ReadableStream stream();
Promise<USVString> text();
Promise<ArrayBuffer> arrayBuffer();
};

enum EndingType { "transparent", "native" };
Expand All @@ -238,7 +246,7 @@ dictionary BlobPropertyBag {
};

typedef (BufferSource or Blob or USVString) BlobPart;
</pre>
</xmp>

{{Blob}} objects are [=serializable objects=]. Their [=serialization steps=],
given |value| and |serialized|, are:
Expand Down Expand Up @@ -561,6 +569,59 @@ It must act as follows:
</pre>
</div>

<h4 id="stream-method-algo">
The stream method</h4>

The <dfn method for=Blob>stream()</dfn> method returns the contents
of the blob as a {{ReadableStream}}.

It must return the result of [=getting a stream for a Blob=] for the [=context object=].

To <dfn lt="getting a stream for a Blob|getting a stream for a Blob">get a stream for a {{Blob}}</dfn>
|blob|, run the following steps:

1. Let |stream| be the result of [=construct a ReadableStream object|constructing=] a
{{ReadableStream}} object.
1. Return |stream| and run the following steps [=in parallel=]:
1. While not all bytes of |blob| have been read:
1. Let |bytes| be the byte sequence that results from reading a [=chunk=] from |blob|.
1. If a [=file read error=] occured while reading |bytes|, [$ReadableStream/error$]
|stream| with a [=failure reason=] and abort these steps.
1. [=ReadableStream/Enqueue=] |bytes| into |stream|.

Issue: We need to specify more concretely what reading from a Blob actually does, and what
possible errors can happen.

<h4 id="text-method-algo">
The text method</h4>

The <dfn method for=Blob>text()</dfn> method returns the contents
of the blob as a {{USVString}}.

It must act as follows:

1. Let |stream| be the the result of [=getting a stream for a Blob=] for the [=context object=].
1. Let |reader| be the result of [=getting a reader=] from |stream|.
If that threw an exception, return a new promise rejected with that exception.
1. Let |promise| be the result of [=reading all bytes=] from |stream| with |reader|.
1. Return the result of transforming |promise| by a fulfillment handler that returns the result of
running [=UTF-8 decode=] on its first argument.

<h4 id="arraybuffer-method-algo">
The arrayBuffer method</h4>

The <dfn method for=Blob>arrayBuffer()</dfn> method returns the contents
of the blob as an {{ArrayBuffer}}.

It must act as follows:

1. Let |stream| be the the result of [=getting a stream for a Blob=] for the [=context object=].
1. Let |reader| be the result of [=getting a reader=] from |stream|.
If that threw an exception, return a new promise rejected with that exception.
1. Let |promise| be the result of [=reading all bytes=] from |stream| with |reader|.
1. Return the result of transforming |promise| by a fulfillment handler that returns
a new {{ArrayBuffer} whose contents are its first argument.
<!--
████████ ████ ██ ████████
██ ██ ██ ██
Expand Down

0 comments on commit 26bf46a

Please sign in to comment.