mirror of https://github.com/dirtbags/moth.git
Initial work on #190
This commit is contained in:
parent
a3d0f55160
commit
fcfa11b012
|
@ -0,0 +1,83 @@
|
||||||
|
class Server {
|
||||||
|
constructor(baseUrl) {
|
||||||
|
this.baseUrl = new URL(baseUrl)
|
||||||
|
this.teamId = null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a MOTH resource.
|
||||||
|
*
|
||||||
|
* This is just a convenience wrapper to always send teamId.
|
||||||
|
* If body is set, POST will be used instead of GET
|
||||||
|
*
|
||||||
|
* @param {String} path Path to API endpoint
|
||||||
|
* @param {Object} body Key/Values to send in POST data
|
||||||
|
* @returns {Promise} Response
|
||||||
|
*/
|
||||||
|
fetch(path, body) {
|
||||||
|
let url = new URL(path, this.baseUrl)
|
||||||
|
if (this.teamId & (!(body && body.id))) {
|
||||||
|
url.searchParams.set("id", this.teamId)
|
||||||
|
}
|
||||||
|
return fetch(url, {
|
||||||
|
method: body?"POST":"GET",
|
||||||
|
body,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a request to a JSend API endpoint.
|
||||||
|
*
|
||||||
|
* @param {String} path Path to API endpoint
|
||||||
|
* @param {Object} args Key/Values to send in POST
|
||||||
|
* @returns JSend Data
|
||||||
|
*/
|
||||||
|
async postJSend(path, args) {
|
||||||
|
let resp = await this.fetch(path, args)
|
||||||
|
if (!resp.ok) {
|
||||||
|
throw new Error(resp.statusText)
|
||||||
|
}
|
||||||
|
let obj = await resp.json()
|
||||||
|
switch (obj.status) {
|
||||||
|
case "success":
|
||||||
|
return obj.data
|
||||||
|
case "failure":
|
||||||
|
throw new Error(obj.data.description || obj.data.short || obj.data)
|
||||||
|
case "error":
|
||||||
|
throw new Error(obj.message)
|
||||||
|
default:
|
||||||
|
throw new Error(`Unknown JSend status: ${obj.status}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a team name with a team ID.
|
||||||
|
*
|
||||||
|
* This is similar to, but not exactly the same as, logging in.
|
||||||
|
* See MOTH documentation for details.
|
||||||
|
*
|
||||||
|
* @param {String} teamId
|
||||||
|
* @param {String} teamName
|
||||||
|
* @returns {String} Success message from server
|
||||||
|
*/
|
||||||
|
async Register(teamId, teamName) {
|
||||||
|
let data = await postJSend("/login", {id: teamId, name: teamName})
|
||||||
|
this.teamId = teamId
|
||||||
|
this.teamName = teamName
|
||||||
|
return data.description || data.short
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch current contest status.
|
||||||
|
*
|
||||||
|
* @returns {Object} Contest status
|
||||||
|
*/
|
||||||
|
async Status() {
|
||||||
|
let data = await this.postJSend("/status")
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
Server
|
||||||
|
}
|
Loading…
Reference in New Issue