Использование Ably Realtime для веб-системы бронирования.
Я постоянно получаю несколько ошибок в консоли js, хотя все работает правильно.
По сути, есть селектор даты, и когда посетитель выбирает дату, я устанавливаю глобальную переменную day
в дату (что-то вроде 2018-05-25
) и вызываю VisitorMessages.start()
, который подписывает их на сообщения и делает их присутствующими на канале visitor:2018-05-25
, и отписывает их со всех остальных каналов.
У меня также есть канал visitor:all
, на который все получают сообщения и присутствие которого не требуется.
Вот что я делаю (извините за CoffeeScript):
VisitorMessages =
realtime: null
connected_first_time: false
start: ->
unless @realtime
@realtime = new Ably.Realtime
authUrl: '/auth'
recover: (lastConnectionDetails, cb) ->
cb(true)
return
@unsubscribe()
dayChannel = @realtime.channels.get("visitor:#{day}")
allChannel = @realtime.channels.get("visitor:all")
allChannel.subscribe (m) ->
switch m.name
when " . . . "
# . . .
dayChannel.subscribe (m) ->
switch m.name
when " . . . "
# . . .
dayChannel.presence.subscribe 'enter', (member) -> VisitorMessages.setNumOnline(dayChannel)
dayChannel.presence.subscribe 'leave', (member) -> VisitorMessages.setNumOnline(dayChannel)
dayChannel.presence.enter()
VisitorMessages.setNumOnline(dayChannel)
@realtime.connection.on 'connected', ->
VisitorMessages.refreshData() # not showing this function here
VisitorMessages.connected_first_time = true # the refreshData() function returns if this is false
dayChannel = VisitorMessages.realtime.channels.get("visitor:#{day}")
dayChannel.attach()
dayChannel.presence.enter()
VisitorMessages.setNumOnline(dayChannel)
allChannel = VisitorMessages.realtime.channels.get("visitor:all")
allChannel.attach()
setNumOnline: (channel) ->
channel.presence.get (err, members) ->
# I use ractive.js to manipulate the DOM
ractive.set('number_online', members.length)
unsubscribe: ->
for channelName of VisitorMessages.realtime.channels.all
unless channelName == 'visitor:all'
channel = VisitorMessages.realtime.channels.get(channelName)
channel.presence.leave()
channel.presence.unsubscribe()
channel.unsubscribe()
channel.detach()
VisitorMessages.realtime.channels.release(channelName)
В консоли js посетитель получает вот это:
Ably: ConnectionManager.onChannelMessage() received message with different connectionSerial, but same message id as a previous; discarding
Иногда это:
Ably: RealtimePresence._ensureMyMembersPresent(): Presence auto-re-enter failed: [c: Unable to enter presence channel (incompatible state); code=90001]
И, при переходе на другую дату (которая устанавливает день и вызывает VisitorMessages.start()
, получают вот это:
Channels.onChannelMessage(): received event for non-existent channel: visitor:2018-05-26
Я знаю, что это, вероятно, потому, что я явно освобождаю канал при переключении дней, но когда я этого не делал, VisitorMessages.realtime.channels.all
содержал бы все каналы, к которым я когда-либо присоединялся, и я все еще получал сообщения для каналов без подписки.
Итак, здесь происходит много разных вещей, но может ли кто-нибудь увидеть какой-то большой недостаток в моем подходе или помочь мне понять, почему происходят эти ошибки? Опять же, все работает нормально, но что-то не так!
Спасибо!
Вот приведенный выше код, скомпилированный в javascript:
var VisitorMessages;
VisitorMessages = {
realtime: null,
connected_first_time: false,
start: function() {
var allChannel, dayChannel;
if (!this.realtime) {
this.realtime = new Ably.Realtime({
authUrl: '/auth',
recover: function(lastConnectionDetails, cb) {
cb(true);
}
});
}
this.unsubscribe();
dayChannel = this.realtime.channels.get("visitor:" + day);
allChannel = this.realtime.channels.get("visitor:all");
allChannel.subscribe(function(m) {
switch (m.name) {
case " . . . ":
// . . .
}
});
dayChannel.subscribe(function(m) {
switch (m.name) {
case " . . . ":
// . . .
}
});
dayChannel.presence.subscribe('enter', function(member) {
VisitorMessages.setNumOnline(dayChannel);
});
dayChannel.presence.subscribe('leave', function(member) {
VisitorMessages.setNumOnline(dayChannel);
});
dayChannel.presence.enter();
VisitorMessages.setNumOnline(dayChannel);
return this.realtime.connection.on('connected', function() {
VisitorMessages.refreshData();
VisitorMessages.connected_first_time = true;
dayChannel = VisitorMessages.realtime.channels.get("visitor:" + day);
dayChannel.attach();
dayChannel.presence.enter();
VisitorMessages.setNumOnline(dayChannel);
allChannel = VisitorMessages.realtime.channels.get("visitor:all");
allChannel.attach();
});
},
setNumOnline: function(channel) {
channel.presence.get(function(err, members) {
ractive.set('number_online', members.length);
});
},
unsubscribe: function() {
var channel, channelName, results;
for (channelName in VisitorMessages.realtime.channels.all) {
if (channelName !== 'visitor:all') {
channel = VisitorMessages.realtime.channels.get(channelName);
channel.presence.leave();
channel.presence.unsubscribe();
channel.unsubscribe();
channel.detach();
VisitorMessages.realtime.channels.release(channelName);
}
}
}
};