@xmpp/client
Version:
1,459 lines (1,357 loc) • 148 kB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.XMPP = f()}})(function(){var define,module,exports;
var createModuleFactory = function createModuleFactory(t){var e;return function(r){return e||t(e={exports:{},parent:r},e.exports),e.exports}};
var _$mechanism_21 = createModuleFactory(function (module, exports) {
"use strict";
(function (root, factory) {
if (typeof exports === 'object') {
// CommonJS
factory(exports, module);
} else if (typeof define === 'function' && define.amd) {
// AMD
define(['exports', 'module'], factory);
}
})(void 0, function (exports, module) {
/**
* PLAIN `Mechanism` constructor.
*
* This class implements the PLAIN SASL mechanism.
*
* The PLAIN SASL mechanism provides support for exchanging a clear-text
* username and password. This mechanism should not be used without adequate
* security provided by an underlying transport layer.
*
* References:
* - [RFC 4616](http://tools.ietf.org/html/rfc4616)
*
* @api public
*/
function Mechanism() {}
Mechanism.prototype.name = 'PLAIN';
Mechanism.prototype.clientFirst = true;
/**
* Encode a response using given credential.
*
* Options:
* - `username`
* - `password`
* - `authzid` authorization identity (optional)
*
* @param {Object} cred
* @api public
*/
Mechanism.prototype.response = function (cred) {
var str = '';
str += cred.authzid || '';
str += '\0';
str += cred.username;
str += '\0';
str += cred.password;
return str;
};
/**
* Decode a challenge issued by the server.
*
* @param {String} chal
* @return {Mechanism} for chaining
* @api public
*/
Mechanism.prototype.challenge = function (chal) {
return this;
};
exports = module.exports = Mechanism;
});
});
var _$mechanism_19 = createModuleFactory(function (module, exports) {
"use strict";
(function (root, factory) {
if (typeof exports === 'object') {
// CommonJS
factory(exports, module);
} else if (typeof define === 'function' && define.amd) {
// AMD
define(['exports', 'module'], factory);
}
})(void 0, function (exports, module) {
/**
* ANONYMOUS `Mechanism` constructor.
*
* This class implements the ANONYMOUS SASL mechanism.
*
* The ANONYMOUS SASL mechanism provides support for permitting anonymous
* access to various services
*
* References:
* - [RFC 4505](http://tools.ietf.org/html/rfc4505)
*
* @api public
*/
function Mechanism() {}
Mechanism.prototype.name = 'ANONYMOUS';
Mechanism.prototype.clientFirst = true;
/**
* Encode a response using optional trace information.
*
* Options:
* - `trace` trace information (optional)
*
* @param {Object} cred
* @api public
*/
Mechanism.prototype.response = function (cred) {
return cred.trace || '';
};
/**
* Decode a challenge issued by the server.
*
* @param {String} chal
* @api public
*/
Mechanism.prototype.challenge = function (chal) {};
exports = module.exports = Mechanism;
});
});
var _$factory_23 = createModuleFactory(function (module, exports) {
"use strict";
(function (root, factory) {
if (typeof exports === 'object') {
// CommonJS
factory(exports, module);
} else if (typeof define === 'function' && define.amd) {
// AMD
define(['exports', 'module'], factory);
}
})(void 0, function (exports, module) {
/**
* `Factory` constructor.
*
* @api public
*/
function Factory() {
this._mechs = [];
}
/**
* Utilize the given `mech` with optional `name`, overridding the mechanism's
* default name.
*
* Examples:
*
* factory.use(FooMechanism);
*
* factory.use('XFOO', FooMechanism);
*
* @param {String|Mechanism} name
* @param {Mechanism} mech
* @return {Factory} for chaining
* @api public
*/
Factory.prototype.use = function (name, mech) {
if (!mech) {
mech = name;
name = mech.prototype.name;
}
this._mechs.push({
name: name,
mech: mech
});
return this;
};
/**
* Create a new mechanism from supported list of `mechs`.
*
* If no mechanisms are supported, returns `null`.
*
* Examples:
*
* var mech = factory.create(['FOO', 'BAR']);
*
* @param {Array} mechs
* @return {Mechanism}
* @api public
*/
Factory.prototype.create = function (mechs) {
for (var i = 0, len = this._mechs.length; i < len; i++) {
for (var j = 0, jlen = mechs.length; j < jlen; j++) {
var entry = this._mechs[i];
if (entry.name == mechs[j]) {
return new entry.mech();
}
}
}
return null;
};
exports = module.exports = Factory;
});
});
var _$interopRequireDefault_5 = {};
"use strict";
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
"default": e
};
}
_$interopRequireDefault_5 = _interopRequireDefault, _$interopRequireDefault_5.__esModule = true, _$interopRequireDefault_5["default"] = _$interopRequireDefault_5;
var _$objectWithoutPropertiesLoose_8 = {};
"use strict";
function _objectWithoutPropertiesLoose(r, e) {
if (null == r) return {};
var t = {};
for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
if (e.includes(n)) continue;
t[n] = r[n];
}
return t;
}
_$objectWithoutPropertiesLoose_8 = _objectWithoutPropertiesLoose, _$objectWithoutPropertiesLoose_8.__esModule = true, _$objectWithoutPropertiesLoose_8["default"] = _$objectWithoutPropertiesLoose_8;
var _$setPrototypeOf_10 = {};
"use strict";
function _setPrototypeOf(t, e) {
return _$setPrototypeOf_10 = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
return t.__proto__ = e, t;
}, _$setPrototypeOf_10.__esModule = true, _$setPrototypeOf_10["default"] = _$setPrototypeOf_10, _setPrototypeOf(t, e);
}
_$setPrototypeOf_10 = _setPrototypeOf, _$setPrototypeOf_10.__esModule = true, _$setPrototypeOf_10["default"] = _$setPrototypeOf_10;
var _$inheritsLoose_4 = {};
"use strict";
/* removed: var _$setPrototypeOf_10 = require("./setPrototypeOf.js"); */;
function _inheritsLoose(t, o) {
t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _$setPrototypeOf_10(t, o);
}
_$inheritsLoose_4 = _inheritsLoose, _$inheritsLoose_4.__esModule = true, _$inheritsLoose_4["default"] = _$inheritsLoose_4;
var _$getPrototypeOf_3 = {};
"use strict";
function _getPrototypeOf(t) {
return _$getPrototypeOf_3 = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
return t.__proto__ || Object.getPrototypeOf(t);
}, _$getPrototypeOf_3.__esModule = true, _$getPrototypeOf_3["default"] = _$getPrototypeOf_3, _getPrototypeOf(t);
}
_$getPrototypeOf_3 = _getPrototypeOf, _$getPrototypeOf_3.__esModule = true, _$getPrototypeOf_3["default"] = _$getPrototypeOf_3;
var _$isNativeFunction_6 = {};
"use strict";
function _isNativeFunction(t) {
try {
return -1 !== Function.toString.call(t).indexOf("[native code]");
} catch (n) {
return "function" == typeof t;
}
}
_$isNativeFunction_6 = _isNativeFunction, _$isNativeFunction_6.__esModule = true, _$isNativeFunction_6["default"] = _$isNativeFunction_6;
var _$isNativeReflectConstruct_7 = {};
"use strict";
function _isNativeReflectConstruct() {
try {
var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
} catch (t) {}
return (_$isNativeReflectConstruct_7 = _isNativeReflectConstruct = function _isNativeReflectConstruct() {
return !!t;
}, _$isNativeReflectConstruct_7.__esModule = true, _$isNativeReflectConstruct_7["default"] = _$isNativeReflectConstruct_7)();
}
_$isNativeReflectConstruct_7 = _isNativeReflectConstruct, _$isNativeReflectConstruct_7.__esModule = true, _$isNativeReflectConstruct_7["default"] = _$isNativeReflectConstruct_7;
var _$construct_1 = {};
"use strict";
/* removed: var _$isNativeReflectConstruct_7 = require("./isNativeReflectConstruct.js"); */;
/* removed: var _$setPrototypeOf_10 = require("./setPrototypeOf.js"); */;
function _construct(t, e, r) {
if (_$isNativeReflectConstruct_7()) return Reflect.construct.apply(null, arguments);
var o = [null];
o.push.apply(o, e);
var p = new (t.bind.apply(t, o))();
return r && _$setPrototypeOf_10(p, r.prototype), p;
}
_$construct_1 = _construct, _$construct_1.__esModule = true, _$construct_1["default"] = _$construct_1;
var _$wrapNativeSuper_15 = {};
"use strict";
/* removed: var _$getPrototypeOf_3 = require("./getPrototypeOf.js"); */;
/* removed: var _$setPrototypeOf_10 = require("./setPrototypeOf.js"); */;
/* removed: var _$isNativeFunction_6 = require("./isNativeFunction.js"); */;
/* removed: var _$construct_1 = require("./construct.js"); */;
function _wrapNativeSuper(t) {
var r = "function" == typeof Map ? new Map() : void 0;
return _$wrapNativeSuper_15 = _wrapNativeSuper = function _wrapNativeSuper(t) {
if (null === t || !_$isNativeFunction_6(t)) return t;
if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function");
if (void 0 !== r) {
if (r.has(t)) return r.get(t);
r.set(t, Wrapper);
}
function Wrapper() {
return _$construct_1(t, arguments, _$getPrototypeOf_3(this).constructor);
}
return Wrapper.prototype = Object.create(t.prototype, {
constructor: {
value: Wrapper,
enumerable: !1,
writable: !0,
configurable: !0
}
}), _$setPrototypeOf_10(Wrapper, t);
}, _$wrapNativeSuper_15.__esModule = true, _$wrapNativeSuper_15["default"] = _$wrapNativeSuper_15, _wrapNativeSuper(t);
}
_$wrapNativeSuper_15 = _wrapNativeSuper, _$wrapNativeSuper_15.__esModule = true, _$wrapNativeSuper_15["default"] = _$wrapNativeSuper_15;
"use strict";
/* removed: var _$interopRequireDefault_5 = require("@babel/runtime/helpers/interopRequireDefault"); */;
var _inheritsLoose2 = _$interopRequireDefault_5(_$inheritsLoose_4);
var _wrapNativeSuper2 = _$interopRequireDefault_5(_$wrapNativeSuper_15);
var _$TimeoutError_36 = /*#__PURE__*/function (_Error) {
function TimeoutError(message) {
var _this;
_this = _Error.call(this, message) || this;
_this.name = "TimeoutError";
return _this;
}
(0, _inheritsLoose2.default)(TimeoutError, _Error);
return TimeoutError;
}(/*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
"use strict";
var _$delay_37 = function delay(ms) {
var timeout;
var promise = new Promise(function (resolve) {
timeout = setTimeout(resolve, ms);
});
promise.timeout = timeout;
return promise;
};
"use strict";
/* removed: var _$TimeoutError_36 = require("./TimeoutError"); */;
/* removed: var _$delay_37 = require("./delay"); */;
var _$timeout_39 = function timeout(promise, ms) {
var promiseDelay = _$delay_37(ms);
function cancelDelay() {
clearTimeout(promiseDelay.timeout);
}
return Promise.race([promise.finally(cancelDelay), promiseDelay.then(function () {
throw new _$TimeoutError_36();
})]);
};
"use strict";
/* removed: var _$TimeoutError_36 = require("./TimeoutError"); */;
var _$promise_38 = function promise(EE, event, rejectEvent, timeout) {
if (rejectEvent === void 0) {
rejectEvent = "error";
}
return new Promise(function (resolve, reject) {
var timeoutId;
var cleanup = function cleanup() {
clearTimeout(timeoutId);
EE.removeListener(event, onEvent);
EE.removeListener(rejectEvent, onError);
};
function onError(reason) {
reject(reason);
cleanup();
}
function onEvent(value) {
resolve(value);
cleanup();
}
EE.once(event, onEvent);
if (rejectEvent) {
EE.once(rejectEvent, onError);
}
if (timeout) {
timeoutId = setTimeout(function () {
cleanup();
reject(new _$TimeoutError_36());
}, timeout);
}
});
};
var _$events_17 = {};
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';
var R = typeof Reflect === 'object' ? Reflect : null;
var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) {
return Function.prototype.apply.call(target, receiver, args);
};
var ReflectOwnKeys;
if (R && typeof R.ownKeys === 'function') {
ReflectOwnKeys = R.ownKeys;
} else if (Object.getOwnPropertySymbols) {
ReflectOwnKeys = function ReflectOwnKeys(target) {
return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
};
} else {
ReflectOwnKeys = function ReflectOwnKeys(target) {
return Object.getOwnPropertyNames(target);
};
}
function ProcessEmitWarning(warning) {
if (console && console.warn) console.warn(warning);
}
var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
return value !== value;
};
function EventEmitter() {
EventEmitter.init.call(this);
}
_$events_17 = EventEmitter;
_$events_17.once = once;
// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.prototype._events = undefined;
EventEmitter.prototype._eventsCount = 0;
EventEmitter.prototype._maxListeners = undefined;
// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
var defaultMaxListeners = 10;
function checkListener(listener) {
if (typeof listener !== 'function') {
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
}
}
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
enumerable: true,
get: function get() {
return defaultMaxListeners;
},
set: function set(arg) {
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
}
defaultMaxListeners = arg;
}
});
EventEmitter.init = function () {
if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) {
this._events = Object.create(null);
this._eventsCount = 0;
}
this._maxListeners = this._maxListeners || undefined;
};
// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
}
this._maxListeners = n;
return this;
};
function _getMaxListeners(that) {
if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners;
return that._maxListeners;
}
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
return _getMaxListeners(this);
};
EventEmitter.prototype.emit = function emit(type) {
var args = [];
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
var doError = type === 'error';
var events = this._events;
if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false;
// If there is no 'error' event listener then throw.
if (doError) {
var er;
if (args.length > 0) er = args[0];
if (er instanceof Error) {
// Note: The comments on the `throw` lines are intentional, they show
// up in Node's output if this results in an unhandled exception.
throw er; // Unhandled 'error' event
}
// At least give some kind of context to the user
var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
err.context = er;
throw err; // Unhandled 'error' event
}
var handler = events[type];
if (handler === undefined) return false;
if (typeof handler === 'function') {
ReflectApply(handler, this, args);
} else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);
}
return true;
};
function _addListener(target, type, listener, prepend) {
var m;
var events;
var existing;
checkListener(listener);
events = target._events;
if (events === undefined) {
events = target._events = Object.create(null);
target._eventsCount = 0;
} else {
// To avoid recursion in the case that type === "newListener"! Before
// adding it to the listeners, first emit "newListener".
if (events.newListener !== undefined) {
target.emit('newListener', type, listener.listener ? listener.listener : listener);
// Re-assign `events` because a newListener handler could have caused the
// this._events to be assigned to a new object
events = target._events;
}
existing = events[type];
}
if (existing === undefined) {
// Optimize the case of one listener. Don't need the extra array object.
existing = events[type] = listener;
++target._eventsCount;
} else {
if (typeof existing === 'function') {
// Adding the second element, need to change to array.
existing = events[type] = prepend ? [listener, existing] : [existing, listener];
// If we've already got an array, just append.
} else if (prepend) {
existing.unshift(listener);
} else {
existing.push(listener);
}
// Check for listener leak
m = _getMaxListeners(target);
if (m > 0 && existing.length > m && !existing.warned) {
existing.warned = true;
// No error code for this since it is a Warning
// eslint-disable-next-line no-restricted-syntax
var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + String(type) + ' listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit');
w.name = 'MaxListenersExceededWarning';
w.emitter = target;
w.type = type;
w.count = existing.length;
ProcessEmitWarning(w);
}
}
return target;
}
EventEmitter.prototype.addListener = function addListener(type, listener) {
return _addListener(this, type, listener, false);
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.prependListener = function prependListener(type, listener) {
return _addListener(this, type, listener, true);
};
function onceWrapper() {
if (!this.fired) {
this.target.removeListener(this.type, this.wrapFn);
this.fired = true;
if (arguments.length === 0) return this.listener.call(this.target);
return this.listener.apply(this.target, arguments);
}
}
function _onceWrap(target, type, listener) {
var state = {
fired: false,
wrapFn: undefined,
target: target,
type: type,
listener: listener
};
var wrapped = onceWrapper.bind(state);
wrapped.listener = listener;
state.wrapFn = wrapped;
return wrapped;
}
EventEmitter.prototype.once = function once(type, listener) {
checkListener(listener);
this.on(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {
checkListener(listener);
this.prependListener(type, _onceWrap(this, type, listener));
return this;
};
// Emits a 'removeListener' event if and only if the listener was removed.
EventEmitter.prototype.removeListener = function removeListener(type, listener) {
var list, events, position, i, originalListener;
checkListener(listener);
events = this._events;
if (events === undefined) return this;
list = events[type];
if (list === undefined) return this;
if (list === listener || list.listener === listener) {
if (--this._eventsCount === 0) this._events = Object.create(null);else {
delete events[type];
if (events.removeListener) this.emit('removeListener', type, list.listener || listener);
}
} else if (typeof list !== 'function') {
position = -1;
for (i = list.length - 1; i >= 0; i--) {
if (list[i] === listener || list[i].listener === listener) {
originalListener = list[i].listener;
position = i;
break;
}
}
if (position < 0) return this;
if (position === 0) list.shift();else {
spliceOne(list, position);
}
if (list.length === 1) events[type] = list[0];
if (events.removeListener !== undefined) this.emit('removeListener', type, originalListener || listener);
}
return this;
};
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
var listeners, events, i;
events = this._events;
if (events === undefined) return this;
// not listening for removeListener, no need to emit
if (events.removeListener === undefined) {
if (arguments.length === 0) {
this._events = Object.create(null);
this._eventsCount = 0;
} else if (events[type] !== undefined) {
if (--this._eventsCount === 0) this._events = Object.create(null);else delete events[type];
}
return this;
}
// emit removeListener for all listeners on all events
if (arguments.length === 0) {
var keys = Object.keys(events);
var key;
for (i = 0; i < keys.length; ++i) {
key = keys[i];
if (key === 'removeListener') continue;
this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events = Object.create(null);
this._eventsCount = 0;
return this;
}
listeners = events[type];
if (typeof listeners === 'function') {
this.removeListener(type, listeners);
} else if (listeners !== undefined) {
// LIFO order
for (i = listeners.length - 1; i >= 0; i--) {
this.removeListener(type, listeners[i]);
}
}
return this;
};
function _listeners(target, type, unwrap) {
var events = target._events;
if (events === undefined) return [];
var evlistener = events[type];
if (evlistener === undefined) return [];
if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener];
return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}
EventEmitter.prototype.listeners = function listeners(type) {
return _listeners(this, type, true);
};
EventEmitter.prototype.rawListeners = function rawListeners(type) {
return _listeners(this, type, false);
};
EventEmitter.listenerCount = function (emitter, type) {
if (typeof emitter.listenerCount === 'function') {
return emitter.listenerCount(type);
} else {
return listenerCount.call(emitter, type);
}
};
EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
var events = this._events;
if (events !== undefined) {
var evlistener = events[type];
if (typeof evlistener === 'function') {
return 1;
} else if (evlistener !== undefined) {
return evlistener.length;
}
}
return 0;
}
EventEmitter.prototype.eventNames = function eventNames() {
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
};
function arrayClone(arr, n) {
var copy = new Array(n);
for (var i = 0; i < n; ++i) copy[i] = arr[i];
return copy;
}
function spliceOne(list, index) {
for (; index + 1 < list.length; index++) list[index] = list[index + 1];
list.pop();
}
function unwrapListeners(arr) {
var ret = new Array(arr.length);
for (var i = 0; i < ret.length; ++i) {
ret[i] = arr[i].listener || arr[i];
}
return ret;
}
function once(emitter, name) {
return new Promise(function (resolve, reject) {
function errorListener(err) {
emitter.removeListener(name, resolver);
reject(err);
}
function resolver() {
if (typeof emitter.removeListener === 'function') {
emitter.removeListener('error', errorListener);
}
resolve([].slice.call(arguments));
}
;
eventTargetAgnosticAddListener(emitter, name, resolver, {
once: true
});
if (name !== 'error') {
addErrorHandlerIfEventEmitter(emitter, errorListener, {
once: true
});
}
});
}
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
if (typeof emitter.on === 'function') {
eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
}
}
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
if (typeof emitter.on === 'function') {
if (flags.once) {
emitter.once(name, listener);
} else {
emitter.on(name, listener);
}
} else if (typeof emitter.addEventListener === 'function') {
// EventTarget does not have `error` event semantics like Node
// EventEmitters, we do not listen for `error` events here.
emitter.addEventListener(name, function wrapListener(arg) {
// IE does not have builtin `{ once: true }` support so we
// have to do it manually.
if (flags.once) {
emitter.removeEventListener(name, wrapListener);
}
listener(arg);
});
} else {
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
}
}
"use strict";
var _$Deferred_35 = function Deferred() {
var _this = this;
this.promise = new Promise(function (resolve, reject) {
_this.resolve = resolve;
_this.reject = reject;
});
};
var _$events_34 = {};
"use strict";
/* removed: var _$timeout_39 = require("./lib/timeout"); */;
/* removed: var _$delay_37 = require("./lib/delay"); */;
/* removed: var _$TimeoutError_36 = require("./lib/TimeoutError"); */;
/* removed: var _$promise_38 = require("./lib/promise"); */;
/* removed: var _$events_17 = require("events"); */;
/* removed: var _$Deferred_35 = require("./lib/Deferred"); */;
_$events_34.EventEmitter = _$events_17;
_$events_34.timeout = _$timeout_39;
/* common-shake removed: exports.delay = */ void _$delay_37;
/* common-shake removed: exports.TimeoutError = */ void _$TimeoutError_36;
_$events_34.promise = _$promise_38;
_$events_34.Deferred = _$Deferred_35;
var _$taggedTemplateLiteralLoose_11 = {};
"use strict";
function _taggedTemplateLiteralLoose(e, t) {
return t || (t = e.slice(0)), e.raw = t, e;
}
_$taggedTemplateLiteralLoose_11 = _taggedTemplateLiteralLoose, _$taggedTemplateLiteralLoose_11.__esModule = true, _$taggedTemplateLiteralLoose_11["default"] = _$taggedTemplateLiteralLoose_11;
var _$escaping_45 = {};
"use strict";
/* removed: var _$interopRequireDefault_5 = require("@babel/runtime/helpers/interopRequireDefault"); */;
var _taggedTemplateLiteralLoose2 = _$interopRequireDefault_5(_$taggedTemplateLiteralLoose_11);
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19, _templateObject20, _templateObject21, _templateObject22, _templateObject23, _templateObject24, _templateObject25, _templateObject26, _templateObject27, _templateObject28, _templateObject29, _templateObject30;
_$escaping_45.detect = function detect(local) {
if (!local) {
return false;
}
// Remove all escaped sequences
var tmp = local.replaceAll(String.raw(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\20"]))), "").replaceAll(String.raw(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\22"]))), "").replaceAll(String.raw(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\26"]))), "").replaceAll(String.raw(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\27"]))), "").replaceAll(String.raw(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\2f"]))), "").replaceAll(String.raw(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3a"]))), "").replaceAll(String.raw(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3c"]))), "").replaceAll(String.raw(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3e"]))), "").replaceAll(String.raw(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\40"]))), "").replaceAll(String.raw(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\5c"]))), "");
// Detect if we have unescaped sequences
var search = tmp.search(/[ "&'/:<>@\\]/g);
if (search === -1) {
return false;
}
return true;
};
/**
* Escape the local part of a JID.
*
* @see http://xmpp.org/extensions/xep-0106.html
* @param String local local part of a jid
* @return An escaped local part
*/
_$escaping_45.escape = function escape(local) {
if (local === null) {
return null;
}
return local.replaceAll(/^\s+|\s+$/g, "").replaceAll("\\", String.raw(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\5c"])))).replaceAll(" ", String.raw(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\20"])))).replaceAll('"', String.raw(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\22"])))).replaceAll("&", String.raw(_templateObject14 || (_templateObject14 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\26"])))).replaceAll("'", String.raw(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\27"])))).replaceAll("/", String.raw(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\2f"])))).replaceAll(":", String.raw(_templateObject17 || (_templateObject17 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3a"])))).replaceAll("<", String.raw(_templateObject18 || (_templateObject18 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3c"])))).replaceAll(">", String.raw(_templateObject19 || (_templateObject19 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3e"])))).replaceAll("@", String.raw(_templateObject20 || (_templateObject20 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\40"]))));
};
/**
* Unescape a local part of a JID.
*
* @see http://xmpp.org/extensions/xep-0106.html
* @param String local local part of a jid
* @return unescaped local part
*/
_$escaping_45.unescape = function unescape(local) {
if (local === null) {
return null;
}
return local.replaceAll(String.raw(_templateObject21 || (_templateObject21 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\20"]))), " ").replaceAll(String.raw(_templateObject22 || (_templateObject22 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\22"]))), '"').replaceAll(String.raw(_templateObject23 || (_templateObject23 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\26"]))), "&").replaceAll(String.raw(_templateObject24 || (_templateObject24 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\27"]))), "'").replaceAll(String.raw(_templateObject25 || (_templateObject25 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\2f"]))), "/").replaceAll(String.raw(_templateObject26 || (_templateObject26 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3a"]))), ":").replaceAll(String.raw(_templateObject27 || (_templateObject27 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3c"]))), "<").replaceAll(String.raw(_templateObject28 || (_templateObject28 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\3e"]))), ">").replaceAll(String.raw(_templateObject29 || (_templateObject29 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\40"]))), "@").replaceAll(String.raw(_templateObject30 || (_templateObject30 = (0, _taggedTemplateLiteralLoose2.default)([void 0], ["\\5c"]))), "\\");
};
"use strict";
/* removed: var _$escaping_45 = require("./escaping"); */;
/**
* JID implements
* - XMPP addresses according to RFC6122
* - XEP-0106: JID Escaping
*
* @see http://tools.ietf.org/html/rfc6122#section-2
* @see http://xmpp.org/extensions/xep-0106.html
*/
var JID = /*#__PURE__*/function () {
function JID(local, domain, resource) {
if (typeof domain !== "string" || !domain) {
throw new TypeError("Invalid domain.");
}
this.setDomain(domain);
this.setLocal(typeof local === "string" ? local : "");
this.setResource(typeof resource === "string" ? resource : "");
}
var _proto = JID.prototype;
_proto[Symbol.toPrimitive] = function (hint) {
if (hint === "number") {
return NaN;
}
return this.toString();
};
_proto.toString = function toString(unescape) {
var s = this._domain;
if (this._local) {
s = this.getLocal(unescape) + "@" + s;
}
if (this._resource) {
s = s + "/" + this._resource;
}
return s;
}
/**
* Convenience method to distinguish users
* */;
_proto.bare = function bare() {
if (this._resource) {
return new JID(this._local, this._domain, null);
}
return this;
}
/**
* Comparison function
* */;
_proto.equals = function equals(other) {
return this._local === other._local && this._domain === other._domain && this._resource === other._resource;
}
/**
* http://xmpp.org/rfcs/rfc6122.html#addressing-localpart
* */;
_proto.setLocal = function setLocal(local, escape) {
escape = escape || _$escaping_45.detect(local);
if (escape) {
local = _$escaping_45.escape(local);
}
this._local = local && local.toLowerCase();
return this;
};
_proto.getLocal = function getLocal(unescape) {
if (unescape === void 0) {
unescape = false;
}
var local = null;
local = unescape ? _$escaping_45.unescape(this._local) : this._local;
return local;
}
/**
* http://xmpp.org/rfcs/rfc6122.html#addressing-domain
*/;
_proto.setDomain = function setDomain(domain) {
this._domain = domain.toLowerCase();
return this;
};
_proto.getDomain = function getDomain() {
return this._domain;
}
/**
* http://xmpp.org/rfcs/rfc6122.html#addressing-resourcepart
*/;
_proto.setResource = function setResource(resource) {
this._resource = resource;
return this;
};
_proto.getResource = function getResource() {
return this._resource;
};
return JID;
}();
Object.defineProperty(JID.prototype, "local", {
get: JID.prototype.getLocal,
set: JID.prototype.setLocal
});
Object.defineProperty(JID.prototype, "domain", {
get: JID.prototype.getDomain,
set: JID.prototype.setDomain
});
Object.defineProperty(JID.prototype, "resource", {
get: JID.prototype.getResource,
set: JID.prototype.setResource
});
var _$JID_44 = JID;
"use strict";
/* removed: var _$JID_44 = require("../lib/JID"); */;
var _$parse_46 = function parse(s) {
var local;
var resource;
var resourceStart = s.indexOf("/");
if (resourceStart !== -1) {
resource = s.slice(resourceStart + 1);
s = s.slice(0, resourceStart);
}
var atStart = s.indexOf("@");
if (atStart !== -1) {
local = s.slice(0, atStart);
s = s.slice(atStart + 1);
}
return new _$JID_44(local, s, resource);
};
var _$jid_43 = {};
"use strict";
/* removed: var _$interopRequireDefault_5 = require("@babel/runtime/helpers/interopRequireDefault"); */;
var _construct2 = _$interopRequireDefault_5(_$construct_1);
/* removed: var _$JID_44 = require("./lib/JID"); */;
/* removed: var _$escaping_45 = require("./lib/escaping"); */;
/* removed: var _$parse_46 = require("./lib/parse"); */;
function jid() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (!args[1] && !args[2]) {
return _$parse_46.apply(void 0, args);
}
return (0, _construct2.default)(_$JID_44, args);
}
_$jid_43 = jid.bind();
_$jid_43.jid = jid;
_$jid_43.JID = _$JID_44;
_$jid_43.equal = function equal(a, b) {
return a.equals(b);
};
_$jid_43.detectEscape = _$escaping_45.detect;
_$jid_43.escapeLocal = _$escaping_45.escape;
_$jid_43.unescapeLocal = _$escaping_45.unescape;
_$jid_43.parse = _$parse_46;
var _$escape_76 = {};
'use strict';
var escapeXMLTable = {
"&": "&",
"<": "<",
">": ">",
'"': """,
"'": "'"
};
function escapeXMLReplace(match) {
return escapeXMLTable[match];
}
var unescapeXMLTable = {
"&": "&",
"<": "<",
">": ">",
""": '"',
"'": "'"
};
function unescapeXMLReplace(match) {
if (match[1] === "#") {
var num = match[2] === "x" ? parseInt(match.slice(3), 16) : parseInt(match.slice(2), 10);
// https://www.w3.org/TR/xml/#NT-Char defines legal XML characters:
// #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
if (num === 0x9 || num === 0xa || num === 0xd || num >= 0x20 && num <= 0xd7ff || num >= 0xe000 && num <= 0xfffd || num >= 0x10000 && num <= 0x10ffff) {
return String.fromCodePoint(num);
}
throw new Error("Illegal XML character 0x" + num.toString(16));
}
if (unescapeXMLTable[match]) {
return unescapeXMLTable[match] || match;
}
throw new Error("Illegal XML entity " + match);
}
function escapeXML(s) {
return s.replace(/["&'<>]/g, escapeXMLReplace);
}
function unescapeXML(s) {
var result = "";
var start = -1;
var end = -1;
var previous = 0;
while ((start = s.indexOf("&", previous)) !== -1 && (end = s.indexOf(";", start + 1)) !== -1) {
result = result + s.slice(previous, start) + unescapeXMLReplace(s.slice(start, end + 1));
previous = end + 1;
}
// shortcut if loop never entered:
// return the original string without creating new objects
if (previous === 0) return s;
// push the remaining characters
result = result + s.substring(previous);
return result;
}
function escapeXMLText(s) {
return s.replace(/[&<>]/g, escapeXMLReplace);
}
function unescapeXMLText(s) {
return s.replace(/&(amp|#38|lt|#60|gt|#62);/g, unescapeXMLReplace);
}
_$escape_76.escapeXML = escapeXML;
_$escape_76.escapeXMLText = escapeXMLText;
_$escape_76.unescapeXML = unescapeXML;
_$escape_76.unescapeXMLText = unescapeXMLText;
'use strict';
function _createForOfIteratorHelperLoose(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (t) return (t = t.call(r)).next.bind(t); if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var o = 0; return function () { return o >= r.length ? { done: !0 } : { done: !1, value: r[o++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
/* removed: var _$escape_76 = require('./escape.js'); */;
/**
* Element
*
* Attributes are in the element.attrs object. Children is a list of
* either other Elements or Strings for text content.
**/
var Element = /*#__PURE__*/function () {
function Element(name, attrs) {
this.name = name;
this.parent = null;
this.children = [];
this.attrs = {};
this.setAttrs(attrs);
}
/* Accessors */
/**
* if (element.is('message', 'jabber:client')) ...
**/
var _proto = Element.prototype;
_proto.is = function is(name, xmlns) {
return this.getName() === name && (!xmlns || this.getNS() === xmlns);
}
/* without prefix */;
_proto.getName = function getName() {
var idx = this.name.indexOf(":");
return idx >= 0 ? this.name.slice(idx + 1) : this.name;
}
/**
* retrieves the namespace of the current element, upwards recursively
**/;
_proto.getNS = function getNS() {
var idx = this.name.indexOf(":");
if (idx >= 0) {
var prefix = this.name.slice(0, idx);
return this.findNS(prefix);
}
return this.findNS();
}
/**
* find the namespace to the given prefix, upwards recursively
**/;
_proto.findNS = function findNS(prefix) {
if (!prefix) {
/* default namespace */
if (this.attrs.xmlns) {
return this.attrs.xmlns;
} else if (this.parent) {
return this.parent.findNS();
}
} else {
/* prefixed namespace */
var attr = "xmlns:" + prefix;
if (this.attrs[attr]) {
return this.attrs[attr];
} else if (this.parent) {
return this.parent.findNS(prefix);
}
}
}
/**
* Recursiverly gets all xmlns defined, in the form of {url:prefix}
**/;
_proto.getXmlns = function getXmlns() {
var namespaces = {};
if (this.parent) {
namespaces = this.parent.getXmlns();
}
for (var attr in this.attrs) {
var m = attr.match("xmlns:?(.*)");
// eslint-disable-next-line no-prototype-builtins
if (this.attrs.hasOwnProperty(attr) && m) {
namespaces[this.attrs[attr]] = m[1];
}
}
return namespaces;
};
_proto.setAttrs = function setAttrs(attrs) {
if (typeof attrs === "string") {
this.attrs.xmlns = attrs;
} else if (attrs) {
Object.assign(this.attrs, attrs);
}
}
/**
* xmlns can be null, returns the matching attribute.
**/;
_proto.getAttr = function getAttr(name, xmlns) {
if (!xmlns) {
return this.attrs[name];
}
var namespaces = this.getXmlns();
if (!namespaces[xmlns]) {
return null;
}
return this.attrs[[namespaces[xmlns], name].join(":")];
}
/**
* xmlns can be null
**/;
_proto.getChild = function getChild(name, xmlns) {
return this.getChildren(name, xmlns)[0];
}
/**
* xmlns can be null
**/;
_proto.getChildren = function getChildren(name, xmlns) {
var result = [];
for (var _iterator = _createForOfIteratorHelperLoose(this.children), _step; !(_step = _iterator()).done;) {
var child = _step.value;
if (child.getName && child.getName() === name && (!xmlns || child.getNS() === xmlns)) {
result.push(child);
}
}
return result;
}
/**
* xmlns and recursive can be null
**/;
_proto.getChildByAttr = function getChildByAttr(attr, val, xmlns, recursive) {
return this.getChildrenByAttr(attr, val, xmlns, recursive)[0];
}
/**
* xmlns and recursive can be null
**/;
_proto.getChildrenByAttr = function getChildrenByAttr(attr, val, xmlns, recursive) {
var result = [];
for (var _iterator2 = _createForOfIteratorHelperLoose(this.children), _step2; !(_step2 = _iterator2()).done;) {
var child = _step2.value;
if (child.attrs && child.attrs[attr] === val && (!xmlns || child.getNS() === xmlns)) {
result.push(child);
}
if (recursive && child.getChildrenByAttr) {
result.push(child.getChildrenByAttr(attr, val, xmlns, true));
}
}
if (recursive) {
result = result.flat();
}
return result;
};
_proto.getChildrenByFilter = function getChildrenByFilter(filter, recursive) {
var result = [];
for (var _iterator3 = _createForOfIteratorHelperLoose(this.children), _step3; !(_step3 = _iterator3()).done;) {
var child = _step3.value;
if (filter(child)) {
result.push(child);
}
if (recursive && child.getChildrenByFilter) {
result.push(child.getChildrenByFilter(filter, true));
}
}
if (recursive) {
result = result.flat();
}
return result;
};
_proto.getText = function getText() {
var text = "";
for (var _iterator4 = _createForOfIteratorHelperLoose(this.children), _step4; !(_step4 = _iterator4()).done;) {
var child = _step4.value;
if (typeof child === "string" || typeof child === "number") {
text += child;
}
}
return text;
};
_proto.getChildText = function getChildText(name, xmlns) {
var child = this.getChild(name, xmlns);
return child ? child.getText() : null;
}
/**
* Return all direct descendents that are Elements.
* This differs from `getChildren` in that it will exclude text nodes,
* processing instructions, etc.
*/;
_proto.getChildElements = function getChildElements() {
return this.getChildrenByFilter(function (child) {
return child instanceof Element;
});
}
/* Builder */
/** returns uppermost parent */;
_proto.root = function root() {
if (this.parent) {
return this.parent.root();
}
return this;
}
/** just parent or itself */;
_proto.up = function up() {
if (this.parent) {
return this.parent;
}
return this;
}
/** create child node and return it */;
_proto.c = function c(name, attrs) {
return this.cnode(new Element(name, attrs));
};
_proto.cnode = function cnode(child) {
this.children.push(child);
if (typeof child === "object") {
child.parent = this;
}
return child;
};
_proto.append = function append() {
for (var _len = arguments.length, nodes = new Array(_len), _key = 0; _key < _len; _key++) {
nodes[_key] = arguments[_key];
}
for (var _i = 0, _nodes = nodes; _i < _nodes.length; _i++) {
var node = _nodes[_i];
this.children.push(node);
if (typeof node === "object") {
node.parent = this;
}
}
};
_proto.prepend = function prepend() {
for (var _len2 = arguments.length, nodes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
nodes[_key2] = arguments[_key2];
}
for (var _i2 = 0, _nodes2 = nodes; _i2 < _nodes2.length; _i2++) {
var node = _nodes2[_i2];
this.children.unshift(node);
if (typeof node === "object") {
node.parent = this;
}
}
}
/** add text node and return element */;
_proto.t = function t(text) {
this.children.push(text);
return this;
}
/* Manipulation */
/**
* Either:
* el.remove(childEl)
* el.remove('author', 'urn:...')
*/;
_proto.remove = function remove(el, xmlns) {
var filter = typeof el === "string" ? function (child) {
/* 1st parameter is tag name */
return !(child.is && child.is(el, xmlns));
} : function (child) {
/* 1st parameter is element */
return child !== el;
};
this.children = this.children.filter(filter);
return this;
};
_proto.text = function text(val) {
if (val && this.children.length === 1) {
this.children[0] = val;
return this;
}
return this.getText();
};
_proto.attr = function attr(_attr, val) {
if (typeof val !== "undefined" || val === null) {
if (!this.attrs) {
this.attrs = {};
}
this.attrs[_attr] = val;
return this;
}
return this.attrs[_attr];
}
/* Serialization */;
_proto.toString = function toString() {
var s = "";
this.write(function (c) {
s += c;
});
return s;
};
_proto._addChildren = function _addChildren(writer) {
writer(">");
for (var _iterator5 = _createForOfIteratorHelperLoose(this.children), _step5; !(_step5 = _iterator5()).done;) {
var child = _step5.value;
/* Skip null/undefined */
if (child != null) {
if (child.write) {
child.write(writer);
} else if (typeof child === "string") {
writer(_$escape_76.escapeXMLText(child));
} else if (child.toString) {
writer(_$escape_76.escapeXMLText(child.toString(10)));
}
}
}
writer("</");
writer(this.name);
writer(">");
};
_proto.write = function write(writer) {
writer("<");
writer(this.name);
for (var k in this.attrs) {
var v = this.attrs[k];
// === null || undefined
if (v != null) {
writer(" ");
writer(k);
writer('="');
writer(_$escape_76.escapeXML(typeof v === "string" ? v : v.toString(10)));
writer('"');
}
}
if (this.children.length === 0) {
writer("/>");
} else {
this._addChildren(writer);
}
};
return Element;
}();
Element.prototype.tree = Element.prototype.root;
var _$Element_74 = Element;
'use strict';
functio