Meteor signaling without db write












0















I've been looking for a good way to do, but haven't found anything that doesn't seem hacky. I want to signal the client without going through the database and a subscription. For example, in a game I want to send a message to the client to display "Player 1 almost scores!". I don't care about this information in the long run, so I don't want to push it to the DB. I guess I could just set up another socket.io, but I'd rather not have to manage a second connection if there is a good way to go it within meteor. Thanks! (BTW, have looked at Meteor Streams, but it appears to have gone inactive)










share|improve this question





























    0















    I've been looking for a good way to do, but haven't found anything that doesn't seem hacky. I want to signal the client without going through the database and a subscription. For example, in a game I want to send a message to the client to display "Player 1 almost scores!". I don't care about this information in the long run, so I don't want to push it to the DB. I guess I could just set up another socket.io, but I'd rather not have to manage a second connection if there is a good way to go it within meteor. Thanks! (BTW, have looked at Meteor Streams, but it appears to have gone inactive)










    share|improve this question



























      0












      0








      0








      I've been looking for a good way to do, but haven't found anything that doesn't seem hacky. I want to signal the client without going through the database and a subscription. For example, in a game I want to send a message to the client to display "Player 1 almost scores!". I don't care about this information in the long run, so I don't want to push it to the DB. I guess I could just set up another socket.io, but I'd rather not have to manage a second connection if there is a good way to go it within meteor. Thanks! (BTW, have looked at Meteor Streams, but it appears to have gone inactive)










      share|improve this question
















      I've been looking for a good way to do, but haven't found anything that doesn't seem hacky. I want to signal the client without going through the database and a subscription. For example, in a game I want to send a message to the client to display "Player 1 almost scores!". I don't care about this information in the long run, so I don't want to push it to the DB. I guess I could just set up another socket.io, but I'd rather not have to manage a second connection if there is a good way to go it within meteor. Thanks! (BTW, have looked at Meteor Streams, but it appears to have gone inactive)







      meteor






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 23 '18 at 22:21







      David K.

















      asked Nov 20 '18 at 21:06









      David K.David K.

      15718




      15718
























          2 Answers
          2






          active

          oldest

          votes


















          1














          You know that Meteor provides real-time communication from the server to clients through Publish and Subscribe mechanism, which is typically used to send your MongoDB data and later modifications.



          You would like a similar push system but without having to record some data into your MongoDB.



          It is totally possible re-using the Meteor Pub/Sub system but without the database part: while with Meteor.publish you typically return a Collection Cursor, hence data from your DB, you can also use its low-level API to send arbitrary real-time information:




          Alternatively, a publish function can directly control its published record set by calling the functions added (to add a new document to the published record set), changed (to change or clear some fields on a document already in the published record set), and removed (to remove documents from the published record set). […]




          Simply do not return anything, use the above mentioned methods and do not forget calling this.ready() by the end of your publish function.



          See also the Guide about Custom publications



          // SERVER
          const customCollectionName = 'collection-name';
          let sender; // <== we will keep a reference to the publisher

          Meteor.publish('custom-publication', function() {
          sender = this;

          this.ready();

          this.onStop(() => {
          // Called when a Client stops its Subscription
          });
          });

          // Later on…
          // ==> Send a "new document" as a new signal message
          sender.added(customCollectionName, 'someId', {
          // "new document"
          field: 'values2'
          });

          // CLIENT
          const signalsCollectionName = 'collection-name'; // Must match what is used in Server
          const Signals = new Mongo.Collection(signalsCollectionName);
          Meteor.subscribe('custom-publication'); // As usual, must match what is used in Server

          // Then use the Collection low-level API
          // to listen to changes and act accordingly
          // https://docs.meteor.com/api/collections.html#Mongo-Cursor-observe
          const allSignalsCursor = Signals.find();
          allSignalsCursor.observe({
          added: (newDocument) => {
          // Do your stuff with the received document.
          }
          });


          Then how and when you use sender.added() is totally up to you.



          Note: keep in mind that it will send data individually to a Client (each Client has their own Server session)



          If you want to broadcast messages to several Clients simultaneously, then the easiest way is to use your MongoDB as the glue between your Server sessions. If you do not care about actual persistence, then simply re-use the same document over and over and listen to changes instead of additions in your Client Collection Cursor observer.






          share|improve this answer


























          • Thanks, that’s what I want to accomplish.

            – David K.
            Nov 29 '18 at 16:23



















          0














          It's completly fine to use the database for such a task.
          Maybe create a collection of "Streams" where you store the intended receiver and the message, the client subscribe to his stream and watches any changes on it.
          You can then delete the stream from the database after the client is done with it.
          This is a lot easier than reinventing the wheel and writing everything from scratch.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53401536%2fmeteor-signaling-without-db-write%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            You know that Meteor provides real-time communication from the server to clients through Publish and Subscribe mechanism, which is typically used to send your MongoDB data and later modifications.



            You would like a similar push system but without having to record some data into your MongoDB.



            It is totally possible re-using the Meteor Pub/Sub system but without the database part: while with Meteor.publish you typically return a Collection Cursor, hence data from your DB, you can also use its low-level API to send arbitrary real-time information:




            Alternatively, a publish function can directly control its published record set by calling the functions added (to add a new document to the published record set), changed (to change or clear some fields on a document already in the published record set), and removed (to remove documents from the published record set). […]




            Simply do not return anything, use the above mentioned methods and do not forget calling this.ready() by the end of your publish function.



            See also the Guide about Custom publications



            // SERVER
            const customCollectionName = 'collection-name';
            let sender; // <== we will keep a reference to the publisher

            Meteor.publish('custom-publication', function() {
            sender = this;

            this.ready();

            this.onStop(() => {
            // Called when a Client stops its Subscription
            });
            });

            // Later on…
            // ==> Send a "new document" as a new signal message
            sender.added(customCollectionName, 'someId', {
            // "new document"
            field: 'values2'
            });

            // CLIENT
            const signalsCollectionName = 'collection-name'; // Must match what is used in Server
            const Signals = new Mongo.Collection(signalsCollectionName);
            Meteor.subscribe('custom-publication'); // As usual, must match what is used in Server

            // Then use the Collection low-level API
            // to listen to changes and act accordingly
            // https://docs.meteor.com/api/collections.html#Mongo-Cursor-observe
            const allSignalsCursor = Signals.find();
            allSignalsCursor.observe({
            added: (newDocument) => {
            // Do your stuff with the received document.
            }
            });


            Then how and when you use sender.added() is totally up to you.



            Note: keep in mind that it will send data individually to a Client (each Client has their own Server session)



            If you want to broadcast messages to several Clients simultaneously, then the easiest way is to use your MongoDB as the glue between your Server sessions. If you do not care about actual persistence, then simply re-use the same document over and over and listen to changes instead of additions in your Client Collection Cursor observer.






            share|improve this answer


























            • Thanks, that’s what I want to accomplish.

              – David K.
              Nov 29 '18 at 16:23
















            1














            You know that Meteor provides real-time communication from the server to clients through Publish and Subscribe mechanism, which is typically used to send your MongoDB data and later modifications.



            You would like a similar push system but without having to record some data into your MongoDB.



            It is totally possible re-using the Meteor Pub/Sub system but without the database part: while with Meteor.publish you typically return a Collection Cursor, hence data from your DB, you can also use its low-level API to send arbitrary real-time information:




            Alternatively, a publish function can directly control its published record set by calling the functions added (to add a new document to the published record set), changed (to change or clear some fields on a document already in the published record set), and removed (to remove documents from the published record set). […]




            Simply do not return anything, use the above mentioned methods and do not forget calling this.ready() by the end of your publish function.



            See also the Guide about Custom publications



            // SERVER
            const customCollectionName = 'collection-name';
            let sender; // <== we will keep a reference to the publisher

            Meteor.publish('custom-publication', function() {
            sender = this;

            this.ready();

            this.onStop(() => {
            // Called when a Client stops its Subscription
            });
            });

            // Later on…
            // ==> Send a "new document" as a new signal message
            sender.added(customCollectionName, 'someId', {
            // "new document"
            field: 'values2'
            });

            // CLIENT
            const signalsCollectionName = 'collection-name'; // Must match what is used in Server
            const Signals = new Mongo.Collection(signalsCollectionName);
            Meteor.subscribe('custom-publication'); // As usual, must match what is used in Server

            // Then use the Collection low-level API
            // to listen to changes and act accordingly
            // https://docs.meteor.com/api/collections.html#Mongo-Cursor-observe
            const allSignalsCursor = Signals.find();
            allSignalsCursor.observe({
            added: (newDocument) => {
            // Do your stuff with the received document.
            }
            });


            Then how and when you use sender.added() is totally up to you.



            Note: keep in mind that it will send data individually to a Client (each Client has their own Server session)



            If you want to broadcast messages to several Clients simultaneously, then the easiest way is to use your MongoDB as the glue between your Server sessions. If you do not care about actual persistence, then simply re-use the same document over and over and listen to changes instead of additions in your Client Collection Cursor observer.






            share|improve this answer


























            • Thanks, that’s what I want to accomplish.

              – David K.
              Nov 29 '18 at 16:23














            1












            1








            1







            You know that Meteor provides real-time communication from the server to clients through Publish and Subscribe mechanism, which is typically used to send your MongoDB data and later modifications.



            You would like a similar push system but without having to record some data into your MongoDB.



            It is totally possible re-using the Meteor Pub/Sub system but without the database part: while with Meteor.publish you typically return a Collection Cursor, hence data from your DB, you can also use its low-level API to send arbitrary real-time information:




            Alternatively, a publish function can directly control its published record set by calling the functions added (to add a new document to the published record set), changed (to change or clear some fields on a document already in the published record set), and removed (to remove documents from the published record set). […]




            Simply do not return anything, use the above mentioned methods and do not forget calling this.ready() by the end of your publish function.



            See also the Guide about Custom publications



            // SERVER
            const customCollectionName = 'collection-name';
            let sender; // <== we will keep a reference to the publisher

            Meteor.publish('custom-publication', function() {
            sender = this;

            this.ready();

            this.onStop(() => {
            // Called when a Client stops its Subscription
            });
            });

            // Later on…
            // ==> Send a "new document" as a new signal message
            sender.added(customCollectionName, 'someId', {
            // "new document"
            field: 'values2'
            });

            // CLIENT
            const signalsCollectionName = 'collection-name'; // Must match what is used in Server
            const Signals = new Mongo.Collection(signalsCollectionName);
            Meteor.subscribe('custom-publication'); // As usual, must match what is used in Server

            // Then use the Collection low-level API
            // to listen to changes and act accordingly
            // https://docs.meteor.com/api/collections.html#Mongo-Cursor-observe
            const allSignalsCursor = Signals.find();
            allSignalsCursor.observe({
            added: (newDocument) => {
            // Do your stuff with the received document.
            }
            });


            Then how and when you use sender.added() is totally up to you.



            Note: keep in mind that it will send data individually to a Client (each Client has their own Server session)



            If you want to broadcast messages to several Clients simultaneously, then the easiest way is to use your MongoDB as the glue between your Server sessions. If you do not care about actual persistence, then simply re-use the same document over and over and listen to changes instead of additions in your Client Collection Cursor observer.






            share|improve this answer















            You know that Meteor provides real-time communication from the server to clients through Publish and Subscribe mechanism, which is typically used to send your MongoDB data and later modifications.



            You would like a similar push system but without having to record some data into your MongoDB.



            It is totally possible re-using the Meteor Pub/Sub system but without the database part: while with Meteor.publish you typically return a Collection Cursor, hence data from your DB, you can also use its low-level API to send arbitrary real-time information:




            Alternatively, a publish function can directly control its published record set by calling the functions added (to add a new document to the published record set), changed (to change or clear some fields on a document already in the published record set), and removed (to remove documents from the published record set). […]




            Simply do not return anything, use the above mentioned methods and do not forget calling this.ready() by the end of your publish function.



            See also the Guide about Custom publications



            // SERVER
            const customCollectionName = 'collection-name';
            let sender; // <== we will keep a reference to the publisher

            Meteor.publish('custom-publication', function() {
            sender = this;

            this.ready();

            this.onStop(() => {
            // Called when a Client stops its Subscription
            });
            });

            // Later on…
            // ==> Send a "new document" as a new signal message
            sender.added(customCollectionName, 'someId', {
            // "new document"
            field: 'values2'
            });

            // CLIENT
            const signalsCollectionName = 'collection-name'; // Must match what is used in Server
            const Signals = new Mongo.Collection(signalsCollectionName);
            Meteor.subscribe('custom-publication'); // As usual, must match what is used in Server

            // Then use the Collection low-level API
            // to listen to changes and act accordingly
            // https://docs.meteor.com/api/collections.html#Mongo-Cursor-observe
            const allSignalsCursor = Signals.find();
            allSignalsCursor.observe({
            added: (newDocument) => {
            // Do your stuff with the received document.
            }
            });


            Then how and when you use sender.added() is totally up to you.



            Note: keep in mind that it will send data individually to a Client (each Client has their own Server session)



            If you want to broadcast messages to several Clients simultaneously, then the easiest way is to use your MongoDB as the glue between your Server sessions. If you do not care about actual persistence, then simply re-use the same document over and over and listen to changes instead of additions in your Client Collection Cursor observer.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Nov 24 '18 at 3:31

























            answered Nov 24 '18 at 3:19









            ghybsghybs

            23.3k32545




            23.3k32545













            • Thanks, that’s what I want to accomplish.

              – David K.
              Nov 29 '18 at 16:23



















            • Thanks, that’s what I want to accomplish.

              – David K.
              Nov 29 '18 at 16:23

















            Thanks, that’s what I want to accomplish.

            – David K.
            Nov 29 '18 at 16:23





            Thanks, that’s what I want to accomplish.

            – David K.
            Nov 29 '18 at 16:23













            0














            It's completly fine to use the database for such a task.
            Maybe create a collection of "Streams" where you store the intended receiver and the message, the client subscribe to his stream and watches any changes on it.
            You can then delete the stream from the database after the client is done with it.
            This is a lot easier than reinventing the wheel and writing everything from scratch.






            share|improve this answer




























              0














              It's completly fine to use the database for such a task.
              Maybe create a collection of "Streams" where you store the intended receiver and the message, the client subscribe to his stream and watches any changes on it.
              You can then delete the stream from the database after the client is done with it.
              This is a lot easier than reinventing the wheel and writing everything from scratch.






              share|improve this answer


























                0












                0








                0







                It's completly fine to use the database for such a task.
                Maybe create a collection of "Streams" where you store the intended receiver and the message, the client subscribe to his stream and watches any changes on it.
                You can then delete the stream from the database after the client is done with it.
                This is a lot easier than reinventing the wheel and writing everything from scratch.






                share|improve this answer













                It's completly fine to use the database for such a task.
                Maybe create a collection of "Streams" where you store the intended receiver and the message, the client subscribe to his stream and watches any changes on it.
                You can then delete the stream from the database after the client is done with it.
                This is a lot easier than reinventing the wheel and writing everything from scratch.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 23 '18 at 5:53









                FawziFawzi

                267110




                267110






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53401536%2fmeteor-signaling-without-db-write%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    MongoDB - Not Authorized To Execute Command

                    How to fix TextFormField cause rebuild widget in Flutter

                    Npm cannot find a required file even through it is in the searched directory