44 lines
1.1 KiB
JavaScript
44 lines
1.1 KiB
JavaScript
'use strict'
|
|
|
|
// See available emoji at http://emoji.muan.co/
|
|
const emojic = require('emojic')
|
|
const BaseService = require('./base')
|
|
const trace = require('./trace')
|
|
const { InvalidResponse } = require('./errors')
|
|
|
|
class BaseJsonService extends BaseService {
|
|
_parseJson(buffer) {
|
|
const logTrace = (...args) => trace.logTrace('fetch', ...args)
|
|
let json
|
|
try {
|
|
json = JSON.parse(buffer)
|
|
} catch (err) {
|
|
logTrace(emojic.dart, 'Response JSON (unparseable)', buffer)
|
|
throw new InvalidResponse({
|
|
prettyMessage: 'unparseable json response',
|
|
underlyingError: err,
|
|
})
|
|
}
|
|
logTrace(emojic.dart, 'Response JSON (before validation)', json, {
|
|
deep: true,
|
|
})
|
|
return json
|
|
}
|
|
|
|
async _requestJson({ schema, url, options = {}, errorMessages = {} }) {
|
|
const mergedOptions = {
|
|
...{ headers: { Accept: 'application/json' } },
|
|
...options,
|
|
}
|
|
const { buffer } = await this._request({
|
|
url,
|
|
options: mergedOptions,
|
|
errorMessages,
|
|
})
|
|
const json = this._parseJson(buffer)
|
|
return this.constructor._validate(json, schema)
|
|
}
|
|
}
|
|
|
|
module.exports = BaseJsonService
|