This repository has been archived on 2023-08-30. You can view files and clone it, but cannot push or open issues/pull-requests.
appcat
/
sonist
Archived
1
0
Fork 0
sonist/src/js/lib/request/index.js

1 line
5.4 KiB
JavaScript

"use strict";import Format from"./lib/format.js";const rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,log=console.log,noop=function(t,e){this.defer.resolve(e)};let isLocal=!1;try{isLocal=rlocalProtocol.test(location.protocol)}catch(t){}let originAnchor=document.createElement("a");originAnchor.href=location.href;const NOBODY_METHODS=["GET","HEAD"],ERRORS={10001:"Argument url is required",10012:"Parse error",10100:"Request canceled",10104:"Request pending...",10200:"Ok",10204:"No content",10304:"Not modified",10500:"Internal Server Error",10504:"Connected timeout"},FORM_TYPES={form:"application/x-www-form-urlencoded; charset=UTF-8",json:"application/json; charset=UTF-8",text:"text/plain; charset=UTF-8"},convert={text:t=>t,xml:(t,e)=>void 0!==e?e:Format.parseXML(t),html:t=>Format.parseHTML(t),json:t=>JSON.parse(t),script:t=>Format.parseJS(t)};class _Request{constructor(t="",e="GET",s={}){if(!t)throw new Error(ERRORS[10001]);return t=t.replace(/#.*$/,""),request.BASE_URL&&(/^([a-z]+:|\/\/)/.test(t)||(t=request.BASE_URL+t)),e=e.toUpperCase(),this.xhr=new XMLHttpRequest,this.defer=Promise.defer(),this.opt={url:t,method:e,headers:{},data:{},dataType:"text",withCredentials:!1},this.defer.promise.abort=(()=>{this.cancel=!0,this.xhr.abort()}),this.__next__(Object.assign({},request.__INIT__,s)),this.defer.promise}__next__(t){t.headers&&Object.assign(this.opt.headers,t.headers);let e=!1;if(t.formType)switch(t.formType){case"form":this.__set__("form");break;case"json":this.__set__("json");break;case"form-data":this.opt.method="POST",e=!0;break;default:NOBODY_METHODS.includes(this.opt.method)?this.__set__("form"):this.__set__("text")}else this.__set__("form");if(t.cache&&NOBODY_METHODS.includes(this.opt.method)&&(this.opt.cache=!0),t.timeout=t.timeout>>>0,t.timeout>0&&(this.opt.timeout=t.timeout),t.data){switch(typeof t.data){case"number":case"string":this.__set__("text"),this.opt.data=t.data;break;case"object":"FORM"===t.data.nodeName?(this.opt.method=t.data.method.toUpperCase()||"POST",this.opt.data=Format.parseForm(t.data),(e=this.opt.data.constructor===FormData)&&delete this.opt.headers["content-type"]):t.data.constructor===FormData?(e=!0,this.opt.method="POST",delete this.opt.headers["content-type"],this.opt.data=t.data):this.opt.data=e?Format.mkFormData(t.data):t.data}}t.withCredentials&&(this.opt.withCredentials=!0);try{let t=document.createElement("a");t.href=this.opt.url,this.opt.crossDomain=originAnchor.protocol!==t.protocol||originAnchor.host!==t.host}catch(t){}this.opt.crossDomain?this.opt.withCredentials&&(this.xhr.withCredentials=!0,this.opt.headers["X-Requested-With"]="XMLHttpRequest"):this.opt.headers["X-Requested-With"]="XMLHttpRequest",!NOBODY_METHODS.includes(this.opt.method)?e||("json"===t.formType?this.opt.data=JSON.stringify(this.opt.data):this.opt.data=Format.param(this.opt.data)):(this.opt.data=Format.param(this.opt.data),this.opt.data&&(this.opt.url+=(/\?/.test(this.opt.url)?"&":"?")+this.opt.data),!1===this.opt.cache&&(this.opt.url+=(/\?/.test(this.opt.url)?"&":"?")+"_="+Math.random())),t.dataType&&(this.opt.dataType=t.dataType.toLowerCase()),this.xhr.responseType=this.opt.dataType,this.xhr.onreadystatechange=(t=>{this.opt.timeout>0&&(this.opt["time"+this.xhr.readyState]=t.timeStamp,4===this.xhr.readyState&&(this.opt.isTimeout=this.opt.time4-this.opt.time1>this.opt.timeout)),4===this.xhr.readyState&&this.__dispatch__(this.opt.isTimeout)}),this.xhr.open(this.opt.method,this.opt.url,!0);for(let t in this.opt.headers)this.xhr.setRequestHeader(t,this.opt.headers[t]);this.xhr.send(this.opt.data),this.opt.timeout&&this.opt.timeout>0&&(this.xhr.timeout=this.opt.timeout)}__set__(t){this.opt.headers["content-type"]=FORM_TYPES[t]}__dispatch__(t){let e={status:200,statusText:"ok",text:"",body:"",error:null};if(this.cancel)return this.__cancel__(e);if(t)return this.__timeout__(e);let s=this.xhr.status>=200&&this.xhr.status<400,o=this.xhr.getAllResponseHeaders().split("\n")||[],r="";for(let t of o)if(t=t.trim()){if("content-type"===(t=t.split(":")).shift().toLowerCase()){r=t.join(":").trim().toLowerCase();break}}switch(s?(e.status=this.xhr.status,204===e.status?e.statusText=ERRORS[10204]:304===e.status&&(e.statusText=ERRORS[10304])):(e.status=this.xhr.status||500,e.statusText=this.xhr.statusText||ERRORS[10500],e.error=new Error(e.statusText)),this.opt.dataType){case"arraybuffer":case"blob":case"document":case"json":e.text=e.body=this.xhr.response;break;default:try{let t=r.match(/json|xml|script|html/);t=t&&t[0].toLowerCase()||"text",e.text=this.xhr.response,e.body=convert[t](e.text,this.xhr.response)}catch(t){e.error=t,e.statusText=ERRORS[10012]}}this.__success__(s,e)}__success__(t,e){t?this.defer.resolve(e):this.defer.reject(e),delete this.xhr,delete this.opt,delete this.defer}__cancel__(t){t.status=0,t.statusText=ERRORS[10100],t.error=new Error(ERRORS[10100]),this.defer.reject(t),delete this.xhr,delete this.opt,delete this.defer}__timeout__(t){t.status=504,t.statusText=ERRORS[10504],t.error=new Error(ERRORS[10504]),this.defer.reject(t),delete this.xhr,delete this.opt,delete this.defer}}window.request||(window.request={get:(t,e={})=>new _Request(t,"GET",e),post:(t,e={})=>new _Request(t,"POST",e),upload(t,e={}){return e.formType="form-data",this.post(t,e)},download(t,e={}){return e.dataType="blob",this.get(t,e)},open:(t,e="GET",s={})=>("object"==typeof e&&(s=e,e="GET"),new _Request(t,e,s)),version:"2.0.0-normal",init(t={}){this.__INIT__=t}},Anot.ui.request=request.version);export default request;
一个音乐播放器, 主打本地音乐播放。支持 自动歌词/自动封面/均衡器等常见功能。
JavaScript 60.1%
SCSS 19.2%
HTML 16.9%
CSS 3.8%