tus-js-client
Advanced tools
Comparing version 1.2.1 to 1.3.0
@@ -125,2 +125,45 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.tus = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){ | ||
}); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | ||
var DetailedError = function (_Error) { | ||
_inherits(DetailedError, _Error); | ||
function DetailedError(error) { | ||
var causingErr = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; | ||
var xhr = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; | ||
_classCallCheck(this, DetailedError); | ||
var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(DetailedError).call(this, error.message)); | ||
_this.originalRequest = xhr; | ||
_this.causingError = causingErr; | ||
var message = error.message; | ||
if (causingErr != null) { | ||
message += ", caused by " + causingErr.toString(); | ||
} | ||
if (xhr != null) { | ||
message += ", originated from request (response code: " + xhr.status + ", response text: " + xhr.responseText + ")"; | ||
} | ||
_this.message = message; | ||
return _this; | ||
} | ||
return DetailedError; | ||
}(Error); | ||
exports.default = DetailedError; | ||
},{}],6:[function(_dereq_,module,exports){ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.default = fingerprint; | ||
@@ -137,3 +180,3 @@ /** | ||
},{}],6:[function(_dereq_,module,exports){ | ||
},{}],7:[function(_dereq_,module,exports){ | ||
"use strict"; | ||
@@ -176,3 +219,3 @@ | ||
},{"./node/storage":4,"./upload":7}],7:[function(_dereq_,module,exports){ | ||
},{"./node/storage":4,"./upload":8}],8:[function(_dereq_,module,exports){ | ||
"use strict"; | ||
@@ -195,2 +238,6 @@ | ||
var _error = _dereq_("./error"); | ||
var _error2 = _interopRequireDefault(_error); | ||
var _extend = _dereq_("extend"); | ||
@@ -338,5 +385,4 @@ | ||
key: "_emitXhrError", | ||
value: function _emitXhrError(xhr, err) { | ||
err.originalRequest = xhr; | ||
this._emitError(err); | ||
value: function _emitXhrError(xhr, err, causingErr) { | ||
this._emitError(new _error2.default(err, causingErr, xhr)); | ||
} | ||
@@ -445,4 +491,4 @@ }, { | ||
xhr.onerror = function () { | ||
_this._emitXhrError(xhr, new Error("tus: failed to create upload")); | ||
xhr.onerror = function (err) { | ||
_this._emitXhrError(xhr, new Error("tus: failed to create upload"), err); | ||
}; | ||
@@ -516,4 +562,4 @@ | ||
xhr.onerror = function () { | ||
_this2._emitXhrError(xhr, new Error("tus: failed to resume upload")); | ||
xhr.onerror = function (err) { | ||
_this2._emitXhrError(xhr, new Error("tus: failed to resume upload"), err); | ||
}; | ||
@@ -577,3 +623,3 @@ | ||
xhr.onerror = function () { | ||
xhr.onerror = function (err) { | ||
// Don't emit an error if the upload was aborted manually | ||
@@ -584,3 +630,3 @@ if (_this3._aborted) { | ||
_this3._emitXhrError(xhr, new Error("tus: failed to upload chunk at offset " + _this3._offset)); | ||
_this3._emitXhrError(xhr, new Error("tus: failed to upload chunk at offset " + _this3._offset), err); | ||
}; | ||
@@ -639,3 +685,3 @@ | ||
},{"./fingerprint":5,"./node/base64":1,"./node/request":2,"./node/source":3,"./node/storage":4,"extend":8}],8:[function(_dereq_,module,exports){ | ||
},{"./error":5,"./fingerprint":6,"./node/base64":1,"./node/request":2,"./node/source":3,"./node/storage":4,"extend":9}],9:[function(_dereq_,module,exports){ | ||
'use strict'; | ||
@@ -728,4 +774,4 @@ | ||
},{}]},{},[6])(6) | ||
},{}]},{},[7])(7) | ||
}); | ||
//# sourceMappingURL=tus.js.map |
@@ -1,2 +0,2 @@ | ||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.tus=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.encode=encode;var _window=window;var btoa=_window.btoa;function encode(data){return btoa(unescape(encodeURIComponent(data)))}var isSupported=exports.isSupported="btoa"in window},{}],2:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.newRequest=newRequest;function newRequest(){return new window.XMLHttpRequest}},{}],3:[function(_dereq_,module,exports){"use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}();Object.defineProperty(exports,"__esModule",{value:true});exports.getSource=getSource;function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var FileSource=function(){function FileSource(file){_classCallCheck(this,FileSource);this._file=file;this.size=file.size}_createClass(FileSource,[{key:"slice",value:function slice(start,end){return this._file.slice(start,end)}},{key:"close",value:function close(){}}]);return FileSource}();function getSource(input){if(typeof input.slice==="function"&&typeof input.size!=="undefined"){return new FileSource(input)}throw new Error("source object may only be an instance of File or Blob in this environment")}},{}],4:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.setItem=setItem;exports.getItem=getItem;exports.removeItem=removeItem;var hasStorage=false;try{hasStorage="localStorage"in window;localStorage.length}catch(e){if(e.code===e.SECURITY_ERR){hasStorage=false}else{throw e}}var canStoreURLs=exports.canStoreURLs=hasStorage;function setItem(key,value){if(!hasStorage)return;return localStorage.setItem(key,value)}function getItem(key){if(!hasStorage)return;return localStorage.getItem(key)}function removeItem(key){if(!hasStorage)return;return localStorage.removeItem(key)}},{}],5:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=fingerprint;function fingerprint(file){return["tus",file.name,file.type,file.size,file.lastModified].join("-")}},{}],6:[function(_dereq_,module,exports){"use strict";var _upload=_dereq_("./upload");var _upload2=_interopRequireDefault(_upload);var _storage=_dereq_("./node/storage");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}var defaultOptions=_upload2.default.defaultOptions;if(typeof window!=="undefined"){var _window=window;var XMLHttpRequest=_window.XMLHttpRequest;var Blob=_window.Blob;var isSupported=XMLHttpRequest&&Blob&&typeof Blob.prototype.slice==="function"}else{var isSupported=true}module.exports={Upload:_upload2.default,isSupported:isSupported,canStoreURLs:_storage.canStoreURLs,defaultOptions:defaultOptions}},{"./node/storage":4,"./upload":7}],7:[function(_dereq_,module,exports){"use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}();Object.defineProperty(exports,"__esModule",{value:true});var _fingerprint=_dereq_("./fingerprint");var _fingerprint2=_interopRequireDefault(_fingerprint);var _extend=_dereq_("extend");var _extend2=_interopRequireDefault(_extend);var _request=_dereq_("./node/request");var _source=_dereq_("./node/source");var _base=_dereq_("./node/base64");var Base64=_interopRequireWildcard(_base);var _storage=_dereq_("./node/storage");var Storage=_interopRequireWildcard(_storage);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var defaultOptions={endpoint:"",fingerprint:_fingerprint2.default,resume:true,onProgress:null,onChunkComplete:null,onSuccess:null,onError:null,headers:{},chunkSize:Infinity,withCredentials:false,uploadUrl:null,uploadSize:null,overridePatchMethod:false};var Upload=function(){function Upload(file,options){_classCallCheck(this,Upload);this.options=(0,_extend2.default)(true,{},defaultOptions,options);this.file=file;this.url=null;this._xhr=null;this._fingerprint=null;this._offset=null;this._aborted=false;this._size=null;this._source=null}_createClass(Upload,[{key:"start",value:function start(){var file=this.file;if(!file){this._emitError(new Error("tus: no file or stream to upload provided"));return}if(!this.options.endpoint){this._emitError(new Error("tus: no endpoint provided"));return}var source=this._source=(0,_source.getSource)(file,this.options.chunkSize);if(this.options.uploadSize!=null){var size=+this.options.uploadSize;if(isNaN(size)){throw new Error("tus: cannot convert `uploadSize` option into a number")}this._size=size}else{var size=source.size;if(size==null){throw new Error("tus: cannot automatically derive upload's size from input and must be specified manually using the `uploadSize` option")}this._size=size}if(this.options.uploadUrl!=null){this.url=this.options.uploadUrl;this._resumeUpload();return}if(this.options.resume){this._fingerprint=this.options.fingerprint(file);var resumedUrl=Storage.getItem(this._fingerprint);if(resumedUrl!=null){this.url=resumedUrl;this._resumeUpload();return}}this._createUpload()}},{key:"abort",value:function abort(){if(this._xhr!==null){this._xhr.abort();this._source.close();this._aborted=true}}},{key:"_emitXhrError",value:function _emitXhrError(xhr,err){err.originalRequest=xhr;this._emitError(err)}},{key:"_emitError",value:function _emitError(err){if(typeof this.options.onError==="function"){this.options.onError(err)}else{throw err}}},{key:"_emitSuccess",value:function _emitSuccess(){if(typeof this.options.onSuccess==="function"){this.options.onSuccess()}}},{key:"_emitProgress",value:function _emitProgress(bytesSent,bytesTotal){if(typeof this.options.onProgress==="function"){this.options.onProgress(bytesSent,bytesTotal)}}},{key:"_emitChunkComplete",value:function _emitChunkComplete(chunkSize,bytesAccepted,bytesTotal){if(typeof this.options.onChunkComplete==="function"){this.options.onChunkComplete(chunkSize,bytesAccepted,bytesTotal)}}},{key:"_setupXHR",value:function _setupXHR(xhr){xhr.setRequestHeader("Tus-Resumable","1.0.0");var headers=this.options.headers;for(var name in headers){xhr.setRequestHeader(name,headers[name])}xhr.withCredentials=this.options.withCredentials}},{key:"_createUpload",value:function _createUpload(){var _this=this;var xhr=(0,_request.newRequest)();xhr.open("POST",this.options.endpoint,true);xhr.onload=function(){if(!(xhr.status>=200&&xhr.status<300)){_this._emitXhrError(xhr,new Error("tus: unexpected response while creating upload"));return}_this.url=xhr.getResponseHeader("Location");if(_this.options.resume){Storage.setItem(_this._fingerprint,_this.url)}_this._offset=0;_this._startUpload()};xhr.onerror=function(){_this._emitXhrError(xhr,new Error("tus: failed to create upload"))};this._setupXHR(xhr);xhr.setRequestHeader("Upload-Length",this._size);var metadata=encodeMetadata(this.options.metadata);if(metadata!==""){xhr.setRequestHeader("Upload-Metadata",metadata)}xhr.send(null)}},{key:"_resumeUpload",value:function _resumeUpload(){var _this2=this;var xhr=(0,_request.newRequest)();xhr.open("HEAD",this.url,true);xhr.onload=function(){if(!(xhr.status>=200&&xhr.status<300)){if(_this2.options.resume){Storage.removeItem(_this2._fingerprint)}_this2.url=null;_this2._createUpload();return}var offset=parseInt(xhr.getResponseHeader("Upload-Offset"),10);if(isNaN(offset)){_this2._emitXhrError(xhr,new Error("tus: invalid or missing offset value"));return}var length=parseInt(xhr.getResponseHeader("Upload-Length"),10);if(isNaN(length)){_this2._emitXhrError(xhr,new Error("tus: invalid or missing length value"));return}if(offset===length){_this2._emitProgress(length,length);_this2._emitSuccess();return}_this2._offset=offset;_this2._startUpload()};xhr.onerror=function(){_this2._emitXhrError(xhr,new Error("tus: failed to resume upload"))};this._setupXHR(xhr);xhr.send(null)}},{key:"_startUpload",value:function _startUpload(){var _this3=this;var xhr=this._xhr=(0,_request.newRequest)();if(this.options.overridePatchMethod){xhr.open("POST",this.url,true);xhr.setRequestHeader("X-HTTP-Method-Override","PATCH")}else{xhr.open("PATCH",this.url,true)}xhr.onload=function(){if(!(xhr.status>=200&&xhr.status<300)){_this3._emitXhrError(xhr,new Error("tus: unexpected response while uploading chunk"));return}var offset=parseInt(xhr.getResponseHeader("Upload-Offset"),10);if(isNaN(offset)){_this3._emitXhrError(xhr,new Error("tus: invalid or missing offset value"));return}_this3._emitProgress(offset,_this3._size);_this3._emitChunkComplete(offset-_this3._offset,offset,_this3._size);_this3._offset=offset;if(offset==_this3._size){_this3._emitSuccess();_this3._source.close();return}_this3._startUpload()};xhr.onerror=function(){if(_this3._aborted){return}_this3._emitXhrError(xhr,new Error("tus: failed to upload chunk at offset "+_this3._offset))};if("upload"in xhr){xhr.upload.onprogress=function(e){if(!e.lengthComputable){return}_this3._emitProgress(start+e.loaded,_this3._size)}}this._setupXHR(xhr);xhr.setRequestHeader("Upload-Offset",this._offset);xhr.setRequestHeader("Content-Type","application/offset+octet-stream");var start=this._offset;var end=this._offset+this.options.chunkSize;if(end===Infinity||end>this._size){end=this._size}xhr.send(this._source.slice(start,end))}}]);return Upload}();function encodeMetadata(metadata){if(!Base64.isSupported){return""}var encoded=[];for(var key in metadata){encoded.push(key+" "+Base64.encode(metadata[key]))}return encoded.join(",")}Upload.defaultOptions=defaultOptions;exports.default=Upload},{"./fingerprint":5,"./node/base64":1,"./node/request":2,"./node/source":3,"./node/storage":4,extend:8}],8:[function(_dereq_,module,exports){"use strict";var hasOwn=Object.prototype.hasOwnProperty;var toStr=Object.prototype.toString;var isArray=function isArray(arr){if(typeof Array.isArray==="function"){return Array.isArray(arr)}return toStr.call(arr)==="[object Array]"};var isPlainObject=function isPlainObject(obj){if(!obj||toStr.call(obj)!=="[object Object]"){return false}var hasOwnConstructor=hasOwn.call(obj,"constructor");var hasIsPrototypeOf=obj.constructor&&obj.constructor.prototype&&hasOwn.call(obj.constructor.prototype,"isPrototypeOf");if(obj.constructor&&!hasOwnConstructor&&!hasIsPrototypeOf){return false}var key;for(key in obj){}return typeof key==="undefined"||hasOwn.call(obj,key)};module.exports=function extend(){var options,name,src,copy,copyIsArray,clone,target=arguments[0],i=1,length=arguments.length,deep=false;if(typeof target==="boolean"){deep=target;target=arguments[1]||{};i=2}else if(typeof target!=="object"&&typeof target!=="function"||target==null){target={}}for(;i<length;++i){options=arguments[i];if(options!=null){for(name in options){src=target[name];copy=options[name];if(target!==copy){if(deep&©&&(isPlainObject(copy)||(copyIsArray=isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&isArray(src)?src:[]}else{clone=src&&isPlainObject(src)?src:{}}target[name]=extend(deep,clone,copy)}else if(typeof copy!=="undefined"){target[name]=copy}}}}}return target}},{}]},{},[6])(6)}); | ||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.tus=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.encode=encode;var _window=window;var btoa=_window.btoa;function encode(data){return btoa(unescape(encodeURIComponent(data)))}var isSupported=exports.isSupported="btoa"in window},{}],2:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.newRequest=newRequest;function newRequest(){return new window.XMLHttpRequest}},{}],3:[function(_dereq_,module,exports){"use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}();Object.defineProperty(exports,"__esModule",{value:true});exports.getSource=getSource;function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var FileSource=function(){function FileSource(file){_classCallCheck(this,FileSource);this._file=file;this.size=file.size}_createClass(FileSource,[{key:"slice",value:function slice(start,end){return this._file.slice(start,end)}},{key:"close",value:function close(){}}]);return FileSource}();function getSource(input){if(typeof input.slice==="function"&&typeof input.size!=="undefined"){return new FileSource(input)}throw new Error("source object may only be an instance of File or Blob in this environment")}},{}],4:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.setItem=setItem;exports.getItem=getItem;exports.removeItem=removeItem;var hasStorage=false;try{hasStorage="localStorage"in window;localStorage.length}catch(e){if(e.code===e.SECURITY_ERR){hasStorage=false}else{throw e}}var canStoreURLs=exports.canStoreURLs=hasStorage;function setItem(key,value){if(!hasStorage)return;return localStorage.setItem(key,value)}function getItem(key){if(!hasStorage)return;return localStorage.getItem(key)}function removeItem(key){if(!hasStorage)return;return localStorage.removeItem(key)}},{}],5:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return call&&(typeof call==="object"||typeof call==="function")?call:self}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass)}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass}var DetailedError=function(_Error){_inherits(DetailedError,_Error);function DetailedError(error){var causingErr=arguments.length<=1||arguments[1]===undefined?null:arguments[1];var xhr=arguments.length<=2||arguments[2]===undefined?null:arguments[2];_classCallCheck(this,DetailedError);var _this=_possibleConstructorReturn(this,Object.getPrototypeOf(DetailedError).call(this,error.message));_this.originalRequest=xhr;_this.causingError=causingErr;var message=error.message;if(causingErr!=null){message+=", caused by "+causingErr.toString()}if(xhr!=null){message+=", originated from request (response code: "+xhr.status+", response text: "+xhr.responseText+")"}_this.message=message;return _this}return DetailedError}(Error);exports.default=DetailedError},{}],6:[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=fingerprint;function fingerprint(file){return["tus",file.name,file.type,file.size,file.lastModified].join("-")}},{}],7:[function(_dereq_,module,exports){"use strict";var _upload=_dereq_("./upload");var _upload2=_interopRequireDefault(_upload);var _storage=_dereq_("./node/storage");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}var defaultOptions=_upload2.default.defaultOptions;if(typeof window!=="undefined"){var _window=window;var XMLHttpRequest=_window.XMLHttpRequest;var Blob=_window.Blob;var isSupported=XMLHttpRequest&&Blob&&typeof Blob.prototype.slice==="function"}else{var isSupported=true}module.exports={Upload:_upload2.default,isSupported:isSupported,canStoreURLs:_storage.canStoreURLs,defaultOptions:defaultOptions}},{"./node/storage":4,"./upload":8}],8:[function(_dereq_,module,exports){"use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}();Object.defineProperty(exports,"__esModule",{value:true});var _fingerprint=_dereq_("./fingerprint");var _fingerprint2=_interopRequireDefault(_fingerprint);var _error=_dereq_("./error");var _error2=_interopRequireDefault(_error);var _extend=_dereq_("extend");var _extend2=_interopRequireDefault(_extend);var _request=_dereq_("./node/request");var _source=_dereq_("./node/source");var _base=_dereq_("./node/base64");var Base64=_interopRequireWildcard(_base);var _storage=_dereq_("./node/storage");var Storage=_interopRequireWildcard(_storage);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var defaultOptions={endpoint:"",fingerprint:_fingerprint2.default,resume:true,onProgress:null,onChunkComplete:null,onSuccess:null,onError:null,headers:{},chunkSize:Infinity,withCredentials:false,uploadUrl:null,uploadSize:null,overridePatchMethod:false};var Upload=function(){function Upload(file,options){_classCallCheck(this,Upload);this.options=(0,_extend2.default)(true,{},defaultOptions,options);this.file=file;this.url=null;this._xhr=null;this._fingerprint=null;this._offset=null;this._aborted=false;this._size=null;this._source=null}_createClass(Upload,[{key:"start",value:function start(){var file=this.file;if(!file){this._emitError(new Error("tus: no file or stream to upload provided"));return}if(!this.options.endpoint){this._emitError(new Error("tus: no endpoint provided"));return}var source=this._source=(0,_source.getSource)(file,this.options.chunkSize);if(this.options.uploadSize!=null){var size=+this.options.uploadSize;if(isNaN(size)){throw new Error("tus: cannot convert `uploadSize` option into a number")}this._size=size}else{var size=source.size;if(size==null){throw new Error("tus: cannot automatically derive upload's size from input and must be specified manually using the `uploadSize` option")}this._size=size}if(this.options.uploadUrl!=null){this.url=this.options.uploadUrl;this._resumeUpload();return}if(this.options.resume){this._fingerprint=this.options.fingerprint(file);var resumedUrl=Storage.getItem(this._fingerprint);if(resumedUrl!=null){this.url=resumedUrl;this._resumeUpload();return}}this._createUpload()}},{key:"abort",value:function abort(){if(this._xhr!==null){this._xhr.abort();this._source.close();this._aborted=true}}},{key:"_emitXhrError",value:function _emitXhrError(xhr,err,causingErr){this._emitError(new _error2.default(err,causingErr,xhr))}},{key:"_emitError",value:function _emitError(err){if(typeof this.options.onError==="function"){this.options.onError(err)}else{throw err}}},{key:"_emitSuccess",value:function _emitSuccess(){if(typeof this.options.onSuccess==="function"){this.options.onSuccess()}}},{key:"_emitProgress",value:function _emitProgress(bytesSent,bytesTotal){if(typeof this.options.onProgress==="function"){this.options.onProgress(bytesSent,bytesTotal)}}},{key:"_emitChunkComplete",value:function _emitChunkComplete(chunkSize,bytesAccepted,bytesTotal){if(typeof this.options.onChunkComplete==="function"){this.options.onChunkComplete(chunkSize,bytesAccepted,bytesTotal)}}},{key:"_setupXHR",value:function _setupXHR(xhr){xhr.setRequestHeader("Tus-Resumable","1.0.0");var headers=this.options.headers;for(var name in headers){xhr.setRequestHeader(name,headers[name])}xhr.withCredentials=this.options.withCredentials}},{key:"_createUpload",value:function _createUpload(){var _this=this;var xhr=(0,_request.newRequest)();xhr.open("POST",this.options.endpoint,true);xhr.onload=function(){if(!(xhr.status>=200&&xhr.status<300)){_this._emitXhrError(xhr,new Error("tus: unexpected response while creating upload"));return}_this.url=xhr.getResponseHeader("Location");if(_this.options.resume){Storage.setItem(_this._fingerprint,_this.url)}_this._offset=0;_this._startUpload()};xhr.onerror=function(err){_this._emitXhrError(xhr,new Error("tus: failed to create upload"),err)};this._setupXHR(xhr);xhr.setRequestHeader("Upload-Length",this._size);var metadata=encodeMetadata(this.options.metadata);if(metadata!==""){xhr.setRequestHeader("Upload-Metadata",metadata)}xhr.send(null)}},{key:"_resumeUpload",value:function _resumeUpload(){var _this2=this;var xhr=(0,_request.newRequest)();xhr.open("HEAD",this.url,true);xhr.onload=function(){if(!(xhr.status>=200&&xhr.status<300)){if(_this2.options.resume){Storage.removeItem(_this2._fingerprint)}_this2.url=null;_this2._createUpload();return}var offset=parseInt(xhr.getResponseHeader("Upload-Offset"),10);if(isNaN(offset)){_this2._emitXhrError(xhr,new Error("tus: invalid or missing offset value"));return}var length=parseInt(xhr.getResponseHeader("Upload-Length"),10);if(isNaN(length)){_this2._emitXhrError(xhr,new Error("tus: invalid or missing length value"));return}if(offset===length){_this2._emitProgress(length,length);_this2._emitSuccess();return}_this2._offset=offset;_this2._startUpload()};xhr.onerror=function(err){_this2._emitXhrError(xhr,new Error("tus: failed to resume upload"),err)};this._setupXHR(xhr);xhr.send(null)}},{key:"_startUpload",value:function _startUpload(){var _this3=this;var xhr=this._xhr=(0,_request.newRequest)();if(this.options.overridePatchMethod){xhr.open("POST",this.url,true);xhr.setRequestHeader("X-HTTP-Method-Override","PATCH")}else{xhr.open("PATCH",this.url,true)}xhr.onload=function(){if(!(xhr.status>=200&&xhr.status<300)){_this3._emitXhrError(xhr,new Error("tus: unexpected response while uploading chunk"));return}var offset=parseInt(xhr.getResponseHeader("Upload-Offset"),10);if(isNaN(offset)){_this3._emitXhrError(xhr,new Error("tus: invalid or missing offset value"));return}_this3._emitProgress(offset,_this3._size);_this3._emitChunkComplete(offset-_this3._offset,offset,_this3._size);_this3._offset=offset;if(offset==_this3._size){_this3._emitSuccess();_this3._source.close();return}_this3._startUpload()};xhr.onerror=function(err){if(_this3._aborted){return}_this3._emitXhrError(xhr,new Error("tus: failed to upload chunk at offset "+_this3._offset),err)};if("upload"in xhr){xhr.upload.onprogress=function(e){if(!e.lengthComputable){return}_this3._emitProgress(start+e.loaded,_this3._size)}}this._setupXHR(xhr);xhr.setRequestHeader("Upload-Offset",this._offset);xhr.setRequestHeader("Content-Type","application/offset+octet-stream");var start=this._offset;var end=this._offset+this.options.chunkSize;if(end===Infinity||end>this._size){end=this._size}xhr.send(this._source.slice(start,end))}}]);return Upload}();function encodeMetadata(metadata){if(!Base64.isSupported){return""}var encoded=[];for(var key in metadata){encoded.push(key+" "+Base64.encode(metadata[key]))}return encoded.join(",")}Upload.defaultOptions=defaultOptions;exports.default=Upload},{"./error":5,"./fingerprint":6,"./node/base64":1,"./node/request":2,"./node/source":3,"./node/storage":4,extend:9}],9:[function(_dereq_,module,exports){"use strict";var hasOwn=Object.prototype.hasOwnProperty;var toStr=Object.prototype.toString;var isArray=function isArray(arr){if(typeof Array.isArray==="function"){return Array.isArray(arr)}return toStr.call(arr)==="[object Array]"};var isPlainObject=function isPlainObject(obj){if(!obj||toStr.call(obj)!=="[object Object]"){return false}var hasOwnConstructor=hasOwn.call(obj,"constructor");var hasIsPrototypeOf=obj.constructor&&obj.constructor.prototype&&hasOwn.call(obj.constructor.prototype,"isPrototypeOf");if(obj.constructor&&!hasOwnConstructor&&!hasIsPrototypeOf){return false}var key;for(key in obj){}return typeof key==="undefined"||hasOwn.call(obj,key)};module.exports=function extend(){var options,name,src,copy,copyIsArray,clone,target=arguments[0],i=1,length=arguments.length,deep=false;if(typeof target==="boolean"){deep=target;target=arguments[1]||{};i=2}else if(typeof target!=="object"&&typeof target!=="function"||target==null){target={}}for(;i<length;++i){options=arguments[i];if(options!=null){for(name in options){src=target[name];copy=options[name];if(target!==copy){if(deep&©&&(isPlainObject(copy)||(copyIsArray=isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&isArray(src)?src:[]}else{clone=src&&isPlainObject(src)?src:{}}target[name]=extend(deep,clone,copy)}else if(typeof copy!=="undefined"){target[name]=copy}}}}}return target}},{}]},{},[7])(7)}); | ||
//# sourceMappingURL=tus.min.js.map |
@@ -15,2 +15,6 @@ // Generated by Babel | ||
var _https = require("https"); | ||
var https = _interopRequireWildcard(_https); | ||
var _url = require("url"); | ||
@@ -22,2 +26,6 @@ | ||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
@@ -42,4 +50,8 @@ | ||
this.upload = {}; | ||
this.upload.onprogress = noop; | ||
// Ignored field | ||
this.withCredentials = false; | ||
this.responseText = ""; | ||
} | ||
@@ -68,3 +80,3 @@ | ||
var req = this._request = http.request(options); | ||
var req = this._request = options.protocol !== "https:" ? http.request(options) : https.request(options); | ||
req.on("response", function (res) { | ||
@@ -82,3 +94,3 @@ _this.status = res.statusCode; | ||
if (body instanceof _stream.Readable) { | ||
body.pipe(req); | ||
body.pipe(new ProgressEmitter(this.upload.onprogress)).pipe(req); | ||
} else { | ||
@@ -103,4 +115,37 @@ req.end(body); | ||
// ProgressEmitter is a simple PassThrough-style transform stream which keeps | ||
// track of the number of bytes which have been piped through it and will | ||
// invoke the `onprogress` function whenever new number are available. | ||
var ProgressEmitter = function (_Transform) { | ||
_inherits(ProgressEmitter, _Transform); | ||
function ProgressEmitter(onprogress) { | ||
_classCallCheck(this, ProgressEmitter); | ||
var _this2 = _possibleConstructorReturn(this, Object.getPrototypeOf(ProgressEmitter).call(this)); | ||
_this2._onprogress = onprogress; | ||
_this2._position = 0; | ||
return _this2; | ||
} | ||
_createClass(ProgressEmitter, [{ | ||
key: "_transform", | ||
value: function _transform(chunk, encoding, callback) { | ||
this._position += chunk.length; | ||
this._onprogress({ | ||
lengthComputable: true, | ||
loaded: this._position | ||
}); | ||
callback(null, chunk); | ||
} | ||
}]); | ||
return ProgressEmitter; | ||
}(_stream.Transform); | ||
function newRequest() { | ||
return new Request(); | ||
} |
@@ -19,2 +19,6 @@ // Generated by Babel | ||
var _error = require("./error"); | ||
var _error2 = _interopRequireDefault(_error); | ||
var _extend = require("extend"); | ||
@@ -162,5 +166,4 @@ | ||
key: "_emitXhrError", | ||
value: function _emitXhrError(xhr, err) { | ||
err.originalRequest = xhr; | ||
this._emitError(err); | ||
value: function _emitXhrError(xhr, err, causingErr) { | ||
this._emitError(new _error2.default(err, causingErr, xhr)); | ||
} | ||
@@ -269,4 +272,4 @@ }, { | ||
xhr.onerror = function () { | ||
_this._emitXhrError(xhr, new Error("tus: failed to create upload")); | ||
xhr.onerror = function (err) { | ||
_this._emitXhrError(xhr, new Error("tus: failed to create upload"), err); | ||
}; | ||
@@ -340,4 +343,4 @@ | ||
xhr.onerror = function () { | ||
_this2._emitXhrError(xhr, new Error("tus: failed to resume upload")); | ||
xhr.onerror = function (err) { | ||
_this2._emitXhrError(xhr, new Error("tus: failed to resume upload"), err); | ||
}; | ||
@@ -401,3 +404,3 @@ | ||
xhr.onerror = function () { | ||
xhr.onerror = function (err) { | ||
// Don't emit an error if the upload was aborted manually | ||
@@ -408,3 +411,3 @@ if (_this3._aborted) { | ||
_this3._emitXhrError(xhr, new Error("tus: failed to upload chunk at offset " + _this3._offset)); | ||
_this3._emitXhrError(xhr, new Error("tus: failed to upload chunk at offset " + _this3._offset), err); | ||
}; | ||
@@ -411,0 +414,0 @@ |
import * as http from "http"; | ||
import * as https from "https"; | ||
import {parse} from "url"; | ||
import {Readable} from "stream"; | ||
import {Readable, Transform} from "stream"; | ||
@@ -20,4 +21,8 @@ function noop() {} | ||
this.upload = {}; | ||
this.upload.onprogress = noop; | ||
// Ignored field | ||
this.withCredentials = false; | ||
this.responseText = ""; | ||
} | ||
@@ -40,3 +45,3 @@ | ||
let req = this._request = http.request(options); | ||
let req = this._request = (options.protocol !== "https:")? http.request(options) : https.request(options); | ||
req.on("response", (res) => { | ||
@@ -54,3 +59,3 @@ this.status = res.statusCode; | ||
if (body instanceof Readable) { | ||
body.pipe(req); | ||
body.pipe(new ProgressEmitter(this.upload.onprogress)).pipe(req); | ||
} else { | ||
@@ -70,4 +75,25 @@ req.end(body); | ||
// ProgressEmitter is a simple PassThrough-style transform stream which keeps | ||
// track of the number of bytes which have been piped through it and will | ||
// invoke the `onprogress` function whenever new number are available. | ||
class ProgressEmitter extends Transform { | ||
constructor(onprogress) { | ||
super(); | ||
this._onprogress = onprogress; | ||
this._position = 0; | ||
} | ||
_transform(chunk, encoding, callback) { | ||
this._position += chunk.length; | ||
this._onprogress({ | ||
lengthComputable: true, | ||
loaded: this._position | ||
}); | ||
callback(null, chunk); | ||
} | ||
} | ||
export function newRequest() { | ||
return new Request(); | ||
} |
/* global window */ | ||
import fingerprint from "./fingerprint"; | ||
import DetailedError from "./error"; | ||
import extend from "extend"; | ||
@@ -126,5 +127,4 @@ | ||
_emitXhrError(xhr, err) { | ||
err.originalRequest = xhr; | ||
this._emitError(err); | ||
_emitXhrError(xhr, err, causingErr) { | ||
this._emitError(new DetailedError(err, causingErr, xhr)); | ||
} | ||
@@ -217,4 +217,4 @@ | ||
xhr.onerror = () => { | ||
this._emitXhrError(xhr, new Error("tus: failed to create upload")); | ||
xhr.onerror = (err) => { | ||
this._emitXhrError(xhr, new Error("tus: failed to create upload"), err); | ||
}; | ||
@@ -283,4 +283,4 @@ | ||
xhr.onerror = () => { | ||
this._emitXhrError(xhr, new Error("tus: failed to resume upload")); | ||
xhr.onerror = (err) => { | ||
this._emitXhrError(xhr, new Error("tus: failed to resume upload"), err); | ||
}; | ||
@@ -339,3 +339,3 @@ | ||
xhr.onerror = () => { | ||
xhr.onerror = (err) => { | ||
// Don't emit an error if the upload was aborted manually | ||
@@ -346,3 +346,3 @@ if (this._aborted) { | ||
this._emitXhrError(xhr, new Error("tus: failed to upload chunk at offset " + this._offset)); | ||
this._emitXhrError(xhr, new Error("tus: failed to upload chunk at offset " + this._offset), err); | ||
}; | ||
@@ -349,0 +349,0 @@ |
{ | ||
"name": "tus-js-client", | ||
"version": "1.2.1", | ||
"version": "1.3.0", | ||
"description": "A pure JavaScript client for the tus resumable upload protocol", | ||
@@ -5,0 +5,0 @@ "main": "lib.es5/index.js", |
@@ -57,7 +57,2 @@ # tus-js-client [![Build Status](https://travis-ci.org/tus/tus-js-client.svg?branch=master)](https://travis-ci.org/tus/tus-js-client) | ||
* The `onProgress` event handler will not be invoked during a request's body | ||
is transmitted but only once a `PATCH` request is finished. Therefore, it may | ||
only be emitted once, depending on the value of the `chunkSize` value. Basically, | ||
it behaves very similar to the `onChunkComplete` event. | ||
* As the Web Storage API is only available in browser environments, | ||
@@ -64,0 +59,0 @@ tus-js-client will not be able store the URLs of created uploads allowing |
@@ -94,3 +94,29 @@ /* global FakeBlob tus */ | ||
}); | ||
it("should add the request's body to errors", function () { | ||
var file = new FakeBlob("hello world".split("")); | ||
var err; | ||
var options = { | ||
endpoint: "/uploads", | ||
onError: function (e) { | ||
err = e; | ||
} | ||
}; | ||
var upload = new tus.Upload(file, options); | ||
upload.start(); | ||
var req = jasmine.Ajax.requests.mostRecent(); | ||
expect(req.url).toBe("/uploads"); | ||
expect(req.method).toBe("POST"); | ||
req.respondWith({ | ||
status: 500, | ||
responseText: "server_error" | ||
}); | ||
expect(err.message).toBe("tus: unexpected response while creating upload, originated from request (response code: 500, response text: server_error)"); | ||
expect(err.originalRequest).toBeDefined(); | ||
}); | ||
}); | ||
}); |
@@ -216,3 +216,3 @@ /* global FakeBlob tus */ | ||
expect(err.message).toBe("tus: unexpected response while creating upload"); | ||
expect(err.message).toBe("tus: unexpected response while creating upload, originated from request (response code: 500, response text: )"); | ||
expect(err.originalRequest).toBeDefined(); | ||
@@ -219,0 +219,0 @@ expect(err.originalRequest.getResponseHeader("Custom")).toBe("blargh"); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
8989205
59
3108
270
8