@ledgerhq/speculos-device-controller 0.0.0-develop-20261012001707 → 0.0.0-develop-20261014001241
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/README.md +2 -0
- package/lib/cjs/package.json +1 -1
- package/lib/cjs/src/api/DeviceController.js +1 -1
- package/lib/cjs/src/api/DeviceController.js.map +2 -2
- package/lib/cjs/src/api/DeviceController.test.js +1 -1
- package/lib/cjs/src/api/DeviceController.test.js.map +3 -3
- package/lib/cjs/src/internal/core/types.js +1 -1
- package/lib/cjs/src/internal/core/types.js.map +2 -2
- package/lib/cjs/src/internal/di.js +1 -1
- package/lib/cjs/src/internal/di.js.map +2 -2
- package/lib/cjs/src/internal/di.test.js +1 -1
- package/lib/cjs/src/internal/di.test.js.map +2 -2
- package/lib/esm/package.json +1 -1
- package/lib/esm/src/api/DeviceController.js +1 -1
- package/lib/esm/src/api/DeviceController.js.map +2 -2
- package/lib/esm/src/api/DeviceController.test.js +1 -1
- package/lib/esm/src/api/DeviceController.test.js.map +3 -3
- package/lib/esm/src/internal/core/types.js.map +2 -2
- package/lib/esm/src/internal/di.js +1 -1
- package/lib/esm/src/internal/di.js.map +2 -2
- package/lib/esm/src/internal/di.test.js +1 -1
- package/lib/esm/src/internal/di.test.js.map +2 -2
- package/lib/types/src/api/DeviceController.d.ts +1 -0
- package/lib/types/src/api/DeviceController.d.ts.map +1 -1
- package/lib/types/src/internal/core/types.d.ts +1 -0
- package/lib/types/src/internal/core/types.d.ts.map +1 -1
- package/lib/types/src/internal/di.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -42,6 +42,7 @@ Under the hood, percentages are clamped to [0, 100] and converted to pixels usin
|
|
|
42
42
|
const deviceClient = deviceControllerClientFactory("http://localhost:4000", {
|
|
43
43
|
timeoutMs: 2000, // optional fetch timeout
|
|
44
44
|
clientHeader: "ldmk-transport-speculos", // optional header
|
|
45
|
+
bearerToken: sessionToken, // optional, sent as `Authorization: Bearer <token>`, e.g. a protected Speculinho session
|
|
45
46
|
screens: {
|
|
46
47
|
// override by default keys
|
|
47
48
|
flex: { width: 256, height: 256 },
|
|
@@ -93,6 +94,7 @@ type DeviceControllerClientFactory = (
|
|
|
93
94
|
opts?: {
|
|
94
95
|
timeoutMs?: number; // fetch timeout (ms)
|
|
95
96
|
clientHeader?: string; // "X-Ledger-Client-Version" header
|
|
97
|
+
bearerToken?: string; // sent as "Authorization: Bearer <token>" with every request
|
|
96
98
|
screens?: DeviceScreens<string>;
|
|
97
99
|
},
|
|
98
100
|
) => DeviceControllerClient;
|
package/lib/cjs/package.json
CHANGED
|
@@ -52,5 +52,5 @@
|
|
|
52
52
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
53
53
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
54
54
|
},
|
|
55
|
-
"version": "0.0.0-develop-
|
|
55
|
+
"version": "0.0.0-develop-20261014001241"
|
|
56
56
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var l=Object.defineProperty;var
|
|
1
|
+
"use strict";var l=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var B=(i,n)=>{for(var r in n)l(i,r,{get:n[r],enumerable:!0})},P=(i,n,r,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of v(n))!g.call(i,t)&&t!==r&&l(i,t,{get:()=>n[t],enumerable:!(s=p(n,t))||s.enumerable});return i};var C=i=>P(l({},"__esModule",{value:!0}),i);var b={};B(b,{deviceControllerClientFactory:()=>S});module.exports=C(b);var d=require("../internal/config/defaultScreens"),u=require("../../src/internal/di"),c=require("../../src/internal/use-cases/buttonUseCases"),e=require("../../src/internal/use-cases/touchUseCases");const S=(i,n={})=>{const r={screens:n.screens??d.DEFAULT_SCREENS,timeoutMs:n.timeoutMs,clientHeader:n.clientHeader,bearerToken:n.bearerToken},{buttons:s,touch:t}=(0,u.createDefaultControllers)(i,r),a=(0,c.pressButtons)(s);return{buttonFactory:()=>({press:o=>s.press(o),left:()=>a.left(),right:()=>a.right(),both:()=>a.both(),pressSequence:(o,m)=>(0,c.pressSequence)(s,o,m)}),tapFactory:o=>({tapQuick:(0,e.tapQuick)(t,o),tapLong:(0,e.tapLong)(t,o),sign:(0,e.sign)(t,o),reject:(0,e.reject)(t,o),navigateNext:(0,e.navigateNext)(t,o),navigatePrevious:(0,e.navigatePrevious)(t,o),mainButton:(0,e.mainButton)(t,o),secondaryButton:(0,e.secondaryButton)(t,o),enterMenu:(0,e.enterMenu)(t,o),exitMenu:(0,e.exitMenu)(t,o),enableBlindSigningSettings:(0,e.enableBlindSigningSettings)(t,o),continueToBlindSigning:(0,e.continueToBlindSigning)(t,o),acceptBlindSigning:(0,e.acceptBlindSigning)(t,o),confirmAddressBookReview:(0,e.confirmAddressBookReview)(t,o)})}};0&&(module.exports={deviceControllerClientFactory});
|
|
2
2
|
//# sourceMappingURL=DeviceController.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/DeviceController.ts"],
|
|
4
|
-
"sourcesContent": ["import { DEFAULT_SCREENS } from \"@internal/config/defaultScreens\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n} from \"@internal/core/types\";\nimport { createDefaultControllers } from \"@root/src/internal/di\";\nimport {\n pressButtons,\n pressSequence,\n} from \"@root/src/internal/use-cases/buttonUseCases\";\nimport {\n acceptBlindSigning,\n confirmAddressBookReview,\n continueToBlindSigning,\n enableBlindSigningSettings,\n enterMenu,\n exitMenu,\n mainButton,\n navigateNext,\n navigatePrevious,\n reject,\n secondaryButton,\n sign,\n tapLong,\n tapQuick,\n} from \"@root/src/internal/use-cases/touchUseCases\";\n\nexport type ButtonFactory = () => ButtonController & {\n left(): Promise<void>;\n right(): Promise<void>;\n both(): Promise<void>;\n pressSequence(keys: ButtonKey[], delayMs?: number): Promise<void>;\n};\n\nexport type TapFactory = (deviceKey: string) => {\n tapQuick: (point: PercentCoordinates) => Promise<void>;\n tapLong: (point: PercentCoordinates, delayMs?: number) => Promise<void>;\n sign: (delayMs?: number) => Promise<void>;\n reject: () => Promise<void>;\n navigateNext: () => Promise<void>;\n navigatePrevious: () => Promise<void>;\n mainButton: () => Promise<void>;\n secondaryButton: () => Promise<void>;\n enterMenu: () => Promise<void>;\n exitMenu: () => Promise<void>;\n enableBlindSigningSettings: () => Promise<void>;\n continueToBlindSigning: () => Promise<void>;\n acceptBlindSigning: () => Promise<void>;\n confirmAddressBookReview: () => Promise<void>;\n};\n\nexport type DeviceControllerClientFactory = (\n baseURL: string,\n opts?: {\n timeoutMs?: number;\n clientHeader?: string;\n screens?: DeviceScreens<string>;\n },\n) => DeviceControllerClient;\n\nexport type DeviceControllerClient = {\n buttonFactory: ButtonFactory;\n tapFactory: TapFactory;\n};\n\nexport const deviceControllerClientFactory: DeviceControllerClientFactory = (\n baseURL,\n opts = {},\n) => {\n const resolved: DeviceControllerOptions = {\n screens: opts.screens ?? DEFAULT_SCREENS,\n timeoutMs: opts.timeoutMs,\n clientHeader: opts.clientHeader,\n };\n\n const { buttons, touch } = createDefaultControllers(baseURL, resolved);\n const press = pressButtons(buttons);\n\n return {\n buttonFactory: () => ({\n press: (key) => buttons.press(key),\n left: () => press.left(),\n right: () => press.right(),\n both: () => press.both(),\n pressSequence: (keys, delayMs) => pressSequence(buttons, keys, delayMs),\n }),\n tapFactory: (key) => ({\n tapQuick: tapQuick(touch, key),\n tapLong: tapLong(touch, key),\n sign: sign(touch, key),\n reject: reject(touch, key),\n navigateNext: navigateNext(touch, key),\n navigatePrevious: navigatePrevious(touch, key),\n mainButton: mainButton(touch, key),\n secondaryButton: secondaryButton(touch, key),\n enterMenu: enterMenu(touch, key),\n exitMenu: exitMenu(touch, key),\n enableBlindSigningSettings: enableBlindSigningSettings(touch, key),\n continueToBlindSigning: continueToBlindSigning(touch, key),\n acceptBlindSigning: acceptBlindSigning(touch, key),\n confirmAddressBookReview: confirmAddressBookReview(touch, key),\n }),\n };\n};\n\nexport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n};\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,2CAQhCC,EAAyC,iCACzCC,EAGO,uDACPC,EAeO,
|
|
4
|
+
"sourcesContent": ["import { DEFAULT_SCREENS } from \"@internal/config/defaultScreens\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n} from \"@internal/core/types\";\nimport { createDefaultControllers } from \"@root/src/internal/di\";\nimport {\n pressButtons,\n pressSequence,\n} from \"@root/src/internal/use-cases/buttonUseCases\";\nimport {\n acceptBlindSigning,\n confirmAddressBookReview,\n continueToBlindSigning,\n enableBlindSigningSettings,\n enterMenu,\n exitMenu,\n mainButton,\n navigateNext,\n navigatePrevious,\n reject,\n secondaryButton,\n sign,\n tapLong,\n tapQuick,\n} from \"@root/src/internal/use-cases/touchUseCases\";\n\nexport type ButtonFactory = () => ButtonController & {\n left(): Promise<void>;\n right(): Promise<void>;\n both(): Promise<void>;\n pressSequence(keys: ButtonKey[], delayMs?: number): Promise<void>;\n};\n\nexport type TapFactory = (deviceKey: string) => {\n tapQuick: (point: PercentCoordinates) => Promise<void>;\n tapLong: (point: PercentCoordinates, delayMs?: number) => Promise<void>;\n sign: (delayMs?: number) => Promise<void>;\n reject: () => Promise<void>;\n navigateNext: () => Promise<void>;\n navigatePrevious: () => Promise<void>;\n mainButton: () => Promise<void>;\n secondaryButton: () => Promise<void>;\n enterMenu: () => Promise<void>;\n exitMenu: () => Promise<void>;\n enableBlindSigningSettings: () => Promise<void>;\n continueToBlindSigning: () => Promise<void>;\n acceptBlindSigning: () => Promise<void>;\n confirmAddressBookReview: () => Promise<void>;\n};\n\nexport type DeviceControllerClientFactory = (\n baseURL: string,\n opts?: {\n timeoutMs?: number;\n clientHeader?: string;\n bearerToken?: string;\n screens?: DeviceScreens<string>;\n },\n) => DeviceControllerClient;\n\nexport type DeviceControllerClient = {\n buttonFactory: ButtonFactory;\n tapFactory: TapFactory;\n};\n\nexport const deviceControllerClientFactory: DeviceControllerClientFactory = (\n baseURL,\n opts = {},\n) => {\n const resolved: DeviceControllerOptions = {\n screens: opts.screens ?? DEFAULT_SCREENS,\n timeoutMs: opts.timeoutMs,\n clientHeader: opts.clientHeader,\n bearerToken: opts.bearerToken,\n };\n\n const { buttons, touch } = createDefaultControllers(baseURL, resolved);\n const press = pressButtons(buttons);\n\n return {\n buttonFactory: () => ({\n press: (key) => buttons.press(key),\n left: () => press.left(),\n right: () => press.right(),\n both: () => press.both(),\n pressSequence: (keys, delayMs) => pressSequence(buttons, keys, delayMs),\n }),\n tapFactory: (key) => ({\n tapQuick: tapQuick(touch, key),\n tapLong: tapLong(touch, key),\n sign: sign(touch, key),\n reject: reject(touch, key),\n navigateNext: navigateNext(touch, key),\n navigatePrevious: navigatePrevious(touch, key),\n mainButton: mainButton(touch, key),\n secondaryButton: secondaryButton(touch, key),\n enterMenu: enterMenu(touch, key),\n exitMenu: exitMenu(touch, key),\n enableBlindSigningSettings: enableBlindSigningSettings(touch, key),\n continueToBlindSigning: continueToBlindSigning(touch, key),\n acceptBlindSigning: acceptBlindSigning(touch, key),\n confirmAddressBookReview: confirmAddressBookReview(touch, key),\n }),\n };\n};\n\nexport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,2CAQhCC,EAAyC,iCACzCC,EAGO,uDACPC,EAeO,sDAyCA,MAAML,EAA+D,CAC1EM,EACAC,EAAO,CAAC,IACL,CACH,MAAMC,EAAoC,CACxC,QAASD,EAAK,SAAW,kBACzB,UAAWA,EAAK,UAChB,aAAcA,EAAK,aACnB,YAAaA,EAAK,WACpB,EAEM,CAAE,QAAAE,EAAS,MAAAC,CAAM,KAAI,4BAAyBJ,EAASE,CAAQ,EAC/DG,KAAQ,gBAAaF,CAAO,EAElC,MAAO,CACL,cAAe,KAAO,CACpB,MAAQG,GAAQH,EAAQ,MAAMG,CAAG,EACjC,KAAM,IAAMD,EAAM,KAAK,EACvB,MAAO,IAAMA,EAAM,MAAM,EACzB,KAAM,IAAMA,EAAM,KAAK,EACvB,cAAe,CAACE,EAAMC,OAAY,iBAAcL,EAASI,EAAMC,CAAO,CACxE,GACA,WAAaF,IAAS,CACpB,YAAU,YAASF,EAAOE,CAAG,EAC7B,WAAS,WAAQF,EAAOE,CAAG,EAC3B,QAAM,QAAKF,EAAOE,CAAG,EACrB,UAAQ,UAAOF,EAAOE,CAAG,EACzB,gBAAc,gBAAaF,EAAOE,CAAG,EACrC,oBAAkB,oBAAiBF,EAAOE,CAAG,EAC7C,cAAY,cAAWF,EAAOE,CAAG,EACjC,mBAAiB,mBAAgBF,EAAOE,CAAG,EAC3C,aAAW,aAAUF,EAAOE,CAAG,EAC/B,YAAU,YAASF,EAAOE,CAAG,EAC7B,8BAA4B,8BAA2BF,EAAOE,CAAG,EACjE,0BAAwB,0BAAuBF,EAAOE,CAAG,EACzD,sBAAoB,sBAAmBF,EAAOE,CAAG,EACjD,4BAA0B,4BAAyBF,EAAOE,CAAG,CAC/D,EACF,CACF",
|
|
6
6
|
"names": ["DeviceController_exports", "__export", "deviceControllerClientFactory", "__toCommonJS", "import_defaultScreens", "import_di", "import_buttonUseCases", "import_touchUseCases", "baseURL", "opts", "resolved", "buttons", "touch", "press", "key", "keys", "delayMs"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var o=require("./DeviceController");describe("deviceControllerClientFactory",()=>{it("returns a DeviceControllerdeviceClient with the expected shape",()=>{const e=(0,o.deviceControllerClientFactory)("http://localhost:0");expect(e).toBeDefined(),expect(e).toHaveProperty("buttonFactory"),expect(e).toHaveProperty("tapFactory");const t=e.buttonFactory();expect(typeof t.press).toBe("function"),expect(typeof t.left).toBe("function"),expect(typeof t.right).toBe("function"),expect(typeof t.both).toBe("function"),expect(typeof t.pressSequence).toBe("function");const c=e.tapFactory("flex");expect(typeof c.tapQuick).toBe("function"),expect(typeof c.tapLong).toBe("function")}),it("does not throw when created with custom options",()=>{const t=(0,o.deviceControllerClientFactory)("http://127.0.0.1:0",{clientHeader:"test-suite",timeoutMs:200,screens:{custom:{width:128,height:64},stax:{width:400,height:672}}});expect(t).toBeTruthy()}),it("creates independent instances (no accidental shared state)",()=>{const e=(0,o.deviceControllerClientFactory)("http://localhost:0"),t=(0,o.deviceControllerClientFactory)("http://localhost:0");expect(e).not.toBe(t),expect(e.buttonFactory().press).not.toBe(t.buttonFactory().press),expect(e.tapFactory("flex").tapQuick).not.toBe(t.tapFactory("flex").tapQuick)})});
|
|
1
|
+
"use strict";var o=require("./DeviceController");describe("deviceControllerClientFactory",()=>{it("returns a DeviceControllerdeviceClient with the expected shape",()=>{const e=(0,o.deviceControllerClientFactory)("http://localhost:0");expect(e).toBeDefined(),expect(e).toHaveProperty("buttonFactory"),expect(e).toHaveProperty("tapFactory");const t=e.buttonFactory();expect(typeof t.press).toBe("function"),expect(typeof t.left).toBe("function"),expect(typeof t.right).toBe("function"),expect(typeof t.both).toBe("function"),expect(typeof t.pressSequence).toBe("function");const c=e.tapFactory("flex");expect(typeof c.tapQuick).toBe("function"),expect(typeof c.tapLong).toBe("function")}),it("does not throw when created with custom options",()=>{const t=(0,o.deviceControllerClientFactory)("http://127.0.0.1:0",{clientHeader:"test-suite",timeoutMs:200,screens:{custom:{width:128,height:64},stax:{width:400,height:672}}});expect(t).toBeTruthy()}),it("creates independent instances (no accidental shared state)",()=>{const e=(0,o.deviceControllerClientFactory)("http://localhost:0"),t=(0,o.deviceControllerClientFactory)("http://localhost:0");expect(e).not.toBe(t),expect(e.buttonFactory().press).not.toBe(t.buttonFactory().press),expect(e.tapFactory("flex").tapQuick).not.toBe(t.tapFactory("flex").tapQuick)}),it("sends the bearer token with every request",async()=>{const e=vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}"));await(0,o.deviceControllerClientFactory)("http://localhost:0",{bearerToken:"session-token"}).buttonFactory().press("both"),expect(e).toHaveBeenCalledWith("http://localhost:0/button/both",expect.objectContaining({headers:expect.objectContaining({Authorization:"Bearer session-token"})})),e.mockRestore()})});
|
|
2
2
|
//# sourceMappingURL=DeviceController.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/DeviceController.test.ts"],
|
|
4
|
-
"sourcesContent": ["import type { DeviceScreens } from \"@internal/core/types\";\n\nimport { deviceControllerClientFactory } from \"./DeviceController\";\n\ndescribe(\"deviceControllerClientFactory\", () => {\n it(\"returns a DeviceControllerdeviceClient with the expected shape\", () => {\n const deviceClient = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(deviceClient).toBeDefined();\n expect(deviceClient).toHaveProperty(\"buttonFactory\");\n expect(deviceClient).toHaveProperty(\"tapFactory\");\n\n const deviceButtons = deviceClient.buttonFactory();\n\n // button surfaces\n expect(typeof deviceButtons.press).toBe(\"function\");\n expect(typeof deviceButtons.left).toBe(\"function\");\n expect(typeof deviceButtons.right).toBe(\"function\");\n expect(typeof deviceButtons.both).toBe(\"function\");\n expect(typeof deviceButtons.pressSequence).toBe(\"function\");\n\n const deviceTaps = deviceClient.tapFactory(\"flex\");\n\n // tap surfaces\n expect(typeof deviceTaps.tapQuick).toBe(\"function\");\n expect(typeof deviceTaps.tapLong).toBe(\"function\");\n });\n\n it(\"does not throw when created with custom options\", () => {\n const screens: DeviceScreens<string> = {\n custom: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n };\n const deviceClient = deviceControllerClientFactory(\"http://127.0.0.1:0\", {\n clientHeader: \"test-suite\",\n timeoutMs: 200,\n screens,\n });\n expect(deviceClient).toBeTruthy();\n });\n\n it(\"creates independent instances (no accidental shared state)\", () => {\n const a = deviceControllerClientFactory(\"http://localhost:0\");\n const b = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(a).not.toBe(b);\n expect(a.buttonFactory().press).not.toBe(b.buttonFactory().press);\n expect(a.tapFactory(\"flex\").tapQuick).not.toBe(\n b.tapFactory(\"flex\").tapQuick,\n );\n });\n});\n"],
|
|
5
|
-
"mappings": "aAEA,IAAAA,EAA8C,8BAE9C,SAAS,gCAAiC,IAAM,CAC9C,GAAG,iEAAkE,IAAM,CACzE,MAAMC,KAAe,iCAA8B,oBAAoB,EAEvE,OAAOA,CAAY,EAAE,YAAY,EACjC,OAAOA,CAAY,EAAE,eAAe,eAAe,EACnD,OAAOA,CAAY,EAAE,eAAe,YAAY,EAEhD,MAAMC,EAAgBD,EAAa,cAAc,EAGjD,OAAO,OAAOC,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,aAAa,EAAE,KAAK,UAAU,EAE1D,MAAMC,EAAaF,EAAa,WAAW,MAAM,EAGjD,OAAO,OAAOE,EAAW,QAAQ,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAW,OAAO,EAAE,KAAK,UAAU,CACnD,CAAC,EAED,GAAG,kDAAmD,IAAM,CAK1D,MAAMF,KAAe,iCAA8B,qBAAsB,CACvE,aAAc,aACd,UAAW,IACX,QAPqC,CACrC,OAAQ,CAAE,MAAO,IAAK,OAAQ,EAAG,EACjC,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClC,CAKA,CAAC,EACD,OAAOA,CAAY,EAAE,WAAW,CAClC,CAAC,EAED,GAAG,6DAA8D,IAAM,CACrE,MAAMG,KAAI,iCAA8B,oBAAoB,EACtDC,KAAI,iCAA8B,oBAAoB,EAE5D,OAAOD,CAAC,EAAE,IAAI,KAAKC,CAAC,EACpB,OAAOD,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,KAAKC,EAAE,cAAc,EAAE,KAAK,EAChE,OAAOD,EAAE,WAAW,MAAM,EAAE,QAAQ,EAAE,IAAI,KACxCC,EAAE,WAAW,MAAM,EAAE,QACvB,CACF,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["import_DeviceController", "deviceClient", "deviceButtons", "deviceTaps", "a", "b"]
|
|
4
|
+
"sourcesContent": ["import type { DeviceScreens } from \"@internal/core/types\";\n\nimport { deviceControllerClientFactory } from \"./DeviceController\";\n\ndescribe(\"deviceControllerClientFactory\", () => {\n it(\"returns a DeviceControllerdeviceClient with the expected shape\", () => {\n const deviceClient = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(deviceClient).toBeDefined();\n expect(deviceClient).toHaveProperty(\"buttonFactory\");\n expect(deviceClient).toHaveProperty(\"tapFactory\");\n\n const deviceButtons = deviceClient.buttonFactory();\n\n // button surfaces\n expect(typeof deviceButtons.press).toBe(\"function\");\n expect(typeof deviceButtons.left).toBe(\"function\");\n expect(typeof deviceButtons.right).toBe(\"function\");\n expect(typeof deviceButtons.both).toBe(\"function\");\n expect(typeof deviceButtons.pressSequence).toBe(\"function\");\n\n const deviceTaps = deviceClient.tapFactory(\"flex\");\n\n // tap surfaces\n expect(typeof deviceTaps.tapQuick).toBe(\"function\");\n expect(typeof deviceTaps.tapLong).toBe(\"function\");\n });\n\n it(\"does not throw when created with custom options\", () => {\n const screens: DeviceScreens<string> = {\n custom: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n };\n const deviceClient = deviceControllerClientFactory(\"http://127.0.0.1:0\", {\n clientHeader: \"test-suite\",\n timeoutMs: 200,\n screens,\n });\n expect(deviceClient).toBeTruthy();\n });\n\n it(\"creates independent instances (no accidental shared state)\", () => {\n const a = deviceControllerClientFactory(\"http://localhost:0\");\n const b = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(a).not.toBe(b);\n expect(a.buttonFactory().press).not.toBe(b.buttonFactory().press);\n expect(a.tapFactory(\"flex\").tapQuick).not.toBe(\n b.tapFactory(\"flex\").tapQuick,\n );\n });\n\n it(\"sends the bearer token with every request\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n const deviceClient = deviceControllerClientFactory(\"http://localhost:0\", {\n bearerToken: \"session-token\",\n });\n\n await deviceClient.buttonFactory().press(\"both\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"http://localhost:0/button/both\",\n expect.objectContaining({\n headers: expect.objectContaining({\n Authorization: \"Bearer session-token\",\n }),\n }),\n );\n fetchSpy.mockRestore();\n });\n});\n"],
|
|
5
|
+
"mappings": "aAEA,IAAAA,EAA8C,8BAE9C,SAAS,gCAAiC,IAAM,CAC9C,GAAG,iEAAkE,IAAM,CACzE,MAAMC,KAAe,iCAA8B,oBAAoB,EAEvE,OAAOA,CAAY,EAAE,YAAY,EACjC,OAAOA,CAAY,EAAE,eAAe,eAAe,EACnD,OAAOA,CAAY,EAAE,eAAe,YAAY,EAEhD,MAAMC,EAAgBD,EAAa,cAAc,EAGjD,OAAO,OAAOC,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,aAAa,EAAE,KAAK,UAAU,EAE1D,MAAMC,EAAaF,EAAa,WAAW,MAAM,EAGjD,OAAO,OAAOE,EAAW,QAAQ,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAW,OAAO,EAAE,KAAK,UAAU,CACnD,CAAC,EAED,GAAG,kDAAmD,IAAM,CAK1D,MAAMF,KAAe,iCAA8B,qBAAsB,CACvE,aAAc,aACd,UAAW,IACX,QAPqC,CACrC,OAAQ,CAAE,MAAO,IAAK,OAAQ,EAAG,EACjC,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClC,CAKA,CAAC,EACD,OAAOA,CAAY,EAAE,WAAW,CAClC,CAAC,EAED,GAAG,6DAA8D,IAAM,CACrE,MAAMG,KAAI,iCAA8B,oBAAoB,EACtDC,KAAI,iCAA8B,oBAAoB,EAE5D,OAAOD,CAAC,EAAE,IAAI,KAAKC,CAAC,EACpB,OAAOD,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,KAAKC,EAAE,cAAc,EAAE,KAAK,EAChE,OAAOD,EAAE,WAAW,MAAM,EAAE,QAAQ,EAAE,IAAI,KACxCC,EAAE,WAAW,MAAM,EAAE,QACvB,CACF,CAAC,EAED,GAAG,4CAA6C,SAAY,CAC1D,MAAMC,EAAW,GACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAKvC,QAJqB,iCAA8B,qBAAsB,CACvE,YAAa,eACf,CAAC,EAEkB,cAAc,EAAE,MAAM,MAAM,EAE/C,OAAOA,CAAQ,EAAE,qBACf,iCACA,OAAO,iBAAiB,CACtB,QAAS,OAAO,iBAAiB,CAC/B,cAAe,sBACjB,CAAC,CACH,CAAC,CACH,EACAA,EAAS,YAAY,CACvB,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_DeviceController", "deviceClient", "deviceButtons", "deviceTaps", "a", "b", "fetchSpy"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var a=(t,e)=>{for(var c in e)s(t,c,{get:e[c],enumerable:!0})},g=(t,e,c,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of i(e))!x.call(t,r)&&r!==c&&s(t,r,{get:()=>e[r],enumerable:!(n=o(e,r))||n.enumerable});return t};var d=t=>g(s({},"__esModule",{value:!0}),t);var y={};a(y,{SpeculosActions:()=>p});module.exports=d(y);var p=(n=>(n.PRESS="press",n.RELEASE="release",n.PRESS_AND_RELEASE="press-and-release",n))(p||{});0&&(module.exports={SpeculosActions});
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/core/types.ts"],
|
|
4
|
-
"sourcesContent": ["export type ButtonKey = \"left\" | \"right\" | \"both\";\n\nexport type ScreenSpec = Readonly<{ width: number; height: number }>;\n\nexport type DeviceScreens<K extends string = string> = Readonly<\n Record<K, ScreenSpec>\n>;\n\nexport type Range<\n N extends number,\n Acc extends number[] = [],\n> = Acc[\"length\"] extends N ? Acc[number] : Range<N, [...Acc, Acc[\"length\"]]>;\nexport type Percent = Range<101>;\n\nexport type PercentCoordinates = { x: Percent; y: Percent };\n\nexport type DeviceControllerOptions<K extends string = string> = {\n screens: DeviceScreens<K>;\n timeoutMs?: number;\n clientHeader?: string;\n};\n\nexport interface HttpClient {\n post(url: string, data?: unknown): Promise<unknown>;\n}\n\nexport enum SpeculosActions {\n PRESS = \"press\",\n RELEASE = \"release\",\n PRESS_AND_RELEASE = \"press-and-release\",\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,
|
|
4
|
+
"sourcesContent": ["export type ButtonKey = \"left\" | \"right\" | \"both\";\n\nexport type ScreenSpec = Readonly<{ width: number; height: number }>;\n\nexport type DeviceScreens<K extends string = string> = Readonly<\n Record<K, ScreenSpec>\n>;\n\nexport type Range<\n N extends number,\n Acc extends number[] = [],\n> = Acc[\"length\"] extends N ? Acc[number] : Range<N, [...Acc, Acc[\"length\"]]>;\nexport type Percent = Range<101>;\n\nexport type PercentCoordinates = { x: Percent; y: Percent };\n\nexport type DeviceControllerOptions<K extends string = string> = {\n screens: DeviceScreens<K>;\n timeoutMs?: number;\n clientHeader?: string;\n bearerToken?: string;\n};\n\nexport interface HttpClient {\n post(url: string, data?: unknown): Promise<unknown>;\n}\n\nexport enum SpeculosActions {\n PRESS = \"press\",\n RELEASE = \"release\",\n PRESS_AND_RELEASE = \"press-and-release\",\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GA2BO,IAAKE,OACVA,EAAA,MAAQ,QACRA,EAAA,QAAU,UACVA,EAAA,kBAAoB,oBAHVA,OAAA",
|
|
6
6
|
"names": ["types_exports", "__export", "SpeculosActions", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var l=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var
|
|
1
|
+
"use strict";var l=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var T=(o,t)=>{for(var e in t)l(o,e,{get:t[e],enumerable:!0})},w=(o,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of k(t))!y.call(o,r)&&r!==e&&l(o,r,{get:()=>t[r],enumerable:!(n=h(t,r))||n.enumerable});return o};var x=o=>w(l({},"__esModule",{value:!0}),o);var D={};T(D,{createDefaultControllers:()=>B});module.exports=x(D);var i=require("@ledgerhq/device-management-kit"),s=require("./adapters/DefaultButtonController"),c=require("./adapters/DefaultTouchController"),u=require("./utils/axisClamp");function B(o,t){const e=t.timeoutMs??1500,n=new i.DmkNetworkClient({baseUrl:o,headers:{"X-Ledger-Client-Version":t.clientHeader??"ldmk-transport-speculos",...t.bearerToken?{Authorization:`Bearer ${t.bearerToken}`}:{}}}),r={async post(m,f){return n.post(m,f,{timeoutMs:e})}},a=(0,u.createAxes)(t.screens),p=new s.DefaultButtonController(r),C=new c.DefaultTouchController(r,a);return{buttons:p,touch:C}}0&&(module.exports={createDefaultControllers});
|
|
2
2
|
//# sourceMappingURL=di.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/di.ts"],
|
|
4
|
-
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type { DeviceControllerOptions, HttpClient } from \"@internal/core/types\";\nimport { type AxisMap, createAxes } from \"@internal/utils/axisClamp\";\nimport type { TouchController } from \"@root/src/internal/core/TouchController\";\n\nexport type ControllersContainer = {\n buttons: ButtonController;\n touch: TouchController;\n};\n\nexport function createDefaultControllers(\n baseURL: string,\n opts: DeviceControllerOptions,\n): ControllersContainer {\n const timeoutMs = opts.timeoutMs ?? 1500;\n const client = new DmkNetworkClient({\n baseUrl: baseURL,\n headers: {\n \"X-Ledger-Client-Version\": opts.clientHeader ?? \"ldmk-transport-speculos\",\n },\n });\n\n const http: HttpClient = {\n async post(url: string, data?: unknown): Promise<unknown> {\n return client.post(url, data, { timeoutMs });\n },\n };\n\n const axes: AxisMap = createAxes(opts.screens);\n\n const buttons: ButtonController = new DefaultButtonController(http);\n const touch: TouchController = new DefaultTouchController(http, axes);\n\n return { buttons, touch };\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAiC,2CAEjCC,EAAwC,sDACxCC,EAAuC,qDAGvCC,EAAyC,qCAQlC,SAASL,EACdM,EACAC,EACsB,CACtB,MAAMC,EAAYD,EAAK,WAAa,KAC9BE,EAAS,IAAI,mBAAiB,CAClC,QAASH,EACT,QAAS,CACP,0BAA2BC,EAAK,cAAgB,
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type { DeviceControllerOptions, HttpClient } from \"@internal/core/types\";\nimport { type AxisMap, createAxes } from \"@internal/utils/axisClamp\";\nimport type { TouchController } from \"@root/src/internal/core/TouchController\";\n\nexport type ControllersContainer = {\n buttons: ButtonController;\n touch: TouchController;\n};\n\nexport function createDefaultControllers(\n baseURL: string,\n opts: DeviceControllerOptions,\n): ControllersContainer {\n const timeoutMs = opts.timeoutMs ?? 1500;\n const client = new DmkNetworkClient({\n baseUrl: baseURL,\n headers: {\n \"X-Ledger-Client-Version\": opts.clientHeader ?? \"ldmk-transport-speculos\",\n ...(opts.bearerToken\n ? { Authorization: `Bearer ${opts.bearerToken}` }\n : {}),\n },\n });\n\n const http: HttpClient = {\n async post(url: string, data?: unknown): Promise<unknown> {\n return client.post(url, data, { timeoutMs });\n },\n };\n\n const axes: AxisMap = createAxes(opts.screens);\n\n const buttons: ButtonController = new DefaultButtonController(http);\n const touch: TouchController = new DefaultTouchController(http, axes);\n\n return { buttons, touch };\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAiC,2CAEjCC,EAAwC,sDACxCC,EAAuC,qDAGvCC,EAAyC,qCAQlC,SAASL,EACdM,EACAC,EACsB,CACtB,MAAMC,EAAYD,EAAK,WAAa,KAC9BE,EAAS,IAAI,mBAAiB,CAClC,QAASH,EACT,QAAS,CACP,0BAA2BC,EAAK,cAAgB,0BAChD,GAAIA,EAAK,YACL,CAAE,cAAe,UAAUA,EAAK,WAAW,EAAG,EAC9C,CAAC,CACP,CACF,CAAC,EAEKG,EAAmB,CACvB,MAAM,KAAKC,EAAaC,EAAkC,CACxD,OAAOH,EAAO,KAAKE,EAAKC,EAAM,CAAE,UAAAJ,CAAU,CAAC,CAC7C,CACF,EAEMK,KAAgB,cAAWN,EAAK,OAAO,EAEvCO,EAA4B,IAAI,0BAAwBJ,CAAI,EAC5DK,EAAyB,IAAI,yBAAuBL,EAAMG,CAAI,EAEpE,MAAO,CAAE,QAAAC,EAAS,MAAAC,CAAM,CAC1B",
|
|
6
6
|
"names": ["di_exports", "__export", "createDefaultControllers", "__toCommonJS", "import_device_management_kit", "import_DefaultButtonController", "import_DefaultTouchController", "import_axisClamp", "baseURL", "opts", "timeoutMs", "client", "http", "url", "data", "axes", "buttons", "touch"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("vitest"),a=require("./adapters/DefaultButtonController"),c=require("./adapters/DefaultTouchController"),s=require("./di");const n={flex:{width:128,height:64},stax:{width:400,height:672}};(0,e.afterEach)(()=>{e.vi.restoreAllMocks()});(0,e.describe)("createDefaultControllers - fetch configuration",()=>{(0,e.it)("configures with custom timeout and header",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=(0,s.createDefaultControllers)("https://example.com/api",{screens:n,timeoutMs:2345,clientHeader:"test-client"});await o.press("left"),(0,e.expect)(t).toHaveBeenCalledTimes(1),(0,e.expect)(t).toHaveBeenCalledWith("https://example.com/api/button/left",e.expect.objectContaining({method:"POST",headers:e.expect.objectContaining({"X-Ledger-Client-Version":"test-client"})}))}),(0,e.it)("applies default timeout and client header when not provided",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=(0,s.createDefaultControllers)("https://localhost:1234",{screens:n});await o.press("left"),(0,e.expect)(t).toHaveBeenCalledWith("https://localhost:1234/button/left",e.expect.objectContaining({method:"POST",headers:e.expect.objectContaining({"X-Ledger-Client-Version":"ldmk-transport-speculos"})}))})});(0,e.describe)("createDefaultControllers - wiring",()=>{(0,e.it)("returns correct controller implementations",()=>{const{buttons:t,touch:o}=(0,s.createDefaultControllers)("https://x",{screens:n});(0,e.expect)(t).toBeInstanceOf(a.DefaultButtonController),(0,e.expect)(o).toBeInstanceOf(c.DefaultTouchController),(0,e.expect)(typeof t.press).toBe("function")}),(0,e.it)("creates fresh instances per invocation",()=>{const t=(0,s.createDefaultControllers)("https://x",{screens:n}),o=(0,s.createDefaultControllers)("https://x",{screens:n});(0,e.expect)(t.buttons).not.toBe(o.buttons),(0,e.expect)(t.touch).not.toBe(o.touch)}),(0,e.it)("button.press posts the correct payload",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=(0,s.createDefaultControllers)("https://x",{screens:n});await o.press("left"),(0,e.expect)(t).toHaveBeenCalledWith("https://x/button/left",e.expect.objectContaining({method:"POST",body:JSON.stringify({action:"press-and-release"})}))}),(0,e.it)("touch.tapAndRelease maps percent to absolute coords",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{touch:o}=(0,s.createDefaultControllers)("https://x",{screens:n});await o.tapAndRelease("flex",{x:50,y:50}),(0,e.expect)(t).toHaveBeenCalledWith("https://x/finger",e.expect.objectContaining({method:"POST",body:JSON.stringify({action:"press-and-release",x:64,y:32})}))})});
|
|
1
|
+
"use strict";var e=require("vitest"),a=require("./adapters/DefaultButtonController"),c=require("./adapters/DefaultTouchController"),s=require("./di");const n={flex:{width:128,height:64},stax:{width:400,height:672}};(0,e.afterEach)(()=>{e.vi.restoreAllMocks()});(0,e.describe)("createDefaultControllers - fetch configuration",()=>{(0,e.it)("configures with custom timeout and header",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=(0,s.createDefaultControllers)("https://example.com/api",{screens:n,timeoutMs:2345,clientHeader:"test-client"});await o.press("left"),(0,e.expect)(t).toHaveBeenCalledTimes(1),(0,e.expect)(t).toHaveBeenCalledWith("https://example.com/api/button/left",e.expect.objectContaining({method:"POST",headers:e.expect.objectContaining({"X-Ledger-Client-Version":"test-client"})}))}),(0,e.it)("applies default timeout and client header when not provided",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=(0,s.createDefaultControllers)("https://localhost:1234",{screens:n});await o.press("left"),(0,e.expect)(t).toHaveBeenCalledWith("https://localhost:1234/button/left",e.expect.objectContaining({method:"POST",headers:e.expect.objectContaining({"X-Ledger-Client-Version":"ldmk-transport-speculos"})}))}),(0,e.it)("sends the bearer token alongside the client header",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{touch:o}=(0,s.createDefaultControllers)("https://localhost:1234",{screens:n,clientHeader:"test-client",bearerToken:"session-token"});await o.tap("stax",{x:50,y:50}),(0,e.expect)(t).toHaveBeenCalledWith("https://localhost:1234/finger",e.expect.objectContaining({headers:e.expect.objectContaining({Authorization:"Bearer session-token","X-Ledger-Client-Version":"test-client"})}))})});(0,e.describe)("createDefaultControllers - wiring",()=>{(0,e.it)("returns correct controller implementations",()=>{const{buttons:t,touch:o}=(0,s.createDefaultControllers)("https://x",{screens:n});(0,e.expect)(t).toBeInstanceOf(a.DefaultButtonController),(0,e.expect)(o).toBeInstanceOf(c.DefaultTouchController),(0,e.expect)(typeof t.press).toBe("function")}),(0,e.it)("creates fresh instances per invocation",()=>{const t=(0,s.createDefaultControllers)("https://x",{screens:n}),o=(0,s.createDefaultControllers)("https://x",{screens:n});(0,e.expect)(t.buttons).not.toBe(o.buttons),(0,e.expect)(t.touch).not.toBe(o.touch)}),(0,e.it)("button.press posts the correct payload",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=(0,s.createDefaultControllers)("https://x",{screens:n});await o.press("left"),(0,e.expect)(t).toHaveBeenCalledWith("https://x/button/left",e.expect.objectContaining({method:"POST",body:JSON.stringify({action:"press-and-release"})}))}),(0,e.it)("touch.tapAndRelease maps percent to absolute coords",async()=>{const t=e.vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{touch:o}=(0,s.createDefaultControllers)("https://x",{screens:n});await o.tapAndRelease("flex",{x:50,y:50}),(0,e.expect)(t).toHaveBeenCalledWith("https://x/finger",e.expect.objectContaining({method:"POST",body:JSON.stringify({action:"press-and-release",x:64,y:32})}))})});
|
|
2
2
|
//# sourceMappingURL=di.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/di.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\n\nimport { createDefaultControllers } from \"./di\";\n\nconst SCREENS = {\n flex: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n} as const;\n\nafterEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"createDefaultControllers - fetch configuration\", () => {\n it(\"configures with custom timeout and header\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://example.com/api\", {\n screens: SCREENS,\n timeoutMs: 2345,\n clientHeader: \"test-client\",\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledTimes(1);\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://example.com/api/button/left\",\n expect.objectContaining({\n method: \"POST\",\n headers: expect.objectContaining({\n \"X-Ledger-Client-Version\": \"test-client\",\n }),\n }),\n );\n });\n\n it(\"applies default timeout and client header when not provided\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://localhost:1234\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://localhost:1234/button/left\",\n expect.objectContaining({\n method: \"POST\",\n headers: expect.objectContaining({\n \"X-Ledger-Client-Version\": \"ldmk-transport-speculos\",\n }),\n }),\n );\n });\n});\n\ndescribe(\"createDefaultControllers - wiring\", () => {\n it(\"returns correct controller implementations\", () => {\n const { buttons, touch } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n expect(buttons).toBeInstanceOf(DefaultButtonController);\n expect(touch).toBeInstanceOf(DefaultTouchController);\n expect(typeof buttons.press).toBe(\"function\");\n });\n\n it(\"creates fresh instances per invocation\", () => {\n const a = createDefaultControllers(\"https://x\", { screens: SCREENS });\n const b = createDefaultControllers(\"https://x\", { screens: SCREENS });\n\n expect(a.buttons).not.toBe(b.buttons);\n expect(a.touch).not.toBe(b.touch);\n });\n\n it(\"button.press posts the correct payload\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://x/button/left\",\n expect.objectContaining({\n method: \"POST\",\n body: JSON.stringify({ action: \"press-and-release\" }),\n }),\n );\n });\n\n it(\"touch.tapAndRelease maps percent to absolute coords\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { touch } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n // 50% of 128x64 \u2192 (64, 32)\n await touch.tapAndRelease(\"flex\", { x: 50 as any, y: 50 as any });\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://x/finger\",\n expect.objectContaining({\n method: \"POST\",\n body: JSON.stringify({\n action: \"press-and-release\",\n x: 64,\n y: 32,\n }),\n }),\n );\n });\n});\n"],
|
|
5
|
-
"mappings": "aACA,IAAAA,EAAoD,kBAEpDC,EAAwC,sDACxCC,EAAuC,qDAEvCC,EAAyC,gBAEzC,MAAMC,EAAU,CACd,KAAM,CAAE,MAAO,IAAK,OAAQ,EAAG,EAC/B,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClC,KAEA,aAAU,IAAM,CACd,KAAG,gBAAgB,CACrB,CAAC,KAED,YAAS,iDAAkD,IAAM,IAC/D,MAAG,4CAA6C,SAAY,CAC1D,MAAMC,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,QAAAC,CAAQ,KAAI,4BAAyB,0BAA2B,CACtE,QAASF,EACT,UAAW,KACX,aAAc,aAChB,CAAC,EAED,MAAME,EAAQ,MAAM,MAAM,KAE1B,UAAOD,CAAQ,EAAE,sBAAsB,CAAC,KACxC,UAAOA,CAAQ,EAAE,qBACf,sCACA,SAAO,iBAAiB,CACtB,OAAQ,OACR,QAAS,SAAO,iBAAiB,CAC/B,0BAA2B,aAC7B,CAAC,CACH,CAAC,CACH,CACF,CAAC,KAED,MAAG,8DAA+D,SAAY,CAC5E,MAAMA,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,QAAAC,CAAQ,KAAI,4BAAyB,yBAA0B,CACrE,QAASF,CACX,CAAC,EAED,MAAME,EAAQ,MAAM,MAAM,KAE1B,UAAOD,CAAQ,EAAE,qBACf,qCACA,SAAO,iBAAiB,CACtB,OAAQ,OACR,QAAS,SAAO,iBAAiB,CAC/B,0BAA2B,yBAC7B,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC,KAED,YAAS,oCAAqC,IAAM,IAClD,MAAG,6CAA8C,IAAM,CACrD,KAAM,CAAE,QAAAC,EAAS,MAAAC,CAAM,KAAI,4BAAyB,YAAa,CAC/D,QAASH,CACX,CAAC,KAED,UAAOE,CAAO,EAAE,eAAe,yBAAuB,KACtD,UAAOC,CAAK,EAAE,eAAe,wBAAsB,KACnD,UAAO,OAAOD,EAAQ,KAAK,EAAE,KAAK,UAAU,CAC9C,CAAC,KAED,MAAG,yCAA0C,IAAM,CACjD,MAAME,KAAI,4BAAyB,YAAa,CAAE,QAASJ,CAAQ,CAAC,EAC9DK,KAAI,4BAAyB,YAAa,CAAE,QAASL,CAAQ,CAAC,KAEpE,UAAOI,EAAE,OAAO,EAAE,IAAI,KAAKC,EAAE,OAAO,KACpC,UAAOD,EAAE,KAAK,EAAE,IAAI,KAAKC,EAAE,KAAK,CAClC,CAAC,KAED,MAAG,yCAA0C,SAAY,CACvD,MAAMJ,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,QAAAC,CAAQ,KAAI,4BAAyB,YAAa,CACxD,QAASF,CACX,CAAC,EAED,MAAME,EAAQ,MAAM,MAAM,KAE1B,UAAOD,CAAQ,EAAE,qBACf,wBACA,SAAO,iBAAiB,CACtB,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,OAAQ,mBAAoB,CAAC,CACtD,CAAC,CACH,CACF,CAAC,KAED,MAAG,sDAAuD,SAAY,CACpE,MAAMA,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,MAAAE,CAAM,KAAI,4BAAyB,YAAa,CACtD,QAASH,CACX,CAAC,EAGD,MAAMG,EAAM,cAAc,OAAQ,CAAE,EAAG,GAAW,EAAG,EAAU,CAAC,KAEhE,UAAOF,CAAQ,EAAE,qBACf,mBACA,SAAO,iBAAiB,CACtB,OAAQ,OACR,KAAM,KAAK,UAAU,CACnB,OAAQ,oBACR,EAAG,GACH,EAAG,EACL,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC",
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\n\nimport { createDefaultControllers } from \"./di\";\n\nconst SCREENS = {\n flex: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n} as const;\n\nafterEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"createDefaultControllers - fetch configuration\", () => {\n it(\"configures with custom timeout and header\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://example.com/api\", {\n screens: SCREENS,\n timeoutMs: 2345,\n clientHeader: \"test-client\",\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledTimes(1);\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://example.com/api/button/left\",\n expect.objectContaining({\n method: \"POST\",\n headers: expect.objectContaining({\n \"X-Ledger-Client-Version\": \"test-client\",\n }),\n }),\n );\n });\n\n it(\"applies default timeout and client header when not provided\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://localhost:1234\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://localhost:1234/button/left\",\n expect.objectContaining({\n method: \"POST\",\n headers: expect.objectContaining({\n \"X-Ledger-Client-Version\": \"ldmk-transport-speculos\",\n }),\n }),\n );\n });\n\n it(\"sends the bearer token alongside the client header\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { touch } = createDefaultControllers(\"https://localhost:1234\", {\n screens: SCREENS,\n clientHeader: \"test-client\",\n bearerToken: \"session-token\",\n });\n\n await touch.tap(\"stax\", { x: 50, y: 50 });\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://localhost:1234/finger\",\n expect.objectContaining({\n headers: expect.objectContaining({\n Authorization: \"Bearer session-token\",\n \"X-Ledger-Client-Version\": \"test-client\",\n }),\n }),\n );\n });\n});\n\ndescribe(\"createDefaultControllers - wiring\", () => {\n it(\"returns correct controller implementations\", () => {\n const { buttons, touch } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n expect(buttons).toBeInstanceOf(DefaultButtonController);\n expect(touch).toBeInstanceOf(DefaultTouchController);\n expect(typeof buttons.press).toBe(\"function\");\n });\n\n it(\"creates fresh instances per invocation\", () => {\n const a = createDefaultControllers(\"https://x\", { screens: SCREENS });\n const b = createDefaultControllers(\"https://x\", { screens: SCREENS });\n\n expect(a.buttons).not.toBe(b.buttons);\n expect(a.touch).not.toBe(b.touch);\n });\n\n it(\"button.press posts the correct payload\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://x/button/left\",\n expect.objectContaining({\n method: \"POST\",\n body: JSON.stringify({ action: \"press-and-release\" }),\n }),\n );\n });\n\n it(\"touch.tapAndRelease maps percent to absolute coords\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { touch } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n // 50% of 128x64 \u2192 (64, 32)\n await touch.tapAndRelease(\"flex\", { x: 50 as any, y: 50 as any });\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://x/finger\",\n expect.objectContaining({\n method: \"POST\",\n body: JSON.stringify({\n action: \"press-and-release\",\n x: 64,\n y: 32,\n }),\n }),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "aACA,IAAAA,EAAoD,kBAEpDC,EAAwC,sDACxCC,EAAuC,qDAEvCC,EAAyC,gBAEzC,MAAMC,EAAU,CACd,KAAM,CAAE,MAAO,IAAK,OAAQ,EAAG,EAC/B,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClC,KAEA,aAAU,IAAM,CACd,KAAG,gBAAgB,CACrB,CAAC,KAED,YAAS,iDAAkD,IAAM,IAC/D,MAAG,4CAA6C,SAAY,CAC1D,MAAMC,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,QAAAC,CAAQ,KAAI,4BAAyB,0BAA2B,CACtE,QAASF,EACT,UAAW,KACX,aAAc,aAChB,CAAC,EAED,MAAME,EAAQ,MAAM,MAAM,KAE1B,UAAOD,CAAQ,EAAE,sBAAsB,CAAC,KACxC,UAAOA,CAAQ,EAAE,qBACf,sCACA,SAAO,iBAAiB,CACtB,OAAQ,OACR,QAAS,SAAO,iBAAiB,CAC/B,0BAA2B,aAC7B,CAAC,CACH,CAAC,CACH,CACF,CAAC,KAED,MAAG,8DAA+D,SAAY,CAC5E,MAAMA,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,QAAAC,CAAQ,KAAI,4BAAyB,yBAA0B,CACrE,QAASF,CACX,CAAC,EAED,MAAME,EAAQ,MAAM,MAAM,KAE1B,UAAOD,CAAQ,EAAE,qBACf,qCACA,SAAO,iBAAiB,CACtB,OAAQ,OACR,QAAS,SAAO,iBAAiB,CAC/B,0BAA2B,yBAC7B,CAAC,CACH,CAAC,CACH,CACF,CAAC,KAED,MAAG,qDAAsD,SAAY,CACnE,MAAMA,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,MAAAE,CAAM,KAAI,4BAAyB,yBAA0B,CACnE,QAASH,EACT,aAAc,cACd,YAAa,eACf,CAAC,EAED,MAAMG,EAAM,IAAI,OAAQ,CAAE,EAAG,GAAI,EAAG,EAAG,CAAC,KAExC,UAAOF,CAAQ,EAAE,qBACf,gCACA,SAAO,iBAAiB,CACtB,QAAS,SAAO,iBAAiB,CAC/B,cAAe,uBACf,0BAA2B,aAC7B,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC,KAED,YAAS,oCAAqC,IAAM,IAClD,MAAG,6CAA8C,IAAM,CACrD,KAAM,CAAE,QAAAC,EAAS,MAAAC,CAAM,KAAI,4BAAyB,YAAa,CAC/D,QAASH,CACX,CAAC,KAED,UAAOE,CAAO,EAAE,eAAe,yBAAuB,KACtD,UAAOC,CAAK,EAAE,eAAe,wBAAsB,KACnD,UAAO,OAAOD,EAAQ,KAAK,EAAE,KAAK,UAAU,CAC9C,CAAC,KAED,MAAG,yCAA0C,IAAM,CACjD,MAAME,KAAI,4BAAyB,YAAa,CAAE,QAASJ,CAAQ,CAAC,EAC9DK,KAAI,4BAAyB,YAAa,CAAE,QAASL,CAAQ,CAAC,KAEpE,UAAOI,EAAE,OAAO,EAAE,IAAI,KAAKC,EAAE,OAAO,KACpC,UAAOD,EAAE,KAAK,EAAE,IAAI,KAAKC,EAAE,KAAK,CAClC,CAAC,KAED,MAAG,yCAA0C,SAAY,CACvD,MAAMJ,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,QAAAC,CAAQ,KAAI,4BAAyB,YAAa,CACxD,QAASF,CACX,CAAC,EAED,MAAME,EAAQ,MAAM,MAAM,KAE1B,UAAOD,CAAQ,EAAE,qBACf,wBACA,SAAO,iBAAiB,CACtB,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,OAAQ,mBAAoB,CAAC,CACtD,CAAC,CACH,CACF,CAAC,KAED,MAAG,sDAAuD,SAAY,CACpE,MAAMA,EAAW,KACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAEjC,CAAE,MAAAE,CAAM,KAAI,4BAAyB,YAAa,CACtD,QAASH,CACX,CAAC,EAGD,MAAMG,EAAM,cAAc,OAAQ,CAAE,EAAG,GAAW,EAAG,EAAU,CAAC,KAEhE,UAAOF,CAAQ,EAAE,qBACf,mBACA,SAAO,iBAAiB,CACtB,OAAQ,OACR,KAAM,KAAK,UAAU,CACnB,OAAQ,oBACR,EAAG,GACH,EAAG,EACL,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["import_vitest", "import_DefaultButtonController", "import_DefaultTouchController", "import_di", "SCREENS", "fetchSpy", "buttons", "touch", "a", "b"]
|
|
7
7
|
}
|
package/lib/esm/package.json
CHANGED
|
@@ -52,5 +52,5 @@
|
|
|
52
52
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
53
53
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
54
54
|
},
|
|
55
|
-
"version": "0.0.0-develop-
|
|
55
|
+
"version": "0.0.0-develop-20261014001241"
|
|
56
56
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DEFAULT_SCREENS as a}from"../internal/config/defaultScreens";import{createDefaultControllers as l}from"../../src/internal/di";import{pressButtons as d,pressSequence as u}from"../../src/internal/use-cases/buttonUseCases";import{acceptBlindSigning as
|
|
1
|
+
import{DEFAULT_SCREENS as a}from"../internal/config/defaultScreens";import{createDefaultControllers as l}from"../../src/internal/di";import{pressButtons as d,pressSequence as u}from"../../src/internal/use-cases/buttonUseCases";import{acceptBlindSigning as m,confirmAddressBookReview as p,continueToBlindSigning as v,enableBlindSigningSettings as g,enterMenu as B,exitMenu as P,mainButton as C,navigateNext as S,navigatePrevious as b,reject as y,secondaryButton as f,sign as x,tapLong as D,tapQuick as F}from"../../src/internal/use-cases/touchUseCases";const R=(r,o={})=>{const s={screens:o.screens??a,timeoutMs:o.timeoutMs,clientHeader:o.clientHeader,bearerToken:o.bearerToken},{buttons:n,touch:t}=l(r,s),i=d(n);return{buttonFactory:()=>({press:e=>n.press(e),left:()=>i.left(),right:()=>i.right(),both:()=>i.both(),pressSequence:(e,c)=>u(n,e,c)}),tapFactory:e=>({tapQuick:F(t,e),tapLong:D(t,e),sign:x(t,e),reject:y(t,e),navigateNext:S(t,e),navigatePrevious:b(t,e),mainButton:C(t,e),secondaryButton:f(t,e),enterMenu:B(t,e),exitMenu:P(t,e),enableBlindSigningSettings:g(t,e),continueToBlindSigning:v(t,e),acceptBlindSigning:m(t,e),confirmAddressBookReview:p(t,e)})}};export{R as deviceControllerClientFactory};
|
|
2
2
|
//# sourceMappingURL=DeviceController.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/DeviceController.ts"],
|
|
4
|
-
"sourcesContent": ["import { DEFAULT_SCREENS } from \"@internal/config/defaultScreens\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n} from \"@internal/core/types\";\nimport { createDefaultControllers } from \"@root/src/internal/di\";\nimport {\n pressButtons,\n pressSequence,\n} from \"@root/src/internal/use-cases/buttonUseCases\";\nimport {\n acceptBlindSigning,\n confirmAddressBookReview,\n continueToBlindSigning,\n enableBlindSigningSettings,\n enterMenu,\n exitMenu,\n mainButton,\n navigateNext,\n navigatePrevious,\n reject,\n secondaryButton,\n sign,\n tapLong,\n tapQuick,\n} from \"@root/src/internal/use-cases/touchUseCases\";\n\nexport type ButtonFactory = () => ButtonController & {\n left(): Promise<void>;\n right(): Promise<void>;\n both(): Promise<void>;\n pressSequence(keys: ButtonKey[], delayMs?: number): Promise<void>;\n};\n\nexport type TapFactory = (deviceKey: string) => {\n tapQuick: (point: PercentCoordinates) => Promise<void>;\n tapLong: (point: PercentCoordinates, delayMs?: number) => Promise<void>;\n sign: (delayMs?: number) => Promise<void>;\n reject: () => Promise<void>;\n navigateNext: () => Promise<void>;\n navigatePrevious: () => Promise<void>;\n mainButton: () => Promise<void>;\n secondaryButton: () => Promise<void>;\n enterMenu: () => Promise<void>;\n exitMenu: () => Promise<void>;\n enableBlindSigningSettings: () => Promise<void>;\n continueToBlindSigning: () => Promise<void>;\n acceptBlindSigning: () => Promise<void>;\n confirmAddressBookReview: () => Promise<void>;\n};\n\nexport type DeviceControllerClientFactory = (\n baseURL: string,\n opts?: {\n timeoutMs?: number;\n clientHeader?: string;\n screens?: DeviceScreens<string>;\n },\n) => DeviceControllerClient;\n\nexport type DeviceControllerClient = {\n buttonFactory: ButtonFactory;\n tapFactory: TapFactory;\n};\n\nexport const deviceControllerClientFactory: DeviceControllerClientFactory = (\n baseURL,\n opts = {},\n) => {\n const resolved: DeviceControllerOptions = {\n screens: opts.screens ?? DEFAULT_SCREENS,\n timeoutMs: opts.timeoutMs,\n clientHeader: opts.clientHeader,\n };\n\n const { buttons, touch } = createDefaultControllers(baseURL, resolved);\n const press = pressButtons(buttons);\n\n return {\n buttonFactory: () => ({\n press: (key) => buttons.press(key),\n left: () => press.left(),\n right: () => press.right(),\n both: () => press.both(),\n pressSequence: (keys, delayMs) => pressSequence(buttons, keys, delayMs),\n }),\n tapFactory: (key) => ({\n tapQuick: tapQuick(touch, key),\n tapLong: tapLong(touch, key),\n sign: sign(touch, key),\n reject: reject(touch, key),\n navigateNext: navigateNext(touch, key),\n navigatePrevious: navigatePrevious(touch, key),\n mainButton: mainButton(touch, key),\n secondaryButton: secondaryButton(touch, key),\n enterMenu: enterMenu(touch, key),\n exitMenu: exitMenu(touch, key),\n enableBlindSigningSettings: enableBlindSigningSettings(touch, key),\n continueToBlindSigning: continueToBlindSigning(touch, key),\n acceptBlindSigning: acceptBlindSigning(touch, key),\n confirmAddressBookReview: confirmAddressBookReview(touch, key),\n }),\n };\n};\n\nexport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n};\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,mBAAAA,MAAuB,kCAQhC,OAAS,4BAAAC,MAAgC,wBACzC,OACE,gBAAAC,EACA,iBAAAC,MACK,8CACP,OACE,sBAAAC,EACA,4BAAAC,EACA,0BAAAC,EACA,8BAAAC,EACA,aAAAC,EACA,YAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,oBAAAC,EACA,UAAAC,EACA,mBAAAC,EACA,QAAAC,EACA,WAAAC,EACA,YAAAC,MACK,
|
|
4
|
+
"sourcesContent": ["import { DEFAULT_SCREENS } from \"@internal/config/defaultScreens\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n} from \"@internal/core/types\";\nimport { createDefaultControllers } from \"@root/src/internal/di\";\nimport {\n pressButtons,\n pressSequence,\n} from \"@root/src/internal/use-cases/buttonUseCases\";\nimport {\n acceptBlindSigning,\n confirmAddressBookReview,\n continueToBlindSigning,\n enableBlindSigningSettings,\n enterMenu,\n exitMenu,\n mainButton,\n navigateNext,\n navigatePrevious,\n reject,\n secondaryButton,\n sign,\n tapLong,\n tapQuick,\n} from \"@root/src/internal/use-cases/touchUseCases\";\n\nexport type ButtonFactory = () => ButtonController & {\n left(): Promise<void>;\n right(): Promise<void>;\n both(): Promise<void>;\n pressSequence(keys: ButtonKey[], delayMs?: number): Promise<void>;\n};\n\nexport type TapFactory = (deviceKey: string) => {\n tapQuick: (point: PercentCoordinates) => Promise<void>;\n tapLong: (point: PercentCoordinates, delayMs?: number) => Promise<void>;\n sign: (delayMs?: number) => Promise<void>;\n reject: () => Promise<void>;\n navigateNext: () => Promise<void>;\n navigatePrevious: () => Promise<void>;\n mainButton: () => Promise<void>;\n secondaryButton: () => Promise<void>;\n enterMenu: () => Promise<void>;\n exitMenu: () => Promise<void>;\n enableBlindSigningSettings: () => Promise<void>;\n continueToBlindSigning: () => Promise<void>;\n acceptBlindSigning: () => Promise<void>;\n confirmAddressBookReview: () => Promise<void>;\n};\n\nexport type DeviceControllerClientFactory = (\n baseURL: string,\n opts?: {\n timeoutMs?: number;\n clientHeader?: string;\n bearerToken?: string;\n screens?: DeviceScreens<string>;\n },\n) => DeviceControllerClient;\n\nexport type DeviceControllerClient = {\n buttonFactory: ButtonFactory;\n tapFactory: TapFactory;\n};\n\nexport const deviceControllerClientFactory: DeviceControllerClientFactory = (\n baseURL,\n opts = {},\n) => {\n const resolved: DeviceControllerOptions = {\n screens: opts.screens ?? DEFAULT_SCREENS,\n timeoutMs: opts.timeoutMs,\n clientHeader: opts.clientHeader,\n bearerToken: opts.bearerToken,\n };\n\n const { buttons, touch } = createDefaultControllers(baseURL, resolved);\n const press = pressButtons(buttons);\n\n return {\n buttonFactory: () => ({\n press: (key) => buttons.press(key),\n left: () => press.left(),\n right: () => press.right(),\n both: () => press.both(),\n pressSequence: (keys, delayMs) => pressSequence(buttons, keys, delayMs),\n }),\n tapFactory: (key) => ({\n tapQuick: tapQuick(touch, key),\n tapLong: tapLong(touch, key),\n sign: sign(touch, key),\n reject: reject(touch, key),\n navigateNext: navigateNext(touch, key),\n navigatePrevious: navigatePrevious(touch, key),\n mainButton: mainButton(touch, key),\n secondaryButton: secondaryButton(touch, key),\n enterMenu: enterMenu(touch, key),\n exitMenu: exitMenu(touch, key),\n enableBlindSigningSettings: enableBlindSigningSettings(touch, key),\n continueToBlindSigning: continueToBlindSigning(touch, key),\n acceptBlindSigning: acceptBlindSigning(touch, key),\n confirmAddressBookReview: confirmAddressBookReview(touch, key),\n }),\n };\n};\n\nexport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n};\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,mBAAAA,MAAuB,kCAQhC,OAAS,4BAAAC,MAAgC,wBACzC,OACE,gBAAAC,EACA,iBAAAC,MACK,8CACP,OACE,sBAAAC,EACA,4BAAAC,EACA,0BAAAC,EACA,8BAAAC,EACA,aAAAC,EACA,YAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,oBAAAC,EACA,UAAAC,EACA,mBAAAC,EACA,QAAAC,EACA,WAAAC,EACA,YAAAC,MACK,6CAyCA,MAAMC,EAA+D,CAC1EC,EACAC,EAAO,CAAC,IACL,CACH,MAAMC,EAAoC,CACxC,QAASD,EAAK,SAAWpB,EACzB,UAAWoB,EAAK,UAChB,aAAcA,EAAK,aACnB,YAAaA,EAAK,WACpB,EAEM,CAAE,QAAAE,EAAS,MAAAC,CAAM,EAAItB,EAAyBkB,EAASE,CAAQ,EAC/DG,EAAQtB,EAAaoB,CAAO,EAElC,MAAO,CACL,cAAe,KAAO,CACpB,MAAQG,GAAQH,EAAQ,MAAMG,CAAG,EACjC,KAAM,IAAMD,EAAM,KAAK,EACvB,MAAO,IAAMA,EAAM,MAAM,EACzB,KAAM,IAAMA,EAAM,KAAK,EACvB,cAAe,CAACE,EAAMC,IAAYxB,EAAcmB,EAASI,EAAMC,CAAO,CACxE,GACA,WAAaF,IAAS,CACpB,SAAUR,EAASM,EAAOE,CAAG,EAC7B,QAAST,EAAQO,EAAOE,CAAG,EAC3B,KAAMV,EAAKQ,EAAOE,CAAG,EACrB,OAAQZ,EAAOU,EAAOE,CAAG,EACzB,aAAcd,EAAaY,EAAOE,CAAG,EACrC,iBAAkBb,EAAiBW,EAAOE,CAAG,EAC7C,WAAYf,EAAWa,EAAOE,CAAG,EACjC,gBAAiBX,EAAgBS,EAAOE,CAAG,EAC3C,UAAWjB,EAAUe,EAAOE,CAAG,EAC/B,SAAUhB,EAASc,EAAOE,CAAG,EAC7B,2BAA4BlB,EAA2BgB,EAAOE,CAAG,EACjE,uBAAwBnB,EAAuBiB,EAAOE,CAAG,EACzD,mBAAoBrB,EAAmBmB,EAAOE,CAAG,EACjD,yBAA0BpB,EAAyBkB,EAAOE,CAAG,CAC/D,EACF,CACF",
|
|
6
6
|
"names": ["DEFAULT_SCREENS", "createDefaultControllers", "pressButtons", "pressSequence", "acceptBlindSigning", "confirmAddressBookReview", "continueToBlindSigning", "enableBlindSigningSettings", "enterMenu", "exitMenu", "mainButton", "navigateNext", "navigatePrevious", "reject", "secondaryButton", "sign", "tapLong", "tapQuick", "deviceControllerClientFactory", "baseURL", "opts", "resolved", "buttons", "touch", "press", "key", "keys", "delayMs"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{deviceControllerClientFactory as o}from"./DeviceController";describe("deviceControllerClientFactory",()=>{it("returns a DeviceControllerdeviceClient with the expected shape",()=>{const e=o("http://localhost:0");expect(e).toBeDefined(),expect(e).toHaveProperty("buttonFactory"),expect(e).toHaveProperty("tapFactory");const t=e.buttonFactory();expect(typeof t.press).toBe("function"),expect(typeof t.left).toBe("function"),expect(typeof t.right).toBe("function"),expect(typeof t.both).toBe("function"),expect(typeof t.pressSequence).toBe("function");const c=e.tapFactory("flex");expect(typeof c.tapQuick).toBe("function"),expect(typeof c.tapLong).toBe("function")}),it("does not throw when created with custom options",()=>{const t=o("http://127.0.0.1:0",{clientHeader:"test-suite",timeoutMs:200,screens:{custom:{width:128,height:64},stax:{width:400,height:672}}});expect(t).toBeTruthy()}),it("creates independent instances (no accidental shared state)",()=>{const e=o("http://localhost:0"),t=o("http://localhost:0");expect(e).not.toBe(t),expect(e.buttonFactory().press).not.toBe(t.buttonFactory().press),expect(e.tapFactory("flex").tapQuick).not.toBe(t.tapFactory("flex").tapQuick)})});
|
|
1
|
+
import{deviceControllerClientFactory as o}from"./DeviceController";describe("deviceControllerClientFactory",()=>{it("returns a DeviceControllerdeviceClient with the expected shape",()=>{const e=o("http://localhost:0");expect(e).toBeDefined(),expect(e).toHaveProperty("buttonFactory"),expect(e).toHaveProperty("tapFactory");const t=e.buttonFactory();expect(typeof t.press).toBe("function"),expect(typeof t.left).toBe("function"),expect(typeof t.right).toBe("function"),expect(typeof t.both).toBe("function"),expect(typeof t.pressSequence).toBe("function");const c=e.tapFactory("flex");expect(typeof c.tapQuick).toBe("function"),expect(typeof c.tapLong).toBe("function")}),it("does not throw when created with custom options",()=>{const t=o("http://127.0.0.1:0",{clientHeader:"test-suite",timeoutMs:200,screens:{custom:{width:128,height:64},stax:{width:400,height:672}}});expect(t).toBeTruthy()}),it("creates independent instances (no accidental shared state)",()=>{const e=o("http://localhost:0"),t=o("http://localhost:0");expect(e).not.toBe(t),expect(e.buttonFactory().press).not.toBe(t.buttonFactory().press),expect(e.tapFactory("flex").tapQuick).not.toBe(t.tapFactory("flex").tapQuick)}),it("sends the bearer token with every request",async()=>{const e=vi.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}"));await o("http://localhost:0",{bearerToken:"session-token"}).buttonFactory().press("both"),expect(e).toHaveBeenCalledWith("http://localhost:0/button/both",expect.objectContaining({headers:expect.objectContaining({Authorization:"Bearer session-token"})})),e.mockRestore()})});
|
|
2
2
|
//# sourceMappingURL=DeviceController.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/DeviceController.test.ts"],
|
|
4
|
-
"sourcesContent": ["import type { DeviceScreens } from \"@internal/core/types\";\n\nimport { deviceControllerClientFactory } from \"./DeviceController\";\n\ndescribe(\"deviceControllerClientFactory\", () => {\n it(\"returns a DeviceControllerdeviceClient with the expected shape\", () => {\n const deviceClient = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(deviceClient).toBeDefined();\n expect(deviceClient).toHaveProperty(\"buttonFactory\");\n expect(deviceClient).toHaveProperty(\"tapFactory\");\n\n const deviceButtons = deviceClient.buttonFactory();\n\n // button surfaces\n expect(typeof deviceButtons.press).toBe(\"function\");\n expect(typeof deviceButtons.left).toBe(\"function\");\n expect(typeof deviceButtons.right).toBe(\"function\");\n expect(typeof deviceButtons.both).toBe(\"function\");\n expect(typeof deviceButtons.pressSequence).toBe(\"function\");\n\n const deviceTaps = deviceClient.tapFactory(\"flex\");\n\n // tap surfaces\n expect(typeof deviceTaps.tapQuick).toBe(\"function\");\n expect(typeof deviceTaps.tapLong).toBe(\"function\");\n });\n\n it(\"does not throw when created with custom options\", () => {\n const screens: DeviceScreens<string> = {\n custom: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n };\n const deviceClient = deviceControllerClientFactory(\"http://127.0.0.1:0\", {\n clientHeader: \"test-suite\",\n timeoutMs: 200,\n screens,\n });\n expect(deviceClient).toBeTruthy();\n });\n\n it(\"creates independent instances (no accidental shared state)\", () => {\n const a = deviceControllerClientFactory(\"http://localhost:0\");\n const b = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(a).not.toBe(b);\n expect(a.buttonFactory().press).not.toBe(b.buttonFactory().press);\n expect(a.tapFactory(\"flex\").tapQuick).not.toBe(\n b.tapFactory(\"flex\").tapQuick,\n );\n });\n});\n"],
|
|
5
|
-
"mappings": "AAEA,OAAS,iCAAAA,MAAqC,qBAE9C,SAAS,gCAAiC,IAAM,CAC9C,GAAG,iEAAkE,IAAM,CACzE,MAAMC,EAAeD,EAA8B,oBAAoB,EAEvE,OAAOC,CAAY,EAAE,YAAY,EACjC,OAAOA,CAAY,EAAE,eAAe,eAAe,EACnD,OAAOA,CAAY,EAAE,eAAe,YAAY,EAEhD,MAAMC,EAAgBD,EAAa,cAAc,EAGjD,OAAO,OAAOC,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,aAAa,EAAE,KAAK,UAAU,EAE1D,MAAMC,EAAaF,EAAa,WAAW,MAAM,EAGjD,OAAO,OAAOE,EAAW,QAAQ,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAW,OAAO,EAAE,KAAK,UAAU,CACnD,CAAC,EAED,GAAG,kDAAmD,IAAM,CAK1D,MAAMF,EAAeD,EAA8B,qBAAsB,CACvE,aAAc,aACd,UAAW,IACX,QAPqC,CACrC,OAAQ,CAAE,MAAO,IAAK,OAAQ,EAAG,EACjC,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClC,CAKA,CAAC,EACD,OAAOC,CAAY,EAAE,WAAW,CAClC,CAAC,EAED,GAAG,6DAA8D,IAAM,CACrE,MAAMG,EAAIJ,EAA8B,oBAAoB,EACtDK,EAAIL,EAA8B,oBAAoB,EAE5D,OAAOI,CAAC,EAAE,IAAI,KAAKC,CAAC,EACpB,OAAOD,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,KAAKC,EAAE,cAAc,EAAE,KAAK,EAChE,OAAOD,EAAE,WAAW,MAAM,EAAE,QAAQ,EAAE,IAAI,KACxCC,EAAE,WAAW,MAAM,EAAE,QACvB,CACF,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["deviceControllerClientFactory", "deviceClient", "deviceButtons", "deviceTaps", "a", "b"]
|
|
4
|
+
"sourcesContent": ["import type { DeviceScreens } from \"@internal/core/types\";\n\nimport { deviceControllerClientFactory } from \"./DeviceController\";\n\ndescribe(\"deviceControllerClientFactory\", () => {\n it(\"returns a DeviceControllerdeviceClient with the expected shape\", () => {\n const deviceClient = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(deviceClient).toBeDefined();\n expect(deviceClient).toHaveProperty(\"buttonFactory\");\n expect(deviceClient).toHaveProperty(\"tapFactory\");\n\n const deviceButtons = deviceClient.buttonFactory();\n\n // button surfaces\n expect(typeof deviceButtons.press).toBe(\"function\");\n expect(typeof deviceButtons.left).toBe(\"function\");\n expect(typeof deviceButtons.right).toBe(\"function\");\n expect(typeof deviceButtons.both).toBe(\"function\");\n expect(typeof deviceButtons.pressSequence).toBe(\"function\");\n\n const deviceTaps = deviceClient.tapFactory(\"flex\");\n\n // tap surfaces\n expect(typeof deviceTaps.tapQuick).toBe(\"function\");\n expect(typeof deviceTaps.tapLong).toBe(\"function\");\n });\n\n it(\"does not throw when created with custom options\", () => {\n const screens: DeviceScreens<string> = {\n custom: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n };\n const deviceClient = deviceControllerClientFactory(\"http://127.0.0.1:0\", {\n clientHeader: \"test-suite\",\n timeoutMs: 200,\n screens,\n });\n expect(deviceClient).toBeTruthy();\n });\n\n it(\"creates independent instances (no accidental shared state)\", () => {\n const a = deviceControllerClientFactory(\"http://localhost:0\");\n const b = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(a).not.toBe(b);\n expect(a.buttonFactory().press).not.toBe(b.buttonFactory().press);\n expect(a.tapFactory(\"flex\").tapQuick).not.toBe(\n b.tapFactory(\"flex\").tapQuick,\n );\n });\n\n it(\"sends the bearer token with every request\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n const deviceClient = deviceControllerClientFactory(\"http://localhost:0\", {\n bearerToken: \"session-token\",\n });\n\n await deviceClient.buttonFactory().press(\"both\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"http://localhost:0/button/both\",\n expect.objectContaining({\n headers: expect.objectContaining({\n Authorization: \"Bearer session-token\",\n }),\n }),\n );\n fetchSpy.mockRestore();\n });\n});\n"],
|
|
5
|
+
"mappings": "AAEA,OAAS,iCAAAA,MAAqC,qBAE9C,SAAS,gCAAiC,IAAM,CAC9C,GAAG,iEAAkE,IAAM,CACzE,MAAMC,EAAeD,EAA8B,oBAAoB,EAEvE,OAAOC,CAAY,EAAE,YAAY,EACjC,OAAOA,CAAY,EAAE,eAAe,eAAe,EACnD,OAAOA,CAAY,EAAE,eAAe,YAAY,EAEhD,MAAMC,EAAgBD,EAAa,cAAc,EAGjD,OAAO,OAAOC,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,aAAa,EAAE,KAAK,UAAU,EAE1D,MAAMC,EAAaF,EAAa,WAAW,MAAM,EAGjD,OAAO,OAAOE,EAAW,QAAQ,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAW,OAAO,EAAE,KAAK,UAAU,CACnD,CAAC,EAED,GAAG,kDAAmD,IAAM,CAK1D,MAAMF,EAAeD,EAA8B,qBAAsB,CACvE,aAAc,aACd,UAAW,IACX,QAPqC,CACrC,OAAQ,CAAE,MAAO,IAAK,OAAQ,EAAG,EACjC,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClC,CAKA,CAAC,EACD,OAAOC,CAAY,EAAE,WAAW,CAClC,CAAC,EAED,GAAG,6DAA8D,IAAM,CACrE,MAAMG,EAAIJ,EAA8B,oBAAoB,EACtDK,EAAIL,EAA8B,oBAAoB,EAE5D,OAAOI,CAAC,EAAE,IAAI,KAAKC,CAAC,EACpB,OAAOD,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,KAAKC,EAAE,cAAc,EAAE,KAAK,EAChE,OAAOD,EAAE,WAAW,MAAM,EAAE,QAAQ,EAAE,IAAI,KACxCC,EAAE,WAAW,MAAM,EAAE,QACvB,CACF,CAAC,EAED,GAAG,4CAA6C,SAAY,CAC1D,MAAMC,EAAW,GACd,MAAM,WAAY,OAAO,EACzB,kBAAkB,IAAI,SAAS,IAAI,CAAC,EAKvC,MAJqBN,EAA8B,qBAAsB,CACvE,YAAa,eACf,CAAC,EAEkB,cAAc,EAAE,MAAM,MAAM,EAE/C,OAAOM,CAAQ,EAAE,qBACf,iCACA,OAAO,iBAAiB,CACtB,QAAS,OAAO,iBAAiB,CAC/B,cAAe,sBACjB,CAAC,CACH,CAAC,CACH,EACAA,EAAS,YAAY,CACvB,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["deviceControllerClientFactory", "deviceClient", "deviceButtons", "deviceTaps", "a", "b", "fetchSpy"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/core/types.ts"],
|
|
4
|
-
"sourcesContent": ["export type ButtonKey = \"left\" | \"right\" | \"both\";\n\nexport type ScreenSpec = Readonly<{ width: number; height: number }>;\n\nexport type DeviceScreens<K extends string = string> = Readonly<\n Record<K, ScreenSpec>\n>;\n\nexport type Range<\n N extends number,\n Acc extends number[] = [],\n> = Acc[\"length\"] extends N ? Acc[number] : Range<N, [...Acc, Acc[\"length\"]]>;\nexport type Percent = Range<101>;\n\nexport type PercentCoordinates = { x: Percent; y: Percent };\n\nexport type DeviceControllerOptions<K extends string = string> = {\n screens: DeviceScreens<K>;\n timeoutMs?: number;\n clientHeader?: string;\n};\n\nexport interface HttpClient {\n post(url: string, data?: unknown): Promise<unknown>;\n}\n\nexport enum SpeculosActions {\n PRESS = \"press\",\n RELEASE = \"release\",\n PRESS_AND_RELEASE = \"press-and-release\",\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["export type ButtonKey = \"left\" | \"right\" | \"both\";\n\nexport type ScreenSpec = Readonly<{ width: number; height: number }>;\n\nexport type DeviceScreens<K extends string = string> = Readonly<\n Record<K, ScreenSpec>\n>;\n\nexport type Range<\n N extends number,\n Acc extends number[] = [],\n> = Acc[\"length\"] extends N ? Acc[number] : Range<N, [...Acc, Acc[\"length\"]]>;\nexport type Percent = Range<101>;\n\nexport type PercentCoordinates = { x: Percent; y: Percent };\n\nexport type DeviceControllerOptions<K extends string = string> = {\n screens: DeviceScreens<K>;\n timeoutMs?: number;\n clientHeader?: string;\n bearerToken?: string;\n};\n\nexport interface HttpClient {\n post(url: string, data?: unknown): Promise<unknown>;\n}\n\nexport enum SpeculosActions {\n PRESS = \"press\",\n RELEASE = \"release\",\n PRESS_AND_RELEASE = \"press-and-release\",\n}\n"],
|
|
5
|
+
"mappings": "AA2BO,IAAKA,OACVA,EAAA,MAAQ,QACRA,EAAA,QAAU,UACVA,EAAA,kBAAoB,oBAHVA,OAAA",
|
|
6
6
|
"names": ["SpeculosActions"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DmkNetworkClient as
|
|
1
|
+
import{DmkNetworkClient as a}from"@ledgerhq/device-management-kit";import{DefaultButtonController as p}from"./adapters/DefaultButtonController";import{DefaultTouchController as C}from"./adapters/DefaultTouchController";import{createAxes as m}from"./utils/axisClamp";function T(r,t){const e=t.timeoutMs??1500,n=new a({baseUrl:r,headers:{"X-Ledger-Client-Version":t.clientHeader??"ldmk-transport-speculos",...t.bearerToken?{Authorization:`Bearer ${t.bearerToken}`}:{}}}),o={async post(c,u){return n.post(c,u,{timeoutMs:e})}},l=m(t.screens),i=new p(o),s=new C(o,l);return{buttons:i,touch:s}}export{T as createDefaultControllers};
|
|
2
2
|
//# sourceMappingURL=di.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/di.ts"],
|
|
4
|
-
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type { DeviceControllerOptions, HttpClient } from \"@internal/core/types\";\nimport { type AxisMap, createAxes } from \"@internal/utils/axisClamp\";\nimport type { TouchController } from \"@root/src/internal/core/TouchController\";\n\nexport type ControllersContainer = {\n buttons: ButtonController;\n touch: TouchController;\n};\n\nexport function createDefaultControllers(\n baseURL: string,\n opts: DeviceControllerOptions,\n): ControllersContainer {\n const timeoutMs = opts.timeoutMs ?? 1500;\n const client = new DmkNetworkClient({\n baseUrl: baseURL,\n headers: {\n \"X-Ledger-Client-Version\": opts.clientHeader ?? \"ldmk-transport-speculos\",\n },\n });\n\n const http: HttpClient = {\n async post(url: string, data?: unknown): Promise<unknown> {\n return client.post(url, data, { timeoutMs });\n },\n };\n\n const axes: AxisMap = createAxes(opts.screens);\n\n const buttons: ButtonController = new DefaultButtonController(http);\n const touch: TouchController = new DefaultTouchController(http, axes);\n\n return { buttons, touch };\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,oBAAAA,MAAwB,kCAEjC,OAAS,2BAAAC,MAA+B,6CACxC,OAAS,0BAAAC,MAA8B,4CAGvC,OAAuB,cAAAC,MAAkB,4BAQlC,SAASC,EACdC,EACAC,EACsB,CACtB,MAAMC,EAAYD,EAAK,WAAa,KAC9BE,EAAS,IAAIR,EAAiB,CAClC,QAASK,EACT,QAAS,CACP,0BAA2BC,EAAK,cAAgB,
|
|
4
|
+
"sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type { DeviceControllerOptions, HttpClient } from \"@internal/core/types\";\nimport { type AxisMap, createAxes } from \"@internal/utils/axisClamp\";\nimport type { TouchController } from \"@root/src/internal/core/TouchController\";\n\nexport type ControllersContainer = {\n buttons: ButtonController;\n touch: TouchController;\n};\n\nexport function createDefaultControllers(\n baseURL: string,\n opts: DeviceControllerOptions,\n): ControllersContainer {\n const timeoutMs = opts.timeoutMs ?? 1500;\n const client = new DmkNetworkClient({\n baseUrl: baseURL,\n headers: {\n \"X-Ledger-Client-Version\": opts.clientHeader ?? \"ldmk-transport-speculos\",\n ...(opts.bearerToken\n ? { Authorization: `Bearer ${opts.bearerToken}` }\n : {}),\n },\n });\n\n const http: HttpClient = {\n async post(url: string, data?: unknown): Promise<unknown> {\n return client.post(url, data, { timeoutMs });\n },\n };\n\n const axes: AxisMap = createAxes(opts.screens);\n\n const buttons: ButtonController = new DefaultButtonController(http);\n const touch: TouchController = new DefaultTouchController(http, axes);\n\n return { buttons, touch };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,oBAAAA,MAAwB,kCAEjC,OAAS,2BAAAC,MAA+B,6CACxC,OAAS,0BAAAC,MAA8B,4CAGvC,OAAuB,cAAAC,MAAkB,4BAQlC,SAASC,EACdC,EACAC,EACsB,CACtB,MAAMC,EAAYD,EAAK,WAAa,KAC9BE,EAAS,IAAIR,EAAiB,CAClC,QAASK,EACT,QAAS,CACP,0BAA2BC,EAAK,cAAgB,0BAChD,GAAIA,EAAK,YACL,CAAE,cAAe,UAAUA,EAAK,WAAW,EAAG,EAC9C,CAAC,CACP,CACF,CAAC,EAEKG,EAAmB,CACvB,MAAM,KAAKC,EAAaC,EAAkC,CACxD,OAAOH,EAAO,KAAKE,EAAKC,EAAM,CAAE,UAAAJ,CAAU,CAAC,CAC7C,CACF,EAEMK,EAAgBT,EAAWG,EAAK,OAAO,EAEvCO,EAA4B,IAAIZ,EAAwBQ,CAAI,EAC5DK,EAAyB,IAAIZ,EAAuBO,EAAMG,CAAI,EAEpE,MAAO,CAAE,QAAAC,EAAS,MAAAC,CAAM,CAC1B",
|
|
6
6
|
"names": ["DmkNetworkClient", "DefaultButtonController", "DefaultTouchController", "createAxes", "createDefaultControllers", "baseURL", "opts", "timeoutMs", "client", "http", "url", "data", "axes", "buttons", "touch"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{afterEach as
|
|
1
|
+
import{afterEach as i,describe as l,expect as e,it as a,vi as c}from"vitest";import{DefaultButtonController as r}from"./adapters/DefaultButtonController";import{DefaultTouchController as h}from"./adapters/DefaultTouchController";import{createDefaultControllers as s}from"./di";const n={flex:{width:128,height:64},stax:{width:400,height:672}};i(()=>{c.restoreAllMocks()});l("createDefaultControllers - fetch configuration",()=>{a("configures with custom timeout and header",async()=>{const t=c.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=s("https://example.com/api",{screens:n,timeoutMs:2345,clientHeader:"test-client"});await o.press("left"),e(t).toHaveBeenCalledTimes(1),e(t).toHaveBeenCalledWith("https://example.com/api/button/left",e.objectContaining({method:"POST",headers:e.objectContaining({"X-Ledger-Client-Version":"test-client"})}))}),a("applies default timeout and client header when not provided",async()=>{const t=c.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=s("https://localhost:1234",{screens:n});await o.press("left"),e(t).toHaveBeenCalledWith("https://localhost:1234/button/left",e.objectContaining({method:"POST",headers:e.objectContaining({"X-Ledger-Client-Version":"ldmk-transport-speculos"})}))}),a("sends the bearer token alongside the client header",async()=>{const t=c.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{touch:o}=s("https://localhost:1234",{screens:n,clientHeader:"test-client",bearerToken:"session-token"});await o.tap("stax",{x:50,y:50}),e(t).toHaveBeenCalledWith("https://localhost:1234/finger",e.objectContaining({headers:e.objectContaining({Authorization:"Bearer session-token","X-Ledger-Client-Version":"test-client"})}))})});l("createDefaultControllers - wiring",()=>{a("returns correct controller implementations",()=>{const{buttons:t,touch:o}=s("https://x",{screens:n});e(t).toBeInstanceOf(r),e(o).toBeInstanceOf(h),e(typeof t.press).toBe("function")}),a("creates fresh instances per invocation",()=>{const t=s("https://x",{screens:n}),o=s("https://x",{screens:n});e(t.buttons).not.toBe(o.buttons),e(t.touch).not.toBe(o.touch)}),a("button.press posts the correct payload",async()=>{const t=c.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{buttons:o}=s("https://x",{screens:n});await o.press("left"),e(t).toHaveBeenCalledWith("https://x/button/left",e.objectContaining({method:"POST",body:JSON.stringify({action:"press-and-release"})}))}),a("touch.tapAndRelease maps percent to absolute coords",async()=>{const t=c.spyOn(globalThis,"fetch").mockResolvedValue(new Response("{}")),{touch:o}=s("https://x",{screens:n});await o.tapAndRelease("flex",{x:50,y:50}),e(t).toHaveBeenCalledWith("https://x/finger",e.objectContaining({method:"POST",body:JSON.stringify({action:"press-and-release",x:64,y:32})}))})});
|
|
2
2
|
//# sourceMappingURL=di.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/di.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\n\nimport { createDefaultControllers } from \"./di\";\n\nconst SCREENS = {\n flex: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n} as const;\n\nafterEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"createDefaultControllers - fetch configuration\", () => {\n it(\"configures with custom timeout and header\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://example.com/api\", {\n screens: SCREENS,\n timeoutMs: 2345,\n clientHeader: \"test-client\",\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledTimes(1);\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://example.com/api/button/left\",\n expect.objectContaining({\n method: \"POST\",\n headers: expect.objectContaining({\n \"X-Ledger-Client-Version\": \"test-client\",\n }),\n }),\n );\n });\n\n it(\"applies default timeout and client header when not provided\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://localhost:1234\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://localhost:1234/button/left\",\n expect.objectContaining({\n method: \"POST\",\n headers: expect.objectContaining({\n \"X-Ledger-Client-Version\": \"ldmk-transport-speculos\",\n }),\n }),\n );\n });\n});\n\ndescribe(\"createDefaultControllers - wiring\", () => {\n it(\"returns correct controller implementations\", () => {\n const { buttons, touch } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n expect(buttons).toBeInstanceOf(DefaultButtonController);\n expect(touch).toBeInstanceOf(DefaultTouchController);\n expect(typeof buttons.press).toBe(\"function\");\n });\n\n it(\"creates fresh instances per invocation\", () => {\n const a = createDefaultControllers(\"https://x\", { screens: SCREENS });\n const b = createDefaultControllers(\"https://x\", { screens: SCREENS });\n\n expect(a.buttons).not.toBe(b.buttons);\n expect(a.touch).not.toBe(b.touch);\n });\n\n it(\"button.press posts the correct payload\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://x/button/left\",\n expect.objectContaining({\n method: \"POST\",\n body: JSON.stringify({ action: \"press-and-release\" }),\n }),\n );\n });\n\n it(\"touch.tapAndRelease maps percent to absolute coords\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { touch } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n // 50% of 128x64 \u2192 (64, 32)\n await touch.tapAndRelease(\"flex\", { x: 50 as any, y: 50 as any });\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://x/finger\",\n expect.objectContaining({\n method: \"POST\",\n body: JSON.stringify({\n action: \"press-and-release\",\n x: 64,\n y: 32,\n }),\n }),\n );\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\n\nimport { createDefaultControllers } from \"./di\";\n\nconst SCREENS = {\n flex: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n} as const;\n\nafterEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"createDefaultControllers - fetch configuration\", () => {\n it(\"configures with custom timeout and header\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://example.com/api\", {\n screens: SCREENS,\n timeoutMs: 2345,\n clientHeader: \"test-client\",\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledTimes(1);\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://example.com/api/button/left\",\n expect.objectContaining({\n method: \"POST\",\n headers: expect.objectContaining({\n \"X-Ledger-Client-Version\": \"test-client\",\n }),\n }),\n );\n });\n\n it(\"applies default timeout and client header when not provided\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://localhost:1234\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://localhost:1234/button/left\",\n expect.objectContaining({\n method: \"POST\",\n headers: expect.objectContaining({\n \"X-Ledger-Client-Version\": \"ldmk-transport-speculos\",\n }),\n }),\n );\n });\n\n it(\"sends the bearer token alongside the client header\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { touch } = createDefaultControllers(\"https://localhost:1234\", {\n screens: SCREENS,\n clientHeader: \"test-client\",\n bearerToken: \"session-token\",\n });\n\n await touch.tap(\"stax\", { x: 50, y: 50 });\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://localhost:1234/finger\",\n expect.objectContaining({\n headers: expect.objectContaining({\n Authorization: \"Bearer session-token\",\n \"X-Ledger-Client-Version\": \"test-client\",\n }),\n }),\n );\n });\n});\n\ndescribe(\"createDefaultControllers - wiring\", () => {\n it(\"returns correct controller implementations\", () => {\n const { buttons, touch } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n expect(buttons).toBeInstanceOf(DefaultButtonController);\n expect(touch).toBeInstanceOf(DefaultTouchController);\n expect(typeof buttons.press).toBe(\"function\");\n });\n\n it(\"creates fresh instances per invocation\", () => {\n const a = createDefaultControllers(\"https://x\", { screens: SCREENS });\n const b = createDefaultControllers(\"https://x\", { screens: SCREENS });\n\n expect(a.buttons).not.toBe(b.buttons);\n expect(a.touch).not.toBe(b.touch);\n });\n\n it(\"button.press posts the correct payload\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { buttons } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://x/button/left\",\n expect.objectContaining({\n method: \"POST\",\n body: JSON.stringify({ action: \"press-and-release\" }),\n }),\n );\n });\n\n it(\"touch.tapAndRelease maps percent to absolute coords\", async () => {\n const fetchSpy = vi\n .spyOn(globalThis, \"fetch\")\n .mockResolvedValue(new Response(\"{}\"));\n\n const { touch } = createDefaultControllers(\"https://x\", {\n screens: SCREENS,\n });\n\n // 50% of 128x64 \u2192 (64, 32)\n await touch.tapAndRelease(\"flex\", { x: 50 as any, y: 50 as any });\n\n expect(fetchSpy).toHaveBeenCalledWith(\n \"https://x/finger\",\n expect.objectContaining({\n method: \"POST\",\n body: JSON.stringify({\n action: \"press-and-release\",\n x: 64,\n y: 32,\n }),\n }),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["afterEach", "describe", "expect", "it", "vi", "DefaultButtonController", "DefaultTouchController", "createDefaultControllers", "SCREENS", "fetchSpy", "buttons", "touch", "a", "b"]
|
|
7
7
|
}
|
|
@@ -25,6 +25,7 @@ export type TapFactory = (deviceKey: string) => {
|
|
|
25
25
|
export type DeviceControllerClientFactory = (baseURL: string, opts?: {
|
|
26
26
|
timeoutMs?: number;
|
|
27
27
|
clientHeader?: string;
|
|
28
|
+
bearerToken?: string;
|
|
28
29
|
screens?: DeviceScreens<string>;
|
|
29
30
|
}) => DeviceControllerClient;
|
|
30
31
|
export type DeviceControllerClient = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceController.d.ts","sourceRoot":"","sources":["../../../../src/api/DeviceController.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EACV,SAAS,EACT,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAuB9B,MAAM,MAAM,aAAa,GAAG,MAAM,gBAAgB,GAAG;IACnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK;IAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,wBAAwB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,CAC1C,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IACL,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACjC,KACE,sBAAsB,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,
|
|
1
|
+
{"version":3,"file":"DeviceController.d.ts","sourceRoot":"","sources":["../../../../src/api/DeviceController.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EACV,SAAS,EACT,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAuB9B,MAAM,MAAM,aAAa,GAAG,MAAM,gBAAgB,GAAG;IACnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK;IAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,wBAAwB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,CAC1C,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IACL,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACjC,KACE,sBAAsB,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,6BAuC3C,CAAC;AAEF,YAAY,EACV,SAAS,EACT,uBAAuB,EACvB,aAAa,EACb,kBAAkB,GACnB,CAAC"}
|
|
@@ -14,6 +14,7 @@ export type DeviceControllerOptions<K extends string = string> = {
|
|
|
14
14
|
screens: DeviceScreens<K>;
|
|
15
15
|
timeoutMs?: number;
|
|
16
16
|
clientHeader?: string;
|
|
17
|
+
bearerToken?: string;
|
|
17
18
|
};
|
|
18
19
|
export interface HttpClient {
|
|
19
20
|
post(url: string, data?: unknown): Promise<unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/internal/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAErE,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAC7D,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CACtB,CAAC;AAEF,MAAM,MAAM,KAAK,CACf,CAAC,SAAS,MAAM,EAChB,GAAG,SAAS,MAAM,EAAE,GAAG,EAAE,IACvB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC9E,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAEjC,MAAM,MAAM,kBAAkB,GAAG;IAAE,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAC/D,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/internal/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAErE,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAC7D,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CACtB,CAAC;AAEF,MAAM,MAAM,KAAK,CACf,CAAC,SAAS,MAAM,EAChB,GAAG,SAAS,MAAM,EAAE,GAAG,EAAE,IACvB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC9E,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAEjC,MAAM,MAAM,kBAAkB,GAAG;IAAE,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAC/D,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD;AAED,oBAAY,eAAe;IACzB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,iBAAiB,sBAAsB;CACxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"di.d.ts","sourceRoot":"","sources":["../../../../src/internal/di.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,sBAAsB,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE/E,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,eAAe,CAAC;CACxB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,uBAAuB,GAC5B,oBAAoB,
|
|
1
|
+
{"version":3,"file":"di.d.ts","sourceRoot":"","sources":["../../../../src/internal/di.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAc,MAAM,sBAAsB,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE/E,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,eAAe,CAAC;CACxB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,uBAAuB,GAC5B,oBAAoB,CAwBtB"}
|