ngx-uploadx
Version:
Angular Resumable Upload Module
58 lines • 9.11 kB
JavaScript
import { Uploader } from './uploader';
import { resolveUrl } from './utils';
/**
* Implements XHR/CORS Resumable Upload
* {@link https://github.com/kukhariev/node-uploadx/blob/master/proto.md Github}
* @see {@link https://developers.google.com/drive/api/v3/manage-uploads#resumable Google Drive API documentation}
*/
export class UploaderX extends Uploader {
responseType = 'json';
async getFileUrl() {
const body = JSON.stringify(this.metadata);
const headers = {
'Content-Type': 'application/json; charset=utf-8',
'X-Upload-Content-Length': this.size,
'X-Upload-Content-Type': this.file.type || 'application/octet-stream'
};
await this.request({ method: 'POST', body, url: this.endpoint, headers });
this.offset = this.getOffsetFromResponse() || (this.responseStatus === 201 ? 0 : undefined);
const location = this.getValueFromResponse('location');
if (!location) {
throw new Error('Invalid or missing Location header');
}
return resolveUrl(location, this.endpoint);
}
async sendFileContent() {
const { body, start, end } = this.getChunk();
const headers = {
'Content-Type': 'application/octet-stream',
'Content-Range': `bytes ${start}-${end - 1}/${this.size}`
};
await this.request({ method: 'PUT', body, headers });
return this.responseStatus > 201 ? this.getOffsetFromResponse() : end;
}
async getOffset() {
const headers = {
'Content-Type': 'application/octet-stream',
'Content-Range': `bytes */${this.size}`
};
await this.request({ method: 'PUT', headers });
return this.responseStatus > 201 ? this.getOffsetFromResponse() : this.size;
}
async update(data) {
const body = JSON.stringify(data);
const headers = { 'Content-Type': 'application/json; charset=utf-8' };
await this.request({ method: 'PATCH', body, headers });
const location = this.getValueFromResponse('location') || this.url;
return resolveUrl(location, this.endpoint);
}
getOffsetFromResponse() {
const range = this.getValueFromResponse('Range');
return range ? getRangeEnd(range) + 1 : undefined;
}
}
export function getRangeEnd(range = '') {
const end = parseInt(range.split(/-/)[1], 10);
return end >= 0 ? end : -1;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXJ4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3VwbG9hZHgvbGliL3VwbG9hZGVyeC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFckM7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxTQUFVLFNBQVEsUUFBUTtJQUNyQyxZQUFZLEdBQUcsTUFBZSxDQUFDO0lBRS9CLEtBQUssQ0FBQyxVQUFVO1FBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUc7WUFDZCxjQUFjLEVBQUUsaUNBQWlDO1lBQ2pELHlCQUF5QixFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ3BDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLDBCQUEwQjtTQUN0RSxDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWU7UUFDbkIsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsY0FBYyxFQUFFLDBCQUEwQjtZQUMxQyxlQUFlLEVBQUUsU0FBUyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1NBQzFELENBQUM7UUFDRixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTO1FBQ2IsTUFBTSxPQUFPLEdBQUc7WUFDZCxjQUFjLEVBQUUsMEJBQTBCO1lBQzFDLGVBQWUsRUFBRSxXQUFXLElBQUksQ0FBQyxJQUFJLEVBQUU7U0FDeEMsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM5RSxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBSSxJQUFPO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxjQUFjLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25FLE9BQU8sVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVTLHFCQUFxQjtRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQUssR0FBRyxFQUFFO0lBQ3BDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXBsb2FkZXIgfSBmcm9tICcuL3VwbG9hZGVyJztcbmltcG9ydCB7IHJlc29sdmVVcmwgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRzIFhIUi9DT1JTIFJlc3VtYWJsZSBVcGxvYWRcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20va3VraGFyaWV2L25vZGUtdXBsb2FkeC9ibG9iL21hc3Rlci9wcm90by5tZCBHaXRodWJ9XG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9kcml2ZS9hcGkvdjMvbWFuYWdlLXVwbG9hZHMjcmVzdW1hYmxlIEdvb2dsZSBEcml2ZSBBUEkgZG9jdW1lbnRhdGlvbn1cbiAqL1xuZXhwb3J0IGNsYXNzIFVwbG9hZGVyWCBleHRlbmRzIFVwbG9hZGVyIHtcbiAgcmVzcG9uc2VUeXBlID0gJ2pzb24nIGFzIGNvbnN0O1xuXG4gIGFzeW5jIGdldEZpbGVVcmwoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tZXRhZGF0YSk7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcsXG4gICAgICAnWC1VcGxvYWQtQ29udGVudC1MZW5ndGgnOiB0aGlzLnNpemUsXG4gICAgICAnWC1VcGxvYWQtQ29udGVudC1UeXBlJzogdGhpcy5maWxlLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IG1ldGhvZDogJ1BPU1QnLCBib2R5LCB1cmw6IHRoaXMuZW5kcG9pbnQsIGhlYWRlcnMgfSk7XG4gICAgdGhpcy5vZmZzZXQgPSB0aGlzLmdldE9mZnNldEZyb21SZXNwb25zZSgpIHx8ICh0aGlzLnJlc3BvbnNlU3RhdHVzID09PSAyMDEgPyAwIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZ2V0VmFsdWVGcm9tUmVzcG9uc2UoJ2xvY2F0aW9uJyk7XG4gICAgaWYgKCFsb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG9yIG1pc3NpbmcgTG9jYXRpb24gaGVhZGVyJyk7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlVXJsKGxvY2F0aW9uLCB0aGlzLmVuZHBvaW50KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRGaWxlQ29udGVudCgpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHsgYm9keSwgc3RhcnQsIGVuZCB9ID0gdGhpcy5nZXRDaHVuaygpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsXG4gICAgICAnQ29udGVudC1SYW5nZSc6IGBieXRlcyAke3N0YXJ0fS0ke2VuZCAtIDF9LyR7dGhpcy5zaXplfWBcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IG1ldGhvZDogJ1BVVCcsIGJvZHksIGhlYWRlcnMgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VTdGF0dXMgPiAyMDEgPyB0aGlzLmdldE9mZnNldEZyb21SZXNwb25zZSgpIDogZW5kO1xuICB9XG5cbiAgYXN5bmMgZ2V0T2Zmc2V0KCk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICdDb250ZW50LVJhbmdlJzogYGJ5dGVzICovJHt0aGlzLnNpemV9YFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHsgbWV0aG9kOiAnUFVUJywgaGVhZGVycyB9KTtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVN0YXR1cyA+IDIwMSA/IHRoaXMuZ2V0T2Zmc2V0RnJvbVJlc3BvbnNlKCkgOiB0aGlzLnNpemU7XG4gIH1cblxuICBhc3luYyB1cGRhdGU8VD4oZGF0YTogVCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcgfTtcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyBtZXRob2Q6ICdQQVRDSCcsIGJvZHksIGhlYWRlcnMgfSk7XG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmdldFZhbHVlRnJvbVJlc3BvbnNlKCdsb2NhdGlvbicpIHx8IHRoaXMudXJsO1xuICAgIHJldHVybiByZXNvbHZlVXJsKGxvY2F0aW9uLCB0aGlzLmVuZHBvaW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRPZmZzZXRGcm9tUmVzcG9uc2UoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0VmFsdWVGcm9tUmVzcG9uc2UoJ1JhbmdlJyk7XG4gICAgcmV0dXJuIHJhbmdlID8gZ2V0UmFuZ2VFbmQocmFuZ2UpICsgMSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZ2VFbmQocmFuZ2UgPSAnJyk6IG51bWJlciB7XG4gIGNvbnN0IGVuZCA9IHBhcnNlSW50KHJhbmdlLnNwbGl0KC8tLylbMV0sIDEwKTtcbiAgcmV0dXJuIGVuZCA+PSAwID8gZW5kIDogLTE7XG59XG4iXX0=