@ledgerhq/device-management-kit-devtools-ui 0.0.0-develop-20260629003450 → 0.0.0-develop-20260701003433
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/build/src/Dashboard.d.ts.map +1 -1
- package/lib/build/src/Dashboard.js +5 -1
- package/lib/build/src/Dashboard.js.map +1 -1
- package/lib/build/src/components/DashboardNavigationBar.d.ts +1 -0
- package/lib/build/src/components/DashboardNavigationBar.d.ts.map +1 -1
- package/lib/build/src/components/DashboardNavigationBar.js +2 -1
- package/lib/build/src/components/DashboardNavigationBar.js.map +1 -1
- package/lib/build/src/hooks/connectorMessageHandlers.d.ts +2 -2
- package/lib/build/src/hooks/connectorMessageHandlers.d.ts.map +1 -1
- package/lib/build/src/hooks/connectorMessageHandlers.js +30 -2
- package/lib/build/src/hooks/connectorMessageHandlers.js.map +1 -1
- package/lib/build/src/hooks/useConnectorMessages.d.ts +15 -0
- package/lib/build/src/hooks/useConnectorMessages.d.ts.map +1 -1
- package/lib/build/src/hooks/useConnectorMessages.js +23 -5
- package/lib/build/src/hooks/useConnectorMessages.js.map +1 -1
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.d.ts +1 -4
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.d.ts.map +1 -1
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.js +2 -6
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.js.map +1 -1
- package/lib/build/src/screens/mock-capture/deviceConfigFromSession.d.ts +16 -0
- package/lib/build/src/screens/mock-capture/deviceConfigFromSession.d.ts.map +1 -0
- package/lib/build/src/screens/mock-capture/deviceConfigFromSession.js +52 -0
- package/lib/build/src/screens/mock-capture/deviceConfigFromSession.js.map +1 -0
- package/lib/build/src/screens/mock-capture/generateSessionExport.d.ts +36 -0
- package/lib/build/src/screens/mock-capture/generateSessionExport.d.ts.map +1 -0
- package/lib/build/src/screens/mock-capture/generateSessionExport.js +79 -0
- package/lib/build/src/screens/mock-capture/generateSessionExport.js.map +1 -0
- package/lib/build/src/screens/mock-capture/generateSessionExport.test.d.ts +2 -0
- package/lib/build/src/screens/mock-capture/generateSessionExport.test.d.ts.map +1 -0
- package/lib/build/src/screens/mock-capture/generateSessionExport.test.js +125 -0
- package/lib/build/src/screens/mock-capture/generateSessionExport.test.js.map +1 -0
- package/lib/build/src/screens/mock-capture/index.d.ts +23 -0
- package/lib/build/src/screens/mock-capture/index.d.ts.map +1 -0
- package/lib/build/src/screens/mock-capture/index.js +281 -0
- package/lib/build/src/screens/mock-capture/index.js.map +1 -0
- package/lib/build/tsconfig.build.tsbuildinfo +1 -1
- package/lib/cjs/package.json +2 -1
- package/lib/cjs/src/Dashboard.js +3 -3
- package/lib/cjs/src/Dashboard.js.map +3 -3
- package/lib/cjs/src/components/DashboardNavigationBar.js +8 -8
- package/lib/cjs/src/components/DashboardNavigationBar.js.map +2 -2
- package/lib/cjs/src/hooks/connectorMessageHandlers.js +1 -1
- package/lib/cjs/src/hooks/connectorMessageHandlers.js.map +3 -3
- package/lib/cjs/src/hooks/useConnectorMessages.js +1 -1
- package/lib/cjs/src/hooks/useConnectorMessages.js.map +3 -3
- package/lib/cjs/src/screens/logger/mapConnectorMessageToLogData.js +1 -1
- package/lib/cjs/src/screens/logger/mapConnectorMessageToLogData.js.map +3 -3
- package/lib/cjs/src/screens/mock-capture/deviceConfigFromSession.js +2 -0
- package/lib/cjs/src/screens/mock-capture/deviceConfigFromSession.js.map +7 -0
- package/lib/cjs/src/screens/mock-capture/generateSessionExport.js +2 -0
- package/lib/cjs/src/screens/mock-capture/generateSessionExport.js.map +7 -0
- package/lib/cjs/src/screens/mock-capture/generateSessionExport.test.js +2 -0
- package/lib/cjs/src/screens/mock-capture/generateSessionExport.test.js.map +7 -0
- package/lib/cjs/src/screens/mock-capture/index.js +109 -0
- package/lib/cjs/src/screens/mock-capture/index.js.map +7 -0
- package/lib/esm/package.json +2 -1
- package/lib/esm/src/Dashboard.js +3 -3
- package/lib/esm/src/Dashboard.js.map +3 -3
- package/lib/esm/src/components/DashboardNavigationBar.js +8 -8
- package/lib/esm/src/components/DashboardNavigationBar.js.map +2 -2
- package/lib/esm/src/hooks/connectorMessageHandlers.js +1 -1
- package/lib/esm/src/hooks/connectorMessageHandlers.js.map +3 -3
- package/lib/esm/src/hooks/useConnectorMessages.js +1 -1
- package/lib/esm/src/hooks/useConnectorMessages.js.map +3 -3
- package/lib/esm/src/screens/logger/mapConnectorMessageToLogData.js +1 -1
- package/lib/esm/src/screens/logger/mapConnectorMessageToLogData.js.map +3 -3
- package/lib/esm/src/screens/mock-capture/deviceConfigFromSession.js +2 -0
- package/lib/esm/src/screens/mock-capture/deviceConfigFromSession.js.map +7 -0
- package/lib/esm/src/screens/mock-capture/generateSessionExport.js +2 -0
- package/lib/esm/src/screens/mock-capture/generateSessionExport.js.map +7 -0
- package/lib/esm/src/screens/mock-capture/generateSessionExport.test.js +2 -0
- package/lib/esm/src/screens/mock-capture/generateSessionExport.test.js.map +7 -0
- package/lib/esm/src/screens/mock-capture/index.js +109 -0
- package/lib/esm/src/screens/mock-capture/index.js.map +7 -0
- package/package.json +10 -9
package/lib/cjs/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
+
"@ledgerhq/device-mockserver-client": "workspace:*",
|
|
3
4
|
"@ledgerhq/react-ui": "catalog:",
|
|
4
5
|
"@tanstack/react-table": "8.20.5",
|
|
5
6
|
"@tanstack/react-virtual": "3.10.8",
|
|
@@ -69,5 +70,5 @@
|
|
|
69
70
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
70
71
|
},
|
|
71
72
|
"types": "lib/index.d.ts",
|
|
72
|
-
"version": "0.0.0-develop-
|
|
73
|
+
"version": "0.0.0-develop-20260701003433"
|
|
73
74
|
}
|
package/lib/cjs/src/Dashboard.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var _=Object.create;var a=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var ee=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var re=(e,r)=>{for(var s in r)a(e,s,{get:r[s],enumerable:!0})},b=(e,r,s,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of j(r))!oe.call(e,t)&&t!==s&&a(e,t,{get:()=>r[t],enumerable:!(i=$(r,t))||i.enumerable});return e};var se=(e,r,s)=>(s=e!=null?_(ee(e)):{},b(r||!e||!e.__esModule?a(s,"default",{value:e,enumerable:!0}):s,e)),ne=e=>b(a({},"__esModule",{value:!0}),e);var de={};re(de,{DashboardWithErrorBoundary:()=>ae});module.exports=ne(de);var l=require("react"),S=require("@ledgerhq/react-ui/styles/index"),v=se(require("styled-components")),R=require("./components/DashboardFooter"),n=require("./components/DashboardNavigationBar"),x=require("./components/DebugDrawer"),u=require("./components/SplitView"),y=require("./hooks/useConnectorMessages"),L=require("./screens/inspector"),E=require("./screens/logger"),M=require("./screens/mock-capture"),P=require("./ErrorBoundary"),o=require("react/jsx-runtime");const te=v.default.div`
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: column;
|
|
4
4
|
height: 100vh;
|
|
5
5
|
overflow: hidden;
|
|
6
|
-
`,
|
|
6
|
+
`,ie=v.default.div`
|
|
7
7
|
display: flex;
|
|
8
8
|
flex-direction: column;
|
|
9
9
|
flex: 1;
|
|
10
10
|
overflow: hidden;
|
|
11
|
-
`,
|
|
11
|
+
`,ce=({connector:e})=>{const{receivedMessages:r,sentMessages:s,logs:i,connectedDevices:t,sessionStates:m,discoveredDevices:A,isListening:w,isActivelyDiscovering:B,isLoggerConnected:d,isInspectorConnected:f,providerValue:I,apduResponses:O,apduExchanges:V,isRecordingExchanges:k,sendMessage:D,clearLogs:z,startRecordingExchanges:F,stopRecordingExchanges:H,clearRecordedExchanges:N,startListening:T,stopListening:W,startDiscovering:q,stopDiscovering:G,connectDevice:J,getProvider:K,setProvider:Q,sendApdu:U}=(0,y.useConnectorMessages)(e),[h,X]=(0,l.useState)(n.DashboardScreen.logs),[g,C]=(0,l.useState)(!1),c=(0,o.jsx)(E.Logger,{logs:i,clearLogs:z,isConnected:d}),p=(0,o.jsx)(L.Inspector,{devices:t,sessionStates:m,discoveredDevices:A,isListening:w,isActivelyDiscovering:B,sendMessage:D,isConnected:f,startListening:T,stopListening:W,startDiscovering:q,stopDiscovering:G,connectDevice:J,providerValue:I,getProvider:K,setProvider:Q,sendApdu:U,apduResponses:O}),Y=(0,o.jsx)(M.MockCapture,{apduExchanges:V,isRecording:k,isConnected:d,startRecording:F,stopRecording:H,clearRecorded:N,sessionStates:m,connectedDevices:t}),Z=(()=>{switch(h){case n.DashboardScreen.logs:return c;case n.DashboardScreen.inspector:return p;case n.DashboardScreen.mockCapture:return Y;case n.DashboardScreen.splitHorizontal:return(0,o.jsx)(u.SplitView,{direction:"horizontal",first:c,second:p});case n.DashboardScreen.splitVertical:return(0,o.jsx)(u.SplitView,{direction:"vertical",first:c,second:p});default:return c}})();return(0,o.jsxs)(te,{children:[(0,o.jsx)(n.DashboardNavigationBar,{currentScreen:h,onScreenChange:X,isLoggerConnected:d,isInspectorConnected:f}),(0,o.jsx)(ie,{children:Z}),(0,o.jsx)(R.DashboardFooter,{isDebugOpen:g,onToggleDebug:()=>C(!g)}),(0,o.jsx)(x.DebugDrawer,{isOpen:g,onClose:()=>C(!1),sentMessages:s,receivedMessages:r,sendMessage:D})]})};function ae({connector:e}){return(0,o.jsx)(P.ErrorBoundary,{children:(0,o.jsx)(S.StyleProvider,{selectedPalette:"light",children:(0,o.jsx)(ce,{connector:e})})})}0&&(module.exports={DashboardWithErrorBoundary});
|
|
12
12
|
//# sourceMappingURL=Dashboard.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/Dashboard.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useState } from \"react\";\nimport { type Connector } from \"@ledgerhq/device-management-kit-devtools-core\";\nimport { StyleProvider } from \"@ledgerhq/react-ui/styles/index\";\nimport styled from \"styled-components\";\n\nimport { DashboardFooter } from \"./components/DashboardFooter\";\nimport {\n DashboardNavigationBar,\n DashboardScreen,\n} from \"./components/DashboardNavigationBar\";\nimport { DebugDrawer } from \"./components/DebugDrawer\";\nimport { SplitView } from \"./components/SplitView\";\nimport { useConnectorMessages } from \"./hooks/useConnectorMessages\";\nimport { Inspector } from \"./screens/inspector\";\nimport { Logger } from \"./screens/logger\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\n\nconst DashboardContainer = styled.div`\n display: flex;\n flex-direction: column;\n height: 100vh;\n overflow: hidden;\n`;\n\nconst ContentArea = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n`;\n\nconst Dashboard: React.FC<{ connector: Connector }> = ({ connector }) => {\n const {\n receivedMessages,\n sentMessages,\n logs,\n connectedDevices,\n sessionStates,\n discoveredDevices,\n isListening,\n isActivelyDiscovering,\n isLoggerConnected,\n isInspectorConnected,\n providerValue,\n apduResponses,\n sendMessage,\n clearLogs,\n startListening,\n stopListening,\n startDiscovering,\n stopDiscovering,\n connectDevice,\n getProvider,\n setProvider,\n sendApdu,\n } = useConnectorMessages(connector);\n\n const [currentScreen, setCurrentScreen] = useState<DashboardScreen>(\n DashboardScreen.logs,\n );\n const [isDebugOpen, setIsDebugOpen] = useState(false);\n\n const logger = (\n <Logger logs={logs} clearLogs={clearLogs} isConnected={isLoggerConnected} />\n );\n\n const inspector = (\n <Inspector\n devices={connectedDevices}\n sessionStates={sessionStates}\n discoveredDevices={discoveredDevices}\n isListening={isListening}\n isActivelyDiscovering={isActivelyDiscovering}\n sendMessage={sendMessage}\n isConnected={isInspectorConnected}\n startListening={startListening}\n stopListening={stopListening}\n startDiscovering={startDiscovering}\n stopDiscovering={stopDiscovering}\n connectDevice={connectDevice}\n providerValue={providerValue}\n getProvider={getProvider}\n setProvider={setProvider}\n sendApdu={sendApdu}\n apduResponses={apduResponses}\n />\n );\n\n const content = (() => {\n switch (currentScreen) {\n case DashboardScreen.logs:\n return logger;\n case DashboardScreen.inspector:\n return inspector;\n case DashboardScreen.splitHorizontal:\n return (\n <SplitView direction=\"horizontal\" first={logger} second={inspector} />\n );\n case DashboardScreen.splitVertical:\n return (\n <SplitView direction=\"vertical\" first={logger} second={inspector} />\n );\n default:\n return logger;\n }\n })();\n\n return (\n <DashboardContainer>\n <DashboardNavigationBar\n currentScreen={currentScreen}\n onScreenChange={setCurrentScreen}\n isLoggerConnected={isLoggerConnected}\n isInspectorConnected={isInspectorConnected}\n />\n <ContentArea>{content}</ContentArea>\n <DashboardFooter\n isDebugOpen={isDebugOpen}\n onToggleDebug={() => setIsDebugOpen(!isDebugOpen)}\n />\n <DebugDrawer\n isOpen={isDebugOpen}\n onClose={() => setIsDebugOpen(false)}\n sentMessages={sentMessages}\n receivedMessages={receivedMessages}\n sendMessage={sendMessage}\n />\n </DashboardContainer>\n );\n};\n\nexport function DashboardWithErrorBoundary({\n connector,\n}: {\n connector: Connector;\n}) {\n return (\n <ErrorBoundary>\n <StyleProvider selectedPalette=\"light\">\n <Dashboard connector={connector} />\n </StyleProvider>\n </ErrorBoundary>\n );\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["Dashboard_exports", "__export", "DashboardWithErrorBoundary", "__toCommonJS", "import_react", "import_styles", "import_styled_components", "import_DashboardFooter", "import_DashboardNavigationBar", "import_DebugDrawer", "import_SplitView", "import_useConnectorMessages", "import_inspector", "import_logger", "import_ErrorBoundary", "import_jsx_runtime", "DashboardContainer", "styled", "ContentArea", "Dashboard", "connector", "receivedMessages", "sentMessages", "logs", "connectedDevices", "sessionStates", "discoveredDevices", "isListening", "isActivelyDiscovering", "isLoggerConnected", "isInspectorConnected", "providerValue", "apduResponses", "sendMessage", "clearLogs", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "connectDevice", "getProvider", "setProvider", "sendApdu", "currentScreen", "setCurrentScreen", "isDebugOpen", "setIsDebugOpen", "logger", "inspector", "content"]
|
|
4
|
+
"sourcesContent": ["import React, { useState } from \"react\";\nimport { type Connector } from \"@ledgerhq/device-management-kit-devtools-core\";\nimport { StyleProvider } from \"@ledgerhq/react-ui/styles/index\";\nimport styled from \"styled-components\";\n\nimport { DashboardFooter } from \"./components/DashboardFooter\";\nimport {\n DashboardNavigationBar,\n DashboardScreen,\n} from \"./components/DashboardNavigationBar\";\nimport { DebugDrawer } from \"./components/DebugDrawer\";\nimport { SplitView } from \"./components/SplitView\";\nimport { useConnectorMessages } from \"./hooks/useConnectorMessages\";\nimport { Inspector } from \"./screens/inspector\";\nimport { Logger } from \"./screens/logger\";\nimport { MockCapture } from \"./screens/mock-capture\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\n\nconst DashboardContainer = styled.div`\n display: flex;\n flex-direction: column;\n height: 100vh;\n overflow: hidden;\n`;\n\nconst ContentArea = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n`;\n\nconst Dashboard: React.FC<{ connector: Connector }> = ({ connector }) => {\n const {\n receivedMessages,\n sentMessages,\n logs,\n connectedDevices,\n sessionStates,\n discoveredDevices,\n isListening,\n isActivelyDiscovering,\n isLoggerConnected,\n isInspectorConnected,\n providerValue,\n apduResponses,\n apduExchanges,\n isRecordingExchanges,\n sendMessage,\n clearLogs,\n startRecordingExchanges,\n stopRecordingExchanges,\n clearRecordedExchanges,\n startListening,\n stopListening,\n startDiscovering,\n stopDiscovering,\n connectDevice,\n getProvider,\n setProvider,\n sendApdu,\n } = useConnectorMessages(connector);\n\n const [currentScreen, setCurrentScreen] = useState<DashboardScreen>(\n DashboardScreen.logs,\n );\n const [isDebugOpen, setIsDebugOpen] = useState(false);\n\n const logger = (\n <Logger logs={logs} clearLogs={clearLogs} isConnected={isLoggerConnected} />\n );\n\n const inspector = (\n <Inspector\n devices={connectedDevices}\n sessionStates={sessionStates}\n discoveredDevices={discoveredDevices}\n isListening={isListening}\n isActivelyDiscovering={isActivelyDiscovering}\n sendMessage={sendMessage}\n isConnected={isInspectorConnected}\n startListening={startListening}\n stopListening={stopListening}\n startDiscovering={startDiscovering}\n stopDiscovering={stopDiscovering}\n connectDevice={connectDevice}\n providerValue={providerValue}\n getProvider={getProvider}\n setProvider={setProvider}\n sendApdu={sendApdu}\n apduResponses={apduResponses}\n />\n );\n\n const mockCapture = (\n <MockCapture\n apduExchanges={apduExchanges}\n isRecording={isRecordingExchanges}\n isConnected={isLoggerConnected}\n startRecording={startRecordingExchanges}\n stopRecording={stopRecordingExchanges}\n clearRecorded={clearRecordedExchanges}\n sessionStates={sessionStates}\n connectedDevices={connectedDevices}\n />\n );\n\n const content = (() => {\n switch (currentScreen) {\n case DashboardScreen.logs:\n return logger;\n case DashboardScreen.inspector:\n return inspector;\n case DashboardScreen.mockCapture:\n return mockCapture;\n case DashboardScreen.splitHorizontal:\n return (\n <SplitView direction=\"horizontal\" first={logger} second={inspector} />\n );\n case DashboardScreen.splitVertical:\n return (\n <SplitView direction=\"vertical\" first={logger} second={inspector} />\n );\n default:\n return logger;\n }\n })();\n\n return (\n <DashboardContainer>\n <DashboardNavigationBar\n currentScreen={currentScreen}\n onScreenChange={setCurrentScreen}\n isLoggerConnected={isLoggerConnected}\n isInspectorConnected={isInspectorConnected}\n />\n <ContentArea>{content}</ContentArea>\n <DashboardFooter\n isDebugOpen={isDebugOpen}\n onToggleDebug={() => setIsDebugOpen(!isDebugOpen)}\n />\n <DebugDrawer\n isOpen={isDebugOpen}\n onClose={() => setIsDebugOpen(false)}\n sentMessages={sentMessages}\n receivedMessages={receivedMessages}\n sendMessage={sendMessage}\n />\n </DashboardContainer>\n );\n};\n\nexport function DashboardWithErrorBoundary({\n connector,\n}: {\n connector: Connector;\n}) {\n return (\n <ErrorBoundary>\n <StyleProvider selectedPalette=\"light\">\n <Dashboard connector={connector} />\n </StyleProvider>\n </ErrorBoundary>\n );\n}\n"],
|
|
5
|
+
"mappings": "ikBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,gCAAAE,KAAA,eAAAC,GAAAH,IAAA,IAAAI,EAAgC,iBAEhCC,EAA8B,2CAC9BC,EAAmB,iCAEnBC,EAAgC,wCAChCC,EAGO,+CACPC,EAA4B,oCAC5BC,EAA0B,kCAC1BC,EAAqC,wCACrCC,EAA0B,+BAC1BC,EAAuB,4BACvBC,EAA4B,kCAC5BC,EAA8B,2BAqD1BC,EAAA,6BAnDJ,MAAMC,GAAqB,EAAAC,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5BC,GAAc,EAAAD,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOrBE,GAAgD,CAAC,CAAE,UAAAC,CAAU,IAAM,CACvE,KAAM,CACJ,iBAAAC,EACA,aAAAC,EACA,KAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,YAAAC,EACA,sBAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,cAAAC,EACA,qBAAAC,EACA,YAAAC,EACA,UAAAC,EACA,wBAAAC,EACA,uBAAAC,EACA,uBAAAC,EACA,eAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,YAAAC,EACA,YAAAC,EACA,SAAAC,CACF,KAAI,wBAAqB3B,CAAS,EAE5B,CAAC4B,EAAeC,CAAgB,KAAI,YACxC,kBAAgB,IAClB,EACM,CAACC,EAAaC,CAAc,KAAI,YAAS,EAAK,EAE9CC,KACJ,OAAC,UAAO,KAAM7B,EAAM,UAAWa,EAAW,YAAaP,EAAmB,EAGtEwB,KACJ,OAAC,aACC,QAAS7B,EACT,cAAeC,EACf,kBAAmBC,EACnB,YAAaC,EACb,sBAAuBC,EACvB,YAAaO,EACb,YAAaL,EACb,eAAgBU,EAChB,cAAeC,EACf,iBAAkBC,EAClB,gBAAiBC,EACjB,cAAeC,EACf,cAAeb,EACf,YAAac,EACb,YAAaC,EACb,SAAUC,EACV,cAAef,EACjB,EAGIsB,KACJ,OAAC,eACC,cAAerB,EACf,YAAaC,EACb,YAAaL,EACb,eAAgBQ,EAChB,cAAeC,EACf,cAAeC,EACf,cAAed,EACf,iBAAkBD,EACpB,EAGI+B,GAAW,IAAM,CACrB,OAAQP,EAAe,CACrB,KAAK,kBAAgB,KACnB,OAAOI,EACT,KAAK,kBAAgB,UACnB,OAAOC,EACT,KAAK,kBAAgB,YACnB,OAAOC,EACT,KAAK,kBAAgB,gBACnB,SACE,OAAC,aAAU,UAAU,aAAa,MAAOF,EAAQ,OAAQC,EAAW,EAExE,KAAK,kBAAgB,cACnB,SACE,OAAC,aAAU,UAAU,WAAW,MAAOD,EAAQ,OAAQC,EAAW,EAEtE,QACE,OAAOD,CACX,CACF,GAAG,EAEH,SACE,QAACpC,GAAA,CACC,oBAAC,0BACC,cAAegC,EACf,eAAgBC,EAChB,kBAAmBpB,EACnB,qBAAsBC,EACxB,KACA,OAACZ,GAAA,CAAa,SAAAqC,EAAQ,KACtB,OAAC,mBACC,YAAaL,EACb,cAAe,IAAMC,EAAe,CAACD,CAAW,EAClD,KACA,OAAC,eACC,OAAQA,EACR,QAAS,IAAMC,EAAe,EAAK,EACnC,aAAc7B,EACd,iBAAkBD,EAClB,YAAac,EACf,GACF,CAEJ,EAEO,SAASlC,GAA2B,CACzC,UAAAmB,CACF,EAEG,CACD,SACE,OAAC,iBACC,mBAAC,iBAAc,gBAAgB,QAC7B,mBAACD,GAAA,CAAU,UAAWC,EAAW,EACnC,EACF,CAEJ",
|
|
6
|
+
"names": ["Dashboard_exports", "__export", "DashboardWithErrorBoundary", "__toCommonJS", "import_react", "import_styles", "import_styled_components", "import_DashboardFooter", "import_DashboardNavigationBar", "import_DebugDrawer", "import_SplitView", "import_useConnectorMessages", "import_inspector", "import_logger", "import_mock_capture", "import_ErrorBoundary", "import_jsx_runtime", "DashboardContainer", "styled", "ContentArea", "Dashboard", "connector", "receivedMessages", "sentMessages", "logs", "connectedDevices", "sessionStates", "discoveredDevices", "isListening", "isActivelyDiscovering", "isLoggerConnected", "isInspectorConnected", "providerValue", "apduResponses", "apduExchanges", "isRecordingExchanges", "sendMessage", "clearLogs", "startRecordingExchanges", "stopRecordingExchanges", "clearRecordedExchanges", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "connectDevice", "getProvider", "setProvider", "sendApdu", "currentScreen", "setCurrentScreen", "isDebugOpen", "setIsDebugOpen", "logger", "inspector", "mockCapture", "content"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var g=Object.create;var c=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var u=Object.getPrototypeOf,$=Object.prototype.hasOwnProperty;var k=(o,i)=>{for(var e in i)c(o,e,{get:i[e],enumerable:!0})},p=(o,i,e,a)=>{if(i&&typeof i=="object"||typeof i=="function")for(let n of v(i))!$.call(o,n)&&n!==e&&c(o,n,{get:()=>i[n],enumerable:!(a=f(i,n))||a.enumerable});return o};var m=(o,i,e)=>(e=o!=null?g(u(o)):{},p(i||!o||!o.__esModule?c(e,"default",{value:o,enumerable:!0}):e,o)),C=o=>p(c({},"__esModule",{value:!0}),o);var z={};k(z,{DashboardNavigationBar:()=>S,DashboardScreen:()=>x});module.exports=C(z);var r=m(require("styled-components")),t=require("react/jsx-runtime"),x=(l=>(l.logs="logs",l.inspector="inspector",l.mockCapture="mockCapture",l.splitHorizontal="splitHorizontal",l.splitVertical="splitVertical",l))(x||{});const w=r.default.div`
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: row;
|
|
4
4
|
align-items: center;
|
|
@@ -7,17 +7,17 @@
|
|
|
7
7
|
background: #f8f8f8;
|
|
8
8
|
border-bottom: 1px solid #e0e0e0;
|
|
9
9
|
flex-shrink: 0;
|
|
10
|
-
`,
|
|
10
|
+
`,b=r.default.div`
|
|
11
11
|
display: flex;
|
|
12
12
|
flex-direction: row;
|
|
13
13
|
align-items: center;
|
|
14
14
|
gap: 4px;
|
|
15
|
-
`,
|
|
15
|
+
`,y=r.default.div`
|
|
16
16
|
width: 1px;
|
|
17
17
|
height: 24px;
|
|
18
18
|
background: #ddd;
|
|
19
19
|
margin: 0 8px;
|
|
20
|
-
`,
|
|
20
|
+
`,s=r.default.button`
|
|
21
21
|
padding: 6px 12px;
|
|
22
22
|
border: 1px solid ${({$isActive:o})=>o?"#2196F3":"#ddd"};
|
|
23
23
|
border-radius: 4px;
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
background: ${({$isActive:o})=>o?"#e3f2fd":"#f5f5f5"};
|
|
34
34
|
border-color: ${({$isActive:o})=>o?"#2196F3":"#bbb"};
|
|
35
35
|
}
|
|
36
|
-
`,
|
|
36
|
+
`,h=r.default.button`
|
|
37
37
|
padding: 6px 8px;
|
|
38
38
|
border: 1px solid ${({$isActive:o})=>o?"#2196F3":"#ddd"};
|
|
39
39
|
border-radius: 4px;
|
|
@@ -49,16 +49,16 @@
|
|
|
49
49
|
background: ${({$isActive:o})=>o?"#e3f2fd":"#f5f5f5"};
|
|
50
50
|
border-color: ${({$isActive:o})=>o?"#2196F3":"#bbb"};
|
|
51
51
|
}
|
|
52
|
-
`,
|
|
52
|
+
`,d=r.default.span`
|
|
53
53
|
display: inline-block;
|
|
54
54
|
width: 8px;
|
|
55
55
|
height: 8px;
|
|
56
56
|
border-radius: 50%;
|
|
57
57
|
background: ${({$connected:o})=>o?"#4CAF50":"#ff9800"};
|
|
58
58
|
margin-right: 6px;
|
|
59
|
-
`,
|
|
59
|
+
`,B=r.default.span`
|
|
60
60
|
font-size: 12px;
|
|
61
61
|
color: #666;
|
|
62
62
|
margin-right: 4px;
|
|
63
|
-
`,
|
|
63
|
+
`,N=()=>(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:[(0,t.jsx)("rect",{x:"2",y:"2",width:"12",height:"5",rx:"1",opacity:"0.6"}),(0,t.jsx)("rect",{x:"2",y:"9",width:"12",height:"5",rx:"1"})]}),D=()=>(0,t.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:[(0,t.jsx)("rect",{x:"2",y:"2",width:"5",height:"12",rx:"1",opacity:"0.6"}),(0,t.jsx)("rect",{x:"9",y:"2",width:"5",height:"12",rx:"1"})]}),S=({currentScreen:o,onScreenChange:i,isLoggerConnected:e,isInspectorConnected:a})=>(0,t.jsxs)(w,{children:[(0,t.jsxs)(b,{children:[(0,t.jsxs)(s,{$isActive:o==="logs",$isConnected:e,onClick:()=>i("logs"),children:[(0,t.jsx)(d,{$connected:e}),"Logger"]}),(0,t.jsxs)(s,{$isActive:o==="inspector",$isConnected:a,onClick:()=>i("inspector"),children:[(0,t.jsx)(d,{$connected:a}),"Inspector"]}),(0,t.jsxs)(s,{$isActive:o==="mockCapture",$isConnected:e,onClick:()=>i("mockCapture"),children:[(0,t.jsx)(d,{$connected:e}),"Mock Capture"]})]}),(0,t.jsx)(y,{}),(0,t.jsxs)(b,{children:[(0,t.jsx)(B,{children:"Split:"}),(0,t.jsx)(h,{$isActive:o==="splitHorizontal",onClick:()=>i("splitHorizontal"),title:"Split Horizontal (top/bottom)",children:(0,t.jsx)(N,{})}),(0,t.jsx)(h,{$isActive:o==="splitVertical",onClick:()=>i("splitVertical"),title:"Split Vertical (left/right)",children:(0,t.jsx)(D,{})})]})]});0&&(module.exports={DashboardNavigationBar,DashboardScreen});
|
|
64
64
|
//# sourceMappingURL=DashboardNavigationBar.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/DashboardNavigationBar.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\nimport styled from \"styled-components\";\n\nexport enum DashboardScreen {\n logs = \"logs\",\n inspector = \"inspector\",\n splitHorizontal = \"splitHorizontal\",\n splitVertical = \"splitVertical\",\n}\n\nconst NavContainer = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f8f8f8;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n`;\n\nconst NavGroup = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n`;\n\nconst Divider = styled.div`\n width: 1px;\n height: 24px;\n background: #ddd;\n margin: 0 8px;\n`;\n\nconst NavButton = styled.button<{\n $isActive?: boolean;\n $isConnected?: boolean;\n}>`\n padding: 6px 12px;\n border: 1px solid ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#ddd\")};\n border-radius: 4px;\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"white\")};\n color: ${({ $isActive }) => ($isActive ? \"#1976d2\" : \"#333\")};\n font-weight: ${({ $isActive }) => ($isActive ? \"600\" : \"normal\")};\n font-size: 13px;\n cursor: pointer;\n opacity: ${({ $isConnected }) => ($isConnected === false ? 0.5 : 1)};\n transition: all 0.15s ease;\n\n &:hover {\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"#f5f5f5\")};\n border-color: ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#bbb\")};\n }\n`;\n\nconst SplitButton = styled.button<{ $isActive?: boolean }>`\n padding: 6px 8px;\n border: 1px solid ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#ddd\")};\n border-radius: 4px;\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"white\")};\n color: ${({ $isActive }) => ($isActive ? \"#1976d2\" : \"#666\")};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n\n &:hover {\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"#f5f5f5\")};\n border-color: ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#bbb\")};\n }\n`;\n\nconst ConnectionIndicator = styled.span<{ $connected: boolean }>`\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: ${({ $connected }) => ($connected ? \"#4CAF50\" : \"#ff9800\")};\n margin-right: 6px;\n`;\n\nconst SplitLabel = styled.span`\n font-size: 12px;\n color: #666;\n margin-right: 4px;\n`;\n\n// Simple SVG icons for split buttons\nconst SplitHorizontalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"5\" rx=\"1\" opacity=\"0.6\" />\n <rect x=\"2\" y=\"9\" width=\"12\" height=\"5\" rx=\"1\" />\n </svg>\n);\n\nconst SplitVerticalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"2\" y=\"2\" width=\"5\" height=\"12\" rx=\"1\" opacity=\"0.6\" />\n <rect x=\"9\" y=\"2\" width=\"5\" height=\"12\" rx=\"1\" />\n </svg>\n);\n\ntype DashboardNavigationBarProps = {\n currentScreen: DashboardScreen;\n onScreenChange: (screen: DashboardScreen) => void;\n isLoggerConnected: boolean;\n isInspectorConnected: boolean;\n};\n\nexport const DashboardNavigationBar: React.FC<DashboardNavigationBarProps> = ({\n currentScreen,\n onScreenChange,\n isLoggerConnected,\n isInspectorConnected,\n}) => {\n return (\n <NavContainer>\n {/* Main view buttons */}\n <NavGroup>\n <NavButton\n $isActive={currentScreen === DashboardScreen.logs}\n $isConnected={isLoggerConnected}\n onClick={() => onScreenChange(DashboardScreen.logs)}\n >\n <ConnectionIndicator $connected={isLoggerConnected} />\n Logger\n </NavButton>\n <NavButton\n $isActive={currentScreen === DashboardScreen.inspector}\n $isConnected={isInspectorConnected}\n onClick={() => onScreenChange(DashboardScreen.inspector)}\n >\n <ConnectionIndicator $connected={isInspectorConnected} />\n Inspector\n </NavButton>\n </NavGroup>\n\n <Divider />\n\n {/* Split view buttons */}\n <NavGroup>\n <SplitLabel>Split:</SplitLabel>\n <SplitButton\n $isActive={currentScreen === DashboardScreen.splitHorizontal}\n onClick={() => onScreenChange(DashboardScreen.splitHorizontal)}\n title=\"Split Horizontal (top/bottom)\"\n >\n <SplitHorizontalIcon />\n </SplitButton>\n <SplitButton\n $isActive={currentScreen === DashboardScreen.splitVertical}\n onClick={() => onScreenChange(DashboardScreen.splitVertical)}\n title=\"Split Vertical (left/right)\"\n >\n <SplitVerticalIcon />\n </SplitButton>\n </NavGroup>\n </NavContainer>\n );\n};\n"],
|
|
5
|
-
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,EAAA,oBAAAC,IAAA,eAAAC,EAAAJ,GACA,IAAAK,EAAmB,
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport styled from \"styled-components\";\n\nexport enum DashboardScreen {\n logs = \"logs\",\n inspector = \"inspector\",\n mockCapture = \"mockCapture\",\n splitHorizontal = \"splitHorizontal\",\n splitVertical = \"splitVertical\",\n}\n\nconst NavContainer = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f8f8f8;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n`;\n\nconst NavGroup = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n`;\n\nconst Divider = styled.div`\n width: 1px;\n height: 24px;\n background: #ddd;\n margin: 0 8px;\n`;\n\nconst NavButton = styled.button<{\n $isActive?: boolean;\n $isConnected?: boolean;\n}>`\n padding: 6px 12px;\n border: 1px solid ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#ddd\")};\n border-radius: 4px;\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"white\")};\n color: ${({ $isActive }) => ($isActive ? \"#1976d2\" : \"#333\")};\n font-weight: ${({ $isActive }) => ($isActive ? \"600\" : \"normal\")};\n font-size: 13px;\n cursor: pointer;\n opacity: ${({ $isConnected }) => ($isConnected === false ? 0.5 : 1)};\n transition: all 0.15s ease;\n\n &:hover {\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"#f5f5f5\")};\n border-color: ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#bbb\")};\n }\n`;\n\nconst SplitButton = styled.button<{ $isActive?: boolean }>`\n padding: 6px 8px;\n border: 1px solid ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#ddd\")};\n border-radius: 4px;\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"white\")};\n color: ${({ $isActive }) => ($isActive ? \"#1976d2\" : \"#666\")};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n\n &:hover {\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"#f5f5f5\")};\n border-color: ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#bbb\")};\n }\n`;\n\nconst ConnectionIndicator = styled.span<{ $connected: boolean }>`\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: ${({ $connected }) => ($connected ? \"#4CAF50\" : \"#ff9800\")};\n margin-right: 6px;\n`;\n\nconst SplitLabel = styled.span`\n font-size: 12px;\n color: #666;\n margin-right: 4px;\n`;\n\n// Simple SVG icons for split buttons\nconst SplitHorizontalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"5\" rx=\"1\" opacity=\"0.6\" />\n <rect x=\"2\" y=\"9\" width=\"12\" height=\"5\" rx=\"1\" />\n </svg>\n);\n\nconst SplitVerticalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"2\" y=\"2\" width=\"5\" height=\"12\" rx=\"1\" opacity=\"0.6\" />\n <rect x=\"9\" y=\"2\" width=\"5\" height=\"12\" rx=\"1\" />\n </svg>\n);\n\ntype DashboardNavigationBarProps = {\n currentScreen: DashboardScreen;\n onScreenChange: (screen: DashboardScreen) => void;\n isLoggerConnected: boolean;\n isInspectorConnected: boolean;\n};\n\nexport const DashboardNavigationBar: React.FC<DashboardNavigationBarProps> = ({\n currentScreen,\n onScreenChange,\n isLoggerConnected,\n isInspectorConnected,\n}) => {\n return (\n <NavContainer>\n {/* Main view buttons */}\n <NavGroup>\n <NavButton\n $isActive={currentScreen === DashboardScreen.logs}\n $isConnected={isLoggerConnected}\n onClick={() => onScreenChange(DashboardScreen.logs)}\n >\n <ConnectionIndicator $connected={isLoggerConnected} />\n Logger\n </NavButton>\n <NavButton\n $isActive={currentScreen === DashboardScreen.inspector}\n $isConnected={isInspectorConnected}\n onClick={() => onScreenChange(DashboardScreen.inspector)}\n >\n <ConnectionIndicator $connected={isInspectorConnected} />\n Inspector\n </NavButton>\n <NavButton\n $isActive={currentScreen === DashboardScreen.mockCapture}\n $isConnected={isLoggerConnected}\n onClick={() => onScreenChange(DashboardScreen.mockCapture)}\n >\n <ConnectionIndicator $connected={isLoggerConnected} />\n Mock Capture\n </NavButton>\n </NavGroup>\n\n <Divider />\n\n {/* Split view buttons */}\n <NavGroup>\n <SplitLabel>Split:</SplitLabel>\n <SplitButton\n $isActive={currentScreen === DashboardScreen.splitHorizontal}\n onClick={() => onScreenChange(DashboardScreen.splitHorizontal)}\n title=\"Split Horizontal (top/bottom)\"\n >\n <SplitHorizontalIcon />\n </SplitButton>\n <SplitButton\n $isActive={currentScreen === DashboardScreen.splitVertical}\n onClick={() => onScreenChange(DashboardScreen.splitVertical)}\n title=\"Split Vertical (left/right)\"\n >\n <SplitVerticalIcon />\n </SplitButton>\n </NavGroup>\n </NavContainer>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["DashboardNavigationBar_exports", "__export", "DashboardNavigationBar", "DashboardScreen", "__toCommonJS", "import_styled_components", "import_jsx_runtime", "NavContainer", "styled", "NavGroup", "Divider", "NavButton", "$isActive", "$isConnected", "SplitButton", "ConnectionIndicator", "$connected", "SplitLabel", "SplitHorizontalIcon", "SplitVerticalIcon", "currentScreen", "onScreenChange", "isLoggerConnected", "isInspectorConnected"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var r=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var u=(o,e)=>{for(var t in e)r(o,t,{get:e[t],enumerable:!0})},S=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of d(e))!l.call(o,s)&&s!==t&&r(o,s,{get:()=>e[s],enumerable:!(a=p(e,s))||a.enumerable});return o};var v=o=>S(r({},"__esModule",{value:!0}),o);var C={};u(C,{handleApduResponse:()=>M,handleConnectedDevicesUpdate:()=>f,handleDeviceSessionStateUpdate:()=>m,handleDiscoveredDevicesUpdate:()=>A,handleLogMessage:()=>g,handleModuleConnected:()=>h,handleProviderValue:()=>x});module.exports=v(C);var i=require("../screens/logger/mapConnectorMessageToLogData");const D="apdu-exchange";function y(o){const e=o.payload;return typeof e!="object"||e===null||Array.isArray(e)||e.type!==D||typeof e.apdu!="string"||typeof e.response!="string"?null:{sessionId:typeof e.sessionId=="string"?e.sessionId:void 0,apdu:e.apdu,response:e.response,timestamp:o.timestamp}}function h(o,e){try{const{module:t}=JSON.parse(o);e(a=>new Set([...a,t]))}catch(t){console.error("Failed to parse moduleConnected payload",t)}}function g(o,e,t,a){const s=(0,i.mapConnectorMessageToLogData)(o);if(s!==null){if(e(n=>[...n,s]),a){const n=y(s);n!==null&&t(c=>[...c,n])}return!0}return!1}function f(o,e){try{const t=JSON.parse(o);e(t)}catch(t){console.error("Failed to parse connectedDevicesUpdate payload",t)}}function m(o,e){try{const{sessionId:t,state:a}=JSON.parse(o);e(s=>new Map(s).set(t,a))}catch(t){console.error("Failed to parse deviceSessionStateUpdate payload",t)}}function A(o,e){try{const t=JSON.parse(o);e(t)}catch(t){console.error("Failed to parse discoveredDevicesUpdate payload",t)}}function x(o,e){try{const{provider:t}=JSON.parse(o);e(t)}catch(t){console.error("Failed to parse providerValue payload",t)}}function M(o,e){try{const t=JSON.parse(o);e(a=>new Map(a).set(t.requestId,t))}catch(t){console.error("Failed to parse apduResponse payload",t)}}0&&(module.exports={handleApduResponse,handleConnectedDevicesUpdate,handleDeviceSessionStateUpdate,handleDiscoveredDevicesUpdate,handleLogMessage,handleModuleConnected,handleProviderValue});
|
|
2
2
|
//# sourceMappingURL=connectorMessageHandlers.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/hooks/connectorMessageHandlers.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Dispatch, SetStateAction } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { type DevToolsModule } from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { mapConnectorMessageToLogData } from \"../screens/logger/mapConnectorMessageToLogData\";\nimport { type LogData } from \"../screens/logger/types\";\nimport { type ApduResponse } from \"./useConnectorMessages\";\n\n/**\n * Handle module connected handshake message.\n */\nexport function handleModuleConnected(\n payload: string,\n setConnectedModules: Dispatch<SetStateAction<Set<DevToolsModule>>>,\n): void {\n try {\n const { module } = JSON.parse(payload) as { module: DevToolsModule };\n setConnectedModules((prev) => new Set([...prev, module]));\n } catch (e) {\n console.error(\"Failed to parse moduleConnected payload\", e);\n }\n}\n\n/**\n * Handle log message. Returns true if message was a log, false otherwise.\n */\nexport function handleLogMessage(\n
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,EAAA,iCAAAC,EAAA,mCAAAC,EAAA,kCAAAC,EAAA,qBAAAC,EAAA,0BAAAC,EAAA,wBAAAC,IAAA,eAAAC,EAAAT,GAQA,IAAAU,EAA6C,
|
|
6
|
-
"names": ["connectorMessageHandlers_exports", "__export", "handleApduResponse", "handleConnectedDevicesUpdate", "handleDeviceSessionStateUpdate", "handleDiscoveredDevicesUpdate", "handleLogMessage", "handleModuleConnected", "handleProviderValue", "__toCommonJS", "import_mapConnectorMessageToLogData", "payload", "setConnectedModules", "module", "prev", "
|
|
4
|
+
"sourcesContent": ["import type { Dispatch, SetStateAction } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { type DevToolsModule } from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { mapConnectorMessageToLogData } from \"../screens/logger/mapConnectorMessageToLogData\";\nimport { type LogData } from \"../screens/logger/types\";\nimport { type ApduExchange, type ApduResponse } from \"./useConnectorMessages\";\n\nconst APDU_EXCHANGE_LOG = \"apdu-exchange\";\n\n/**\n * Extracts a structured APDU exchange from a log message, if the log carries\n * the `apdu-exchange` payload emitted by DMK. Returns null otherwise.\n */\nfunction tryExtractApduExchange(logData: LogData): ApduExchange | null {\n const data = logData.payload;\n if (\n typeof data !== \"object\" ||\n data === null ||\n Array.isArray(data) ||\n data[\"type\"] !== APDU_EXCHANGE_LOG ||\n typeof data[\"apdu\"] !== \"string\" ||\n typeof data[\"response\"] !== \"string\"\n ) {\n return null;\n }\n return {\n sessionId:\n typeof data[\"sessionId\"] === \"string\" ? data[\"sessionId\"] : undefined,\n apdu: data[\"apdu\"],\n response: data[\"response\"],\n timestamp: logData.timestamp,\n };\n}\n\n/**\n * Handle module connected handshake message.\n */\nexport function handleModuleConnected(\n payload: string,\n setConnectedModules: Dispatch<SetStateAction<Set<DevToolsModule>>>,\n): void {\n try {\n const { module } = JSON.parse(payload) as { module: DevToolsModule };\n setConnectedModules((prev) => new Set([...prev, module]));\n } catch (e) {\n console.error(\"Failed to parse moduleConnected payload\", e);\n }\n}\n\n/**\n * Handle log message. Returns true if message was a log, false otherwise.\n */\nexport function handleLogMessage(\n payload: string,\n setLogs: Dispatch<SetStateAction<LogData[]>>,\n setApduExchanges: Dispatch<SetStateAction<ApduExchange[]>>,\n isRecordingExchanges: boolean,\n): boolean {\n const logData = mapConnectorMessageToLogData(payload);\n if (logData !== null) {\n setLogs((prev) => [...prev, logData]);\n if (isRecordingExchanges) {\n const exchange = tryExtractApduExchange(logData);\n if (exchange !== null) {\n setApduExchanges((prev) => [...prev, exchange]);\n }\n }\n return true;\n }\n return false;\n}\n\n/**\n * Handle connected devices update message.\n */\nexport function handleConnectedDevicesUpdate(\n payload: string,\n setConnectedDevices: Dispatch<SetStateAction<ConnectedDevice[]>>,\n): void {\n try {\n const devices = JSON.parse(payload) as ConnectedDevice[];\n setConnectedDevices(devices);\n } catch (e) {\n console.error(\"Failed to parse connectedDevicesUpdate payload\", e);\n }\n}\n\n/**\n * Handle device session state update message.\n */\nexport function handleDeviceSessionStateUpdate(\n payload: string,\n setSessionStates: Dispatch<SetStateAction<Map<string, DeviceSessionState>>>,\n): void {\n try {\n const { sessionId, state } = JSON.parse(payload) as {\n sessionId: string;\n state: DeviceSessionState;\n };\n setSessionStates((prev) => new Map(prev).set(sessionId, state));\n } catch (e) {\n console.error(\"Failed to parse deviceSessionStateUpdate payload\", e);\n }\n}\n\n/**\n * Handle discovered devices update message.\n */\nexport function handleDiscoveredDevicesUpdate(\n payload: string,\n setDiscoveredDevices: Dispatch<SetStateAction<DiscoveredDevice[]>>,\n): void {\n try {\n const devices = JSON.parse(payload) as DiscoveredDevice[];\n setDiscoveredDevices(devices);\n } catch (e) {\n console.error(\"Failed to parse discoveredDevicesUpdate payload\", e);\n }\n}\n\n/**\n * Handle provider value response message.\n */\nexport function handleProviderValue(\n payload: string,\n setProviderValue: Dispatch<SetStateAction<number | null>>,\n): void {\n try {\n const { provider } = JSON.parse(payload) as { provider: number };\n setProviderValue(provider);\n } catch (e) {\n console.error(\"Failed to parse providerValue payload\", e);\n }\n}\n\n/**\n * Handle APDU response message.\n */\nexport function handleApduResponse(\n payload: string,\n setApduResponses: Dispatch<SetStateAction<Map<string, ApduResponse>>>,\n): void {\n try {\n const response = JSON.parse(payload) as ApduResponse;\n setApduResponses((prev) => new Map(prev).set(response.requestId, response));\n } catch (e) {\n console.error(\"Failed to parse apduResponse payload\", e);\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,EAAA,iCAAAC,EAAA,mCAAAC,EAAA,kCAAAC,EAAA,qBAAAC,EAAA,0BAAAC,EAAA,wBAAAC,IAAA,eAAAC,EAAAT,GAQA,IAAAU,EAA6C,0DAI7C,MAAMC,EAAoB,gBAM1B,SAASC,EAAuBC,EAAuC,CACrE,MAAMC,EAAOD,EAAQ,QACrB,OACE,OAAOC,GAAS,UAChBA,IAAS,MACT,MAAM,QAAQA,CAAI,GAClBA,EAAK,OAAYH,GACjB,OAAOG,EAAK,MAAY,UACxB,OAAOA,EAAK,UAAgB,SAErB,KAEF,CACL,UACE,OAAOA,EAAK,WAAiB,SAAWA,EAAK,UAAe,OAC9D,KAAMA,EAAK,KACX,SAAUA,EAAK,SACf,UAAWD,EAAQ,SACrB,CACF,CAKO,SAASN,EACdQ,EACAC,EACM,CACN,GAAI,CACF,KAAM,CAAE,OAAAC,CAAO,EAAI,KAAK,MAAMF,CAAO,EACrCC,EAAqBE,GAAS,IAAI,IAAI,CAAC,GAAGA,EAAMD,CAAM,CAAC,CAAC,CAC1D,OAASE,EAAG,CACV,QAAQ,MAAM,0CAA2CA,CAAC,CAC5D,CACF,CAKO,SAASb,EACdS,EACAK,EACAC,EACAC,EACS,CACT,MAAMT,KAAU,gCAA6BE,CAAO,EACpD,GAAIF,IAAY,KAAM,CAEpB,GADAO,EAASF,GAAS,CAAC,GAAGA,EAAML,CAAO,CAAC,EAChCS,EAAsB,CACxB,MAAMC,EAAWX,EAAuBC,CAAO,EAC3CU,IAAa,MACfF,EAAkBH,GAAS,CAAC,GAAGA,EAAMK,CAAQ,CAAC,CAElD,CACA,MAAO,EACT,CACA,MAAO,EACT,CAKO,SAASpB,EACdY,EACAS,EACM,CACN,GAAI,CACF,MAAMC,EAAU,KAAK,MAAMV,CAAO,EAClCS,EAAoBC,CAAO,CAC7B,OAASN,EAAG,CACV,QAAQ,MAAM,iDAAkDA,CAAC,CACnE,CACF,CAKO,SAASf,EACdW,EACAW,EACM,CACN,GAAI,CACF,KAAM,CAAE,UAAAC,EAAW,MAAAC,CAAM,EAAI,KAAK,MAAMb,CAAO,EAI/CW,EAAkBR,GAAS,IAAI,IAAIA,CAAI,EAAE,IAAIS,EAAWC,CAAK,CAAC,CAChE,OAAST,EAAG,CACV,QAAQ,MAAM,mDAAoDA,CAAC,CACrE,CACF,CAKO,SAASd,EACdU,EACAc,EACM,CACN,GAAI,CACF,MAAMJ,EAAU,KAAK,MAAMV,CAAO,EAClCc,EAAqBJ,CAAO,CAC9B,OAASN,EAAG,CACV,QAAQ,MAAM,kDAAmDA,CAAC,CACpE,CACF,CAKO,SAASX,EACdO,EACAe,EACM,CACN,GAAI,CACF,KAAM,CAAE,SAAAC,CAAS,EAAI,KAAK,MAAMhB,CAAO,EACvCe,EAAiBC,CAAQ,CAC3B,OAASZ,EAAG,CACV,QAAQ,MAAM,wCAAyCA,CAAC,CAC1D,CACF,CAKO,SAASjB,EACda,EACAiB,EACM,CACN,GAAI,CACF,MAAMC,EAAW,KAAK,MAAMlB,CAAO,EACnCiB,EAAkBd,GAAS,IAAI,IAAIA,CAAI,EAAE,IAAIe,EAAS,UAAWA,CAAQ,CAAC,CAC5E,OAASd,EAAG,CACV,QAAQ,MAAM,uCAAwCA,CAAC,CACzD,CACF",
|
|
6
|
+
"names": ["connectorMessageHandlers_exports", "__export", "handleApduResponse", "handleConnectedDevicesUpdate", "handleDeviceSessionStateUpdate", "handleDiscoveredDevicesUpdate", "handleLogMessage", "handleModuleConnected", "handleProviderValue", "__toCommonJS", "import_mapConnectorMessageToLogData", "APDU_EXCHANGE_LOG", "tryExtractApduExchange", "logData", "data", "payload", "setConnectedModules", "module", "prev", "e", "setLogs", "setApduExchanges", "isRecordingExchanges", "exchange", "setConnectedDevices", "devices", "setSessionStates", "sessionId", "state", "setDiscoveredDevices", "setProviderValue", "provider", "setApduResponses", "response"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var ee=(n,t)=>{for(var d in t)m(n,d,{get:t[d],enumerable:!0})},se=(n,t,d,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Z(t))!$.call(n,r)&&r!==d&&m(n,r,{get:()=>t[r],enumerable:!(u=X(t,r))||u.enumerable});return n};var ne=n=>se(m({},"__esModule",{value:!0}),n);var te={};ee(te,{useConnectorMessages:()=>oe});module.exports=ne(te);var e=require("react"),o=require("@ledgerhq/device-management-kit-devtools-core"),g=require("./commandDispatcher"),s=require("./connectorMessageHandlers");function oe(n){const[t,d]=(0,e.useState)([]),[u,r]=(0,e.useState)([]),[L,C]=(0,e.useState)([]),[E,b]=(0,e.useState)(new Set),[f,x]=(0,e.useState)([]),[P,_]=(0,e.useState)(new Map),[I,v]=(0,e.useState)([]),[T,M]=(0,e.useState)(!1),[O,S]=(0,e.useState)(!1),[V,U]=(0,e.useState)(null),[k,G]=(0,e.useState)(new Map),[N,R]=(0,e.useState)([]),[y,h]=(0,e.useState)(!1),l=(0,e.useRef)(!1),a=(0,e.useMemo)(()=>({...n,sendMessage:(D,p)=>{n.sendMessage(D,p),r(i=>[...i,{type:D,payload:p}])}}),[n]);(0,e.useEffect)(()=>{const{unsubscribe:D}=n.listenToMessages((p,i)=>{switch(d(W=>[...W,{type:p,payload:i}]),p){case o.MODULE_CONNECTED_MESSAGE_TYPE:(0,s.handleModuleConnected)(i,b);break;case o.INSPECTOR_MESSAGE_TYPES.CONNECTED_DEVICES_UPDATE:(0,s.handleConnectedDevicesUpdate)(i,x);break;case o.INSPECTOR_MESSAGE_TYPES.DEVICE_SESSION_STATE_UPDATE:(0,s.handleDeviceSessionStateUpdate)(i,_);break;case o.INSPECTOR_MESSAGE_TYPES.DISCOVERED_DEVICES_UPDATE:(0,s.handleDiscoveredDevicesUpdate)(i,v);break;case o.INSPECTOR_MESSAGE_TYPES.PROVIDER_VALUE:(0,s.handleProviderValue)(i,U);break;case o.INSPECTOR_MESSAGE_TYPES.APDU_RESPONSE:(0,s.handleApduResponse)(i,G);break;case o.LOGGER_MESSAGE_TYPES.ADD_LOG:(0,s.handleLogMessage)(i,C,R,l.current);break}});return D},[n]);const c=(0,e.useMemo)(()=>(0,g.createDiscoveryCommands)(a),[a]),A=(0,e.useMemo)(()=>(0,g.createProviderCommands)(a),[a]),w=(0,e.useMemo)(()=>(0,g.createApduCommands)(a),[a]),Y=(0,e.useCallback)(()=>{M(!0),v([]),c.startListeningCommand()},[c]),q=(0,e.useCallback)(()=>{M(!1),v([]),c.stopListeningCommand()},[c]),H=(0,e.useCallback)(()=>{S(!0),v([]),c.startDiscoveringCommand()},[c]),K=(0,e.useCallback)(()=>{S(!1),v([]),c.stopDiscoveringCommand()},[c]),j=(0,e.useCallback)(()=>{C([])},[]),z=(0,e.useCallback)(()=>{l.current=!0,h(!0)},[]),B=(0,e.useCallback)(()=>{l.current=!1,h(!1)},[]),F=(0,e.useCallback)(()=>{R([])},[]),J=E.has(o.DEVTOOLS_MODULES.LOGGER),Q=E.has(o.DEVTOOLS_MODULES.DMK_INSPECTOR);return{receivedMessages:t,sentMessages:u,logs:L,connectedModules:E,connectedDevices:f,sessionStates:P,discoveredDevices:I,isListening:T,isActivelyDiscovering:O,isLoggerConnected:J,isInspectorConnected:Q,providerValue:V,apduResponses:k,apduExchanges:N,isRecordingExchanges:y,sendMessage:a.sendMessage,clearLogs:j,startRecordingExchanges:z,stopRecordingExchanges:B,clearRecordedExchanges:F,startListening:Y,stopListening:q,startDiscovering:H,stopDiscovering:K,connectDevice:c.connectDeviceCommand,getProvider:A.getProviderCommand,setProvider:A.setProviderCommand,sendApdu:w.sendApduCommand}}0&&(module.exports={useConnectorMessages});
|
|
2
2
|
//# sourceMappingURL=useConnectorMessages.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/hooks/useConnectorMessages.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @file useConnectorMessages hook\n *\n * Central hook for managing DevTools connector state and actions.\n * Handles all communication between the Dashboard UI and the client app\n * via the connector (WebSocket or Rozenite).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n type Connector,\n DEVTOOLS_MODULES,\n type DevToolsModule,\n INSPECTOR_MESSAGE_TYPES,\n MODULE_CONNECTED_MESSAGE_TYPE,\n} from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { type Message } from \"../PluginEvents\";\nimport { type LogData } from \"../screens/logger/types\";\nimport {\n createApduCommands,\n createDiscoveryCommands,\n createProviderCommands,\n} from \"./commandDispatcher\";\nimport {\n handleApduResponse,\n handleConnectedDevicesUpdate,\n handleDeviceSessionStateUpdate,\n handleDiscoveredDevicesUpdate,\n handleLogMessage,\n handleModuleConnected,\n handleProviderValue,\n} from \"./connectorMessageHandlers\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ApduResponse = {\n requestId: string;\n success: boolean;\n statusCode?: number[];\n data?: number[];\n error?: string;\n};\n\nexport type ConnectorMessagesState = {\n receivedMessages: Message[];\n sentMessages: Message[];\n logs: LogData[];\n connectedModules: Set<DevToolsModule>;\n connectedDevices: ConnectedDevice[];\n sessionStates: Map<string, DeviceSessionState>;\n discoveredDevices: DiscoveredDevice[];\n isListening: boolean;\n isActivelyDiscovering: boolean;\n isLoggerConnected: boolean;\n isInspectorConnected: boolean;\n providerValue: number | null;\n apduResponses: Map<string, ApduResponse>;\n sendMessage: (type: string, payload: string) => void;\n clearLogs: () => void;\n startListening: () => void;\n stopListening: () => void;\n startDiscovering: () => void;\n stopDiscovering: () => void;\n connectDevice: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) => void;\n getProvider: () => void;\n setProvider: (value: number) => void;\n sendApdu: (sessionId: string, apduHex: string) => string;\n};\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Central hook for managing DevTools connector state and communication.\n *\n * This hook:\n * - Listens to messages from the connector and dispatches them to handlers\n * - Tracks all sent/received messages for debugging\n * - Manages device discovery, sessions, and DMK configuration state\n * - Provides action functions to send commands to the inspector module\n *\n * @param connector - The connector instance (WebSocket or Rozenite)\n * @returns State and actions for the Dashboard UI\n */\nexport function useConnectorMessages(\n connector: Connector,\n): ConnectorMessagesState {\n // === State ===\n const [receivedMessages, setReceivedMessages] = useState<Message[]>([]);\n const [sentMessages, setSentMessages] = useState<Message[]>([]);\n const [logs, setLogs] = useState<LogData[]>([]);\n const [connectedModules, setConnectedModules] = useState<Set<DevToolsModule>>(\n new Set(),\n );\n const [connectedDevices, setConnectedDevices] = useState<ConnectedDevice[]>(\n [],\n );\n const [sessionStates, setSessionStates] = useState<\n Map<string, DeviceSessionState>\n >(new Map());\n const [discoveredDevices, setDiscoveredDevices] = useState<\n DiscoveredDevice[]\n >([]);\n const [isListening, setIsListening] = useState(false);\n const [isActivelyDiscovering, setIsActivelyDiscovering] = useState(false);\n const [providerValue, setProviderValue] = useState<number | null>(null);\n const [apduResponses, setApduResponses] = useState<Map<string, ApduResponse>>(\n new Map(),\n );\n\n // === Tracked Connector (keeps all sent messages in state) ===\n const trackedConnector: Connector = useMemo(\n () => ({\n ...connector,\n sendMessage: (type: string, payload: string) => {\n connector.sendMessage(type, payload);\n setSentMessages((prev) => [...prev, { type, payload }]);\n },\n }),\n [connector],\n );\n\n // === Message Listener ===\n useEffect(() => {\n const { unsubscribe } = connector.listenToMessages((type, payload) => {\n setReceivedMessages((prev) => [...prev, { type, payload }]);\n\n switch (type) {\n case MODULE_CONNECTED_MESSAGE_TYPE:\n handleModuleConnected(payload, setConnectedModules);\n break;\n case INSPECTOR_MESSAGE_TYPES.CONNECTED_DEVICES_UPDATE:\n handleConnectedDevicesUpdate(payload, setConnectedDevices);\n break;\n case INSPECTOR_MESSAGE_TYPES.DEVICE_SESSION_STATE_UPDATE:\n handleDeviceSessionStateUpdate(payload, setSessionStates);\n break;\n case INSPECTOR_MESSAGE_TYPES.DISCOVERED_DEVICES_UPDATE:\n handleDiscoveredDevicesUpdate(payload, setDiscoveredDevices);\n break;\n case INSPECTOR_MESSAGE_TYPES.PROVIDER_VALUE:\n handleProviderValue(payload, setProviderValue);\n break;\n case INSPECTOR_MESSAGE_TYPES.APDU_RESPONSE:\n handleApduResponse(payload, setApduResponses);\n break;\n
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["useConnectorMessages_exports", "__export", "useConnectorMessages", "__toCommonJS", "import_react", "import_device_management_kit_devtools_core", "import_commandDispatcher", "import_connectorMessageHandlers", "connector", "receivedMessages", "setReceivedMessages", "sentMessages", "setSentMessages", "logs", "setLogs", "connectedModules", "setConnectedModules", "connectedDevices", "setConnectedDevices", "sessionStates", "setSessionStates", "discoveredDevices", "setDiscoveredDevices", "isListening", "setIsListening", "isActivelyDiscovering", "setIsActivelyDiscovering", "providerValue", "setProviderValue", "apduResponses", "setApduResponses", "trackedConnector", "type", "payload", "prev", "unsubscribe", "discoveryCommands", "providerCommands", "apduCommands", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "clearLogs", "isLoggerConnected", "isInspectorConnected"]
|
|
4
|
+
"sourcesContent": ["/**\n * @file useConnectorMessages hook\n *\n * Central hook for managing DevTools connector state and actions.\n * Handles all communication between the Dashboard UI and the client app\n * via the connector (WebSocket or Rozenite).\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n type Connector,\n DEVTOOLS_MODULES,\n type DevToolsModule,\n INSPECTOR_MESSAGE_TYPES,\n LOGGER_MESSAGE_TYPES,\n MODULE_CONNECTED_MESSAGE_TYPE,\n} from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { type Message } from \"../PluginEvents\";\nimport { type LogData } from \"../screens/logger/types\";\nimport {\n createApduCommands,\n createDiscoveryCommands,\n createProviderCommands,\n} from \"./commandDispatcher\";\nimport {\n handleApduResponse,\n handleConnectedDevicesUpdate,\n handleDeviceSessionStateUpdate,\n handleDiscoveredDevicesUpdate,\n handleLogMessage,\n handleModuleConnected,\n handleProviderValue,\n} from \"./connectorMessageHandlers\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ApduResponse = {\n requestId: string;\n success: boolean;\n statusCode?: number[];\n data?: number[];\n error?: string;\n};\n\n/**\n * A single APDU exchange (request + response) captured passively from the DMK\n * logs of the host app. Used to derive mock-server mocks.\n */\nexport type ApduExchange = {\n sessionId?: string;\n apdu: string;\n response: string;\n timestamp: string;\n};\n\nexport type ConnectorMessagesState = {\n receivedMessages: Message[];\n sentMessages: Message[];\n logs: LogData[];\n connectedModules: Set<DevToolsModule>;\n connectedDevices: ConnectedDevice[];\n sessionStates: Map<string, DeviceSessionState>;\n discoveredDevices: DiscoveredDevice[];\n isListening: boolean;\n isActivelyDiscovering: boolean;\n isLoggerConnected: boolean;\n isInspectorConnected: boolean;\n providerValue: number | null;\n apduResponses: Map<string, ApduResponse>;\n apduExchanges: ApduExchange[];\n isRecordingExchanges: boolean;\n sendMessage: (type: string, payload: string) => void;\n clearLogs: () => void;\n startRecordingExchanges: () => void;\n stopRecordingExchanges: () => void;\n clearRecordedExchanges: () => void;\n startListening: () => void;\n stopListening: () => void;\n startDiscovering: () => void;\n stopDiscovering: () => void;\n connectDevice: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) => void;\n getProvider: () => void;\n setProvider: (value: number) => void;\n sendApdu: (sessionId: string, apduHex: string) => string;\n};\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Central hook for managing DevTools connector state and communication.\n *\n * This hook:\n * - Listens to messages from the connector and dispatches them to handlers\n * - Tracks all sent/received messages for debugging\n * - Manages device discovery, sessions, and DMK configuration state\n * - Provides action functions to send commands to the inspector module\n *\n * @param connector - The connector instance (WebSocket or Rozenite)\n * @returns State and actions for the Dashboard UI\n */\nexport function useConnectorMessages(\n connector: Connector,\n): ConnectorMessagesState {\n // === State ===\n const [receivedMessages, setReceivedMessages] = useState<Message[]>([]);\n const [sentMessages, setSentMessages] = useState<Message[]>([]);\n const [logs, setLogs] = useState<LogData[]>([]);\n const [connectedModules, setConnectedModules] = useState<Set<DevToolsModule>>(\n new Set(),\n );\n const [connectedDevices, setConnectedDevices] = useState<ConnectedDevice[]>(\n [],\n );\n const [sessionStates, setSessionStates] = useState<\n Map<string, DeviceSessionState>\n >(new Map());\n const [discoveredDevices, setDiscoveredDevices] = useState<\n DiscoveredDevice[]\n >([]);\n const [isListening, setIsListening] = useState(false);\n const [isActivelyDiscovering, setIsActivelyDiscovering] = useState(false);\n const [providerValue, setProviderValue] = useState<number | null>(null);\n const [apduResponses, setApduResponses] = useState<Map<string, ApduResponse>>(\n new Map(),\n );\n const [apduExchanges, setApduExchanges] = useState<ApduExchange[]>([]);\n const [isRecordingExchanges, setIsRecordingExchanges] = useState(false);\n const isRecordingExchangesRef = useRef(false);\n\n // === Tracked Connector (keeps all sent messages in state) ===\n const trackedConnector: Connector = useMemo(\n () => ({\n ...connector,\n sendMessage: (type: string, payload: string) => {\n connector.sendMessage(type, payload);\n setSentMessages((prev) => [...prev, { type, payload }]);\n },\n }),\n [connector],\n );\n\n // === Message Listener ===\n useEffect(() => {\n const { unsubscribe } = connector.listenToMessages((type, payload) => {\n setReceivedMessages((prev) => [...prev, { type, payload }]);\n\n switch (type) {\n case MODULE_CONNECTED_MESSAGE_TYPE:\n handleModuleConnected(payload, setConnectedModules);\n break;\n case INSPECTOR_MESSAGE_TYPES.CONNECTED_DEVICES_UPDATE:\n handleConnectedDevicesUpdate(payload, setConnectedDevices);\n break;\n case INSPECTOR_MESSAGE_TYPES.DEVICE_SESSION_STATE_UPDATE:\n handleDeviceSessionStateUpdate(payload, setSessionStates);\n break;\n case INSPECTOR_MESSAGE_TYPES.DISCOVERED_DEVICES_UPDATE:\n handleDiscoveredDevicesUpdate(payload, setDiscoveredDevices);\n break;\n case INSPECTOR_MESSAGE_TYPES.PROVIDER_VALUE:\n handleProviderValue(payload, setProviderValue);\n break;\n case INSPECTOR_MESSAGE_TYPES.APDU_RESPONSE:\n handleApduResponse(payload, setApduResponses);\n break;\n case LOGGER_MESSAGE_TYPES.ADD_LOG:\n handleLogMessage(\n payload,\n setLogs,\n setApduExchanges,\n isRecordingExchangesRef.current,\n );\n break;\n }\n });\n return unsubscribe;\n }, [connector]);\n\n // === Commands (using tracked connector to log all sent messages) ===\n const discoveryCommands = useMemo(\n () => createDiscoveryCommands(trackedConnector),\n [trackedConnector],\n );\n const providerCommands = useMemo(\n () => createProviderCommands(trackedConnector),\n [trackedConnector],\n );\n const apduCommands = useMemo(\n () => createApduCommands(trackedConnector),\n [trackedConnector],\n );\n\n // === Wrapped Commands (with local state updates) ===\n const startListening = useCallback(() => {\n setIsListening(true);\n setDiscoveredDevices([]);\n discoveryCommands.startListeningCommand();\n }, [discoveryCommands]);\n\n const stopListening = useCallback(() => {\n setIsListening(false);\n setDiscoveredDevices([]);\n discoveryCommands.stopListeningCommand();\n }, [discoveryCommands]);\n\n const startDiscovering = useCallback(() => {\n setIsActivelyDiscovering(true);\n setDiscoveredDevices([]);\n discoveryCommands.startDiscoveringCommand();\n }, [discoveryCommands]);\n\n const stopDiscovering = useCallback(() => {\n setIsActivelyDiscovering(false);\n setDiscoveredDevices([]);\n discoveryCommands.stopDiscoveringCommand();\n }, [discoveryCommands]);\n\n const clearLogs = useCallback(() => {\n setLogs([]);\n }, []);\n\n const startRecordingExchanges = useCallback(() => {\n isRecordingExchangesRef.current = true;\n setIsRecordingExchanges(true);\n }, []);\n\n const stopRecordingExchanges = useCallback(() => {\n isRecordingExchangesRef.current = false;\n setIsRecordingExchanges(false);\n }, []);\n\n const clearRecordedExchanges = useCallback(() => {\n setApduExchanges([]);\n }, []);\n\n // === Derived State ===\n const isLoggerConnected = connectedModules.has(DEVTOOLS_MODULES.LOGGER);\n const isInspectorConnected = connectedModules.has(\n DEVTOOLS_MODULES.DMK_INSPECTOR,\n );\n\n return {\n // State\n receivedMessages,\n sentMessages,\n logs,\n connectedModules,\n connectedDevices,\n sessionStates,\n discoveredDevices,\n isListening,\n isActivelyDiscovering,\n isLoggerConnected,\n isInspectorConnected,\n providerValue,\n apduResponses,\n apduExchanges,\n isRecordingExchanges,\n // Actions\n sendMessage: trackedConnector.sendMessage,\n clearLogs,\n startRecordingExchanges,\n stopRecordingExchanges,\n clearRecordedExchanges,\n startListening,\n stopListening,\n startDiscovering,\n stopDiscovering,\n connectDevice: discoveryCommands.connectDeviceCommand,\n getProvider: providerCommands.getProviderCommand,\n setProvider: providerCommands.setProviderCommand,\n sendApdu: apduCommands.sendApduCommand,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useConnectorMessages_exports", "__export", "useConnectorMessages", "__toCommonJS", "import_react", "import_device_management_kit_devtools_core", "import_commandDispatcher", "import_connectorMessageHandlers", "connector", "receivedMessages", "setReceivedMessages", "sentMessages", "setSentMessages", "logs", "setLogs", "connectedModules", "setConnectedModules", "connectedDevices", "setConnectedDevices", "sessionStates", "setSessionStates", "discoveredDevices", "setDiscoveredDevices", "isListening", "setIsListening", "isActivelyDiscovering", "setIsActivelyDiscovering", "providerValue", "setProviderValue", "apduResponses", "setApduResponses", "apduExchanges", "setApduExchanges", "isRecordingExchanges", "setIsRecordingExchanges", "isRecordingExchangesRef", "trackedConnector", "type", "payload", "prev", "unsubscribe", "discoveryCommands", "providerCommands", "apduCommands", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "clearLogs", "startRecordingExchanges", "stopRecordingExchanges", "clearRecordedExchanges", "isLoggerConnected", "isInspectorConnected"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var n=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var l=(a,o)=>{for(var s in o)n(a,s,{get:o[s],enumerable:!0})},m=(a,o,s,e)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of p(o))!i.call(a,t)&&t!==s&&n(a,t,{get:()=>o[t],enumerable:!(e=g(o,t))||e.enumerable});return a};var y=a=>m(n({},"__esModule",{value:!0}),a);var L={};l(L,{mapConnectorMessageToLogData:()=>D});module.exports=y(L);function D(a){const{timestamp:o,tag:s,verbosity:e,message:t,payloadJSON:r}=JSON.parse(a);return{timestamp:o,tag:s,verbosity:e,message:t,payloadJSON:r,payload:JSON.parse(r)}}0&&(module.exports={mapConnectorMessageToLogData});
|
|
2
2
|
//# sourceMappingURL=mapConnectorMessageToLogData.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/screens/logger/mapConnectorMessageToLogData.ts"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kCAAAE,IAAA,eAAAC,EAAAH,
|
|
6
|
-
"names": ["mapConnectorMessageToLogData_exports", "__export", "mapConnectorMessageToLogData", "__toCommonJS", "
|
|
4
|
+
"sourcesContent": ["import type { DevToolsLog, LogData } from \"./types\";\n\nexport function mapConnectorMessageToLogData(payload: string): LogData | null {\n const { timestamp, tag, verbosity, message, payloadJSON } = JSON.parse(\n payload,\n ) as DevToolsLog;\n return {\n timestamp,\n tag,\n verbosity,\n message,\n payloadJSON,\n // TODO: fix this type\n payload: JSON.parse(payloadJSON) as string | Record<string, unknown>,\n };\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kCAAAE,IAAA,eAAAC,EAAAH,GAEO,SAASE,EAA6BE,EAAiC,CAC5E,KAAM,CAAE,UAAAC,EAAW,IAAAC,EAAK,UAAAC,EAAW,QAAAC,EAAS,YAAAC,CAAY,EAAI,KAAK,MAC/DL,CACF,EACA,MAAO,CACL,UAAAC,EACA,IAAAC,EACA,UAAAC,EACA,QAAAC,EACA,YAAAC,EAEA,QAAS,KAAK,MAAMA,CAAW,CACjC,CACF",
|
|
6
|
+
"names": ["mapConnectorMessageToLogData_exports", "__export", "mapConnectorMessageToLogData", "__toCommonJS", "payload", "timestamp", "tag", "verbosity", "message", "payloadJSON"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var f=(e,i)=>{for(var r in i)t(e,r,{get:i[r],enumerable:!0})},m=(e,i,r,c)=>{if(i&&typeof i=="object"||typeof i=="function")for(let n of d(i))!s.call(e,n)&&n!==r&&t(e,n,{get:()=>i[n],enumerable:!(c=v(i,n))||c.enumerable});return e};var u=e=>m(t({},"__esModule",{value:!0}),e);var y={};f(y,{deviceConfigFromSession:()=>D});module.exports=u(y);var o=require("@ledgerhq/device-management-kit");const p="BOLOS",a=new o.StaticDeviceModelDataSource;function S(e){return"firmwareVersion"in e&&e.firmwareVersion?.os?e.firmwareVersion.os:"currentApp"in e&&e.currentApp?.name===p?e.currentApp.version:""}function D(e,i){if(!e)return{};const r=S(e),n={name:a.getDeviceModel({id:e.deviceModelId}).productName,device_type:e.deviceModelId,...i?{connectivity_type:i}:{},firmware_version:r};return e.sessionStateType===o.DeviceSessionStateType.Connected?n:{...n,...e.currentApp&&e.currentApp.name!==p?{apps:[{name:e.currentApp.name,version:e.currentApp.version}]}:{}}}0&&(module.exports={deviceConfigFromSession});
|
|
2
|
+
//# sourceMappingURL=deviceConfigFromSession.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/mock-capture/deviceConfigFromSession.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type ConnectedDevice,\n type DeviceSessionState,\n DeviceSessionStateType,\n StaticDeviceModelDataSource,\n} from \"@ledgerhq/device-management-kit\";\nimport { type DeviceConfig } from \"@ledgerhq/device-mockserver-client\";\n\ntype ConnectivityType = ConnectedDevice[\"type\"];\n\nconst DASHBOARD_APP_NAME = \"BOLOS\";\nconst deviceModelDataSource = new StaticDeviceModelDataSource();\n\nfunction firmwareVersionFromState(state: DeviceSessionState): string {\n if (\"firmwareVersion\" in state && state.firmwareVersion?.os) {\n return state.firmwareVersion.os;\n }\n if (\"currentApp\" in state && state.currentApp?.name === DASHBOARD_APP_NAME) {\n return state.currentApp.version;\n }\n return \"\";\n}\n\n/**\n * Builds a partial mock-server device config from a DMK device session state.\n *\n * The mock server's `device_type` values match the `DeviceModelId` enum values\n * (e.g. \"nanoX\", \"stax\"), so the model id is used directly. The `name` is the\n * commercial model name (e.g. \"Flex\", \"Gen 5\"). The optional `connectivityType`\n * (\"USB\" / \"BLE\") comes from the connected device. The `firmware_version` (SE\n * version) is always present, defaulting to an empty string until the session\n * is ready. The running app is only available once the session is ready.\n */\nexport function deviceConfigFromSession(\n state?: DeviceSessionState,\n connectivityType?: ConnectivityType,\n): Partial<DeviceConfig> {\n if (!state) {\n return {};\n }\n\n const firmwareVersion = firmwareVersionFromState(state);\n const deviceModel = deviceModelDataSource.getDeviceModel({\n id: state.deviceModelId,\n });\n\n const base: Partial<DeviceConfig> = {\n name: deviceModel.productName,\n device_type: state.deviceModelId,\n ...(connectivityType ? { connectivity_type: connectivityType } : {}),\n firmware_version: firmwareVersion,\n };\n\n if (state.sessionStateType === DeviceSessionStateType.Connected) {\n return base;\n }\n\n return {\n ...base,\n // The dashboard (BOLOS) is not an installed app, so it is never listed.\n ...(state.currentApp && state.currentApp.name !== DASHBOARD_APP_NAME\n ? {\n apps: [\n { name: state.currentApp.name, version: state.currentApp.version },\n ],\n }\n : {}),\n };\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAKO,2CAKP,MAAMC,EAAqB,QACrBC,EAAwB,IAAI,8BAElC,SAASC,EAAyBC,EAAmC,CACnE,MAAI,oBAAqBA,GAASA,EAAM,iBAAiB,GAChDA,EAAM,gBAAgB,GAE3B,eAAgBA,GAASA,EAAM,YAAY,OAASH,EAC/CG,EAAM,WAAW,QAEnB,EACT,CAYO,SAASN,EACdM,EACAC,EACuB,CACvB,GAAI,CAACD,EACH,MAAO,CAAC,EAGV,MAAME,EAAkBH,EAAyBC,CAAK,EAKhDG,EAA8B,CAClC,KALkBL,EAAsB,eAAe,CACvD,GAAIE,EAAM,aACZ,CAAC,EAGmB,YAClB,YAAaA,EAAM,cACnB,GAAIC,EAAmB,CAAE,kBAAmBA,CAAiB,EAAI,CAAC,EAClE,iBAAkBC,CACpB,EAEA,OAAIF,EAAM,mBAAqB,yBAAuB,UAC7CG,EAGF,CACL,GAAGA,EAEH,GAAIH,EAAM,YAAcA,EAAM,WAAW,OAASH,EAC9C,CACE,KAAM,CACJ,CAAE,KAAMG,EAAM,WAAW,KAAM,QAASA,EAAM,WAAW,OAAQ,CACnE,CACF,EACA,CAAC,CACP,CACF",
|
|
6
|
+
"names": ["deviceConfigFromSession_exports", "__export", "deviceConfigFromSession", "__toCommonJS", "import_device_management_kit", "DASHBOARD_APP_NAME", "deviceModelDataSource", "firmwareVersionFromState", "state", "connectivityType", "firmwareVersion", "base"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var d=(e,n)=>{for(var o in n)r(e,o,{get:n[o],enumerable:!0})},f=(e,n,o,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of p(n))!u.call(e,t)&&t!==o&&r(e,t,{get:()=>n[t],enumerable:!(i=c(n,t))||i.enumerable});return e};var l=e=>f(r({},"__esModule",{value:!0}),e);var D={};d(D,{generateMultiDeviceSessionExport:()=>C,generateSessionExport:()=>v});module.exports=l(D);const g=["e0010000","b0010000"];function x(e){return g.some(n=>e.startsWith(n))}function E(e){return e.every(o=>o===e[0])?e.slice(0,1):e}function h(e,n){const o=new Map;for(const i of e){const t=i.apdu.toLowerCase();if(!n&&x(t))continue;const s=o.get(t)??[];s.push(i.response.toLowerCase()),o.set(t,s)}return[...o.entries()].map(([i,t])=>({prefix:i,responses:E(t)}))}function a(e,n,o){const i=h(n,o),{name:t,...s}=e;return{...t!==void 0?{name:t}:{},...s,mocks:i}}function v(e,n={},o={}){return{devices:[a(n,e,o.includeHandshake??!1)]}}function C(e,n={}){const o=n.includeHandshake??!1;return{devices:e.map(({device:i,exchanges:t})=>a(i,t,o))}}0&&(module.exports={generateMultiDeviceSessionExport,generateSessionExport});
|
|
2
|
+
//# sourceMappingURL=generateSessionExport.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/mock-capture/generateSessionExport.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceConfig,\n type MockConfig,\n type SessionExport,\n} from \"@ledgerhq/device-mockserver-client\";\n\nimport { type ApduExchange } from \"../../hooks/useConnectorMessages\";\n\n/**\n * APDU prefixes the mock server synthesizes from device metadata when no\n * explicit mock matches (GetOsVersion, GetAppAndVersion). They are excluded by\n * default so the generated session relies on the device config for handshakes.\n */\nconst HANDSHAKE_PREFIXES = [\"e0010000\", \"b0010000\"];\n\nexport type GenerateSessionExportOptions = {\n /** Include the handshake APDUs (GetOsVersion / GetAppAndVersion) as mocks. */\n includeHandshake?: boolean;\n};\n\nfunction isHandshake(prefix: string): boolean {\n return HANDSHAKE_PREFIXES.some((handshake) => prefix.startsWith(handshake));\n}\n\n/**\n * Collapses a list of responses to a single entry when they are all identical,\n * keeping the ordered sequence otherwise (the mock server serves responses in\n * order and loops once exhausted).\n */\nfunction dedupeResponses(responses: string[]): string[] {\n const allIdentical = responses.every((r) => r === responses[0]);\n return allIdentical ? responses.slice(0, 1) : responses;\n}\n\nfunction buildMocks(\n exchanges: ApduExchange[],\n includeHandshake: boolean,\n): MockConfig[] {\n const responsesByPrefix = new Map<string, string[]>();\n\n for (const exchange of exchanges) {\n const prefix = exchange.apdu.toLowerCase();\n if (!includeHandshake && isHandshake(prefix)) {\n continue;\n }\n const responses = responsesByPrefix.get(prefix) ?? [];\n responses.push(exchange.response.toLowerCase());\n responsesByPrefix.set(prefix, responses);\n }\n\n return [...responsesByPrefix.entries()].map(([prefix, responses]) => ({\n prefix,\n responses: dedupeResponses(responses),\n }));\n}\n\n/**\n * A device and the APDU exchanges captured from it, used to build one entry of\n * the session export.\n */\nexport type DeviceCaptureGroup = {\n device: Partial<DeviceConfig>;\n exchanges: ApduExchange[];\n};\n\n/**\n * Builds a single device config (metadata + derived mocks).\n */\nfunction buildDeviceConfig(\n device: Partial<DeviceConfig>,\n exchanges: ApduExchange[],\n includeHandshake: boolean,\n): Partial<DeviceConfig> {\n const mocks = buildMocks(exchanges, includeHandshake);\n const { name, ...rest } = device;\n return {\n ...(name !== undefined ? { name } : {}),\n ...rest,\n mocks,\n };\n}\n\n/**\n * Derives a mock-server session export from captured APDU exchanges.\n *\n * Each unique request APDU becomes a mock whose `prefix` is the full request\n * hex (so the server matches it exactly), and whose `responses` replay the\n * captured responses in order.\n *\n * @param exchanges Captured APDU exchanges.\n * @param device Device metadata to attach (name, device_type, firmware...).\n * @param options Generation options.\n */\nexport function generateSessionExport(\n exchanges: ApduExchange[],\n device: Partial<DeviceConfig> = {},\n options: GenerateSessionExportOptions = {},\n): SessionExport {\n return {\n devices: [\n buildDeviceConfig(device, exchanges, options.includeHandshake ?? false),\n ],\n };\n}\n\n/**\n * Derives a mock-server session export from several devices, each with its own\n * captured exchanges. Used when more than one device was active during the\n * recording so each gets a distinct entry instead of being merged together.\n *\n * @param groups One device + its exchanges per connected device.\n * @param options Generation options.\n */\nexport function generateMultiDeviceSessionExport(\n groups: DeviceCaptureGroup[],\n options: GenerateSessionExportOptions = {},\n): SessionExport {\n const includeHandshake = options.includeHandshake ?? false;\n return {\n devices: groups.map(({ device, exchanges }) =>\n buildDeviceConfig(device, exchanges, includeHandshake),\n ),\n };\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sCAAAE,EAAA,0BAAAC,IAAA,eAAAC,EAAAJ,GAaA,MAAMK,EAAqB,CAAC,WAAY,UAAU,EAOlD,SAASC,EAAYC,EAAyB,CAC5C,OAAOF,EAAmB,KAAMG,GAAcD,EAAO,WAAWC,CAAS,CAAC,CAC5E,CAOA,SAASC,EAAgBC,EAA+B,CAEtD,OADqBA,EAAU,MAAOC,GAAMA,IAAMD,EAAU,CAAC,CAAC,EACxCA,EAAU,MAAM,EAAG,CAAC,EAAIA,CAChD,CAEA,SAASE,EACPC,EACAC,EACc,CACd,MAAMC,EAAoB,IAAI,IAE9B,UAAWC,KAAYH,EAAW,CAChC,MAAMN,EAASS,EAAS,KAAK,YAAY,EACzC,GAAI,CAACF,GAAoBR,EAAYC,CAAM,EACzC,SAEF,MAAMG,EAAYK,EAAkB,IAAIR,CAAM,GAAK,CAAC,EACpDG,EAAU,KAAKM,EAAS,SAAS,YAAY,CAAC,EAC9CD,EAAkB,IAAIR,EAAQG,CAAS,CACzC,CAEA,MAAO,CAAC,GAAGK,EAAkB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAACR,EAAQG,CAAS,KAAO,CACpE,OAAAH,EACA,UAAWE,EAAgBC,CAAS,CACtC,EAAE,CACJ,CAcA,SAASO,EACPC,EACAL,EACAC,EACuB,CACvB,MAAMK,EAAQP,EAAWC,EAAWC,CAAgB,EAC9C,CAAE,KAAAM,EAAM,GAAGC,CAAK,EAAIH,EAC1B,MAAO,CACL,GAAIE,IAAS,OAAY,CAAE,KAAAA,CAAK,EAAI,CAAC,EACrC,GAAGC,EACH,MAAAF,CACF,CACF,CAaO,SAAShB,EACdU,EACAK,EAAgC,CAAC,EACjCI,EAAwC,CAAC,EAC1B,CACf,MAAO,CACL,QAAS,CACPL,EAAkBC,EAAQL,EAAWS,EAAQ,kBAAoB,EAAK,CACxE,CACF,CACF,CAUO,SAASpB,EACdqB,EACAD,EAAwC,CAAC,EAC1B,CACf,MAAMR,EAAmBQ,EAAQ,kBAAoB,GACrD,MAAO,CACL,QAASC,EAAO,IAAI,CAAC,CAAE,OAAAL,EAAQ,UAAAL,CAAU,IACvCI,EAAkBC,EAAQL,EAAWC,CAAgB,CACvD,CACF,CACF",
|
|
6
|
+
"names": ["generateSessionExport_exports", "__export", "generateMultiDeviceSessionExport", "generateSessionExport", "__toCommonJS", "HANDSHAKE_PREFIXES", "isHandshake", "prefix", "handshake", "dedupeResponses", "responses", "r", "buildMocks", "exchanges", "includeHandshake", "responsesByPrefix", "exchange", "buildDeviceConfig", "device", "mocks", "name", "rest", "options", "groups"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("vitest"),t=require("./generateSessionExport");const a=(s,c)=>({apdu:s,response:c,sessionId:"session-1",timestamp:"2026-06-29T00:00:00.000Z"});(0,e.describe)("generateSessionExport",()=>{(0,e.it)("creates one mock per unique APDU with the full APDU as prefix",()=>{const s=(0,t.generateSessionExport)([a("e004000005","deadbeef9000"),a("e006000000","9000")]);(0,e.expect)(s.devices).toHaveLength(1),(0,e.expect)(s.devices[0]?.mocks).toEqual([{prefix:"e004000005",responses:["deadbeef9000"]},{prefix:"e006000000",responses:["9000"]}])}),(0,e.it)("accumulates differing responses for the same APDU in order",()=>{const s=(0,t.generateSessionExport)([a("e004000000","aa9000"),a("e004000000","6985"),a("e004000000","bb9000")]);(0,e.expect)(s.devices[0]?.mocks).toEqual([{prefix:"e004000000",responses:["aa9000","6985","bb9000"]}])}),(0,e.it)("collapses identical repeated responses to a single entry",()=>{const s=(0,t.generateSessionExport)([a("e004000000","aa9000"),a("e004000000","aa9000")]);(0,e.expect)(s.devices[0]?.mocks).toEqual([{prefix:"e004000000",responses:["aa9000"]}])}),(0,e.it)("lowercases prefixes and responses",()=>{const s=(0,t.generateSessionExport)([a("E004000000","AA9000")]);(0,e.expect)(s.devices[0]?.mocks).toEqual([{prefix:"e004000000",responses:["aa9000"]}])}),(0,e.it)("skips handshake APDUs by default",()=>{const s=(0,t.generateSessionExport)([a("e001000000","33000004deadbeef9000"),a("b001000000","0105424f4c4f539000"),a("e004000000","aa9000")]);(0,e.expect)(s.devices[0]?.mocks).toEqual([{prefix:"e004000000",responses:["aa9000"]}])}),(0,e.it)("includes handshake APDUs when requested",()=>{const s=(0,t.generateSessionExport)([a("e001000000","33000004deadbeef9000"),a("e004000000","aa9000")],{},{includeHandshake:!0});(0,e.expect)(s.devices[0]?.mocks).toHaveLength(2)}),(0,e.it)("attaches the provided device metadata",()=>{const s=(0,t.generateSessionExport)([a("e004000000","aa9000")],{name:"Captured Device",device_type:"nanoX",firmware_version:"2.2.3"});(0,e.expect)(s.devices[0]).toMatchObject({name:"Captured Device",device_type:"nanoX",firmware_version:"2.2.3"})}),(0,e.it)("places name as the first key of the device",()=>{const s=(0,t.generateSessionExport)([a("e004000000","aa9000")],{device_type:"nanoX",firmware_version:"2.2.3",name:"Captured Device"});(0,e.expect)(Object.keys(s.devices[0])[0]).toBe("name")}),(0,e.it)("produces an empty mocks list when there are no exchanges",()=>{const s=(0,t.generateSessionExport)([]);(0,e.expect)(s.devices[0]?.mocks).toEqual([])})});(0,e.describe)("generateMultiDeviceSessionExport",()=>{(0,e.it)("keeps one device entry per group with its own mocks",()=>{const s=(0,t.generateMultiDeviceSessionExport)([{device:{name:"Device A",device_type:"flex"},exchanges:[a("e004000000","aa9000")]},{device:{name:"Device B",device_type:"stax"},exchanges:[a("e006000000","bb9000")]}]);(0,e.expect)(s.devices).toHaveLength(2),(0,e.expect)(s.devices[0]).toMatchObject({name:"Device A",device_type:"flex",mocks:[{prefix:"e004000000",responses:["aa9000"]}]}),(0,e.expect)(s.devices[1]).toMatchObject({name:"Device B",device_type:"stax",mocks:[{prefix:"e006000000",responses:["bb9000"]}]})}),(0,e.it)("does not merge mocks across devices",()=>{const s=(0,t.generateMultiDeviceSessionExport)([{device:{name:"A"},exchanges:[a("e004000000","aa9000")]},{device:{name:"B"},exchanges:[a("e004000000","bb9000")]}]);(0,e.expect)(s.devices[0]?.mocks).toEqual([{prefix:"e004000000",responses:["aa9000"]}]),(0,e.expect)(s.devices[1]?.mocks).toEqual([{prefix:"e004000000",responses:["bb9000"]}])})});
|
|
2
|
+
//# sourceMappingURL=generateSessionExport.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/mock-capture/generateSessionExport.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\nimport { type ApduExchange } from \"../../hooks/useConnectorMessages\";\nimport {\n generateMultiDeviceSessionExport,\n generateSessionExport,\n} from \"./generateSessionExport\";\n\nconst exchange = (apdu: string, response: string): ApduExchange => ({\n apdu,\n response,\n sessionId: \"session-1\",\n timestamp: \"2026-06-29T00:00:00.000Z\",\n});\n\ndescribe(\"generateSessionExport\", () => {\n it(\"creates one mock per unique APDU with the full APDU as prefix\", () => {\n const result = generateSessionExport([\n exchange(\"e004000005\", \"deadbeef9000\"),\n exchange(\"e006000000\", \"9000\"),\n ]);\n\n expect(result.devices).toHaveLength(1);\n expect(result.devices[0]?.mocks).toEqual([\n { prefix: \"e004000005\", responses: [\"deadbeef9000\"] },\n { prefix: \"e006000000\", responses: [\"9000\"] },\n ]);\n });\n\n it(\"accumulates differing responses for the same APDU in order\", () => {\n const result = generateSessionExport([\n exchange(\"e004000000\", \"aa9000\"),\n exchange(\"e004000000\", \"6985\"),\n exchange(\"e004000000\", \"bb9000\"),\n ]);\n\n expect(result.devices[0]?.mocks).toEqual([\n { prefix: \"e004000000\", responses: [\"aa9000\", \"6985\", \"bb9000\"] },\n ]);\n });\n\n it(\"collapses identical repeated responses to a single entry\", () => {\n const result = generateSessionExport([\n exchange(\"e004000000\", \"aa9000\"),\n exchange(\"e004000000\", \"aa9000\"),\n ]);\n\n expect(result.devices[0]?.mocks).toEqual([\n { prefix: \"e004000000\", responses: [\"aa9000\"] },\n ]);\n });\n\n it(\"lowercases prefixes and responses\", () => {\n const result = generateSessionExport([exchange(\"E004000000\", \"AA9000\")]);\n\n expect(result.devices[0]?.mocks).toEqual([\n { prefix: \"e004000000\", responses: [\"aa9000\"] },\n ]);\n });\n\n it(\"skips handshake APDUs by default\", () => {\n const result = generateSessionExport([\n exchange(\"e001000000\", \"33000004deadbeef9000\"),\n exchange(\"b001000000\", \"0105424f4c4f539000\"),\n exchange(\"e004000000\", \"aa9000\"),\n ]);\n\n expect(result.devices[0]?.mocks).toEqual([\n { prefix: \"e004000000\", responses: [\"aa9000\"] },\n ]);\n });\n\n it(\"includes handshake APDUs when requested\", () => {\n const result = generateSessionExport(\n [\n exchange(\"e001000000\", \"33000004deadbeef9000\"),\n exchange(\"e004000000\", \"aa9000\"),\n ],\n {},\n { includeHandshake: true },\n );\n\n expect(result.devices[0]?.mocks).toHaveLength(2);\n });\n\n it(\"attaches the provided device metadata\", () => {\n const result = generateSessionExport([exchange(\"e004000000\", \"aa9000\")], {\n name: \"Captured Device\",\n device_type: \"nanoX\",\n firmware_version: \"2.2.3\",\n });\n\n expect(result.devices[0]).toMatchObject({\n name: \"Captured Device\",\n device_type: \"nanoX\",\n firmware_version: \"2.2.3\",\n });\n });\n\n it(\"places name as the first key of the device\", () => {\n const result = generateSessionExport([exchange(\"e004000000\", \"aa9000\")], {\n device_type: \"nanoX\",\n firmware_version: \"2.2.3\",\n name: \"Captured Device\",\n });\n\n expect(Object.keys(result.devices[0]!)[0]).toBe(\"name\");\n });\n\n it(\"produces an empty mocks list when there are no exchanges\", () => {\n const result = generateSessionExport([]);\n\n expect(result.devices[0]?.mocks).toEqual([]);\n });\n});\n\ndescribe(\"generateMultiDeviceSessionExport\", () => {\n it(\"keeps one device entry per group with its own mocks\", () => {\n const result = generateMultiDeviceSessionExport([\n {\n device: { name: \"Device A\", device_type: \"flex\" },\n exchanges: [exchange(\"e004000000\", \"aa9000\")],\n },\n {\n device: { name: \"Device B\", device_type: \"stax\" },\n exchanges: [exchange(\"e006000000\", \"bb9000\")],\n },\n ]);\n\n expect(result.devices).toHaveLength(2);\n expect(result.devices[0]).toMatchObject({\n name: \"Device A\",\n device_type: \"flex\",\n mocks: [{ prefix: \"e004000000\", responses: [\"aa9000\"] }],\n });\n expect(result.devices[1]).toMatchObject({\n name: \"Device B\",\n device_type: \"stax\",\n mocks: [{ prefix: \"e006000000\", responses: [\"bb9000\"] }],\n });\n });\n\n it(\"does not merge mocks across devices\", () => {\n const result = generateMultiDeviceSessionExport([\n { device: { name: \"A\" }, exchanges: [exchange(\"e004000000\", \"aa9000\")] },\n { device: { name: \"B\" }, exchanges: [exchange(\"e004000000\", \"bb9000\")] },\n ]);\n\n expect(result.devices[0]?.mocks).toEqual([\n { prefix: \"e004000000\", responses: [\"aa9000\"] },\n ]);\n expect(result.devices[1]?.mocks).toEqual([\n { prefix: \"e004000000\", responses: [\"bb9000\"] },\n ]);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_vitest", "import_generateSessionExport", "exchange", "apdu", "response", "result"]
|
|
7
|
+
}
|