xmpp.chapril.org-conversejs/src/headless/converse-rsm.js
2020-04-23 13:50:35 +02:00

70 lines
2.4 KiB
JavaScript

/**
* @module converse-rsm
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description XEP-0059 Result Set Management
* Some code taken from the Strophe RSM plugin, licensed under the MIT License
* Copyright 2006-2017 Strophe (https://github.com/strophe/strophejs)
*/
import { converse } from "./converse-core";
const { Strophe, $build } = converse.env;
Strophe.addNamespace('RSM', 'http://jabber.org/protocol/rsm');
converse.plugins.add('converse-rsm', {
initialize () {
const { _converse } = this;
const RSM_ATTRIBUTES = ['max', 'first', 'last', 'after', 'before', 'index', 'count'];
_converse.RSM_ATTRIBUTES = RSM_ATTRIBUTES;
class RSM {
constructor (options) {
if (typeof options.xml != 'undefined') {
this.fromXMLElement(options.xml);
} else {
for (let ii = 0; ii < RSM_ATTRIBUTES.length; ii++) {
const attrib = RSM_ATTRIBUTES[ii];
this[attrib] = options[attrib];
}
}
}
toXML () {
let xml = $build('set', {xmlns: Strophe.NS.RSM});
for (let ii = 0; ii < RSM_ATTRIBUTES.length; ii++) {
const attrib = RSM_ATTRIBUTES[ii];
if (typeof this[attrib] != 'undefined') {
xml = xml.c(attrib).t(this[attrib].toString()).up();
}
}
return xml.tree();
}
next (max, before) {
return new RSM({max: max, after: this.last, before});
}
previous (max, after) {
return new RSM({max: max, before: this.first, after});
}
fromXMLElement (xmlElement) {
for (var ii = 0; ii < RSM_ATTRIBUTES.length; ii++) {
const attrib = RSM_ATTRIBUTES[ii];
const elem = xmlElement.getElementsByTagName(attrib)[0];
if (typeof elem != 'undefined' && elem !== null) {
this[attrib] = Strophe.getText(elem);
if (attrib == 'first') {
this.index = elem.getAttribute('index');
}
}
}
}
}
_converse.RSM = RSM;
}
});