Comparing version 7.1.2 to 7.2.0
{ | ||
"name": "bent", | ||
"version": "7.1.2", | ||
"version": "7.2.0", | ||
"description": "Functional HTTP client for Node.js w/ async/await.", | ||
@@ -9,5 +9,6 @@ "main": "src/nodejs.js", | ||
"lint": "standard", | ||
"test:node": "hundreds mocha test/test-*.js", | ||
"test:node": "hundreds mocha --timeout=5000 test/test-*.js", | ||
"test:browser": "polendina --cleanup --service-worker --worker test/test-*.js", | ||
"test": "npm run lint && npm run test:node && npm run test:browser" | ||
"test": "npm run lint && npm run test:node && npm run test:browser", | ||
"coverage": "nyc --reporter=html mocha test/test-*.js && npx http-server coverage" | ||
}, | ||
@@ -14,0 +15,0 @@ "keywords": [], |
@@ -35,2 +35,5 @@ # bent | ||
In Node.js, we also add decoding methods that match the Fetch API (`.json()`, | ||
`.text()` and `.arrayBuffer()`). | ||
```javascript | ||
@@ -42,2 +45,9 @@ const bent = require('bent') | ||
let stream = await getStream('/json.api') | ||
// status code | ||
stream.status // 200 | ||
stream.statusCode // 200 | ||
// optionally decode | ||
const obj = await stream.json() | ||
// or | ||
const str = await stream.text() | ||
``` | ||
@@ -44,0 +54,0 @@ |
@@ -16,3 +16,11 @@ 'use strict' | ||
this.res = res | ||
this.responseBody = res.arrayBuffer() | ||
this.json = res.json.bind(res) | ||
this.text = res.text.bind(res) | ||
this.arrayBuffer = res.arrayBuffer.bind(res) | ||
let buffer | ||
const get = () => { | ||
if (!buffer) buffer = this.arrayBuffer() | ||
return buffer | ||
} | ||
Object.defineProperty(this, 'responseBody', { get }) | ||
} | ||
@@ -19,0 +27,0 @@ } |
@@ -26,2 +26,3 @@ 'use strict' | ||
ret.statusCode = resp.statusCode | ||
ret.status = resp.statusCode | ||
ret.statusMessage = resp.statusMessage | ||
@@ -51,7 +52,11 @@ ret.headers = resp.headers | ||
this.statusCode = res.statusCode | ||
this.responseBody = new Promise((resolve) => { | ||
const buffers = [] | ||
res.on('data', chunk => buffers.push(chunk)) | ||
res.on('end', () => resolve(Buffer.concat(buffers))) | ||
}) | ||
this.json = res.json | ||
this.text = res.text | ||
this.arrayBuffer = res.arrayBuffer | ||
let buffer | ||
const get = () => { | ||
if (!buffer) buffer = this.arrayBuffer() | ||
return buffer | ||
} | ||
Object.defineProperty(this, 'responseBody', { get }) | ||
} | ||
@@ -67,2 +72,24 @@ } | ||
const decodings = res => { | ||
let _buffer | ||
res.arrayBuffer = () => { | ||
if (!_buffer) { | ||
_buffer = getBuffer(res) | ||
return _buffer | ||
} else { | ||
throw new Error('body stream is locked') | ||
} | ||
} | ||
res.text = () => res.arrayBuffer().then(buff => buff.toString()) | ||
res.json = async () => { | ||
const str = await res.text() | ||
try { | ||
return JSON.parse(str) | ||
} catch (e) { | ||
e.message += `str"${str}"` | ||
throw e | ||
} | ||
} | ||
} | ||
const mkrequest = (statusCodes, method, encoding, headers, baseurl) => (_url, body = null, _headers = {}) => { | ||
@@ -100,2 +127,4 @@ _url = baseurl + (_url || '') | ||
const req = h.request(request, async res => { | ||
res = getResponse(res) | ||
decodings(res) | ||
res.status = res.statusCode | ||
@@ -105,21 +134,12 @@ if (!statusCodes.has(res.statusCode)) { | ||
} | ||
res = getResponse(res) | ||
if (!encoding) return resolve(res) | ||
else { | ||
const buff = await getBuffer(res) | ||
/* istanbul ignore else */ | ||
if (encoding === 'buffer') { | ||
resolve(buff) | ||
resolve(res.arrayBuffer()) | ||
} else if (encoding === 'json') { | ||
let ret | ||
try { | ||
ret = JSON.parse(buff.toString()) | ||
resolve(ret) | ||
} catch (e) { | ||
e.message += `str"${buff.toString()}"` | ||
reject(e) | ||
} | ||
resolve(res.json()) | ||
} else if (encoding === 'string') { | ||
resolve(buff.toString()) | ||
resolve(res.text()) | ||
} | ||
@@ -126,0 +146,0 @@ } |
@@ -49,2 +49,23 @@ /* globals atob, it */ | ||
test('double buffer decode', async () => { | ||
const request = bent() | ||
const resp = await request(u('/echo.js?body=ok')) | ||
const validate = buff => { | ||
if (buff instanceof ArrayBuffer) { | ||
same(buff, enc('ok')) | ||
} else { | ||
same(buff, Buffer.from('ok')) | ||
} | ||
} | ||
validate(await resp.arrayBuffer()) | ||
let threw = true | ||
try { | ||
await resp.arrayBuffer() | ||
threw = false | ||
} catch (e) { | ||
if (!e.message.includes('body stream is locked')) throw e | ||
} | ||
assert.ok(threw) | ||
}) | ||
test('basic json', async () => { | ||
@@ -130,13 +151,19 @@ const request = bent('json') | ||
let body | ||
let _e | ||
try { | ||
await request(u('/echo.js?statusCode=500&body=ok')) | ||
} catch (e) { | ||
_e = e | ||
body = e.responseBody | ||
} | ||
const buffer = await body | ||
if (process.browser) { | ||
same(decode(buffer), 'ok') | ||
} else { | ||
same(buffer.toString(), 'ok') | ||
const validate = buffer => { | ||
if (process.browser) { | ||
same(decode(buffer), 'ok') | ||
} else { | ||
same(buffer.toString(), 'ok') | ||
} | ||
} | ||
validate(await body) | ||
// should be able to access again | ||
validate(await _e.responseBody) | ||
}) | ||
@@ -143,0 +170,0 @@ |
@@ -83,1 +83,19 @@ 'use strict' | ||
}) | ||
const getError = async () => { | ||
const r = bent(201) | ||
try { | ||
await r('https://echo-server.mikeal.now.sh/src/echo.js?body="asdf"') | ||
throw new Error('Should have failed') | ||
} catch (e) { | ||
ttype(e, 'StatusError') | ||
return e | ||
} | ||
} | ||
test('error decodings', async () => { | ||
let e = await getError() | ||
same(await e.text(), '"asdf"') | ||
e = await getError() | ||
same(await e.json(), 'asdf') | ||
}) |
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
23290
588
105