@ledgerhq/device-mockserver-client 0.0.0-develop-20260623003456 → 0.0.0-develop-20260624002956

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.
Files changed (154) hide show
  1. package/lib/cjs/package.json +8 -2
  2. package/lib/cjs/src/DmkNetworkClient.stub.js +2 -0
  3. package/lib/cjs/src/DmkNetworkClient.stub.js.map +7 -0
  4. package/lib/cjs/src/MockClient.js +1 -1
  5. package/lib/cjs/src/MockClient.js.map +3 -3
  6. package/lib/cjs/src/MockClient.test.js +2 -0
  7. package/lib/cjs/src/MockClient.test.js.map +7 -0
  8. package/lib/cjs/src/index.js +1 -1
  9. package/lib/cjs/src/index.js.map +3 -3
  10. package/lib/cjs/src/model/Auth.js +2 -0
  11. package/lib/cjs/src/model/Auth.js.map +7 -0
  12. package/lib/cjs/src/model/CommandResponse.js +1 -1
  13. package/lib/cjs/src/model/CommandResponse.js.map +3 -3
  14. package/lib/cjs/src/model/Device.js +1 -1
  15. package/lib/cjs/src/model/Device.js.map +3 -3
  16. package/lib/cjs/src/model/Mock.js +1 -1
  17. package/lib/cjs/src/model/Mock.js.map +3 -3
  18. package/lib/cjs/src/model/Session.js +1 -1
  19. package/lib/cjs/src/model/Session.js.map +3 -3
  20. package/lib/cjs/src/model/SessionExport.js +2 -0
  21. package/lib/cjs/src/model/SessionExport.js.map +7 -0
  22. package/lib/cjs/src/model/Speculos.js +2 -0
  23. package/lib/cjs/src/model/Speculos.js.map +7 -0
  24. package/lib/esm/package.json +8 -2
  25. package/lib/esm/src/DmkNetworkClient.stub.js +2 -0
  26. package/lib/esm/src/DmkNetworkClient.stub.js.map +7 -0
  27. package/lib/esm/src/MockClient.js +1 -1
  28. package/lib/esm/src/MockClient.js.map +3 -3
  29. package/lib/esm/src/MockClient.test.js +2 -0
  30. package/lib/esm/src/MockClient.test.js.map +7 -0
  31. package/lib/esm/src/index.js +1 -1
  32. package/lib/esm/src/index.js.map +3 -3
  33. package/lib/esm/src/model/Auth.js +2 -0
  34. package/lib/esm/src/model/Auth.js.map +7 -0
  35. package/lib/esm/src/model/CommandResponse.js +1 -1
  36. package/lib/esm/src/model/CommandResponse.js.map +3 -3
  37. package/lib/esm/src/model/Device.js +1 -1
  38. package/lib/esm/src/model/Device.js.map +3 -3
  39. package/lib/esm/src/model/Mock.js +1 -1
  40. package/lib/esm/src/model/Mock.js.map +3 -3
  41. package/lib/esm/src/model/Session.js +1 -1
  42. package/lib/esm/src/model/Session.js.map +3 -3
  43. package/lib/esm/src/model/SessionExport.js +2 -0
  44. package/lib/esm/src/model/SessionExport.js.map +7 -0
  45. package/lib/esm/src/model/Speculos.js +2 -0
  46. package/lib/esm/src/model/Speculos.js.map +7 -0
  47. package/lib/types/src/DmkNetworkClient.stub.d.ts +18 -0
  48. package/lib/types/src/DmkNetworkClient.stub.d.ts.map +1 -0
  49. package/lib/types/src/MockClient.d.ts +64 -21
  50. package/lib/types/src/MockClient.d.ts.map +1 -1
  51. package/lib/types/src/MockClient.test.d.ts +2 -0
  52. package/lib/types/src/MockClient.test.d.ts.map +1 -0
  53. package/lib/types/src/index.d.ts +8 -4
  54. package/lib/types/src/index.d.ts.map +1 -1
  55. package/lib/types/src/model/Auth.d.ts +38 -0
  56. package/lib/types/src/model/Auth.d.ts.map +1 -0
  57. package/lib/types/src/model/CommandResponse.d.ts +11 -5
  58. package/lib/types/src/model/CommandResponse.d.ts.map +1 -1
  59. package/lib/types/src/model/Device.d.ts +65 -7
  60. package/lib/types/src/model/Device.d.ts.map +1 -1
  61. package/lib/types/src/model/Mock.d.ts +32 -6
  62. package/lib/types/src/model/Mock.d.ts.map +1 -1
  63. package/lib/types/src/model/Session.d.ts +27 -10
  64. package/lib/types/src/model/Session.d.ts.map +1 -1
  65. package/lib/types/src/model/SessionExport.d.ts +32 -0
  66. package/lib/types/src/model/SessionExport.d.ts.map +1 -0
  67. package/lib/types/src/model/Speculos.d.ts +20 -0
  68. package/lib/types/src/model/Speculos.d.ts.map +1 -0
  69. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  70. package/package.json +9 -3
  71. package/lib/cjs/src/DefaultHttpClient.js +0 -2
  72. package/lib/cjs/src/DefaultHttpClient.js.map +0 -7
  73. package/lib/cjs/src/DefaultHttpClient.stub.js +0 -2
  74. package/lib/cjs/src/DefaultHttpClient.stub.js.map +0 -7
  75. package/lib/cjs/src/HttpClient.js +0 -2
  76. package/lib/cjs/src/HttpClient.js.map +0 -7
  77. package/lib/cjs/src/model/ComandResponse.test.js +0 -2
  78. package/lib/cjs/src/model/ComandResponse.test.js.map +0 -7
  79. package/lib/cjs/src/model/CommandResponse.stub.js +0 -2
  80. package/lib/cjs/src/model/CommandResponse.stub.js.map +0 -7
  81. package/lib/cjs/src/model/Device.stub.js +0 -2
  82. package/lib/cjs/src/model/Device.stub.js.map +0 -7
  83. package/lib/cjs/src/model/Mock.stub.js +0 -2
  84. package/lib/cjs/src/model/Mock.stub.js.map +0 -7
  85. package/lib/cjs/src/model/Session.stub.js +0 -2
  86. package/lib/cjs/src/model/Session.stub.js.map +0 -7
  87. package/lib/cjs/src/service/ConnectivityService.js +0 -2
  88. package/lib/cjs/src/service/ConnectivityService.js.map +0 -7
  89. package/lib/cjs/src/service/ConnectivityService.test.js +0 -2
  90. package/lib/cjs/src/service/ConnectivityService.test.js.map +0 -7
  91. package/lib/cjs/src/service/DiscoveryService.js +0 -2
  92. package/lib/cjs/src/service/DiscoveryService.js.map +0 -7
  93. package/lib/cjs/src/service/DiscoveryService.test.js +0 -2
  94. package/lib/cjs/src/service/DiscoveryService.test.js.map +0 -7
  95. package/lib/cjs/src/service/MockService.js +0 -2
  96. package/lib/cjs/src/service/MockService.js.map +0 -7
  97. package/lib/cjs/src/service/SendService.js +0 -2
  98. package/lib/cjs/src/service/SendService.js.map +0 -7
  99. package/lib/esm/src/DefaultHttpClient.js +0 -2
  100. package/lib/esm/src/DefaultHttpClient.js.map +0 -7
  101. package/lib/esm/src/DefaultHttpClient.stub.js +0 -2
  102. package/lib/esm/src/DefaultHttpClient.stub.js.map +0 -7
  103. package/lib/esm/src/HttpClient.js +0 -1
  104. package/lib/esm/src/HttpClient.js.map +0 -7
  105. package/lib/esm/src/model/ComandResponse.test.js +0 -2
  106. package/lib/esm/src/model/ComandResponse.test.js.map +0 -7
  107. package/lib/esm/src/model/CommandResponse.stub.js +0 -2
  108. package/lib/esm/src/model/CommandResponse.stub.js.map +0 -7
  109. package/lib/esm/src/model/Device.stub.js +0 -2
  110. package/lib/esm/src/model/Device.stub.js.map +0 -7
  111. package/lib/esm/src/model/Mock.stub.js +0 -2
  112. package/lib/esm/src/model/Mock.stub.js.map +0 -7
  113. package/lib/esm/src/model/Session.stub.js +0 -2
  114. package/lib/esm/src/model/Session.stub.js.map +0 -7
  115. package/lib/esm/src/service/ConnectivityService.js +0 -2
  116. package/lib/esm/src/service/ConnectivityService.js.map +0 -7
  117. package/lib/esm/src/service/ConnectivityService.test.js +0 -2
  118. package/lib/esm/src/service/ConnectivityService.test.js.map +0 -7
  119. package/lib/esm/src/service/DiscoveryService.js +0 -2
  120. package/lib/esm/src/service/DiscoveryService.js.map +0 -7
  121. package/lib/esm/src/service/DiscoveryService.test.js +0 -2
  122. package/lib/esm/src/service/DiscoveryService.test.js.map +0 -7
  123. package/lib/esm/src/service/MockService.js +0 -2
  124. package/lib/esm/src/service/MockService.js.map +0 -7
  125. package/lib/esm/src/service/SendService.js +0 -2
  126. package/lib/esm/src/service/SendService.js.map +0 -7
  127. package/lib/types/src/DefaultHttpClient.d.ts +0 -14
  128. package/lib/types/src/DefaultHttpClient.d.ts.map +0 -1
  129. package/lib/types/src/DefaultHttpClient.stub.d.ts +0 -16
  130. package/lib/types/src/DefaultHttpClient.stub.d.ts.map +0 -1
  131. package/lib/types/src/HttpClient.d.ts +0 -6
  132. package/lib/types/src/HttpClient.d.ts.map +0 -1
  133. package/lib/types/src/model/ComandResponse.test.d.ts +0 -2
  134. package/lib/types/src/model/ComandResponse.test.d.ts.map +0 -1
  135. package/lib/types/src/model/CommandResponse.stub.d.ts +0 -3
  136. package/lib/types/src/model/CommandResponse.stub.d.ts.map +0 -1
  137. package/lib/types/src/model/Device.stub.d.ts +0 -3
  138. package/lib/types/src/model/Device.stub.d.ts.map +0 -1
  139. package/lib/types/src/model/Mock.stub.d.ts +0 -3
  140. package/lib/types/src/model/Mock.stub.d.ts.map +0 -1
  141. package/lib/types/src/model/Session.stub.d.ts +0 -3
  142. package/lib/types/src/model/Session.stub.d.ts.map +0 -1
  143. package/lib/types/src/service/ConnectivityService.d.ts +0 -15
  144. package/lib/types/src/service/ConnectivityService.d.ts.map +0 -1
  145. package/lib/types/src/service/ConnectivityService.test.d.ts +0 -2
  146. package/lib/types/src/service/ConnectivityService.test.d.ts.map +0 -1
  147. package/lib/types/src/service/DiscoveryService.d.ts +0 -11
  148. package/lib/types/src/service/DiscoveryService.d.ts.map +0 -1
  149. package/lib/types/src/service/DiscoveryService.test.d.ts +0 -2
  150. package/lib/types/src/service/DiscoveryService.test.d.ts.map +0 -1
  151. package/lib/types/src/service/MockService.d.ts +0 -10
  152. package/lib/types/src/service/MockService.d.ts.map +0 -1
  153. package/lib/types/src/service/SendService.d.ts +0 -8
  154. package/lib/types/src/service/SendService.d.ts.map +0 -1
@@ -1,6 +1,9 @@
1
1
  {
2
- "dependencies": {},
2
+ "dependencies": {
3
+ "purify-ts": "catalog:"
4
+ },
3
5
  "devDependencies": {
6
+ "@ledgerhq/device-management-kit": "workspace:*",
4
7
  "@ledgerhq/eslint-config-dsdk": "workspace:*",
5
8
  "@ledgerhq/ldmk-tool": "workspace:*",
6
9
  "@ledgerhq/prettier-config-dsdk": "workspace:*",
@@ -25,6 +28,9 @@
25
28
  "license": "Apache-2.0",
26
29
  "main": "lib/index.js",
27
30
  "name": "@ledgerhq/device-mockserver-client",
31
+ "peerDependencies": {
32
+ "@ledgerhq/device-management-kit": "workspace:*"
33
+ },
28
34
  "private": false,
29
35
  "repository": {
30
36
  "type": "git",
@@ -46,5 +52,5 @@
46
52
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
47
53
  },
48
54
  "types": "lib/index.d.ts",
49
- "version": "0.0.0-develop-20260623003456"
55
+ "version": "0.0.0-develop-20260624002956"
50
56
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(s,e)=>{for(var t in e)r(s,t,{get:e[t],enumerable:!0})},u=(s,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of h(e))!p.call(s,n)&&n!==t&&r(s,n,{get:()=>e[n],enumerable:!(o=i(e,n))||o.enumerable});return s};var l=s=>u(r({},"__esModule",{value:!0}),s);var d={};c(d,{httpClientStubBuilder:()=>m});module.exports=l(d);const m=()=>new class{responses;calls;constructor(){this.responses={get:{},post:{},patch:{},delete:{}},this.calls=[]}get(e,t){return this.calls.push({method:"get",endpoint:e}),Promise.resolve(this.responses.get[e])}post(e,t,o){return this.calls.push({method:"post",endpoint:e,body:t}),Promise.resolve(this.responses.post[e])}patch(e,t,o){return this.calls.push({method:"patch",endpoint:e,body:t}),Promise.resolve(this.responses.patch[e])}delete(e,t){return this.calls.push({method:"delete",endpoint:e}),Promise.resolve(this.responses.delete[e])}mockResponse({method:e,endpoint:t,response:o}){return this.responses={...this.responses,[e]:{...this.responses[e],[t]:o}},this}};0&&(module.exports={httpClientStubBuilder});
2
+ //# sourceMappingURL=DmkNetworkClient.stub.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/DmkNetworkClient.stub.ts"],
4
+ "sourcesContent": ["import {\n type DmkNetworkClient,\n type DmkRequestConfig,\n} from \"@ledgerhq/device-management-kit\";\n\ntype Method = \"get\" | \"post\" | \"patch\" | \"delete\";\n\nexport type DmkNetworkClientStub = DmkNetworkClient & {\n responses: Record<Method, Record<string, unknown>>;\n calls: { method: Method; endpoint: string; body?: object }[];\n mockResponse(args: {\n method: Method;\n endpoint: string;\n response: object;\n }): DmkNetworkClientStub;\n};\n\nexport const httpClientStubBuilder = (): DmkNetworkClientStub => {\n const stub = new (class {\n responses: Record<Method, Record<string, unknown>>;\n calls: { method: Method; endpoint: string; body?: object }[];\n\n constructor() {\n this.responses = { get: {}, post: {}, patch: {}, delete: {} };\n this.calls = [];\n }\n\n get(endpoint: string, _config?: DmkRequestConfig): Promise<unknown> {\n this.calls.push({ method: \"get\", endpoint });\n return Promise.resolve(this.responses.get[endpoint]);\n }\n\n post(\n endpoint: string,\n body?: unknown,\n _config?: DmkRequestConfig,\n ): Promise<unknown> {\n this.calls.push({ method: \"post\", endpoint, body: body as object });\n return Promise.resolve(this.responses.post[endpoint]);\n }\n\n patch(\n endpoint: string,\n body?: unknown,\n _config?: DmkRequestConfig,\n ): Promise<unknown> {\n this.calls.push({ method: \"patch\", endpoint, body: body as object });\n return Promise.resolve(this.responses.patch[endpoint]);\n }\n\n delete(endpoint: string, _config?: DmkRequestConfig): Promise<unknown> {\n this.calls.push({ method: \"delete\", endpoint });\n return Promise.resolve(this.responses.delete[endpoint]);\n }\n\n mockResponse({\n method,\n endpoint,\n response,\n }: {\n method: Method;\n endpoint: string;\n response: object;\n }) {\n this.responses = {\n ...this.responses,\n [method]: {\n ...this.responses[method],\n [endpoint]: response,\n },\n };\n return this;\n }\n })();\n\n return stub as unknown as DmkNetworkClientStub;\n};\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2BAAAE,IAAA,eAAAC,EAAAH,GAiBO,MAAME,EAAwB,IACtB,IAAK,KAAM,CACtB,UACA,MAEA,aAAc,CACZ,KAAK,UAAY,CAAE,IAAK,CAAC,EAAG,KAAM,CAAC,EAAG,MAAO,CAAC,EAAG,OAAQ,CAAC,CAAE,EAC5D,KAAK,MAAQ,CAAC,CAChB,CAEA,IAAIE,EAAkBC,EAA8C,CAClE,YAAK,MAAM,KAAK,CAAE,OAAQ,MAAO,SAAAD,CAAS,CAAC,EACpC,QAAQ,QAAQ,KAAK,UAAU,IAAIA,CAAQ,CAAC,CACrD,CAEA,KACEA,EACAE,EACAD,EACkB,CAClB,YAAK,MAAM,KAAK,CAAE,OAAQ,OAAQ,SAAAD,EAAU,KAAME,CAAe,CAAC,EAC3D,QAAQ,QAAQ,KAAK,UAAU,KAAKF,CAAQ,CAAC,CACtD,CAEA,MACEA,EACAE,EACAD,EACkB,CAClB,YAAK,MAAM,KAAK,CAAE,OAAQ,QAAS,SAAAD,EAAU,KAAME,CAAe,CAAC,EAC5D,QAAQ,QAAQ,KAAK,UAAU,MAAMF,CAAQ,CAAC,CACvD,CAEA,OAAOA,EAAkBC,EAA8C,CACrE,YAAK,MAAM,KAAK,CAAE,OAAQ,SAAU,SAAAD,CAAS,CAAC,EACvC,QAAQ,QAAQ,KAAK,UAAU,OAAOA,CAAQ,CAAC,CACxD,CAEA,aAAa,CACX,OAAAG,EACA,SAAAH,EACA,SAAAI,CACF,EAIG,CACD,YAAK,UAAY,CACf,GAAG,KAAK,UACR,CAACD,CAAM,EAAG,CACR,GAAG,KAAK,UAAUA,CAAM,EACxB,CAACH,CAAQ,EAAGI,CACd,CACF,EACO,IACT,CACF",
6
+ "names": ["DmkNetworkClient_stub_exports", "__export", "httpClientStubBuilder", "__toCommonJS", "endpoint", "_config", "body", "method", "response"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var c=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(i,e)=>{for(var r in e)c(i,r,{get:e[r],enumerable:!0})},g=(i,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of y(e))!d.call(i,t)&&t!==r&&c(i,t,{get:()=>e[t],enumerable:!(n=S(e,t))||n.enumerable});return i};var l=i=>g(c({},"__esModule",{value:!0}),i);var f={};p(f,{MockClient:()=>u});module.exports=l(f);var o=require("./service/ConnectivityService"),s=require("./service/DiscoveryService"),m=require("./service/MockService"),v=require("./service/SendService"),a=require("./DefaultHttpClient");class u{connectivityService;sendService;discoveryService;mockService;constructor(e){const r=new a.DefaultHttpClient({baseUrl:e+"/"});this.connectivityService=new o.ConnectivityService({client:r}),this.sendService=new v.SendService(r),this.discoveryService=new s.DiscoveryService({client:r}),this.mockService=new m.MockService(r)}async connect(e){return this.connectivityService.connect(e)}async disconnect(e){return this.connectivityService.disconnect(e)}async disconnectAll(){return this.connectivityService.disconnectAll()}async getConnected(){return this.connectivityService.getConnected()}async send(e,r){const n=this.toHexString(r);return this.sendService.send(e,n)}async scan(e){return this.discoveryService.scanDevices(e)}async addMock(e,r,n){return this.mockService.add(e,r,n)}async getMocks(e){return this.mockService.get(e)}async deleteMocks(e){return this.mockService.delete(e)}toHexString(e){return Array.from(e,r=>r.toString(16).padStart(2,"0")).join("")}fromHexString(e){return e?new Uint8Array(e.match(/.{1,2}/g).map(r=>parseInt(r,16))):Uint8Array.from([])}}0&&(module.exports={MockClient});
1
+ "use strict";var d=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var v=(a,e)=>{for(var t in e)d(a,t,{get:e[t],enumerable:!0})},y=(a,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of g(e))!k.call(a,i)&&i!==t&&d(a,i,{get:()=>e[i],enumerable:!(s=w(e,i))||s.enumerable});return a};var P=a=>y(d({},"__esModule",{value:!0}),a);var f={};v(f,{MockClient:()=>C});module.exports=P(f);var r=require("@ledgerhq/device-management-kit"),h=require("purify-ts"),c=require("./model/Auth"),m=require("./model/CommandResponse"),n=require("./model/Device"),o=require("./model/Mock"),l=require("./model/Session"),u=require("./model/SessionExport"),p=require("./model/Speculos");class C{client;token;authPromise;constructor(e,t={}){this.client=t.httpClient??new r.DmkNetworkClient({baseUrl:this.normalizeUrl(e)}),this.token=t.token}async authenticate(){const e=await this.client.post("auth",{}),t=this.decode(c.authResponseCodec,e).token;return this.token=t,t}getToken(){return this.token}async listDevices(){const e=await this.client.get("devices",{headers:await this.authHeaders()});return this.decode((0,h.array)(n.deviceCodec),e)}async addDevice(e={}){const t=await this.client.post("devices",e,{headers:await this.authHeaders()});return this.decode(n.deviceCodec,t)}async getDevice(e){const t=await this.client.get(`devices/${e}`,{headers:await this.authHeaders()});return this.decode(n.deviceCodec,t)}async editDevice(e,t){const s=await this.client.patch(`devices/${e}`,t,{headers:await this.authHeaders()});return this.decode(n.deviceCodec,s)}async deleteDevice(e){return await this.client.delete(`devices/${e}`,{headers:await this.authHeaders()}),!0}async connect(e){const t=await this.client.post(`devices/${e}/connect`,{},{headers:await this.authHeaders()});return this.decode(c.connectionStateCodec,t)}async disconnect(e){return await this.client.post(`devices/${e}/disconnect`,{},{headers:await this.authHeaders()}),!0}async disconnectAll(){const e=await this.listDevices();return await Promise.all(e.filter(t=>t.connected).map(t=>this.disconnect(t.id))),!0}async sendApdu(e,t){const s=typeof t=="string"?t:(0,r.bufferToHexaString)(t,!1),i=await this.client.post(`devices/${e}/apdu`,{apdu:s},{headers:await this.authHeaders()});return this.decode(m.commandResponseCodec,i)}async listMocks(e){const t=await this.client.get(`devices/${e}/mocks`,{headers:await this.authHeaders()});return this.decode((0,h.array)(o.mockCodec),t)}async addMock(e,t){const s=await this.client.post(`devices/${e}/mocks`,t,{headers:await this.authHeaders()});return this.decode(o.mockCodec,s)}async editMock(e,t,s){const i=await this.client.patch(`devices/${e}/mocks/${t}`,s,{headers:await this.authHeaders()});return this.decode(o.mockCodec,i)}async deleteMock(e,t){return await this.client.delete(`devices/${e}/mocks/${t}`,{headers:await this.authHeaders()}),!0}async clearMocks(e){return await this.client.delete(`devices/${e}/mocks`,{headers:await this.authHeaders()}),!0}async getSpeculos(e){const t=await this.client.get(`devices/${e}/speculos`,{headers:await this.authHeaders()});return this.decode(p.speculosInstanceCodec,t)}async getSession(){const e=await this.client.get("sessions/current",{headers:await this.authHeaders()});return this.decode(l.sessionCodec,e)}async disposeSession(){return await this.client.delete("sessions/current",{headers:await this.authHeaders()}),this.token=void 0,this.authPromise=void 0,!0}async exportSession(){const e=await this.client.get("export",{headers:await this.authHeaders()});return this.decode(u.sessionExportCodec,e)}async importSession(e){const t=await this.client.post("import",e,{headers:await this.authHeaders()});return this.decode(u.sessionExportCodec,t)}decode(e,t){return e.decode(t).caseOf({Left:s=>{throw new Error(`MockClient: invalid server response (${s})`)},Right:s=>s})}async authHeaders(){return{Authorization:`Bearer ${await this.ensureToken()}`}}ensureToken(){return this.token?Promise.resolve(this.token):(this.authPromise||(this.authPromise=this.authenticate()),this.authPromise)}normalizeUrl(e){return e.endsWith("/")?e:`${e}/`}}0&&(module.exports={MockClient});
2
2
  //# sourceMappingURL=MockClient.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/MockClient.ts"],
4
- "sourcesContent": ["import { type CommandResponse } from \"./model/CommandResponse\";\nimport { type Device } from \"./model/Device\";\nimport { type Mock } from \"./model/Mock\";\nimport { type Session } from \"./model/Session\";\nimport { ConnectivityService } from \"./service/ConnectivityService\";\nimport { DiscoveryService } from \"./service/DiscoveryService\";\nimport { MockService } from \"./service/MockService\";\nimport { SendService } from \"./service/SendService\";\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\n\nexport class MockClient {\n // Services\n connectivityService: ConnectivityService;\n sendService: SendService;\n discoveryService: DiscoveryService;\n mockService: MockService;\n\n constructor(baseUrl: string) {\n const client = new DefaultHttpClient({ baseUrl: baseUrl + \"/\" });\n this.connectivityService = new ConnectivityService({ client });\n this.sendService = new SendService(client);\n this.discoveryService = new DiscoveryService({ client });\n this.mockService = new MockService(client);\n }\n\n async connect(sessionId: string): Promise<Session> {\n return this.connectivityService.connect(sessionId);\n }\n\n async disconnect(sessionId: string): Promise<boolean> {\n return this.connectivityService.disconnect(sessionId);\n }\n\n async disconnectAll(): Promise<boolean> {\n return this.connectivityService.disconnectAll();\n }\n\n async getConnected(): Promise<Session[]> {\n return this.connectivityService.getConnected();\n }\n\n async send(\n sessionId: string,\n binaryCommand: Uint8Array,\n ): Promise<CommandResponse> {\n const command = this.toHexString(binaryCommand);\n return this.sendService.send(sessionId, command);\n }\n\n async scan(nbDevices?: number): Promise<Device[]> {\n return this.discoveryService.scanDevices(nbDevices);\n }\n\n async addMock(\n sessionId: string,\n prefix: string,\n response: string,\n ): Promise<boolean> {\n return this.mockService.add(sessionId, prefix, response);\n }\n\n async getMocks(sessionId: string): Promise<Mock[]> {\n return this.mockService.get(sessionId);\n }\n\n async deleteMocks(sessionId: string): Promise<boolean> {\n return this.mockService.delete(sessionId);\n }\n\n //TODO: Move to Helper ?\n toHexString(arr: Uint8Array): string {\n return Array.from(arr, (i) => i.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n fromHexString(hexString: string): Uint8Array {\n if (!hexString) {\n return Uint8Array.from([]);\n }\n return new Uint8Array(\n hexString.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16)),\n );\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAoC,yCACpCC,EAAiC,sCACjCC,EAA4B,iCAC5BC,EAA4B,iCAC5BC,EAAkC,+BAE3B,MAAMN,CAAW,CAEtB,oBACA,YACA,iBACA,YAEA,YAAYO,EAAiB,CAC3B,MAAMC,EAAS,IAAI,oBAAkB,CAAE,QAASD,EAAU,GAAI,CAAC,EAC/D,KAAK,oBAAsB,IAAI,sBAAoB,CAAE,OAAAC,CAAO,CAAC,EAC7D,KAAK,YAAc,IAAI,cAAYA,CAAM,EACzC,KAAK,iBAAmB,IAAI,mBAAiB,CAAE,OAAAA,CAAO,CAAC,EACvD,KAAK,YAAc,IAAI,cAAYA,CAAM,CAC3C,CAEA,MAAM,QAAQC,EAAqC,CACjD,OAAO,KAAK,oBAAoB,QAAQA,CAAS,CACnD,CAEA,MAAM,WAAWA,EAAqC,CACpD,OAAO,KAAK,oBAAoB,WAAWA,CAAS,CACtD,CAEA,MAAM,eAAkC,CACtC,OAAO,KAAK,oBAAoB,cAAc,CAChD,CAEA,MAAM,cAAmC,CACvC,OAAO,KAAK,oBAAoB,aAAa,CAC/C,CAEA,MAAM,KACJA,EACAC,EAC0B,CAC1B,MAAMC,EAAU,KAAK,YAAYD,CAAa,EAC9C,OAAO,KAAK,YAAY,KAAKD,EAAWE,CAAO,CACjD,CAEA,MAAM,KAAKC,EAAuC,CAChD,OAAO,KAAK,iBAAiB,YAAYA,CAAS,CACpD,CAEA,MAAM,QACJH,EACAI,EACAC,EACkB,CAClB,OAAO,KAAK,YAAY,IAAIL,EAAWI,EAAQC,CAAQ,CACzD,CAEA,MAAM,SAASL,EAAoC,CACjD,OAAO,KAAK,YAAY,IAAIA,CAAS,CACvC,CAEA,MAAM,YAAYA,EAAqC,CACrD,OAAO,KAAK,YAAY,OAAOA,CAAS,CAC1C,CAGA,YAAYM,EAAyB,CACnC,OAAO,MAAM,KAAKA,EAAMC,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CACxE,CAEA,cAAcC,EAA+B,CAC3C,OAAKA,EAGE,IAAI,WACTA,EAAU,MAAM,SAAS,EAAG,IAAKC,GAAS,SAASA,EAAM,EAAE,CAAC,CAC9D,EAJS,WAAW,KAAK,CAAC,CAAC,CAK7B,CACF",
6
- "names": ["MockClient_exports", "__export", "MockClient", "__toCommonJS", "import_ConnectivityService", "import_DiscoveryService", "import_MockService", "import_SendService", "import_DefaultHttpClient", "baseUrl", "client", "sessionId", "binaryCommand", "command", "nbDevices", "prefix", "response", "arr", "i", "hexString", "byte"]
4
+ "sourcesContent": ["import {\n bufferToHexaString,\n DmkNetworkClient,\n} from \"@ledgerhq/device-management-kit\";\nimport { array, type Codec } from \"purify-ts\";\n\nimport {\n authResponseCodec,\n type ConnectionState,\n connectionStateCodec,\n} from \"./model/Auth\";\nimport {\n type CommandResponse,\n commandResponseCodec,\n} from \"./model/CommandResponse\";\nimport { type Device, deviceCodec, type DeviceConfig } from \"./model/Device\";\nimport { type Mock, mockCodec, type MockConfig } from \"./model/Mock\";\nimport { type Session, sessionCodec } from \"./model/Session\";\nimport { type SessionExport, sessionExportCodec } from \"./model/SessionExport\";\nimport { type SpeculosInstance, speculosInstanceCodec } from \"./model/Speculos\";\n\nexport interface MockClientOptions {\n /**\n * An existing mock server session token. When provided the client operates\n * within that session; when omitted the client lazily creates its own session\n * through POST /auth.\n */\n readonly token?: string;\n /** Inject a custom network client (mainly for testing). */\n readonly httpClient?: DmkNetworkClient;\n}\n\n/**\n * HTTP client for the device mock server.\n *\n * Implements the bearer-token contract: the session is\n * resolved from an `Authorization: Bearer <token>` header rather than a\n * `session_id` header, and sessions, devices and mocks are exposed as REST\n * resources. The token can be injected or self-provisioned via /auth.\n */\nexport class MockClient {\n private readonly client: DmkNetworkClient;\n private token?: string;\n private authPromise?: Promise<string>;\n\n constructor(baseUrl: string, options: MockClientOptions = {}) {\n this.client =\n options.httpClient ??\n new DmkNetworkClient({ baseUrl: this.normalizeUrl(baseUrl) });\n this.token = options.token;\n }\n\n // --- Authentication -------------------------------------------------------\n\n /** Create a session and store the returned bearer token. */\n async authenticate(): Promise<string> {\n const data = await this.client.post(\"auth\", {});\n const token = this.decode(authResponseCodec, data).token;\n this.token = token;\n return token;\n }\n\n /** The current bearer token, if a session has been established. */\n getToken(): string | undefined {\n return this.token;\n }\n\n // --- Devices --------------------------------------------------------------\n\n async listDevices(): Promise<Device[]> {\n const data = await this.client.get(\"devices\", {\n headers: await this.authHeaders(),\n });\n return this.decode(array(deviceCodec), data);\n }\n\n async addDevice(config: DeviceConfig = {}): Promise<Device> {\n const data = await this.client.post(\"devices\", config, {\n headers: await this.authHeaders(),\n });\n return this.decode(deviceCodec, data);\n }\n\n async getDevice(deviceId: string): Promise<Device> {\n const data = await this.client.get(`devices/${deviceId}`, {\n headers: await this.authHeaders(),\n });\n return this.decode(deviceCodec, data);\n }\n\n async editDevice(deviceId: string, config: DeviceConfig): Promise<Device> {\n const data = await this.client.patch(`devices/${deviceId}`, config, {\n headers: await this.authHeaders(),\n });\n return this.decode(deviceCodec, data);\n }\n\n async deleteDevice(deviceId: string): Promise<boolean> {\n await this.client.delete(`devices/${deviceId}`, {\n headers: await this.authHeaders(),\n });\n return true;\n }\n\n // --- Connection state -----------------------------------------------------\n\n async connect(deviceId: string): Promise<ConnectionState> {\n const data = await this.client.post(\n `devices/${deviceId}/connect`,\n {},\n { headers: await this.authHeaders() },\n );\n return this.decode(connectionStateCodec, data);\n }\n\n async disconnect(deviceId: string): Promise<boolean> {\n await this.client.post(\n `devices/${deviceId}/disconnect`,\n {},\n { headers: await this.authHeaders() },\n );\n return true;\n }\n\n /** Disconnect every device attached to the session. */\n async disconnectAll(): Promise<boolean> {\n const devices = await this.listDevices();\n await Promise.all(\n devices\n .filter((device) => device.connected)\n .map((device) => this.disconnect(device.id)),\n );\n return true;\n }\n\n // --- APDU simulation ------------------------------------------------------\n\n async sendApdu(\n deviceId: string,\n apdu: Uint8Array | string,\n ): Promise<CommandResponse> {\n const hex =\n typeof apdu === \"string\" ? apdu : bufferToHexaString(apdu, false);\n const data = await this.client.post(\n `devices/${deviceId}/apdu`,\n { apdu: hex },\n { headers: await this.authHeaders() },\n );\n return this.decode(commandResponseCodec, data);\n }\n\n // --- Mocks (device-scoped) ------------------------------------------------\n\n async listMocks(deviceId: string): Promise<Mock[]> {\n const data = await this.client.get(`devices/${deviceId}/mocks`, {\n headers: await this.authHeaders(),\n });\n return this.decode(array(mockCodec), data);\n }\n\n async addMock(deviceId: string, config: MockConfig): Promise<Mock> {\n const data = await this.client.post(`devices/${deviceId}/mocks`, config, {\n headers: await this.authHeaders(),\n });\n return this.decode(mockCodec, data);\n }\n\n async editMock(\n deviceId: string,\n mockId: string,\n config: MockConfig,\n ): Promise<Mock> {\n const data = await this.client.patch(\n `devices/${deviceId}/mocks/${mockId}`,\n config,\n { headers: await this.authHeaders() },\n );\n return this.decode(mockCodec, data);\n }\n\n async deleteMock(deviceId: string, mockId: string): Promise<boolean> {\n await this.client.delete(`devices/${deviceId}/mocks/${mockId}`, {\n headers: await this.authHeaders(),\n });\n return true;\n }\n\n async clearMocks(deviceId: string): Promise<boolean> {\n await this.client.delete(`devices/${deviceId}/mocks`, {\n headers: await this.authHeaders(),\n });\n return true;\n }\n\n // --- Speculos -------------------------------------------------------------\n\n /**\n * Resolve the live Speculos instance backing a device (the one currently\n * proxying its APDUs). Throws if the device has no active instance.\n */\n async getSpeculos(deviceId: string): Promise<SpeculosInstance> {\n const data = await this.client.get(`devices/${deviceId}/speculos`, {\n headers: await this.authHeaders(),\n });\n return this.decode(speculosInstanceCodec, data);\n }\n\n // --- Session --------------------------------------------------------------\n\n async getSession(): Promise<Session> {\n const data = await this.client.get(\"sessions/current\", {\n headers: await this.authHeaders(),\n });\n return this.decode(sessionCodec, data);\n }\n\n async disposeSession(): Promise<boolean> {\n await this.client.delete(\"sessions/current\", {\n headers: await this.authHeaders(),\n });\n this.token = undefined;\n this.authPromise = undefined;\n return true;\n }\n\n // --- Import / Export ------------------------------------------------------\n\n /** Export the session's devices and mocks as a portable snapshot. */\n async exportSession(): Promise<SessionExport> {\n const data = await this.client.get(\"export\", {\n headers: await this.authHeaders(),\n });\n return this.decode(sessionExportCodec, data);\n }\n\n /**\n * Replace the session's devices and mocks with a previously exported\n * snapshot, returning the resulting (normalized) state.\n */\n async importSession(snapshot: SessionExport): Promise<SessionExport> {\n const data = await this.client.post(\"import\", snapshot, {\n headers: await this.authHeaders(),\n });\n return this.decode(sessionExportCodec, data);\n }\n\n // --- Helpers --------------------------------------------------------------\n\n private decode<T>(codec: Codec<T>, data: unknown): T {\n return codec.decode(data).caseOf({\n Left: (error) => {\n throw new Error(`MockClient: invalid server response (${error})`);\n },\n Right: (value) => value,\n });\n }\n\n private async authHeaders(): Promise<Record<string, string>> {\n const token = await this.ensureToken();\n return { Authorization: `Bearer ${token}` };\n }\n\n private ensureToken(): Promise<string> {\n if (this.token) {\n return Promise.resolve(this.token);\n }\n if (!this.authPromise) {\n this.authPromise = this.authenticate();\n }\n return this.authPromise;\n }\n\n private normalizeUrl(baseUrl: string): string {\n return baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["MockClient_exports", "__export", "MockClient", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_Auth", "import_CommandResponse", "import_Device", "import_Mock", "import_Session", "import_SessionExport", "import_Speculos", "baseUrl", "options", "data", "token", "config", "deviceId", "devices", "device", "apdu", "hex", "mockId", "snapshot", "codec", "error", "value"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=require("./DmkNetworkClient.stub"),n=require("./MockClient");const i=(e={})=>({id:"dev-1",name:"Ledger Nano X",device_type:"nanoX",connectivity_type:"USB",...e});describe("MockClient",()=>{describe("authentication",()=>{it("lazily creates a session via /auth when no token is provided",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"auth",response:{token:"tok-123",expires_at:42}}).mockResponse({method:"get",endpoint:"devices",response:[]}),t=new n.MockClient("http://localhost:8080",{httpClient:e}),o=await t.listDevices();expect(t.getToken()).toBe("tok-123"),expect(e.calls).toContainEqual({method:"post",endpoint:"auth",body:{}}),expect(o).toEqual([])}),it("does not call /auth when a token is injected",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"devices",response:[]}),t=new n.MockClient("http://localhost:8080",{token:"injected",httpClient:e});await t.listDevices(),expect(t.getToken()).toBe("injected"),expect(e.calls.find(o=>o.endpoint==="auth")).toBeUndefined()}),it("returns the token from an explicit authenticate() call",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"auth",response:{token:"tok-abc",expires_at:99}}),t=new n.MockClient("http://localhost:8080",{httpClient:e}),o=await t.authenticate();expect(o).toBe("tok-abc"),expect(t.getToken()).toBe("tok-abc")}),it("reuses a single in-flight /auth call for concurrent requests",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"auth",response:{token:"tok-shared",expires_at:1}}).mockResponse({method:"get",endpoint:"devices",response:[]}),t=new n.MockClient("http://localhost:8080",{httpClient:e});await Promise.all([t.listDevices(),t.listDevices()]);const o=e.calls.filter(c=>c.endpoint==="auth");expect(o).toHaveLength(1)}),it("returns undefined token before any session is established",()=>{const e=new n.MockClient("http://localhost:8080",{httpClient:(0,s.httpClientStubBuilder)()});expect(e.getToken()).toBeUndefined()})}),describe("constructor",()=>{it("normalizes a base url without a trailing slash",()=>{const e=new n.MockClient("http://localhost:8080/"),t=new n.MockClient("http://localhost:8080");expect(e.getToken()).toBeUndefined(),expect(t.getToken()).toBeUndefined()})}),describe("devices",()=>{it("lists devices",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"devices",response:[i()]}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).listDevices();expect(o).toEqual([expect.objectContaining({id:"dev-1"})])}),it("adds a device with a default empty config",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"devices",response:i()}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).addDevice();expect(o.id).toBe("dev-1"),expect(e.calls).toContainEqual({method:"post",endpoint:"devices",body:{}})}),it("gets a single device",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"devices/dev-1",response:i()}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).getDevice("dev-1");expect(o.id).toBe("dev-1")}),it("edits a device",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"patch",endpoint:"devices/dev-1",response:i({name:"Renamed"})}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).editDevice("dev-1",{name:"Renamed"});expect(o.name).toBe("Renamed"),expect(e.calls).toContainEqual({method:"patch",endpoint:"devices/dev-1",body:{name:"Renamed"}})}),it("deletes a device",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"delete",endpoint:"devices/dev-1",response:{}}),t=new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e});await expect(t.deleteDevice("dev-1")).resolves.toBe(!0),expect(e.calls).toContainEqual({method:"delete",endpoint:"devices/dev-1"})})}),describe("connection state",()=>{it("connects a device",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"devices/dev-1/connect",response:{device:i(),connected:!0}}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).connect("dev-1");expect(o.connected).toBe(!0),expect(o.device.id).toBe("dev-1")}),it("disconnects a device",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"devices/dev-1/disconnect",response:{}}),t=new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e});await expect(t.disconnect("dev-1")).resolves.toBe(!0)}),it("disconnects every connected device",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"devices",response:[i({id:"dev-1",connected:!0}),i({id:"dev-2",connected:!1}),i({id:"dev-3",connected:!0})]}).mockResponse({method:"post",endpoint:"devices/dev-1/disconnect",response:{}}).mockResponse({method:"post",endpoint:"devices/dev-3/disconnect",response:{}}),t=new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e});await expect(t.disconnectAll()).resolves.toBe(!0);const o=e.calls.filter(c=>c.endpoint.endsWith("/disconnect"));expect(o.map(c=>c.endpoint)).toEqual(["devices/dev-1/disconnect","devices/dev-3/disconnect"])})}),describe("mocks",()=>{it("lists device-scoped mocks",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"devices/dev-1/mocks",response:[{id:"m1",prefix:"e0010000",responses:["9000"]}]}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).listMocks("dev-1");expect(o).toEqual([expect.objectContaining({id:"m1"})])}),it("creates a device-scoped mock",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"devices/dev-1/mocks",response:{id:"m1",prefix:"e0010000",responses:["9000"]}}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).addMock("dev-1",{prefix:"e0010000",response:"9000"});expect(o.id).toBe("m1"),expect(e.calls).toContainEqual({method:"post",endpoint:"devices/dev-1/mocks",body:{prefix:"e0010000",response:"9000"}})}),it("edits a mock",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"patch",endpoint:"devices/dev-1/mocks/m1",response:{id:"m1",prefix:"e0010000",responses:["6985"]}}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).editMock("dev-1","m1",{prefix:"e0010000",response:"6985"});expect(o.responses).toEqual(["6985"]),expect(e.calls).toContainEqual({method:"patch",endpoint:"devices/dev-1/mocks/m1",body:{prefix:"e0010000",response:"6985"}})}),it("deletes a single mock",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"delete",endpoint:"devices/dev-1/mocks/m1",response:{}}),t=new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e});await expect(t.deleteMock("dev-1","m1")).resolves.toBe(!0),expect(e.calls).toContainEqual({method:"delete",endpoint:"devices/dev-1/mocks/m1"})}),it("clears all mocks of a device",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"delete",endpoint:"devices/dev-1/mocks",response:{}}),t=new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e});await expect(t.clearMocks("dev-1")).resolves.toBe(!0),expect(e.calls).toContainEqual({method:"delete",endpoint:"devices/dev-1/mocks"})})}),describe("speculos",()=>{it("resolves the live speculos instance backing a device",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"devices/dev-1/speculos",response:{run_id:"run-1",speculos_url:"https://speculos:5000",model:"stax"}}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).getSpeculos("dev-1");expect(o).toEqual({run_id:"run-1",speculos_url:"https://speculos:5000",model:"stax"})})}),describe("session",()=>{it("fetches the current session",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"sessions/current",response:{id:"sess-1",created_at:1,expires_at:2,devices:[i()]}}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).getSession();expect(o.id).toBe("sess-1"),expect(o.devices).toHaveLength(1)}),it("disposes the session and clears the stored token",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"delete",endpoint:"sessions/current",response:{}}),t=new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e});await expect(t.disposeSession()).resolves.toBe(!0),expect(t.getToken()).toBeUndefined()})}),describe("response validation",()=>{it("throws a descriptive error when the server response is malformed",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"devices/dev-1",response:{id:123}}),t=new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e});await expect(t.getDevice("dev-1")).rejects.toThrow(/MockClient: invalid server response/)})}),describe("import/export",()=>{it("exports the session snapshot",async()=>{const e={devices:[{name:"Ledger Stax",device_type:"stax",mocks:[{prefix:"ff",responses:["9000"]}]}]},t=(0,s.httpClientStubBuilder)().mockResponse({method:"get",endpoint:"export",response:e}),c=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:t}).exportSession();expect(c).toEqual(e)}),it("posts a snapshot to the import endpoint",async()=>{const e={devices:[{name:"Ledger Flex",device_type:"flex",mocks:[{prefix:"e0010000",responses:["aa9000","5515"]}]}]},t=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"import",response:e}),c=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:t}).importSession(e);expect(c).toEqual(e),expect(t.calls).toContainEqual({method:"post",endpoint:"import",body:e})})}),describe("apdu",()=>{it("sends a binary APDU as hex to the device apdu endpoint",async()=>{const e=(0,s.httpClientStubBuilder)().mockResponse({method:"post",endpoint:"devices/dev-1/apdu",response:{response:"9000"}}),o=await new n.MockClient("http://localhost:8080",{token:"tok",httpClient:e}).sendApdu("dev-1",Uint8Array.from([224,1,0,0]));expect(o.response).toBe("9000"),expect(e.calls).toContainEqual({method:"post",endpoint:"devices/dev-1/apdu",body:{apdu:"e0010000"}})})})});
2
+ //# sourceMappingURL=MockClient.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/MockClient.test.ts"],
4
+ "sourcesContent": ["import { httpClientStubBuilder } from \"./DmkNetworkClient.stub\";\nimport { MockClient } from \"./MockClient\";\n\nconst aDevice = (overrides: Record<string, unknown> = {}) => ({\n id: \"dev-1\",\n name: \"Ledger Nano X\",\n device_type: \"nanoX\",\n connectivity_type: \"USB\",\n ...overrides,\n});\n\ndescribe(\"MockClient\", () => {\n describe(\"authentication\", () => {\n it(\"lazily creates a session via /auth when no token is provided\", async () => {\n const http = httpClientStubBuilder()\n .mockResponse({\n method: \"post\",\n endpoint: \"auth\",\n response: { token: \"tok-123\", expires_at: 42 },\n })\n .mockResponse({\n method: \"get\",\n endpoint: \"devices\",\n response: [],\n });\n const client = new MockClient(\"http://localhost:8080\", {\n httpClient: http,\n });\n\n const devices = await client.listDevices();\n\n expect(client.getToken()).toBe(\"tok-123\");\n expect(http.calls).toContainEqual({\n method: \"post\",\n endpoint: \"auth\",\n body: {},\n });\n expect(devices).toEqual([]);\n });\n\n it(\"does not call /auth when a token is injected\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"get\",\n endpoint: \"devices\",\n response: [],\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"injected\",\n httpClient: http,\n });\n\n await client.listDevices();\n\n expect(client.getToken()).toBe(\"injected\");\n expect(\n http.calls.find((call) => call.endpoint === \"auth\"),\n ).toBeUndefined();\n });\n\n it(\"returns the token from an explicit authenticate() call\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"post\",\n endpoint: \"auth\",\n response: { token: \"tok-abc\", expires_at: 99 },\n });\n const client = new MockClient(\"http://localhost:8080\", {\n httpClient: http,\n });\n\n const token = await client.authenticate();\n\n expect(token).toBe(\"tok-abc\");\n expect(client.getToken()).toBe(\"tok-abc\");\n });\n\n it(\"reuses a single in-flight /auth call for concurrent requests\", async () => {\n const http = httpClientStubBuilder()\n .mockResponse({\n method: \"post\",\n endpoint: \"auth\",\n response: { token: \"tok-shared\", expires_at: 1 },\n })\n .mockResponse({ method: \"get\", endpoint: \"devices\", response: [] });\n const client = new MockClient(\"http://localhost:8080\", {\n httpClient: http,\n });\n\n await Promise.all([client.listDevices(), client.listDevices()]);\n\n const authCalls = http.calls.filter((call) => call.endpoint === \"auth\");\n expect(authCalls).toHaveLength(1);\n });\n\n it(\"returns undefined token before any session is established\", () => {\n const client = new MockClient(\"http://localhost:8080\", {\n httpClient: httpClientStubBuilder(),\n });\n\n expect(client.getToken()).toBeUndefined();\n });\n });\n\n describe(\"constructor\", () => {\n it(\"normalizes a base url without a trailing slash\", () => {\n const withSlash = new MockClient(\"http://localhost:8080/\");\n const withoutSlash = new MockClient(\"http://localhost:8080\");\n\n expect(withSlash.getToken()).toBeUndefined();\n expect(withoutSlash.getToken()).toBeUndefined();\n });\n });\n\n describe(\"devices\", () => {\n it(\"lists devices\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"get\",\n endpoint: \"devices\",\n response: [aDevice()],\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const devices = await client.listDevices();\n\n expect(devices).toEqual([expect.objectContaining({ id: \"dev-1\" })]);\n });\n\n it(\"adds a device with a default empty config\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"post\",\n endpoint: \"devices\",\n response: aDevice(),\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const device = await client.addDevice();\n\n expect(device.id).toBe(\"dev-1\");\n expect(http.calls).toContainEqual({\n method: \"post\",\n endpoint: \"devices\",\n body: {},\n });\n });\n\n it(\"gets a single device\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"get\",\n endpoint: \"devices/dev-1\",\n response: aDevice(),\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const device = await client.getDevice(\"dev-1\");\n\n expect(device.id).toBe(\"dev-1\");\n });\n\n it(\"edits a device\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"patch\",\n endpoint: \"devices/dev-1\",\n response: aDevice({ name: \"Renamed\" }),\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const device = await client.editDevice(\"dev-1\", { name: \"Renamed\" });\n\n expect(device.name).toBe(\"Renamed\");\n expect(http.calls).toContainEqual({\n method: \"patch\",\n endpoint: \"devices/dev-1\",\n body: { name: \"Renamed\" },\n });\n });\n\n it(\"deletes a device\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"delete\",\n endpoint: \"devices/dev-1\",\n response: {},\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n await expect(client.deleteDevice(\"dev-1\")).resolves.toBe(true);\n expect(http.calls).toContainEqual({\n method: \"delete\",\n endpoint: \"devices/dev-1\",\n });\n });\n });\n\n describe(\"connection state\", () => {\n it(\"connects a device\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"post\",\n endpoint: \"devices/dev-1/connect\",\n response: { device: aDevice(), connected: true },\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const state = await client.connect(\"dev-1\");\n\n expect(state.connected).toBe(true);\n expect(state.device.id).toBe(\"dev-1\");\n });\n\n it(\"disconnects a device\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"post\",\n endpoint: \"devices/dev-1/disconnect\",\n response: {},\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n await expect(client.disconnect(\"dev-1\")).resolves.toBe(true);\n });\n\n it(\"disconnects every connected device\", async () => {\n const http = httpClientStubBuilder()\n .mockResponse({\n method: \"get\",\n endpoint: \"devices\",\n response: [\n aDevice({ id: \"dev-1\", connected: true }),\n aDevice({ id: \"dev-2\", connected: false }),\n aDevice({ id: \"dev-3\", connected: true }),\n ],\n })\n .mockResponse({\n method: \"post\",\n endpoint: \"devices/dev-1/disconnect\",\n response: {},\n })\n .mockResponse({\n method: \"post\",\n endpoint: \"devices/dev-3/disconnect\",\n response: {},\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n await expect(client.disconnectAll()).resolves.toBe(true);\n\n const disconnectCalls = http.calls.filter((call) =>\n call.endpoint.endsWith(\"/disconnect\"),\n );\n expect(disconnectCalls.map((call) => call.endpoint)).toEqual([\n \"devices/dev-1/disconnect\",\n \"devices/dev-3/disconnect\",\n ]);\n });\n });\n\n describe(\"mocks\", () => {\n it(\"lists device-scoped mocks\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"get\",\n endpoint: \"devices/dev-1/mocks\",\n response: [{ id: \"m1\", prefix: \"e0010000\", responses: [\"9000\"] }],\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const mocks = await client.listMocks(\"dev-1\");\n\n expect(mocks).toEqual([expect.objectContaining({ id: \"m1\" })]);\n });\n\n it(\"creates a device-scoped mock\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"post\",\n endpoint: \"devices/dev-1/mocks\",\n response: { id: \"m1\", prefix: \"e0010000\", responses: [\"9000\"] },\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const mock = await client.addMock(\"dev-1\", {\n prefix: \"e0010000\",\n response: \"9000\",\n });\n\n expect(mock.id).toBe(\"m1\");\n expect(http.calls).toContainEqual({\n method: \"post\",\n endpoint: \"devices/dev-1/mocks\",\n body: { prefix: \"e0010000\", response: \"9000\" },\n });\n });\n\n it(\"edits a mock\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"patch\",\n endpoint: \"devices/dev-1/mocks/m1\",\n response: { id: \"m1\", prefix: \"e0010000\", responses: [\"6985\"] },\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const mock = await client.editMock(\"dev-1\", \"m1\", {\n prefix: \"e0010000\",\n response: \"6985\",\n });\n\n expect(mock.responses).toEqual([\"6985\"]);\n expect(http.calls).toContainEqual({\n method: \"patch\",\n endpoint: \"devices/dev-1/mocks/m1\",\n body: { prefix: \"e0010000\", response: \"6985\" },\n });\n });\n\n it(\"deletes a single mock\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"delete\",\n endpoint: \"devices/dev-1/mocks/m1\",\n response: {},\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n await expect(client.deleteMock(\"dev-1\", \"m1\")).resolves.toBe(true);\n expect(http.calls).toContainEqual({\n method: \"delete\",\n endpoint: \"devices/dev-1/mocks/m1\",\n });\n });\n\n it(\"clears all mocks of a device\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"delete\",\n endpoint: \"devices/dev-1/mocks\",\n response: {},\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n await expect(client.clearMocks(\"dev-1\")).resolves.toBe(true);\n expect(http.calls).toContainEqual({\n method: \"delete\",\n endpoint: \"devices/dev-1/mocks\",\n });\n });\n });\n\n describe(\"speculos\", () => {\n it(\"resolves the live speculos instance backing a device\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"get\",\n endpoint: \"devices/dev-1/speculos\",\n response: {\n run_id: \"run-1\",\n speculos_url: \"https://speculos:5000\",\n model: \"stax\",\n },\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const instance = await client.getSpeculos(\"dev-1\");\n\n expect(instance).toEqual({\n run_id: \"run-1\",\n speculos_url: \"https://speculos:5000\",\n model: \"stax\",\n });\n });\n });\n\n describe(\"session\", () => {\n it(\"fetches the current session\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"get\",\n endpoint: \"sessions/current\",\n response: {\n id: \"sess-1\",\n created_at: 1,\n expires_at: 2,\n devices: [aDevice()],\n },\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const session = await client.getSession();\n\n expect(session.id).toBe(\"sess-1\");\n expect(session.devices).toHaveLength(1);\n });\n\n it(\"disposes the session and clears the stored token\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"delete\",\n endpoint: \"sessions/current\",\n response: {},\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n await expect(client.disposeSession()).resolves.toBe(true);\n expect(client.getToken()).toBeUndefined();\n });\n });\n\n describe(\"response validation\", () => {\n it(\"throws a descriptive error when the server response is malformed\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"get\",\n endpoint: \"devices/dev-1\",\n response: { id: 123 } as unknown as object,\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n await expect(client.getDevice(\"dev-1\")).rejects.toThrow(\n /MockClient: invalid server response/,\n );\n });\n });\n\n describe(\"import/export\", () => {\n it(\"exports the session snapshot\", async () => {\n const snapshot = {\n devices: [\n {\n name: \"Ledger Stax\",\n device_type: \"stax\",\n mocks: [{ prefix: \"ff\", responses: [\"9000\"] }],\n },\n ],\n };\n const http = httpClientStubBuilder().mockResponse({\n method: \"get\",\n endpoint: \"export\",\n response: snapshot,\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const result = await client.exportSession();\n\n expect(result).toEqual(snapshot);\n });\n\n it(\"posts a snapshot to the import endpoint\", async () => {\n const snapshot = {\n devices: [\n {\n name: \"Ledger Flex\",\n device_type: \"flex\",\n mocks: [{ prefix: \"e0010000\", responses: [\"aa9000\", \"5515\"] }],\n },\n ],\n };\n const http = httpClientStubBuilder().mockResponse({\n method: \"post\",\n endpoint: \"import\",\n response: snapshot,\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const result = await client.importSession(snapshot);\n\n expect(result).toEqual(snapshot);\n expect(http.calls).toContainEqual({\n method: \"post\",\n endpoint: \"import\",\n body: snapshot,\n });\n });\n });\n\n describe(\"apdu\", () => {\n it(\"sends a binary APDU as hex to the device apdu endpoint\", async () => {\n const http = httpClientStubBuilder().mockResponse({\n method: \"post\",\n endpoint: \"devices/dev-1/apdu\",\n response: { response: \"9000\" },\n });\n const client = new MockClient(\"http://localhost:8080\", {\n token: \"tok\",\n httpClient: http,\n });\n\n const result = await client.sendApdu(\n \"dev-1\",\n Uint8Array.from([0xe0, 0x01, 0x00, 0x00]),\n );\n\n expect(result.response).toBe(\"9000\");\n expect(http.calls).toContainEqual({\n method: \"post\",\n endpoint: \"devices/dev-1/apdu\",\n body: { apdu: \"e0010000\" },\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_DmkNetworkClient", "import_MockClient", "aDevice", "overrides", "http", "client", "devices", "call", "token", "authCalls", "withSlash", "withoutSlash", "device", "state", "disconnectCalls", "mocks", "mock", "instance", "session", "snapshot", "result"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var M=(e,o)=>{for(var m in o)p(e,m,{get:o[m],enumerable:!0})},a=(e,o,m,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of k(o))!C.call(e,r)&&r!==m&&p(e,r,{get:()=>o[r],enumerable:!(t=i(o,r))||t.enumerable});return e};var d=e=>a(p({},"__esModule",{value:!0}),e);var l={};M(l,{CommandResponse:()=>x.CommandResponse,Device:()=>n.Device,Mock:()=>s.Mock,MockClient:()=>f.MockClient,Session:()=>c.Session});module.exports=d(l);var f=require("./MockClient"),x=require("./model/CommandResponse"),n=require("./model/Device"),s=require("./model/Mock"),c=require("./model/Session");0&&(module.exports={CommandResponse,Device,Mock,MockClient,Session});
1
+ "use strict";var n=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var x=(o,e)=>{for(var p in e)n(o,p,{get:e[p],enumerable:!0})},d=(o,e,p,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of C(e))!f.call(o,t)&&t!==p&&n(o,t,{get:()=>e[t],enumerable:!(i=y(e,t))||i.enumerable});return o};var l=o=>d(n({},"__esModule",{value:!0}),o);var k={};x(k,{MockClient:()=>r.MockClient,deviceConfigCodec:()=>c.deviceConfigCodec,mockConfigCodec:()=>s.mockConfigCodec,sessionExportCodec:()=>m.sessionExportCodec});module.exports=l(k);var r=require("./MockClient"),c=require("./model/Device"),s=require("./model/Mock"),m=require("./model/SessionExport");0&&(module.exports={MockClient,deviceConfigCodec,mockConfigCodec,sessionExportCodec});
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts"],
4
- "sourcesContent": ["export { MockClient } from \"./MockClient\";\nexport { CommandResponse } from \"./model/CommandResponse\";\nexport { Device } from \"./model/Device\";\nexport { Mock } from \"./model/Mock\";\nexport { Session } from \"./model/Session\";\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8IAAAE,EAAAF,GAAA,IAAAG,EAA2B,wBAC3BC,EAAgC,mCAChCC,EAAuB,0BACvBC,EAAqB,wBACrBC,EAAwB",
6
- "names": ["src_exports", "__export", "__toCommonJS", "import_MockClient", "import_CommandResponse", "import_Device", "import_Mock", "import_Session"]
4
+ "sourcesContent": ["export type { MockClientOptions } from \"./MockClient\";\nexport { MockClient } from \"./MockClient\";\nexport type { AuthResponse, ConnectionState } from \"./model/Auth\";\nexport type { CommandResponse } from \"./model/CommandResponse\";\nexport {\n type Device,\n type DeviceApp,\n type DeviceConfig,\n deviceConfigCodec,\n type DeviceConnectivityType,\n} from \"./model/Device\";\nexport { type Mock, type MockConfig, mockConfigCodec } from \"./model/Mock\";\nexport type { Session } from \"./model/Session\";\nexport { type SessionExport, sessionExportCodec } from \"./model/SessionExport\";\nexport type { SpeculosInstance } from \"./model/Speculos\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0KAAAE,EAAAF,GACA,IAAAG,EAA2B,wBAG3BC,EAMO,0BACPC,EAA4D,wBAE5DC,EAAuD",
6
+ "names": ["src_exports", "__export", "__toCommonJS", "import_MockClient", "import_Device", "import_Mock", "import_SessionExport"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var f=(n,e)=>{for(var c in e)r(n,c,{get:e[c],enumerable:!0})},l=(n,e,c,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of p(e))!s.call(n,t)&&t!==c&&r(n,t,{get:()=>e[t],enumerable:!(i=d(e,t))||i.enumerable});return n};var m=n=>l(r({},"__esModule",{value:!0}),n);var y={};f(y,{authResponseCodec:()=>x,connectionStateCodec:()=>v});module.exports=m(y);var o=require("purify-ts"),a=require("./Device");const x=o.Codec.interface({token:o.string,expires_at:o.number}),v=o.Codec.interface({device:a.deviceCodec,connected:o.boolean});0&&(module.exports={authResponseCodec,connectionStateCodec});
2
+ //# sourceMappingURL=Auth.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/model/Auth.ts"],
4
+ "sourcesContent": ["import { boolean, Codec, number, string } from \"purify-ts\";\n\nimport { type Device, deviceCodec } from \"./Device\";\n\n/**\n * Response of POST /auth: an opaque bearer token identifying a session and its\n * expiry timestamp (epoch ms).\n */\nexport interface AuthResponse {\n readonly token: string;\n readonly expires_at: number;\n}\n\nexport const authResponseCodec = Codec.interface({\n token: string,\n expires_at: number,\n});\n\n/**\n * State returned when connecting a device (POST /devices/:id/connect).\n */\nexport interface ConnectionState {\n readonly device: Device;\n readonly connected: boolean;\n}\n\nexport const connectionStateCodec = Codec.interface({\n device: deviceCodec,\n connected: boolean,\n});\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,yBAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAA+C,qBAE/CC,EAAyC,oBAWlC,MAAMJ,EAAoB,QAAM,UAAU,CAC/C,MAAO,SACP,WAAY,QACd,CAAC,EAUYC,EAAuB,QAAM,UAAU,CAClD,OAAQ,cACR,UAAW,SACb,CAAC",
6
+ "names": ["Auth_exports", "__export", "authResponseCodec", "connectionStateCodec", "__toCommonJS", "import_purify_ts", "import_Device"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var r=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var d=(e,s)=>{for(var n in s)r(e,n,{get:s[n],enumerable:!0})},g=(e,s,n,p)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of a(s))!m.call(e,o)&&o!==n&&r(e,o,{get:()=>s[o],enumerable:!(p=t(s,o))||p.enumerable});return e};var c=e=>g(r({},"__esModule",{value:!0}),e);var l={};d(l,{CommandResponse:()=>i});module.exports=c(l);class i{response;constructor({response:s}){this.response=s}}0&&(module.exports={CommandResponse});
1
+ "use strict";var t=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var d=(o,e)=>{for(var r in e)t(o,r,{get:e[r],enumerable:!0})},i=(o,e,r,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of m(e))!a.call(o,n)&&n!==r&&t(o,n,{get:()=>e[n],enumerable:!(p=c(e,n))||p.enumerable});return o};var f=o=>i(t({},"__esModule",{value:!0}),o);var g={};d(g,{commandResponseCodec:()=>C});module.exports=f(g);var s=require("purify-ts");const C=s.Codec.interface({response:s.string});0&&(module.exports={commandResponseCodec});
2
2
  //# sourceMappingURL=CommandResponse.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/model/CommandResponse.ts"],
4
- "sourcesContent": ["export type CommandResponseArgs = {\n readonly response: string;\n};\n\nexport class CommandResponse {\n readonly response: string;\n\n constructor({ response }: CommandResponseArgs) {\n this.response = response;\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAIO,MAAME,CAAgB,CAClB,SAET,YAAY,CAAE,SAAAE,CAAS,EAAwB,CAC7C,KAAK,SAAWA,CAClB,CACF",
6
- "names": ["CommandResponse_exports", "__export", "CommandResponse", "__toCommonJS", "response"]
4
+ "sourcesContent": ["import { Codec, string } from \"purify-ts\";\n\n/**\n * The result of simulating an APDU exchange (POST /devices/:id/apdu).\n *\n * {@link CommandResponse.response} is the full response hex, data followed by the\n * two-byte status word.\n */\nexport interface CommandResponse {\n readonly response: string;\n}\n\nexport const commandResponseCodec = Codec.interface({\n response: string,\n});\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,qBAYvB,MAAMF,EAAuB,QAAM,UAAU,CAClD,SAAU,QACZ,CAAC",
6
+ "names": ["CommandResponse_exports", "__export", "commandResponseCodec", "__toCommonJS", "import_purify_ts"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var y=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var n in e)y(t,n,{get:e[n],enumerable:!0})},a=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of c(e))!o.call(t,i)&&i!==n&&y(t,i,{get:()=>e[i],enumerable:!(r=s(e,i))||r.enumerable});return t};var g=t=>a(y({},"__esModule",{value:!0}),t);var p={};d(p,{Device:()=>l});module.exports=g(p);class l{id;name;device_type;connectivity_type;constructor({id:e,name:n,device_type:r,connectivity_type:i}){this.id=e,this.name=n,this.device_type=r,this.connectivity_type=i}}0&&(module.exports={Device});
1
+ "use strict";var t=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var m=(o,n)=>{for(var i in n)t(o,i,{get:n[i],enumerable:!0})},v=(o,n,i,c)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of y(n))!d.call(o,r)&&r!==i&&t(o,r,{get:()=>n[r],enumerable:!(c=s(n,r))||c.enumerable});return o};var l=o=>v(t({},"__esModule",{value:!0}),o);var _={};m(_,{deviceAppCodec:()=>a,deviceCodec:()=>f,deviceConfigCodec:()=>g});module.exports=l(_);var e=require("purify-ts"),p=require("./Mock");const a=e.Codec.interface({name:e.string,version:e.string}),f=e.Codec.interface({id:e.string,name:e.string,device_type:e.string,connectivity_type:e.string,firmware_version:(0,e.optional)(e.string),apps:(0,e.optional)((0,e.array)(a)),masks:(0,e.optional)((0,e.array)(e.number)),connected:(0,e.optional)(e.boolean)}),g=e.Codec.interface({name:(0,e.optional)(e.string),device_type:(0,e.optional)(e.string),connectivity_type:(0,e.optional)(e.string),firmware_version:(0,e.optional)(e.string),apps:(0,e.optional)((0,e.array)(a)),masks:(0,e.optional)((0,e.array)(e.number)),mocks:(0,e.optional)((0,e.array)(p.mockConfigCodec))});0&&(module.exports={deviceAppCodec,deviceCodec,deviceConfigCodec});
2
2
  //# sourceMappingURL=Device.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/model/Device.ts"],
4
- "sourcesContent": ["export type DeviceArgs = {\n readonly id: string;\n readonly name: string;\n readonly device_type: string;\n readonly connectivity_type: string;\n};\n\nexport class Device {\n readonly id: string;\n readonly name: string;\n readonly device_type: string;\n readonly connectivity_type: string;\n\n constructor({ id, name, device_type, connectivity_type }: DeviceArgs) {\n this.id = id;\n this.name = name;\n this.device_type = device_type;\n this.connectivity_type = connectivity_type;\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,YAAAE,IAAA,eAAAC,EAAAH,GAOO,MAAME,CAAO,CACT,GACA,KACA,YACA,kBAET,YAAY,CAAE,GAAAE,EAAI,KAAAC,EAAM,YAAAC,EAAa,kBAAAC,CAAkB,EAAe,CACpE,KAAK,GAAKH,EACV,KAAK,KAAOC,EACZ,KAAK,YAAcC,EACnB,KAAK,kBAAoBC,CAC3B,CACF",
6
- "names": ["Device_exports", "__export", "Device", "__toCommonJS", "id", "name", "device_type", "connectivity_type"]
4
+ "sourcesContent": ["import { array, boolean, Codec, number, optional, string } from \"purify-ts\";\n\nimport { type MockConfig, mockConfigCodec } from \"./Mock\";\n\nexport type DeviceConnectivityType = \"USB\" | \"BLE\";\n\nexport interface DeviceApp {\n readonly name: string;\n readonly version: string;\n}\n\nexport const deviceAppCodec = Codec.interface({\n name: string,\n version: string,\n});\n\n/**\n * A mocked device attached to a session.\n *\n * The device exposes rich metadata (firmware\n * version, installed applications, memory masks) so DMK can build a realistic\n * device session.\n */\nexport interface Device {\n readonly id: string;\n readonly name: string;\n /** DeviceModelId enum value, e.g. \"nanoX\", \"stax\", \"flex\". */\n readonly device_type: string;\n readonly connectivity_type: string;\n readonly firmware_version?: string;\n readonly apps?: DeviceApp[];\n readonly masks?: number[];\n readonly connected?: boolean;\n}\n\nexport const deviceCodec = Codec.interface({\n id: string,\n name: string,\n device_type: string,\n connectivity_type: string,\n firmware_version: optional(string),\n apps: optional(array(deviceAppCodec)),\n masks: optional(array(number)),\n connected: optional(boolean),\n});\n\n/**\n * Payload used to attach (POST /devices) or edit (PATCH /devices/:id) a device.\n */\nexport interface DeviceConfig {\n readonly name?: string;\n readonly device_type?: string;\n readonly connectivity_type?: string;\n readonly firmware_version?: string;\n readonly apps?: DeviceApp[];\n readonly masks?: number[];\n /** Device-scoped APDU mocks, used when attaching (POST) or importing a device. */\n readonly mocks?: MockConfig[];\n}\n\nexport const deviceConfigCodec = Codec.interface({\n name: optional(string),\n device_type: optional(string),\n connectivity_type: optional(string),\n firmware_version: optional(string),\n apps: optional(array(deviceAppCodec)),\n masks: optional(array(number)),\n mocks: optional(array(mockConfigCodec)),\n});\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,gBAAAC,EAAA,sBAAAC,IAAA,eAAAC,EAAAL,GAAA,IAAAM,EAAgE,qBAEhEC,EAAiD,kBAS1C,MAAML,EAAiB,QAAM,UAAU,CAC5C,KAAM,SACN,QAAS,QACX,CAAC,EAqBYC,EAAc,QAAM,UAAU,CACzC,GAAI,SACJ,KAAM,SACN,YAAa,SACb,kBAAmB,SACnB,oBAAkB,YAAS,QAAM,EACjC,QAAM,eAAS,SAAMD,CAAc,CAAC,EACpC,SAAO,eAAS,SAAM,QAAM,CAAC,EAC7B,aAAW,YAAS,SAAO,CAC7B,CAAC,EAgBYE,EAAoB,QAAM,UAAU,CAC/C,QAAM,YAAS,QAAM,EACrB,eAAa,YAAS,QAAM,EAC5B,qBAAmB,YAAS,QAAM,EAClC,oBAAkB,YAAS,QAAM,EACjC,QAAM,eAAS,SAAMF,CAAc,CAAC,EACpC,SAAO,eAAS,SAAM,QAAM,CAAC,EAC7B,SAAO,eAAS,SAAM,iBAAe,CAAC,CACxC,CAAC",
6
+ "names": ["Device_exports", "__export", "deviceAppCodec", "deviceCodec", "deviceConfigCodec", "__toCommonJS", "import_purify_ts", "import_Mock"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var n=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var g=(s,r)=>{for(var e in r)n(s,e,{get:r[e],enumerable:!0})},a=(s,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of p(r))!c.call(s,o)&&o!==e&&n(s,o,{get:()=>r[o],enumerable:!(t=i(r,o))||t.enumerable});return s};var l=s=>a(n({},"__esModule",{value:!0}),s);var y={};g(y,{Mock:()=>x});module.exports=l(y);class x{prefix;response;constructor({prefix:r,response:e}){this.prefix=r,this.response=e}}0&&(module.exports={Mock});
1
+ "use strict";var i=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(o,r)=>{for(var s in r)i(o,s,{get:r[s],enumerable:!0})},f=(o,r,s,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of a(r))!c.call(o,n)&&n!==s&&i(o,n,{get:()=>r[n],enumerable:!(t=p(r,n))||t.enumerable});return o};var g=o=>f(i({},"__esModule",{value:!0}),o);var y={};d(y,{mockCodec:()=>x,mockConfigCodec:()=>l});module.exports=g(y);var e=require("purify-ts");const x=e.Codec.interface({id:e.string,prefix:e.string,responses:(0,e.array)(e.string)}),l=e.Codec.interface({prefix:e.string,response:(0,e.optional)(e.string),responses:(0,e.optional)((0,e.array)(e.string))});0&&(module.exports={mockCodec,mockConfigCodec});
2
2
  //# sourceMappingURL=Mock.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/model/Mock.ts"],
4
- "sourcesContent": ["export type MockArgs = {\n readonly prefix: string;\n readonly response: string;\n};\n\nexport class Mock {\n readonly prefix: string;\n readonly response: string;\n\n constructor({ prefix, response }: MockArgs) {\n this.prefix = prefix;\n this.response = response;\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,UAAAE,IAAA,eAAAC,EAAAH,GAKO,MAAME,CAAK,CACP,OACA,SAET,YAAY,CAAE,OAAAE,EAAQ,SAAAC,CAAS,EAAa,CAC1C,KAAK,OAASD,EACd,KAAK,SAAWC,CAClB,CACF",
6
- "names": ["Mock_exports", "__export", "Mock", "__toCommonJS", "prefix", "response"]
4
+ "sourcesContent": ["import { array, Codec, optional, string } from \"purify-ts\";\n\n/**\n * A canned APDU response registered against a device.\n *\n * Whenever an incoming APDU starts with {@link Mock.prefix} (hex), the mock\n * server returns the next entry of {@link Mock.responses}, advancing one entry\n * per matching APDU and looping back to the start once the list is exhausted.\n * Mocks are device-scoped: each device owns its own independent mock table.\n */\nexport interface Mock {\n readonly id: string;\n readonly prefix: string;\n readonly responses: string[];\n}\n\nexport const mockCodec = Codec.interface({\n id: string,\n prefix: string,\n responses: array(string),\n});\n\n/**\n * Payload used to create (POST /mocks) or edit (PATCH /mocks/:id) a mock.\n *\n * Provide either an ordered {@link MockConfig.responses} list or a single\n * {@link MockConfig.response} (shorthand for `responses: [response]`).\n */\nexport interface MockConfig {\n readonly prefix: string;\n readonly response?: string;\n readonly responses?: string[];\n}\n\nexport const mockConfigCodec = Codec.interface({\n prefix: string,\n response: optional(string),\n responses: optional(array(string)),\n});\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,EAAA,oBAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAA+C,qBAgBxC,MAAMH,EAAY,QAAM,UAAU,CACvC,GAAI,SACJ,OAAQ,SACR,aAAW,SAAM,QAAM,CACzB,CAAC,EAcYC,EAAkB,QAAM,UAAU,CAC7C,OAAQ,SACR,YAAU,YAAS,QAAM,EACzB,aAAW,eAAS,SAAM,QAAM,CAAC,CACnC,CAAC",
6
+ "names": ["Mock_exports", "__export", "mockCodec", "mockConfigCodec", "__toCommonJS", "import_purify_ts"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var i in e)s(r,i,{get:e[i],enumerable:!0})},p=(r,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of o(e))!a.call(r,t)&&t!==i&&s(r,t,{get:()=>e[t],enumerable:!(n=d(e,t))||n.enumerable});return r};var y=r=>p(s({},"__esModule",{value:!0}),r);var g={};c(g,{Session:()=>l});module.exports=y(g);class l{id;device;currentApp;created_at;constructor({id:e,device:i,current_app:n,created_at:t}){this.id=e,this.device=i,this.currentApp=n,this.created_at=t}}0&&(module.exports={Session});
1
+ "use strict";var a=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var p=(i,e)=>{for(var t in e)a(i,t,{get:e[t],enumerable:!0})},y=(i,e,t,d)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of s(e))!m.call(i,o)&&o!==t&&a(i,o,{get:()=>e[o],enumerable:!(d=c(e,o))||d.enumerable});return i};var v=i=>y(a({},"__esModule",{value:!0}),i);var l={};p(l,{sessionCodec:()=>f});module.exports=v(l);var r=require("purify-ts"),n=require("./Device");const f=r.Codec.interface({id:r.string,created_at:r.number,expires_at:r.number,devices:(0,r.array)(n.deviceCodec)});0&&(module.exports={sessionCodec});
2
2
  //# sourceMappingURL=Session.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/model/Session.ts"],
4
- "sourcesContent": ["import { type Device } from \"./Device\";\n\nexport type SessionArgs = {\n readonly id: string;\n readonly device: Device;\n readonly current_app: string;\n readonly created_at: number;\n};\n\nexport class Session {\n readonly id: string;\n readonly device: Device;\n readonly currentApp: string;\n readonly created_at: number;\n\n constructor({ id, device, current_app, created_at }: SessionArgs) {\n this.id = id;\n this.device = device;\n this.currentApp = current_app;\n this.created_at = created_at;\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GASO,MAAME,CAAQ,CACV,GACA,OACA,WACA,WAET,YAAY,CAAE,GAAAE,EAAI,OAAAC,EAAQ,YAAAC,EAAa,WAAAC,CAAW,EAAgB,CAChE,KAAK,GAAKH,EACV,KAAK,OAASC,EACd,KAAK,WAAaC,EAClB,KAAK,WAAaC,CACpB,CACF",
6
- "names": ["Session_exports", "__export", "Session", "__toCommonJS", "id", "device", "current_app", "created_at"]
4
+ "sourcesContent": ["import { array, Codec, number, string } from \"purify-ts\";\n\nimport { type Device, deviceCodec } from \"./Device\";\n\n/**\n * A mock server session, resolved from a bearer token.\n *\n * All devices and mocks are scoped to the session that owns the token.\n */\nexport interface Session {\n readonly id: string;\n readonly created_at: number;\n readonly expires_at: number;\n readonly devices: Device[];\n}\n\nexport const sessionCodec = Codec.interface({\n id: string,\n created_at: number,\n expires_at: number,\n devices: array(deviceCodec),\n});\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA6C,qBAE7CC,EAAyC,oBAclC,MAAMH,EAAe,QAAM,UAAU,CAC1C,GAAI,SACJ,WAAY,SACZ,WAAY,SACZ,WAAS,SAAM,aAAW,CAC5B,CAAC",
6
+ "names": ["Session_exports", "__export", "sessionCodec", "__toCommonJS", "import_purify_ts", "import_Device"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var t=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var C=(o,e)=>{for(var r in e)t(o,r,{get:e[r],enumerable:!0})},a=(o,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of f(e))!p.call(o,i)&&i!==r&&t(o,i,{get:()=>e[i],enumerable:!(n=d(e,i))||n.enumerable});return o};var v=o=>a(t({},"__esModule",{value:!0}),o);var x={};C(x,{sessionExportCodec:()=>m});module.exports=v(x);var c=require("purify-ts"),s=require("./Device");const m=c.Codec.interface({devices:(0,c.array)(s.deviceConfigCodec)});0&&(module.exports={sessionExportCodec});
2
+ //# sourceMappingURL=SessionExport.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/model/SessionExport.ts"],
4
+ "sourcesContent": ["import { array, Codec } from \"purify-ts\";\n\nimport { type DeviceConfig, deviceConfigCodec } from \"./Device\";\n\n/**\n * A portable snapshot of a session's devices (and their mocks).\n *\n * Produced by `GET /export` and consumed by `POST /import` to save and restore\n * complex scenarios. Only configuration is captured (no ids, connection state\n * or response cursors), so importing recreates a fresh, deterministic session\n * state. Mocks are nested under each device (`DeviceConfig.mocks`).\n */\nexport interface SessionExport {\n readonly devices: DeviceConfig[];\n}\n\nexport const sessionExportCodec = Codec.interface({\n devices: array(deviceConfigCodec),\n});\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA6B,qBAE7BC,EAAqD,oBAc9C,MAAMH,EAAqB,QAAM,UAAU,CAChD,WAAS,SAAM,mBAAiB,CAClC,CAAC",
6
+ "names": ["SessionExport_exports", "__export", "sessionExportCodec", "__toCommonJS", "import_purify_ts", "import_Device"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var t=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var u=(r,e)=>{for(var s in e)t(r,s,{get:e[s],enumerable:!0})},a=(r,e,s,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of d(e))!i.call(r,o)&&o!==s&&t(r,o,{get:()=>e[o],enumerable:!(c=l(e,o))||c.enumerable});return r};var p=r=>a(t({},"__esModule",{value:!0}),r);var m={};u(m,{speculosInstanceCodec:()=>g});module.exports=p(m);var n=require("purify-ts");const g=n.Codec.interface({run_id:n.string,speculos_url:n.string,model:n.string});0&&(module.exports={speculosInstanceCodec});
2
+ //# sourceMappingURL=Speculos.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/model/Speculos.ts"],
4
+ "sourcesContent": ["import { Codec, string } from \"purify-ts\";\n\n/**\n * The live Speculos emulator instance backing a device, returned by\n * `GET /devices/:id/speculos`. Control calls are proxied through\n * `/devices/:id/speculos/*`.\n */\nexport interface SpeculosInstance {\n /** Speculinho run id owning the emulator pod. */\n readonly run_id: string;\n /** Per-pod emulator URL (reachable from the mock server). */\n readonly speculos_url: string;\n /** Device model (e.g. \"nanoX\", \"stax\", \"flex\"). */\n readonly model: string;\n}\n\nexport const speculosInstanceCodec = Codec.interface({\n run_id: string,\n speculos_url: string,\n model: string,\n});\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,qBAgBvB,MAAMF,EAAwB,QAAM,UAAU,CACnD,OAAQ,SACR,aAAc,SACd,MAAO,QACT,CAAC",
6
+ "names": ["Speculos_exports", "__export", "speculosInstanceCodec", "__toCommonJS", "import_purify_ts"]
7
+ }
@@ -1,6 +1,9 @@
1
1
  {
2
- "dependencies": {},
2
+ "dependencies": {
3
+ "purify-ts": "catalog:"
4
+ },
3
5
  "devDependencies": {
6
+ "@ledgerhq/device-management-kit": "workspace:*",
4
7
  "@ledgerhq/eslint-config-dsdk": "workspace:*",
5
8
  "@ledgerhq/ldmk-tool": "workspace:*",
6
9
  "@ledgerhq/prettier-config-dsdk": "workspace:*",
@@ -25,6 +28,9 @@
25
28
  "license": "Apache-2.0",
26
29
  "main": "lib/index.js",
27
30
  "name": "@ledgerhq/device-mockserver-client",
31
+ "peerDependencies": {
32
+ "@ledgerhq/device-management-kit": "workspace:*"
33
+ },
28
34
  "private": false,
29
35
  "repository": {
30
36
  "type": "git",
@@ -46,5 +52,5 @@
46
52
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
47
53
  },
48
54
  "types": "lib/index.d.ts",
49
- "version": "0.0.0-develop-20260623003456"
55
+ "version": "0.0.0-develop-20260624002956"
50
56
  }
@@ -0,0 +1,2 @@
1
+ const n=()=>new class{responses;calls;constructor(){this.responses={get:{},post:{},patch:{},delete:{}},this.calls=[]}get(e,t){return this.calls.push({method:"get",endpoint:e}),Promise.resolve(this.responses.get[e])}post(e,t,s){return this.calls.push({method:"post",endpoint:e,body:t}),Promise.resolve(this.responses.post[e])}patch(e,t,s){return this.calls.push({method:"patch",endpoint:e,body:t}),Promise.resolve(this.responses.patch[e])}delete(e,t){return this.calls.push({method:"delete",endpoint:e}),Promise.resolve(this.responses.delete[e])}mockResponse({method:e,endpoint:t,response:s}){return this.responses={...this.responses,[e]:{...this.responses[e],[t]:s}},this}};export{n as httpClientStubBuilder};
2
+ //# sourceMappingURL=DmkNetworkClient.stub.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/DmkNetworkClient.stub.ts"],
4
+ "sourcesContent": ["import {\n type DmkNetworkClient,\n type DmkRequestConfig,\n} from \"@ledgerhq/device-management-kit\";\n\ntype Method = \"get\" | \"post\" | \"patch\" | \"delete\";\n\nexport type DmkNetworkClientStub = DmkNetworkClient & {\n responses: Record<Method, Record<string, unknown>>;\n calls: { method: Method; endpoint: string; body?: object }[];\n mockResponse(args: {\n method: Method;\n endpoint: string;\n response: object;\n }): DmkNetworkClientStub;\n};\n\nexport const httpClientStubBuilder = (): DmkNetworkClientStub => {\n const stub = new (class {\n responses: Record<Method, Record<string, unknown>>;\n calls: { method: Method; endpoint: string; body?: object }[];\n\n constructor() {\n this.responses = { get: {}, post: {}, patch: {}, delete: {} };\n this.calls = [];\n }\n\n get(endpoint: string, _config?: DmkRequestConfig): Promise<unknown> {\n this.calls.push({ method: \"get\", endpoint });\n return Promise.resolve(this.responses.get[endpoint]);\n }\n\n post(\n endpoint: string,\n body?: unknown,\n _config?: DmkRequestConfig,\n ): Promise<unknown> {\n this.calls.push({ method: \"post\", endpoint, body: body as object });\n return Promise.resolve(this.responses.post[endpoint]);\n }\n\n patch(\n endpoint: string,\n body?: unknown,\n _config?: DmkRequestConfig,\n ): Promise<unknown> {\n this.calls.push({ method: \"patch\", endpoint, body: body as object });\n return Promise.resolve(this.responses.patch[endpoint]);\n }\n\n delete(endpoint: string, _config?: DmkRequestConfig): Promise<unknown> {\n this.calls.push({ method: \"delete\", endpoint });\n return Promise.resolve(this.responses.delete[endpoint]);\n }\n\n mockResponse({\n method,\n endpoint,\n response,\n }: {\n method: Method;\n endpoint: string;\n response: object;\n }) {\n this.responses = {\n ...this.responses,\n [method]: {\n ...this.responses[method],\n [endpoint]: response,\n },\n };\n return this;\n }\n })();\n\n return stub as unknown as DmkNetworkClientStub;\n};\n"],
5
+ "mappings": "AAiBO,MAAMA,EAAwB,IACtB,IAAK,KAAM,CACtB,UACA,MAEA,aAAc,CACZ,KAAK,UAAY,CAAE,IAAK,CAAC,EAAG,KAAM,CAAC,EAAG,MAAO,CAAC,EAAG,OAAQ,CAAC,CAAE,EAC5D,KAAK,MAAQ,CAAC,CAChB,CAEA,IAAIC,EAAkBC,EAA8C,CAClE,YAAK,MAAM,KAAK,CAAE,OAAQ,MAAO,SAAAD,CAAS,CAAC,EACpC,QAAQ,QAAQ,KAAK,UAAU,IAAIA,CAAQ,CAAC,CACrD,CAEA,KACEA,EACAE,EACAD,EACkB,CAClB,YAAK,MAAM,KAAK,CAAE,OAAQ,OAAQ,SAAAD,EAAU,KAAME,CAAe,CAAC,EAC3D,QAAQ,QAAQ,KAAK,UAAU,KAAKF,CAAQ,CAAC,CACtD,CAEA,MACEA,EACAE,EACAD,EACkB,CAClB,YAAK,MAAM,KAAK,CAAE,OAAQ,QAAS,SAAAD,EAAU,KAAME,CAAe,CAAC,EAC5D,QAAQ,QAAQ,KAAK,UAAU,MAAMF,CAAQ,CAAC,CACvD,CAEA,OAAOA,EAAkBC,EAA8C,CACrE,YAAK,MAAM,KAAK,CAAE,OAAQ,SAAU,SAAAD,CAAS,CAAC,EACvC,QAAQ,QAAQ,KAAK,UAAU,OAAOA,CAAQ,CAAC,CACxD,CAEA,aAAa,CACX,OAAAG,EACA,SAAAH,EACA,SAAAI,CACF,EAIG,CACD,YAAK,UAAY,CACf,GAAG,KAAK,UACR,CAACD,CAAM,EAAG,CACR,GAAG,KAAK,UAAUA,CAAM,EACxB,CAACH,CAAQ,EAAGI,CACd,CACF,EACO,IACT,CACF",
6
+ "names": ["httpClientStubBuilder", "endpoint", "_config", "body", "method", "response"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{ConnectivityService as n}from"./service/ConnectivityService";import{DiscoveryService as t}from"./service/DiscoveryService";import{MockService as c}from"./service/MockService";import{SendService as o}from"./service/SendService";import{DefaultHttpClient as s}from"./DefaultHttpClient";class p{connectivityService;sendService;discoveryService;mockService;constructor(e){const r=new s({baseUrl:e+"/"});this.connectivityService=new n({client:r}),this.sendService=new o(r),this.discoveryService=new t({client:r}),this.mockService=new c(r)}async connect(e){return this.connectivityService.connect(e)}async disconnect(e){return this.connectivityService.disconnect(e)}async disconnectAll(){return this.connectivityService.disconnectAll()}async getConnected(){return this.connectivityService.getConnected()}async send(e,r){const i=this.toHexString(r);return this.sendService.send(e,i)}async scan(e){return this.discoveryService.scanDevices(e)}async addMock(e,r,i){return this.mockService.add(e,r,i)}async getMocks(e){return this.mockService.get(e)}async deleteMocks(e){return this.mockService.delete(e)}toHexString(e){return Array.from(e,r=>r.toString(16).padStart(2,"0")).join("")}fromHexString(e){return e?new Uint8Array(e.match(/.{1,2}/g).map(r=>parseInt(r,16))):Uint8Array.from([])}}export{p as MockClient};
1
+ import{bufferToHexaString as c,DmkNetworkClient as d}from"@ledgerhq/device-management-kit";import{array as o}from"purify-ts";import{authResponseCodec as h,connectionStateCodec as u}from"./model/Auth";import{commandResponseCodec as m}from"./model/CommandResponse";import{deviceCodec as i}from"./model/Device";import{mockCodec as n}from"./model/Mock";import{sessionCodec as l}from"./model/Session";import{sessionExportCodec as r}from"./model/SessionExport";import{speculosInstanceCodec as p}from"./model/Speculos";class S{client;token;authPromise;constructor(e,t={}){this.client=t.httpClient??new d({baseUrl:this.normalizeUrl(e)}),this.token=t.token}async authenticate(){const e=await this.client.post("auth",{}),t=this.decode(h,e).token;return this.token=t,t}getToken(){return this.token}async listDevices(){const e=await this.client.get("devices",{headers:await this.authHeaders()});return this.decode(o(i),e)}async addDevice(e={}){const t=await this.client.post("devices",e,{headers:await this.authHeaders()});return this.decode(i,t)}async getDevice(e){const t=await this.client.get(`devices/${e}`,{headers:await this.authHeaders()});return this.decode(i,t)}async editDevice(e,t){const s=await this.client.patch(`devices/${e}`,t,{headers:await this.authHeaders()});return this.decode(i,s)}async deleteDevice(e){return await this.client.delete(`devices/${e}`,{headers:await this.authHeaders()}),!0}async connect(e){const t=await this.client.post(`devices/${e}/connect`,{},{headers:await this.authHeaders()});return this.decode(u,t)}async disconnect(e){return await this.client.post(`devices/${e}/disconnect`,{},{headers:await this.authHeaders()}),!0}async disconnectAll(){const e=await this.listDevices();return await Promise.all(e.filter(t=>t.connected).map(t=>this.disconnect(t.id))),!0}async sendApdu(e,t){const s=typeof t=="string"?t:c(t,!1),a=await this.client.post(`devices/${e}/apdu`,{apdu:s},{headers:await this.authHeaders()});return this.decode(m,a)}async listMocks(e){const t=await this.client.get(`devices/${e}/mocks`,{headers:await this.authHeaders()});return this.decode(o(n),t)}async addMock(e,t){const s=await this.client.post(`devices/${e}/mocks`,t,{headers:await this.authHeaders()});return this.decode(n,s)}async editMock(e,t,s){const a=await this.client.patch(`devices/${e}/mocks/${t}`,s,{headers:await this.authHeaders()});return this.decode(n,a)}async deleteMock(e,t){return await this.client.delete(`devices/${e}/mocks/${t}`,{headers:await this.authHeaders()}),!0}async clearMocks(e){return await this.client.delete(`devices/${e}/mocks`,{headers:await this.authHeaders()}),!0}async getSpeculos(e){const t=await this.client.get(`devices/${e}/speculos`,{headers:await this.authHeaders()});return this.decode(p,t)}async getSession(){const e=await this.client.get("sessions/current",{headers:await this.authHeaders()});return this.decode(l,e)}async disposeSession(){return await this.client.delete("sessions/current",{headers:await this.authHeaders()}),this.token=void 0,this.authPromise=void 0,!0}async exportSession(){const e=await this.client.get("export",{headers:await this.authHeaders()});return this.decode(r,e)}async importSession(e){const t=await this.client.post("import",e,{headers:await this.authHeaders()});return this.decode(r,t)}decode(e,t){return e.decode(t).caseOf({Left:s=>{throw new Error(`MockClient: invalid server response (${s})`)},Right:s=>s})}async authHeaders(){return{Authorization:`Bearer ${await this.ensureToken()}`}}ensureToken(){return this.token?Promise.resolve(this.token):(this.authPromise||(this.authPromise=this.authenticate()),this.authPromise)}normalizeUrl(e){return e.endsWith("/")?e:`${e}/`}}export{S as MockClient};
2
2
  //# sourceMappingURL=MockClient.js.map