@ledgerhq/device-transport-kit-web-ble 0.0.0-legacy-speculos-datasource-20250821095840 → 0.0.0-multisig-20250822145545
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/api/data/WebBleConfig.js +1 -1
- package/lib/esm/api/data/WebBleConfig.js.map +3 -3
- package/lib/esm/api/transport/BleDeviceConnection.js +2 -0
- package/lib/esm/api/transport/BleDeviceConnection.js.map +7 -0
- package/lib/esm/api/transport/BleDeviceConnection.test.js +2 -0
- package/lib/esm/api/transport/BleDeviceConnection.test.js.map +7 -0
- package/lib/esm/api/transport/WebBleTransport.js +1 -1
- package/lib/esm/api/transport/WebBleTransport.js.map +3 -3
- package/lib/esm/api/transport/WebBleTransport.test.js +1 -1
- package/lib/esm/api/transport/WebBleTransport.test.js.map +3 -3
- package/lib/types/api/data/WebBleConfig.d.ts +1 -3
- package/lib/types/api/data/WebBleConfig.d.ts.map +1 -1
- package/lib/types/api/transport/BleDeviceConnection.d.ts +98 -0
- package/lib/types/api/transport/BleDeviceConnection.d.ts.map +1 -0
- package/lib/types/api/transport/BleDeviceConnection.test.d.ts +2 -0
- package/lib/types/api/transport/BleDeviceConnection.test.d.ts.map +1 -0
- package/lib/types/api/transport/WebBleTransport.d.ts +76 -21
- package/lib/types/api/transport/WebBleTransport.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/lib/esm/api/transport/WebBleApduSender.js +0 -2
- package/lib/esm/api/transport/WebBleApduSender.js.map +0 -7
- package/lib/esm/api/transport/WebBleApduSender.test.js +0 -2
- package/lib/esm/api/transport/WebBleApduSender.test.js.map +0 -7
- package/lib/types/api/transport/WebBleApduSender.d.ts +0 -34
- package/lib/types/api/transport/WebBleApduSender.d.ts.map +0 -1
- package/lib/types/api/transport/WebBleApduSender.test.d.ts +0 -2
- package/lib/types/api/transport/WebBleApduSender.test.d.ts.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/device-transport-kit-web-ble",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-multisig-20250822145545",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"private": false,
|
|
6
6
|
"exports": {
|
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/uuid": "^10.0.0",
|
|
23
23
|
"@types/web-bluetooth": "^0.0.20",
|
|
24
|
-
"rxjs": "
|
|
24
|
+
"rxjs": "7.8.2",
|
|
25
25
|
"ts-node": "10.9.2",
|
|
26
|
-
"@ledgerhq/device-management-kit": "0.0.0-
|
|
26
|
+
"@ledgerhq/device-management-kit": "0.0.0-multisig-20250822145545",
|
|
27
27
|
"@ledgerhq/ldmk-tool": "0.0.1",
|
|
28
28
|
"@ledgerhq/eslint-config-dsdk": "0.0.2",
|
|
29
29
|
"@ledgerhq/prettier-config-dsdk": "0.0.2",
|
|
30
|
-
"@ledgerhq/
|
|
31
|
-
"@ledgerhq/
|
|
30
|
+
"@ledgerhq/tsconfig-dsdk": "1.0.1",
|
|
31
|
+
"@ledgerhq/vitest-config-dmk": "0.0.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"rxjs": "
|
|
35
|
-
"@ledgerhq/device-management-kit": "0.0.0-
|
|
34
|
+
"rxjs": "7.8.2",
|
|
35
|
+
"@ledgerhq/device-management-kit": "0.0.0-multisig-20250822145545"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"prebuild": "rimraf lib",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{DeviceDisconnectedWhileSendingError as n}from"@ledgerhq/device-management-kit";import{Left as o,Maybe as r,Right as d}from"purify-ts";import{BehaviorSubject as p}from"rxjs";class h{_characteristics;_apduSender=r.empty();_apduSenderFactory;_apduReceiver;_logger;_isDeviceReady=new p(!1);_sendResolver=r.empty();_notificationsActive=!1;_apduReceiverFactory;_mtuHandshakeInFlight=!1;static MTU_OP=8;constructor(e,t){this._characteristics={writeCharacteristic:e.writeCharacteristic,notifyCharacteristic:e.notifyCharacteristic},this._apduSenderFactory=e.apduSenderFactory,this._apduReceiverFactory=e.apduReceiverFactory,this._apduReceiver=e.apduReceiverFactory(),this._logger=t("WebBleApduSender")}_failPendingSend(e){this._sendResolver.map(t=>t(o(e))),this._sendResolver=r.empty()}_handleNotify=e=>{const t=e.target;if(!t.value)return;const i=new Uint8Array(t.value.buffer);if(this._isDeviceReady.value)this._onReceiveApdu(i);else{if(!this._mtuHandshakeInFlight){this._logger.debug("Dropping pre-handshake frame",{data:{data:i}});return}if(i.length<6||i[0]!==h.MTU_OP){this._logger.debug("Non-MTU frame during handshake; dropping",{data:{data:i}});return}this._onReceiveSetup(i)}};_onReceiveSetup(e){const t=e[5];if(typeof t!="number"||t<=0)throw new Error("MTU negotiation failed: invalid MTU");this._apduSender=r.of(this._apduSenderFactory({frameSize:t})),this._isDeviceReady.next(!0)}_onReceiveApdu(e){this._apduReceiver.handleFrame(e).map(t=>t.map(i=>{this._logger.debug("Received APDU",{data:{resp:i}}),this._sendResolver.map(a=>a(d(i))),this._sendResolver=r.empty()})).mapLeft(t=>{this._sendResolver.map(i=>i(o(t))),this._sendResolver=r.empty()})}async _write(e){const t=this._characteristics.writeCharacteristic.properties;if(t.write)await this._characteristics.writeCharacteristic.writeValueWithResponse(e);else if(t.writeWithoutResponse)await this._characteristics.writeCharacteristic.writeValueWithoutResponse(e);else try{await this._characteristics.writeCharacteristic.writeValueWithResponse(e)}catch{await this._characteristics.writeCharacteristic.writeValueWithoutResponse(e)}}async setupConnection(){const e=this._characteristics.notifyCharacteristic;this._notificationsActive||(await e.startNotifications(),this._notificationsActive=!0,e.addEventListener("characteristicvaluechanged",this._handleNotify)),this._mtuHandshakeInFlight=!0;const t=new Uint8Array([h.MTU_OP,0,0,0,0]);try{await this._write(t.buffer),await Promise.race([new Promise((i,a)=>{const c=this._isDeviceReady.subscribe({next:s=>{s&&(c.unsubscribe(),i())},error:s=>{c.unsubscribe(),a(s)}})}),new Promise((i,a)=>setTimeout(()=>a(new Error("MTU negotiation timeout")),2e3))])}catch(i){try{e.removeEventListener("characteristicvaluechanged",this._handleNotify),await e.stopNotifications().catch(()=>{})}finally{this._notificationsActive=!1,this._isDeviceReady.next(!1),this._apduSender=r.empty()}throw i}finally{this._mtuHandshakeInFlight=!1}}async sendApdu(e,t,i){if(this._apduSender.isNothing())return o(new n("Link not ready (no MTU / sender)"));const a=new Promise(c=>{this._sendResolver=r.of(c)});for(const c of this._apduSender.map(s=>s.getFrames(e)).orDefault([]))try{await this._write(c.getRawData().buffer)}catch(s){this._logger.error("Frame write failed",{data:{e:s}}),this._failPendingSend(new n("Write failed"));break}return a}closeConnection(){try{this._failPendingSend(new n("Connection closed")),this._notificationsActive&&(this._characteristics.notifyCharacteristic.removeEventListener("characteristicvaluechanged",this._handleNotify),this._characteristics.notifyCharacteristic.stopNotifications().catch(()=>{}),this._notificationsActive=!1),this._characteristics.notifyCharacteristic.service.device.gatt?.disconnect()}catch{this._logger.error("Failed to disconnect from device")}}getDependencies(){return this._characteristics}async setDependencies(e){const t=this._characteristics.notifyCharacteristic;if(this._failPendingSend(new n("Link changed")),this._notificationsActive&&t.service.device.gatt?.connected)try{await t.stopNotifications()}catch{this._logger.warn("Failed to stop notifications on old characteristic")}t.removeEventListener("characteristicvaluechanged",this._handleNotify),this._notificationsActive=!1,this._characteristics=e,this._apduReceiver=this._apduReceiverFactory(),this._isDeviceReady.next(!1),this._apduSender=r.empty(),this._sendResolver=r.empty(),await e.notifyCharacteristic.startNotifications(),this._notificationsActive=!0,e.notifyCharacteristic.addEventListener("characteristicvaluechanged",this._handleNotify)}}export{h as WebBleApduSender};
|
|
2
|
-
//# sourceMappingURL=WebBleApduSender.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/api/transport/WebBleApduSender.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type ApduReceiverServiceFactory,\n type ApduResponse,\n type ApduSenderServiceFactory,\n type DeviceApduSender,\n DeviceDisconnectedWhileSendingError,\n type DmkError,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Maybe, Right } from \"purify-ts\";\nimport { BehaviorSubject } from \"rxjs\";\n\nexport type WebBleApduSenderDependencies = {\n writeCharacteristic: BluetoothRemoteGATTCharacteristic;\n notifyCharacteristic: BluetoothRemoteGATTCharacteristic;\n};\n\nexport class WebBleApduSender\n implements DeviceApduSender<WebBleApduSenderDependencies>\n{\n private _characteristics: WebBleApduSenderDependencies;\n private _apduSender: Maybe<ReturnType<ApduSenderServiceFactory>> =\n Maybe.empty();\n private _apduSenderFactory: ApduSenderServiceFactory;\n private _apduReceiver: ReturnType<ApduReceiverServiceFactory>;\n private _logger: LoggerPublisherService;\n private _isDeviceReady = new BehaviorSubject<boolean>(false);\n private _sendResolver: Maybe<\n (result: Either<DmkError, ApduResponse>) => void\n > = Maybe.empty();\n private _notificationsActive = false;\n private _apduReceiverFactory: ApduReceiverServiceFactory;\n private _mtuHandshakeInFlight = false;\n private static readonly MTU_OP = 0x08; // adjust to your proto\n\n constructor(\n deps: WebBleApduSenderDependencies & {\n apduSenderFactory: ApduSenderServiceFactory;\n apduReceiverFactory: ApduReceiverServiceFactory;\n },\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this._characteristics = {\n writeCharacteristic: deps.writeCharacteristic,\n notifyCharacteristic: deps.notifyCharacteristic,\n };\n this._apduSenderFactory = deps.apduSenderFactory;\n this._apduReceiverFactory = deps.apduReceiverFactory;\n this._apduReceiver = deps.apduReceiverFactory();\n this._logger = loggerFactory(\"WebBleApduSender\");\n }\n\n private _failPendingSend(err: DmkError) {\n this._sendResolver.map((r) => r(Left(err)));\n this._sendResolver = Maybe.empty();\n }\n\n private _handleNotify = (event: Event) => {\n const characteristic = event.target as BluetoothRemoteGATTCharacteristic;\n if (!characteristic.value) return;\n const data = new Uint8Array(characteristic.value.buffer);\n\n if (!this._isDeviceReady.value) {\n if (!this._mtuHandshakeInFlight) {\n this._logger.debug(\"Dropping pre-handshake frame\", { data: { data } });\n return;\n }\n if (data.length < 6 || data[0] !== WebBleApduSender.MTU_OP) {\n this._logger.debug(\"Non-MTU frame during handshake; dropping\", {\n data: { data },\n });\n return;\n }\n this._onReceiveSetup(data);\n } else {\n this._onReceiveApdu(data);\n }\n };\n\n private _onReceiveSetup(mtuResponseBuffer: Uint8Array) {\n const negotiatedMtu = mtuResponseBuffer[5]; // adjust if MTU is 16-bit in your proto\n if (typeof negotiatedMtu !== \"number\" || negotiatedMtu <= 0) {\n throw new Error(\"MTU negotiation failed: invalid MTU\");\n }\n this._apduSender = Maybe.of(\n this._apduSenderFactory({ frameSize: negotiatedMtu }),\n );\n this._isDeviceReady.next(true);\n }\n\n private _onReceiveApdu(incomingFrame: Uint8Array) {\n this._apduReceiver\n .handleFrame(incomingFrame)\n .map((respOpt) =>\n respOpt.map((resp) => {\n this._logger.debug(\"Received APDU\", { data: { resp } });\n this._sendResolver.map((r) => r(Right(resp)));\n this._sendResolver = Maybe.empty();\n }),\n )\n .mapLeft((err) => {\n this._sendResolver.map((r) => r(Left(err)));\n this._sendResolver = Maybe.empty();\n });\n }\n\n private async _write(buf: ArrayBuffer) {\n const props = this._characteristics.writeCharacteristic.properties;\n if (props.write) {\n await this._characteristics.writeCharacteristic.writeValueWithResponse(\n buf,\n );\n } else if (props.writeWithoutResponse) {\n await this._characteristics.writeCharacteristic.writeValueWithoutResponse(\n buf,\n );\n } else {\n // fallback to trying with response, then without\n try {\n await this._characteristics.writeCharacteristic.writeValueWithResponse(\n buf,\n );\n } catch {\n await this._characteristics.writeCharacteristic.writeValueWithoutResponse(\n buf,\n );\n }\n }\n }\n\n public async setupConnection(): Promise<void> {\n const notifyChar = this._characteristics.notifyCharacteristic;\n\n if (!this._notificationsActive) {\n await notifyChar.startNotifications();\n this._notificationsActive = true;\n notifyChar.addEventListener(\n \"characteristicvaluechanged\",\n this._handleNotify,\n );\n }\n\n this._mtuHandshakeInFlight = true;\n const mtuReq = new Uint8Array([WebBleApduSender.MTU_OP, 0, 0, 0, 0]);\n\n try {\n await this._write(mtuReq.buffer);\n\n await Promise.race([\n new Promise<void>((res, rej) => {\n const sub = this._isDeviceReady.subscribe({\n next: (ready) => {\n if (ready) {\n sub.unsubscribe();\n res();\n }\n },\n error: (e) => {\n sub.unsubscribe();\n rej(e);\n },\n });\n }),\n new Promise<void>((_, rej) =>\n setTimeout(() => rej(new Error(\"MTU negotiation timeout\")), 2000),\n ),\n ]);\n } catch (e) {\n try {\n notifyChar.removeEventListener(\n \"characteristicvaluechanged\",\n this._handleNotify,\n );\n await notifyChar.stopNotifications().catch(() => {});\n } finally {\n this._notificationsActive = false;\n this._isDeviceReady.next(false);\n this._apduSender = Maybe.empty();\n }\n throw e;\n } finally {\n this._mtuHandshakeInFlight = false;\n }\n }\n\n public async sendApdu(\n apdu: Uint8Array,\n _triggersDisconnection?: boolean,\n _abortTimeout?: number,\n ): Promise<Either<DmkError, ApduResponse>> {\n if (this._apduSender.isNothing()) {\n return Left(\n new DeviceDisconnectedWhileSendingError(\n \"Link not ready (no MTU / sender)\",\n ) as unknown as DmkError,\n );\n }\n\n const promise = new Promise<Either<DmkError, ApduResponse>>((resolve) => {\n this._sendResolver = Maybe.of(resolve);\n });\n\n for (const frame of this._apduSender\n .map((s) => s.getFrames(apdu))\n .orDefault([])) {\n try {\n await this._write(frame.getRawData().buffer);\n } catch (e) {\n this._logger.error(\"Frame write failed\", { data: { e } });\n this._failPendingSend(\n new DeviceDisconnectedWhileSendingError(\"Write failed\"),\n );\n break;\n }\n }\n\n return promise;\n }\n\n public closeConnection(): void {\n try {\n this._failPendingSend(\n new DeviceDisconnectedWhileSendingError(\"Connection closed\"),\n );\n\n if (this._notificationsActive) {\n this._characteristics.notifyCharacteristic.removeEventListener(\n \"characteristicvaluechanged\",\n this._handleNotify,\n );\n this._characteristics.notifyCharacteristic\n .stopNotifications()\n .catch(() => {});\n this._notificationsActive = false;\n }\n this._characteristics.notifyCharacteristic.service.device.gatt?.disconnect();\n } catch {\n this._logger.error(\"Failed to disconnect from device\");\n }\n }\n\n public getDependencies(): WebBleApduSenderDependencies {\n return this._characteristics;\n }\n\n public async setDependencies(\n deps: WebBleApduSenderDependencies,\n ): Promise<void> {\n const oldNotify = this._characteristics.notifyCharacteristic;\n\n // fail any in-flight APDU before swapping the link\n this._failPendingSend(\n new DeviceDisconnectedWhileSendingError(\"Link changed\"),\n );\n\n if (this._notificationsActive && oldNotify.service.device.gatt?.connected) {\n try {\n await oldNotify.stopNotifications();\n } catch {\n this._logger.warn(\"Failed to stop notifications on old characteristic\");\n }\n }\n oldNotify.removeEventListener(\n \"characteristicvaluechanged\",\n this._handleNotify,\n );\n this._notificationsActive = false;\n\n // Swap in new characteristics\n this._characteristics = deps;\n\n // Reset parsing/sending state across reconnect\n this._apduReceiver = this._apduReceiverFactory(); // fresh deframer\n this._isDeviceReady.next(false);\n this._apduSender = Maybe.empty();\n this._sendResolver = Maybe.empty();\n\n // Bind notifications for the new characteristic\n await deps.notifyCharacteristic.startNotifications();\n this._notificationsActive = true;\n deps.notifyCharacteristic.addEventListener(\n \"characteristicvaluechanged\",\n this._handleNotify,\n );\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["DeviceDisconnectedWhileSendingError", "Left", "Maybe", "Right", "BehaviorSubject", "WebBleApduSender", "deps", "loggerFactory", "err", "r", "event", "characteristic", "data", "mtuResponseBuffer", "negotiatedMtu", "incomingFrame", "respOpt", "resp", "buf", "props", "notifyChar", "mtuReq", "res", "rej", "sub", "ready", "e", "_", "apdu", "_triggersDisconnection", "_abortTimeout", "promise", "resolve", "frame", "oldNotify"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{Maybe as A,Right as R}from"purify-ts";import{afterEach as E,beforeEach as k,describe as B,expect as n,it as o,vi as t}from"vitest";import{WebBleApduSender as V}from"./WebBleApduSender";class L{subscribers=[];tag;constructor(r,i){this.subscribers=r,this.tag=i}debug=t.fn();info=t.fn();warn=t.fn();error=t.fn()}function d(){const e=t.fn(),r=t.fn().mockResolvedValue(void 0);return{service:{device:{gatt:{connected:!0,disconnect:e}}},uuid:"mock-uuid",properties:{broadcast:!1,read:!1,writeWithoutResponse:!1,write:!1,notify:!1,indicate:!1,authenticatedSignedWrites:!1,reliableWrite:!1,writableAuxiliaries:!1},getDescriptor:t.fn().mockResolvedValue(void 0),getDescriptors:t.fn().mockResolvedValue([]),startNotifications:t.fn().mockResolvedValue(void 0),addEventListener:t.fn(),removeEventListener:t.fn(),stopNotifications:r,writeValueWithResponse:t.fn().mockResolvedValue(void 0),writeValueWithoutResponse:t.fn().mockResolvedValue(void 0),readValue:t.fn().mockResolvedValue(new DataView(new ArrayBuffer(0))),writeValue:t.fn().mockResolvedValue(void 0),dispatchEvent:t.fn(),oncharacteristicvaluechanged:null}}let u,a,g,m,y,s;const h=()=>new Promise(e=>setImmediate(e));k(()=>{u=d(),a=d(),g=t.fn().mockReturnValue({getFrames:e=>[{getRawData:()=>new DataView(e.buffer)}]}),m=t.fn().mockReturnValue({handleFrame:t.fn(e=>R(A.of({data:new Uint8Array([144,0])})))}),y=e=>new L([],e),s=new V({writeCharacteristic:u,notifyCharacteristic:a,apduSenderFactory:g,apduReceiverFactory:m},y)});E(()=>{t.restoreAllMocks()});B("WebBleApduSender",()=>{o("getDependencies returns initial chars",()=>{const e=s.getDependencies();n(e.writeCharacteristic).toBe(u),n(e.notifyCharacteristic).toBe(a)}),o("setupConnection negotiates MTU and listens",async()=>{const e=s.setupConnection();n(a.startNotifications).toHaveBeenCalled(),await h();const i=a.addEventListener.mock.calls.filter(([l])=>l==="characteristicvaluechanged")[0];if(!i)throw new Error("No event registered for 'characteristicvaluechanged'");const c=i[1],f=new Uint8Array([0,0,0,0,0,32]).buffer;c({target:{value:{buffer:f}}}),await n(e).resolves.toBeUndefined()}),o("sendApdu writes frames and resolves on notification",async()=>{const e=s.setupConnection();await h();const r=a.addEventListener.mock.calls.find(([v])=>v==="characteristicvaluechanged");if(!r)throw new Error("No event registered for 'characteristicvaluechanged'");const i=r[1];i({target:{value:{buffer:new Uint8Array([0,0,0,0,0,32]).buffer}}}),await e;const c=new Uint8Array([1,2,3]),f=s.sendApdu(c);n(u.writeValueWithResponse).toHaveBeenCalledWith(c.buffer),await h();const l=a.addEventListener.mock.calls.filter(([v])=>v==="characteristicvaluechanged"),p=l[l.length-1];if(!p)throw new Error("No APDU handler registered.");const[,C]=p,b=new Uint8Array([144,0]).buffer;C({target:{value:{buffer:b}}});const w=await f;n(w.isRight()).toBe(!0),n(w.extract().data).toEqual(new Uint8Array([144,0]))}),o("closeConnection calls disconnect",()=>{s.closeConnection(),n(a.service.device.gatt.disconnect).toHaveBeenCalled()}),o("setDependencies swaps characteristics",async()=>{const e=d(),r=d();a.service.device.gatt.connected=!0,await s.setDependencies({writeCharacteristic:r,notifyCharacteristic:e}),n(a.removeEventListener).toHaveBeenCalled(),n(e.startNotifications).toHaveBeenCalled(),n(e.addEventListener).toHaveBeenCalledWith("characteristicvaluechanged",n.any(Function));const i=s.getDependencies();n(i.notifyCharacteristic).toBe(e),n(i.writeCharacteristic).toBe(r)})});
|
|
2
|
-
//# sourceMappingURL=WebBleApduSender.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/api/transport/WebBleApduSender.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n type ApduReceiverServiceFactory,\n type ApduResponse,\n type ApduSenderServiceFactory,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { Maybe, Right } from \"purify-ts\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { WebBleApduSender } from \"./WebBleApduSender\";\n\ntype EventListener = (event: Event) => void;\nclass LoggerStub implements LoggerPublisherService {\n subscribers: any[] = [];\n tag: string;\n constructor(subs: any[], tag: string) {\n this.subscribers = subs;\n this.tag = tag;\n }\n debug = vi.fn();\n info = vi.fn();\n warn = vi.fn();\n error = vi.fn();\n}\n\nfunction makeCharacteristic() {\n const disconnect = vi.fn();\n const stopNotifications = vi.fn().mockResolvedValue(undefined);\n return {\n service: { device: { gatt: { connected: true, disconnect } } },\n uuid: \"mock-uuid\",\n properties: {\n broadcast: false,\n read: false,\n writeWithoutResponse: false,\n write: false,\n notify: false,\n indicate: false,\n authenticatedSignedWrites: false,\n reliableWrite: false,\n writableAuxiliaries: false,\n },\n getDescriptor: vi.fn().mockResolvedValue(undefined),\n getDescriptors: vi.fn().mockResolvedValue([]),\n startNotifications: vi.fn().mockResolvedValue(undefined),\n addEventListener: vi.fn(),\n removeEventListener: vi.fn(),\n stopNotifications,\n writeValueWithResponse: vi.fn().mockResolvedValue(undefined),\n writeValueWithoutResponse: vi.fn().mockResolvedValue(undefined),\n readValue: vi.fn().mockResolvedValue(new DataView(new ArrayBuffer(0))),\n writeValue: vi.fn().mockResolvedValue(undefined),\n dispatchEvent: vi.fn(),\n oncharacteristicvaluechanged: null,\n };\n}\n\nlet writeChar: any;\nlet notifyChar: any;\nlet apduSenderFactory: ApduSenderServiceFactory;\nlet apduReceiverFactory: ApduReceiverServiceFactory;\nlet loggerFactory: (tag: string) => LoggerPublisherService;\nlet sender: WebBleApduSender;\n\nconst flushPromises = () =>\n new Promise<void>((resolve) => setImmediate(resolve));\n\nbeforeEach(() => {\n writeChar = makeCharacteristic();\n notifyChar = makeCharacteristic();\n\n apduSenderFactory = vi.fn().mockReturnValue({\n getFrames: (apdu: Uint8Array) => [\n { getRawData: () => new DataView(apdu.buffer) },\n ],\n });\n\n apduReceiverFactory = vi.fn().mockReturnValue({\n handleFrame: vi.fn((_frame: Uint8Array) =>\n Right(Maybe.of({ data: new Uint8Array([0x90, 0x00]) } as ApduResponse)),\n ),\n });\n\n loggerFactory = (tag: string) => new LoggerStub([], tag);\n\n sender = new WebBleApduSender(\n {\n writeCharacteristic: writeChar,\n notifyCharacteristic: notifyChar,\n apduSenderFactory,\n apduReceiverFactory,\n },\n loggerFactory,\n );\n});\n\nafterEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"WebBleApduSender\", () => {\n it(\"getDependencies returns initial chars\", () => {\n // when\n const deps = sender.getDependencies();\n\n // then\n expect(deps.writeCharacteristic).toBe(writeChar);\n expect(deps.notifyCharacteristic).toBe(notifyChar);\n });\n\n it(\"setupConnection negotiates MTU and listens\", async () => {\n // when\n const promise = sender.setupConnection();\n\n // then\n expect(notifyChar.startNotifications).toHaveBeenCalled();\n await flushPromises();\n\n const filteredCalls = (\n notifyChar.addEventListener.mock.calls as [string, EventListener][]\n ).filter(([event]) => event === \"characteristicvaluechanged\");\n\n const firstCall = filteredCalls[0];\n\n if (!firstCall) {\n throw new Error(\"No event registered for 'characteristicvaluechanged'\");\n }\n\n const handler = firstCall[1];\n\n // given\n const mtuBuf = new Uint8Array([0, 0, 0, 0, 0, 0x20]).buffer;\n\n // when\n handler({ target: { value: { buffer: mtuBuf } } } as unknown as Event);\n\n // then\n await expect(promise).resolves.toBeUndefined();\n });\n\n it(\"sendApdu writes frames and resolves on notification\", async () => {\n // given\n const setupPromise = sender.setupConnection();\n await flushPromises();\n\n const mtuCall = (\n notifyChar.addEventListener.mock.calls as [string, EventListener][]\n ).find(([event]) => event === \"characteristicvaluechanged\");\n\n if (!mtuCall)\n throw new Error(\"No event registered for 'characteristicvaluechanged'\");\n\n const mtuHandler = mtuCall[1];\n\n mtuHandler({\n target: {\n value: { buffer: new Uint8Array([0, 0, 0, 0, 0, 0x20]).buffer },\n },\n } as unknown as Event);\n\n await setupPromise;\n\n const apduCmd = new Uint8Array([0x01, 0x02, 0x03]);\n\n // when\n const promise = sender.sendApdu(apduCmd);\n\n // then\n expect(writeChar.writeValueWithResponse).toHaveBeenCalledWith(\n apduCmd.buffer,\n );\n await flushPromises();\n\n const filteredCalls = (\n notifyChar.addEventListener.mock.calls as [string, EventListener][]\n ).filter(([event]) => event === \"characteristicvaluechanged\");\n\n const lastCall = filteredCalls[filteredCalls.length - 1];\n if (!lastCall) throw new Error(\"No APDU handler registered.\");\n\n const [, apduHandler] = lastCall;\n\n // when\n const respBuf = new Uint8Array([0x90, 0x00]).buffer;\n apduHandler({ target: { value: { buffer: respBuf } } } as unknown as Event);\n\n // then\n const result = await promise;\n\n expect(result.isRight()).toBe(true);\n expect((result.extract() as ApduResponse).data).toEqual(\n new Uint8Array([0x90, 0x00]),\n );\n });\n\n it(\"closeConnection calls disconnect\", () => {\n // when\n sender.closeConnection();\n\n // then\n expect(notifyChar.service.device.gatt.disconnect).toHaveBeenCalled();\n });\n\n it(\"setDependencies swaps characteristics\", async () => {\n // given\n const newNotify = makeCharacteristic();\n const newWrite = makeCharacteristic();\n notifyChar.service.device.gatt.connected = true;\n\n // when\n await sender.setDependencies({\n writeCharacteristic:\n newWrite as unknown as BluetoothRemoteGATTCharacteristic,\n notifyCharacteristic:\n newNotify as unknown as BluetoothRemoteGATTCharacteristic,\n });\n\n // then\n expect(notifyChar.removeEventListener).toHaveBeenCalled();\n expect(newNotify.startNotifications).toHaveBeenCalled();\n expect(newNotify.addEventListener).toHaveBeenCalledWith(\n \"characteristicvaluechanged\",\n expect.any(Function),\n );\n\n const deps = sender.getDependencies();\n expect(deps.notifyCharacteristic).toBe(newNotify);\n expect(deps.writeCharacteristic).toBe(newWrite);\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Maybe", "Right", "afterEach", "beforeEach", "describe", "expect", "it", "vi", "WebBleApduSender", "LoggerStub", "subs", "tag", "makeCharacteristic", "disconnect", "stopNotifications", "writeChar", "notifyChar", "apduSenderFactory", "apduReceiverFactory", "loggerFactory", "sender", "flushPromises", "resolve", "apdu", "_frame", "deps", "promise", "firstCall", "event", "handler", "mtuBuf", "setupPromise", "mtuCall", "mtuHandler", "apduCmd", "filteredCalls", "lastCall", "apduHandler", "respBuf", "result", "newNotify", "newWrite"]
|
|
7
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { type ApduReceiverServiceFactory, type ApduResponse, type ApduSenderServiceFactory, type DeviceApduSender, type DmkError, type LoggerPublisherService } from "@ledgerhq/device-management-kit";
|
|
2
|
-
import { type Either } from "purify-ts";
|
|
3
|
-
export type WebBleApduSenderDependencies = {
|
|
4
|
-
writeCharacteristic: BluetoothRemoteGATTCharacteristic;
|
|
5
|
-
notifyCharacteristic: BluetoothRemoteGATTCharacteristic;
|
|
6
|
-
};
|
|
7
|
-
export declare class WebBleApduSender implements DeviceApduSender<WebBleApduSenderDependencies> {
|
|
8
|
-
private _characteristics;
|
|
9
|
-
private _apduSender;
|
|
10
|
-
private _apduSenderFactory;
|
|
11
|
-
private _apduReceiver;
|
|
12
|
-
private _logger;
|
|
13
|
-
private _isDeviceReady;
|
|
14
|
-
private _sendResolver;
|
|
15
|
-
private _notificationsActive;
|
|
16
|
-
private _apduReceiverFactory;
|
|
17
|
-
private _mtuHandshakeInFlight;
|
|
18
|
-
private static readonly MTU_OP;
|
|
19
|
-
constructor(deps: WebBleApduSenderDependencies & {
|
|
20
|
-
apduSenderFactory: ApduSenderServiceFactory;
|
|
21
|
-
apduReceiverFactory: ApduReceiverServiceFactory;
|
|
22
|
-
}, loggerFactory: (tag: string) => LoggerPublisherService);
|
|
23
|
-
private _failPendingSend;
|
|
24
|
-
private _handleNotify;
|
|
25
|
-
private _onReceiveSetup;
|
|
26
|
-
private _onReceiveApdu;
|
|
27
|
-
private _write;
|
|
28
|
-
setupConnection(): Promise<void>;
|
|
29
|
-
sendApdu(apdu: Uint8Array, _triggersDisconnection?: boolean, _abortTimeout?: number): Promise<Either<DmkError, ApduResponse>>;
|
|
30
|
-
closeConnection(): void;
|
|
31
|
-
getDependencies(): WebBleApduSenderDependencies;
|
|
32
|
-
setDependencies(deps: WebBleApduSenderDependencies): Promise<void>;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=WebBleApduSender.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebBleApduSender.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/WebBleApduSender.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EAErB,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,MAAM,EAAsB,MAAM,WAAW,CAAC;AAG5D,MAAM,MAAM,4BAA4B,GAAG;IACzC,mBAAmB,EAAE,iCAAiC,CAAC;IACvD,oBAAoB,EAAE,iCAAiC,CAAC;CACzD,CAAC;AAEF,qBAAa,gBACX,YAAW,gBAAgB,CAAC,4BAA4B,CAAC;IAEzD,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,WAAW,CACH;IAChB,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,aAAa,CAEH;IAClB,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAGpC,IAAI,EAAE,4BAA4B,GAAG;QACnC,iBAAiB,EAAE,wBAAwB,CAAC;QAC5C,mBAAmB,EAAE,0BAA0B,CAAC;KACjD,EACD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB;IAYxD,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa,CAoBnB;IAEF,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;YAgBR,MAAM;IAwBP,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAuDhC,QAAQ,CACnB,IAAI,EAAE,UAAU,EAChB,sBAAsB,CAAC,EAAE,OAAO,EAChC,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IA8BnC,eAAe,IAAI,IAAI;IAsBvB,eAAe,IAAI,4BAA4B;IAIzC,eAAe,CAC1B,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,IAAI,CAAC;CAsCjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebBleApduSender.test.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/WebBleApduSender.test.ts"],"names":[],"mappings":""}
|