@iotize/tap
Version:
IoTize Device client for Javascript
141 lines (136 loc) • 4.66 kB
JavaScript
import '@iotize/tap/service/impl/interface';
import { Subject } from 'rxjs';
import { tap } from 'rxjs/operators';
import { createDebugger } from '@iotize/common/debug';
const prefix = '@iotize/tap/keepalive';
const debug = createDebugger(prefix);
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
const DEFAULT_KEEP_ALIVE_PERIOD_MS = 5000;
const TAG = 'KeepAliveEngine';
class KeepAliveEngine {
constructor(tap$1, _options) {
this.tap = tap$1;
this._options = _options;
this._lastResponseTime = 0;
this._isStopped = true;
this._frameCounter = 0;
this._events = new Subject();
debug(TAG, 'new KeepAliveEngine()');
this.tap.client.addInterceptor((req, handle) => {
return handle.handle(req).pipe(tap({
next: () => {
debug(TAG, 'update last response time', this._lastResponseTime, '=>', new Date().getTime());
this._lastResponseTime = new Date().getTime();
},
}));
});
}
/**
* Keep alive request count
*/
get counter() {
return this._frameCounter;
}
/**
* returns event observable
*/
get events() {
return this._events.asObservable();
}
/**
* Change keep alive period
*/
set period(p) {
if (typeof p !== 'number') {
p = 0;
}
this._options.period = p;
if (this._options.period <= 0) {
this.clearTimeout();
}
else if (!this.timeoutId && this.running) {
this._setupNextTimeout(0);
}
}
get running() {
return !this._isStopped;
}
get options() {
return this._options;
}
start() {
this._isStopped = false;
if (!this.timeoutId && this.options.period > 0) {
this._setupNextTimeout(0);
}
this._events.next({
type: 'start',
});
}
stop() {
this._isStopped = true;
this.clearTimeout();
this._events.next({
type: 'stop',
});
}
clearTimeout() {
if (this.timeoutId) {
clearTimeout(this.timeoutId);
this.timeoutId = undefined;
}
}
_setupNextTimeout(timeoutMs) {
if (this._isStopped) {
return;
}
this._events.next({
type: 'rescheduleKeepAlive',
timeout: timeoutMs,
});
this.timeoutId = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
if (this.tap.isConnected()) {
const remainingTime = this._options.period - elapsedTime(this._lastResponseTime);
if (remainingTime > 0) {
debug(TAG, 'Reschedule keep alive in ', remainingTime);
this._setupNextTimeout(remainingTime);
}
else {
debug(TAG, 'Running keep alive');
this._frameCounter++;
try {
this._events.next({
type: 'tick',
});
yield this.tap.service.interface.keepAlive();
}
catch (err) {
this._events.next({
type: 'error',
error: err,
});
}
if (this._options.period > 0) {
this._setupNextTimeout(this._options.period);
}
}
}
}), timeoutMs);
}
}
function elapsedTime(time) {
return new Date().getTime() - time;
}
/**
* Generated bundle index. Do not edit.
*/
export { DEFAULT_KEEP_ALIVE_PERIOD_MS, KeepAliveEngine };
//# sourceMappingURL=iotize-tap-keep-alive.js.map