Skip to content

Commit

Permalink
Updated to use Rack (tested with thin). Doesn't actually work yet. Mi…
Browse files Browse the repository at this point in the history
…ght also contain updates to make it more compat with the new document model. (I honestly forget.)
  • Loading branch information
danopia committed Nov 4, 2009
1 parent c89d8e2 commit 09f7a95
Show file tree
Hide file tree
Showing 8 changed files with 212 additions and 38 deletions.
119 changes: 119 additions & 0 deletions rack.ru
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
require 'pp'

class SailsAdapter
def initialize(rails_app)
@rails = rails_app
end

def connect
return if @remote
@remote = SailsRemote.connect
DRb.start_service
end

def call(env)
response = @rails.call env
return response unless (200..299).include? response[0]
response[2].close # close rails, let it work for more stuff

connect # to the remote

@wave = nil
1/0 unless env['PATH_INFO'] =~ /^\/waves\/(.+)$/
name = $1
@wave = @remote[name]
version = @wave.newest_version

elapsed = 0
timer = EventMachine::PeriodicTimer.new(0.1) do
elapsed += 0.1
if elapsed > 5 || @remote[name].newest_version > version
timer.cancel

@wave = @remote[name]
version = @wave.newest_version

body = "<html><head></head><body><div id=\"data\">#{escape @wave.to_xml}</div>(at version <span id=\"version\">#{version}</span>)</body></html>"

env['async.callback'].call [200, {
'Cache-Control' => 'no-cache',
'Content-Type' => 'text/html; charset=utf-8',
}, body]

env['rack.errors'].write %{%s - %s [%s] "%s %s%s %s" %d\n} % [
env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
env["REMOTE_USER"] || "-",
Time.now.strftime("%d/%b/%Y %H:%M:%S"),
env["REQUEST_METHOD"],
env["PATH_INFO"],
env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
env["HTTP_VERSION"],
200 ]

end


end

[-1, {}, []]
end

def each
version = @wave.newest_version

yield "<html><head></head><body><div id=\"data\">#{escape @wave.to_xml}</div>(at version <span id=\"version\">#{version}</span>)</body></html>"

#data = data.size.to_s(16) + "\r\n" + data + "\r\n"
#env['async.callback'].call [200, headers, wrap(data)]

#sleep 5
#i = 0
#while i < 5
# i += 0.1
# sleep 0.1

# next unless @remote[$1].newest_version > version
# wave = @remote[$1]
# version = wave.newest_version
# data = "<script type=\"text/javascript\">
# document.getElementById('data').innerHTML = \"#{escape_js wave.to_xml}\";
# document.getElementById('version').innerHTML = \"#{version}\";
#</script>"

# data = data.size.to_s(16) + "\r\n" + data + "\r\n"
# env['async.callback'].call [200, headers, wrap(data)]
#end

#yield "<script type=\"text/javascript\">window.location.reload();</script>"
yield "<script type=\"text/javascript\">alert('hi');</script>"

#data = data.size.to_s(16) + "\r\n" + data + "\r\n0\r\n\r\n"

#[200, headers, data]


#term = "\r\n"
#@body.each do |chunk|
# size = bytesize(chunk)
# next if size == 0
# yield [size.to_s(16), term, chunk, term].join
#end
#yield ["0", term, "", term].join
end

def escape text
text.gsub('<', '&lt;').gsub('>', '&gt;').gsub(/&lt;line by="([^"]+)"&gt;\n&lt;\/line&gt;/, '<br />&lt;\1&gt; ')
end
def escape_js text
escape(text).gsub('\\', '\\\\').gsub('"', '\\"').gsub("\n", ' ')
end
end

use Rack::CommonLogger

rails_app = Rack::Adapter::Rails.new(:root => './wave.danopia.net')

app = Rack::URLMap.new('/ajax' => SailsAdapter.new(rails_app),
'/' => rails_app)

run app
9 changes: 9 additions & 0 deletions sails.conf
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ domain-name: wave.danopia.net
# Comment out the whole line to use the domain name without a subdomain.
#service-name: wave

# Location(s) of your .cert/.crt/.pem file(s)
# Put a dash before each file
certificate-chain:
- /home/danopia/certs/mine/new.crt
- /home/danopia/certs/cacert/root.crt

# Location of your .key file
key-path: /home/danopia/certs/mine/new.key3

# Connection details for the XMPP server. These values are used when connecting
# as a component. If you run XMPP locally, use 'localhost'
xmpp-connect-host: localhost
Expand Down
73 changes: 38 additions & 35 deletions wave.danopia.net/app/controllers/waves_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,44 +32,47 @@ def show
def ajax
@wave = @remote[params[:id]]
unless @wave
render :text => @remote[params[:id]].inspect, :status => 404
render :text => @remote[params].inspect, :status => 404
return
end

if params[:message] && params[:message].size > 0
delta = Delta.new @wave, @address
#components = @wave.playback.create_fedone_line(@address, params[:message])
total = 0
start = 0
old = nil
@wave.contents.each do |content|
if content.is_a? String
if old == :next
old = content
start = total
end
total += content.size
elsif content.is_a? Element
total += 1
if content.attributes['by'] == @address
old = :next
end
else
total += 1
end
end

components = [{:retain_item_count => start},
{:delete_chars => old},
{:characters => params[:message]},
{:retain_item_count => total - start}]

delta << MutateOp.new('main', components)
@remote.add_delta(@wave, delta)
end
render :text => 'OK'

#
#if params[:message] && params[:message].size > 0
# delta = Delta.new @wave, @address
# #components = @wave.playback.create_fedone_line(@address, params[:message])
# total = 0
# start = 0
# old = nil
# @wave.contents.each do |content|
# if content.is_a? String
# if old == :next
# old = content
# start = total
# end
# total += content.size
# elsif content.is_a? Element
# total += 1
# if content.attributes['by'] == @address
# old = :next
# end
# else
# total += 1
# end
# end
#
# components = [{:retain_item_count => start},
# {:delete_chars => old},
# {:characters => params[:message]},
# {:retain_item_count => total - start}]
#
# delta << MutateOp.new('main', components)
# @remote.add_delta(@wave, delta)
#end

version = @wave.newest_version
i = 0
#version = @wave.newest_version
#i = 0

#while @remote[params[:id]].newest_version == version
#sleep 1
Expand All @@ -82,7 +85,7 @@ def ajax

#end
# @wave = @remote[params[:id]]
render :text => @wave.to_xml.gsub(/<line by="([^"]+)">\n<\/line>/, '<br/>&lt;\1&gt; ')
#render :text => @wave.to_xml.gsub(/<line by="([^"]+)">\n<\/line>/, '<br/>&lt;\1&gt; ')
end

def update
Expand Down
37 changes: 37 additions & 0 deletions wave.danopia.net/app/views/users/show_self.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<p>
<b>Login:</b>
<%=h @user.login %>
</p>

<p>
<b>Login count:</b>
<%=h @user.login_count %>
</p>

<p>
<b>Last request at:</b>
<%=h @user.last_request_at %>
</p>

<p>
<b>Last login at:</b>
<%=h @user.last_login_at %>
</p>

<p>
<b>Current login at:</b>
<%=h @user.current_login_at %>
</p>

<p>
<b>Last login ip:</b>
<%=h @user.last_login_ip %>
</p>

<p>
<b>Current login ip:</b>
<%=h @user.current_login_ip %>
</p>


<%= link_to 'Edit', edit_account_path %>
2 changes: 1 addition & 1 deletion wave.danopia.net/app/views/waves/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ function submitted() {
}
function update() {
timer = 0;
new Ajax.Updater('contents2', '/waves/<%=h @wave.name %>/ajax', {asynchronous:true, evalScripts:true, onSuccess:queueUpdate, onFailure:function(){alert('Error!');}, parameters:Form.serialize(document.getElementById('add-form'))});
new Ajax.Updater('contents2', '<%=wave_ajax_path @wave.name %>', {asynchronous:true, evalScripts:true, onSuccess:queueUpdate, onFailure:function(){alert('Error!');}, parameters:Form.serialize(document.getElementById('add-form'))});
}
update();
</script>
2 changes: 1 addition & 1 deletion wave.danopia.net/config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
:requirements => { :who => %r([^/;,?]+) }

map.wave_update 'waves/:id/update', :controller => 'waves', :action => 'update'
map.wave_ajax 'waves/:id/ajax', :controller => 'waves', :action => 'ajax'
map.wave_ajax 'ajax/waves/:id', :controller => 'waves', :action => 'ajax'
map.domain_wave 'waves/:domain/:id', :controller => 'waves', :action => 'show',
:requirements => { :domain => %r([^/;,?]+) }

Expand Down
6 changes: 5 additions & 1 deletion wave.danopia.net/lib/sails_remote.rb
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,11 @@ def initialize(domain, subdomain='wave')
@sock = nil
@servers = ServerList.new

self.certificate = open("#{@domain}.cert").read.split("\n")[1..-2].join('')
# load_cert("#{@domain}.cert")
end

def load_cert(path)
self.certificate = open(path).read.split("\n")[1..-2].join('')
end

# Return a wave.
Expand Down
2 changes: 2 additions & 0 deletions xmpp_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ def address(address, provider)
provider << Server.new(provider, config['ping'], config['ping'])
end

provider.load_cert config['certificate-chain'].first

sock.send_raw '<stream:stream xmlns="jabber:component:accept" xmlns:stream="http://etherx.jabber.org/streams" to="' + provider.name + '">'

message = sock.recv 1024
Expand Down

0 comments on commit 09f7a95

Please sign in to comment.