2020-02-28 17:45:57 +08:00
|
|
|
// @flow
|
|
|
|
|
2020-09-07 23:12:22 +08:00
|
|
|
import {Client as LiveClient} from 'rpc-websockets';
|
2020-09-08 13:12:47 +08:00
|
|
|
import EventEmitter from 'events';
|
|
|
|
|
|
|
|
type RpcRequest = {
|
|
|
|
method: string,
|
|
|
|
params?: Array<any>,
|
|
|
|
};
|
|
|
|
|
|
|
|
type RpcResponse = {
|
|
|
|
context: {
|
|
|
|
slot: number,
|
|
|
|
},
|
|
|
|
value: any,
|
|
|
|
};
|
2018-10-26 21:37:39 -07:00
|
|
|
|
2018-11-01 14:41:06 -07:00
|
|
|
// Define TEST_LIVE in the environment to test against the real full node
|
2018-10-26 21:37:39 -07:00
|
|
|
// identified by `url` instead of using the mock
|
2018-11-01 14:41:06 -07:00
|
|
|
export const mockRpcEnabled = !process.env.TEST_LIVE;
|
2018-10-26 21:37:39 -07:00
|
|
|
|
2020-09-08 13:12:47 +08:00
|
|
|
export const mockRpcSocket: Array<[RpcRequest, RpcResponse]> = [];
|
|
|
|
|
|
|
|
class MockClient extends EventEmitter {
|
|
|
|
mockOpen = false;
|
|
|
|
subscriptionCounter = 0;
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
super();
|
|
|
|
}
|
|
|
|
|
|
|
|
connect() {
|
|
|
|
if (!this.mockOpen) {
|
|
|
|
this.mockOpen = true;
|
|
|
|
this.emit('open');
|
|
|
|
}
|
|
|
|
}
|
2018-10-26 21:37:39 -07:00
|
|
|
|
2020-09-08 13:12:47 +08:00
|
|
|
close() {
|
|
|
|
if (this.mockOpen) {
|
|
|
|
this.mockOpen = false;
|
|
|
|
this.emit('close');
|
2018-10-26 21:37:39 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-08 13:12:47 +08:00
|
|
|
notify(): Promise<any> {
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
on(event: string, callback: Function): this {
|
|
|
|
return super.on(event, callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
call(method: string, params: Array<any>): Promise<Object> {
|
|
|
|
expect(mockRpcSocket.length).toBeGreaterThanOrEqual(1);
|
|
|
|
const [mockRequest, mockResponse] = mockRpcSocket.shift();
|
|
|
|
|
|
|
|
expect(method).toBe(mockRequest.method);
|
|
|
|
expect(params).toMatchObject(mockRequest.params);
|
|
|
|
|
|
|
|
let id = this.subscriptionCounter++;
|
|
|
|
const response = {
|
|
|
|
subscription: id,
|
|
|
|
result: mockResponse,
|
|
|
|
};
|
|
|
|
|
|
|
|
setImmediate(() => {
|
|
|
|
const eventName = method.replace('Subscribe', 'Notification');
|
|
|
|
this.emit(eventName, response);
|
|
|
|
});
|
|
|
|
|
|
|
|
return Promise.resolve(id);
|
2018-10-26 21:37:39 -07:00
|
|
|
}
|
|
|
|
}
|
2020-09-07 23:12:22 +08:00
|
|
|
|
|
|
|
const Client = mockRpcEnabled ? MockClient : LiveClient;
|
|
|
|
export {Client};
|