How to track the number of anonymous users server-side in Meteor?

javascript, meteor

Solution

For the sake of completeness, it's probably best to combine the two answers above. In other words, do the following:

- Keep the online status in `Meteor.users`, as opposed to a separate collection, as in https://github.com/erundook/meteor-profile-online

- Keep track of disconnections via callback, instead of a heartbeat, as in https://github.com/murilopolese/howmanypeoplearelooking

This would probably be the canonical way to implement this in Meteor. I've created this as a smart package that you can install with Meteorite: https://github.com/mizzao/meteor-user-status

Problem

I'm writing a data-sensitive application in Meteor, and am trying to limit the client access to as much information as possible. Therefore, I want to implement server side a way of counting the number of logged-in, and anonymous, users. I have tried a variety of methods. The first was as outlined in this question Server cleanup after a client disconnects, which suggests hooking into: ``` this.session.socket.on("close") ``` However when I did, and tried to change a collection, it threw a "Meteor code must always run within a Fiber" error. I assume this problem is because once the socket is closed, that Fiber is killed, and so accessing the database is impossible. The OP pointed to this "Meteor code must always run within a Fiber" when calling Collection.insert on server as a possible solution, but I wasn't sure if that's the best method, based on the comments to the answer. I then tried to autorun on the variable: ``` Meteor.default_server.stream_server.all_sockets().length ``` but the autorun never seemed to be called, so I'm assuming that variable is not a reactive context, and I wasn't sure how to make it one. The last idea was to do a keepalive style thing, but that seems to completely go against the grain of the Meteor philosophy, and I think I'll only use as an absolute last resort. I did a `console.log` of the functions on `this.session.socket`, and the only other function possible was `.on("data")`, but this isn't called when the socket is closed. I'm at a bit of a loss here, so any help would be great, Thanks.

Original source

Related problems