From dcf097b8f90700074d06d9f14b8adc3f7b5c8cf2 Mon Sep 17 00:00:00 2001 From: Zoviet Date: Sat, 6 Dec 2025 13:23:59 +0400 Subject: [PATCH] init --- README.md | 132 ++++++++++++++++++++++++++++++++++++++++++- nchan-1.0-2.rockspec | 31 ++++++++++ nchan-1.0-2.src.rock | Bin 0 -> 13713 bytes nchan/channel.lua | 28 +++++++++ nchan/group.lua | 29 ++++++++++ nchan/nchan.lua | 78 +++++++++++++++++++++++++ tests/test.lua | 19 +++++++ tests/tests.sh | 1 + 8 files changed, 316 insertions(+), 2 deletions(-) create mode 100644 nchan-1.0-2.rockspec create mode 100644 nchan-1.0-2.src.rock create mode 100755 nchan/channel.lua create mode 100755 nchan/group.lua create mode 100755 nchan/nchan.lua create mode 100755 tests/test.lua create mode 100644 tests/tests.sh diff --git a/README.md b/README.md index 78659dd..9fc417f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,131 @@ -# nchan +# Simple lua nchan publisher -Паблишер nchan \ No newline at end of file +## Install + +``` +luarocks install nchan +``` + +## Usage + +### Channels + +***Publish message in channel*** + +``` +local channel = require('nchan.channel') + +channel.nchan.host = 'http://localhost' +channel.nchan.endpoint = 'pub' + +result,msg = channel.publish('test') + +``` + + +***Connect with Basic auth*** + +``` + local channel = require('nchan.channel') + + channel.nchan.host = 'http://localhost' + channel.nchan.endpoint = 'pub' + + channel.nchan.login = 'test' + channel.nchan.password = 'test' + + result,msg = channel.publish('test') + +``` + +***Connect with Bearer auth*** + +``` + local channel = require('nchan.channel') + + channel.nchan.host = 'http://localhost' + channel.nchan.endpoint = 'pub' + + channel.nchan.token = 'token' + + result,msg = channel.publish('test') + +``` + +***Delete channel*** + +``` +local channel = require('nchan.channel') +channel.nchan.host = 'http://localhost' +channel.nchan.endpoint = 'pub' + +result,msg = channel.delete() + +``` + +***Get channel info*** + +``` +local channel = require('nchan.channel') +channel.nchan.host = 'http://localhost' +channel.nchan.endpoint = 'pub' + +result,msg = channel.status() + +print(result) +print(msg.messages) +print(msg.requested) +print(msg.subscribers) +print(msg.last_message_id) + +``` + +Channel info also available after publishing: + +``` +local channel = require('nchan.channel') + +channel.nchan.host = 'http://localhost' +channel.nchan.endpoint = 'pub' + +result,msg = channel.publish('test') + +print(result) +print(channel.nchan.info.messages) +print(channel.nchan.info.requested) +print(channel.nchan.info.subscribers) +print(channel.nchan.info.last_message_id) + +``` + +### Groups + +***Get group info*** + +``` +local channel = require('nchan.group') +channel.nchan.host = 'http://localhost' +channel.nchan.endpoint = 'pub' + +result,msg = group.status() + +print(result) +print(msg.messages) +print(msg.requested) +print(msg.subscribers) +print(msg.last_message_id) + +``` +***Set group limits*** + +``` +local channel = require('nchan.group') +channel.nchan.host = 'http://localhost' +channel.nchan.endpoint = 'pub' + +result,msg = group.limits({ + ['max_channels']=15, + ['max_subs']=1000 +}) + +``` diff --git a/nchan-1.0-2.rockspec b/nchan-1.0-2.rockspec new file mode 100644 index 0000000..13085c2 --- /dev/null +++ b/nchan-1.0-2.rockspec @@ -0,0 +1,31 @@ +package = "Nchan" +version = "1.0-2" +source = { + url = "git://github.com/Zoviet/nchan.git", + tag = "v1.0-1" +} +description = { + summary = "Simple Lua nchan publisher and group manager", + detailed = [[ + Message publishing, channel info, channels delete, groups info and groups limits setter. + ]], + homepage = "https://github.com/Zoviet/nchan", + license = "MIT/X11" +} +dependencies = { + "lua >= 5.1, < 5.4", + "luasocket >= 2.0", + "lua-cjson >= 2.0", + "mimetypes >= 1.0" +} +external_dependencies = { + +} +build = { + type = "builtin", + modules = { + ["nchan.nchan"] = "nchan/nchan.lua", + ["nchan.channel"] = "nchan/channel.lua", + ["nchan.group"] = "nchan/group.lua" + } +} diff --git a/nchan-1.0-2.src.rock b/nchan-1.0-2.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..6942776c194d69f56392d8984ddd7092230d6f82 GIT binary patch literal 13713 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 S005X@FS1|lQ_2i~y!$_nBxj2N literal 0 HcmV?d00001 diff --git a/nchan/channel.lua b/nchan/channel.lua new file mode 100755 index 0000000..721c101 --- /dev/null +++ b/nchan/channel.lua @@ -0,0 +1,28 @@ + +-- Simple nchan lua client + +local _M = {} + +_M.nchan = require ('nchan.nchan') + + +function _M.publish(message) + _M.nchan.method = 'POST' + return _M.nchan.request(message) +end + +function _M.status() + _M.nchan.method = 'GET' + local result, msg = _M.nchan.request() + if result then + return true, _M.nchan.info + end + return false, msg +end + +function _M.delete() + _M.nchan.method = 'DELETE' + return _M.nchan.request() +end + +return _M diff --git a/nchan/group.lua b/nchan/group.lua new file mode 100755 index 0000000..58a91e9 --- /dev/null +++ b/nchan/group.lua @@ -0,0 +1,29 @@ + +-- Simple nchan lua client + +local _M = {} + +_M.nchan = require ('nchan.nchan') + +_M.nchan.codes = { + [200] = 'SUCCESS (group existed)', + [201] = 'CREATED (limits sets)', + [202] = 'ACCEPTED' +} + + +function _M.limits(limits) + _M.nchan.method = 'POST' + return _M.nchan.request(message) +end + +function _M.status() + _M.nchan.method = 'GET' + local result, msg = _M.nchan.request() + if result then + return true, _M.nchan.info + end + return false, msg +end + +return _M diff --git a/nchan/nchan.lua b/nchan/nchan.lua new file mode 100755 index 0000000..c6df5cd --- /dev/null +++ b/nchan/nchan.lua @@ -0,0 +1,78 @@ + +-- Simple nchan lua client + +local json = require ('cjson') +local http = require('socket.http') +local mime = require('mime') +local ltn12 = require('ltn12') + +http.TIMEOUT = 15 + +local _M = {} + +_M.host = 'http://127.0.0.1' --Nchan host +_M.port = nil --Nchan port +_M.endpoint = 'pub' -- Nchan publisher endpoint +_M.token = nil +_M.login = nil +_M.password = nil +_M.info = {} + +_M.method = 'POST' + +-- http status codes with info + +_M.codes = { + [200] = 'SUCCESS (channel existed or deleted)', + [201] = 'CREATED (at least 1 subscriber presented)', + [202] = 'ACCEPTED (no subscribers are present)' +} + +function _M.request(message) + local source = ltn12.source.empty() + local endpoint = _M.host..'/'.._M.endpoint + local respbody = {} + local headers = { + ['Content-type'] = 'application/x-www-form-urlencoded', + ['Accept'] = 'text/json' + } + if message then + headers['content-length'] = tostring(#message) + if (type(message) == 'table') then + source = ltn12.source.cat(message) + else + source = ltn12.source.string(message) + end + end + if _M.token then + headers["Authorization"] = 'Bearer '.._M.token + end + if _M.login and _M.password then + headers["Authorization"] = 'Basic '..(mime.b64(_M.login..":".. _M.password)) + end + if _M.port then + endpoint = _M.host..':'.._M.port..'/'.._M.endpoint + end + + local result, respcode, respheaders, respstatus = http.request { + method = _M.method, + headers = headers, + url = endpoint, + source = source, + sink = ltn12.sink.table(respbody) + } + if not _M.codes[respcode] then + return false, 'Request error. Code: '..respcode + end + if respbody then + respbody = table.concat(respbody) + ok,err = pcall(json.decode,respbody) + if not ok then + return false, 'Invalid nchan response' + end + _M.info = json.decode(respbody) + end + return true, _M.codes[respcode] +end + +return _M diff --git a/tests/test.lua b/tests/test.lua new file mode 100755 index 0000000..c521b61 --- /dev/null +++ b/tests/test.lua @@ -0,0 +1,19 @@ +local channel = require('nchan.channel') + +channel.nchan.host = 'http://localhost' +channel.nchan.endpoint = 'pub' + +result,msg = channel.status() +print(result) +print(msg.messages) +print(msg.requested) +print(msg.subscribers) +print(msg.last_message_id) + +result,msg = channel.publish('test') +print(result) +print(channel.nchan.info.messages) +print(channel.nchan.info.requested) +print(channel.nchan.info.subscribers) +print(channel.nchan.info.last_message_id) + diff --git a/tests/tests.sh b/tests/tests.sh new file mode 100644 index 0000000..3e83521 --- /dev/null +++ b/tests/tests.sh @@ -0,0 +1 @@ +curl --request POST --data "test message" -H "Accept: text/json" http://localhost/pub