UNPKG

jingle-stanza

Version:

A jingle.js utility for creating xml stanzas from objects

115 lines (106 loc) 3.02 kB
'use strict'; var NS = 'urn:xmpp:jingle:1'; var ERRNS = 'urn:xmpp:jingle:errors:1'; var CONDITIONS = ['out-of-order', 'tie-break', 'unknown-session', 'unsupported-info']; var REASONS = [ 'alternative-session', 'busy', 'cancel', 'connectivity-error', 'decline', 'expired', 'failed-application', 'failed-transport', 'general-error', 'gone', 'incompatible-parameters', 'media-error', 'security-error', 'success', 'timeout', 'unsupported-applications', 'unsupported-transports' ]; module.exports = function (stanza) { var types = stanza.utils; var Jingle = stanza.define({ name: 'jingle', namespace: NS, element: 'jingle', fields: { action: types.attribute('action'), initiator: types.attribute('initiator'), responder: types.attribute('responder'), sid: types.attribute('sid') } }); var Content = stanza.define({ name: '_jingleContent', namespace: NS, element: 'content', fields: { creator: types.attribute('creator'), disposition: types.attribute('disposition', 'session'), name: types.attribute('name'), senders: types.attribute('senders', 'both'), application: { get: function () { var opts = stanza.tagged('jingle-application').map(function (Description) { return Description.prototype._name; }); for (var i = 0, len = opts.length; i < len; i++) { if (this._extensions[opts[i]]) { return this._extensions[opts[i]]; } } }, set: function (value) { var ext = '_' + value.applicationType; this[ext] = value; } }, transport: { get: function () { var opts = stanza.tagged('jingle-transport').map(function (Transport) { return Transport.prototype._name; }); for (var i = 0, len = opts.length; i < len; i++) { if (this._extensions[opts[i]]) { return this._extensions[opts[i]]; } } }, set: function (value) { var ext = '_' + value.transportType; this[ext] = value; } } } }); var Reason = stanza.define({ name: 'reason', namespace: NS, element: 'reason', fields: { condition: types.enumSub(NS, REASONS), alternativeSession: { get: function () { return types.getSubText(this.xml, NS, 'alternative-session'); }, set: function (value) { this.condition = 'alternative-session'; types.setSubText(this.xml, NS, 'alternative-session', value); } }, text: types.textSub(NS, 'text') } }); stanza.extend(Jingle, Content, 'contents'); stanza.extend(Jingle, Reason); stanza.withStanzaError(function (ErrorStanza) { stanza.add(ErrorStanza, 'jingleCondition', types.enumSub(ERRNS, CONDITIONS)); }); stanza.withIq(function (Iq) { stanza.extend(Iq, Jingle); }); };