whatwg-fetch
Advanced tools
Comparing version 0.5.0 to 0.6.0
{ | ||
"name": "fetch", | ||
"version": "0.5.0", | ||
"version": "0.6.0", | ||
"main": "fetch.js", | ||
@@ -5,0 +5,0 @@ "devDependencies": { |
102
fetch.js
@@ -72,18 +72,36 @@ (function() { | ||
function Body() { | ||
this._body = null | ||
this.bodyUsed = false | ||
function fileReaderReady(reader) { | ||
return new Promise(function(resolve, reject) { | ||
reader.onload = function() { | ||
resolve(reader.result) | ||
} | ||
reader.onerror = function() { | ||
reject(reader.error) | ||
} | ||
}) | ||
} | ||
this.arrayBuffer = function() { | ||
throw new Error('Not implemented yet') | ||
function readBlobAsArrayBuffer(blob) { | ||
var reader = new FileReader() | ||
reader.readAsArrayBuffer(blob) | ||
return fileReaderReady(reader) | ||
} | ||
function readBlobAsText(blob) { | ||
var reader = new FileReader() | ||
reader.readAsText(blob) | ||
return fileReaderReady(reader) | ||
} | ||
var blobSupport = 'FileReader' in self && 'Blob' in self && (function() { | ||
try { | ||
new Blob(); | ||
return true | ||
} catch(e) { | ||
return false | ||
} | ||
})(); | ||
var blobSupport = (function() { | ||
try { | ||
new Blob(); | ||
return true | ||
} catch(e) { | ||
return false | ||
} | ||
})(); | ||
function Body() { | ||
this.bodyUsed = false | ||
@@ -93,32 +111,27 @@ if (blobSupport) { | ||
var rejected = consumed(this) | ||
return rejected ? rejected : Promise.resolve(new Blob([this._body])) | ||
return rejected ? rejected : Promise.resolve(this._bodyBlob) | ||
} | ||
} | ||
if (self.FormData) { | ||
this.formData = function() { | ||
this.arrayBuffer = function() { | ||
return this.blob().then(readBlobAsArrayBuffer) | ||
} | ||
this.text = function() { | ||
return this.blob().then(readBlobAsText) | ||
} | ||
} else { | ||
this.text = function() { | ||
var rejected = consumed(this) | ||
return rejected ? rejected : Promise.resolve(decode(this._body)) | ||
return rejected ? rejected : Promise.resolve(this._bodyText) | ||
} | ||
} | ||
this.json = function() { | ||
var rejected = consumed(this) | ||
if (rejected) { | ||
return rejected | ||
if ('FormData' in self) { | ||
this.formData = function() { | ||
return this.text().then(decode) | ||
} | ||
var body = this._body | ||
return new Promise(function(resolve, reject) { | ||
try { | ||
resolve(JSON.parse(body)) | ||
} catch (ex) { | ||
reject(ex) | ||
} | ||
}) | ||
} | ||
this.text = function() { | ||
var rejected = consumed(this) | ||
return rejected ? rejected : Promise.resolve(this._body) | ||
this.json = function() { | ||
return this.text().then(JSON.parse) | ||
} | ||
@@ -191,3 +204,3 @@ | ||
} | ||
resolve(new Response(xhr.responseText, options)) | ||
resolve(new Response(blobSupport ? xhr.response: xhr.responseText, options)) | ||
} | ||
@@ -200,2 +213,5 @@ | ||
xhr.open(self.method, self.url) | ||
if (blobSupport) { | ||
xhr.responseType = 'blob' | ||
} | ||
@@ -214,4 +230,16 @@ self.headers.forEach(function(name, values) { | ||
function Response(body, options) { | ||
this._body = body | ||
function Response(bodyInit, options) { | ||
if (!options) { | ||
options = {} | ||
} | ||
if (blobSupport) { | ||
if (typeof bodyInit === 'string') { | ||
this._bodyBlob = new Blob([bodyInit]) | ||
} else { | ||
this._bodyBlob = bodyInit | ||
} | ||
} else { | ||
this._bodyText = bodyInit | ||
} | ||
this.type = 'default' | ||
@@ -218,0 +246,0 @@ this.url = null |
{ | ||
"name": "whatwg-fetch", | ||
"version": "0.5.0", | ||
"version": "0.6.0", | ||
"main": "fetch.js", | ||
@@ -5,0 +5,0 @@ "devDependencies": { |
@@ -31,2 +31,10 @@ #!/usr/bin/env node | ||
}, | ||
'/binary': function(res) { | ||
res.writeHead(200, {'Content-Type': 'application/octet-stream'}); | ||
var buf = new Buffer(256); | ||
for (var i = 0; i < 256; i++) { | ||
buf[i] = i; | ||
} | ||
res.end(buf); | ||
}, | ||
'/redirect/301': function(res) { | ||
@@ -33,0 +41,0 @@ res.writeHead(301, {'Location': '/hello'}); |
@@ -47,2 +47,16 @@ test('resolves promise on 500 error', function() { | ||
suite('Response', function() { | ||
test('construct response with String body', function() { | ||
var response = new Response('hello') | ||
response.text().then(function(text) { | ||
assert.equal(text, 'hello') | ||
}) | ||
}) | ||
;(Response.prototype.blob ? test : test.skip)('construct response with Blob body', function() { | ||
var response = new Response(new Blob(['hello'])) | ||
response.text().then(function(text) { | ||
assert.equal(text, 'hello') | ||
}) | ||
}) | ||
test('populates response body', function() { | ||
@@ -67,2 +81,36 @@ return fetch('/hello').then(function(response) { | ||
suite('Body mixin', function() { | ||
;(Response.prototype.arrayBuffer ? suite : suite.skip)('arrayBuffer', function() { | ||
test('resolves arrayBuffer promise', function() { | ||
return fetch('/hello').then(function(response) { | ||
return response.arrayBuffer() | ||
}).then(function(buf) { | ||
assert(buf instanceof ArrayBuffer, 'buf is an ArrayBuffer instance') | ||
assert.equal(buf.byteLength, 2) | ||
}) | ||
}) | ||
test('arrayBuffer handles binary data', function() { | ||
return fetch('/binary').then(function(response) { | ||
return response.arrayBuffer() | ||
}).then(function(buf) { | ||
assert(buf instanceof ArrayBuffer, 'buf is an ArrayBuffer instance') | ||
assert.equal(buf.byteLength, 256, 'buf.byteLength is correct') | ||
var view = new Uint8Array(buf) | ||
for (var i = 0; i < 256; i++) { | ||
assert.equal(view[i], i) | ||
} | ||
}) | ||
}) | ||
test('rejects arrayBuffer promise after body is consumed', function() { | ||
return fetch('/hello').then(function(response) { | ||
assert(response.arrayBuffer, 'Body does not implement arrayBuffer') | ||
response.blob() | ||
return response.arrayBuffer() | ||
}).catch(function(error) { | ||
assert(error instanceof TypeError, 'Promise rejected after body consumed') | ||
}) | ||
}) | ||
}) | ||
;(Response.prototype.blob ? suite : suite.skip)('blob', function() { | ||
@@ -78,2 +126,11 @@ test('resolves blob promise', function() { | ||
test('blob handles binary data', function() { | ||
return fetch('/binary').then(function(response) { | ||
return response.blob() | ||
}).then(function(blob) { | ||
assert(blob instanceof Blob, 'blob is a Blob instance') | ||
assert.equal(blob.size, 256, 'blob.size is correct') | ||
}) | ||
}) | ||
test('rejects blob promise after body is consumed', function() { | ||
@@ -80,0 +137,0 @@ return fetch('/hello').then(function(response) { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
34272
758
39