Skip to content

Commit

Permalink
Add claim/release logic to ledger web usb transport
Browse files Browse the repository at this point in the history
  • Loading branch information
harshjv committed Mar 20, 2019
1 parent 2aecd29 commit 90bbd1b
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 12 deletions.
17 changes: 10 additions & 7 deletions examples/browser/bitcoin/ledger.html
Expand Up @@ -5,16 +5,18 @@
</head>
<body>
<h1>CAL + Ledger: Sign a message (Bitcoin)</h1>
<button id="init">Initate</button>
<p>From: <span id="address"></span></p>
<p>Message: <input type="text" id="message"/> <button id="sign">Sign</button></p>
<p>Result: <span id="result"></span></p>
<p><code>For errors and logs, check console</code></p>
<script>
/* global $, ChainAbstractionLayer */
const { Client, providers } = ChainAbstractionLayer
const networks = providers.bitcoin.networks
const bitcoin = new Client()
bitcoin.addProvider(new providers.bitcoin.BitcoinLedgerProvider({ network: networks.bitcoin_testnet }))
<script>
/* global $, ChainAbstractionLayer */
const { Client, providers } = ChainAbstractionLayer
const networks = providers.bitcoin.networks
const bitcoin = new Client()
bitcoin.addProvider(new providers.bitcoin.BitcoinLedgerProvider({ network: networks.bitcoin_testnet }))
$('#init').click(() => {
bitcoin.getAddresses().then(addresses => {
const from = addresses[0].address
$('#address').text(from)
Expand All @@ -25,6 +27,7 @@ <h1>CAL + Ledger: Sign a message (Bitcoin)</h1>
})
})
})
</script>
})
</script>
</body>
</html>
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -24,7 +24,7 @@
"author": "Liquality <info@liquality.io>",
"module": "src/index.js",
"browser": {
"@ledgerhq/hw-transport-node-hid": "@ledgerhq/hw-transport-webusb"
"@ledgerhq/hw-transport-node-hid": "./src/providers/LedgerWebTransport.js"
},
"main": "dist/index.cjs.js",
"files": [
Expand Down
23 changes: 22 additions & 1 deletion src/providers/LedgerProvider.js
Expand Up @@ -7,6 +7,19 @@ export default class LedgerProvider extends WalletProvider {
return Transport.isSupported()
}

async claimLedgerInterface () {
if (this._webUsbDevice) {
if (this._webUsbDevice.configuration.interfaces[2].claimed) return
await this._webUsbDevice.claimInterface(2)
}
}

async releaseLedgerInterface () {
if (this._webUsbDevice) {
await this._webUsbDevice.releaseInterface(2)
}
}

constructor (App, baseDerivationPath, network, ledgerScrambleKey) {
super(network)

Expand All @@ -24,8 +37,15 @@ export default class LedgerProvider extends WalletProvider {
LedgerProvider.transport = await Transport.create()
LedgerProvider.transport.on('disconnect', () => {
this._appInstance = null
this._webUsbDevice = null
LedgerProvider.transport = null
})

if (Transport.isWebUSBTransport) {
this._webUsbDevice = LedgerProvider.transport.device
}
} else {
await this.claimLedgerInterface()
}
}

Expand All @@ -35,6 +55,7 @@ export default class LedgerProvider extends WalletProvider {
return async (...args) => {
try {
const result = await method.bind(target)(...args)
await this.releaseLedgerInterface()
return result
} catch (e) {
const { name, ...errorNoName } = e
Expand All @@ -55,7 +76,7 @@ export default class LedgerProvider extends WalletProvider {
}

if (!this._appInstance) {
this._appInstance = new Proxy(new this._App(LedgerProvider.transport), { get: this.errorProxy })
this._appInstance = new Proxy(new this._App(LedgerProvider.transport), { get: this.errorProxy.bind(this) })
}

return this._appInstance
Expand Down
7 changes: 7 additions & 0 deletions src/providers/LedgerWebTransport.js
@@ -0,0 +1,7 @@
import WebUSBTransport from '@ledgerhq/hw-transport-webusb'

class LedgerWebTransport extends WebUSBTransport {}

LedgerWebTransport.isWebUSBTransport = true

export default LedgerWebTransport

0 comments on commit 90bbd1b

Please sign in to comment.