UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

180 lines 11.9 kB
import { ResultCode, } from '@iotize/tap/client/api'; import { TapApduRequestConverter, TapApduResponseConverter, TapClient, TapClientError, TapResponseFrameBuilder, } from '@iotize/tap/client/impl'; import { from, of, Subject, throwError } from 'rxjs'; import { delay, first, timeout } from 'rxjs/operators'; import { debug } from '../debug'; import { createMockProtocol } from './mock-protocol'; import { MockRouter } from './mock-router'; const TAG = 'MockClient'; export function createMockClient(options) { return new MockClient({ isConnected: !!(options === null || options === void 0 ? void 0 : options.connected), }); } export class MockClient extends TapClient { constructor(options = {}, router = new MockRouter()) { super(new TapApduRequestConverter(), new TapApduResponseConverter()); this.router = router; this.input = new Subject(); this.output = new Subject(); this.options = Object.assign(Object.assign({}, MockClient.DEFAULT_OPTIONS), options); } isConnected() { return this.options.isConnected; } // /** // * // * TOPO add support for parameters ? // * TODO use Shell Grammar instead ? // * // * @param map // */ // public static createFromMap(map: MappingType): MockClient { // const client = new MockClient(); // client.addRoutes(map); // return client; // } static createWithMockProtocol() { const client = new MockClient({ isConnected: false, }); client.addComProtocol(createMockProtocol()); return client; } connect() { const observable = of(undefined).pipe(delay(this.options.connect.delay)); observable.subscribe(() => { this.options.isConnected = true; }); return observable; } disconnect() { const observable = of(undefined).pipe(delay(this.options.disconnect.delay)); observable.subscribe(() => { this.options.isConnected = false; }); return observable; } mockResponse(tapResponse) { this.output.next(tapResponse); } request(request) { if (!this.isConnected()) { return throwError(TapClientError.notConnectedError()); } const responseP = this.output .pipe( // tap(event => console.log('EVENT', event)), first(), delay(this.options.command.delay), timeout(this.options.command.timeout)) .toPromise(); this.input.next(request); return from(responseP); } // /** // * @deprecated in favor of addRoute // * @param cmd // * @param response // */ // public mapCommandToResponse(cmd: Command, response: TapResponse<any>) { // return this.addRoute(cmd, response); // } // public addRoute<T>( // command: Command | string | RegExp | TapRequestFilter, // response: ResponseMapType // ): this { // debug( // TAG, // `\t- Mapping command ${command.toString()} to response ${response.toString()}` // ); // if (command instanceof RegExp) { // throw new Error( // `Route with regular expressions are not implemented yet` // ); // } else if (typeof command === 'string') { // command = Util.parseApiRequestString(command); // } // this.router.addRoute( // command, // this.createResponse(command, response) // ); // return this; // } // public addRoutes(map: MappingType): this { // for (const pathString in map) { // const info = map[pathString]; // const command: Command = Util.parseApiRequestString(pathString); // const response = this.createResponse(command, info); // this.addRoute(command, response); // } // return this; // } // public hasRoute(command: Command | string): boolean { // if (typeof command === 'string') { // command = Util.parseApiRequestString(command); // } // return this.router.findRoute(command) != undefined; // } // createResponse<T>( // command: Command | TapRequestFilter, // info: ResponseMapType // ): TapResponse<T> | ResponseAdapterFunction<any> { // let response: TapResponse<T>; // if (typeof info === 'number') { // response = TapResponse.create(info); // } else if (typeof info === 'string') { // response = new TapResponse(hexStringToBuffer(info)); // } else if (typeof info === 'object') { // if (info instanceof TapResponse) { // response = info; // } else { // response = TapResponse.create(typeof info.codeRet === 'number' ? info.codeRet : info.status); // (response as TapResponse<T>).setBody(info.body); // } // } else if (typeof info === 'function') { // if (command instanceof ApiRequest) { // response = info(command); // } else { // return (command: TapRequestFrame) => { // const response = info(command); // if (response instanceof ResponseImpl) { // response.setRequest(command); // } // return response; // }; // } // } else { // throw new Error( // `Invalid payload type from key ${command.toString()}` // ); // } // if (command instanceof ApiRequest && response instanceof ResponseImpl) { // response.setRequest(command); // } // return response; // } computeResponse(cmd) { const response = this.router.findRoute(cmd); if (response) { return response; } else { debug(TAG, `MockClient`, `command ${cmd} has not been mapped. Returning 404 not found`); return TapResponseFrameBuilder.ERROR(ResultCode.NOT_FOUND); } } } MockClient.DEFAULT_OPTIONS = { isConnected: false, connect: { delay: 100, }, disconnect: { delay: 100, }, command: { delay: 100, timeout: 500, }, encryption: true, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0aW5nL3NyYy9tb2NrL21vY2stY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxVQUFVLEdBSVgsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixTQUFTLEVBQ1QsY0FBYyxFQUNkLHVCQUF1QixHQUN4QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQztBQVl6QixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBaUM7SUFDaEUsT0FBTyxJQUFJLFVBQVUsQ0FBQztRQUNwQixXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFNBQVMsQ0FBQTtLQUNsQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBbUJELE1BQU0sT0FBTyxVQUFXLFNBQVEsU0FBUztJQTJCdkMsWUFDRSxVQUErQyxFQUFFLEVBQzFDLFNBQXFCLElBQUksVUFBVSxFQUFFO1FBRTVDLEtBQUssQ0FBQyxJQUFJLHVCQUF1QixFQUFFLEVBQUUsSUFBSSx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFGOUQsV0FBTSxHQUFOLE1BQU0sQ0FBK0I7UUFi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