diff --git a/.github/workflows/ci-green.yml b/.github/workflows/ci-green.yml new file mode 100644 index 0000000..5303282 --- /dev/null +++ b/.github/workflows/ci-green.yml @@ -0,0 +1,49 @@ +name: CI green + +on: + push: + branches: [main] + pull_request: + branches: [main] + merge_group: + types: [checks_requested] + +concurrency: + group: ${{ github.ref }} + cancel-in-progress: true + +env: + NODE_VERSION: '16.17.1' + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3.0.2 + - name: Setup node + uses: actions/setup-node@v3.4.1 + with: + node-version: ${{ env.NODE_VERSION }} + cache: yarn + - uses: actions/cache@v2 + with: + path: '**/node_modules' + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + - name: Install dependencies + run: yarn install --frozen-lockfile + - name: Run linters + run: | + yarn lint + yarn typescript:check + yarn prettier:check + yarn test + + ci-pass: + name: CI is green + runs-on: ubuntu-latest + needs: + - test + + steps: + - run: exit 0 diff --git a/package.json b/package.json index b09e63e..8380ea8 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,9 @@ "build": "tsc", "format": "prettier --write \"src/**/*.ts\" \"src/**/*.js\"", "lint": "tslint -p tsconfig.json", + "typescript:check": "tsc", + "prettier:check": "prettier --check ./src", + "prettier:format": "prettier --write \"src/**/*.ts\"", "typedoc": "typedoc" }, "dependencies": { diff --git a/src/commands/get-version.ts b/src/commands/get-version.ts index 9c167cd..3426bc2 100644 --- a/src/commands/get-version.ts +++ b/src/commands/get-version.ts @@ -1,5 +1,5 @@ import TransportBLE from '@ledgerhq/react-native-hw-transport-ble'; export const getVersion = async (transport: TransportBLE) => { - return await transport.send(0xe0, 0x01, 0x00, 0x00) -} + return await transport.send(0xe0, 0x01, 0x00, 0x00); +}; diff --git a/src/commands/list-apps.ts b/src/commands/list-apps.ts index 096a61b..8dc9d41 100644 --- a/src/commands/list-apps.ts +++ b/src/commands/list-apps.ts @@ -6,7 +6,7 @@ export type App = { hashCodeData: string; blocks: number; flags: number; -} +}; export const listApps = async (transport: TransportBLE) => { const payload = await transport.send(0xe0, 0xde, 0, 0); @@ -16,7 +16,7 @@ export const listApps = async (transport: TransportBLE) => { // more than the status bytes while (data.length > 2) { if (payload[0] !== 0x01) { - throw new Error("unknown listApps format"); + throw new Error('unknown listApps format'); } let i = 1; @@ -28,18 +28,18 @@ export const listApps = async (transport: TransportBLE) => { i += 2; const flags = data.readUInt16BE(i); i += 2; - const hashCodeData = data.slice(i, i + 32).toString("hex"); + const hashCodeData = data.slice(i, i + 32).toString('hex'); i += 32; - const hash = data.slice(i, i + 32).toString("hex"); + const hash = data.slice(i, i + 32).toString('hex'); i += 32; const nameLength = data[i]; i++; if (length !== nameLength + 70) { - throw new Error("invalid listApps length data"); + throw new Error('invalid listApps length data'); } - const name = data.slice(i, i + nameLength).toString("ascii"); + const name = data.slice(i, i + nameLength).toString('ascii'); i += nameLength; apps.push({ name, diff --git a/src/commands/quit-app.ts b/src/commands/quit-app.ts index 180b88d..ccd3bff 100644 --- a/src/commands/quit-app.ts +++ b/src/commands/quit-app.ts @@ -2,4 +2,4 @@ import TransportBLE from '@ledgerhq/react-native-hw-transport-ble'; export const quitApp = async (transport: TransportBLE) => { await transport.send(0xb0, 0xa7, 0x00, 0x00); -} +}; diff --git a/src/commands/suggest-app.ts b/src/commands/suggest-app.ts index e9629cc..b2d785d 100644 --- a/src/commands/suggest-app.ts +++ b/src/commands/suggest-app.ts @@ -21,11 +21,9 @@ export const suggestApp = async ( await openApp(transport, name); } } catch (err) { - console.error('suggestApp', err); - - //@ts-ignore - if(err instanceof Error && !!err.statusCode){ - throw err + // @ts-ignore + if (err instanceof Error && !!err.statusCode) { + throw err; } } }; diff --git a/src/get-ble-manager.ts b/src/get-ble-manager.ts index 9987f2f..927a9d2 100644 --- a/src/get-ble-manager.ts +++ b/src/get-ble-manager.ts @@ -1,11 +1,11 @@ import {BleManager} from 'react-native-ble-plx'; -let bleManager: BleManager | null = null +let bleManager: BleManager | null = null; export function getBleManager(): BleManager { if (!bleManager) { bleManager = new BleManager(); } - return bleManager! + return bleManager!; } diff --git a/src/get-device-connection.ts b/src/get-device-connection.ts index 54ea1a3..b9b7eaa 100644 --- a/src/get-device-connection.ts +++ b/src/get-device-connection.ts @@ -1,7 +1,7 @@ import {State} from 'react-native-ble-plx'; import {getBleManager} from './get-ble-manager'; -const cache = new Map() +const cache = new Map(); const connectOptions = { requestMTU: 156, @@ -16,12 +16,9 @@ export async function getDeviceConnection(deviceId: string) { throw new Error(`not_connected ${state}`); } if (!cache.has(deviceId)) { - const result = await bleManager.connectToDevice( - deviceId, - connectOptions, - ); + const result = await bleManager.connectToDevice(deviceId, connectOptions); - if(result) { + if (result) { cache.set(deviceId, result); } } @@ -38,5 +35,5 @@ export async function getDeviceConnection(deviceId: string) { await device.connect(); } - return device + return device; } diff --git a/src/provider.ts b/src/provider.ts index 7240cd7..99e38d7 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -4,7 +4,7 @@ import { stringToUtf8Bytes, BytesLike, Provider, - ProviderInterface + ProviderInterface, } from '@haqq/provider-base'; import AppEth, {ledgerService} from '@ledgerhq/hw-app-eth'; import TransportBLE from '@ledgerhq/react-native-hw-transport-ble'; @@ -12,18 +12,21 @@ import {utils, UnsignedTransaction} from 'ethers'; import {suggestApp} from './commands'; import {getDeviceConnection} from './get-device-connection'; import {sleep} from './sleep'; -import {ProviderLedgerReactNativeOptions,} from './types'; +import {ProviderLedgerReactNativeOptions} from './types'; -export class ProviderLedgerReactNative extends Provider implements ProviderInterface { +export class ProviderLedgerReactNative + extends Provider + implements ProviderInterface +{ public stop: boolean = false; - private _transport: TransportBLE | null = null + private _transport: TransportBLE | null = null; getIdentifier(): string { - return this._options.deviceId + return this._options.deviceId; } async getAccountInfo(hdPath: string) { - let resp = {publicKey: '', address: ''} + let resp = {publicKey: '', address: ''}; try { this.stop = false; @@ -42,21 +45,19 @@ export class ProviderLedgerReactNative extends Provider { - let resp = '' + async signPersonalMessage( + hdPath: string, + message: string | BytesLike, + ): Promise { + let resp = ''; try { this.stop = false; const transport = await this.awaitForTransport(this._options.deviceId); @@ -115,8 +123,13 @@ export class ProviderLedgerReactNative extends Provider { canceled = true; - } - - if(_taskId){ - this.once(stopTaskEventName, handleStopTask) + }; + + if (_taskId) { + this.once(stopTaskEventName, handleStopTask); } while (!this._transport && !this.stop && attempts < 150) { - if(canceled){ - throw new Error('canceled') + if (canceled) { + throw new Error('canceled'); } try { @@ -221,19 +238,19 @@ export class ProviderLedgerReactNative extends Provider { @@ -241,7 +258,7 @@ export class ProviderLedgerReactNative extends Provider { if (e.type === 'add') { - emitter.emit('device', e.descriptor) + emitter.emit('device', e.descriptor); } }, error: e => { @@ -31,7 +31,7 @@ export function scanDevices() { } catch (e) { emitter.emit('error', e); } - } + }; return { start() { @@ -50,7 +50,7 @@ export function scanDevices() { listen(); }, stop() { - if(sub) { + if (sub) { sub.unsubscribe(); } if (transport) { @@ -58,6 +58,6 @@ export function scanDevices() { } }, on: emitter.on.bind(emitter), - off: emitter.off.bind(emitter) - } + off: emitter.off.bind(emitter), + }; } diff --git a/src/try-to-init-bt.ts b/src/try-to-init-bt.ts index 06d7c31..d7f3c9b 100644 --- a/src/try-to-init-bt.ts +++ b/src/try-to-init-bt.ts @@ -21,9 +21,9 @@ export async function tryToInitBt(): Promise> { previousState = state; observer.next(state); } - } + }; manager.state().then(subs); sub = manager.onStateChange(subs, true); - }) + }); } diff --git a/src/types.ts b/src/types.ts index f380889..642e697 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,11 +1,11 @@ export type Device = { - id: string + id: string; /** * Device name if present */ - name: string | null -} + name: string | null; +}; export enum State { /** @@ -31,10 +31,10 @@ export enum State { /** * Bluetooth is currently powered on and available to use. */ - PoweredOn = 'PoweredOn' + PoweredOn = 'PoweredOn', } export type ProviderLedgerReactNativeOptions = { deviceId: string; appName?: string; -} +};