Для Google Chrome (протестировано на версии 62)
Я пытался сохранить соединение через сокет из API извлечения Google Chrome с удаленным экспресс-сервером и обнаружил, что заголовки запроса должны соответствовать собственным настройкам соединения <net.socket>
Node.JS.
Я установил объект заголовков в своем клиентском скрипте со следующими параметрами:
/* ----- */
head = new headers();
head.append("Connnection", "keep-alive")
head.append("Keep-Alive", `timeout=${1*60*5}`) //in seconds, not milliseconds
/* apply more definitions to the header */
fetch(url, {
method: 'OPTIONS',
credentials: "include",
body: JSON.stringify(data),
cors: 'cors',
headers: head, //could be object literal too
cache: 'default'
})
.then(response=>{
....
}).catch(err=>{...});
И на моем экспресс-сервере я настроил свой роутер следующим образом:
router.head('absolute or regex', (request, response, next)=>{
req.setTimeout(1000*60*5, ()=>{
console.info("socket timed out");
});
console.info("Proceeding down the middleware chain link...\n\n");
next();
});
/*Keep the socket alive by enabling it on the server, with an optional
delay on the last packet sent
*/
server.on('connection', (socket)=>socket.setKeepAlive(true, 10))
ПРЕДУПРЕЖДЕНИЕ
Пожалуйста, руководствуйтесь здравым смыслом и убедитесь, что пользователи, которым вы открываете сокет-соединение, проверены и сериализованы. Он работает и для Firefox, но он действительно уязвим, если вы оставляете TCP-соединение открытым более 5 минут.
Я не уверен, как работают некоторые из менее известных браузеров, но я добавлю к этому ответу также детали браузера Microsoft.