UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

154 lines 12.7 kB
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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