.. | ||
auth_sasl.go | ||
builder.go | ||
component_test.go | ||
component.go | ||
error_enum.go | ||
error.go | ||
iot_test.go | ||
iot.go | ||
iq_disco.go | ||
iq_test.go | ||
iq_version.go | ||
iq.go | ||
message_test.go | ||
message.go | ||
msg_chat_markers.go | ||
msg_chat_state.go | ||
msg_html_test.go | ||
msg_html.go | ||
msg_oob.go | ||
msg_receipts_test.go | ||
msg_receipts.go | ||
node.go | ||
ns.go | ||
packet_enum.go | ||
packet.go | ||
parser.go | ||
pep.go | ||
pres_muc_test.go | ||
pres_muc.go | ||
presence_enum.go | ||
presence_test.go | ||
presence.go | ||
pubsub.go | ||
README.md | ||
registry_test.go | ||
registry.go | ||
starttls.go | ||
stream.go | ||
xmpp_test.go |
XMPP Stanza
XMPP stanza
package is use to parse, marshall and and unmarshal XMPP stanzas and nonzas.
Stanza creation
When creating stanzas, you can use two approaches:
- You can create IQ, Presence or Message structs, set the fields and manually prepare extensions struct to add to the stanza.
- You can use
stanza
Builder providing
The methods are equivalent and you can use whatever suits you best. The Builder will generate the same type of struct that you can build by hand.
Composing stanzas manually with structs
Here is for example how you would generate an IQ discovery result:
iqResp := stanza.NewIQ(stanza.Attrs{Type: "result", From: iq.To, To: iq.From, Id: iq.Id, Lang: "en"})
identity := stanza.Identity{
Name: opts.Name,
Category: opts.Category,
Type: opts.Type,
}
payload := stanza.DiscoInfo{
XMLName: xml.Name{
Space: stanza.NSDiscoInfo,
Local: "query",
},
Identity: identity,
Features: []stanza.Feature{
{Var: stanza.NSDiscoInfo},
{Var: stanza.NSDiscoItems},
{Var: "jabber:iq:version"},
{Var: "urn:xmpp:delegation:1"},
},
}
iqResp.Payload = &payload
Using Builder
Here is for example how you would generate an IQ discovery result using Builder:
b := stanza.NewBuilder()
iq := b.IQ(stanza.Attrs{Type: "get", To: "service.localhost", Id: "disco-get-1"})
payload := b.DiscoInfo()
identity := b.Identity("Test Component", "gateway", "service")
payload.SetFeatures(stanza.NSDiscoInfo, stanza.NSDiscoItems, "jabber:iq:version", "urn:xmpp:delegation:1").
SetIdentities(identity)
iq.Payload = payload
Payload and extensions
Message
Presence
IQ
IQ (Information Queries) contain a payload associated with the request and possibly an error. The main difference with Message and Presence extension is that you can only have one payload per IQ. The XMPP specification does not support having multiple payloads.
Here is the list of structs implementing IQPayloads:
- BindBind
- Pubsub
Finally, when the payload of the parsed stanza is unknown, the parser will provide the unknown payload as a generic
Node
element. You can also use the Node struct to add custom information on stanza generation. However, in both cases,
you may also consider adding your own custom extensions on stanzas.
Adding your own custom extensions on stanzas
Extensions are registered on launch using the Registry
. It can be used to register you own custom payload. You may
want to do so to support extensions we did not yet implement, or to add your own custom extensions to your XMPP stanzas.