UNPKG

@hsaadawy/ngx-chat

Version:
61 lines 11.2 kB
import { __awaiter } from "tslib"; import { xml } from '@xmpp/client'; import { BehaviorSubject, of } from 'rxjs'; import { catchError, first, mergeMap, map, timeout } from 'rxjs/operators'; import { AbstractXmppPlugin } from './abstract-xmpp-plugin'; /** * Request time of entities via XEP-0202. */ export class EntityTimePlugin extends AbstractXmppPlugin { constructor(xmppChatAdapter, serviceDiscoveryPlugin, logService) { super(); this.xmppChatAdapter = xmppChatAdapter; this.serviceDiscoveryPlugin = serviceDiscoveryPlugin; this.logService = logService; this.serverSupportsTime$ = new BehaviorSubject('unknown'); this.serverTime$ = new BehaviorSubject(null); } onBeforeOnline() { return __awaiter(this, void 0, void 0, function* () { const serverSupportsTimeRequest = yield this.serviceDiscoveryPlugin.supportsFeature(this.xmppChatAdapter.chatConnectionService.userJid.domain, 'urn:xmpp:time'); if (serverSupportsTimeRequest) { const sharedUtcTimeStamp = yield this.requestTime(this.xmppChatAdapter.chatConnectionService.userJid.domain); this.serverTime$.next(sharedUtcTimeStamp); this.serverSupportsTime$.next(true); } else { this.serverSupportsTime$.next(false); } }); } onOffline() { this.serverSupportsTime$.next('unknown'); this.serverTime$.next(null); } /** * Returns a non-client-specific timestamp if server supports XEP-0202. Fallback to local timestamp in case of missing support. */ getNow() { return __awaiter(this, void 0, void 0, function* () { const calculateNowViaServerTime$ = this.serverTime$.pipe(map(reference => this.calculateNow(reference)), first()); return yield this.serverSupportsTime$.pipe(timeout(5000), first(supportsServerTime => supportsServerTime !== 'unknown'), mergeMap(supportsServerTime => supportsServerTime ? calculateNowViaServerTime$ : of(Date.now())), catchError(() => of(Date.now()))).toPromise(); }); } calculateNow(reference) { return reference.utcTimestamp + (performance.now() - reference.localReference); } requestTime(jid) { var _a; return __awaiter(this, void 0, void 0, function* () { const response = yield this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'get', to: jid }, xml('time', { xmlns: 'urn:xmpp:time' }))); const utcString = (_a = response.getChild('time', 'urn:xmpp:time')) === null || _a === void 0 ? void 0 : _a.getChildText('utc'); if (!utcString) { const message = 'invalid time response'; this.logService.error(message, response.toString()); throw new Error(message); } return { utcTimestamp: Date.parse(utcString), localReference: performance.now() }; }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXRpbWUucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF6em5ldHdvcmsvbmd4LWNoYXQvc3JjL2xpYi9zZXJ2aWNlcy9hZGFwdGVycy94bXBwL3BsdWdpbnMvZW50aXR5LXRpbWUucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXNUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsa0JBQWtCO0lBS3BELFlBQ1ksZUFBZ0MsRUFDaEMsc0JBQThDLEVBQzlDLFVBQXNCO1FBRTlCLEtBQUssRUFBRSxDQUFDO1FBSkEsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQU4xQix3QkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBc0IsU0FBUyxDQUFDLENBQUM7UUFDMUUsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFRdEUsQ0FBQztJQUVLLGNBQWM7O1lBQ2hCLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUMvRSxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQ3pELGVBQWUsQ0FDbEIsQ0FBQztZQUNGLElBQUkseUJBQXlCLEVBQUU7Z0JBQzNCLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3RyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3ZDO2lCQUFNO2dCQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEM7UUFDTCxDQUFDO0tBQUE7SUFFRCxTQUFTO1FBQ0wsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDRyxNQUFNOztZQUNSLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbEgsT0FBTyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDYixLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsQ0FBQyxFQUM3RCxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQ2hHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FDbkMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQixDQUFDO0tBQUE7SUFFTyxZQUFZLENBQUMsU0FBd0I7UUFDekMsT0FBTyxTQUFTLENBQUMsWUFBWSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUssV0FBVyxDQUFDLEdBQVc7OztZQUN6QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUNwRSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFDLEVBQzVCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsZUFBZSxFQUFDLENBQUMsQ0FDeEMsQ0FDSixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBQSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsMENBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ1osTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sRUFBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFDLENBQUM7O0tBQ25GO0NBRUoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpcnN0LCBtZXJnZU1hcCwgbWFwLCB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBYbXBwQ2hhdEFkYXB0ZXIgfSBmcm9tICcuLi94bXBwLWNoYXQtYWRhcHRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RYbXBwUGx1Z2luIH0gZnJvbSAnLi9hYnN0cmFjdC14bXBwLXBsdWdpbic7XHJcbmltcG9ydCB7IFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4gfSBmcm9tICcuL3NlcnZpY2UtZGlzY292ZXJ5LnBsdWdpbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVSZWZlcmVuY2Uge1xyXG4gICAgdXRjVGltZXN0YW1wOiBudW1iZXI7XHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gd2FzIHV0Y1RpbWVzdGFtcCBzZWVuIGxvY2FsbHkgYWNjb3JkaW5nIHRvIHBlcmZvcm1hbmNlLm5vdygpLlxyXG4gICAgICovXHJcbiAgICBsb2NhbFJlZmVyZW5jZTogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogUmVxdWVzdCB0aW1lIG9mIGVudGl0aWVzIHZpYSBYRVAtMDIwMi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBFbnRpdHlUaW1lUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RYbXBwUGx1Z2luIHtcclxuXHJcbiAgICBwcml2YXRlIHNlcnZlclN1cHBvcnRzVGltZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4gfCAndW5rbm93bic+KCd1bmtub3duJyk7XHJcbiAgICBwcml2YXRlIHNlcnZlclRpbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUaW1lUmVmZXJlbmNlIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSB4bXBwQ2hhdEFkYXB0ZXI6IFhtcHBDaGF0QWRhcHRlcixcclxuICAgICAgICBwcml2YXRlIHNlcnZpY2VEaXNjb3ZlcnlQbHVnaW46IFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4sXHJcbiAgICAgICAgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkJlZm9yZU9ubGluZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBzZXJ2ZXJTdXBwb3J0c1RpbWVSZXF1ZXN0ID0gYXdhaXQgdGhpcy5zZXJ2aWNlRGlzY292ZXJ5UGx1Z2luLnN1cHBvcnRzRmVhdHVyZShcclxuICAgICAgICAgICAgdGhpcy54bXBwQ2hhdEFkYXB0ZXIuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnVzZXJKaWQuZG9tYWluLFxyXG4gICAgICAgICAgICAndXJuOnhtcHA6dGltZScsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoc2VydmVyU3VwcG9ydHNUaW1lUmVxdWVzdCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaGFyZWRVdGNUaW1lU3RhbXAgPSBhd2FpdCB0aGlzLnJlcXVlc3RUaW1lKHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS51c2VySmlkLmRvbWFpbik7XHJcbiAgICAgICAgICAgIHRoaXMuc2VydmVyVGltZSQubmV4dChzaGFyZWRVdGNUaW1lU3RhbXApO1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZlclN1cHBvcnRzVGltZSQubmV4dCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZlclN1cHBvcnRzVGltZSQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uT2ZmbGluZSgpIHtcclxuICAgICAgICB0aGlzLnNlcnZlclN1cHBvcnRzVGltZSQubmV4dCgndW5rbm93bicpO1xyXG4gICAgICAgIHRoaXMuc2VydmVyVGltZSQubmV4dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBub24tY2xpZW50LXNwZWNpZmljIHRpbWVzdGFtcCBpZiBzZXJ2ZXIgc3VwcG9ydHMgWEVQLTAyMDIuIEZhbGxiYWNrIHRvIGxvY2FsIHRpbWVzdGFtcCBpbiBjYXNlIG9mIG1pc3Npbmcgc3VwcG9ydC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0Tm93KCk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlTm93VmlhU2VydmVyVGltZSQgPSB0aGlzLnNlcnZlclRpbWUkLnBpcGUobWFwKHJlZmVyZW5jZSA9PiB0aGlzLmNhbGN1bGF0ZU5vdyhyZWZlcmVuY2UpKSwgZmlyc3QoKSk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmVyU3VwcG9ydHNUaW1lJC5waXBlKFxyXG4gICAgICAgICAgICB0aW1lb3V0KDUwMDApLFxyXG4gICAgICAgICAgICBmaXJzdChzdXBwb3J0c1NlcnZlclRpbWUgPT4gc3VwcG9ydHNTZXJ2ZXJUaW1lICE9PSAndW5rbm93bicpLFxyXG4gICAgICAgICAgICBtZXJnZU1hcChzdXBwb3J0c1NlcnZlclRpbWUgPT4gc3VwcG9ydHNTZXJ2ZXJUaW1lID8gY2FsY3VsYXRlTm93VmlhU2VydmVyVGltZSQgOiBvZihEYXRlLm5vdygpKSksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoRGF0ZS5ub3coKSkpLFxyXG4gICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVOb3cocmVmZXJlbmNlOiBUaW1lUmVmZXJlbmNlKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gcmVmZXJlbmNlLnV0Y1RpbWVzdGFtcCArIChwZXJmb3JtYW5jZS5ub3coKSAtIHJlZmVyZW5jZS5sb2NhbFJlZmVyZW5jZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVxdWVzdFRpbWUoamlkOiBzdHJpbmcpOiBQcm9taXNlPFRpbWVSZWZlcmVuY2U+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgIHhtbCgnaXEnLCB7dHlwZTogJ2dldCcsIHRvOiBqaWR9LFxyXG4gICAgICAgICAgICAgICAgeG1sKCd0aW1lJywge3htbG5zOiAndXJuOnhtcHA6dGltZSd9KSxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHV0Y1N0cmluZyA9IHJlc3BvbnNlLmdldENoaWxkKCd0aW1lJywgJ3Vybjp4bXBwOnRpbWUnKT8uZ2V0Q2hpbGRUZXh0KCd1dGMnKTtcclxuICAgICAgICBpZiAoIXV0Y1N0cmluZykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ2ludmFsaWQgdGltZSByZXNwb25zZSc7XHJcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihtZXNzYWdlLCByZXNwb25zZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge3V0Y1RpbWVzdGFtcDogRGF0ZS5wYXJzZSh1dGNTdHJpbmcpLCBsb2NhbFJlZmVyZW5jZTogcGVyZm9ybWFuY2Uubm93KCl9O1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=