@ledgerhq/device-transport-kit-web-ble 0.0.0-legacy-speculos-datasource-20250821095840 → 0.0.0-lifi-with-logger-20251208144248

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.
@@ -1,2 +1,2 @@
1
- import{DeviceAlreadyConnectedError as m,OpeningConnectionError as l,StaticDeviceModelDataSource as y,UnknownDeviceError as g}from"@ledgerhq/device-management-kit";import{Left as p,Right as w}from"purify-ts";import{firstValueFrom as i}from"rxjs";import{bleDeviceStubBuilder as v}from"../model/BleDevice.stub";import{WebBleTransport as h}from"./WebBleTransport";vi.mock("./WebBleApduSender",async()=>({WebBleApduSender:class{constructor(n,r){}setDependencies=vi.fn().mockResolvedValue(void 0)}}));vi.mock("@ledgerhq/device-management-kit",async()=>({...await vi.importActual("@ledgerhq/device-management-kit"),DeviceConnectionStateMachine:class{constructor(r){}setupConnection=vi.fn().mockResolvedValue(void 0);sendApdu=vi.fn();closeConnection=vi.fn();eventDeviceDetached=vi.fn();eventDeviceAttached=vi.fn()}}));class S{subscribers=[];tag;constructor(r,o){this.subscribers=r,this.tag=o}error=vi.fn();warn=vi.fn();info=vi.fn();debug=vi.fn()}const u=new y,D=new S([],"WebBleTransport");let t,f,b;beforeEach(()=>{vi.useFakeTimers(),f=vi.fn(),b=vi.fn(),t=new h(u,()=>D,b,f)});afterEach(()=>{vi.restoreAllMocks()});describe("WebBleTransport",()=>{describe("isSupported",()=>{it("returns false when navigator.bluetooth is undefined",()=>{delete globalThis.navigator;const n=t.isSupported();expect(n).toBe(!1)}),it("returns true when navigator.bluetooth exists",()=>{globalThis.navigator={bluetooth:{}};const n=t.isSupported();expect(n).toBe(!0)})}),describe("startDiscovering",()=>{let n,r,o,s;beforeEach(()=>{const e=u.getBluetoothServices()[0];r=v(),o={uuid:e,getCharacteristic:vi.fn().mockResolvedValue({})},s={getPrimaryServices:()=>Promise.resolve([o])},Object.defineProperty(r,"gatt",{value:{connect:()=>Promise.resolve(s)},writable:!0,configurable:!0}),n=vi.fn(),globalThis.navigator={bluetooth:{requestDevice:n}}}),it("emits a discovered device when a known device is returned",async()=>{n.mockResolvedValueOnce(r);const e=await i(t.startDiscovering());expect(e).toEqual(expect.objectContaining({deviceModel:expect.objectContaining({id:"stax"}),transport:t.getIdentifier()}))}),it("emits UnknownDeviceError when deviceInfo is missing",async()=>{const e=v();Object.defineProperty(e,"gatt",{value:{connect:()=>Promise.resolve({getPrimaryServices:()=>Promise.resolve([{uuid:"invalid"}])})},writable:!0,configurable:!0}),n.mockResolvedValueOnce(e),await expect(i(t.startDiscovering())).rejects.toBeInstanceOf(g)}),it("throws OpeningConnectionError when device has no GATT server",async()=>{const e=v();Object.defineProperty(e,"gatt",{value:void 0,writable:!0,configurable:!0}),n.mockResolvedValueOnce(e),await expect(i(t.startDiscovering())).rejects.toBeInstanceOf(l)}),it("throws OpeningConnectionError when no GATT services are found",async()=>{const e=v(),c={getPrimaryServices:()=>Promise.resolve([])};Object.defineProperty(e,"gatt",{value:{connect:()=>Promise.resolve(c)},writable:!0,configurable:!0}),n.mockResolvedValueOnce(e),await expect(i(t.startDiscovering())).rejects.toBeInstanceOf(l)})}),describe("connect/disconnect flow",()=>{let n,r,o,s;beforeEach(()=>{const e=u.getBluetoothServices()[0];r=v(),o={uuid:e,getCharacteristic:vi.fn().mockResolvedValue({})},s={getPrimaryServices:()=>Promise.resolve([o])},Object.defineProperty(r,"gatt",{value:{connect:()=>Promise.resolve(s)},writable:!0,configurable:!0}),n=vi.fn().mockResolvedValue(r),globalThis.navigator={bluetooth:{requestDevice:n}}}),it("returns UnknownDeviceError when connecting an unknown deviceId",async()=>{const e="nonexistent",c=await t.connect({deviceId:e,onDisconnect:vi.fn()});expect(c).toEqual(p(new g(`Unknown device ${e}`)))}),it("connects and returns a connected device on success",async()=>{const e=await i(t.startDiscovering()),c=await t.connect({deviceId:e.id,onDisconnect:vi.fn()});expect(c.isRight()).toBe(!0);const a=c.extract();expect(a.id).toBe(e.id)}),it("does not allow connecting twice to the same device",async()=>{const e=await i(t.startDiscovering());await t.connect({deviceId:e.id,onDisconnect:vi.fn()});const c=await t.connect({deviceId:e.id,onDisconnect:vi.fn()});expect(c).toEqual(p(new m("Device already connected")))}),it("returns OpeningConnectionError when characteristic retrieval fails",async()=>{const e={uuid:u.getBluetoothServices()[0],getCharacteristic:vi.fn().mockRejectedValue(new Error("boom"))},c={getPrimaryServices:()=>Promise.resolve([e])};Object.defineProperty(r,"gatt",{value:{connect:()=>Promise.resolve(c)},writable:!0,configurable:!0});const a=await i(t.startDiscovering()),d=await t.connect({deviceId:a.id,onDisconnect:vi.fn()});expect(d.isLeft()).toBe(!0),expect(d.extract()).toBeInstanceOf(l)}),it("disconnects successfully",async()=>{const e=await i(t.startDiscovering()),a=(await t.connect({deviceId:e.id,onDisconnect:vi.fn()})).extract(),d=await t.disconnect({connectedDevice:a});expect(d).toEqual(w(void 0))})})});
1
+ import{DeviceAlreadyConnectedError as y,OpeningConnectionError as u,StaticDeviceModelDataSource as b,UnknownDeviceError as w}from"@ledgerhq/device-management-kit";import{Left as g,Right as h}from"purify-ts";import{firstValueFrom as a}from"rxjs";import{bleDeviceStubBuilder as d}from"../model/BleDevice.stub";import{WebBleTransport as S}from"./WebBleTransport";vi.mock("./WebBleApduSender",async()=>({WebBleApduSender:class{constructor(o,n){}setupConnection=vi.fn().mockResolvedValue(void 0)}}));vi.mock("@ledgerhq/device-management-kit",async()=>({...await vi.importActual("@ledgerhq/device-management-kit"),DeviceConnectionStateMachine:class{constructor(n){}setupConnection=vi.fn().mockResolvedValue(void 0);setDependencies=vi.fn();sendApdu=vi.fn();closeConnection=vi.fn();eventDeviceDisconnected=vi.fn();eventDeviceConnected=vi.fn();eventDeviceDetached=vi.fn();eventDeviceAttached=vi.fn()}}));class k{subscribers=[];tag;constructor(n,s){this.subscribers=n,this.tag=s}error=vi.fn();warn=vi.fn();info=vi.fn();debug=vi.fn()}const l=new b,D=new k([],"WebBleTransport");let c,m,p;beforeEach(()=>{vi.useRealTimers(),m=vi.fn(),p=vi.fn(),c=new S(l,()=>D,p,m)});afterEach(()=>{vi.restoreAllMocks()});describe("WebBleTransport",()=>{describe("isSupported",()=>{it("returns false when navigator.bluetooth is undefined",()=>{delete globalThis.navigator;const o=c.isSupported();expect(o).toBe(!1)}),it("returns true when navigator.bluetooth exists",()=>{globalThis.navigator={bluetooth:{}};const o=c.isSupported();expect(o).toBe(!0)})}),describe("startDiscovering",()=>{let o,n,s;const v=l.getBluetoothServices()[0],f=e=>{const t={connected:!1,connect:vi.fn().mockImplementation(async()=>(t.connected=!0,t)),disconnect:vi.fn().mockImplementation(()=>{t.connected=!1}),getPrimaryService:vi.fn().mockImplementation(async i=>{if(i.toLowerCase()===e.uuid.toLowerCase())return e;const r=new Error("NotFoundError");throw r.name="NotFoundError",r}),getPrimaryServices:vi.fn().mockResolvedValue([e])};return t};beforeEach(()=>{n=d(),s={uuid:v,device:n,getCharacteristic:vi.fn().mockResolvedValue({})};const e=f(s);Object.defineProperty(n,"gatt",{value:e,writable:!0,configurable:!0}),n.addEventListener||(n.addEventListener=vi.fn(),n.removeEventListener=vi.fn()),o=vi.fn(),globalThis.navigator={bluetooth:{requestDevice:o}}}),it("emits a discovered device when a known device is returned",async()=>{o.mockResolvedValueOnce(n);const e=await a(c.startDiscovering()),t=l.getBluetoothServicesInfos()[v]?.deviceModel.id;expect(e).toEqual(expect.objectContaining({deviceModel:expect.objectContaining({id:t}),transport:c.getIdentifier()}))}),it("emits UnknownDeviceError when deviceInfo is missing",async()=>{const e=d(),t={uuid:"invalid-uuid",device:e,getCharacteristic:vi.fn()},i={connected:!1,connect:vi.fn().mockImplementation(async()=>(i.connected=!0,i)),disconnect:vi.fn(),getPrimaryService:vi.fn().mockResolvedValue(t),getPrimaryServices:vi.fn().mockResolvedValue([t])};Object.defineProperty(e,"gatt",{value:i,writable:!0,configurable:!0}),o.mockResolvedValueOnce(e),await expect(a(c.startDiscovering())).rejects.toBeInstanceOf(u)}),it("throws OpeningConnectionError when device has no GATT server",async()=>{const e=d();Object.defineProperty(e,"gatt",{value:void 0,writable:!0,configurable:!0}),o.mockResolvedValueOnce(e),await expect(a(c.startDiscovering())).rejects.toBeInstanceOf(u)}),it("throws OpeningConnectionError when no GATT services are found",async()=>{const e=d(),t={connected:!1,connect:vi.fn().mockImplementation(async()=>t),disconnect:vi.fn(),getPrimaryService:vi.fn().mockRejectedValue(new Error("nope")),getPrimaryServices:vi.fn().mockResolvedValue([])};Object.defineProperty(e,"gatt",{value:t,writable:!0,configurable:!0}),o.mockResolvedValueOnce(e),await expect(a(c.startDiscovering())).rejects.toBeInstanceOf(u)})}),describe("connect/disconnect flow",()=>{let o,n,s;const v=l.getBluetoothServices()[0],f=e=>{const t={connected:!1,connect:vi.fn().mockImplementation(async()=>(t.connected=!0,t)),disconnect:vi.fn().mockImplementation(()=>{t.connected=!1}),getPrimaryService:vi.fn().mockImplementation(async i=>{if(i.toLowerCase()===e.uuid.toLowerCase())return e;const r=new Error("NotFoundError");throw r.name="NotFoundError",r}),getPrimaryServices:vi.fn().mockResolvedValue([e])};return t};beforeEach(()=>{n=d();const e={properties:{}},t={properties:{write:!0}};s={uuid:v,device:n,getCharacteristic:vi.fn().mockResolvedValueOnce(e).mockResolvedValue(t)};const i=f(s);Object.defineProperty(n,"gatt",{value:i,writable:!0,configurable:!0}),n.addEventListener||(n.addEventListener=vi.fn(),n.removeEventListener=vi.fn()),o=vi.fn().mockResolvedValue(n),globalThis.navigator={bluetooth:{requestDevice:o}}}),it("returns UnknownDeviceError when connecting an unknown deviceId",async()=>{const e="nonexistent",t=await c.connect({deviceId:e,onDisconnect:vi.fn()});expect(t).toEqual(g(new w(`Unknown device ${e}`)))}),it("connects and returns a connected device on success",async()=>{const e=await a(c.startDiscovering()),t=await c.connect({deviceId:e.id,onDisconnect:vi.fn()});expect(t.isRight()).toBe(!0);const i=t.extract();expect(i.id).toBe(e.id)}),it("does not allow connecting twice to the same device",async()=>{const e=await a(c.startDiscovering());await c.connect({deviceId:e.id,onDisconnect:vi.fn()});const t=await c.connect({deviceId:e.id,onDisconnect:vi.fn()});expect(t).toEqual(g(new y(`Device ${e.id} already connected`)))}),it("returns OpeningConnectionError when characteristic retrieval fails",async()=>{const e={uuid:v,device:n,getCharacteristic:vi.fn().mockRejectedValue(new Error("boom"))},t={...n.gatt,getPrimaryService:vi.fn().mockResolvedValue(e),getPrimaryServices:vi.fn().mockResolvedValue([e])};Object.defineProperty(n,"gatt",{value:t,writable:!0,configurable:!0});const i=await a(c.startDiscovering()),r=await c.connect({deviceId:i.id,onDisconnect:vi.fn()});expect(r.isLeft()).toBe(!0),expect(r.extract()).toBeInstanceOf(u)}),it("disconnects successfully",async()=>{const e=await a(c.startDiscovering()),i=(await c.connect({deviceId:e.id,onDisconnect:vi.fn()})).extract(),r=await c.disconnect({connectedDevice:i});expect(r).toEqual(h(void 0))})})});
2
2
  //# sourceMappingURL=WebBleTransport.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/transport/WebBleTransport.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nvi.mock(\"./WebBleApduSender\", async () => ({\n WebBleApduSender: class {\n constructor(_deps: any, _loggerFactory: any) {}\n setDependencies = vi.fn().mockResolvedValue(undefined);\n },\n}));\n\nvi.mock(\"@ledgerhq/device-management-kit\", async () => {\n const actual = (await vi.importActual(\n \"@ledgerhq/device-management-kit\",\n )) as any;\n return {\n ...actual,\n DeviceConnectionStateMachine: class {\n constructor(_opts: any) {}\n setupConnection = vi.fn().mockResolvedValue(undefined);\n sendApdu = vi.fn();\n closeConnection = vi.fn();\n eventDeviceDetached = vi.fn();\n eventDeviceAttached = vi.fn();\n },\n };\n});\n\nimport {\n type ApduReceiverServiceFactory,\n type ApduSenderServiceFactory,\n DeviceAlreadyConnectedError,\n type LoggerPublisherService,\n type LoggerSubscriberService,\n OpeningConnectionError,\n StaticDeviceModelDataSource,\n type TransportConnectedDevice,\n UnknownDeviceError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { bleDeviceStubBuilder } from \"@api/model/BleDevice.stub\";\n\nimport { WebBleTransport } from \"./WebBleTransport\";\n\nclass LoggerPublisherServiceStub implements LoggerPublisherService {\n subscribers: LoggerSubscriberService[] = [];\n tag: string;\n constructor(subscribers: LoggerSubscriberService[], tag: string) {\n this.subscribers = subscribers;\n this.tag = tag;\n }\n error = vi.fn();\n warn = vi.fn();\n info = vi.fn();\n debug = vi.fn();\n}\n\nconst bleDeviceModelDataSource = new StaticDeviceModelDataSource();\nconst logger = new LoggerPublisherServiceStub([], \"WebBleTransport\");\n\nlet transport: WebBleTransport;\nlet apduReceiverFactory: ApduReceiverServiceFactory;\nlet apduSenderFactory: ApduSenderServiceFactory;\n\nbeforeEach(() => {\n vi.useFakeTimers();\n apduReceiverFactory = vi.fn();\n apduSenderFactory = vi.fn();\n transport = new WebBleTransport(\n bleDeviceModelDataSource,\n () => logger,\n apduSenderFactory,\n apduReceiverFactory,\n );\n});\n\nafterEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"WebBleTransport\", () => {\n describe(\"isSupported\", () => {\n it(\"returns false when navigator.bluetooth is undefined\", () => {\n // given\n delete (globalThis as any).navigator;\n\n // when\n const result = transport.isSupported();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"returns true when navigator.bluetooth exists\", () => {\n // given\n (globalThis as any).navigator = { bluetooth: {} };\n\n // when\n const result = transport.isSupported();\n\n // then\n expect(result).toBe(true);\n });\n });\n\n describe(\"startDiscovering\", () => {\n let requestDevice: ReturnType<typeof vi.fn>;\n let stubDevice: BluetoothDevice;\n let mockService: any;\n let mockServer: any;\n\n beforeEach(() => {\n const serviceUuid = bleDeviceModelDataSource.getBluetoothServices()[0];\n stubDevice = bleDeviceStubBuilder();\n mockService = {\n uuid: serviceUuid,\n getCharacteristic: vi.fn().mockResolvedValue({}),\n };\n mockServer = {\n getPrimaryServices: () => Promise.resolve([mockService]),\n };\n Object.defineProperty(stubDevice, \"gatt\", {\n value: { connect: () => Promise.resolve(mockServer) },\n writable: true,\n configurable: true,\n });\n\n requestDevice = vi.fn();\n (globalThis as any).navigator = {\n bluetooth: { requestDevice },\n };\n });\n\n it(\"emits a discovered device when a known device is returned\", async () => {\n // given\n requestDevice.mockResolvedValueOnce(stubDevice);\n\n // when\n const device = await firstValueFrom(transport.startDiscovering());\n\n // then\n expect(device).toEqual(\n expect.objectContaining({\n deviceModel: expect.objectContaining({ id: \"stax\" }),\n transport: transport.getIdentifier(),\n }),\n );\n });\n\n it(\"emits UnknownDeviceError when deviceInfo is missing\", async () => {\n // given\n const unknownStub = bleDeviceStubBuilder();\n Object.defineProperty(unknownStub, \"gatt\", {\n value: {\n connect: () =>\n Promise.resolve({\n getPrimaryServices: () => Promise.resolve([{ uuid: \"invalid\" }]),\n } as any),\n },\n writable: true,\n configurable: true,\n });\n requestDevice.mockResolvedValueOnce(unknownStub);\n\n // when / then\n await expect(\n firstValueFrom(transport.startDiscovering()),\n ).rejects.toBeInstanceOf(UnknownDeviceError);\n });\n\n it(\"throws OpeningConnectionError when device has no GATT server\", async () => {\n // given\n const noGattStub = bleDeviceStubBuilder();\n Object.defineProperty(noGattStub, \"gatt\", {\n value: undefined,\n writable: true,\n configurable: true,\n });\n requestDevice.mockResolvedValueOnce(noGattStub);\n\n // when / then\n await expect(\n firstValueFrom(transport.startDiscovering()),\n ).rejects.toBeInstanceOf(OpeningConnectionError);\n });\n\n it(\"throws OpeningConnectionError when no GATT services are found\", async () => {\n // given\n const noServiceStub = bleDeviceStubBuilder();\n const emptyServer = {\n getPrimaryServices: () => Promise.resolve([]),\n } as any;\n Object.defineProperty(noServiceStub, \"gatt\", {\n value: { connect: () => Promise.resolve(emptyServer) },\n writable: true,\n configurable: true,\n });\n requestDevice.mockResolvedValueOnce(noServiceStub);\n\n // when / then\n await expect(\n firstValueFrom(transport.startDiscovering()),\n ).rejects.toBeInstanceOf(OpeningConnectionError);\n });\n });\n\n describe(\"connect/disconnect flow\", () => {\n let requestDevice: ReturnType<typeof vi.fn>;\n let stubDevice: BluetoothDevice;\n let mockService: any;\n let mockServer: any;\n\n beforeEach(() => {\n const serviceUuid = bleDeviceModelDataSource.getBluetoothServices()[0];\n stubDevice = bleDeviceStubBuilder();\n mockService = {\n uuid: serviceUuid,\n getCharacteristic: vi.fn().mockResolvedValue({}),\n };\n mockServer = {\n getPrimaryServices: () => Promise.resolve([mockService]),\n };\n Object.defineProperty(stubDevice, \"gatt\", {\n value: { connect: () => Promise.resolve(mockServer) },\n writable: true,\n configurable: true,\n });\n\n requestDevice = vi.fn().mockResolvedValue(stubDevice);\n (globalThis as any).navigator = {\n bluetooth: { requestDevice },\n };\n });\n\n it(\"returns UnknownDeviceError when connecting an unknown deviceId\", async () => {\n // given\n const deviceId = \"nonexistent\";\n\n // when\n const result = await transport.connect({\n deviceId,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result).toEqual(\n Left(new UnknownDeviceError(`Unknown device ${deviceId}`)),\n );\n });\n\n it(\"connects and returns a connected device on success\", async () => {\n // given\n const discovered = await firstValueFrom(transport.startDiscovering());\n\n // when\n const result = await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result.isRight()).toBe(true);\n const conn = result.extract() as TransportConnectedDevice;\n expect(conn.id).toBe(discovered.id);\n });\n\n it(\"does not allow connecting twice to the same device\", async () => {\n // given\n const discovered = await firstValueFrom(transport.startDiscovering());\n await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n\n // when\n const secondAttempt = await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(secondAttempt).toEqual(\n Left(new DeviceAlreadyConnectedError(\"Device already connected\")),\n );\n });\n\n it(\"returns OpeningConnectionError when characteristic retrieval fails\", async () => {\n // given\n const badCharacteristicService = {\n uuid: bleDeviceModelDataSource.getBluetoothServices()[0],\n getCharacteristic: vi.fn().mockRejectedValue(new Error(\"boom\")),\n };\n const badServer = {\n getPrimaryServices: () => Promise.resolve([badCharacteristicService]),\n };\n Object.defineProperty(stubDevice, \"gatt\", {\n value: { connect: () => Promise.resolve(badServer) },\n writable: true,\n configurable: true,\n });\n\n const discovered = await firstValueFrom(transport.startDiscovering());\n\n // when\n const result = await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result.isLeft()).toBe(true);\n expect(result.extract()).toBeInstanceOf(OpeningConnectionError);\n });\n\n it(\"disconnects successfully\", async () => {\n // given\n const discovered = await firstValueFrom(transport.startDiscovering());\n const result = await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n const conn = result.extract() as TransportConnectedDevice;\n\n // when\n const disc = await transport.disconnect({ connectedDevice: conn });\n\n // then\n expect(disc).toEqual(Right(undefined));\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceAlreadyConnectedError", "OpeningConnectionError", "StaticDeviceModelDataSource", "UnknownDeviceError", "Left", "Right", "firstValueFrom", "bleDeviceStubBuilder", "WebBleTransport", "_deps", "_loggerFactory", "_opts", "LoggerPublisherServiceStub", "subscribers", "tag", "bleDeviceModelDataSource", "logger", "transport", "apduReceiverFactory", "apduSenderFactory", "result", "requestDevice", "stubDevice", "mockService", "mockServer", "serviceUuid", "device", "unknownStub", "noGattStub", "noServiceStub", "emptyServer", "deviceId", "discovered", "conn", "secondAttempt", "badCharacteristicService", "badServer", "disc"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nvi.mock(\"./WebBleApduSender\", async () => ({\n WebBleApduSender: class {\n constructor(_deps: any, _loggerFactory: any) {}\n setupConnection = vi.fn().mockResolvedValue(undefined);\n },\n}));\n\nvi.mock(\"@ledgerhq/device-management-kit\", async () => {\n const actual = (await vi.importActual(\n \"@ledgerhq/device-management-kit\",\n )) as any;\n return {\n ...actual,\n DeviceConnectionStateMachine: class {\n constructor(_opts: any) {}\n setupConnection = vi.fn().mockResolvedValue(undefined);\n setDependencies = vi.fn();\n sendApdu = vi.fn();\n closeConnection = vi.fn();\n eventDeviceDisconnected = vi.fn();\n eventDeviceConnected = vi.fn();\n eventDeviceDetached = vi.fn();\n eventDeviceAttached = vi.fn();\n },\n };\n});\n\nimport {\n type ApduReceiverServiceFactory,\n type ApduSenderServiceFactory,\n DeviceAlreadyConnectedError,\n type LoggerPublisherService,\n type LoggerSubscriberService,\n OpeningConnectionError,\n StaticDeviceModelDataSource,\n type TransportConnectedDevice,\n UnknownDeviceError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { bleDeviceStubBuilder } from \"@api/model/BleDevice.stub\";\n\nimport { WebBleTransport } from \"./WebBleTransport\";\n\nclass LoggerPublisherServiceStub implements LoggerPublisherService {\n subscribers: LoggerSubscriberService[] = [];\n tag: string;\n constructor(subscribers: LoggerSubscriberService[], tag: string) {\n this.subscribers = subscribers;\n this.tag = tag;\n }\n error = vi.fn();\n warn = vi.fn();\n info = vi.fn();\n debug = vi.fn();\n}\n\nconst bleDeviceModelDataSource = new StaticDeviceModelDataSource();\nconst logger = new LoggerPublisherServiceStub([], \"WebBleTransport\");\n\nlet transport: WebBleTransport;\nlet apduReceiverFactory: ApduReceiverServiceFactory;\nlet apduSenderFactory: ApduSenderServiceFactory;\n\nbeforeEach(() => {\n vi.useRealTimers();\n apduReceiverFactory = vi.fn();\n apduSenderFactory = vi.fn();\n transport = new WebBleTransport(\n bleDeviceModelDataSource,\n () => logger,\n apduSenderFactory,\n apduReceiverFactory,\n );\n});\n\nafterEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"WebBleTransport\", () => {\n describe(\"isSupported\", () => {\n it(\"returns false when navigator.bluetooth is undefined\", () => {\n delete (globalThis as any).navigator;\n\n const result = transport.isSupported();\n\n expect(result).toBe(false);\n });\n\n it(\"returns true when navigator.bluetooth exists\", () => {\n (globalThis as any).navigator = { bluetooth: {} };\n\n const result = transport.isSupported();\n\n expect(result).toBe(true);\n });\n });\n\n describe(\"startDiscovering\", () => {\n let requestDevice: ReturnType<typeof vi.fn>;\n let stubDevice: BluetoothDevice;\n let mockService: any;\n\n const serviceUuid = bleDeviceModelDataSource.getBluetoothServices()[0];\n\n const makeGatt = (service: any) => {\n const gatt: any = {\n connected: false,\n connect: vi.fn().mockImplementation(async () => {\n gatt.connected = true;\n return gatt;\n }),\n disconnect: vi.fn().mockImplementation(() => {\n gatt.connected = false;\n }),\n getPrimaryService: vi.fn().mockImplementation(async (uuid: string) => {\n if (uuid.toLowerCase() === service.uuid.toLowerCase()) {\n return service;\n }\n const err = new Error(\"NotFoundError\");\n (err as any).name = \"NotFoundError\";\n throw err;\n }),\n getPrimaryServices: vi.fn().mockResolvedValue([service]),\n };\n return gatt;\n };\n\n beforeEach(() => {\n stubDevice = bleDeviceStubBuilder();\n mockService = {\n uuid: serviceUuid,\n device: stubDevice,\n getCharacteristic: vi.fn().mockResolvedValue({}),\n };\n\n const gatt = makeGatt(mockService);\n\n Object.defineProperty(stubDevice, \"gatt\", {\n value: gatt,\n writable: true,\n configurable: true,\n });\n\n if (!(stubDevice as any).addEventListener) {\n (stubDevice as any).addEventListener = vi.fn();\n (stubDevice as any).removeEventListener = vi.fn();\n }\n\n requestDevice = vi.fn();\n (globalThis as any).navigator = {\n bluetooth: { requestDevice },\n };\n });\n\n it(\"emits a discovered device when a known device is returned\", async () => {\n // given\n requestDevice.mockResolvedValueOnce(stubDevice);\n\n // when\n const device = await firstValueFrom(transport.startDiscovering());\n\n const expectedModelId =\n bleDeviceModelDataSource.getBluetoothServicesInfos()[serviceUuid!]\n ?.deviceModel.id;\n\n // then\n expect(device).toEqual(\n expect.objectContaining({\n deviceModel: expect.objectContaining({ id: expectedModelId }),\n transport: transport.getIdentifier(),\n }),\n );\n });\n\n it(\"emits UnknownDeviceError when deviceInfo is missing\", async () => {\n // given\n const unknown = bleDeviceStubBuilder();\n const unknownService = {\n uuid: \"invalid-uuid\",\n device: unknown,\n getCharacteristic: vi.fn(),\n };\n\n const gatt: any = {\n connected: false,\n connect: vi.fn().mockImplementation(async () => {\n gatt.connected = true;\n return gatt;\n }),\n disconnect: vi.fn(),\n // returning a service (success) but with an unknown uuid triggers UnknownDeviceError\n getPrimaryService: vi.fn().mockResolvedValue(unknownService),\n getPrimaryServices: vi.fn().mockResolvedValue([unknownService]),\n };\n\n Object.defineProperty(unknown, \"gatt\", {\n value: gatt,\n writable: true,\n configurable: true,\n });\n\n requestDevice.mockResolvedValueOnce(unknown);\n\n // then\n await expect(\n firstValueFrom(transport.startDiscovering()),\n ).rejects.toBeInstanceOf(OpeningConnectionError);\n });\n\n it(\"throws OpeningConnectionError when device has no GATT server\", async () => {\n // given\n const noGattStub = bleDeviceStubBuilder();\n Object.defineProperty(noGattStub, \"gatt\", {\n value: undefined,\n writable: true,\n configurable: true,\n });\n requestDevice.mockResolvedValueOnce(noGattStub);\n\n // then\n await expect(\n firstValueFrom(transport.startDiscovering()),\n ).rejects.toBeInstanceOf(OpeningConnectionError);\n });\n\n it(\"throws OpeningConnectionError when no GATT services are found\", async () => {\n // given\n const noServiceStub = bleDeviceStubBuilder();\n const gatt: any = {\n connected: false,\n connect: vi.fn().mockImplementation(async () => gatt),\n disconnect: vi.fn(),\n getPrimaryService: vi.fn().mockRejectedValue(new Error(\"nope\")),\n getPrimaryServices: vi.fn().mockResolvedValue([]),\n };\n Object.defineProperty(noServiceStub, \"gatt\", {\n value: gatt,\n writable: true,\n configurable: true,\n });\n requestDevice.mockResolvedValueOnce(noServiceStub);\n\n // then\n await expect(\n firstValueFrom(transport.startDiscovering()),\n ).rejects.toBeInstanceOf(OpeningConnectionError);\n });\n });\n\n describe(\"connect/disconnect flow\", () => {\n let requestDevice: ReturnType<typeof vi.fn>;\n let stubDevice: BluetoothDevice;\n let mockService: any;\n\n const serviceUuid = bleDeviceModelDataSource.getBluetoothServices()[0];\n\n const makeGatt = (service: any) => {\n const gatt: any = {\n connected: false,\n connect: vi.fn().mockImplementation(async () => {\n gatt.connected = true;\n return gatt;\n }),\n disconnect: vi.fn().mockImplementation(() => {\n gatt.connected = false;\n }),\n getPrimaryService: vi.fn().mockImplementation(async (uuid: string) => {\n if (uuid.toLowerCase() === service.uuid.toLowerCase()) {\n return service;\n }\n const err = new Error(\"NotFoundError\");\n (err as any).name = \"NotFoundError\";\n throw err;\n }),\n getPrimaryServices: vi.fn().mockResolvedValue([service]),\n };\n return gatt;\n };\n\n beforeEach(() => {\n stubDevice = bleDeviceStubBuilder();\n\n const charNotify: any = { properties: {} };\n const charWrite: any = { properties: { write: true } };\n\n mockService = {\n uuid: serviceUuid,\n device: stubDevice,\n getCharacteristic: vi\n .fn()\n .mockResolvedValueOnce(charNotify)\n .mockResolvedValue(charWrite),\n };\n\n const gatt = makeGatt(mockService);\n\n Object.defineProperty(stubDevice, \"gatt\", {\n value: gatt,\n writable: true,\n configurable: true,\n });\n\n if (!(stubDevice as any).addEventListener) {\n (stubDevice as any).addEventListener = vi.fn();\n (stubDevice as any).removeEventListener = vi.fn();\n }\n\n requestDevice = vi.fn().mockResolvedValue(stubDevice);\n (globalThis as any).navigator = {\n bluetooth: { requestDevice },\n };\n });\n\n it(\"returns UnknownDeviceError when connecting an unknown deviceId\", async () => {\n // given\n const deviceId = \"nonexistent\";\n\n // when\n const result = await transport.connect({\n deviceId,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result).toEqual(\n Left(new UnknownDeviceError(`Unknown device ${deviceId}`)),\n );\n });\n\n it(\"connects and returns a connected device on success\", async () => {\n // given\n const discovered = await firstValueFrom(transport.startDiscovering());\n\n // when\n const result = await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result.isRight()).toBe(true);\n const conn = result.extract() as TransportConnectedDevice;\n expect(conn.id).toBe(discovered.id);\n });\n\n it(\"does not allow connecting twice to the same device\", async () => {\n // given\n const discovered = await firstValueFrom(transport.startDiscovering());\n await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n\n // when\n const secondAttempt = await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(secondAttempt).toEqual(\n Left(\n new DeviceAlreadyConnectedError(\n `Device ${discovered.id} already connected`,\n ),\n ),\n );\n });\n\n it(\"returns OpeningConnectionError when characteristic retrieval fails\", async () => {\n // given\n const badService = {\n uuid: serviceUuid,\n device: stubDevice,\n getCharacteristic: vi.fn().mockRejectedValue(new Error(\"boom\")),\n };\n const badGatt = {\n ...stubDevice.gatt,\n getPrimaryService: vi.fn().mockResolvedValue(badService),\n getPrimaryServices: vi.fn().mockResolvedValue([badService]),\n } as any;\n\n Object.defineProperty(stubDevice, \"gatt\", {\n value: badGatt,\n writable: true,\n configurable: true,\n });\n\n const discovered = await firstValueFrom(transport.startDiscovering());\n\n // when\n const result = await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n\n // then\n expect(result.isLeft()).toBe(true);\n expect(result.extract()).toBeInstanceOf(OpeningConnectionError);\n });\n\n it(\"disconnects successfully\", async () => {\n // given\n const discovered = await firstValueFrom(transport.startDiscovering());\n const result = await transport.connect({\n deviceId: discovered.id,\n onDisconnect: vi.fn(),\n });\n const conn = result.extract() as TransportConnectedDevice;\n\n // when\n const disc = await transport.disconnect({ connectedDevice: conn });\n\n // then\n expect(disc).toEqual(Right(undefined));\n });\n });\n});\n"],
5
+ "mappings": "AAiCA,OAGE,+BAAAA,EAGA,0BAAAC,EACA,+BAAAC,EAEA,sBAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAC5B,OAAS,kBAAAC,MAAsB,OAE/B,OAAS,wBAAAC,MAA4B,4BAErC,OAAS,mBAAAC,MAAuB,oBA3ChC,GAAG,KAAK,qBAAsB,UAAa,CACzC,iBAAkB,KAAM,CACtB,YAAYC,EAAYC,EAAqB,CAAC,CAC9C,gBAAkB,GAAG,GAAG,EAAE,kBAAkB,MAAS,CACvD,CACF,EAAE,EAEF,GAAG,KAAK,kCAAmC,UAIlC,CACL,GAJc,MAAM,GAAG,aACvB,iCACF,EAGE,6BAA8B,KAAM,CAClC,YAAYC,EAAY,CAAC,CACzB,gBAAkB,GAAG,GAAG,EAAE,kBAAkB,MAAS,EACrD,gBAAkB,GAAG,GAAG,EACxB,SAAW,GAAG,GAAG,EACjB,gBAAkB,GAAG,GAAG,EACxB,wBAA0B,GAAG,GAAG,EAChC,qBAAuB,GAAG,GAAG,EAC7B,oBAAsB,GAAG,GAAG,EAC5B,oBAAsB,GAAG,GAAG,CAC9B,CACF,EACD,EAoBD,MAAMC,CAA6D,CACjE,YAAyC,CAAC,EAC1C,IACA,YAAYC,EAAwCC,EAAa,CAC/D,KAAK,YAAcD,EACnB,KAAK,IAAMC,CACb,CACA,MAAQ,GAAG,GAAG,EACd,KAAO,GAAG,GAAG,EACb,KAAO,GAAG,GAAG,EACb,MAAQ,GAAG,GAAG,CAChB,CAEA,MAAMC,EAA2B,IAAIb,EAC/Bc,EAAS,IAAIJ,EAA2B,CAAC,EAAG,iBAAiB,EAEnE,IAAIK,EACAC,EACAC,EAEJ,WAAW,IAAM,CACf,GAAG,cAAc,EACjBD,EAAsB,GAAG,GAAG,EAC5BC,EAAoB,GAAG,GAAG,EAC1BF,EAAY,IAAIT,EACdO,EACA,IAAMC,EACNG,EACAD,CACF,CACF,CAAC,EAED,UAAU,IAAM,CACd,GAAG,gBAAgB,CACrB,CAAC,EAED,SAAS,kBAAmB,IAAM,CAChC,SAAS,cAAe,IAAM,CAC5B,GAAG,sDAAuD,IAAM,CAC9D,OAAQ,WAAmB,UAE3B,MAAME,EAASH,EAAU,YAAY,EAErC,OAAOG,CAAM,EAAE,KAAK,EAAK,CAC3B,CAAC,EAED,GAAG,+CAAgD,IAAM,CACtD,WAAmB,UAAY,CAAE,UAAW,CAAC,CAAE,EAEhD,MAAMA,EAASH,EAAU,YAAY,EAErC,OAAOG,CAAM,EAAE,KAAK,EAAI,CAC1B,CAAC,CACH,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,IAAIC,EACAC,EACAC,EAEJ,MAAMC,EAAcT,EAAyB,qBAAqB,EAAE,CAAC,EAE/DU,EAAYC,GAAiB,CACjC,MAAMC,EAAY,CAChB,UAAW,GACX,QAAS,GAAG,GAAG,EAAE,mBAAmB,UAClCA,EAAK,UAAY,GACVA,EACR,EACD,WAAY,GAAG,GAAG,EAAE,mBAAmB,IAAM,CAC3CA,EAAK,UAAY,EACnB,CAAC,EACD,kBAAmB,GAAG,GAAG,EAAE,mBAAmB,MAAOC,GAAiB,CACpE,GAAIA,EAAK,YAAY,IAAMF,EAAQ,KAAK,YAAY,EAClD,OAAOA,EAET,MAAMG,EAAM,IAAI,MAAM,eAAe,EACrC,MAACA,EAAY,KAAO,gBACdA,CACR,CAAC,EACD,mBAAoB,GAAG,GAAG,EAAE,kBAAkB,CAACH,CAAO,CAAC,CACzD,EACA,OAAOC,CACT,EAEA,WAAW,IAAM,CACfL,EAAaf,EAAqB,EAClCgB,EAAc,CACZ,KAAMC,EACN,OAAQF,EACR,kBAAmB,GAAG,GAAG,EAAE,kBAAkB,CAAC,CAAC,CACjD,EAEA,MAAMK,EAAOF,EAASF,CAAW,EAEjC,OAAO,eAAeD,EAAY,OAAQ,CACxC,MAAOK,EACP,SAAU,GACV,aAAc,EAChB,CAAC,EAEKL,EAAmB,mBACtBA,EAAmB,iBAAmB,GAAG,GAAG,EAC5CA,EAAmB,oBAAsB,GAAG,GAAG,GAGlDD,EAAgB,GAAG,GAAG,EACrB,WAAmB,UAAY,CAC9B,UAAW,CAAE,cAAAA,CAAc,CAC7B,CACF,CAAC,EAED,GAAG,4DAA6D,SAAY,CAE1EA,EAAc,sBAAsBC,CAAU,EAG9C,MAAMQ,EAAS,MAAMxB,EAAeW,EAAU,iBAAiB,CAAC,EAE1Dc,EACJhB,EAAyB,0BAA0B,EAAES,CAAY,GAC7D,YAAY,GAGlB,OAAOM,CAAM,EAAE,QACb,OAAO,iBAAiB,CACtB,YAAa,OAAO,iBAAiB,CAAE,GAAIC,CAAgB,CAAC,EAC5D,UAAWd,EAAU,cAAc,CACrC,CAAC,CACH,CACF,CAAC,EAED,GAAG,sDAAuD,SAAY,CAEpE,MAAMe,EAAUzB,EAAqB,EAC/B0B,EAAiB,CACrB,KAAM,eACN,OAAQD,EACR,kBAAmB,GAAG,GAAG,CAC3B,EAEML,EAAY,CAChB,UAAW,GACX,QAAS,GAAG,GAAG,EAAE,mBAAmB,UAClCA,EAAK,UAAY,GACVA,EACR,EACD,WAAY,GAAG,GAAG,EAElB,kBAAmB,GAAG,GAAG,EAAE,kBAAkBM,CAAc,EAC3D,mBAAoB,GAAG,GAAG,EAAE,kBAAkB,CAACA,CAAc,CAAC,CAChE,EAEA,OAAO,eAAeD,EAAS,OAAQ,CACrC,MAAOL,EACP,SAAU,GACV,aAAc,EAChB,CAAC,EAEDN,EAAc,sBAAsBW,CAAO,EAG3C,MAAM,OACJ1B,EAAeW,EAAU,iBAAiB,CAAC,CAC7C,EAAE,QAAQ,eAAehB,CAAsB,CACjD,CAAC,EAED,GAAG,+DAAgE,SAAY,CAE7E,MAAMiC,EAAa3B,EAAqB,EACxC,OAAO,eAAe2B,EAAY,OAAQ,CACxC,MAAO,OACP,SAAU,GACV,aAAc,EAChB,CAAC,EACDb,EAAc,sBAAsBa,CAAU,EAG9C,MAAM,OACJ5B,EAAeW,EAAU,iBAAiB,CAAC,CAC7C,EAAE,QAAQ,eAAehB,CAAsB,CACjD,CAAC,EAED,GAAG,gEAAiE,SAAY,CAE9E,MAAMkC,EAAgB5B,EAAqB,EACrCoB,EAAY,CAChB,UAAW,GACX,QAAS,GAAG,GAAG,EAAE,mBAAmB,SAAYA,CAAI,EACpD,WAAY,GAAG,GAAG,EAClB,kBAAmB,GAAG,GAAG,EAAE,kBAAkB,IAAI,MAAM,MAAM,CAAC,EAC9D,mBAAoB,GAAG,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAClD,EACA,OAAO,eAAeQ,EAAe,OAAQ,CAC3C,MAAOR,EACP,SAAU,GACV,aAAc,EAChB,CAAC,EACDN,EAAc,sBAAsBc,CAAa,EAGjD,MAAM,OACJ7B,EAAeW,EAAU,iBAAiB,CAAC,CAC7C,EAAE,QAAQ,eAAehB,CAAsB,CACjD,CAAC,CACH,CAAC,EAED,SAAS,0BAA2B,IAAM,CACxC,IAAIoB,EACAC,EACAC,EAEJ,MAAMC,EAAcT,EAAyB,qBAAqB,EAAE,CAAC,EAE/DU,EAAYC,GAAiB,CACjC,MAAMC,EAAY,CAChB,UAAW,GACX,QAAS,GAAG,GAAG,EAAE,mBAAmB,UAClCA,EAAK,UAAY,GACVA,EACR,EACD,WAAY,GAAG,GAAG,EAAE,mBAAmB,IAAM,CAC3CA,EAAK,UAAY,EACnB,CAAC,EACD,kBAAmB,GAAG,GAAG,EAAE,mBAAmB,MAAOC,GAAiB,CACpE,GAAIA,EAAK,YAAY,IAAMF,EAAQ,KAAK,YAAY,EAClD,OAAOA,EAET,MAAMG,EAAM,IAAI,MAAM,eAAe,EACrC,MAACA,EAAY,KAAO,gBACdA,CACR,CAAC,EACD,mBAAoB,GAAG,GAAG,EAAE,kBAAkB,CAACH,CAAO,CAAC,CACzD,EACA,OAAOC,CACT,EAEA,WAAW,IAAM,CACfL,EAAaf,EAAqB,EAElC,MAAM6B,EAAkB,CAAE,WAAY,CAAC,CAAE,EACnCC,EAAiB,CAAE,WAAY,CAAE,MAAO,EAAK,CAAE,EAErDd,EAAc,CACZ,KAAMC,EACN,OAAQF,EACR,kBAAmB,GAChB,GAAG,EACH,sBAAsBc,CAAU,EAChC,kBAAkBC,CAAS,CAChC,EAEA,MAAMV,EAAOF,EAASF,CAAW,EAEjC,OAAO,eAAeD,EAAY,OAAQ,CACxC,MAAOK,EACP,SAAU,GACV,aAAc,EAChB,CAAC,EAEKL,EAAmB,mBACtBA,EAAmB,iBAAmB,GAAG,GAAG,EAC5CA,EAAmB,oBAAsB,GAAG,GAAG,GAGlDD,EAAgB,GAAG,GAAG,EAAE,kBAAkBC,CAAU,EACnD,WAAmB,UAAY,CAC9B,UAAW,CAAE,cAAAD,CAAc,CAC7B,CACF,CAAC,EAED,GAAG,iEAAkE,SAAY,CAE/E,MAAMiB,EAAW,cAGXlB,EAAS,MAAMH,EAAU,QAAQ,CACrC,SAAAqB,EACA,aAAc,GAAG,GAAG,CACtB,CAAC,EAGD,OAAOlB,CAAM,EAAE,QACbhB,EAAK,IAAID,EAAmB,kBAAkBmC,CAAQ,EAAE,CAAC,CAC3D,CACF,CAAC,EAED,GAAG,qDAAsD,SAAY,CAEnE,MAAMC,EAAa,MAAMjC,EAAeW,EAAU,iBAAiB,CAAC,EAG9DG,EAAS,MAAMH,EAAU,QAAQ,CACrC,SAAUsB,EAAW,GACrB,aAAc,GAAG,GAAG,CACtB,CAAC,EAGD,OAAOnB,EAAO,QAAQ,CAAC,EAAE,KAAK,EAAI,EAClC,MAAMoB,EAAOpB,EAAO,QAAQ,EAC5B,OAAOoB,EAAK,EAAE,EAAE,KAAKD,EAAW,EAAE,CACpC,CAAC,EAED,GAAG,qDAAsD,SAAY,CAEnE,MAAMA,EAAa,MAAMjC,EAAeW,EAAU,iBAAiB,CAAC,EACpE,MAAMA,EAAU,QAAQ,CACtB,SAAUsB,EAAW,GACrB,aAAc,GAAG,GAAG,CACtB,CAAC,EAGD,MAAME,EAAgB,MAAMxB,EAAU,QAAQ,CAC5C,SAAUsB,EAAW,GACrB,aAAc,GAAG,GAAG,CACtB,CAAC,EAGD,OAAOE,CAAa,EAAE,QACpBrC,EACE,IAAIJ,EACF,UAAUuC,EAAW,EAAE,oBACzB,CACF,CACF,CACF,CAAC,EAED,GAAG,qEAAsE,SAAY,CAEnF,MAAMG,EAAa,CACjB,KAAMlB,EACN,OAAQF,EACR,kBAAmB,GAAG,GAAG,EAAE,kBAAkB,IAAI,MAAM,MAAM,CAAC,CAChE,EACMqB,EAAU,CACd,GAAGrB,EAAW,KACd,kBAAmB,GAAG,GAAG,EAAE,kBAAkBoB,CAAU,EACvD,mBAAoB,GAAG,GAAG,EAAE,kBAAkB,CAACA,CAAU,CAAC,CAC5D,EAEA,OAAO,eAAepB,EAAY,OAAQ,CACxC,MAAOqB,EACP,SAAU,GACV,aAAc,EAChB,CAAC,EAED,MAAMJ,EAAa,MAAMjC,EAAeW,EAAU,iBAAiB,CAAC,EAG9DG,EAAS,MAAMH,EAAU,QAAQ,CACrC,SAAUsB,EAAW,GACrB,aAAc,GAAG,GAAG,CACtB,CAAC,EAGD,OAAOnB,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjC,OAAOA,EAAO,QAAQ,CAAC,EAAE,eAAenB,CAAsB,CAChE,CAAC,EAED,GAAG,2BAA4B,SAAY,CAEzC,MAAMsC,EAAa,MAAMjC,EAAeW,EAAU,iBAAiB,CAAC,EAK9DuB,GAJS,MAAMvB,EAAU,QAAQ,CACrC,SAAUsB,EAAW,GACrB,aAAc,GAAG,GAAG,CACtB,CAAC,GACmB,QAAQ,EAGtBK,EAAO,MAAM3B,EAAU,WAAW,CAAE,gBAAiBuB,CAAK,CAAC,EAGjE,OAAOI,CAAI,EAAE,QAAQvC,EAAM,MAAS,CAAC,CACvC,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["DeviceAlreadyConnectedError", "OpeningConnectionError", "StaticDeviceModelDataSource", "UnknownDeviceError", "Left", "Right", "firstValueFrom", "bleDeviceStubBuilder", "WebBleTransport", "_deps", "_loggerFactory", "_opts", "LoggerPublisherServiceStub", "subscribers", "tag", "bleDeviceModelDataSource", "logger", "transport", "apduReceiverFactory", "apduSenderFactory", "result", "requestDevice", "stubDevice", "mockService", "serviceUuid", "makeGatt", "service", "gatt", "uuid", "err", "device", "expectedModelId", "unknown", "unknownService", "noGattStub", "noServiceStub", "charNotify", "charWrite", "deviceId", "discovered", "conn", "secondAttempt", "badService", "badGatt", "disc"]
7
7
  }
@@ -1,34 +1,4 @@
1
1
  {
2
- "name": "@ledgerhq/device-transport-kit-web-ble",
3
- "version": "1.1.0",
4
- "license": "Apache-2.0",
5
- "private": false,
6
- "exports": {
7
- ".": {
8
- "types": "./lib/types/index.d.ts",
9
- "import": "./lib/esm/index.js"
10
- }
11
- },
12
- "files": [
13
- "./lib",
14
- "package.json"
15
- ],
16
- "scripts": {
17
- "prebuild": "rimraf lib",
18
- "build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json --platform web",
19
- "dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
20
- "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json --platform web",
21
- "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\"",
22
- "lint": "eslint",
23
- "lint:fix": "pnpm lint --fix",
24
- "postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
25
- "prettier": "prettier . --check",
26
- "prettier:fix": "prettier . --write",
27
- "typecheck": "tsc --noEmit",
28
- "test": "vitest run",
29
- "test:watch": "vitest",
30
- "test:coverage": "vitest run --coverage"
31
- },
32
2
  "dependencies": {
33
3
  "@sentry/minimal": "catalog:",
34
4
  "purify-ts": "catalog:",
@@ -36,8 +6,8 @@
36
6
  },
37
7
  "devDependencies": {
38
8
  "@ledgerhq/device-management-kit": "workspace:*",
39
- "@ledgerhq/ldmk-tool": "workspace:*",
40
9
  "@ledgerhq/eslint-config-dsdk": "workspace:*",
10
+ "@ledgerhq/ldmk-tool": "workspace:*",
41
11
  "@ledgerhq/prettier-config-dsdk": "workspace:*",
42
12
  "@ledgerhq/tsconfig-dsdk": "workspace:*",
43
13
  "@ledgerhq/vitest-config-dmk": "workspace:*",
@@ -46,8 +16,42 @@
46
16
  "rxjs": "catalog:",
47
17
  "ts-node": "catalog:"
48
18
  },
19
+ "exports": {
20
+ ".": {
21
+ "import": "./lib/esm/index.js",
22
+ "types": "./lib/types/index.d.ts"
23
+ }
24
+ },
25
+ "files": [
26
+ "./lib",
27
+ "package.json"
28
+ ],
29
+ "license": "Apache-2.0",
30
+ "name": "@ledgerhq/device-transport-kit-web-ble",
49
31
  "peerDependencies": {
50
32
  "@ledgerhq/device-management-kit": "workspace:*",
51
33
  "rxjs": "catalog:"
52
- }
34
+ },
35
+ "private": false,
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/LedgerHQ/device-sdk-ts.git"
39
+ },
40
+ "scripts": {
41
+ "build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json --platform web",
42
+ "dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
43
+ "lint": "eslint",
44
+ "lint:fix": "pnpm lint --fix",
45
+ "postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
46
+ "prebuild": "rimraf lib",
47
+ "prettier": "prettier . --check",
48
+ "prettier:fix": "prettier . --write",
49
+ "test": "vitest run",
50
+ "test:coverage": "vitest run --coverage",
51
+ "test:watch": "vitest",
52
+ "typecheck": "tsc --noEmit",
53
+ "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json --platform web",
54
+ "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
55
+ },
56
+ "version": "0.0.0-lifi-with-logger-20251208144248"
53
57
  }
@@ -1,4 +1,6 @@
1
1
  export declare const RECONNECT_DEVICE_TIMEOUT = 15000;
2
- export declare const SINGLE_RECONNECTION_TIMEOUT = 2000;
3
- export declare const RECONNECTION_RETRY_COUNT = 5;
2
+ export declare const ADVERTISING_DELAY = 400;
3
+ export declare const ADVERTISING_TIMEOUT = 1200;
4
+ export declare const REDISCOVER_TIMEOUT = 3000;
5
+ export declare const RECONNECTION_LOOP_BACKOFF = 500;
4
6
  //# sourceMappingURL=WebBleConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebBleConfig.d.ts","sourceRoot":"","sources":["../../../../src/api/data/WebBleConfig.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAC9C,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,wBAAwB,IAAI,CAAC"}
1
+ {"version":3,"file":"WebBleConfig.d.ts","sourceRoot":"","sources":["../../../../src/api/data/WebBleConfig.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAC9C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,yBAAyB,MAAM,CAAC"}
@@ -4,31 +4,36 @@ export type WebBleApduSenderDependencies = {
4
4
  writeCharacteristic: BluetoothRemoteGATTCharacteristic;
5
5
  notifyCharacteristic: BluetoothRemoteGATTCharacteristic;
6
6
  };
7
+ export declare const MTU_OP = 8;
7
8
  export declare class WebBleApduSender implements DeviceApduSender<WebBleApduSenderDependencies> {
8
- private _characteristics;
9
- private _apduSender;
9
+ private _dependencies;
10
+ private _apduFrameSegmenter;
10
11
  private _apduSenderFactory;
11
- private _apduReceiver;
12
- private _logger;
13
- private _isDeviceReady;
14
- private _sendResolver;
15
- private _notificationsActive;
16
12
  private _apduReceiverFactory;
17
- private _mtuHandshakeInFlight;
18
- private static readonly MTU_OP;
19
- constructor(deps: WebBleApduSenderDependencies & {
13
+ private _apduFrameReceiver;
14
+ private _logger;
15
+ private _mtuNegotiated$;
16
+ private _notificationsReady;
17
+ private _mtuRequestInProgress;
18
+ private _pendingResponseResolver;
19
+ constructor(initialDependencies: WebBleApduSenderDependencies & {
20
20
  apduSenderFactory: ApduSenderServiceFactory;
21
21
  apduReceiverFactory: ApduReceiverServiceFactory;
22
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>>;
23
+ sendApdu(apdu: Uint8Array, triggersDisconnection?: boolean, abortTimeout?: number): Promise<Either<DmkError, ApduResponse>>;
30
24
  closeConnection(): void;
31
25
  getDependencies(): WebBleApduSenderDependencies;
32
- setDependencies(deps: WebBleApduSenderDependencies): Promise<void>;
26
+ setDependencies(deps: WebBleApduSenderDependencies): void;
27
+ setupConnection(): Promise<void>;
28
+ private _isGattConnected;
29
+ private _isGattDisconnectedError;
30
+ private _failPendingSend;
31
+ private _markLinkUnavailable;
32
+ private _sleep;
33
+ private _handleNotification;
34
+ private _handleMtuNegotiationFrame;
35
+ private _handleApduFrame;
36
+ private _writeToGattCharacteristic;
37
+ private _waitUntilMtuNegotiated;
33
38
  }
34
39
  //# sourceMappingURL=WebBleApduSender.d.ts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"WebBleApduSender.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/WebBleApduSender.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EAGrB,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAE5B,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,eAAO,MAAM,MAAM,IAAO,CAAC;AAE3B,qBAAa,gBACX,YAAW,gBAAgB,CAAC,4BAA4B,CAAC;IAEzD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,mBAAmB,CAA2C;IACtE,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,OAAO,CAAyB;IAExC,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,qBAAqB,CAAS;IAEtC,OAAO,CAAC,wBAAwB,CAEd;gBAGhB,mBAAmB,EAAE,4BAA4B,GAAG;QAClD,iBAAiB,EAAE,wBAAwB,CAAC;QAC5C,mBAAmB,EAAE,0BAA0B,CAAC;KACjD,EACD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB;IAY3C,QAAQ,CACnB,IAAI,EAAE,UAAU,EAChB,qBAAqB,CAAC,EAAE,OAAO,EAC/B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAsEnC,eAAe,IAAI,IAAI;IAwBvB,eAAe,IAAI,4BAA4B;IAI/C,eAAe,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI;IA4BnD,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAsE7C,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;IAsBhC,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,oBAAoB;YAiBd,MAAM;IAIpB,OAAO,CAAC,mBAAmB,CAqBzB;IAEF,OAAO,CAAC,0BAA0B;IAelC,OAAO,CAAC,gBAAgB;YAgBV,0BAA0B;YAiC1B,uBAAuB;CAkCtC"}
@@ -1,36 +1,42 @@
1
- import { type ApduReceiverServiceFactory, type ApduSenderServiceFactory, type ConnectError, type DeviceModelDataSource, type LoggerPublisherService, type Transport, TransportConnectedDevice, type TransportDiscoveredDevice, type TransportFactory, type TransportIdentifier, UnknownDeviceError } from "@ledgerhq/device-management-kit";
1
+ import { type ApduReceiverServiceFactory, type ApduSenderServiceFactory, type ConnectError, type DeviceModelDataSource, type DmkError, type LoggerPublisherService, type Transport, TransportConnectedDevice, type TransportDiscoveredDevice, type TransportFactory, type TransportIdentifier } from "@ledgerhq/device-management-kit";
2
2
  import { type Either } from "purify-ts";
3
3
  import { type Observable } from "rxjs";
4
4
  export declare const webBleIdentifier: TransportIdentifier;
5
5
  export declare class WebBleTransport implements Transport {
6
+ private readonly _deviceModelDataSource;
6
7
  private loggerFactory;
8
+ private readonly _apduSenderFactory;
9
+ private readonly _apduReceiverFactory;
7
10
  private _logger;
8
- private _deviceModelDataSource;
9
- private _apduSenderFactory;
10
- private _apduReceiverFactory;
11
- private _deviceRegistry;
12
- private _connectionMachines;
13
- private _discoveredDevicesSubject;
14
- private _reconnectionPromises;
15
- private _reconnectionTimers;
16
- constructor(deviceModelDataSource: DeviceModelDataSource, loggerFactory: (tag: string) => LoggerPublisherService, apduSenderFactory: ApduSenderServiceFactory, apduReceiverFactory: ApduReceiverServiceFactory);
11
+ private _connectionStateMachinesByDeviceId;
12
+ private _deviceRegistryById;
13
+ private _discoveredDevices$;
14
+ constructor(_deviceModelDataSource: DeviceModelDataSource, loggerFactory: (tag: string) => LoggerPublisherService, _apduSenderFactory: ApduSenderServiceFactory, _apduReceiverFactory: ApduReceiverServiceFactory);
17
15
  isSupported(): boolean;
18
16
  getIdentifier(): TransportIdentifier;
19
17
  startDiscovering(): Observable<TransportDiscoveredDevice>;
20
- listenToAvailableDevices(): Observable<TransportDiscoveredDevice[]>;
21
18
  stopDiscovering(): void;
19
+ listenToAvailableDevices(): Observable<TransportDiscoveredDevice[]>;
22
20
  connect(params: {
23
21
  deviceId: string;
24
22
  onDisconnect: (deviceId: string) => void;
25
23
  onReconnect?: (deviceId: string) => Promise<void> | void;
26
24
  }): Promise<Either<ConnectError, TransportConnectedDevice>>;
27
- private handleDisconnect;
28
- private _cleanupDevice;
29
- private _cleanupConnection;
30
- private _rebindCharacteristics;
31
25
  disconnect(params: {
32
26
  connectedDevice: TransportConnectedDevice;
33
- }): Promise<Either<UnknownDeviceError, never> | Either<never, undefined>>;
27
+ }): Promise<Either<DmkError, void>>;
28
+ private _handleGattServerDisconnected;
29
+ private _waitForAdvertisementInRange;
30
+ private _rediscoverPermittedDevice;
31
+ private _tryToReconnect;
32
+ private _safelyCancelGattConnection;
33
+ private _identifyLedgerGattService;
34
+ private _getPrimaryLedgerGattService;
35
+ private _resolveLedgerServiceCharacteristics;
36
+ private _findWritableCharacteristic;
37
+ private _publishDiscoveredDevices;
38
+ private _withTimeout;
39
+ private _sleep;
34
40
  }
35
41
  export declare const webBleTransportFactory: TransportFactory;
36
42
  //# sourceMappingURL=WebBleTransport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebBleTransport.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/WebBleTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAGjB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EACd,wBAAwB,EAExB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,WAAW,CAAC;AACrD,OAAO,EAAe,KAAK,UAAU,EAAuB,MAAM,MAAM,CAAC;AAezE,eAAO,MAAM,gBAAgB,EAAE,mBAA+B,CAAC;AAE/D,qBAAa,eAAgB,YAAW,SAAS;IAyC7C,OAAO,CAAC,aAAa;IAxCvB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,sBAAsB,CAAwB;IACtD,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,oBAAoB,CAA6B;IAEzD,OAAO,CAAC,eAAe,CAenB;IAEJ,OAAO,CAAC,mBAAmB,CAGvB;IACJ,OAAO,CAAC,yBAAyB,CAE7B;IACJ,OAAO,CAAC,qBAAqB,CAGzB;IACJ,OAAO,CAAC,mBAAmB,CAGvB;gBAGF,qBAAqB,EAAE,qBAAqB,EACpC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,EAC9D,iBAAiB,EAAE,wBAAwB,EAC3C,mBAAmB,EAAE,0BAA0B;IAQjD,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,mBAAmB;IAIpC,gBAAgB,IAAI,UAAU,CAAC,yBAAyB,CAAC;IA8CzD,wBAAwB,IAAI,UAAU,CAAC,yBAAyB,EAAE,CAAC;IAQnE,eAAe,IAAI,IAAI;IAIjB,OAAO,CAAC,MAAM,EAAE;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QACzC,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAC1D,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAqH3D,OAAO,CAAC,gBAAgB;IA+HxB,OAAO,CAAC,cAAc;IAgDtB,OAAO,CAAC,kBAAkB;YAyBZ,sBAAsB;IAkCvB,UAAU,CAAC,MAAM,EAAE;QAC9B,eAAe,EAAE,wBAAwB,CAAC;KAC3C;CAqBF;AAED,eAAO,MAAM,sBAAsB,EAAE,gBAWlC,CAAC"}
1
+ {"version":3,"file":"WebBleTransport.d.ts","sourceRoot":"","sources":["../../../../src/api/transport/WebBleTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAGjB,KAAK,qBAAqB,EAC1B,KAAK,QAAQ,EAEb,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EACd,wBAAwB,EAExB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAEzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,WAAW,CAAC;AACrD,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAgB9D,eAAO,MAAM,gBAAgB,EAAE,mBAAwC,CAAC;AAexE,qBAAa,eAAgB,YAAW,SAAS;IAa7C,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAfvC,OAAO,CAAC,OAAO,CAAyB;IAExC,OAAO,CAAC,kCAAkC,CAGtC;IACJ,OAAO,CAAC,mBAAmB,CAA0C;IACrE,OAAO,CAAC,mBAAmB,CAErB;gBAGa,sBAAsB,EAAE,qBAAqB,EACtD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,EAC7C,kBAAkB,EAAE,wBAAwB,EAC5C,oBAAoB,EAAE,0BAA0B;IAKnE,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,mBAAmB;IAIpC,gBAAgB,IAAI,UAAU,CAAC,yBAAyB,CAAC;IAqCzD,eAAe,IAAI,IAAI;IAIvB,wBAAwB,IAAI,UAAU,CAAC,yBAAyB,EAAE,CAAC;IAK7D,OAAO,CAAC,MAAM,EAAE;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QACzC,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAC1D,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAoHrD,UAAU,CAAC,MAAM,EAAE;QACvB,eAAe,EAAE,wBAAwB,CAAC;KAC3C,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IA0BnC,OAAO,CAAC,6BAA6B;YAQvB,4BAA4B;YAyC5B,0BAA0B;YA4B1B,eAAe;YAgGf,2BAA2B;YAQ3B,0BAA0B;YAkB1B,4BAA4B;YAyD5B,oCAAoC;YAiBpC,2BAA2B;IA6BzC,OAAO,CAAC,yBAAyB;IAsBjC,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,MAAM;CAGf;AAED,eAAO,MAAM,sBAAsB,EAAE,gBAWlC,CAAC"}