e6e457e4a7
The timer channel may already have been drained by `case <-timer.C`. In this case, we need not to drain it again or we'll block forever. To fix this, stop draining the timer channel. Since we're not going to use the timer again anyway, it should be fine. |
||
---|---|---|
cmd/koushin | ||
plugins/base | ||
themes | ||
.gitignore | ||
discover.go | ||
go.mod | ||
go.sum | ||
imap.go | ||
LICENSE | ||
plugin.go | ||
plugin_go.go | ||
plugin_lua.go | ||
README.md | ||
server.go | ||
session.go | ||
smtp.go | ||
template.go |
koushin
Usage
Assuming SRV DNS records are properly set up (see RFC 6186):
go run example.org
To manually specify upstream servers:
go run ./cmd/koushin imaps://mail.example.org:993 smtps://mail.example.org:465
See -h
for more information.
Themes
They should be put in themes/<name>/
.
Templates in themes/<name>/*.html
override default templates in plugins.
Assets in themes/<name>/assets/*
are served by the HTTP server at
/themes/<name>/assets/*
.
Plugins
Plugins can be written in Go or in Lua and live in plugins/<name>/
.
Plugins can provide their own templates in plugins/<name>/public/*.html
.
Assets in plugins/<name>/public/assets/*
are served by the HTTP server at
/plugins/<name>/assets/*
.
Go plugins
They can use the Go plugin helpers and need to be included at compile-time in
cmd/koushin/main.go
.
Lua plugins
The entry point is at plugins/<name>/main.lua
.
API:
koushin.on_render(name, f)
: prior to rendering the templatename
, callf
with the template data (the special name*
matches all templates)koushin.set_filter(name, f)
: set a template functionkoushin.set_route(method, path, f)
: register a new HTTP route,f
will be called with the HTTP context
Hot reload
Lua plugins and templates can be reloaded by sending SIGUSR1
to koushin.
killall -USR1 koushin
Contributing
Send patches on the mailing list, report bugs on the issue tracker.
License
MIT