mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
279 lines
6.2 KiB
Lua
279 lines
6.2 KiB
Lua
-- Prosody IM
|
|
-- Copyright (C) 2014,2016 Daurnimator
|
|
--
|
|
-- This project is MIT/X11 licensed. Please see the
|
|
-- COPYING file in the source package for more information.
|
|
|
|
--luacheck: ignore
|
|
|
|
--[[
|
|
This file is a template for writing a net.server compatible backend.
|
|
]]
|
|
|
|
--[[
|
|
Read patterns (also called modes) can be one of:
|
|
- "*a": Read as much as possible
|
|
- "*l": Read until end of line
|
|
]]
|
|
|
|
--- Handle API
|
|
local handle_mt = {};
|
|
local handle_methods = {};
|
|
handle_mt.__index = handle_methods;
|
|
|
|
function handle_methods:set_mode(new_pattern)
|
|
end
|
|
|
|
function handle_methods:setlistener(listeners)
|
|
end
|
|
|
|
function handle_methods:setoption(option, value)
|
|
end
|
|
|
|
function handle_methods:ip()
|
|
end
|
|
|
|
function handle_methods:starttls(sslctx)
|
|
end
|
|
|
|
function handle_methods:write(data)
|
|
end
|
|
|
|
function handle_methods:close()
|
|
end
|
|
|
|
function handle_methods:pause()
|
|
end
|
|
|
|
function handle_methods:resume()
|
|
end
|
|
|
|
--[[
|
|
Returns
|
|
- socket: the socket object underlying this handle
|
|
]]
|
|
function handle_methods:socket()
|
|
end
|
|
|
|
--[[
|
|
Returns
|
|
- boolean: if an ssl context has been set on this handle
|
|
]]
|
|
function handle_methods:ssl()
|
|
end
|
|
|
|
|
|
--- Listeners API
|
|
local listeners = {}
|
|
|
|
--[[ connect
|
|
Called when a client socket has established a connection with it's peer
|
|
]]
|
|
function listeners.onconnect(handle)
|
|
end
|
|
|
|
--[[ incoming
|
|
Called when data is received
|
|
If reading data failed this will be called with `nil, "error message"`
|
|
]]
|
|
function listeners.onincoming(handle, buff, err)
|
|
end
|
|
|
|
--[[ status
|
|
Known statuses:
|
|
- "ssl-handshake-complete"
|
|
]]
|
|
function listeners.onstatus(handle, status)
|
|
end
|
|
|
|
--[[ disconnect
|
|
Called when the peer has closed the connection
|
|
]]
|
|
function listeners.ondisconnect(handle)
|
|
end
|
|
|
|
--[[ drain
|
|
Called when the handle's write buffer is empty
|
|
]]
|
|
function listeners.ondrain(handle)
|
|
end
|
|
|
|
--[[ readtimeout
|
|
Called when a socket inactivity timeout occurs
|
|
]]
|
|
function listeners.onreadtimeout(handle)
|
|
end
|
|
|
|
--[[ detach: Called when other listeners are going to be removed
|
|
Allows for clean-up
|
|
]]
|
|
function listeners.ondetach(handle)
|
|
end
|
|
|
|
--- Top level functions
|
|
|
|
--[[ Returns the syscall level event mechanism in use.
|
|
|
|
Returns:
|
|
- backend: e.g. "select", "epoll"
|
|
]]
|
|
local function get_backend()
|
|
end
|
|
|
|
--[[ Starts the event loop.
|
|
|
|
Returns:
|
|
- "quitting"
|
|
]]
|
|
local function loop()
|
|
end
|
|
|
|
--[[ Stop a running loop()
|
|
]]
|
|
local function setquitting(quit)
|
|
end
|
|
|
|
|
|
--[[ Links to two handles together, so anything written to one is piped to the other
|
|
|
|
Arguments:
|
|
- sender, receiver: handles to link
|
|
- buffersize: maximum #bytes until sender will be locked
|
|
]]
|
|
local function link(sender, receiver, buffersize)
|
|
end
|
|
|
|
--[[ Binds and listens on the given address and port
|
|
If `sslctx` is given, the connecting clients will have to negotiate an SSL session
|
|
|
|
Arguments:
|
|
- address: address to bind to, may be "*" to bind all addresses. will be resolved if it is a string.
|
|
- port: port to bind (as number)
|
|
- listeners: a table of listeners
|
|
- pattern: the read pattern
|
|
- sslctx: is a valid luasec constructor
|
|
|
|
Returns:
|
|
- handle
|
|
- nil, "an error message": on failure (e.g. out of file descriptors)
|
|
]]
|
|
local function addserver(address, port, listeners, pattern, sslctx)
|
|
end
|
|
|
|
--[[ Binds and listens on the given address and port
|
|
Mostly the same as addserver but with all optional arguments in a table
|
|
|
|
Arguments:
|
|
- address: address to bind to, may be "*" to bind all addresses. will be resolved if it is a string.
|
|
- port: port to bind (as number)
|
|
- listeners: a table of listeners
|
|
- config: table of extra settings
|
|
- read_size: the amount of bytes to read or a read pattern
|
|
- tls_ctx: is a valid luasec constructor
|
|
- tls_direct: boolean true for direct TLS, false (or nil) for starttls
|
|
|
|
Returns:
|
|
- handle
|
|
- nil, "an error message": on failure (e.g. out of file descriptors)
|
|
]]
|
|
local function listen(address, port, listeners, config)
|
|
end
|
|
|
|
|
|
--[[ Wraps a lua-socket socket client socket in a handle.
|
|
The socket must be already connected to the remote end.
|
|
If `sslctx` is given, a SSL session will be negotiated before listeners are called.
|
|
|
|
Arguments:
|
|
- socket: the lua-socket object to wrap
|
|
- ip: returned by `handle:ip()`
|
|
- port:
|
|
- listeners: a table of listeners
|
|
- pattern: the read pattern
|
|
- sslctx: is a valid luasec constructor
|
|
- typ: the socket type, one of:
|
|
- "tcp"
|
|
- "tcp6"
|
|
- "udp"
|
|
|
|
Returns:
|
|
- handle, socket
|
|
- nil, "an error message": on failure (e.g. )
|
|
]]
|
|
local function wrapclient(socket, ip, serverport, listeners, pattern, sslctx)
|
|
end
|
|
|
|
--[[ Connects to the given address and port
|
|
If `sslctx` is given, a SSL session will be negotiated before listeners are called.
|
|
|
|
Arguments:
|
|
- address: address to connect to. will be resolved if it is a string.
|
|
- port: port to connect to (as number)
|
|
- listeners: a table of listeners
|
|
- pattern: the read pattern
|
|
- sslctx: is a valid luasec constructor
|
|
- typ: the socket type, one of:
|
|
- "tcp"
|
|
- "tcp6"
|
|
- "udp"
|
|
|
|
Returns:
|
|
- handle
|
|
- nil, "an error message": on failure (e.g. out of file descriptors)
|
|
]]
|
|
local function addclient(address, port, listeners, pattern, sslctx, typ)
|
|
end
|
|
|
|
--[[ Close all handles
|
|
]]
|
|
local function closeall()
|
|
end
|
|
|
|
--[[ The callback should be called after `delay` seconds.
|
|
The callback should be called with the time at the point of firing.
|
|
If the callback returns a number, it should be called again after that many seconds.
|
|
|
|
Arguments:
|
|
- delay: number of seconds to wait
|
|
- callback: function to call.
|
|
]]
|
|
local function add_task(delay, callback)
|
|
end
|
|
|
|
--[[ Adds a handler for when a signal is fired.
|
|
Optional to implement
|
|
callback does not take any arguments
|
|
|
|
Arguments:
|
|
- signal_id: the signal id (as number) to listen for
|
|
- handler: callback
|
|
]]
|
|
local function hook_signal(signal_id, handler)
|
|
end
|
|
|
|
--[[ Adds a low-level FD watcher
|
|
Arguments:
|
|
- fd_number: A non-negative integer representing a file descriptor or
|
|
object with a :getfd() method returning one
|
|
- on_readable: Optional callback for when the FD is readable
|
|
- on_writable: Optional callback for when the FD is writable
|
|
|
|
Returns:
|
|
- net.server handle
|
|
]]
|
|
local function watchfd(fd_number, on_readable, on_writable)
|
|
end
|
|
|
|
return {
|
|
get_backend = get_backend;
|
|
loop = loop;
|
|
setquitting = setquitting;
|
|
link = link;
|
|
addserver = addserver;
|
|
wrapclient = wrapclient;
|
|
addclient = addclient;
|
|
closeall = closeall;
|
|
hook_signal = hook_signal;
|
|
watchfd = watchfd;
|
|
listen = listen;
|
|
}
|