em-midori 0.0.9.5 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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