async function getCallbackParameters(data) {
    if (!data) {
        return {
            req: [],
            res: [],
            next: []
        };
    }
    let req = new Set();
    let res = new Set();
    let next = new Set();

    const regex = '\\=|\\{|\\}|\\(|\\)|\\[|\\]|\\!|\\,';

    try {
        let splitedParams = data.split(new RegExp('(\\(|\\))'));
        for (let idx = 0; idx < splitedParams.length; ++idx) {
            let pos = splitedParams[idx + 2] || '';
            if (!pos || pos.split(new RegExp(`[\\(|\\)|\\{|\\}|\\[|\\]|\\/|\\|;|:|=|!|@|\\$|#|\\?|\\+|,|\\||&|\\s|\\t|\\n|\\*]`)).join('', 'gm') == '') {
                continue;
            }

            if (pos !== '') {
                pos = await removeComments(pos);
                pos = await removeStrings(pos);
            }

            let arrowFunctionPos = pos.split(new RegExp(`(\\s*\\t*=>\\s*\\n*\\t*\\{)`));
            let arrowFunctionWithoutCurlyBracketPos = [''];
            let traditionalFunctionPos = [''];

            if (arrowFunctionPos.length == 1) {
                arrowFunctionWithoutCurlyBracketPos = pos.split(new RegExp(`(\\s*\\t*=>)`));
                if (arrowFunctionWithoutCurlyBracketPos.length == 1) {
                    traditionalFunctionPos = pos.split(new RegExp(`(\\s*\\n*\\t*\\:?\\s*\\n*\\t*\\w*\\s*\\n*\\t*\\<?\\s*\\n*\\t*\\w*\\s*\\n*\\t*\\>?\\s*\\n*\\t*\\{)`));
                }
            }

            let isFunction = false;
            if (arrowFunctionPos.length > 1 || arrowFunctionWithoutCurlyBracketPos.length > 1 || traditionalFunctionPos.length > 1) {
                isFunction = true;
            }

            if (isFunction && splitedParams[idx - 2] && splitedParams[idx - 2].split(new RegExp('\\s+if')).length === 1 && splitedParams[idx - 1] && splitedParams[idx - 1].trim() === '(' && splitedParams[idx + 1] && splitedParams[idx + 1].trim() === ')') {
                let params = splitedParams[idx];
                params = params.split(',');
                // Request
                if (params[0] && params[0].includes(':')) {
                    // TS

                    // TODO: Handle 'req' and 'res' only by input parameter position
                    let typeParam = params[0].split(':')[1].toLocaleLowerCase();
                    if (typeParam && typeParam.includes('.')) {
                        typeParam = typeParam.split('.')[1];
                    }
                    let param = params[0].split(':')[0].replaceAll('\n', '').replaceAll('\t', '').replaceAll(' ', '');
                    if (typeParam.includes('res')) {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            res.add(param);
                        }
                    } else if (typeParam.includes('req')) {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            req.add(param);
                        }
                    } else if (typeParam.includes('next')) {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            next.add(param);
                        }
                    } else {
                        // any
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            req.add(param);
                        }
                    }
                } else if (params[0]) {
                    // JS
                    let param = params[0].replaceAll('\n', '').replaceAll('\t', '').replaceAll(' ', '');
                    if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                        req.add(param);
                    }

                    if (splitedParams[idx - 4] && splitedParams[idx - 3] == ')') {
                        let auxReq = splitedParams[idx - 4].split(',')[0];
                        if (auxReq) {
                            auxReq = auxReq.split(':')[0].trim();
                            req.add(auxReq);
                        }
                        let auxRes = splitedParams[idx - 4].split(',')[1];
                        if (auxRes) {
                            auxRes = auxRes.split(':')[0].trim();
                            res.add(auxRes);
                        }
                        let auxNext = splitedParams[idx - 4].split(',')[2];
                        if (auxNext) {
                            auxNext = auxNext.split(':')[0].trim();
                            next.add(auxNext);
                        }
                    }
                }

                // Response
                if (params[1] && params[1].includes(':')) {
                    // TS
                    let typeParam = params[1].split(':')[1].toLocaleLowerCase();
                    let param = params[1].split(':')[0].replaceAll('\n', '').replaceAll('\t', '').replaceAll(' ', '');
                    if (typeParam.includes('res')) {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            res.add(param);
                        }
                    } else if (typeParam.includes('req')) {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            req.add(param);
                        }
                    } else if (typeParam.includes('next')) {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            next.add(param);
                        }
                    } else {
                        // any
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            res.add(param);
                        }
                    }
                } else if (params[1]) {
                    // JS
                    let param = params[1].replaceAll('\n', '').replaceAll('\t', '').replaceAll(' ', '');
                    if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                        res.add(param);
                    }
                }

                // Next middleware
                if (params[2] && params[2].includes(':')) {
                    // TS
                    let typeParam = params[2].split(':')[1].toLocaleLowerCase();
                    let param = params[2].split(':')[0].replaceAll('\n', '').replaceAll('\t', '').replaceAll(' ', '');
                    if (typeParam.includes('res')) {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            res.add(param);
                        }
                    } else if (typeParam.includes('req')) {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            req.add(param);
                        }
                    } else {
                        if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                            next.add(param);
                        }
                    }
                } else if (params[2]) {
                    // JS
                    let param = params[2].replaceAll('\n', '').replaceAll('\t', '').replaceAll(' ', '');
                    if (param.split(new RegExp(regex)).length === 1 && param && param.trim() !== '') {
                        next.add(param);
                    }
                }
            }
        }
        return {
            req: [...req],
            res: [...res],
            next: [...next]
        };
    } catch (err) {
        return {
            req: [...req],
            res: [...res],
            next: [...next]
        };
    }
}
Recognize callback parameters.
@param {string} data content.