Added ajax long polling.
This commit is contained in:
parent
5e69e1af4e
commit
a46463f9ee
2 changed files with 101 additions and 0 deletions
91
app/controllers/long_polling_controller.rb
Normal file
91
app/controllers/long_polling_controller.rb
Normal file
|
@ -0,0 +1,91 @@
|
|||
class LongPollingController < ApplicationController
|
||||
|
||||
# GET /api/message_send
|
||||
def message_send
|
||||
new_connection = false
|
||||
|
||||
# check client id
|
||||
client_id = client_id_check
|
||||
if !client_id
|
||||
new_connection = true
|
||||
client_id = client_id_gen
|
||||
puts 'NEW CLIENT CONNECTION: ' + client_id.to_s
|
||||
else
|
||||
# cerify client id
|
||||
if !client_id_verify
|
||||
render :json => { :error => 'Invalid client_id in send!' }, :status => :unprocessable_entity
|
||||
return
|
||||
end
|
||||
end
|
||||
if !params['data']
|
||||
params['data'] = {}
|
||||
end
|
||||
|
||||
# receive message
|
||||
if params['data']['action'] == 'login'
|
||||
user_id = session[:user_id]
|
||||
user = {}
|
||||
if user_id
|
||||
user = User.user_data_full( user_id )
|
||||
end
|
||||
Session.create( client_id, user, { :type => 'ajax' } )
|
||||
end
|
||||
|
||||
if new_connection
|
||||
result = { :client_id => client_id }
|
||||
render :json => result
|
||||
else
|
||||
render :json => {}
|
||||
end
|
||||
end
|
||||
|
||||
# GET /api/message_receive
|
||||
def message_receive
|
||||
|
||||
# check client id
|
||||
if !client_id_verify
|
||||
render :json => { :error => 'Invalid client_id receive!' }, :status => :unprocessable_entity
|
||||
return
|
||||
end
|
||||
|
||||
# check queue queue to send
|
||||
client_id = client_id_check
|
||||
begin
|
||||
count = 60
|
||||
while true
|
||||
count = count - 1
|
||||
queue = Session.queue( client_id )
|
||||
if queue && queue[0]
|
||||
# puts "send " + queue.inspect + client_id.to_s
|
||||
render :json => queue
|
||||
return
|
||||
end
|
||||
sleep 2
|
||||
if count == 0
|
||||
render :json => { :action => 'pong' }
|
||||
return
|
||||
end
|
||||
end
|
||||
rescue
|
||||
render :json => { :error => 'Invalid client_id in receive loop!' }, :status => :unprocessable_entity
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def client_id_check
|
||||
return params[:client_id] if params[:client_id]
|
||||
return
|
||||
end
|
||||
def client_id_gen
|
||||
rand(99999999)
|
||||
end
|
||||
def client_id_verify
|
||||
return if !params[:client_id]
|
||||
sessions = Session.sessions
|
||||
return if !sessions.include?( params[:client_id].to_s )
|
||||
# Session.update( client_id )
|
||||
# Session.touch( params[:client_id] )
|
||||
return true
|
||||
end
|
||||
end
|
10
config/routes/message.rb
Normal file
10
config/routes/message.rb
Normal file
|
@ -0,0 +1,10 @@
|
|||
module ExtraRoutes
|
||||
def add(map)
|
||||
|
||||
# messages
|
||||
map.match '/api/message_send', :to => 'long_polling#message_send'
|
||||
map.match '/api/message_receive', :to => 'long_polling#message_receive'
|
||||
|
||||
end
|
||||
module_function :add
|
||||
end
|
Loading…
Reference in a new issue