Spaces:
Running
Running
File size: 4,111 Bytes
6bcb42f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
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
};
|