You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bodqhrohro 5f99e1cd06 Support partial JIDs in Bare/Full methods 3 years ago
..
README.md Remove Bind in the payload list, as it is intended to be used by XMPP client and not by users of the library. 3 years ago
commands.go Various fixes 3 years ago
commands_test.go - Changed IQ stanzas to pointer semantics 3 years ago
component.go - Changed IQ stanzas to pointer semantics 3 years ago
component_test.go - Changed IQ stanzas to pointer semantics 3 years ago
datetime_profiles.go Support for XEP-0082. 3 years ago
datetime_profiles_test.go Support for XEP-0082. 3 years ago
doc.go Spelling consistency 3 years ago
error.go PubSub protocol support (#142) 3 years ago
error_enum.go Refactor and move parsing and stanza to a separate package 3 years ago
error_test.go We do not need the Content to be innerxml. cdata is enough. 3 years ago
fifo_queue.go Added missing tests 3 years ago
form.go - Changed IQ stanzas to pointer semantics 3 years ago
form_test.go - Changed IQ stanzas to pointer semantics 3 years ago
iot.go - Changed IQ stanzas to pointer semantics 3 years ago
iot_test.go We do not need the Content to be innerxml. cdata is enough. 3 years ago
iq.go - Changed IQ stanzas to pointer semantics 3 years ago
iq_disco.go - Changed IQ stanzas to pointer semantics 3 years ago
iq_disco_test.go - Changed IQ stanzas to pointer semantics 3 years ago
iq_roster.go - Changed IQ stanzas to pointer semantics 3 years ago
iq_roster_test.go - Changed IQ stanzas to pointer semantics 3 years ago
iq_test.go - Changed IQ stanzas to pointer semantics 3 years ago
iq_version.go - Changed IQ stanzas to pointer semantics 3 years ago
iq_version_test.go - Changed IQ stanzas to pointer semantics 3 years ago
jid.go Support partial JIDs in Bare/Full methods 12 months ago
jid_test.go Support partial JIDs in Bare/Full methods 12 months ago
message.go Refactor and move parsing and stanza to a separate package 3 years ago
message_test.go Fix tests after refactor 3 years ago
msg_chat_markers.go - Changed IQ stanzas to pointer semantics 3 years ago
msg_chat_state.go - Changed IQ stanzas to pointer semantics 3 years ago
msg_hint.go Support for XEP-0334 3 years ago
msg_hint_test.go Support for XEP-0334 3 years ago
msg_html.go - Changed IQ stanzas to pointer semantics 3 years ago
msg_html_test.go Fix tests after refactor 3 years ago
msg_oob.go - Changed IQ stanzas to pointer semantics 3 years ago
msg_pubsub_event.go - Changed IQ stanzas to pointer semantics 3 years ago
msg_pubsub_event_test.go PubSub protocol support (#142) 3 years ago
msg_receipts.go - Changed IQ stanzas to pointer semantics 3 years ago
msg_receipts_test.go Fix tests after refactor 3 years ago
node.go Tests for Component and code style fixes (#129) 3 years ago
node_test.go - Changed IQ stanzas to pointer semantics 3 years ago
ns.go Correctly open new streams after StartTLS and auth 3 years ago
open.go Transports need to handle open/close stanzas 3 years ago
packet.go Refactor and move parsing and stanza to a separate package 3 years ago
packet_enum.go Tests for Component and code style fixes (#129) 3 years ago
parser.go Changed "Disconnect" to wait for the closing stream tag. (#141) 3 years ago
pep.go PubSub protocol support (#142) 3 years ago
pres_muc.go - Changed IQ stanzas to pointer semantics 3 years ago
pres_muc_test.go Resync with Master 3 years ago
presence.go Refactor and move parsing and stanza to a separate package 3 years ago
presence_enum.go Refactor and move parsing and stanza to a separate package 3 years ago
presence_test.go Fix tests after refactor 3 years ago
pubsub.go - Changed IQ stanzas to pointer semantics 3 years ago
pubsub_owner.go Various fixes 3 years ago
pubsub_owner_test.go Various fixes 3 years ago
pubsub_test.go Various fixes 3 years ago
registry.go Refactor and move parsing and stanza to a separate package 3 years ago
registry_test.go Refactor and move parsing and stanza to a separate package 3 years ago
results_sets.go - Changed IQ stanzas to pointer semantics 3 years ago
results_sets_test.go Reset Tests 3 years ago
sasl_auth.go Refactor tests 3 years ago
sasl_auth_test.go Refactor tests 3 years ago
stanza_errors.go Refactor tests 3 years ago
starttls.go Add support for self-signed certificates 3 years ago
stream.go Added Roster IQs 3 years ago
stream_features.go Refactor tests 3 years ago
stream_features_test.go Transports need to handle open/close stanzas 3 years ago
stream_management.go Added missing tests 3 years ago
stream_management_test.go Added missing tests 3 years ago
xmpp_test.go - Changed IQ stanzas to pointer semantics 3 years ago

README.md

XMPP Stanza

XMPP stanza package is used to parse, marshal and unmarshal XMPP stanzas and nonzas.

Stanza creation

When creating stanzas, you can use two approaches:

  1. You can create IQ, Presence or Message structs, set the fields and manually prepare extensions struct to add to the stanza.
  2. You can use stanza build helper to be guided when creating the stanza, and have more controls performed on the final stanza.

The methods are equivalent and you can use whatever suits you best. The helpers will finally 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})
identity := stanza.Identity{
    Name:     opts.Name,
    Category: opts.Category,
    Type:     opts.Type,
}
payload := stanza.DiscoInfo{
    XMLName: xml.Name{
        Space: stanza.NSDiscoInfo,
        Local: "query",
    },
    Identity: []stanza.Identity{identity},
    Features: []stanza.Feature{
        {Var: stanza.NSDiscoInfo},
        {Var: stanza.NSDiscoItems},
        {Var: "jabber:iq:version"},
        {Var: "urn:xmpp:delegation:1"},
    },
}
iqResp.Payload = &payload

Using helpers

Here is for example how you would generate an IQ discovery result using Builder:

iq := stanza.NewIQ(stanza.Attrs{Type: "get", To: "service.localhost", Id: "disco-get-1"})
disco := iq.DiscoInfo()
disco.AddIdentity("Test Component", "gateway", "service")
disco.AddFeatures(stanza.NSDiscoInfo, stanza.NSDiscoItems, "jabber:iq:version", "urn:xmpp:delegation:1")

Payload and extensions

Message

Here is the list of implemented message extensions:

  • Delegation

  • Markable

  • MarkAcknowledged

  • MarkDisplayed

  • MarkReceived

  • StateActive

  • StateComposing

  • StateGone

  • StateInactive

  • StatePaused

  • HTML

  • OOB

  • ReceiptReceived

  • ReceiptRequest

  • Mood

Presence

Here is the list of implemented presence extensions:

  • MucPresence

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:

  • ControlSet
  • ControlSetResponse
  • Delegation
  • DiscoInfo
  • DiscoItems
  • Pubsub
  • Version
  • Node

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.

To create an extension you need:

  1. to create a struct for that extension. It need to have XMLName for consistency and to tagged at the struct level with xml info.
  2. It need to implement one or several extensions interface: stanza.IQPayload, stanza.MsgExtension and / or stanza.PresExtension
  3. Add that custom extension to the stanza.TypeRegistry during the file init.

Here an example code showing how to create a custom IQPayload.

package myclient

import (
	"encoding/xml"

	"gosrc.io/xmpp/stanza"
)

type CustomPayload struct {
	XMLName xml.Name `xml:"my:custom:payload query"`
	Node    string   `xml:"node,attr,omitempty"`
}

func (c CustomPayload) Namespace() string {
	return c.XMLName.Space
}

func init() {
	stanza.TypeRegistry.MapExtension(stanza.PKTIQ, xml.Name{"my:custom:payload", "query"}, CustomPayload{})
}