Yes, it is possible, but I suggest doing only 1 redirect at the end.
Try this example instead:
const redirect = async (request) => {
//cf-ipcountry and CF-Device-Type are not supported in the preview
const {url: requestUrl, headers} = request
const url = new URL(requestUrl)
const {pathname, hostname} = url
const country = headers.get('cf-ipcountry')
const device = headers.get('CF-Device-Type')
if (country != null && device != null) {
let redir = false;
if(device === 'mobile' && !hostname.startsWith('m.'))
{
hostname = `m.${hostname}`
redir = true
}
if(device === 'desktop' && hostname.startsWith('m.'))
{
hostname = hostname.substring(2)
redir = true
}
if(countryCodes.includes(country) && !pathname.startsWith('/'+ country.toLowerCase()))
{
hostname += '/' + country;
redir = true
}
if(redir)
{
return Response.redirect(new URL(`https://${hostname}`).href)
}
}
return await fetch(request)
}
const countryCodes = ['CN', 'RU', 'US']
const handleRequest = async (request) => redirect(request)
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})