@hsaadawy/ngx-chat
Version:
83 lines • 15.2 kB
JavaScript
import { __awaiter } from "tslib";
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.
*/
register(username, password, service, domain) {
return __awaiter(this, void 0, void 0, function* () {
yield this.ngZone.runOutsideAngular(() => __awaiter(this, void 0, void 0, function* () {
try {
yield timeout((() => __awaiter(this, void 0, void 0, function* () {
domain = domain || getDomain(service);
this.logService.debug('registration plugin', 'connecting...');
yield this.connect(username, password, service, domain);
this.logService.debug('registration plugin', 'connection established, starting registration');
yield 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');
yield this.client.iqCaller.request(xml('iq', { type: 'set' }, xml('query', { xmlns: 'jabber:iq:register' }, xml('username', {}, username), xml('password', {}, password))));
this.registered$.next();
yield 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');
yield this.client.stop();
}
}));
});
}
connect(username, password, service, domain) {
return new Promise(resolveConnectionEstablished => {
this.client = client({
domain: domain || getDomain(service),
service,
credentials: (authenticationCallback) => __awaiter(this, void 0, void 0, function* () {
resolveConnectionEstablished();
yield this.registered$.pipe(takeUntil(this.cleanUp), first()).toPromise();
yield 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhenpuZXR3b3JrL25neC1jaGF0L3NyYy9saWIvc2VydmljZXMvYWRhcHRlcnMveG1wcC9wbHVnaW5zL3JlZ2lzdHJhdGlvbi5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBVSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsa0JBQWtCO0lBUXRELFlBQW9CLFVBQXNCLEVBQ3RCLE1BQWM7UUFDOUIsS0FBSyxFQUFFLENBQUM7UUFGUSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFQakIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQzlCLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2hDLHdCQUFtQixHQUFHLElBQUksQ0FBQztJQU01QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ1UsUUFBUSxDQUFDLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixNQUFjOztZQUNoQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMs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QUFDO29CQUMxRSxNQUFNLHNCQUFzQixDQUFDLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQTthQUNKLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUUvQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENsaWVudCwgY2xpZW50LCB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpcnN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGdldERvbWFpbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvZ2V0LWRvbWFpbic7XHJcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzLXRpbWVvdXQnO1xyXG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFhtcHBQbHVnaW4gfSBmcm9tICcuL2Fic3RyYWN0LXhtcHAtcGx1Z2luJztcclxuXHJcbi8qKlxyXG4gKiBYRVAtMDA3NzogSW4tQmFuZCBSZWdpc3RyYXRpb25cclxuICogc2VlOiBodHRwczovL3htcHAub3JnL2V4dGVuc2lvbnMveGVwLTAwNzcuaHRtbFxyXG4gKiBIYW5kbGVzIHJlZ2lzdHJhdGlvbiBvdmVyIHRoZSBYTVBQIGNoYXQgaW5zdGVhZCBvZiByZWxheWluZyBvbiBhIGFkbWluIHVzZXIgYWNjb3VudCBtYW5hZ2VtZW50XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RYbXBwUGx1Z2luIHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVyZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW5VcCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlZEluJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblRpbWVvdXQgPSA1MDAwO1xyXG4gICAgcHJpdmF0ZSBjbGllbnQ6IENsaWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBhY2NvdW50IGlzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5LFxyXG4gICAgICogcmVqZWN0cyBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHJlZ2lzdGVyaW5nLCBlLmcuIHRoZSB1c2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIodXNlcm5hbWU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRpbWVvdXQoKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBkb21haW4gfHwgZ2V0RG9tYWluKHNlcnZpY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoJ3JlZ2lzdHJhdGlvbiBwbHVnaW4nLCAnY29ubmVjdGluZy4uLicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCh1c2VybmFtZSwgcGFzc3dvcmQsIHNlcnZpY2UsIGRvbWFpbik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdjb25uZWN0aW9uIGVzdGFibGlzaGVkLCBzdGFydGluZyByZWdpc3RyYXRpb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5pcUNhbGxlci5yZXF1ZXN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ2lxJywge3R5cGU6ICdnZXQnLCB0bzogZG9tYWlufSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbCgncXVlcnknLCB7eG1sbnM6ICdqYWJiZXI6aXE6cmVnaXN0ZXInfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdzZXJ2ZXIgYWNrbm93bGVkZ2VkIHJlZ2lzdHJhdGlvbiByZXF1ZXN0LCBzZW5kaW5nIGNyZWRlbnRpYWxzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuaXFDYWxsZXIucmVxdWVzdChcclxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnc2V0J30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwoJ3F1ZXJ5Jywge3htbG5zOiAnamFiYmVyOmlxOnJlZ2lzdGVyJ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCd1c2VybmFtZScsIHt9LCB1c2VybmFtZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sKCdwYXNzd29yZCcsIHt9LCBwYXNzd29yZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZCQubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9nZ2VkSW4kLnBpcGUodGFrZVVudGlsKHRoaXMuY2xlYW5VcCksIGZpcnN0KCkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdyZWdpc3RyYXRpb24gc3VjY2Vzc2Z1bCcpO1xyXG4gICAgICAgICAgICAgICAgfSkoKSwgdGhpcy5yZWdpc3RyYXRpb25UaW1lb3V0KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLndhcm4oJ2Vycm9yIHJlZ2lzdGVyaW5nJywgZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhblVwLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncmVnaXN0cmF0aW9uIHBsdWdpbicsICdjbGVhbmluZyB1cCcpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0KHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgZG9tYWluPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmVDb25uZWN0aW9uRXN0YWJsaXNoZWQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudCh7XHJcbiAgICAgICAgICAgICAgICBkb21haW46IGRvbWFpbiB8fCBnZXREb21haW4oc2VydmljZSksXHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IGFzeW5jIChhdXRoZW50aWNhdGlvbkNhbGxiYWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJlZCQucGlwZSh0YWtlVW50aWwodGhpcy5jbGVhblVwKSwgZmlyc3QoKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXV0aGVudGljYXRpb25DYWxsYmFjayh7dXNlcm5hbWUsIHBhc3N3b3JkfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGllbnQucmVjb25uZWN0LnN0b3AoKTtcclxuICAgICAgICAgICAgdGhpcy5jbGllbnQudGltZW91dCA9IHRoaXMucmVnaXN0cmF0aW9uVGltZW91dDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9uKCdvbmxpbmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoJ3JlZ2lzdHJhdGlvbiBwbHVnaW4nLCAnb25saW5lIGV2ZW50Jyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZEluJC5uZXh0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoJ3JlZ2lzdHJhdGlvbiBwbHVnaW4nLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9uKCdvZmZsaW5lJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKCdyZWdpc3RyYXRpb24gcGx1Z2luJywgJ29mZmxpbmUgZXZlbnQnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc3RhcnQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=