assets/js/script.js
/**
  * inflate/deflate core functions
  * @param worker {Worker} web worker for the task.
  * @param initialMessage {Object} initial message to be sent to the worker. should contain
  *   sn(serial number for distinguishing multiple tasks sent to the worker), and codecClass.
  *   This function may add more properties before sending.
  */
inflate/deflate core functions
@param worker {Worker} web worker for the task.
@param initialMessage {Object} initial message to be sent to the worker. should contain
sn(serial number for distinguishing multiple tasks sent to the worker), and codecClass.
This function may add more properties before sending.
inflate / deflate core functions @param worker { Worker } web worker for the task . @param initialMessage { Object } initial message to be sent to the worker . should contain sn ( serial number for distinguishing multiple tasks sent to the worker ) and codecClass . This function may add more properties before sending .
function launchWorkerProcess(worker, initialMessage, reader, writer, offset, size, onprogress, onend, onreaderror, onwriteerror) {
		var chunkIndex = 0,
		    index,
		    outputSize,
		    sn = initialMessage.sn,
		    crc;
		function onflush() {
			worker.removeEventListener("message", onmessage, false);
			onend(outputSize, crc);
		}
		function onmessage(event) {
			var message = event.data,
			    data = message.data,
			    err = message.error;
			if (err) {
				err.toString = function () {
					return "Error: " + this.message;
				};
				onreaderror(err);
				return;
			}
			if (message.sn !== sn) return;
			if (typeof message.codecTime === "number") worker.codecTime += message.codecTime; 
			if (typeof message.crcTime === "number") worker.crcTime += message.crcTime;
			switch (message.type) {
				case "append":
					if (data) {
						outputSize += data.length;
						writer.writeUint8Array(data, function () {
							step();
						}, onwriteerror);
					} else step();
					break;
				case "flush":
					crc = message.crc;
					if (data) {
						outputSize += data.length;
						writer.writeUint8Array(data, function () {
							onflush();
						}, onwriteerror);
					} else onflush();
					break;
				case "progress":
					if (onprogress) onprogress(index + message.loaded, size);
					break;
				case "importScripts": 
				case "newTask":
				case "echo":
					break;
				default:
					console.warn("zip.js:launchWorkerProcess: unknown message: ", message);
			}
		}
		function step() {
			index = chunkIndex * CHUNK_SIZE;
			if (index <= size) {
				reader.readUint8Array(offset + index, Math.min(CHUNK_SIZE, size - index), function (array) {
					if (onprogress) onprogress(index, size);
					var msg = index === 0 ? initialMessage : { sn: sn };
					msg.type = "append";
					msg.data = array;
					try {
						worker.postMessage(msg, [array.buffer]);
					} catch (ex) {
						worker.postMessage(msg); 
					}
					chunkIndex++;
				}, onreaderror);
			} else {
				worker.postMessage({
					sn: sn,
					type: "flush"
				});
			}
		}
		outputSize = 0;
		worker.addEventListener("message", onmessage, false);
		step();
	}
function launchWorkerProcess ( worker , initialMessage , reader , writer , offset , size , onprogress , onend , onreaderror , onwriteerror ) { var chunkIndex = 0 , index , outputSize , sn = initialMessage . sn , crc ; function onflush ( ) { worker . removeEventListener ( "message" , onmessage , false ) ; onend ( outputSize , crc ) ; } function onmessage ( event ) { var message = event . data , data = message . data , err = message . error ; if ( err ) { err . toString = function ( ) { return "Error: " + this . message ; } ; onreaderror ( err ) ; return ; } if ( message . sn !== sn ) return ; if ( typeof message . codecTime === "number" ) worker . codecTime += message . codecTime ; if ( typeof message . crcTime === "number" ) worker . crcTime += message . crcTime ; switch ( message . type ) { case "append" : if ( data ) { outputSize += data . length ; writer . writeUint8Array ( data , function ( ) { step ( ) ; } , onwriteerror ) ; } else step ( ) ; break ; case "flush" : crc = message . crc ; if ( data ) { outputSize += data . length ; writer . writeUint8Array ( data , function ( ) { onflush ( ) ; } , onwriteerror ) ; } else onflush ( ) ; break ; case "progress" : if ( onprogress ) onprogress ( index + message . loaded , size ) ; break ; case "importScripts" : case "newTask" : case "echo" : break ; default : console . warn ( "zip.js:launchWorkerProcess: unknown message: " , message ) ; } } function step ( ) { index = chunkIndex * CHUNK_SIZE ; if ( index <= size ) { reader . readUint8Array ( offset + index , Math . min ( CHUNK_SIZE , size - index ) , function ( array ) { if ( onprogress ) onprogress ( index , size ) ; var msg = index === 0 ? initialMessage : { sn : sn } ; msg . type = "append" ; msg . data = array ; try { worker . postMessage ( msg , [ array . buffer ] ) ; } catch ( ex ) { worker . postMessage ( msg ) ; } chunkIndex ++ ; } , onreaderror ) ; } else { worker . postMessage ( { sn : sn , type : "flush" } ) ; } } outputSize = 0 ; worker . addEventListener ( "message" , onmessage , false ) ; step ( ) ; }
inflate/deflate core functions
 @param worker {Worker} web worker for the task.
inflate / deflate core functions @param worker { Worker } web worker for the task .
// should be before onflush() //no need to handle here // use `<=` instead of `<`, because `size` may be 0. // posting a message with transferables will fail on IE10 // retry without transferables