@hsaadawy/ngx-chat
Version:
61 lines • 11.2 kB
JavaScript
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=