em-midori 0.0.9.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35b1ccfd36d54df0a60d8680cff40a36510d2544
4
- data.tar.gz: c0d7993d03f0579d8b6e8c00624dddb00d086a11
3
+ metadata.gz: b6d10050423b7536832c5ef0b7d94ead6bb713a8
4
+ data.tar.gz: 949d87027c3feaece3ce05637b91569f37056978
5
5
  SHA512:
6
- metadata.gz: 2bef5ca38679e84ae35ce3aa26ee9dea13776ef02de2b4f2219db0ab6da2b313b5c3b75df2a66ef1eb5ad66cd2e0a04a2dac03a815974b898ad7ab1d1a5fc622
7
- data.tar.gz: 237bdbc93a65c78d3892c9eb5132ba43784d4116fec751c650a262e98c9ff15c94a26635269bede2d664b6fb24cb412e7d704fe979e02df40c951dbb0ec4ab81
6
+ metadata.gz: 69ee80d129f50421830b10c57dc3712211892d9cb5e047422e7b90e7b8bf2eb2bb01fb44b03c0d1d7b6424e1843a8861be7fa040d383b73dffa9cb22ca7bce5d
7
+ data.tar.gz: 1b97321457676354063864beb257e0b8ce43e5e873beb34b1dd9a08e6db0e00471ae3b99dc440071f3c561e984a608b215b0ad41f02fae2d6b4ea0d0c8dfeffb
data/lib/em-midori.rb CHANGED
@@ -4,15 +4,16 @@ require 'eventmachine'
4
4
  require 'fiber'
5
5
  require 'logger'
6
6
  require 'http/parser'
7
+ require 'socket'
7
8
 
8
9
  require_relative 'em-midori/version'
10
+ require_relative 'em-midori/core_ext/configurable'
9
11
  require_relative 'em-midori/string'
10
12
  require_relative 'em-midori/promise'
11
13
  require_relative 'em-midori/const'
12
14
  require_relative 'em-midori/define_class'
13
15
  require_relative 'em-midori/error'
14
16
  require_relative 'em-midori/clean_room'
15
- require_relative 'em-midori/em_midori'
16
17
  require_relative 'em-midori/request'
17
18
  require_relative 'em-midori/response'
18
19
  require_relative 'em-midori/api'
@@ -21,3 +22,5 @@ require_relative 'em-midori/server'
21
22
  require_relative 'em-midori/websocket'
22
23
  require_relative 'em-midori/eventsource'
23
24
  require_relative 'em-midori/middleware'
25
+ require_relative 'em-midori/configure'
26
+ require_relative 'em-midori/runner'
data/lib/em-midori/api.rb CHANGED
@@ -235,11 +235,9 @@ class Midori::API
235
235
  # @param [String] key 'Sec-WebSocket-Key' in request header
236
236
  # @return [Hash] header
237
237
  def websocket_header(key)
238
- {
239
- 'Upgrade' => 'websocket',
240
- 'Connection' => 'Upgrade',
241
- 'Sec-WebSocket-Accept' => Digest::SHA1.base64digest(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
242
- }
238
+ header = Midori::Const::WEBSOCKET_HEADER.clone
239
+ header['Sec-WebSocket-Accept'] = Digest::SHA1.base64digest(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
240
+ header
243
241
  end
244
242
 
245
243
  # Helper block for defining methods in APIs
@@ -0,0 +1,9 @@
1
+ ##
2
+ # Default configuration of Midori, extends +Midori::Configurable+
3
+ class Midori::Configure
4
+ extend Midori::Configurable
5
+
6
+ set :logger, ::Logger.new(STDOUT)
7
+ set :bind, '127.0.0.1'
8
+ set :port, 8080
9
+ end
@@ -57,4 +57,10 @@ module Midori::Const
57
57
  'Cache-Control' => 'no-cache',
58
58
  'Connection' => 'keep-alive'
59
59
  }
60
+
61
+ # Default header for Websocket response
62
+ WEBSOCKET_HEADER = {
63
+ 'Upgrade' => 'websocket',
64
+ 'Connection' => 'Upgrade'
65
+ }
60
66
  end
@@ -0,0 +1,32 @@
1
+ module Midori
2
+ # Provide flexible configuration for Midori Server
3
+ module Configurable
4
+ # Modified from Sinatra
5
+ # Sets an option to the given value.
6
+ # @param [Symbol] option the name of config
7
+ # @param [Object] value value to the name
8
+ # @param [Boolean] read_only Generate option= method or not
9
+ def set(option, value = (not_set = true), read_only = false)
10
+ raise ArgumentError if not_set
11
+
12
+ setter = proc { |val| set option, val }
13
+ getter = proc { value }
14
+
15
+ define_singleton("#{option}=", setter) unless read_only
16
+ define_singleton(option, getter)
17
+ define_singleton("#{option}?", "!!#{option}") unless method_defined? "#{option}?"
18
+
19
+ self
20
+ end
21
+
22
+ private
23
+
24
+ # Dynamically defines a method on settings.
25
+ def define_singleton(name, content = Proc.new)
26
+ singleton_class.class_eval do
27
+ undef_method(name) if method_defined? name
28
+ String === content ? class_eval("def #{name}() #{content}; end") : define_method(name, &content)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,51 @@
1
+ ##
2
+ # Abstract runner class to control instance of Midori Server
3
+ class Midori::Runner
4
+ attr_reader :bind, :port
5
+
6
+ def initialize(api, configure = Midori::Configure)
7
+ @logger = configure.logger
8
+ @bind = configure.bind
9
+ @port = configure.port
10
+
11
+ @api = api
12
+ end
13
+
14
+ # Get Midori server whether running
15
+ # @return [Boolean] [true] running
16
+ # @return [Boolean] [false] not running
17
+ def running?
18
+ !!@server_signature
19
+ end
20
+
21
+ # Start the Midori server
22
+ # @note This is an async method, but no callback
23
+ def start
24
+ return if running?
25
+
26
+ EventMachine.set_simultaneous_accept_count(40) unless RUBY_PLATFORM == 'java'
27
+ EventMachine.run do
28
+ @logger.info "Midori #{Midori::VERSION} is now running on #{bind}:#{port}".blue
29
+ @server_signature = EventMachine.start_server bind, port, Midori::Server, @api, @logger
30
+ end
31
+
32
+ nil
33
+ end
34
+
35
+ # Stop the Midori server
36
+ # @note This is an async method, but no callback
37
+ # @return [Boolean] [true] stop successfully
38
+ # @return [Boolean] [false] nothing to stop
39
+ def stop
40
+ if running?
41
+ @logger.info 'Goodbye Midori'.blue
42
+ EventMachine.stop_server(@server_signature)
43
+ @server_signature = nil
44
+ EM.stop
45
+ true
46
+ else
47
+ @logger.error 'Midori Server has NOT been started'.red
48
+ false
49
+ end
50
+ end
51
+ end
@@ -32,7 +32,7 @@ module Midori::Server
32
32
  receive_new_request(data)
33
33
  end
34
34
  now_time = Time.now
35
- @logger.info "#{@request.ip} - - \"#{@request.method} #{@request.path}\" #{@response.status} #{(now_time.to_f - start_time.to_f).round(6)}".green
35
+ @logger.info "#{@request.ip} - - \"#{@request.method} #{@request.path} HTTP/#{@request.protocol.join('.')}\" #{@response.status} #{(now_time.to_f - start_time.to_f).round(6)}".green
36
36
  end)
37
37
  end.call
38
38
  end
@@ -1,4 +1,5 @@
1
+ # Midori Module
1
2
  module Midori
2
3
  # Current Version Code
3
- VERSION = '0.0.9.5'.freeze
4
+ VERSION = '0.1.0'.freeze
4
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-midori
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - HeckPsi Lab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-25 00:00:00.000000000 Z
11
+ date: 2016-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -55,9 +55,10 @@ files:
55
55
  - lib/em-midori.rb
56
56
  - lib/em-midori/api.rb
57
57
  - lib/em-midori/clean_room.rb
58
+ - lib/em-midori/configure.rb
58
59
  - lib/em-midori/const.rb
60
+ - lib/em-midori/core_ext/configurable.rb
59
61
  - lib/em-midori/define_class.rb
60
- - lib/em-midori/em_midori.rb
61
62
  - lib/em-midori/error.rb
62
63
  - lib/em-midori/eventsource.rb
63
64
  - lib/em-midori/middleware.rb
@@ -65,6 +66,7 @@ files:
65
66
  - lib/em-midori/request.rb
66
67
  - lib/em-midori/response.rb
67
68
  - lib/em-midori/route.rb
69
+ - lib/em-midori/runner.rb
68
70
  - lib/em-midori/server.rb
69
71
  - lib/em-midori/string.rb
70
72
  - lib/em-midori/version.rb
@@ -1,37 +0,0 @@
1
- ##
2
- # The main module of Midori
3
- module Midori
4
- @logger = ::Logger.new(STDOUT)
5
- # Start Midori Server instance
6
- # @note This is an async method, but no callback
7
- # @param [Class] api Inherit from +Midori::API+
8
- # @param [String] ip The ip address to bind
9
- # @param [Fixnum] port Port number
10
- # @param [Logger] logger Ruby logger
11
- # @return [nil] nil
12
- def self.run(api = Midori::API, ip = '127.0.0.1', port = 8081, logger = ::Logger.new(STDOUT))
13
- @logger = logger
14
- EventMachine.set_simultaneous_accept_count(40) unless RUBY_PLATFORM == "java"
15
- EventMachine.run do
16
- @logger.info "Midori #{Midori::VERSION} is now running on #{ip}:#{port}".blue
17
- @midori_server = EventMachine.start_server ip, port, Midori::Server, api, logger
18
- end
19
- nil
20
- end
21
-
22
- # Stop Midori Server instance
23
- # @note This is an async method, but no callback
24
- # @return [Boolean] [true] stop successfully
25
- # @return [Boolean] [false] nothing to stop
26
- def self.stop
27
- if @midori_server.nil?
28
- @logger.error 'Midori Server has NOT been started'.red
29
- return false
30
- else
31
- EventMachine.stop_server(@midori_server)
32
- @midori_server = nil
33
- @logger.info 'Goodbye Midori'.blue
34
- return true
35
- end
36
- end
37
- end