觉醒时刻
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

445 lines
12 KiB

function parseParameters (options, onProgress, onComplete) {
if (onComplete === undefined) {
var isCallback = typeof options === 'function';
if (onProgress) {
onComplete = onProgress;
if (!isCallback) {
onProgress = null;
}
}
else if (onProgress === undefined && isCallback) {
onComplete = options;
options = null;
onProgress = null;
}
if (onProgress !== undefined && isCallback) {
onProgress = options;
options = null;
}
}
options = options || Object.create(null);
return { options, onProgress, onComplete };
}
/**ArrayBuffer转字符串 */
function arrayBuffer2Text(buffer,onComplete) {
var b = new Blob([buffer]);
var r = new FileReader();
r.readAsText(b, 'utf-8');
r.onload = function (){
onComplete&&onComplete(null,r.result)
}
r.onerror = function (e) {
onComplete&&onComplete(r.error,r.result)
}
}
function arrayBufferToBase64Img(buffer){
const str = String.fromCharCode(...new Uint8Array(buffer));
return window.btoa(str);
}
function downloadFile (url, options, onProgress, onComplete) {
var { options, onProgress, onComplete } = parseParameters(options, onProgress, onComplete);
var xhr = new XMLHttpRequest(), errInfo = 'download failed: ' + url + ', status: ';
xhr.open('GET', url, true);
if (options.responseType !== undefined) xhr.responseType = options.responseType;
if (options.withCredentials !== undefined) xhr.withCredentials = options.withCredentials;
if (options.mimeType !== undefined && xhr.overrideMimeType ) xhr.overrideMimeType(options.mimeType);
if (options.timeout !== undefined) xhr.timeout = options.timeout;
if (options.header) {
for (var header in options.header) {
xhr.setRequestHeader(header, options.header[header]);
}
}
xhr.onload = function () {
if ( xhr.status === 200 || xhr.status === 0 ) {
onComplete && onComplete(null, xhr.response);
} else {
onComplete && onComplete(new Error(errInfo + xhr.status + '(no response)'));
}
};
if (onProgress) {
xhr.onprogress = function (e) {
if (e.lengthComputable) {
onProgress(e.loaded, e.total);
}
};
}
xhr.onerror = function(){
onComplete && onComplete(new Error(errInfo + xhr.status + '(error)'));
};
xhr.ontimeout = function(){
onComplete && onComplete(new Error(errInfo + xhr.status + '(time out)'));
};
xhr.onabort = function(){
onComplete && onComplete(new Error(errInfo + xhr.status + '(abort)'));
};
xhr.send(null);
return xhr;
}
function _getRealPath(path) {
let excludeChangeNameList = [".mp3",".ogg",".wav",".js",".jsc",]
if(path.indexOf("assets")!=0){
return path
}
if(!needMixFilename){//tag
return path;
}
for(let ext of excludeChangeNameList){
if(path.endsWith(ext)){
return path
}
}
var ext = path.substr(path.lastIndexOf("."));
var arr = path.split('/');
let name = arr[arr.length-1];
let realPath = path;
if(name[8]=="-"&&name[13]=="-"&&name[18]=="-"&&name[23]=="-"){
let md5 = hyz.str_to_md5(name+nameMixSign)
let arr2 = [8,13,18,23]
for(let i = arr2.length-1;i>=0;i--){
let idx = arr2[i];
md5 = md5.slice(0, idx) + "-" + md5.slice(idx);
}
md5+=ext;
realPath = path.replace(name,md5);
realPath = realPath.replace("/"+name.slice(0,2)+"/","/"+md5.slice(0,2)+"/");
realPath = realPath.replace("\\"+name.slice(0,2)+"\\","\\"+md5.slice(0,2)+"\\");
}
return realPath
};
function downloadArrayBuffer (url, options, onComplete) {
options.responseType = "arraybuffer";
url = _getRealPath(url)
downloadFile(url, options, options.onFileProgress, function (err,data) {
if(!err){
///解密
data = _decriptTool.decodeArrayBuffer(data);
}
onComplete&&onComplete(err,data)
});
};
function downloadText (url, options, onComplete) {
downloadArrayBuffer(url,options,function (err,data) {
if(err){
onComplete&&onComplete(err,data)
}else{
///转化成Text
arrayBuffer2Text(data,function(err,text) {
if(err){
onComplete&&onComplete(err,data)
}else{
onComplete&&onComplete(null,text)
}
})
}
})
};
function downloadJson(url, options, onComplete) {
downloadText(url,options,function (err,data) {
if(err){
onComplete&&onComplete(err,data)
return;
}
if (!err && typeof data === 'string') {
try {
data = JSON.parse(data);
}
catch (e) {
err = e;
}
}
onComplete && onComplete(err, data);
})
}
function downloadDomImage (url, options, onComplete) {
var { options, onComplete } = parseParameters(options, undefined, onComplete);
var img = new Image();
if (window.location.protocol !== 'file:') {
img.crossOrigin = 'anonymous';
}
function loadCallback () {
img.removeEventListener('load', loadCallback);
img.removeEventListener('error', errorCallback);
onComplete && onComplete(null, img);
}
function errorCallback () {
img.removeEventListener('load', loadCallback);
img.removeEventListener('error', errorCallback);
onComplete && onComplete(new Error(cc.debug.getError(4930, url)));
}
img.addEventListener('load', loadCallback);
img.addEventListener('error', errorCallback);
img.src = url;
return img;
}
const imgTypes = {
"png":"image/png",
"jpg":"image/jpg",
"jpeg":"image/jpeg",
}
function downloadImage(url, options, onComplete) {
downloadArrayBuffer(url,options,function(err, data){
if(err){
onComplete&&onComplete(null,data);
return;
}
let index = url.lastIndexOf(".");
let suffix = url.substr(index+1);
let typeStr = imgTypes[suffix]||imgTypes["png"]
if(cc.sys.capabilities.imageBitmap){
let blob = new Blob([data],{type:typeStr})
onComplete&&onComplete(null,blob);
}else{
let base64code = arrayBufferToBase64Img(data);
base64code = `data:${typeStr};base64,${base64code}`
downloadDomImage(base64code,options,onComplete)
}
})
};
const downloaded = {};
function downloadScript (url, options, onComplete) {
var { options, onComplete } = parseParameters(options, undefined, onComplete);
// no need to load script again
if (downloaded[url]) {
return onComplete && onComplete(null);
}
var d = document, s = document.createElement('script');
if (window.location.protocol !== 'file:') {
s.crossOrigin = 'anonymous';
}
s.async = options.async;
s.src = url;
function loadHandler () {
s.parentNode.removeChild(s);
s.removeEventListener('load', loadHandler, false);
s.removeEventListener('error', errorHandler, false);
downloaded[url] = true;
onComplete && onComplete(null);
}
function errorHandler() {
s.parentNode.removeChild(s);
s.removeEventListener('load', loadHandler, false);
s.removeEventListener('error', errorHandler, false);
onComplete && onComplete(new Error(cc.debug.getError(4928, url)));
}
s.addEventListener('load', loadHandler, false);
s.addEventListener('error', errorHandler, false);
d.body.appendChild(s);
}
const REGEX = /^(?:\w+:\/\/|\.+\/).+/;
var downloadBundle = function (nameOrUrl, options, onComplete) {
let bundleName = cc.path.basename(nameOrUrl);
let url = nameOrUrl;
if (!REGEX.test(url)) url = 'assets/' + bundleName;
var version = options.version ||cc.assetManager.downloader.bundleVers[bundleName];
var count = 0;
var config = `${url}/config.${version ? version + '.' : ''}json`;
let out = null, error = null;
downloadJson(config, options, function (err, response) {
if (err) {
error = err;
}
out = response;
out && (out.base = url + '/');
count++;
if (count === 2) {
onComplete(error, out);
}
});
var js = `${url}/index.${version ? version + '.' : ''}js`;
downloadScript(js, options, function (err) {
if (err) {
error = err;
}
count++;
if (count === 2) {
onComplete(error, out);
}
});
};
var downloaders = {
// Images
'.png' : downloadImage,
'.jpg' : downloadImage,
'.bmp' : downloadImage,
'.jpeg' : downloadImage,
'.gif' : downloadImage,
'.ico' : downloadImage,
'.tiff' : downloadImage,
'.webp' : downloadImage,
'.image' : downloadImage,
'.pvr' : downloadArrayBuffer,
'.pkm' : downloadArrayBuffer,
// Audio
// '.mp3' : downloadAudio,
// '.ogg' : downloadAudio,
// '.wav' : downloadAudio,
// '.m4a' : downloadAudio,
// Txt
'.txt' : downloadText,
'.xml' : downloadText,
'.vsh' : downloadText,
'.fsh' : downloadText,
'.atlas' : downloadText,
'.tmx' : downloadText,
'.tsx' : downloadText,
'.json' : downloadJson,
'.ExportJson' : downloadJson,
'.plist' : downloadText,
'.fnt' : downloadText,
// font
// '.font' : loadFont,
// '.eot' : loadFont,
// '.ttf' : loadFont,
// '.woff' : loadFont,
// '.svg' : loadFont,
// '.ttc' : loadFont,
// // Video
// '.mp4': downloadVideo,
// '.avi': downloadVideo,
// '.mov': downloadVideo,
// '.mpg': downloadVideo,
// '.mpeg': downloadVideo,
// '.rm': downloadVideo,
// '.rmvb': downloadVideo,
// Binary
'.binary' : downloadArrayBuffer,
'.bin': downloadArrayBuffer,
'.dbbin': downloadArrayBuffer,
'.skel': downloadArrayBuffer,
'bundle': downloadBundle,
'default': downloadText
};
/**ArrayBuffer加密解密 */
class DecriptTool{
constructor(encriptKey,encriptSign){
this.setKeySign(encriptKey,encriptSign);
}
encriptSign = "";
encriptKey = "";
setKeySign(encriptKey,encriptSign){
this.encriptKey = encriptKey;
this.encriptSign = encriptSign;
}
strToBytes(str){
let size = str.length;
let result = [];
for(let i=0;i<size;i++){
result.push(str.charCodeAt(i));
}
return result;
}
checkIsEncripted(arrbuf,sign=this.encriptSign) {
if(!sign){
return false;
}
let signBuf = new Uint8Array(this.strToBytes(sign));
let buffer = new Uint8Array(arrbuf);
for(let i=0;i<signBuf.length;i++){
if(buffer[i]!=signBuf[i]){
return false;
}
}
return true
}
decodeArrayBuffer(arrbuf,sign=this.encriptSign,key=this.encriptKey){
if(!this.checkIsEncripted(arrbuf,sign)){
return arrbuf;
}
let signBuf = new Uint8Array(this.strToBytes(sign));
let keyBytes = this.strToBytes(key);
let buffer = new Uint8Array(arrbuf);
let size = buffer.length-signBuf.length;
let _outArrBuf = new ArrayBuffer(size)
let outBuffer = new Uint8Array(_outArrBuf)
let idx = 0;
for(let i=0;i<size;i++){
let b = buffer[signBuf.length+i];
let db = b^keyBytes[idx]
if(++idx>=keyBytes.length){
idx = 0
}
outBuffer[i] = db;
}
return outBuffer;
}
}
var _decriptTool = new DecriptTool();
var needMixFilename = false;
var nameMixSign = "";
window.hyz = window.hyz || {};
let hyz = window.hyz;
hyz.register_decripted_downloader = function register_decripted_downloader(_encriptSign,_encriptKey,_needMixFilename,_nameMixSign) {
_decriptTool.setKeySign(_encriptKey,_encriptSign)
needMixFilename = _needMixFilename
nameMixSign = _nameMixSign
for(let key in downloaders){
cc.assetManager.downloader.register(key,downloaders[key])
}
}