All files / src/utils files.ts

77.77% Statements 70/90
18.18% Branches 2/11
100% Functions 1/1
77.77% Lines 70/90

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 921x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x   2x 2x 2x             2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x         2x 2x 2x   2x 2x     2x 2x 2x 2x 2x 1x   1x 1x 1x 1x 1x 1x 1x 1x 2x           2x 2x 2x 2x 2x 2x    
// Product-independent general-purpose methods for file operations
// Methods:
// fetchData, 
 
/**
 * Fetch data using the specified URL and method.
 * This function serves as a wrapper for the Fetch API.
 * 
 * @param {FetchDataOptions} options - The options for fetching data.
 * @returns {Promise<any>} - A promise that resolves to the fetched data.
 */
interface FetchDataOptions {
    url?: string;
    method?: string;
    data?: Record<string, any>;
    datatype?: string;
    timeout?: number;// default to `5e3` ms (= 5 sec.)
}
export const fetchData = async ({
    url = '',
    method = 'get',
    data = {},
    datatype = 'json',
    timeout = 5e3
}: FetchDataOptions = {}): Promise<any> => {
    const controller = new AbortController()
    const timeoutId = timeout > 0 ? setTimeout(() => {
        controller.abort()
    }, timeout) : null
 
    if (!url || !/^(get|post|put|delete|patch)$/i.test(method)) {
        return Promise.reject({
            type: 'bad_request',
            status: 400,
            message: 'Invalid argument(s) given.'
        })
    }
 
    const params = new URLSearchParams()
    let sendData: RequestInit = {
        method: method,
        mode: 'cors',
        cache: 'no-cache',
        credentials: 'omit',
        redirect: 'follow',
        referrerPolicy: 'no-referrer',
        signal: controller.signal
    }
 
    if (data) {
        for (const key in data) {
            if (Object.prototype.hasOwnProperty.call(data, key)) {
                params.append(key, data[key])
            }
        }
    }
 
    if (method.toLowerCase() !== 'get') {
        sendData.body = params
    } else {
        if (params.toString()) {
            url += '?' + params
        }
    }
 
    try {
        const response = await fetch(url, sendData)
        if (response.ok) {
            const retval = datatype === 'json' ? await response.json() : await response.text()
            return Promise.resolve(retval)
        } else {
            const errObj = await response.json()
            return Promise.reject({
                code: errObj.code,
                status: errObj.status || errObj.statusText,
                message: errObj.message
            })
        }
    } catch (err) {
        if (err instanceof SyntaxError) {
            console.error(`Response is not valid ${datatype.toUpperCase()}.`)
        } else {
            console.error('Fetch error:', err)
        }
    } finally {
        if (timeoutId) {
            clearTimeout(timeoutId)
        }
    }
}