foxbat 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/em/connection.rb CHANGED
@@ -1,11 +1,13 @@
1
1
  import java.nio.ByteBuffer
2
- import javax.net.ssl.SSLEngineResult::HandshakeStatus
3
2
 
4
3
  module EventMachine
5
4
 
6
5
  class Connection
7
6
 
8
- attr_accessor :channel, :ssl_engine, :block, :executor
7
+ BUF_SIZE = 256
8
+
9
+ attr_accessor :channel, :block
10
+ attr_reader :open_time, :close_time
9
11
 
10
12
  def peername
11
13
  @channel.getRemoteAddress
@@ -16,29 +18,44 @@ module EventMachine
16
18
  buf = ByteBuffer.allocate(arr.length)
17
19
  buf.put(arr)
18
20
  buf.flip
21
+
19
22
  @channel.write(buf)
20
23
  end
21
24
 
22
25
  def post_init; end
23
26
 
27
+ def server_post_init
28
+ @open_time ||= Time.now.to_i
29
+ end
30
+
24
31
  def unbind; end
25
32
 
33
+ def start_tls(args={}); end
34
+
35
+ def receive_data(data)
36
+ p 'Incoming data...'
37
+ end
38
+
26
39
  def close_connection(after_writing=false)
27
- @channel.close
40
+ if after_writing == false
41
+ @channel.close
42
+ else
43
+ @channel.shutdownInput
44
+ @channel.shutdownOutput
45
+ end
46
+ @close_time = Time.now.to_i
28
47
  end
29
48
 
30
- def read_channel(buffer=nil)
31
-
32
- @block.call(self)
49
+ def close_connection_after_writing
50
+ close_connection(true)
51
+ end
33
52
 
34
- # @ssl_session ||= @ssl_engine.getSession
35
- # @abs ||= @ssl_session.getApplicationBufferSize
36
- # @pbs ||= @ssl_session.getPacketBufferSize
53
+ def read_channel(buffer=nil)
37
54
 
38
- @abs = 128
55
+ @block.call(self)
39
56
 
40
57
  if buffer.nil?
41
- bb = ByteBuffer.allocate(@abs)
58
+ bb = ByteBuffer.allocate(BUF_SIZE)
42
59
  bb.clear
43
60
  return read_channel(bb)
44
61
  end
@@ -0,0 +1,17 @@
1
+ module EventMachine
2
+
3
+ class PeriodicTimer
4
+
5
+ def initialize(interval, callback=nil, repeat=0, &block)
6
+ work = callback || block
7
+ t = lambda { sleep interval; work.call }
8
+ @timer = Foxbat::Barrier.new([t], repeat)
9
+ end
10
+
11
+ def cancel
12
+ @timer.cancel
13
+ end
14
+
15
+ end
16
+
17
+ end
data/lib/em/timer.rb ADDED
@@ -0,0 +1,15 @@
1
+ module EventMachine
2
+
3
+ class Timer
4
+
5
+ def initialize(interval, callback=nil, &block)
6
+ PeriodicTimer.new(interval, callback, 1, &block)
7
+ end
8
+
9
+ def cancel
10
+ @timer.cancel
11
+ end
12
+
13
+ end
14
+
15
+ end
data/lib/eventmachine.rb CHANGED
@@ -3,7 +3,7 @@ import java.util.concurrent.Executors
3
3
  module EventMachine
4
4
 
5
5
  def self.start_server host, port=nil, handler=nil, *args, &block
6
- s = Foxbat::Server.new(host, port, handler, block)
6
+ s = Foxbat::Server.new(host, port, handler, args.first, block)
7
7
 
8
8
  @@servers ||= []
9
9
  @@servers << s
@@ -13,9 +13,10 @@ module EventMachine
13
13
 
14
14
  # We're on the JVM- this does nothing!
15
15
  def self.epoll; end
16
+ def self.kqueue; end
16
17
 
17
18
  def self.run(blk=nil, tail=nil, &block)
18
- @@threadpool ||= Executors.newCachedThreadPool(Executors.defaultThreadFactory)
19
+ @@threadpool = Executors.newCachedThreadPool
19
20
 
20
21
  block.call
21
22
 
@@ -23,9 +24,13 @@ module EventMachine
23
24
  end
24
25
 
25
26
  def self.stop
26
- @@servers.each { |s| s.stop }
27
+ @@servers.each { |s| s.stop } unless @@servers.nil?
27
28
  @@threadpool.shutdownNow
28
29
  end
29
30
 
31
+ def self.executor
32
+ @@threadpool
33
+ end
34
+
30
35
  end
31
36
 
@@ -0,0 +1,68 @@
1
+ require 'timeout'
2
+
3
+ module Foxbat
4
+
5
+ class FBPhaser < java.util.concurrent.Phaser
6
+
7
+ attr_writer :limit, :callback
8
+
9
+ def onAdvance(phase, parties)
10
+ if (phase + 1) == @limit
11
+ true
12
+ else
13
+ @callback.call if @callback
14
+ false
15
+ end
16
+ end
17
+ end
18
+
19
+ class Barrier
20
+
21
+ def initialize(tasks, repeat=1, callback=nil, timeout=Long::MAX_VALUE, err=nil)
22
+ @phaser = FBPhaser.new(1)
23
+ if repeat == 0
24
+ repeat = java.lang.Integer::MAX_VALUE
25
+ end
26
+ @phaser.limit = repeat
27
+ @phaser.callback = callback
28
+
29
+ phased_tasks = tasks.map do |t|
30
+ Proc.new do
31
+ @phaser.register
32
+ while !@phaser.isTerminated
33
+ begin
34
+ Timeout::timeout(timeout) { t.call }
35
+ rescue Exception => e
36
+ err.call(e) if err
37
+ break
38
+ end
39
+ @phaser.arriveAndAwaitAdvance
40
+ end
41
+ end
42
+ end
43
+
44
+ phased_tasks.each { |t| EM.executor.execute(t) }
45
+
46
+ start = Proc.new do
47
+ parties = @phaser.getRegisteredParties
48
+ if parties > 1
49
+ @phaser.arriveAndDeregister
50
+ else
51
+ java.lang.Thread.sleep(10)
52
+ start.call
53
+ end
54
+ end
55
+
56
+ start.call
57
+ end
58
+
59
+ def iterations
60
+ @phaser.getPhase + 1
61
+ end
62
+
63
+ def cancel
64
+ @phaser.forceTermination()
65
+ end
66
+
67
+ end
68
+ end
data/lib/foxbat/server.rb CHANGED
@@ -4,43 +4,23 @@ import java.nio.channels.AsynchronousSocketChannel
4
4
  import java.nio.channels.AsynchronousChannelGroup
5
5
  import java.util.concurrent.TimeUnit
6
6
  import java.lang.Long
7
-
8
- # SSL stuff
9
- import javax.net.ssl.SSLContext
10
- import javax.net.ssl.KeyManagerFactory
11
- import javax.net.ssl.TrustManagerFactory
12
- import javax.net.ssl.SSLEngineResult
13
- import java.security.KeyStore
14
- import java.io.FileInputStream
7
+ import java.io.IOException
15
8
 
16
9
  module Foxbat
17
10
 
18
11
  class Server
19
12
 
20
- def setup_ssl
21
- @ssl_context = SSLContext.getInstance('TLSv1')
22
- @keystore = KeyStore.getInstance(KeyStore.getDefaultType)
23
- fis = FileInputStream.new('/tank/me/.keystore')
24
-
25
- password = 'marsbars'.to_java.toCharArray
26
- @keystore.load(fis, password)
27
- fis.close
28
-
29
- @kmf = KeyManagerFactory.getInstance('SunX509')
30
- @tmf = TrustManagerFactory.getInstance('SunX509')
31
-
32
- @kmf.init(@keystore, password)
33
- @tmf.init(@keystore)
34
-
35
- @ssl_context.init(@kmf.getKeyManagers, @tmf.getTrustManagers, nil)
13
+ def create_ssl_engine(connection)
14
+ engine = @ssl_context.createSSLEngine
15
+ engine.setUseClientMode(false)
16
+ engine.setNeedClientAuth(false)
17
+ connection.ssl_engine = engine
36
18
  end
37
19
 
38
- def initialize(host, port, klass, block=nil)
20
+ def initialize(host, port, klass, options, block=nil)
39
21
  @bind_address = InetSocketAddress.new(host, port)
40
22
  @klass = klass
41
23
  @block = block || Proc.new {}
42
-
43
- # setup_ssl
44
24
  end
45
25
 
46
26
  def start(threadpool)
@@ -51,16 +31,10 @@ module Foxbat
51
31
  handler = Foxbat::Handler.new(@server) do |source,socket|
52
32
  source.accept(nil,handler)
53
33
 
54
- connection = @klass.new({:debug => true})
34
+ connection = @klass.new({})
55
35
  connection.channel = socket
56
36
  connection.block = @block
57
- connection.executor = @service
58
-
59
- # engine = @ssl_context.createSSLEngine
60
- # engine.setUseClientMode(false)
61
- # engine.setNeedClientAuth(false)
62
-
63
- # connection.ssl_engine = engine
37
+ connection.server_post_init
64
38
  connection.post_init
65
39
 
66
40
  connection.read_channel
@@ -73,7 +47,7 @@ module Foxbat
73
47
 
74
48
  def stop
75
49
  @server.close
76
- @group.awaitTermination(1, TimeUnit::SECONDS)
50
+ @group.awaitTermination(0, TimeUnit::SECONDS)
77
51
  end
78
52
  end
79
53
 
@@ -1,3 +1,3 @@
1
1
  module Foxbat
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/lib/foxbat.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'java'
2
2
 
3
3
  require 'em/connection'
4
+ require 'em/periodic_timer'
5
+ require 'em/timer'
6
+ require 'foxbat/barrier'
4
7
  require 'foxbat/server'
5
8
  require 'foxbat/handler'
6
9
  require 'foxbat/version'
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: foxbat
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Chris Mowforth
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-15 00:00:00.000000000Z
12
+ date: 2012-03-18 00:00:00.000000000Z
13
13
  dependencies: []
14
14
  description: A drop-in replacement for EventMachine, designed & built from the ground-up around Java 7 A/IO.
15
15
  email:
@@ -20,9 +20,12 @@ extra_rdoc_files: []
20
20
  files:
21
21
  - lib/foxbat.rb
22
22
  - lib/eventmachine.rb
23
+ - lib/foxbat/barrier.rb
23
24
  - lib/foxbat/server.rb
24
25
  - lib/foxbat/version.rb
25
26
  - lib/foxbat/handler.rb
27
+ - lib/em/periodic_timer.rb
28
+ - lib/em/timer.rb
26
29
  - lib/em/connection.rb
27
30
  homepage: http://github.com/cmowforth/foxbat
28
31
  licenses: []