@xmpp-infister/jid
Version:
XMPP identifiers (JID) for JavaScript
135 lines (109 loc) • 2.53 kB
JavaScript
'use strict'
const escaping = 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
*/
class JID {
constructor(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 : '')
}
[Symbol.toPrimitive](hint) {
if (hint === 'number') {
return NaN
}
return this.toString()
}
toString(unescape) {
let 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
* */
bare() {
if (this._resource) {
return new JID(this._local, this._domain, null)
}
return this
}
/**
* Comparison function
* */
equals(other) {
return (
this._local === other._local &&
this._domain === other._domain &&
this._resource === other._resource
)
}
/**
* http://xmpp.org/rfcs/rfc6122.html#addressing-localpart
* */
setLocal(local, escape) {
escape = escape || escaping.detect(local)
if (escape) {
local = escaping.escape(local)
}
this._local = local && local.toLowerCase()
return this
}
getLocal(unescape) {
unescape = unescape || false
let local = null
if (unescape) {
local = escaping.unescape(this._local)
} else {
local = this._local
}
return local
}
/**
* http://xmpp.org/rfcs/rfc6122.html#addressing-domain
*/
setDomain(domain) {
this._domain = domain.toLowerCase()
return this
}
getDomain() {
return this._domain
}
/**
* http://xmpp.org/rfcs/rfc6122.html#addressing-resourcepart
*/
setResource(resource) {
this._resource = resource
return this
}
getResource() {
return this._resource
}
}
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,
})
module.exports = JID