Я пытаюсь внедрить Firebase SSE для чата в игре Unity (для WebGL/Mobile) с библиотекой «BestHTTP», чтобы имитировать прослушиватель «child_added» или «child_changed» в SDK Javascript Firebase, который только недавно добавленные или обновленные данные будут отправлены клиенту.
Теперь моя проблема заключается в том, что когда соединение инициализируется и открывается, слушатель "put" всегда будет отправлять обратно жирный JSON, включая все данные в моем целевом узле firebase. После открытия события слушатель работает, как и ожидалось. Только обновленные данные будут отправлены обратно клиенту через прослушиватель «put».
Я новичок в SSE, и мне интересно, является ли это стандартным поведением SSE, или оно определяется собственным правилом Firebase, или проблемой из моего кода/библиотеки?
Firebase REST SSE: https://firebase.google.com/docs/reference/rest/database#section-streaming
void Init(){
var eventSource = new EventSource(new Uri("https://{}.firebaseio.com/TestChatRoom.json"), 1);
eventSource.On("put", OnPut);
eventSource.Open();
}
void OnPut(EventSource source, Message msg){
DebugLog(string.Format("OnPut: <color=yellow>{0}</color>", msg.Data.ToString()));
}
==========Обновление==========
Решил это с помощью @Frank. Оказывается, я могу использовать те же параметры запроса в RestAPI Firebase для прослушивателя SSE. Все, что мне нужно, это добавить "orderBy="$key"&limitToLast=20" в мой URL-адрес запроса, чтобы он возвращал только последние 20 дочерних элементов после открытия соединения и продолжал обновляться при добавлении нового дочернего элемента.
Вот код, который у меня работает (C# для Unity, с плагином BestHTTP):
void Init(){
var eventSource = new EventSource(new Uri("https://{}.firebaseio.com/TestChatRoom.json?orderBy=%22$key%22&limitToLast=20"), 1);
eventSource.On("put", OnPut);
eventSource.Open();
}
void OnPut(EventSource source, Message msg){
Debug.Log(msg.Data.ToString());
}
Кажется, что REST — единственный способ работать с мобильными/вебгл/редакторами. Мучительно... Официальная библиотека ориентирована на android/ios.
Что ж, возможно, вы захотите отредактировать вопрос, чтобы более подробно объяснить, что именно не работает так, как вы ожидаете, а также детали отладки. Мы не можем заглянуть внутрь вашей базы данных или наблюдать за выполнением вашего кода.
Спасибо. Добавлено дополнительное описание ожидаемого результата. Журнал отладки будет добавлен позже.
То, что вы видите в ответе потоковой передачи REST, на самом деле является тем, как работают все клиенты Firebase (включая все SDK). Firebase синхронизирует состояние узла, на который вы подписаны, а не просто передает события, происходящие после начала подписки.
Если вы хотите получить только новые данные, вам придется запрашивать то, что ваше приложение считает «новым». Обычно это означает один из следующих подходов:
OrderByKey().StartAt("thatKey")
.Спасибо, Фрэнк, удалось решить эту проблему с помощью вашей подсказки!
Есть ли причина, по которой вы используете REST API вместо предоставленной клиентской библиотеки для единства?