diff --git a/doc/ru/scripting/builtins/libnetwork.md b/doc/ru/scripting/builtins/libnetwork.md index 31f59fb25..5bc5eaafd 100644 --- a/doc/ru/scripting/builtins/libnetwork.md +++ b/doc/ru/scripting/builtins/libnetwork.md @@ -92,6 +92,11 @@ socket:recv_async( [опционально] usetable: boolean=false ) -> nil|table|Bytearray +-- Оборачивает сокет в io_stream (см. ../io_stream.md) +socket:as_stream( + [опционально] binaryMode: boolean=true +) -> io_stream + -- Закрывает соединение socket:close() diff --git a/res/modules/internal/stream_providers/socket.lua b/res/modules/internal/stream_providers/socket.lua new file mode 100644 index 000000000..88684b0ff --- /dev/null +++ b/res/modules/internal/stream_providers/socket.lua @@ -0,0 +1,76 @@ +local io_stream = require "core:io_stream" + +local lib = { } + +local sockets = { } + +local nextDescriptor = 0 + +local function openDescriptor(socket) + nextDescriptor = nextDescriptor + 1 + + sockets[nextDescriptor] = socket + + return nextDescriptor +end + +local function requireDescriptor(descriptor) + if not sockets[descriptor] then + error("unknown descriptor") + end +end + +function lib.read(descriptor, length) + requireDescriptor(descriptor) + + return sockets[descriptor]:recv(length) +end + +function lib.write(descriptor, data) + requireDescriptor(descriptor) + + sockets[descriptor]:send(data) +end + +function lib.seek(descriptor, mode, offset) + error("cannot seek socket") +end + +function lib.tell(descriptor) + error("cannot tell socket") +end + +function lib.flush(descriptor) + requireDescriptor(descriptor) +end + +function lib.available(descriptor) + requireDescriptor(descriptor) + + return sockets[descriptor]:available() +end + +function lib.is_alive(descriptor) + local socket = sockets[descriptor] + + return socket ~= nil and socket:is_alive() +end + +function lib.close(descriptor) + requireDescriptor(descriptor) + + sockets[descriptor]:close() + sockets[descriptor] = nil +end + +return function(socket, binaryMode) + if binaryMode == nil then + binaryMode = true + end + + return io_stream.new( + openDescriptor(socket), + binaryMode, + lib + ) +end \ No newline at end of file diff --git a/res/scripts/classes.lua b/res/scripts/classes.lua index 664710a30..a057d52e6 100644 --- a/res/scripts/classes.lua +++ b/res/scripts/classes.lua @@ -49,6 +49,7 @@ local Socket = {__index={ end return self:recv(length, usetable) end, + as_stream=network.__as_stream, close=function(self) return network.__close(self.id) end, available=function(self) return network.__available(self.id) or 0 end, is_alive=function(self) return network.__is_alive(self.id) end, diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 17da8ba85..6d25ed86c 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -334,6 +334,8 @@ end require("core:io_stream").wrap_bytearray = require "core:internal/stream_providers/bytearray" +network.__as_stream = require "core:internal/stream_providers/socket" + math.randomseed(time.uptime() * 1536227939) rules = require "core:internal/rules"