jptsetung
jptsetung

Reputation: 9167

Can I publish only Collections object in meteor?

On the introducing article of DDP, I read that anything can be published, but I've read somewhere ( for example in this Stackoverflow comment Publish arbitrary data and automatically update HTML ) that only Collections can be published.

So where is the truth? If we can publish other things than Collections, I would liek to see an example as I can't find one so far.

Upvotes: 1

Views: 1873

Answers (2)

Arunoda Susiripala
Arunoda Susiripala

Reputation: 2534

You can also look at Meteor Streams too. See below.

assume you have added meteor streams via atmosphere - mrt add streams

sc = new Meteor.Stream('hello');

if(Meteor.isServer) {
  Meteor.setInterval(function() {
    sc.emit('a_random_message', 'Random Message: ' + Random.id());
  }, 2000);

  Meteor.permissions.read(function() { return true });
}

if(Meteor.isClient) {
  sc.on('a_random_message', function(message) {
    Session.set('a_random_message', message);
  });

  Template.hello.greeting = function () {
    return Session.get('a_random_message');   
  };
}

Upvotes: 1

Tarang
Tarang

Reputation: 75975

From the docs: http://docs.meteor.com/#meteor_publish

Publish functions can return a Collection.Cursor, in which case Meteor will publish that cursor's documents. You can also return an array of Collection.Cursors, in which case Meteor will publish all of the cursors.

So at the moment you can only return a Collection via a cursor (result of a Collection.find()).

To return other data you need to hack into the sockjs stream (the socket library meteor uses to communicate to the server). Be aware this does not guarantee compatibility with future versions of meteor. Sockjs is the library used for meteor to communicate between the server (the wire)

from Publish arbitrary data and automatically update HTML*

client side js

sc = new Meteor._Stream('/sockjs');   
sc.on('message', function(payload) {
    var msg = JSON.parse(payload);
    Session.set('a_random_message', JSON.stringify(msg.data));   
});

Template.hello.greeting = function () {
    return Session.get('a_random_message');   
}; 

server side js

ss = new Meteor._StreamServer();

ss.register(function (socket) {
    var data = {socket: socket.id, connected: new Date()}
    var msg = {msg: 'data', data: data};

     // Send message to all sockets (which will be set in the Session a_random_message of the client
     _.each(ss.all_sockets(), function(socket) {
         socket.send(JSON.stringify(msg));
     });   
}); 

Upvotes: 1

Related Questions