Socket IO и Google App Engine иногда не отправляют события через маршруты к приложению iOS - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть экспресс-сервер node.js, настроенный для подключения к IO WebSockets моего сокета iOS, и клиент только иногда получает события.

Розетки подключаются нормально, без отвода и присоединяются к нужной комнате. Они даже получают события прекрасно на стороне сервера, а также.

Проблема возникает, когда я пытаюсь отправить событие с одного из маршрутов. Все приложение отлично работает на локальном хосте без «пропущенных» событий, но когда я загружаю его на свой сервер flex GAE, я иногда получаю события только с сервера. У меня включена привязка к сеансу, и я подозреваю, что объект io в маршрутах не «видит» сокеты, потому что это другой экземпляр, но я не знаю, как это решить.

У меня есть приложение для iOSи работает с использованием клиента Swift Socket IO с такой конфигурацией:

guard let token = token else { return }

        let isDevEnvironment = Bundle.main.bundleIdentifier?.contains("dev") ?? false

        self.manager.config = [.log(true), .compress, .reconnects(true), .reconnectWait(5), .forceWebsockets(true), .cookies(Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.cookies! ?? []), .secure(!isDevEnvironment), .connectParams(["token": token, "collection_id": collectionId])]

        self.socket.on("joined_room")
        {
            (data, ack) in

            if let json = data.first as? [String : Any],
                let roomId = json["room_id"] as? String,
                let socketId = json["socket_id"] as? String
            {
                print("Connected to room with collection ID \(roomId) and ID \(socketId)")
            }
        }

        self.socket.on(clientEvent: .reconnectAttempt)
        {
            (data, ack) in

            print("Socket attempting to reconnect to server")

            self.manager.disconnect()
            self.socket.connect()
        }

        self.socket.on(clientEvent: .disconnect)
        {
            (data, ack) in

            print("Socket disconnected")
        }

Моя конфигурация на стороне сервера выглядит следующим образом

const app = express();
const server = Server(app);
const io = socketIO(server, { transports: ['websocket'], cookie: true, secure: true });

   io.use(async (socket, next) => {
  if (socket.handshake.query && socket.handshake.query.token) {
    try {
      const decodedToken = await admin.auth().verifyIdToken(socket.handshake.query.token);
      const { uid } = decodedToken;
      if (uid === undefined || uid === null) {
        throw new Error('This token is unauthorized or no user is associated to this token');
      }
      next();
    } catch (error) {
      next(error);
    }
  }
}).on('connection', socket => {
  socket.join(socket.handshake.query.collection_id, err => {
    if (err) {
      console.log(err);
    }
    console.log(`Socket with ID ${socket.id} joined room with ID ${socket.handshake.query.collection_id}`);
  });
  socket.on('disconnect', () => {
    console.log(`Socket with ID ${socket.id} disconnected`);
  });
});

app.set('io', io);

Чтобы запустить четное, я просто использую app.get('io').to(roomId).emit(event, object);

Есть ли что-то, что мне нужно сделать, чтобы обеспечить правильную маршрутизацию / балансировку нагрузки, которая не просто включает привязку к сеансу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...