11local socket = require " bee.socket"
22local select = require " bee.select"
3+ local fs = require " bee.filesystem"
4+
35local selector = select .create ()
46local SELECT_READ <const> = select .SELECT_READ
57local SELECT_WRITE <const> = select .SELECT_WRITE
3941local function on_event (self , name , ...)
4042 local f = self ._event [name ]
4143 if f then
42- f (self , ... )
44+ return f (self , ... )
4345 end
4446end
4547
@@ -90,69 +92,31 @@ local function close_write(self)
9092 close (self )
9193 end
9294end
93- function stream :select_r ()
94- local data = self ._fd :recv ()
95- if data == nil then
96- self :close ()
97- elseif data == false then
98- else
99- on_event (self , " data" , data )
100- end
101- end
102- function stream :select_w ()
103- local n = self ._fd :send (self ._writebuf )
104- if n == nil then
105- self .shutdown_w = true
106- close_write (self )
107- elseif n == false then
108- else
109- self ._writebuf = self ._writebuf :sub (n + 1 )
110- if self ._writebuf == " " then
111- close_write (self )
112- end
113- end
114- end
11595local function update_stream (s , event )
11696 if event & SELECT_READ ~= 0 then
117- s :select_r ()
97+ local data = s ._fd :recv ()
98+ if data == nil then
99+ s :close ()
100+ elseif data == false then
101+ else
102+ on_event (s , " data" , data )
103+ end
118104 end
119105 if event & SELECT_WRITE ~= 0 then
120- s :select_w ()
121- end
122- end
123-
124- local function accept_stream (fd )
125- local s = setmetatable ({
126- _fd = fd ,
127- _flags = SELECT_READ ,
128- _event = {},
129- _writebuf = " " ,
130- shutdown_r = false ,
131- shutdown_w = false ,
132- }, stream_mt )
133- selector :event_add (fd , SELECT_READ , function (event )
134- update_stream (s , event )
135- end )
136- return s
137- end
138- local function connect_stream (s )
139- setmetatable (s , stream_mt )
140- selector :event_del (s ._fd )
141- if s ._writebuf ~= " " then
142- s ._flags = SELECT_READ | SELECT_WRITE
143- selector :event_add (s ._fd , SELECT_READ | SELECT_WRITE , function (event )
144- update_stream (s , event )
145- end )
146- s :select_w ()
147- else
148- s ._flags = SELECT_READ
149- selector :event_add (s ._fd , SELECT_READ , function (event )
150- update_stream (s , event )
151- end )
106+ local n = s ._fd :send (s ._writebuf )
107+ if n == nil then
108+ s .shutdown_w = true
109+ close_write (s )
110+ elseif n == false then
111+ else
112+ s ._writebuf = s ._writebuf :sub (n + 1 )
113+ if s ._writebuf == " " then
114+ close_write (s )
115+ end
116+ end
152117 end
153118end
154119
155-
156120local listen_mt = {}
157121local listen = {}
158122listen_mt .__index = listen
@@ -168,32 +132,6 @@ function listen:close()
168132 self .shutdown_r = true
169133 close (self )
170134end
171- local function new_listen (fd )
172- local s = {
173- _fd = fd ,
174- _flags = SELECT_READ ,
175- _event = {},
176- shutdown_r = false ,
177- shutdown_w = true ,
178- }
179- selector :event_add (fd , SELECT_READ , function ()
180- local newfd , err = fd :accept ()
181- if not newfd then
182- on_event (s , " error" , err )
183- return
184- end
185- local ok , err = newfd :status ()
186- if not ok then
187- on_event (s , " error" , err )
188- return
189- end
190- if newfd :status () then
191- local news = accept_stream (newfd )
192- on_event (s , " accept" , news )
193- end
194- end )
195- return setmetatable (s , listen_mt )
196- end
197135
198136local connect_mt = {}
199137local connect = {}
@@ -216,7 +154,84 @@ function connect:close()
216154 self .shutdown_w = true
217155 close (self )
218156end
219- local function new_connect (fd )
157+
158+ local m = {}
159+
160+ function m .listen (protocol , address , port )
161+ local fd ; do
162+ local err
163+ fd , err = socket .create (protocol )
164+ if not fd then
165+ return nil , err
166+ end
167+ if protocol == " unix" then
168+ fs .remove (address )
169+ end
170+ end
171+ do
172+ local ok , err = fd :bind (address , port )
173+ if not ok then
174+ fd :close ()
175+ return nil , err
176+ end
177+ end
178+ do
179+ local ok , err = fd :listen ()
180+ if not ok then
181+ fd :close ()
182+ return nil , err
183+ end
184+ end
185+ local s = {
186+ _fd = fd ,
187+ _flags = SELECT_READ ,
188+ _event = {},
189+ shutdown_r = false ,
190+ shutdown_w = true ,
191+ }
192+ selector :event_add (fd , SELECT_READ , function ()
193+ local new_fd , err = fd :accept ()
194+ if new_fd == nil then
195+ fd :close ()
196+ on_event (s , " error" , err )
197+ return
198+ elseif new_fd == false then
199+ else
200+ local new_s = setmetatable ({
201+ _fd = new_fd ,
202+ _flags = SELECT_READ ,
203+ _event = {},
204+ _writebuf = " " ,
205+ shutdown_r = false ,
206+ shutdown_w = false ,
207+ }, stream_mt )
208+ if on_event (s , " accepted" , new_s ) then
209+ selector :event_add (new_fd , new_s ._flags , function (event )
210+ update_stream (new_s , event )
211+ end )
212+ else
213+ new_fd :close ()
214+ end
215+ end
216+ end )
217+ return setmetatable (s , listen_mt )
218+ end
219+
220+ function m .connect (protocol , address , port )
221+ local fd ; do
222+ local err
223+ fd , err = socket .create (protocol )
224+ if not fd then
225+ return nil , err
226+ end
227+ end
228+ do
229+ local ok , err = fd :connect (address , port )
230+ if ok == nil then
231+ fd :close ()
232+ return nil , err
233+ end
234+ end
220235 local s = {
221236 _fd = fd ,
222237 _flags = SELECT_WRITE ,
@@ -228,51 +243,29 @@ local function new_connect(fd)
228243 selector :event_add (fd , SELECT_WRITE , function ()
229244 local ok , err = fd :status ()
230245 if ok then
231- connect_stream (s )
232- on_event (s , " connect" )
246+ on_event (s , " connected" )
247+ setmetatable (s , stream_mt )
248+ if s ._writebuf ~= " " then
249+ update_stream (s , SELECT_WRITE )
250+ if s ._writebuf ~= " " then
251+ s ._flags = SELECT_READ | SELECT_WRITE
252+ else
253+ s ._flags = SELECT_READ
254+ end
255+ else
256+ s ._flags = SELECT_READ
257+ end
258+ selector :event_add (s ._fd , s ._flags , function (event )
259+ update_stream (s , event )
260+ end )
233261 else
234- on_event (s , " error" , err )
235262 s :close ()
263+ on_event (s , " error" , err )
236264 end
237265 end )
238266 return setmetatable (s , connect_mt )
239267end
240268
241- local m = {}
242-
243- function m .listen (protocol , ...)
244- local fd , err = socket (protocol )
245- if not fd then
246- return nil , err
247- end
248- local ok
249- ok , err = fd :bind (... )
250- if not ok then
251- fd :close ()
252- return nil , err
253- end
254- ok , err = fd :listen ()
255- if not ok then
256- fd :close ()
257- return nil , err
258- end
259- return new_listen (fd )
260- end
261-
262- function m .connect (protocol , ...)
263- local fd , err = socket (protocol )
264- if not fd then
265- return nil , err
266- end
267- local ok
268- ok , err = fd :connect (... )
269- if ok == nil then
270- fd :close ()
271- return nil , err
272- end
273- return new_connect (fd )
274- end
275-
276269function m .update (timeout )
277270 for func , event in selector :wait (timeout or 0 ) do
278271 func (event )
0 commit comments