import { constants } from '@cloudbase/utilities' import { COMPONENT_NAME } from '../constants' const { ERRORS } = constants export function parseURL(_url: string) { if (document) { const a = document.createElement('a') a.href = _url return a } return new URL(new Request(_url).url) } export function isBuffer(buf: any) { return buf instanceof ArrayBuffer || ArrayBuffer.isView(buf) } function object2Qs(data) { const list = Object.entries(data || {}).reduce((list, [key, value]: [string, string]) => { list.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`) return list }, []) if (list.length) { return list.join('&') } } export function serializeRequestBody(headers, data: T, method = 'POST'): T | string { let res: T | string = data const contentTypeKey = 'Content-Type' if (typeof data === 'object' && !isBuffer(data)) { if (!headers[contentTypeKey] && !headers['content-type']) { headers[contentTypeKey] = 'application/json' } const contentType = headers[contentTypeKey] || headers['content-type'] if (method === 'GET') { try { return object2Qs(data) || '' } catch (e) { throw new Error(JSON.stringify({ code: ERRORS.INVALID_PARAMS, msg: `[${COMPONENT_NAME}.callContainer] invalid data in query method, ${e.message}`, }),) } } switch (contentType) { case 'application/json': { try { res = JSON.stringify(data) } catch (e) { throw new Error(JSON.stringify({ code: ERRORS.INVALID_PARAMS, msg: `[${COMPONENT_NAME}.callContainer] invalid data with content-type: application/json, ${e.message}`, }),) } break } case 'application/x-www-form-urlencoded': { try { const qs = object2Qs(data) if (qs) { res = qs } } catch (e) { throw new Error(JSON.stringify({ code: ERRORS.INVALID_PARAMS, msg: `[${COMPONENT_NAME}.callContainer] invalid data with content-type: application/x-www-form-urlencoded,${e.message}`, }),) } break } } } return res }