@pazznetwork/ngx-chat
Version:
[](https://travis-ci.com/pazznetwork/ngx-chat) [](https://coveralls.io/github/pazzn
80 lines • 14.4 kB
JavaScript
import { client, xml } from '@xmpp/client';
import { Subject } from 'rxjs';
import { first, takeUntil } from 'rxjs/operators';
import { getDomain } from '../../../../core/get-domain';
import { timeout } from '../../../../core/utils-timeout';
import { AbstractXmppPlugin } from './abstract-xmpp-plugin';
/**
* XEP-0077: In-Band Registration
* see: https://xmpp.org/extensions/xep-0077.html
* Handles registration over the XMPP chat instead of relaying on a admin user account management
*/
export class RegistrationPlugin extends AbstractXmppPlugin {
constructor(logService, ngZone) {
super();
this.logService = logService;
this.ngZone = ngZone;
this.registered$ = new Subject();
this.cleanUp = new Subject();
this.loggedIn$ = new Subject();
this.registrationTimeout = 5000;
}
/**
* Promise resolves if user account is registered successfully,
* rejects if an error happens while registering, e.g. the username is already taken.
*/
async register(username, password, service, domain) {
await this.ngZone.runOutsideAngular(async () => {
try {
await timeout((async () => {
domain = domain || getDomain(service);
this.logService.debug('registration plugin', 'connecting...');
await this.connect(username, password, service, domain);
this.logService.debug('registration plugin', 'connection established, starting registration');
await this.client.iqCaller.request(xml('iq', { type: 'get', to: domain }, xml('query', { xmlns: 'jabber:iq:register' })));
this.logService.debug('registration plugin', 'server acknowledged registration request, sending credentials');
await this.client.iqCaller.request(xml('iq', { type: 'set' }, xml('query', { xmlns: 'jabber:iq:register' }, xml('username', {}, username), xml('password', {}, password))));
this.registered$.next();
await this.loggedIn$.pipe(takeUntil(this.cleanUp), first()).toPromise();
this.logService.debug('registration plugin', 'registration successful');
})(), this.registrationTimeout);
}
catch (e) {
this.logService.warn('error registering', e);
throw e;
}
finally {
this.cleanUp.next();
this.logService.debug('registration plugin', 'cleaning up');
await this.client.stop();
}
});
}
connect(username, password, service, domain) {
return new Promise(resolveConnectionEstablished => {
this.client = client({
domain: domain || getDomain(service),
service,
credentials: async (authenticationCallback) => {
resolveConnectionEstablished();
await this.registered$.pipe(takeUntil(this.cleanUp), first()).toPromise();
await authenticationCallback({ username, password });
}
});
this.client.reconnect.stop();
this.client.timeout = this.registrationTimeout;
this.client.on('online', () => {
this.logService.debug('registration plugin', 'online event');
this.loggedIn$.next();
});
this.client.on('error', (err) => {
this.logService.error('registration plugin', err);
});
this.client.on('offline', () => {
this.logService.debug('registration plugin', 'offline event');
});
return this.client.start();
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvYWRhcHRlcnMveG1wcC9wbHVnaW5zL3JlZ2lzdHJhdGlvbi5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFVLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxrQkFBa0I7SUFRdEQsWUFBb0IsVUFBc0IsRUFDdEIsTUFBYztRQUM5QixLQUFLLEVBQUUsQ0FBQztRQUZRLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQVBqQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDbEMsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDOUIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsd0JBQW1CLEdBQUcsSUFBSSxDQUFDO0lBTTVDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixNQUFjO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUMzQyxJQUFJ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QUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7YUFDSixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFFL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO2dCQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xpZW50LCBjbGllbnQsIHhtbCB9IGZyb20gJ0B4bXBwL2NsaWVudCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0RG9tYWluIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9nZXQtZG9tYWluJztcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzLXRpbWVvdXQnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEFic3RyYWN0WG1wcFBsdWdpbiB9IGZyb20gJy4vYWJzdHJhY3QteG1wcC1wbHVnaW4nO1xuXG4vKipcbiAqIFhFUC0wMDc3OiBJbi1CYW5kIFJlZ2lzdHJhdGlvblxuICogc2VlOiBodHRwczovL3htcHAub3JnL2V4dGVuc2lvbnMveGVwLTAwNzcuaHRtbFxuICogSGFuZGxlcyByZWdpc3RyYXRpb24gb3ZlciB0aGUgWE1QUCBjaGF0IGluc3RlYWQgb2YgcmVsYXlpbmcgb24gYSBhZG1pbiB1c2VyIGFjY291bnQgbWFuYWdlbWVudFxuICovXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RYbXBwUGx1Z2luIHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0ZXJlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW5VcCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZWRJbiQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmF0aW9uVGltZW91dCA9IDUwMDA7XG4gICAgcHJpdmF0ZSBjbGllbnQ6IENsaWVudDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSByZXNvbHZlcyBpZiB1c2VyIGFjY291bnQgaXMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHksXG4gICAgICogcmVqZWN0cyBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHJlZ2lzdGVyaW5nLCBlLmcuIHRoZSB1c2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3Rlcih1c2VybmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGltZW91dCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBkb21haW4gfHwgZ2V0RG9tYWluKHNlcnZpY2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdjb25uZWN0aW5nLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCh1c2VybmFtZSwgcGFzc3dvcmQsIHNlcnZpY2UsIGRvbWFpbik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKCdyZWdpc3RyYXRpb24gcGx1Z2luJywgJ2Nvbm5lY3Rpb24gZXN0YWJsaXNoZWQsIHN0YXJ0aW5nIHJlZ2lzdHJhdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5pcUNhbGxlci5yZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnZ2V0JywgdG86IGRvbWFpbn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdxdWVyeScsIHt4bWxuczogJ2phYmJlcjppcTpyZWdpc3Rlcid9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdzZXJ2ZXIgYWNrbm93bGVkZ2VkIHJlZ2lzdHJhdGlvbiByZXF1ZXN0LCBzZW5kaW5nIGNyZWRlbnRpYWxzJyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmlxQ2FsbGVyLnJlcXVlc3QoXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2lxJywge3R5cGU6ICdzZXQnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ3F1ZXJ5Jywge3htbG5zOiAnamFiYmVyOmlxOnJlZ2lzdGVyJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgndXNlcm5hbWUnLCB7fSwgdXNlcm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ3Bhc3N3b3JkJywge30sIHBhc3N3b3JkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWQkLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2dnZWRJbiQucGlwZSh0YWtlVW50aWwodGhpcy5jbGVhblVwKSwgZmlyc3QoKSkudG9Qcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdyZWdpc3RyYXRpb24gc3VjY2Vzc2Z1bCcpO1xuICAgICAgICAgICAgICAgIH0pKCksIHRoaXMucmVnaXN0cmF0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLndhcm4oJ2Vycm9yIHJlZ2lzdGVyaW5nJywgZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhblVwLm5leHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoJ3JlZ2lzdHJhdGlvbiBwbHVnaW4nLCAnY2xlYW5pbmcgdXAnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29ubmVjdCh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZUNvbm5lY3Rpb25Fc3RhYmxpc2hlZCA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudCh7XG4gICAgICAgICAgICAgICAgZG9tYWluOiBkb21haW4gfHwgZ2V0RG9tYWluKHNlcnZpY2UpLFxuICAgICAgICAgICAgICAgIHNlcnZpY2UsXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IGFzeW5jIChhdXRoZW50aWNhdGlvbkNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVDb25uZWN0aW9uRXN0YWJsaXNoZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlcmVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmNsZWFuVXApLCBmaXJzdCgpKS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXV0aGVudGljYXRpb25DYWxsYmFjayh7dXNlcm5hbWUsIHBhc3N3b3JkfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2xpZW50LnJlY29ubmVjdC5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmNsaWVudC50aW1lb3V0ID0gdGhpcy5yZWdpc3RyYXRpb25UaW1lb3V0O1xuXG4gICAgICAgICAgICB0aGlzLmNsaWVudC5vbignb25saW5lJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdvbmxpbmUgZXZlbnQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZEluJC5uZXh0KCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdyZWdpc3RyYXRpb24gcGx1Z2luJywgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNsaWVudC5vbignb2ZmbGluZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoJ3JlZ2lzdHJhdGlvbiBwbHVnaW4nLCAnb2ZmbGluZSBldmVudCcpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zdGFydCgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=