diff strophe.mam.js @ 24:6c620e9f7d2c

Add support for retrieving all MAM messages, and for downloading it in a XEP-0227-like format.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 23 Dec 2018 15:39:51 +0100
parents
children 599b324fac2b
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/strophe.mam.js
@@ -0,0 +1,82 @@
+/* XEP-0313: Message Archive Management
+ * Copyright (C) 2012 Kim Alvefur
+ * Copyright (C) 2018 Emmanuel Gil Peyrot
+ *
+ * This file is MIT/X11 licensed. Please see the
+ * LICENSE.txt file in the source package for more information.
+ *
+ * Modified by: Chris Tunbridge (github.com/Destreyf/)
+ * Updated to support v0.3 of the XMPP XEP-0313 standard
+ * http://xmpp.org/extensions/xep-0313.html
+ *
+ */
+//import { $iq, Strophe } from 'strophe.js';
+
+Strophe.addConnectionPlugin('mam', {
+    _c: null,
+    _p: [ 'with', 'start', 'end' ],
+    init: function (conn) {
+        this._c = conn;
+        Strophe.addNamespace('MAM', 'urn:xmpp:mam:2');
+        Strophe.addNamespace('Forward', 'urn:xmpp:forward:0');
+    },
+    query: function (jid, options) {
+        var _c = this._c;
+        var _p = this._p;
+        var attr = {
+            type:'set',
+            to:jid
+        };
+        options = options || {};
+        var queryid = options.queryid;
+        if (queryid) {
+            delete options.queryid;
+        } else {
+            queryid = _c.getUniqueId();
+        }
+        var iq = $iq(attr).c('query', {xmlns: Strophe.NS.MAM, queryid: queryid}).c('x',{xmlns:'jabber:x:data', type:'submit'});
+
+        iq.c('field',{var:'FORM_TYPE', type:'hidden'}).c('value').t(Strophe.NS.MAM).up().up();
+        for (var i = 0; i < _p.length; i++) {
+            var pn = _p[i];
+            var p = options[pn];
+            delete options[pn];
+            if (p) {
+                iq.c('field',{var:pn}).c('value').t(p).up().up();
+            }
+        }
+        iq.up();
+
+        var onMessage = options.onMessage;
+        delete options.onMessage;
+        var onComplete = options.onComplete;
+        delete options.onComplete;
+        iq.cnode(new Strophe.RSM(options).toXML());
+
+        var handler = _c.addHandler(function (message) {
+            // TODO: check the emitter too!
+            var result = message.firstChild;
+            if (!result || result.namespaceURI !== Strophe.NS.MAM || result.localName !== 'result' || result.getAttributeNS(null, 'queryid') !== queryid)
+                return true;
+            var id = result.getAttributeNS(null, 'id');
+            var forwarded = result.firstChild;
+            if (!forwarded || forwarded.namespaceURI !== Strophe.NS.Forward || forwarded.localName !== 'forwarded')
+                return true;
+            var delay = null;
+            var childMessage = null;
+            for (var child of forwarded.childNodes.values()) {
+                if (child.namespaceURI === 'urn:xmpp:delay' && child.localName === 'delay' && delay === null)
+                    delay = child;
+                else if (child.namespaceURI === 'jabber:client' && child.localName === 'message' && childMessage === null)
+                    childMessage = child;
+            }
+            if (childMessage !== null && delay !== null)
+                onMessage(childMessage, delay, id);
+            return true;
+        }, Strophe.NS.MAM, 'message', null);
+        return _c.sendIQ(iq, function(){
+           _c.deleteHandler(handler);
+           onComplete.apply(this, arguments);
+        });
+    }
+});