@iotize/tap
Version:
IoTize Device client for Javascript
180 lines • 11.9 kB
JavaScript
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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