lightio 0.2.0 → 0.2.1

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: 743e461666313c581ce9bea53674e037a237d3a9
4
- data.tar.gz: 381120d60e506278cb77c80ad8d2384fed8f51a0
3
+ metadata.gz: 9cba17ec9773ba60846027a6cff7134fe1d39c61
4
+ data.tar.gz: 5d0f6c807416b005ae82720145b226201035f1b4
5
5
  SHA512:
6
- metadata.gz: 68d02d089da02ecf3a7aaeb2562c48a6e8c64d14b7c56ec88859fb7d0c8e926054bdc92af26057ffdad0da3fedf6697b26d6c8da59931b05c532cd2aa8aa1864
7
- data.tar.gz: 230877f84e6c54a89f7afbeaa47cc8328e52b6b8d51936bd91c11f86954c061ee8772f5d65cae014bc2c82fcae5c8f826fbbf089e31f4688697efb6300bab4aa
6
+ metadata.gz: fe88bd0666ea6e80af7730ed55050b797209d71e36779cd188305ab0782ee39a54853b40c34f36b9c10a159d78b0553504d54236b4a212e320d6568af9209569
7
+ data.tar.gz: 63874db77eef6d3b89a96ef1bce0ce2ff2304bad349b21338e57910aead782521a48d14af2db8bd2c134d089291b9e68985a0d7b695593076db4d2f7cd053217
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lightio (0.2.0)
4
+ lightio (0.2.1)
5
5
  nio4r (~> 2.1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -43,7 +43,7 @@ The following documentations is also usable:
43
43
 
44
44
  ## Discussion
45
45
 
46
- [Discussion on Gitter](https://gitter.im/lightio-dev/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link)
46
+ https://groups.google.com/group/lightio
47
47
 
48
48
  ## Development
49
49
 
@@ -1,7 +1,7 @@
1
1
  require 'forwardable'
2
2
  module LightIO::Library
3
3
  class IO
4
- include LightIO::Wrap::Wrapper
4
+ include LightIO::Wrap::IOWrapper
5
5
  wrap ::IO
6
6
 
7
7
  extend Forwardable
@@ -33,6 +33,16 @@ module LightIO::Library
33
33
  outbuf
34
34
  end
35
35
 
36
+ def close(*args)
37
+ # close watcher before io closed
38
+ @io_watcher&.close
39
+ @io.close(*args)
40
+ end
41
+
42
+ def to_io
43
+ self
44
+ end
45
+
36
46
  class << self
37
47
  def open(*args)
38
48
  io = self.new(*args)
@@ -1,22 +1,89 @@
1
1
  require 'socket'
2
+
2
3
  module LightIO::Library
3
4
 
4
- class BasicSocket < IO
5
+ class Addrinfo
5
6
  include LightIO::Wrap::Wrapper
7
+ wrap ::Addrinfo
8
+
9
+ module WrapperHelper
10
+ protected
11
+ def wrap_socket_method(method)
12
+ define_method method do |*args|
13
+ socket = Socket._wrap(@io.send(method, *args))
14
+ if block_given?
15
+ begin
16
+ yield socket
17
+ ensure
18
+ socket.close
19
+ end
20
+ else
21
+ socket
22
+ end
23
+ end
24
+ end
25
+
26
+ def wrap_socket_methods(*methods)
27
+ methods.each {|m| wrap_socket_method(m)}
28
+ end
29
+
30
+ def wrap_addrinfo_return_method(method)
31
+ define_method method do |*args|
32
+ result = (@io || raw_class).send(method, *args)
33
+ if result.is_a?(raw_class)
34
+ _wrap(result)
35
+ elsif result.respond_to?(:map)
36
+ result.map {|r| _wrap(r)}
37
+ else
38
+ result
39
+ end
40
+ end
41
+ end
42
+
43
+ def wrap_addrinfo_return_methods(*methods)
44
+ methods.each {|m| wrap_addrinfo_return_method(m)}
45
+ end
46
+ end
47
+
48
+ extend WrapperHelper
49
+
50
+ wrap_socket_methods :bind, :connect, :connect_from, :connect_to, :listen
51
+
52
+ wrap_addrinfo_return_methods :family_addrinfo, :ipv6_to_ipv4
53
+
54
+ class << self
55
+ extend WrapperHelper
56
+
57
+ def foreach(*args, &block)
58
+ Addrinfo.getaddrinfo(*args).each(&block)
59
+ end
60
+
61
+ wrap_addrinfo_return_methods :getaddrinfo, :ip, :udp, :tcp, :unix
62
+ end
63
+ end
64
+
65
+ class BasicSocket < IO
66
+ include LightIO::Wrap::IOWrapper
6
67
  wrap ::BasicSocket
7
68
 
8
69
  wrap_blocking_methods :recv, :recvmsg, :sendmsg
9
70
 
71
+ def shutdown(*args)
72
+ # close watcher before io shutdown
73
+ @io_watcher.close
74
+ @io.shutdown(*args)
75
+ end
76
+
10
77
  class << self
11
78
  def for_fd(fd)
12
- Socket._wrap(raw_class.for_fd(fd))
79
+ self._wrap(raw_class.for_fd(fd))
13
80
  end
14
81
  end
15
82
  end
16
83
 
17
84
  class Socket < BasicSocket
18
85
  include ::Socket::Constants
19
- include LightIO::Wrap::Wrapper
86
+ include LightIO::Wrap::IOWrapper
20
87
  wrap ::Socket
21
88
 
22
89
  wrap_blocking_methods :connect, :recvfrom
@@ -24,7 +91,7 @@ module LightIO::Library
24
91
  ## implement ::Socket instance methods
25
92
  def accept
26
93
  socket, addrinfo = wait_nonblock(:accept_nonblock)
27
- [Socket._wrap(socket), LightIO::Library::Addrinfo._wrap(addrinfo)]
94
+ [self.class._wrap(socket), Addrinfo._wrap(addrinfo)]
28
95
  end
29
96
 
30
97
  def sys_accept
@@ -61,7 +128,7 @@ module LightIO::Library
61
128
 
62
129
 
63
130
  class IPSocket < BasicSocket
64
- include LightIO::Wrap::Wrapper
131
+ include LightIO::Wrap::IOWrapper
65
132
  wrap ::IPSocket
66
133
 
67
134
  class << self
@@ -70,19 +137,19 @@ module LightIO::Library
70
137
  end
71
138
 
72
139
  class TCPSocket < IPSocket
73
- include LightIO::Wrap::Wrapper
140
+ include LightIO::Wrap::IOWrapper
74
141
  wrap ::TCPSocket
75
142
  wrap_methods_run_in_threads_pool :gethostbyname
76
143
  end
77
144
 
78
145
  class TCPServer < TCPSocket
79
- include LightIO::Wrap::Wrapper
146
+ include LightIO::Wrap::IOWrapper
80
147
  wrap ::TCPServer
81
148
 
82
149
  ## implement ::Socket instance methods
83
150
  def accept
84
151
  socket = wait_nonblock(:accept_nonblock)
85
- Socket._wrap(socket)
152
+ TCPSocket._wrap(socket)
86
153
  end
87
154
 
88
155
  def sys_accept
@@ -1,3 +1,3 @@
1
1
  module LightIO
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -1,36 +1,86 @@
1
1
  module LightIO::Wrap
2
2
  WRAPPERS = {}
3
+ RAW_IO = ::IO
4
+
5
+ # wrapper for normal ruby objects
3
6
  module Wrapper
4
- # wrap raw ruby io objects
7
+ # wrap raw ruby objects
5
8
  #
6
- # @param [IO, Socket] io raw ruby io object
9
+ # @param [Object] io raw ruby object, param name is 'io' just for consistent
7
10
  def initialize(io=nil)
8
11
  @io ||= io
9
- @io_watcher ||= LightIO::Watchers::IO.new(@io)
10
12
  end
11
13
 
12
14
  def method_missing(method, *args)
13
15
  @io.public_send(method, *args)
14
16
  end
15
17
 
16
- def close(*args)
17
- # close watcher before io closed
18
- @io_watcher.close
19
- @io.close(*args)
18
+ # both works in class scope and singleton class scope
19
+ module SingletonClassCommonMethods
20
+ protected
21
+ # run method in thread pool for performance
22
+ def wrap_methods_run_in_threads_pool(*args)
23
+ #TODO
24
+ end
20
25
  end
21
26
 
22
- def shutdown(*args)
23
- # close watcher before io shutdown
24
- @io_watcher.close
25
- @io.shutdown(*args)
27
+ module ClassMethods
28
+ # Wrap raw io objects
29
+ def _wrap(io)
30
+ # In case ruby stdlib return already patched Sockets, just do nothing
31
+ if io.is_a? self
32
+ io
33
+ else
34
+ # old new
35
+ obj = allocate
36
+ obj.send(:initialize, io)
37
+ obj
38
+ end
39
+ end
40
+
41
+ # override new method, return wrapped class
42
+ def new(*args)
43
+ io = raw_class.new(*args)
44
+ _wrap(io)
45
+ end
46
+
47
+ include SingletonClassCommonMethods
48
+
49
+ protected
50
+
51
+ attr_reader :raw_class
52
+
53
+ # Set wrapped class
54
+ def wrap(raw_class)
55
+ @raw_class=raw_class
56
+ WRAPPERS[raw_class] = self
57
+ end
58
+
59
+ def method_missing(method, *args)
60
+ raw_class.public_send(method, *args)
61
+ end
26
62
  end
27
63
 
28
- protected
29
- def _wrap(io=nil)
30
- @io ||= io
64
+ class << self
65
+ def included(base)
66
+ base.send :extend, ClassMethods
67
+ base.singleton_class.send :extend, SingletonClassCommonMethods
68
+ end
69
+ end
70
+ end
71
+
72
+ # wrapper for ruby io objects
73
+ module IOWrapper
74
+ include Wrapper
75
+ # wrap raw ruby io objects
76
+ #
77
+ # @param [IO, Socket] io raw ruby io object
78
+ def initialize(io=nil)
79
+ super
31
80
  @io_watcher ||= LightIO::Watchers::IO.new(@io)
32
81
  end
33
82
 
83
+ protected
34
84
  # wait io nonblock method
35
85
  #
36
86
  # @param [Symbol] method method name, example: wait_nonblock
@@ -51,45 +101,16 @@ module LightIO::Wrap
51
101
  else
52
102
  return result
53
103
  end
54
- rescue IO::WaitReadable
104
+ rescue RAW_IO::WaitReadable
55
105
  @io_watcher.wait_readable
56
- rescue IO::WaitWritable
106
+ rescue RAW_IO::WaitWritable
57
107
  @io_watcher.wait_writable
58
108
  end
59
109
  end
60
110
  end
61
111
 
62
- # both works in class scope and singleton class scope
63
- module SingletonClassCommonMethods
64
- protected
65
- # run method in thread pool for performance
66
- def wrap_methods_run_in_threads_pool(*args)
67
- #TODO
68
- end
69
- end
70
-
71
112
  module ClassMethods
72
- # Wrap raw io objects
73
- def _wrap(io)
74
- # In case ruby stdlib return already patched Sockets, just do nothing
75
- if io.is_a? self
76
- io
77
- else
78
- # old new
79
- obj = allocate
80
- obj.send(:initialize, io)
81
- obj
82
- end
83
- end
84
-
85
- # override new method, return wrapped class
86
- def new(*args)
87
- io = raw_class.new(*args)
88
- _wrap(io)
89
- end
90
-
91
- include SingletonClassCommonMethods
92
-
113
+ include Wrapper::ClassMethods
93
114
  protected
94
115
  # wrap blocking method with "#{method}_nonblock"
95
116
  #
@@ -103,29 +124,12 @@ module LightIO::Wrap
103
124
  def wrap_blocking_methods(*methods, exception_symbol: true)
104
125
  methods.each {|m| wrap_blocking_method(m, exception_symbol: exception_symbol)}
105
126
  end
106
-
107
- attr_reader :raw_class
108
-
109
- # Set wrapped class
110
- def wrap(raw_class)
111
- @raw_class=raw_class
112
- WRAPPERS[raw_class] = self
113
- end
114
-
115
- def method_missing(method, *args)
116
- raw_class.public_send(method, *args)
117
- end
118
127
  end
119
128
 
120
129
  class << self
121
- def new_and_wrap(*args)
122
- io = raw_class.new(*args)
123
- _wrap(io)
124
- end
125
-
126
130
  def included(base)
131
+ Wrapper.included(base)
127
132
  base.send :extend, ClassMethods
128
- base.singleton_class.send :extend, SingletonClassCommonMethods
129
133
  end
130
134
  end
131
135
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lightio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jiang Jinyang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-21 00:00:00.000000000 Z
11
+ date: 2017-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nio4r