Initial commit

Basic structure and proof of concept for talking with Shift via Node. Will eventually expose the remaining (known) APIs, but this was to get myself familiar with promises, http, streams, etc.
This commit is contained in:
2018-04-24 22:35:55 -05:00
committed by Parnic
commit b3f05f8329
6 changed files with 196 additions and 0 deletions

90
index.js Normal file
View File

@ -0,0 +1,90 @@
const http = require('http')
const querystring = require('querystring')
const zlib = require('zlib')
let apiKey = 'YXBpLnNoaWZ0c3RhdHMuY29tLDE5YjhhZGIwNDVjZjAxMzJhM2E5N2VmZDQ1YTRj'
class Request {
request(options) {
return new Promise((resolve, reject) => {
http.get(options, (response) => {
const { statusCode } = response
const contentType = response.headers['content-type']
let error
if (statusCode !== 200) {
error = new Error(`Request Failed.\nStatus Code: ${statusCode}`)
} else if (!/^application\/json/.test(contentType)) {
error = new Error(`Invalid content-type.\nExpected application/json but received ${contentType}`)
}
if (error) {
response.resume()
reject(error)
return
}
let rawData = ''
const gunzip = zlib.createGunzip()
gunzip.on('data', (chunk) => {
rawData += chunk
}).on('end', () => {
try {
const parsedData = JSON.parse(rawData)
resolve(parsedData)
} catch (e) {
reject(e)
}
})
response.pipe(gunzip)
}).on('error', (e) => {
reject(e)
})
})
}
}
module.exports = class ShiftRequest extends Request {
request(options) {
return super.request({
hostname: 'api.shiftstats.com',
path: this.url(options.url, options.query),
headers: options.headers
})
}
basicHeaders() {
return {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-Requested-With': 'com.digitalshift.hockeyshift',
'Accept-Language': 'en-US',
'Accept-Encoding': 'gzip,deflate',
'Connection': 'keep-alive',
}
}
headers() {
if (typeof this.headersWithTicket === 'undefined') {
this.headersWithTicket = Object.assign({'Authorization': `StatsAuth ticket="${this.ticketHash}"`}, this.basicHeaders())
}
return this.headersWithTicket
}
url(path, query) {
return `/${path}?${querystring.stringify(query)}`
}
login() {
return this.request({ url: 'login', query: {key: apiKey}, headers: this.basicHeaders() }).then((json) => {
this.ticketHash = json.ticket.hash
return json
})
}
divisionStandings(division_id, type = 'Regular Season') {
return this.request({ url: `division/${division_id}/standings`, query: {type: type}, headers: this.headers()})
}
}