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.

195 lines
5.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import apiConfig from "./apiConfig";
export class Session{
cookies = ""
constructor(name="__default__"){
this.name = name;
this.cookie_key = "COOKIES-" + name;
}
saveCookies(){
wx.setStorage({
key: this.cookie_key,
data: this.cookies,
})
}
loadCookies(){
this.cookies = wx.getStorageSync(this.cookie_key);
}
setCookies(cookies){
this.cookies = cookies.map(item => item.split(";")[0]).join("; ");
}
splitCookies(string){
let cookies = string.split(/,\s?(?=[^=,\;]*?\=)/ig);
return cookies;
}
request({ url, header, success,...options}) {
//console.log(this);
//console.log("request cookir", {...header, "Cookie": this.cookies});
return wx.request({
...options,
url,
header: {...header, "Cookie": this.cookies},
success: (res) => {
console.debug("request success", res);
if (res.cookies && res.cookies.length>0)
this.setCookies(res.cookies);
else if (res.header["Set-Cookie"])
this.setCookies(this.splitCookies(res.header["Set-Cookie"]));
else if(res.header["set-cookie"])
this.setCookies(this.splitCookies(res.header["set-Cookie"]));
success(res);
if(url.indexOf("login.json")!=-1&&!res.data.status&&!this.cookies){
wx.reportMonitor("0", 2);
global.realTimeLog.error(res, "login fail: fail parse cookies!!", res);
}
}
});
}
uploadFile({url, filePath, name, header, formData, success, fail, complete}){
return wx.uploadFile({
url,
filePath,
name,
header: {"Cookie": this.cookies, ...header},
formData,
success:res=>{
try{
res.data = JSON.parse(res.data);
}catch(e){
//@todo
}
;
if(success)
success(res)
},
fail,
complete
})
}
downloadFile({url, header, filePath, success, fail, complete}){
return wx.downloadFile({
url,
header: {...header, "Cookie": this.cookies},
filePath,
success,
fail,
complete
})
}
}
function handler({success, fail, complete, resolve, reject}){
return {
success: res => {
if (res.data.status && res.data.status > 100 || res.data.status<0) {
switch (res.data.status) {
case 401:
var message = "(●'◡'●)\n请先登录哦";
var code = res.data.status;
break;
default:
var message = res.data.message;
var code = res.data.status;
}
let e = new Error(message);
e.code = code;
if (fail) fail(e, res.data);
reject(e, res.data);
return complete&&complete(e, res.data);
}
success&&success(res.data);
resolve(res.data);
complete&&complete(res.data);
},
fail: e => {
if ("errMsg" in e)
(e = new Error("(⋟﹏⋞)\n网络连接失败了")).code = -2;
if (!("message" in e))
(e = new Error("哎呀,出错了\n(_)")).code = -1;
fail&& fail(e, {});
reject(e, {});
complete&&complete(e, {});
}
}
}
export function triggerApi({session, name, data:_data = {}, success, fail, complete, config:{method,header={}}={}}) {
let api = apiConfig;
for (var key of name.split(".")) api=api[key];
let { url, query={}, form = {}, config:{method:_method,_header={},...config}={}} = api;
method = method || _method;
if(url){
if(url._)
url = url[method||"GET"]||url._;
url = name.replace(/\.?[^\.]+$|\./g, "/") + url.replace(/\{(.*?)\}/g, function (match, k) {
return _data[k];
}).replace(/\*/g,key);
}else
url = name.replace(/\./g, "/");
url = global.config.apiRoot + url + ".json";
header = {..._header,...header};
var data={},param={};
if(form._)
form={...form._,...form[method||"GET"]};
if(query._)
query={...query._,...query[method||"GET"]};
for(var key in form){
if(key in _data)
data[key]=_data[key];
else{
let value = form[key];
if (value!=null)
data[key] = value;
else if (typeof value == "object")
console.error(`${key} was not given in data`, _data);
}
}
for(var key in query){
if (key in _data)
param[key] = _data[key];
else {
let value = query[key];
if (value!=null)
param[key] = value;
else if (typeof value == "object")
console.error(`${key} was not given in data`, _data);
}
}
let queryStr = Object.keys(param).map(key => `${key}=${param[key]}`).join("&");
if(queryStr)
url = url+"?"+queryStr;
if(method=="uploadFile"){
var formData = data;
var {name:_name, timeout} = config;
if(!_name)
_name = Object.keys(formData)[0];
var filePath = formData[_name];
delete formData[_name];
return new Promise((resolve, reject)=>{
session.uploadFile({
url, filePath, name:_name, header, timeout, formData, ...handler({success, fail, complete, resolve, reject})
})
});
}else if(method=="downloadFile"){
return new Promise((resolve,reject)=>{
session.downloadFile({
url, header, success:res=>{
resolve(res);
success&&success(res);
}, fail:e=>{
reject(e);
fail&&fail(e)
},complete
})
})
}else
return new Promise((resolve, reject) => {
session.request({
url, method, data, header,...handler({success, fail, complete, resolve, reject})
});
})
}