2019-06-08 10:16:20 -07:00
# Fluux XMPP
2015-12-29 02:49:43 -08:00
2019-05-31 10:10:42 -07:00
[![Codeship Status for FluuxIO/xmpp ](https://app.codeship.com/projects/dba7f300-d145-0135-6c51-26e28af241d2/status?branch=master )](https://app.codeship.com/projects/262399) [![GoDoc ](https://godoc.org/gosrc.io/xmpp?status.svg )](https://godoc.org/gosrc.io/xmpp) [![GoReportCard ](https://goreportcard.com/badge/gosrc.io/xmpp )](https://goreportcard.com/report/fluux.io/xmpp) [![codecov ](https://codecov.io/gh/FluuxIO/go-xmpp/branch/master/graph/badge.svg )](https://codecov.io/gh/FluuxIO/go-xmpp)
2016-02-15 09:39:12 -08:00
2018-01-01 09:12:33 -08:00
Fluux XMPP is a Go XMPP library, focusing on simplicity, simple automation, and IoT.
2015-12-29 02:49:43 -08:00
2019-06-18 00:01:07 -07:00
The goal is to make simple to write simple XMPP clients and components:
2015-12-29 02:49:43 -08:00
- For automation (like for example monitoring of an XMPP service),
2015-12-29 02:52:02 -08:00
- For building connected "things" by plugging them on an XMPP server,
- For writing simple chatbot to control a service or a thing.
2019-06-29 06:15:09 -07:00
- For writing XMPP servers components.
The library is designed to have minimal dependencies. For now, the library does not depend on any other library.
## Supported specifications
### Clients
- [RFC 6120: XMPP Core ](https://xmpp.org/rfcs/rfc6120.html )
- [RFC 6121: XMPP Instant Messaging and Presence ](https://xmpp.org/rfcs/rfc6121.html )
### Components
2019-06-18 06:16:19 -07:00
- [XEP-0114: Jabber Component Protocol ](https://xmpp.org/extensions/xep-0114.html )
- [XEP-0355: Namespace Delegation ](https://xmpp.org/extensions/xep-0355.html )
- [XEP-0356: Privileged Entity ](https://xmpp.org/extensions/xep-0356.html )
2015-12-29 02:52:02 -08:00
2019-06-29 05:53:14 -07:00
## Stanza subpackage
2019-06-29 06:09:05 -07:00
XMPP stanzas are basic and extensible XML elements. Stanzas (or sometimes special stanzas called 'nonzas') are used to
leverage the XMPP protocol features. During a session, a client (or a component) and a server will be exchanging stanzas
back and forth.
2019-06-29 05:53:14 -07:00
2019-06-29 06:09:05 -07:00
At a low-level, stanzas are XML fragments. However, Fluux XMPP library provides the building blocks to interact with
stanzas at a high-level, providing a Go-friendly API.
2019-06-29 05:53:14 -07:00
2019-06-29 06:09:05 -07:00
The `stanza` subpackage provides support for XMPP stream parsing, marshalling and unmarshalling of XMPP stanza. It is a
bridge between high-level Go structure and low-level XMPP protocol.
2019-06-29 05:53:14 -07:00
2019-06-29 06:09:05 -07:00
Parsing, marshalling and unmarshalling is automatically handled by Fluux XMPP client library. As a developer, you will
generally manipulates only the high-level structs provided by the stanza package.
2019-06-29 05:53:14 -07:00
2019-06-29 06:09:05 -07:00
The XMPP protocol, as the name implies is extensible. If your application is using custom stanza extensions, you can
implement your own extensions directly in your own application.
2019-06-29 05:53:14 -07:00
2019-06-29 06:09:05 -07:00
To learn more about the stanza package, you can read more in the
[stanza package documentation ](https://github.com/FluuxIO/go-xmpp/blob/master/stanza/README.md ).
2019-06-29 05:53:14 -07:00
2019-06-18 06:01:21 -07:00
## Examples
2019-06-07 07:33:10 -07:00
2019-06-18 06:01:21 -07:00
We have several [examples ](https://github.com/FluuxIO/go-xmpp/tree/master/_examples ) to help you get started using
Fluux XMPP library.
Here is the demo "echo" client:
2019-06-07 07:33:10 -07:00
```go
package main
import (
"fmt"
"log"
"os"
"gosrc.io/xmpp"
2019-06-26 08:14:52 -07:00
"gosrc.io/xmpp/stanza"
2019-06-07 07:33:10 -07:00
)
func main() {
config := xmpp.Config{
Address: "localhost:5222",
Jid: "test@localhost",
Password: "test",
2019-06-29 05:58:59 -07:00
StreamLogger: os.Stdout,
2019-06-07 07:33:10 -07:00
Insecure: true,
}
2019-06-18 03:37:16 -07:00
router := xmpp.NewRouter()
2019-06-22 02:29:47 -07:00
router.HandleFunc("message", handleMessage)
2019-06-18 03:37:16 -07:00
client, err := xmpp.NewClient(config, router)
2019-06-07 07:33:10 -07:00
if err != nil {
log.Fatalf("%+v", err)
}
// If you pass the client to a connection manager, it will handle the reconnect policy
// for you automatically.
2019-06-18 03:37:16 -07:00
cm := xmpp.NewStreamManager(client, nil)
log.Fatal(cm.Run())
}
2019-06-07 07:33:10 -07:00
2019-06-26 08:14:52 -07:00
func handleMessage(s xmpp.Sender, p stanza.Packet) {
msg, ok := p.(stanza.Message)
2019-06-18 03:37:16 -07:00
if !ok {
_, _ = fmt.Fprintf(os.Stdout, "Ignoring packet: %T\n", p)
return
2019-06-07 07:33:10 -07:00
}
2019-06-18 03:37:16 -07:00
_, _ = fmt.Fprintf(os.Stdout, "Body = %s - from = %s\n", msg.Body, msg.From)
2019-06-26 08:14:52 -07:00
reply := stanza.Message{Attrs: stanza.Attrs{To: msg.From}, Body: msg.Body}
2019-06-18 03:37:16 -07:00
_ = s.Send(reply)
2019-06-07 07:33:10 -07:00
}
```
2019-06-27 00:47:08 -07:00
## Reference documentation
2018-12-26 09:59:40 -08:00
2019-06-27 00:47:08 -07:00
The code documentation is available on GoDoc: [gosrc.io/xmpp ](https://godoc.org/gosrc.io/xmpp )