Skip to content

Instantly share code, notes, and snippets.

@Gregivy
Created January 17, 2019 16:26
Show Gist options
  • Save Gregivy/d87e6f76068525d8041e45f0e34ed517 to your computer and use it in GitHub Desktop.
Save Gregivy/d87e6f76068525d8041e45f0e34ed517 to your computer and use it in GitHub Desktop.
Метеор публикация. Количество сообщений в некотором диалоге (при условии, что сообщения нельзя удалять)
import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
import { Dialogs } from './dialogs.js'; // коллекция диалогов
import { Messages } from './messages.js'; // коллекция сообщений
/*
* messageNumberInDialog (dialogId)
* dialogId string - ID диалога
* ----------------------------------------------------
* Публикация на количество сообщений в диалоге,
* с учетом того, что сообщения не удаляются.
* Для оптимизации observer`ы сохраняются и переиспользуются,
* до тех пора есть хотя бы один клиент,
* подписанный на определенный диалог.
*/
let observers = {};
Meteor.publish('messageNumberInDialog',function (dialogId){
// какие-то проверки, например авторизация
if (!this.userId) return false;
check(dialogId, String);
if (!Dialogs.findOne(dialogId)) return false;
if (!observers.hasOwnProperty(dialogId)){
// такого обзервера еще нет, создаем
observers[dialogId] = {clientsNumber:0};
// количество сообщений на данный момент
observers[dialogId].messagesInDialog = Messages.find({dialogId:dialogId}).count();
// через skip пропускаем уже учтенные сообщения
observers[dialogId].observer = Messages.find({
dialogId:dialogId
}, {
skip:observers[dialogId].messagesInDialog
}).observeChanges({
added: ()=>{
observers[dialogId].messagesInDialog++;
// обновляем число сообщений в диалоге
this.changed('service', 'messNumber', {number:observers[dialogId].messagesInDialog});
}
});
}
// клиент подписался, запоминаем это
observers[dialogId].clientsNumber++;
// в виртуальную сервисную коллекцию добавляем объект с полем, содержащим число сообщений
this.added('service', 'messNumber', {number:observers[dialogId].messagesInDialog});
this.ready();
this.onStop(()=>{
// клиент отписался или тому подобное
observers[dialogId].clientsNumber--;
if (observers[dialogId].clientsNumber==0){
// клиент был последним, удаляем обзервер
observers[dialogId].observer.stop();
delete observers[dialogId];
}
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment