UNPKG

@tencentcloud/chat-cs-uniapp

Version:

TCCC uniapp UIKit

143 lines (128 loc) 3.8 kB
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);