@iotize/tap
Version:
IoTize Device client for Javascript
154 lines • 12.7 kB
JavaScript
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());
});
};
import { promiseTimeout } from '@iotize/common/promise';
import { TaskQueue } from '@iotize/common/task-manager';
import { ComProtocol, ConnectionState, } from '@iotize/tap/protocol/api';
import { defer, of, throwError } from 'rxjs';
import { finalize, share, switchMap, tap, timeoutWith } from 'rxjs/operators';
import { AbstractComProtocol } from './abstract-com-protocol';
import { debug } from './debug';
const TAG = 'ComProtocol';
/**
*
*/
export class QueueComProtocol extends AbstractComProtocol {
constructor() {
super();
this._jobQueue = new TaskQueue();
}
_send(data, options) {
return defer(() => __awaiter(this, void 0, void 0, function* () {
if (!this.isConnected()) {
throw ComProtocol.Errors.notConnected({
protocol: this,
});
}
let startTime = new Date();
yield promiseTimeout(options.timeout, this.write(data), (info) => {
return ComProtocol.Errors.timeoutError({
msg: `Communication timeout. Send request to device device timeout (${info.timeout}ms).`,
protocol: this,
timeout: info.timeout,
startTime: info.startTime,
});
});
let elapsedTime = new Date().getTime() - startTime.getTime();
let newTimeout = options.timeout - elapsedTime;
const result = yield promiseTimeout(newTimeout, this.read(), (info) => {
return ComProtocol.Errors.timeoutError({
msg: `Communication timeout. Read response from device timeout (${newTimeout}ms).`,
protocol: this,
timeout: newTimeout,
startTime: info.startTime,
});
});
return result;
})).pipe(share());
}
/**
* Cancel pending requests
*/
cancel() {
debug(TAG, `Canceling operations`);
this._jobQueue.cancelAll(ComProtocol.Errors.operationCanceled());
}
/**
*
* @param data
* @param options
*/
send(data, options) {
// debug(TAG, `QueueComProtocol`, `::send() ENQUEUE request (${data.length} bytes) ${toHexString(data)}. Queue position: ${this._queue.size}`);
if (true) {
// Copy data ? TODO can be removed ?
data = data.slice(0);
}
return this._jobQueue.addExecutor(() => {
let timeout = options ? options.timeout : this._options.send.timeout;
return this._send(data, {
timeout: timeout,
});
});
}
/**
* Connect with timeout
*
* If connect has already been called or is in progress / no further action
*
* @param options
*/
connect(options) {
if (this.connectionState === ConnectionState.CONNECTED) {
debug(TAG, `QueueComProtocol is already connected`);
return of(null);
}
if (this._connect$) {
debug(TAG, `QueueComProtocol is already connecting...`);
return this._connect$;
}
if (this._disconnect$) {
return throwError(ComProtocol.Errors.operationInProgress(`Failed to connect as disconnection is in progress`));
}
let connectTimeout = options
? options.timeout
: this._options.connect.timeout;
this._connect$ = defer(() => {
this.setConnectionState(ConnectionState.CONNECTING);
let startTime = new Date();
return this._connect(options).pipe(timeoutWith(connectTimeout, throwError(ComProtocol.Errors.timeoutError({
msg: 'Protocol connection timeout',
protocol: this,
timeout: connectTimeout,
startTime: startTime,
}))));
}).pipe(tap({
complete: () => {
this.setConnectionState(ConnectionState.CONNECTED);
},
error: () => {
this.setConnectionState(ConnectionState.DISCONNECTED);
},
}), finalize(() => {
this._connect$ = undefined;
}), share());
return this._connect$;
}
disconnect(options) {
if (this.connectionState === ConnectionState.DISCONNECTED) {
debug(TAG, `QueueComProtocol is already disconnected`);
return of();
}
if (this._disconnect$) {
return this._disconnect$;
}
if (this._connect$) {
return throwError(ComProtocol.Errors.operationInProgress(`Failed to disconnect as connection is in progress`));
}
let disconnectTimeout = options
? options.timeout
: this._options.disconnect.timeout;
this._disconnect$ = defer(() => __awaiter(this, void 0, void 0, function* () {
this.setConnectionState(ConnectionState.DISCONNECTING);
})).pipe(switchMap(() => {
let startTime = new Date();
return this._disconnect(options).pipe(timeoutWith(disconnectTimeout, throwError(ComProtocol.Errors.timeoutError({
msg: 'Protocol disconnection timeout',
protocol: this,
timeout: disconnectTimeout,
startTime: startTime,
}))), finalize(() => {
this.setConnectionState(ConnectionState.DISCONNECTED);
this._disconnect$ = undefined;
}));
}), share());
return this._disconnect$;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWUtY29tLXByb3RvY29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvdG9jb2wvY29yZS9zcmMvbGliL3F1ZXVlLWNvbS1wcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFDTCxXQUFXLEVBSVgsZUFBZSxHQUNoQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFnQixVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQztBQUUxQjs7R0FFRztBQUNILE1BQU0sT0FBZ0IsZ0JBQWlCLFNBQVEsbUJBQW1CO0lBNENoRTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFwQ00sS0FBSyxDQUNWLElBQWdCLEVBQ2hCLE9BQStCO1FBRS9CLE9BQU8sS0FBSyxDQUFDLEdBQVMsRUFBRTtZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUN2QixNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO29CQUNwQyxRQUFRLEVBQUUsSUFBSTtpQkFDZixDQUFDLENBQUM7YUFDSjtZQUNELElB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