dist/hello.all.js
function Multipart() {

		// Internal body
		var body = [];
		var boundary = (Math.random() * 1e10).toString(32);
		var counter = 0;
		var lineBreak = '\r\n';
		var delim = lineBreak + '--' + boundary;
		var ready = function() {};

		var dataUri = /^data\:([^;,]+(\;charset=[^;,]+)?)(\;base64)?,/i;

		// Add file
		function addFile(item) {
			var fr = new FileReader();
			fr.onload = function(e) {
				addContent(btoa(e.target.result), item.type + lineBreak + 'Content-Transfer-Encoding: base64');
			};

			fr.readAsBinaryString(item);
		}

		// Add content
		function addContent(content, type) {
			body.push(lineBreak + 'Content-Type: ' + type + lineBreak + lineBreak + content);
			counter--;
			ready();
		}

		// Add new things to the object
		this.append = function(content, type) {

			// Does the content have an array
			if (typeof (content) === 'string' || !('length' in Object(content))) {
				// Converti to multiples
				content = [content];
			}

			for (var i = 0; i < content.length; i++) {

				counter++;

				var item = content[i];

				// Is this a file?
				// Files can be either Blobs or File types
				if (
					(typeof (File) !== 'undefined' && item instanceof File) ||
					(typeof (Blob) !== 'undefined' && item instanceof Blob)
				) {
					// Read the file in
					addFile(item);
				}

				// Data-URI?
				// Data:[<mime type>][;charset=<charset>][;base64],<encoded data>
				// /^data\:([^;,]+(\;charset=[^;,]+)?)(\;base64)?,/i
				else if (typeof (item) === 'string' && item.match(dataUri)) {
					var m = item.match(dataUri);
					addContent(item.replace(dataUri, ''), m[1] + lineBreak + 'Content-Transfer-Encoding: base64');
				}

				// Regular string
				else {
					addContent(item, type);
				}
			}
		};

		this.onready = function(fn) {
			ready = function() {
				if (counter === 0) {
					// Trigger ready
					body.unshift('');
					body.push('--');
					fn(body.join(delim), boundary);
					body = [];
				}
			};

			ready();
		};
	}
function Multipart() {

		// Internal body
		var body = [];
		var boundary = (Math.random() * 1e10).toString(32);
		var counter = 0;
		var lineBreak = '\r\n';
		var delim = lineBreak + '--' + boundary;
		var ready = function() {};

		var dataUri = /^data\:([^;,]+(\;charset=[^;,]+)?)(\;base64)?,/i;

		// Add file
		function addFile(item) {
			var fr = new FileReader();
			fr.onload = function(e) {
				addContent(btoa(e.target.result), item.type + lineBreak + 'Content-Transfer-Encoding: base64');
			};

			fr.readAsBinaryString(item);
		}

		// Add content
		function addContent(content, type) {
			body.push(lineBreak + 'Content-Type: ' + type + lineBreak + lineBreak + content);
			counter--;
			ready();
		}

		// Add new things to the object
		this.append = function(content, type) {

			// Does the content have an array
			if (typeof (content) === 'string' || !('length' in Object(content))) {
				// Converti to multiples
				content = [content];
			}

			for (var i = 0; i < content.length; i++) {

				counter++;

				var item = content[i];

				// Is this a file?
				// Files can be either Blobs or File types
				if (
					(typeof (File) !== 'undefined' && item instanceof File) ||
					(typeof (Blob) !== 'undefined' && item instanceof Blob)
				) {
					// Read the file in
					addFile(item);
				}

				// Data-URI?
				// Data:[<mime type>][;charset=<charset>][;base64],<encoded data>
				// /^data\:([^;,]+(\;charset=[^;,]+)?)(\;base64)?,/i
				else if (typeof (item) === 'string' && item.match(dataUri)) {
					var m = item.match(dataUri);
					addContent(item.replace(dataUri, ''), m[1] + lineBreak + 'Content-Transfer-Encoding: base64');
				}

				// Regular string
				else {
					addContent(item, type);
				}
			}
		};

		this.onready = function(fn) {
			ready = function() {
				if (counter === 0) {
					// Trigger ready
					body.unshift('');
					body.push('--');
					fn(body.join(delim), boundary);
					body = [];
				}
			};

			ready();
		};
	}
function Multipart ( ) { // Internal body var body = [ ] ; var boundary = ( Math . random ( ) * 1e10 ) . toString ( 32 ) ; var counter = 0 ; var lineBreak = '\r\n' ; var delim = lineBreak + '--' + boundary ; var ready = function ( ) { } ; var dataUri = / ^data\:([^;,]+(\;charset=[^;,]+)?)(\;base64)?, / i ; // Add file function addFile ( item ) { var fr = new FileReader ( ) ; fr . onload = function ( e ) { addContent ( btoa ( e . target . result ) , item . type + lineBreak + 'Content-Transfer-Encoding: base64' ) ; } ; fr . readAsBinaryString ( item ) ; } // Add content function addContent ( content , type ) { body . push ( lineBreak + 'Content-Type: ' + type + lineBreak + lineBreak + content ) ; counter -- ; ready ( ) ; } // Add new things to the object this . append = function ( content , type ) { // Does the content have an array if ( typeof ( content ) === 'string' || ! ( 'length' in Object ( content ) ) ) { // Converti to multiples content = [ content ] ; } for ( var i = 0 ; i < content . length ; i ++ ) { counter ++ ; var item = content [ i ] ; // Is this a file? // Files can be either Blobs or File types if ( ( typeof ( File ) !== 'undefined' && item instanceof File ) || ( typeof ( Blob ) !== 'undefined' && item instanceof Blob ) ) { // Read the file in addFile ( item ) ; } // Data-URI? // Data:[<mime type>][;charset=<charset>][;base64],<encoded data> // /^data\:([^;,]+(\;charset=[^;,]+)?)(\;base64)?,/i else if ( typeof ( item ) === 'string' && item . match ( dataUri ) ) { var m = item . match ( dataUri ) ; addContent ( item . replace ( dataUri , '' ) , m [ 1 ] + lineBreak + 'Content-Transfer-Encoding: base64' ) ; } // Regular string else { addContent ( item , type ) ; } } } ; this . onready = function ( fn ) { ready = function ( ) { if ( counter === 0 ) { // Trigger ready body . unshift ( '' ) ; body . push ( '--' ) ; fn ( body . join ( delim ) , boundary ) ; body = [ ] ; } } ; ready ( ) ; } ; }
Construct a multipart message
Construct a multipart message