@tencentcloud/chat-cs-uniapp
Version:
TCCC uniapp UIKit
143 lines (128 loc) • 3.8 kB
text/typescript
import axios from 'axios';
import jsCookie from 'js-cookie';
import { ulid } from 'ulid';
import { apiBaseUrl } from '../../configs/web/index';
import throwErrorCodeApi from './throwErrorCodeApi';
const baseURL = apiBaseUrl;
const apis = [
'/ccc/web/reg',
'/tcccadmin/satisfaction/getByWeb',
'/ccc/im/botSearchInput',
'/tccclogin/visitor/webReg',
'/ccc/user/startSession',
];
export const getAuthorization = (url: string) => {
const userKey = localStorage.getItem('TCCCImUserKey');
if (url !== '/tccclogin/visitor/webReg' && userKey) {
return `Bearer ${userKey}`;
}
return undefined;
};
// const dispatch = store.dispatch
const options = {
baseURL,
withCredentials: true,
timeout: 10000,
headers: {
'Content-Type': 'application/json',
},
};
const setCsrfToken = (token: string, domain: string) => {
jsCookie.set('csrf-token', token, {
domain,
sameSite: 'none',
secure: true,
});
};
export const getCsrfToken = () => {
let token = jsCookie.get('csrf-token');
if (!token) {
token = `${(window.crypto.getRandomValues(new Uint8Array(1)) as any) * 0.001}`;
const { hostname } = window.location;
const testDomain = 'test.cccweb.pstn.avc.qcloud.com';
const preDomain = 'pre.cccweb.pstn.avc.qcloud.com';
const prodDomain = [
'ccc.cloud.tencent.cn',
'ccc.cloud.tencent.com.cn',
'tccc.qcloud.com',
'connect.tencentcloud.com',
];
if (process.env.NODE_ENV === 'development' || [testDomain, preDomain].includes(hostname)) {
setCsrfToken(token, 'qcloud.com');
} else if (prodDomain.includes(hostname)) {
setCsrfToken(token, hostname);
} else {
setCsrfToken(token, 'qcloud.com');
}
}
return token;
};
const axiosInstance = axios.create(options);
axiosInstance.interceptors.request.use(
(config) => {
Object.assign(config.headers!, {
'X-Csrf-Token': getCsrfToken(),
});
return config;
},
(err) => Promise.reject(err),
);
const createApiFunction =
(url: string) =>
(data: any = {}) => {
const { cancelToken, ...options } = data;
const id = ulid();
const authorization = getAuthorization(url);
return axiosInstance
.request({
method: 'post',
url,
cancelToken,
data: {
nonce: id,
requestId: id,
...options,
},
...(authorization && { headers: { authorization } }),
})
.then((response) => {
if (Number(response.data.errorCode) === 0) {
return response.data;
}
if (Number(response.data.errorCode) === -2031) {
throw response.data
}
else if (throwErrorCodeApi.includes(url)) {
throw response.data;
} else {
throw response.data.msg;
}
})
.catch((error) => {
if (url !== '/ccc/debug/seatLog') {
debugLogRequest(`[${url}请求失败,${error} ,${error.errorCode} , ${error.msg}]`);
}
// eslint-disable-next-line no-underscore-dangle
if (error.__CANCEL__) {
console.warn(error);
} else if (throwErrorCodeApi.includes(url)) {
throw error;
} else {
console.error(error);
}
throw error;
});
};
const returnServices = (apis: string[]) => {
const services: { [propName: string]: any } = {};
apis.forEach((url) => {
services[url] = createApiFunction(url);
});
return services;
};
// 由于部分下载数据接口与获取数据接口相同,因此另起一个downloadServices
function debugLogRequest(log: string) {
const seatLog = `[webIm:${log}]`;
}
export { debugLogRequest };
export default returnServices(apis);