move out request handling

This commit is contained in:
Jannis R 2017-11-11 22:49:04 +01:00
parent 79db55d99c
commit e0d9c28ef2
No known key found for this signature in database
GPG key ID: 0FE83946296A88A5
3 changed files with 80 additions and 56 deletions

View file

@ -1,75 +1,45 @@
'use strict'
const Promise = require('pinkie-promise')
const {fetch} = require('fetch-ponyfill')({Promise})
const {stringify} = require('query-string')
const parseLocation = require('./parse/location')
const parseLine = require('./parse/line')
const parseRemark = require('./parse/remark')
const parseOperator = require('./parse/operator')
const request = require('./lib/request')
const id = x => x
const id = (x) => x
const defaults = {
onBody: id,
onReq: id,
const defaultProfile = {
transformReqBody: id,
transformReq: id,
parseLocation: parseLocation,
parseLine: parseLine,
parseRemark: parseRemark,
parseOperator: parseOperator
}
const hafasError = (err) => {
err.isHafasError = true
return err
}
const createRequest = (opt) => {
opt = Object.assign({}, defaults, opt)
const request = (data) => {
const body = opt.onBody({lang: 'en', svcReqL: [data]})
const req = opt.onReq({
method: 'post',
body: JSON.stringify(body),
headers: {
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip, deflate',
'user-agent': 'https://github.com/derhuerst/hafas-client'
},
query: null
})
const url = opt.endpoint + (req.query ? '?' + stringify(req.query) : '')
return fetch(url, req)
.then((res) => {
if (!res.ok) {
const err = new Error(res.statusText)
err.statusCode = res.status
throw hafasError(err)
}
return res.json()
})
.then((b) => {
if (b.err) throw hafasError(new Error(b.err))
if (!b.svcResL || !b.svcResL[0]) throw new Error('invalid response')
if (b.svcResL[0].err !== 'OK') {
throw hafasError(new Error(b.svcResL[0].errTxt))
}
const d = b.svcResL[0].res
const c = d.common || {}
if (Array.isArray(c.locL)) d.locations = c.locL.map(opt.parseLocation)
if (Array.isArray(c.prodL)) d.lines = c.prodL.map(opt.parseLine)
if (Array.isArray(c.remL)) d.remarks = c.remL.map(opt.parseRemark)
if (Array.isArray(c.opL)) d.operators = c.opL.map(opt.parseOperator)
return d
})
const createClient = (profile) => {
profile = Object.assign({}, defaultProfile, profile)
if ('function' !== profile.transformReqBody) {
throw new Error('profile.transformReqBody must be a function.')
}
if ('function' !== profile.transformReq) {
throw new Error('profile.transformReq must be a function.')
}
if ('function' !== profile.parseLocation) {
throw new Error('profile.parseLocation must be a function.')
}
if ('function' !== profile.parseLine) {
throw new Error('profile.parseLine must be a function.')
}
if ('function' !== profile.parseRemark) {
throw new Error('profile.parseRemark must be a function.')
}
if ('function' !== profile.parseOperator) {
throw new Error('profile.parseOperator must be a function.')
}
return request
const client = data => request(profile, data)
return client
}
module.exports = createRequest

53
lib/request.js Normal file
View file

@ -0,0 +1,53 @@
'use strict'
const Promise = require('pinkie-promise')
const {fetch} = require('fetch-ponyfill')({Promise})
const {stringify} = require('query-string')
const hafasError = (err) => {
err.isHafasError = true
return err
}
const request = (profile, data) => {
const body = profile.transformReqBody({lang: 'en', svcReqL: [data]})
const req = profile.transformReq({
method: 'post',
// todo: CORS? referrer policy?
body: JSON.stringify(body),
headers: {
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip, deflate',
'user-agent': 'https://github.com/derhuerst/hafas-client'
},
query: null
})
const url = profile.endpoint + (req.query ? '?' + stringify(req.query) : '')
return fetch(url, req)
.then((res) => {
if (!res.ok) {
const err = new Error(res.statusText)
err.statusCode = res.status
throw hafasError(err)
}
return res.json()
})
.then((b) => {
if (b.err) throw hafasError(new Error(b.err))
if (!b.svcResL || !b.svcResL[0]) throw new Error('invalid response')
if (b.svcResL[0].err !== 'OK') {
throw hafasError(new Error(b.svcResL[0].errTxt))
}
const d = b.svcResL[0].res
const c = d.common || {}
if (Array.isArray(c.locL)) d.locations = c.locL.map(profile.parseLocation)
if (Array.isArray(c.prodL)) d.lines = c.prodL.map(profile.parseLine)
if (Array.isArray(c.remL)) d.remarks = c.remL.map(profile.parseRemark)
if (Array.isArray(c.opL)) d.operators = c.opL.map(profile.parseOperator)
return d
})
}
module.exports = request

View file

@ -5,6 +5,7 @@
"main": "index.js",
"files": [
"index.js",
"lib",
"parse",
"stringify.js"
],