Skip to content
Extraits de code Groupes Projets
websocket_server.rb 1,74 ko
Newer Older
  • Learn to ignore specific revisions
  • #   Copyright (c) 2010, Diaspora Inc.  This file is
    
    Raphael's avatar
    Raphael a validé
    #   licensed under the Affero General Public License version 3 or later.  See
    
    #   the COPYRIGHT file.
    
    require File.dirname(__FILE__) + '/../config/environment'
    require File.dirname(__FILE__) + '/../lib/diaspora/websocket'
    
    
    at_exit do
      begin
        File.delete(PID_FILE)
      rescue
        puts 'Cannot remove pidfile: ' + (PID_FILE ? PID_FILE : "NIL")
      end
    end
    
    def write_pidfile
      begin
        f = File.open(PID_FILE, "w")
        f.write(Process.pid)
        f.close
      rescue => e
        puts "Can't write to pidfile!"
        puts e.inspect
      end
    end
    
    
    CHANNEL = Magent::GenericChannel.new('websocket')
    def process_message
      if CHANNEL.queue_count > 0
        message = CHANNEL.dequeue
        if message
          Diaspora::WebSocket.push_to_user(message['uid'], message['data'])
        end
        EM.next_tick{ process_message}
      else
        EM::Timer.new(1){process_message}
      end
    
    end
    
    
      EM.run {
        Diaspora::WebSocket.initialize_channels
    
        EventMachine::WebSocket.start(
    
                      :host => APP_CONFIG[:socket_host],
    
                      :port => APP_CONFIG[:socket_port],
                      :debug =>APP_CONFIG[:socket_debug]) do |ws|
          ws.onopen {
    
            sid = Diaspora::WebSocket.subscribe(ws.request['Path'].gsub('/',''), ws)
    
            ws.onmessage { |msg| SocketsController.new.incoming(msg) }
    
            ws.onclose { Diaspora::WebSocket.unsubscribe(ws.request['Path'].gsub('/',''), sid) }
          }
        end
    
        PID_FILE = APP_CONFIG[:socket_pidfile]
        write_pidfile
    
        puts "Websocket server started."
    
    rescue RuntimeError => e
      raise e unless e.message.include?("no acceptor")
      puts "Are you sure the websocket server isn't already running?"
      puts "Just start thin with bundle exec thin start."
      Process.exit
    end