user2722667
user2722667

Reputation: 8661

Laravel options to init pusher and echo without taking up connections

If I init echo and pusher in the bootstrap.js file I can see in pushers dashboard that a new connection is taken every time I visit/open my app in another tab even though I dont subscribe to any channels:

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
     broadcaster: 'pusher',
     key: process.env.MIX_PUSHER_APP_KEY,
     cluster: process.env.MIX_PUSHER_APP_CLUSTER,
     encrypted: true
 });

This is very bad since I only need pusher/echo on a singel page in my app and not all.

So instead I have setup a page.vue file in my app where I load echo/pusher:

import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

mounted() {

this.Echo = new Echo({
        broadcaster: 'pusher',
        key: process.env.MIX_PUSHER_APP_KEY,
        cluster: 'us',
        encrypted: true
      });

      this.Echo.channel('post')
      .listen('NewPost', (item) => {
          console.log(item);
      });

But is there any way I can add Echo/pusher window.Echo window.Pusher to my window DOM without making ut connect to pushers websocket? Eg only connect once I call .listen()

Upvotes: 0

Views: 1059

Answers (1)

Chris Chen
Chris Chen

Reputation: 1293

How about this?

import Echo from 'laravel-echo';        
window.EchoService = {
           init: () =>
     new Echo({
         broadcaster: 'pusher',
         key: process.env.MIX_PUSHER_APP_KEY,
         cluster: process.env.MIX_PUSHER_APP_CLUSTER,
         encrypted: true
     }),
     otherFunctions: ....,  
    }

Then in your vue page:

mounted() {
      this.newEcho = window.EchoService.init();
      this.newEcho.channel('post')
      .listen('NewPost', (item) => {
          console.log(item);
      });
}

You may also need to disconnect from the pusher on component destroyed

  destroyed() {
    this.newEcho.leave('post');
    // or this.newEcho.leave();
  }

Upvotes: 3

Related Questions