Spaces:
Running
Running
import xhr from 'xhr'; | |
import costumePayload from './backpack/costume-payload'; | |
import soundPayload from './backpack/sound-payload'; | |
import spritePayload from './backpack/sprite-payload'; | |
import codePayload from './backpack/code-payload'; | |
import localBackpackAPI from './tw-local-backpack-api'; | |
export const LOCAL_API = '_local_'; | |
// Add a new property for the full thumbnail url, which includes the host. | |
// Also include a full body url for loading sprite zips | |
// TODO retreiving the images through storage would allow us to remove this. | |
const includeFullUrls = (item, host) => Object.assign({}, item, { | |
thumbnailUrl: `${host}/${item.thumbnail}`, | |
bodyUrl: `${host}/${item.body}` | |
}); | |
const getBackpackContents = ({ | |
host, | |
username, | |
token, | |
limit, | |
offset | |
}) => new Promise((resolve, reject) => { | |
if (host === LOCAL_API) { | |
return resolve(localBackpackAPI.getBackpackContents({ | |
limit, | |
offset | |
})); | |
} | |
xhr({ | |
method: 'GET', | |
uri: `${host}/${username}?limit=${limit}&offset=${offset}`, | |
headers: {'x-token': token}, | |
json: true | |
}, (error, response) => { | |
if (error || response.statusCode !== 200) { | |
return reject(new Error(response.status)); | |
} | |
return resolve(response.body.map(item => includeFullUrls(item, host))); | |
}); | |
}); | |
const saveBackpackObject = ({ | |
host, | |
username, | |
token, | |
type, // Type of object being saved to the backpack | |
mime, // Mime-type of the object being saved | |
name, // User-facing name of the object being saved | |
body, // Base64-encoded body of the object being saved | |
thumbnail // Base64-encoded JPEG thumbnail of the object being saved | |
}) => new Promise((resolve, reject) => { | |
if (host === LOCAL_API) { | |
return resolve(localBackpackAPI.saveBackpackObject({ | |
type, | |
mime, | |
name, | |
body, | |
thumbnail | |
})); | |
} | |
xhr({ | |
method: 'POST', | |
uri: `${host}/${username}`, | |
headers: {'x-token': token}, | |
json: {type, mime, name, body, thumbnail} | |
}, (error, response) => { | |
if (error || response.statusCode !== 200) { | |
return reject(new Error(response.status)); | |
} | |
return resolve(includeFullUrls(response.body, host)); | |
}); | |
}); | |
const deleteBackpackObject = ({ | |
host, | |
username, | |
token, | |
id | |
}) => new Promise((resolve, reject) => { | |
if (host === LOCAL_API) { | |
return resolve(localBackpackAPI.deleteBackpackObject({ | |
id | |
})); | |
} | |
xhr({ | |
method: 'DELETE', | |
uri: `${host}/${username}/${id}`, | |
headers: {'x-token': token} | |
}, (error, response) => { | |
if (error || response.statusCode !== 200) { | |
return reject(new Error(response.status)); | |
} | |
return resolve(response.body); | |
}); | |
}); | |
const updateBackpackObject = ({ | |
host, | |
id, | |
name | |
}) => new Promise((resolve, reject) => { | |
if (host === LOCAL_API) { | |
return resolve(localBackpackAPI.updateBackpackObject({ | |
id, | |
name | |
})); | |
} | |
reject(new Error('updateBackpackObject not supported')); | |
}); | |
// Two types of backpack items are not retreivable through storage | |
// code, as json and sprite3 as arraybuffer zips. | |
const fetchAs = (responseType, uri) => new Promise((resolve, reject) => { | |
xhr({uri, responseType}, (error, response) => { | |
if (error || response.statusCode !== 200) { | |
return reject(new Error(response.status)); | |
} | |
return resolve(response.body); | |
}); | |
}); | |
// These two helpers allow easy fetching of backpack code and sprite zips | |
// Use the curried fetchAs here so the consumer does not worry about XHR responseTypes | |
const fetchCode = fetchAs.bind(null, 'json'); | |
const fetchSprite = fetchAs.bind(null, 'arraybuffer'); | |
export { | |
getBackpackContents, | |
saveBackpackObject, | |
deleteBackpackObject, | |
updateBackpackObject, | |
costumePayload, | |
soundPayload, | |
spritePayload, | |
codePayload, | |
fetchCode, | |
fetchSprite | |
}; | |