Socket.io: GenerateId não funciona em 3x

Criado em 23 nov. 2020  ·  5Comentários  ·  Fonte: socketio/socket.io

Eu quero:

  • [x] relatar um bug
  • [] solicitar um recurso

Comportamento atual

Ao definir io.engine.generateId na v2.3.0, os IDs de soquete são definidos de acordo.
No 3x (testado em 3.0.0 e 3.0.3) eles não são.

Passos para reproduzir

Em Node.js:

const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const { v4: uuidv4 } = require('uuid');

io.engine.generateId = function (req)
{
    return uuidv4();
}

Comportamento esperado

Como funciona na v2.3.0, o formato esperado dos ids de soquete deve ser, neste caso, "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", sendo x alfanumérico. Em vez disso, obtenho o formato de ID de soquete padrão.

Configurar

  • SO: Windows 10, rodando em Node.js
  • versão socket.io: 3.0.0 e 3.0.3

Outras informações (por exemplo, rastreamentos de pilha, problemas relacionados, sugestões de como corrigir)

Nenhum erro é lançado, o formato simplesmente não está definido.

question

Todos 5 comentários

Sim, isso é esperado.

Aqui está o commit relacionado: https://github.com/socketio/socket.io/commit/2875d2cfdfa463e64cb520099749f543bbc4eb15

Portanto, o método generateId ainda está funcionando na v3, mas agora afetará apenas o parâmetro de consulta sid , não o atributo id do soquete.

Posso perguntar qual é o seu caso de uso?

Oh, tudo bem! Obrigado pela informação.

Eu estava reutilizando id para transmiti-lo a outros clientes para chamadas de vídeo usando peer.js, mas peer.js não gosta de seu formato.

Mas acabei de ver no commit que você mencionou que eu não deveria fazer isso por motivos de segurança, então acho que posso encerrar este problema.

Obrigado!

Acho que esse problema deve ser reaberto (ou um novo problema criado), pois na versão 3.0, não parece que a função generateId alguma vez seja chamada. Eu entendo que ele não está mais substituindo a propriedade socket.id, mas o comentário anterior de @darrachequesne sugere que ele está alterando uma propriedade diferente.

No entanto, de acordo com a documentação, faça o seguinte:

const content = require('fs').readFileSync(__dirname + '/index.html', 'utf8');

const httpServer = require('http').createServer((req, res) => {
  // serve the index.html file
  res.setHeader('Content-Type', 'text/html');
  res.setHeader('Content-Length', Buffer.byteLength(content));
  res.end(content);
});

const io = require('socket.io')(httpServer);
io.engine.generateId((req) => {
  console.log('This line is never executed');
  return new Date().valueOf().toString()
});

io.on('connection', socket => {
  console.log('connect');
  console.log(socket.sid);
});

httpServer.listen(3000, () => {
  console.log('go to http://localhost:3000');
});

A função nunca é chamada.

@BrianHVB Acho que há um erro de digitação em seu exemplo de código:

io.engine.generateId = ((req) => {
  console.log('This line is never executed');
  return new Date().valueOf().toString()
});

Você poderia confirmar se isso corrige o problema?

@darrachequesne - Opa, sim, é isso mesmo. Obrigada.

Esta página foi útil?
0 / 5 - 0 avaliações