213 lines
6.2 KiB
JavaScript
213 lines
6.2 KiB
JavaScript
var EEPROM = function(srcId, endpoint, authorization) {
|
|
var obj = {
|
|
srcId: parseInt(srcId),
|
|
endpoint: endpoint,
|
|
authorization: authorization,
|
|
};
|
|
|
|
obj.setEndpoint = function(endpoint) {
|
|
obj.endpoint = (endpoint || '').toString();
|
|
};
|
|
|
|
obj.setAuthorization = function(authorization) {
|
|
obj.authorization = (authorization || '').toString();
|
|
};
|
|
|
|
obj.deleteUpload = function(fileInfo) {
|
|
return new EEPROM.EEPROMDeleteTask(
|
|
obj.authorization,
|
|
fileInfo
|
|
);
|
|
};
|
|
|
|
obj.createUpload = function(file) {
|
|
return new EEPROM.EEPROMUploadTask(
|
|
obj.srcId,
|
|
obj.endpoint,
|
|
obj.authorization,
|
|
file
|
|
);
|
|
};
|
|
|
|
return obj;
|
|
};
|
|
EEPROM.ERR_GENERIC = 'generic';
|
|
EEPROM.ERR_INVALID = 'invalid';
|
|
EEPROM.ERR_AUTH = 'auth';
|
|
EEPROM.ERR_ACCESS = 'access';
|
|
EEPROM.ERR_DMCA = 'dmca';
|
|
EEPROM.ERR_GONE = 'gone';
|
|
EEPROM.ERR_SERVER = 'server';
|
|
EEPROM.ERR_SIZE = 'size';
|
|
|
|
EEPROM.EEPROMFile = function(fileInfo) {
|
|
var obj = {
|
|
id: (fileInfo.id || '').toString(),
|
|
url: (fileInfo.url || '').toString(),
|
|
urlf: (fileInfo.urlf || '').toString(),
|
|
thumb: (fileInfo.thumb || '').toString(),
|
|
name: (fileInfo.name || '').toString(),
|
|
type: (fileInfo.type || '').toString(),
|
|
size: parseInt(fileInfo.size || 0),
|
|
user: parseInt(fileInfo.user || 0),
|
|
hash: (fileInfo.hash || '').toString(),
|
|
created: (fileInfo.created || null),
|
|
accessed: (fileInfo.accessed || null),
|
|
expires: (fileInfo.expires || null),
|
|
deleted: (fileInfo.deleted || null),
|
|
dmca: (fileInfo.dmca || null),
|
|
};
|
|
|
|
obj.isImage = function() { return obj.type.indexOf('image/') === 0; };
|
|
obj.isAudio = function() { return obj.type === 'application/x-font-gdos' || obj.type.indexOf('audio/') === 0; };
|
|
obj.isVideo = function() { return obj.type.indexOf('video/') === 0; };
|
|
obj.isMedia = function() { return obj.isImage() || obj.isAudio() || obj.isVideo(); };
|
|
|
|
return obj;
|
|
};
|
|
|
|
EEPROM.EEPROMDeleteTask = function(authorization, fileInfo) {
|
|
var obj = {
|
|
authorization: authorization,
|
|
fileInfo: fileInfo,
|
|
onSuccess: undefined,
|
|
onFailure: undefined,
|
|
};
|
|
|
|
var xhr = obj.xhr = new XMLHttpRequest;
|
|
obj.xhr.addEventListener('readystatechange', function() {
|
|
if(xhr.readyState !== 4)
|
|
return;
|
|
|
|
if(xhr.status !== 204) {
|
|
obj.errorCode = EEPROM.ERR_GENERIC;
|
|
|
|
switch(xhr.status) {
|
|
case 401:
|
|
obj.errorCode = EEPROM.ERR_AUTH;
|
|
break;
|
|
case 403:
|
|
obj.errorCode = EEPROM.ERR_ACCESS;
|
|
break;
|
|
case 404:
|
|
case 410:
|
|
obj.errorCode = EEPROM.ERR_GONE;
|
|
break;
|
|
case 500:
|
|
case 503:
|
|
obj.errorCode = EEPROM.ERR_SERVER;
|
|
break;
|
|
}
|
|
|
|
if(obj.onFailure)
|
|
obj.onFailure(obj.errorCode);
|
|
return;
|
|
}
|
|
|
|
if(obj.onSuccess)
|
|
obj.onSuccess();
|
|
});
|
|
|
|
obj.start = function() {
|
|
xhr.open('DELETE', obj.fileInfo.urlf);
|
|
if(obj.authorization) xhr.setRequestHeader('Authorization', obj.authorization);
|
|
else xhr.withCredentials = true;
|
|
xhr.send();
|
|
};
|
|
|
|
return obj;
|
|
};
|
|
|
|
EEPROM.EEPROMUploadTask = function(srcId, endpoint, authorization, file) {
|
|
var obj = {
|
|
aborted: false,
|
|
endpoint: endpoint,
|
|
authorization: authorization,
|
|
onComplete: undefined,
|
|
onFailure: undefined,
|
|
onProgress: undefined,
|
|
failureResponse: undefined,
|
|
};
|
|
|
|
var xhr = obj.xhr = new XMLHttpRequest,
|
|
fd = obj.formData = new FormData;
|
|
|
|
fd.append('src', srcId);
|
|
fd.append('file', file);
|
|
|
|
var reportUploadProgress = function(ev) {
|
|
if(obj.onProgress)
|
|
obj.onProgress({
|
|
loaded: ev.loaded,
|
|
total: ev.total,
|
|
progress: Math.ceil((ev.loaded / ev.total) * 100),
|
|
});
|
|
};
|
|
|
|
xhr.upload.addEventListener('loadstart', reportUploadProgress);
|
|
xhr.upload.addEventListener('progress', reportUploadProgress);
|
|
xhr.upload.addEventListener('load', reportUploadProgress);
|
|
|
|
xhr.addEventListener('readystatechange', function() {
|
|
if(this.readyState !== 4)
|
|
return;
|
|
|
|
if(this.status !== 201) {
|
|
obj.failureResponse = {
|
|
userAborted: obj.aborted,
|
|
error: EEPROM.ERR_GENERIC,
|
|
};
|
|
|
|
switch(this.status) {
|
|
case 400:
|
|
case 405:
|
|
obj.failureResponse.error = EEPROM.ERR_INVALID;
|
|
break;
|
|
case 401:
|
|
obj.failureResponse.error = EEPROM.ERR_AUTH;
|
|
break;
|
|
case 403:
|
|
obj.failureResponse.error = EEPROM.ERR_ACCESS;
|
|
break;
|
|
case 404:
|
|
case 410:
|
|
obj.failureResponse.error = EEPROM.ERR_GONE;
|
|
break;
|
|
case 451:
|
|
obj.failureResponse.error = EEPROM.ERR_DMCA;
|
|
break;
|
|
case 413:
|
|
obj.failureResponse.error = EEPROM.ERR_SIZE;
|
|
obj.failureResponse.maxSize = parseInt(this.getResponseHeader('X-EEPROM-Max-Size'));
|
|
break;
|
|
case 500:
|
|
case 503:
|
|
obj.failureResponse.error = EEPROM.ERR_SERVER;
|
|
break;
|
|
}
|
|
|
|
if(obj.onFailure)
|
|
obj.onFailure(obj.failureResponse);
|
|
return;
|
|
}
|
|
|
|
obj.fileInfo = new EEPROM.EEPROMFile(JSON.parse(this.responseText));
|
|
|
|
if(obj.onComplete)
|
|
obj.onComplete(obj.fileInfo);
|
|
});
|
|
|
|
obj.abort = function() {
|
|
obj.aborted = true;
|
|
xhr.abort();
|
|
};
|
|
|
|
obj.start = function() {
|
|
xhr.open('POST', obj.endpoint);
|
|
if(obj.authorization) xhr.setRequestHeader('Authorization', obj.authorization);
|
|
else xhr.withCredentials = true;
|
|
xhr.send(fd);
|
|
};
|
|
|
|
return obj;
|
|
};
|