Created
January 17, 2019 16:26
-
-
Save Gregivy/d87e6f76068525d8041e45f0e34ed517 to your computer and use it in GitHub Desktop.
Метеор публикация. Количество сообщений в некотором диалоге (при условии, что сообщения нельзя удалять)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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