@ledgerhq/device-trusted-app-kit-ledger-keyring-protocol 0.0.0-develop-20250813001300 → 0.0.0-develop-20250814001249
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/cjs/api/LedgerKeyringProtocol.js +1 -1
- package/lib/cjs/api/LedgerKeyringProtocol.js.map +1 -1
- package/lib/cjs/api/LedgerKeyringProtocolBuilder.js +1 -1
- package/lib/cjs/api/LedgerKeyringProtocolBuilder.js.map +2 -2
- package/lib/cjs/api/app-binder/AddToTrustchainDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/AddToTrustchainDeviceActionTypes.js.map +3 -3
- package/lib/cjs/api/app-binder/AuthenticateDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/AuthenticateDeviceActionTypes.js.map +3 -3
- package/lib/cjs/internal/DefaultLedgerKeyringProtocol.js +1 -1
- package/lib/cjs/internal/DefaultLedgerKeyringProtocol.js.map +3 -3
- package/lib/cjs/internal/app-binder/LedgerKeyringProtocolBinder.js +1 -1
- package/lib/cjs/internal/app-binder/LedgerKeyringProtocolBinder.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/AddToTrustchainDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/AddToTrustchainDeviceAction.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/AuthenticateTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/AuthenticateTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/ExtractEncryptionKeyTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/ExtractEncryptionKeyTask.js.map +7 -0
- package/lib/cjs/internal/di.js +1 -1
- package/lib/cjs/internal/di.js.map +3 -3
- package/lib/cjs/internal/externalTypes.js +1 -1
- package/lib/cjs/internal/externalTypes.js.map +2 -2
- package/lib/cjs/internal/lkrp-datasource/data/HttpLKRPDataSource.js +1 -1
- package/lib/cjs/internal/lkrp-datasource/data/HttpLKRPDataSource.js.map +3 -3
- package/lib/cjs/internal/lkrp-datasource/data/HttpLKRPDataSource.test.js +1 -1
- package/lib/cjs/internal/lkrp-datasource/data/HttpLKRPDataSource.test.js.map +3 -3
- package/lib/cjs/internal/lkrp-datasource/data/LKRPDataSource.js.map +1 -1
- package/lib/cjs/internal/models/Types.js +1 -1
- package/lib/cjs/internal/models/Types.js.map +1 -1
- package/lib/cjs/internal/use-cases/authentication/AuthenticateUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/authentication/AuthenticateUseCase.js.map +3 -3
- package/lib/cjs/internal/utils/LKRPBlockStream.js +2 -2
- package/lib/cjs/internal/utils/LKRPBlockStream.js.map +3 -3
- package/lib/cjs/internal/utils/Trustchain.js +2 -0
- package/lib/cjs/internal/utils/Trustchain.js.map +7 -0
- package/lib/cjs/package.json +1 -0
- package/lib/esm/api/LedgerKeyringProtocolBuilder.js +1 -1
- package/lib/esm/api/LedgerKeyringProtocolBuilder.js.map +2 -2
- package/lib/esm/api/app-binder/AddToTrustchainDeviceActionTypes.js +1 -0
- package/lib/esm/api/app-binder/AddToTrustchainDeviceActionTypes.js.map +4 -4
- package/lib/esm/api/app-binder/AuthenticateDeviceActionTypes.js +1 -0
- package/lib/esm/api/app-binder/AuthenticateDeviceActionTypes.js.map +4 -4
- package/lib/esm/internal/DefaultLedgerKeyringProtocol.js +1 -1
- package/lib/esm/internal/DefaultLedgerKeyringProtocol.js.map +3 -3
- package/lib/esm/internal/app-binder/LedgerKeyringProtocolBinder.js +1 -1
- package/lib/esm/internal/app-binder/LedgerKeyringProtocolBinder.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/AddToTrustchainDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/AddToTrustchainDeviceAction.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js +2 -0
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js +2 -0
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.js +1 -0
- package/lib/esm/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js +1 -0
- package/lib/esm/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js.map +7 -0
- package/lib/esm/internal/app-binder/task/AuthenticateTask.js +2 -0
- package/lib/esm/internal/app-binder/task/AuthenticateTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/ExtractEncryptionKeyTask.js +2 -0
- package/lib/esm/internal/app-binder/task/ExtractEncryptionKeyTask.js.map +7 -0
- package/lib/esm/internal/di.js +1 -1
- package/lib/esm/internal/di.js.map +3 -3
- package/lib/esm/internal/externalTypes.js +1 -1
- package/lib/esm/internal/externalTypes.js.map +2 -2
- package/lib/esm/internal/lkrp-datasource/data/HttpLKRPDataSource.js +1 -1
- package/lib/esm/internal/lkrp-datasource/data/HttpLKRPDataSource.js.map +3 -3
- package/lib/esm/internal/lkrp-datasource/data/HttpLKRPDataSource.test.js +1 -1
- package/lib/esm/internal/lkrp-datasource/data/HttpLKRPDataSource.test.js.map +3 -3
- package/lib/esm/internal/use-cases/authentication/AuthenticateUseCase.js +1 -1
- package/lib/esm/internal/use-cases/authentication/AuthenticateUseCase.js.map +3 -3
- package/lib/esm/internal/utils/LKRPBlockStream.js +2 -2
- package/lib/esm/internal/utils/LKRPBlockStream.js.map +3 -3
- package/lib/esm/internal/utils/Trustchain.js +2 -0
- package/lib/esm/internal/utils/Trustchain.js.map +7 -0
- package/lib/esm/package.json +1 -0
- package/lib/types/api/LedgerKeyringProtocol.d.ts +2 -2
- package/lib/types/api/LedgerKeyringProtocol.d.ts.map +1 -1
- package/lib/types/api/LedgerKeyringProtocolBuilder.d.ts +1 -3
- package/lib/types/api/LedgerKeyringProtocolBuilder.d.ts.map +1 -1
- package/lib/types/api/app-binder/AddToTrustchainDeviceActionTypes.d.ts +16 -6
- package/lib/types/api/app-binder/AddToTrustchainDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/app-binder/AuthenticateDeviceActionTypes.d.ts +25 -29
- package/lib/types/api/app-binder/AuthenticateDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/internal/DefaultLedgerKeyringProtocol.d.ts +5 -5
- package/lib/types/internal/DefaultLedgerKeyringProtocol.d.ts.map +1 -1
- package/lib/types/internal/app-binder/LedgerKeyringProtocolBinder.d.ts +8 -4
- package/lib/types/internal/app-binder/LedgerKeyringProtocolBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/AddToTrustchainDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.d.ts +29 -0
- package/lib/types/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.d.ts +30 -0
- package/lib/types/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.d.ts +19 -0
- package/lib/types/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.d.ts +16 -0
- package/lib/types/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/AuthenticateTask.d.ts +9 -0
- package/lib/types/internal/app-binder/task/AuthenticateTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ExtractEncryptionKeyTask.d.ts +11 -0
- package/lib/types/internal/app-binder/task/ExtractEncryptionKeyTask.d.ts.map +1 -0
- package/lib/types/internal/di.d.ts +2 -3
- package/lib/types/internal/di.d.ts.map +1 -1
- package/lib/types/internal/externalTypes.d.ts +0 -1
- package/lib/types/internal/externalTypes.d.ts.map +1 -1
- package/lib/types/internal/lkrp-datasource/data/HttpLKRPDataSource.d.ts +2 -4
- package/lib/types/internal/lkrp-datasource/data/HttpLKRPDataSource.d.ts.map +1 -1
- package/lib/types/internal/lkrp-datasource/data/LKRPDataSource.d.ts +1 -1
- package/lib/types/internal/lkrp-datasource/data/LKRPDataSource.d.ts.map +1 -1
- package/lib/types/internal/models/Types.d.ts +0 -4
- package/lib/types/internal/models/Types.d.ts.map +1 -1
- package/lib/types/internal/use-cases/authentication/AuthenticateUseCase.d.ts +13 -1
- package/lib/types/internal/use-cases/authentication/AuthenticateUseCase.d.ts.map +1 -1
- package/lib/types/internal/utils/LKRPBlockStream.d.ts +1 -2
- package/lib/types/internal/utils/LKRPBlockStream.d.ts.map +1 -1
- package/lib/types/internal/utils/Trustchain.d.ts +14 -0
- package/lib/types/internal/utils/Trustchain.d.ts.map +1 -0
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/lib/cjs/internal/app-binder/device-action/AuthenticateDeviceAction.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/AuthenticateDeviceAction.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/AuthenticateDeviceAction.js +0 -2
- package/lib/esm/internal/app-binder/device-action/AuthenticateDeviceAction.js.map +0 -7
- package/lib/types/internal/app-binder/device-action/AuthenticateDeviceAction.d.ts +0 -42
- package/lib/types/internal/app-binder/device-action/AuthenticateDeviceAction.d.ts.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{hexaStringToBuffer as
|
|
1
|
+
import{hexaStringToBuffer as T,UserInteractionRequired as u,XStateDeviceAction as D}from"@ledgerhq/device-management-kit";import{EitherAsync as l,Left as A,Right as E}from"purify-ts";import{assign as p,fromPromise as m,setup as g}from"xstate";import{AddToTrustchainDAState as S,AddToTrustchaineDAStep as d}from"../../../api/app-binder/AddToTrustchainDeviceActionTypes";import{LKRPTrustchainNotReady as k,LKRPUnknownError as I}from"../../../api/app-binder/Errors";import{InitTask as b}from"../../app-binder/task/InitTask";import{ParseStreamToDeviceTask as f}from"../../app-binder/task/ParseStreamToDeviceTask";import{SignBlockTask as M}from"../../app-binder/task/SignBlockTask";import{eitherSeqRecord as h}from"../../utils/eitherSeqRecord";import{required as i}from"../../utils/required";import{raiseAndAssign as c}from"./utils/raiseAndAssign";class F extends D{makeStateMachine(n){const{initCommand:s,parseStream:o,signBlock:y}=this.extractDependencies(n);return g({types:{input:{},context:{},output:{}},actors:{initCommand:m(s),parseStream:m(o),signBlock:m(y)},actions:{assignErrorFromEvent:c(({event:t})=>A(new I(String(t.error))))},guards:{isTustchainEmpty:({context:t})=>t.input.toMaybe().chain(e=>e.trustchain.getAppStream(e.appId)).chain(e=>e.parse().toMaybe()).map(e=>e.length===0).orDefault(!0)}}).createMachine({id:"AddToTrustchainDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:u.None},_internalState:E({sessionKeypair:null})}),initial:"InitSession",states:{InitSession:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.Initialize}}),on:{success:"ParseStream",error:"Error"},invoke:{id:"initCommand",src:"initCommand",onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(e=>({raise:"success",assign:{sessionKeypair:e}})))}}},ParseStream:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.ParseStream}}),on:{success:"CheckApplicationStreamExist",error:"Error"},invoke:{id:"parseStream",src:"parseStream",input:({context:t})=>t.input.chain(e=>h({seedBlock:()=>i(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).extract()?.[0],"Missing seed block to parse"),applicationStream:()=>i(e.trustchain.getAppStream(e.appId).extract(),"Missing application stream to parse")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},CheckApplicationStreamExist:{always:[{target:"AddToNewStream",guard:"isTustchainEmpty"},{target:"AddToExistingStream"}]},AddToExistingStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>{const r=e.trustchain.getAppStream(e.appId);return h({lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:a})=>i(a,"Missing session keypair")),path:()=>i(r.chain(a=>a.getPath()).extract(),"Missing application path"),parent:()=>i(r.chain(a=>a.parse().toMaybe()).chainNullable(a=>a.at(-1)?.hash()).chainNullable(T).extract(),"Missing parent block"),blockFlow:{type:"addMember",data:{name:e.clientName,publicKey:e.keypair.pubKeyToU8a(),permissions:e.permissions}}})}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},AddToNewStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>h({lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:r})=>i(r,"Missing session keypair")),path:`m/0'/${e.appId}'/0'`,parent:()=>i(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).chainNullable(r=>r[0]?.hash()).chainNullable(T).extract(),"Missing init block"),blockFlow:{type:"derive",data:{name:e.clientName,publicKey:e.keypair.pubKeyToU8a(),permissions:e.permissions}}}).chain(()=>A(new k))),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.map(e=>{})})}extractDependencies(n){return{initCommand:()=>new b(n).run(),parseStream:async s=>l.liftEither(s.input).chain(o=>new f(n).run(o)).run(),signBlock:s=>l.liftEither(s.input).chain(o=>new M(n).run(o)).run()}}}export{F as AddToTrustchainDeviceAction};
|
|
2
2
|
//# sourceMappingURL=AddToTrustchainDeviceAction.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/device-action/AddToTrustchainDeviceAction.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type DeviceActionStateMachine,\n hexaStringToBuffer,\n type InternalApi,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Left, Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type AddToTrustchainDAError,\n type AddToTrustchainDAInput,\n type AddToTrustchainDAIntermediateValue,\n type AddToTrustchainDAInternalState,\n type AddToTrustchainDAOutput,\n} from \"@api/app-binder/AddToTrustchainDeviceActionTypes\";\nimport {\n LKRPTrustchainNotReady,\n LKRPUnknownError,\n} from \"@api/app-binder/Errors\";\nimport { type Keypair } from \"@api/index\";\nimport { type LKRPDeviceCommandError } from \"@internal/app-binder/command/utils/ledgerKeyringProtocolErrors\";\nimport { InitTask } from \"@internal/app-binder/task/InitTask\";\nimport {\n ParseStreamToDeviceTask,\n type ParseStreamToDeviceTaskInput,\n} from \"@internal/app-binder/task/ParseStreamToDeviceTask\";\nimport {\n SignBlockTask,\n type SignBlockTaskInput,\n} from \"@internal/app-binder/task/SignBlockTask\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\nimport { required } from \"@internal/utils/required\";\n\nimport { raiseAndAssign } from \"./utils/raiseAndAssign\";\n\nexport class AddToTrustchainDeviceAction extends XStateDeviceAction<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n > {\n type types = StateMachineTypes<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n >;\n\n const { initCommand, parseStream, signBlock } =\n this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n\n actors: {\n initCommand: fromPromise(initCommand),\n parseStream: fromPromise(parseStream),\n signBlock: fromPromise(signBlock),\n },\n\n actions: {\n assignErrorFromEvent: raiseAndAssign(\n ({ event }) =>\n Left(\n new LKRPUnknownError(\n String((event as { error?: unknown }).error),\n ),\n ), // NOTE: it should never happen, the error is not typed anymore here\n ),\n },\n\n guards: {\n isTustchainEmpty: ({ context }) =>\n context.input\n .toMaybe()\n .chain((input) => input.applicationStream.parse().toMaybe())\n .map((blocks) => blocks.length === 0)\n .orDefault(true),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QEEIQCoHt0CcCusALgMYAWAhgJYB2AImAG6XFjLGGWbUB0AktZUIBlOLE7UAxBC5huNBpgDWsmoIDCmALaby1CAG0ADAF1EoAA6YxHLmZAAPRAEZDAdm6unAFgAcAJi9PLwA2PycAVmCAGhAAT0QAZhDucJDXAE5XcO9wsOCAX3yY1AxsfCIyKjpGZlZ2cT4BYVFxCTAcHEwcbnMAG3JCADMuzTkmjW1dAxM7S2txO0cEdPTuMMN0hKcEnycMwx9ouMQ-cITuDYTg1wOb4PScwuK0LFwCEgoaeiYWNhsefiCESwMRcCSwPDEFggoymJAgOaCBbwpYJVLcBKuLwrQx+dJnbZeGLxBAJALcLxOYLhHGGFx+BJPEAlV7lD5Vb61P4NQHNEGtdqdHCw2ZWJG2FGJdGY7HpXH4rZJYmIXx+NaywKbBk3VyMorMl5ld6VL41X71LjcAAK5BwsDAQkIODA5E0UhkYwUyh6tvtjudrpF8MR-0WiDOwW4wT2ex8CTJ122yoQYR8FzSPkyEWyXiuTJZRoqn2qPzq-2tvodTpdbsFXR6-SGIx9dqrAc0QYsYtDkoQuUjNNcwUC4V2up8yac5JpV2CCTcVJ8XgZ+cNbyLHLNZYaNtb-pr4Mh0NgnYR3eRoCWrlcad1udcpxWu0xyb8fkM3CpwWCBzlSR8o5eKupTruypqltylq7n61aum0HRdKeIYXg4iDXreSSYo+6TPq4yZoucWIrF4dLxlcaLAayxrFpy5rlmopBgMQijIOYfTMAM4j7q6ACi9iUEQEhIeeEqXs4VJeCkN5+D4D4-ocESvm+3APNSP6+GSETpAU+oFqBJollyFo8AxTEsWxvQcf83GaHxAmEEJThwl28yiahCBOE4hwYoYvi+D4dIHLiyYALRTu4bh4mcN43psAGUYWYGGXRDQFnZRA0FANnutQKjUF6shiFA1AAEK9JgzHCa51Bhh5XjLtwAWBIYwQARJU6hXikm5CEnleOEWSUk4CX6TRW6QTwaX8Rl1BZbBtYId0fQDMMOCjEVpXlZVMzBiJNW9t4DKfpEpy7JEmbaaFOxqgk6Tvp5A1-vVerPCBbIGbR26WlN9mZdlEJQqIVXivtYkecOapZD4sleYYhgDd+nUZBSlKpNDWG5CN71jRBxncD9M1ze28FCsDPZg1S4ThBc773IE843IpxwIGFBweLdGyyZhByyVj1Gbrj5YFgAcmAADu2XSLlnpKIVlDFWVFWKGTKFLIdkZDjs2ZtS+zOYh4NxwxkAXpNicZ8xu4FGULhqixL80k-Wy1Nmt3AbYr23OWe1W1d4ewYps0ZTpsmxZKFvhrOEdLXg8LgtbdFtJZ9E347b4v-UeQM7S5IO+xDHijtpgR+PciPM94kZuLieK3XiRvpInH3jXjIvpw7dbCtn3u5wd1LU7iLWm7qVdMySYSSZSpzeDsngl1OhT6tQmAQHAdh6djAvWyhyFuUsYXh-cjUPE+ThxW+w26WuG9Wyllq8sCoKg935PuYEyb1ZJKwrAEERxtkWSNxxlvKClYbKih9r2QI7hKQkSjhsM4pt8JUgpF-KkaJNj1XCIAzet8TKMWYqxdixBOJcBsulQg4Ce5gzlE4A2mEGRPlNgkJSH5vx9xuNiOGYRXDYJvl9SahpyF-XmpQl+atMSRm2KmNwAFUhlxJCFd85x4yjnHpPQIvheHJX4anUodswG7QgRTK4qxoyGB2GbN8qZJzkgeLsH80ZNjw2hlo5OeMhCZxBKI1Wzg4yrBajSe6A1erhE6gFKMDwBrbHxP1O8rjm7lh4otbxu9fEDRSFqUcUNIgHFCi4VYOE5Q4RahsRcOlChAA */\n\n id: \"AddToTrustchainDeviceAction\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: Right({\n sessionKeypair: null,\n }),\n }),\n\n initial: \"InitSession\",\n states: {\n InitSession: {\n on: { success: \"ParseStream\", error: \"Error\" },\n invoke: {\n id: \"initCommand\",\n src: \"initCommand\",\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map((sessionKeypair) => ({\n raise: \"success\",\n assign: { sessionKeypair },\n })),\n ),\n },\n },\n },\n\n ParseStream: {\n on: { success: \"CheckApplicationStreamExist\", error: \"Error\" },\n invoke: {\n id: \"parseStream\",\n src: \"parseStream\",\n input: ({ context }) =>\n context.input.chain((input) =>\n required(input.trustchain?.[\"m/\"], \"Missing root stream\")\n .chain((rootStream) => rootStream.parse())\n .chain((blocks) => required(blocks[0], \"Missing seed block\"))\n .map((seedBlock) => ({\n seedBlock,\n applicationStream: input.applicationStream,\n })),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n CheckApplicationStreamExist: {\n always: [\n { target: \"AddToNewStream\", guard: \"isTustchainEmpty\" },\n { target: \"AddToExistingStream\" },\n ],\n },\n\n AddToExistingStream: {\n on: { success: \"Success\", error: \"Error\" },\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: \"add-ledger-sync\",\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signBlock\",\n src: \"signBlock\",\n input: ({ context }) =>\n context.input.chain((input) =>\n eitherSeqRecord({\n lkrpDataSource: input.lkrpDataSource,\n trustchainId: input.trustchainId,\n jwt: input.jwt,\n clientName: input.clientName,\n sessionKeypair: () =>\n context._internalState.chain(({ sessionKeypair }) =>\n required(sessionKeypair, \"Missing session keypair\"),\n ),\n path: () =>\n required(\n input.applicationStream.getPath().extract(),\n \"Missing application path\",\n ),\n parent: () =>\n required(\n input.applicationStream\n .parse()\n .toMaybe()\n .chainNullable((blocks) => blocks.at(-1)?.hash())\n .chainNullable(hexaStringToBuffer)\n .extract(),\n \"Missing parent block\",\n ),\n blockFlow: {\n type: \"addMember\",\n data: {\n name: input.clientName,\n publicKey: input.keypair.pubKeyToU8a(),\n permissions: input.permissions,\n },\n },\n }),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n AddToNewStream: {\n on: { success: \"Success\", error: \"Error\" },\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: \"add-ledger-sync\",\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signBlock\",\n src: \"signBlock\",\n input: ({ context }) =>\n context.input.chain((input) =>\n eitherSeqRecord({\n lkrpDataSource: input.lkrpDataSource,\n trustchainId: input.trustchainId,\n jwt: input.jwt,\n clientName: input.clientName,\n sessionKeypair: () =>\n context._internalState.chain(({ sessionKeypair }) =>\n required(sessionKeypair, \"Missing session keypair\"),\n ),\n path: () =>\n required(\n input.applicationStream.getPath().extract(),\n \"Missing application path\",\n ),\n parent: () =>\n required(\n Maybe.fromNullable(input.trustchain[\"m/\"])\n .chain((rootStream) => rootStream.parse().toMaybe())\n .chainNullable((blocks) => blocks[0]?.hash())\n .chainNullable(hexaStringToBuffer)\n .extract(),\n \"Missing init block\",\n ),\n blockFlow: {\n type: \"derive\",\n data: {\n name: input.clientName,\n publicKey: input.keypair.pubKeyToU8a(),\n permissions: input.permissions,\n },\n },\n }).chain(() => Left(new LKRPTrustchainNotReady())),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n Success: { type: \"final\" },\n\n Error: { type: \"final\" },\n },\n\n output: ({ context }) => context._internalState.map((_) => undefined),\n });\n }\n\n extractDependencies(internalApi: InternalApi) {\n return {\n initCommand: (): Promise<Either<LKRPDeviceCommandError, Keypair>> =>\n new InitTask(internalApi).run(),\n\n parseStream: async (args: {\n input: Either<AddToTrustchainDAError, ParseStreamToDeviceTaskInput>;\n }) =>\n EitherAsync.liftEither(args.input)\n .chain<AddToTrustchainDAError, unknown>((input) =>\n new ParseStreamToDeviceTask(internalApi).run(input),\n )\n .run(),\n\n signBlock: (args: {\n input: Either<AddToTrustchainDAError, SignBlockTaskInput>;\n }): Promise<Either<AddToTrustchainDAError, void>> =>\n EitherAsync.liftEither(args.input)\n .chain((input) => new SignBlockTask(internalApi).run(input))\n .run(),\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,sBAAAA,EAGA,2BAAAC,EACA,sBAAAC,MACK,kCACP,OAAsB,eAAAC,EAAa,QAAAC,EAAM,SAAAC,
|
|
6
|
-
"names": ["hexaStringToBuffer", "UserInteractionRequired", "XStateDeviceAction", "EitherAsync", "Left", "
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceActionStateMachine,\n hexaStringToBuffer,\n type InternalApi,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type AddToTrustchainDAError,\n type AddToTrustchainDAInput,\n type AddToTrustchainDAIntermediateValue,\n type AddToTrustchainDAInternalState,\n type AddToTrustchainDAOutput,\n AddToTrustchainDAState,\n AddToTrustchaineDAStep,\n} from \"@api/app-binder/AddToTrustchainDeviceActionTypes\";\nimport {\n LKRPTrustchainNotReady,\n LKRPUnknownError,\n} from \"@api/app-binder/Errors\";\nimport { type Keypair } from \"@api/index\";\nimport { type LKRPDeviceCommandError } from \"@internal/app-binder/command/utils/ledgerKeyringProtocolErrors\";\nimport { InitTask } from \"@internal/app-binder/task/InitTask\";\nimport {\n ParseStreamToDeviceTask,\n type ParseStreamToDeviceTaskInput,\n} from \"@internal/app-binder/task/ParseStreamToDeviceTask\";\nimport {\n SignBlockTask,\n type SignBlockTaskInput,\n} from \"@internal/app-binder/task/SignBlockTask\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\nimport { required } from \"@internal/utils/required\";\n\nimport { raiseAndAssign } from \"./utils/raiseAndAssign\";\n\nexport class AddToTrustchainDeviceAction extends XStateDeviceAction<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n > {\n type types = StateMachineTypes<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n >;\n\n const { initCommand, parseStream, signBlock } =\n this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n\n actors: {\n initCommand: fromPromise(initCommand),\n parseStream: fromPromise(parseStream),\n signBlock: fromPromise(signBlock),\n },\n\n actions: {\n assignErrorFromEvent: raiseAndAssign(\n ({ event }) =>\n Left(\n new LKRPUnknownError(\n String((event as { error?: unknown }).error),\n ),\n ), // NOTE: it should never happen, the error is not typed anymore here\n ),\n },\n\n guards: {\n isTustchainEmpty: ({ context }) =>\n context.input\n .toMaybe()\n .chain((input) => input.trustchain.getAppStream(input.appId))\n .chain((appStream) => appStream.parse().toMaybe())\n .map((blocks) => blocks.length === 0)\n .orDefault(true),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QEEIQCoHt0CcCusALgMYAWAhgJYB2AImAG6XFjLGGWbUB0AktZUIBlOLE7UAxBC5huNBpgDWsmoIDCmALaby1CAG0ADAF1EoAA6YxHLmZAAPRAEZDAdm6unAFgAcXpwBsAKwAzL7+TgA0IACezq4AnB6GIU4ATAFeaUEBuT5pAL4F0agY2PhEZFR0jMys7OJ8AsKi4hJgODiYONzmADbkhABm3ZpyzRraugYmdpbW4naOCAlJaS4JXgGpCZ6r0XEIPgHc2YaGXiEhOdlXTkUlaFi4BCQUNPRMLGw2PPyCIlgYi4ElgeGILCBRlMSBA80Ei1hy2uXm4IVcXlWZwS5xChiCB0QaQSQW4QVcxMC63SCTShWKIFKzwqb2qnzqP0a-xaQLaHS6OGhcysCNsSMQKLRGKxQUMOJS+MJKzlaPSXlcPkSPkMaQxD0ZT3KryqH1q3waXG4AAVyDhYGAhIQcGByJopDJxgplL1bfbHc7XULYfDfktEKETgEnJ4coZMkEsUqnNqySFgtGgsmsWkvPqmUbKu8al96r9rb6HU6XW7+d1egNhqMfXbKwHNEGLCLQ+KEEEMmTdvHXEFjj4-ErNdxDD4wviciT8gEfHnDS9C2yzaXGjaW-7q6DwZDYB24V3EaBlq4NR4wmnpylvCEfEriScvHHdX4cwF1gEV2U11ZU0S05S0dz9KtXXaTpuhPENzwcRArx8G9LgCe9UkuZ9YiQscyR-LwEwCDVzice4GXzQCTWLDkLR4NRSDAYhFGQcx+mYQZxD3V0AFF7EoIgJDgs8xQvZxozSU4NnxK5sl2KIcIQYlJLSEIFx8Mj0PVcjHgAllqPZc0ywYpiWLYvoON+bjND4gTCCEpwYU7BZRMQhAyIpKS5RkkI5M8JUo1JeN8hHVwdQCBI-wo1d9KLQyt0tfNbKIGgoGs91qBUagvVkMQoGoAAhPpMGY4SXOoMN3KyFC3AfBN0jpLwlUxFDrgSdEwoTTVEn-ZljTizdQJ4JL+JS6g0sgmsYJ6fpBhGHAxjywritK2ZgxEiqe28aduCyZMlzTA7NWai5uBxH90xcLYZ16gsgJoozGhGuzUvSsEIVEMrRU2sT3MyJxTkinxIqvNJRzSALvFOSl1QTdYKSi3S+vXYDaLLZ6xomttoIFL7u1+wJ-EBpcQYpcGAsyDxKXnPs6QSW6qIGkC6O4fMADkwAAd3S6RMs9JRcsofKipKxQ8YQ5ZvDBqcwtSeq6RzJMMTO0JvGB3zfOnBnYo3Zn0cNDnucmnG61mxsFu4JaRdWpzT3KyrtpQvbR0OmdjsUjSyXOc4NJ1BInFp7X+t1tGnoNrm3sPT61uc76Hf+4ngeIsmlwhxTiUMbh8mJJ9PESLZAiDlGHoS4bw6N7Ha0FGO7bjraE9fJPQfJxSwgB3zKX9hJtTjIIigZahMAgOA7EonXUce1z4Nc5YAFoFMOWfSVWVZNXnVxtm8Eki-u+KhqaAFWinjbKvVF9rwDi6KSCWUKVzaK9ODifS-LXdJuFe2e3Vdx-HfBMtnRLSNOhxPxnSTucEcfh8TLgfsjXeg0WYmWYqxdixBOJcGsslQgH866-RxADK8Vxu7dXahFF8kUzofkxEELwWxsg3x3gZBB+syhYNeu-dan8CboidivXYCYUiZFcEqIiWc1TA3OLSTU98kZ3SYXrMOZRDbWRwfjNyTgeG7T4cOHEaYz7p1cCEXaH50JjmjHiNMjCmah0tEIKOQJVES3iLsKcN9fCqU-JcAkiltJkllvkQxtV1gyINI-Yue8WY8Wmo4me8RMy7RzFSK6cZ0gUyMeqf2tDpxpnJH3fuQA */\n\n id: \"AddToTrustchainDeviceAction\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: Right({\n sessionKeypair: null,\n }),\n }),\n\n initial: \"InitSession\",\n states: {\n InitSession: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AddToTrustchaineDAStep.Initialize,\n },\n }),\n on: { success: \"ParseStream\", error: \"Error\" },\n invoke: {\n id: \"initCommand\",\n src: \"initCommand\",\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map((sessionKeypair) => ({\n raise: \"success\",\n assign: { sessionKeypair },\n })),\n ),\n },\n },\n },\n\n ParseStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AddToTrustchaineDAStep.ParseStream,\n },\n }),\n on: { success: \"CheckApplicationStreamExist\", error: \"Error\" },\n invoke: {\n id: \"parseStream\",\n src: \"parseStream\",\n input: ({ context }) =>\n context.input.chain((input) =>\n eitherSeqRecord({\n seedBlock: () =>\n required(\n input.trustchain\n .getRootStream()\n .chain((stream) => stream.parse().toMaybe())\n .extract()?.[0],\n \"Missing seed block to parse\",\n ),\n applicationStream: () =>\n required(\n input.trustchain.getAppStream(input.appId).extract(),\n \"Missing application stream to parse\",\n ),\n }),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n CheckApplicationStreamExist: {\n always: [\n { target: \"AddToNewStream\", guard: \"isTustchainEmpty\" },\n { target: \"AddToExistingStream\" },\n ],\n },\n\n AddToExistingStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: AddToTrustchainDAState.AddMember,\n step: AddToTrustchaineDAStep.AddMember,\n },\n }),\n on: { success: \"Success\", error: \"Error\" },\n invoke: {\n id: \"signBlock\",\n src: \"signBlock\",\n input: ({ context }) =>\n context.input.chain((input) => {\n const appStream = input.trustchain.getAppStream(input.appId);\n return eitherSeqRecord({\n lkrpDataSource: input.lkrpDataSource,\n trustchainId: input.trustchain.getId(),\n jwt: input.jwt,\n clientName: input.clientName,\n sessionKeypair: () =>\n context._internalState.chain(({ sessionKeypair }) =>\n required(sessionKeypair, \"Missing session keypair\"),\n ),\n path: () =>\n required(\n appStream.chain((stream) => stream.getPath()).extract(),\n \"Missing application path\",\n ),\n parent: () =>\n required(\n appStream\n .chain((stream) => stream.parse().toMaybe())\n .chainNullable((blocks) => blocks.at(-1)?.hash())\n .chainNullable(hexaStringToBuffer)\n .extract(),\n \"Missing parent block\",\n ),\n blockFlow: {\n type: \"addMember\",\n data: {\n name: input.clientName,\n publicKey: input.keypair.pubKeyToU8a(),\n permissions: input.permissions,\n },\n },\n });\n }),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n AddToNewStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: AddToTrustchainDAState.AddMember,\n step: AddToTrustchaineDAStep.AddMember,\n },\n }),\n on: { success: \"Success\", error: \"Error\" },\n invoke: {\n id: \"signBlock\",\n src: \"signBlock\",\n input: ({ context }) =>\n context.input.chain((input) =>\n eitherSeqRecord({\n lkrpDataSource: input.lkrpDataSource,\n trustchainId: input.trustchain.getId(),\n jwt: input.jwt,\n clientName: input.clientName,\n sessionKeypair: () =>\n context._internalState.chain(({ sessionKeypair }) =>\n required(sessionKeypair, \"Missing session keypair\"),\n ),\n path: `m/0'/${input.appId}'/0'`,\n parent: () =>\n required(\n input.trustchain\n .getRootStream()\n .chain((stream) => stream.parse().toMaybe())\n .chainNullable((blocks) => blocks[0]?.hash())\n .chainNullable(hexaStringToBuffer)\n .extract(),\n \"Missing init block\",\n ),\n blockFlow: {\n type: \"derive\",\n data: {\n name: input.clientName,\n publicKey: input.keypair.pubKeyToU8a(),\n permissions: input.permissions,\n },\n },\n }).chain(() => Left(new LKRPTrustchainNotReady())),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n Success: { type: \"final\" },\n\n Error: { type: \"final\" },\n },\n\n output: ({ context }) => context._internalState.map((_) => undefined),\n });\n }\n\n extractDependencies(internalApi: InternalApi) {\n return {\n initCommand: (): Promise<Either<LKRPDeviceCommandError, Keypair>> =>\n new InitTask(internalApi).run(),\n\n parseStream: async (args: {\n input: Either<AddToTrustchainDAError, ParseStreamToDeviceTaskInput>;\n }) =>\n EitherAsync.liftEither(args.input)\n .chain<AddToTrustchainDAError, unknown>((input) =>\n new ParseStreamToDeviceTask(internalApi).run(input),\n )\n .run(),\n\n signBlock: (args: {\n input: Either<AddToTrustchainDAError, SignBlockTaskInput>;\n }): Promise<Either<AddToTrustchainDAError, void>> =>\n EitherAsync.liftEither(args.input)\n .chain((input) => new SignBlockTask(internalApi).run(input))\n .run(),\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["hexaStringToBuffer", "UserInteractionRequired", "XStateDeviceAction", "EitherAsync", "Left", "Right", "assign", "fromPromise", "setup", "AddToTrustchainDAState", "AddToTrustchaineDAStep", "LKRPTrustchainNotReady", "LKRPUnknownError", "InitTask", "ParseStreamToDeviceTask", "SignBlockTask", "eitherSeqRecord", "required", "raiseAndAssign", "AddToTrustchainDeviceAction", "internalApi", "initCommand", "parseStream", "signBlock", "event", "context", "input", "appStream", "blocks", "sessionKeypair", "stream", "_", "args"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{OpenAppDeviceAction as T,UserInteractionRequired as h,XStateDeviceAction as g}from"@ledgerhq/device-management-kit";import{EitherAsync as y,Left as A,Right as D}from"purify-ts";import{assign as s,fromPromise as m,setup as S}from"xstate";import{AuthenticateDAState as I,AuthenticateDAStep as o}from"../../../api/app-binder/AuthenticateDeviceActionTypes";import{LKRPMissingDataError as l,LKRPTrustchainNotReady as v,LKRPUnknownError as f}from"../../../api/app-binder/Errors";import{AuthenticateTask as k}from"../../app-binder/task/AuthenticateTask";import{ExtractEncryptionKeyTask as M}from"../../app-binder/task/ExtractEncryptionKeyTask";import{SignChallengeWithDeviceTask as w}from"../../app-binder/task/SignChallengeWithDeviceTask";import{eitherSeqRecord as d}from"../../utils/eitherSeqRecord";import{required as i}from"../../utils/required";import{raiseAndAssign as a}from"./utils/raiseAndAssign";import{AddToTrustchainDeviceAction as K}from"./AddToTrustchainDeviceAction";const E="Ledger Sync";class F extends g{makeStateMachine(c){const{deviceAuth:u,getTrustchain:p,extractEncryptionKey:n}=this.extractDependencies(c);return S({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new T({input:{appName:E}}).makeStateMachine(c),deviceAuth:m(u),getTrustchain:m(p),addToTrustchainStateMachine:new K({input:A(new l("Missing input for GetEncryptionKey"))}).makeStateMachine(c),extractEncryptionKey:m(n)},actions:{assignErrorFromEvent:a(({event:t})=>A(new f(String(t.error))))},guards:{isTrustchainMember:({context:t})=>t._internalState.toMaybe().map(e=>e.wasAddedToTrustchain||e.trustchain?.getAppStream(t.input.appId).mapOrDefault(r=>r.hasMember(t.input.keypair.pubKeyToHex()),!1)).extract()??!1}}).createMachine({id:"AuthenticateWithDeviceDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:h.None},_internalState:D({trustchainId:null,jwt:null,trustchain:null,encryptionKey:null,wasAddedToTrustchain:!1})}),initial:"OpenApp",states:{OpenApp:{on:{success:"DeviceAuth",error:"Error"},invoke:{id:"openApp",src:"openAppStateMachine",onSnapshot:{actions:s({intermediateValue:({event:t})=>({step:o.OpenApp,...t.snapshot.context.intermediateValue})})},input:{appName:E},onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(()=>({raise:"success"})))}}},DeviceAuth:{entry:s({intermediateValue:{step:o.Authenticate,requiredUserInteraction:I.Authenticate}}),on:{success:"GetTrustchain",error:"Error"},invoke:{id:"deviceAuth",src:"deviceAuth",input:({context:t})=>t.input,onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.chain(e=>e.trustchainId.caseOf({Nothing:()=>A(new v),Just:r=>D({raise:"success",assign:{jwt:e.jwt,trustchainId:r}})})))}}},GetTrustchain:{entry:s({intermediateValue:{step:o.GetTrustchain,requiredUserInteraction:h.None}}),on:{success:"CheckIsMembers",error:"Error"},invoke:{id:"getTrustchain",src:"getTrustchain",input:({context:t})=>t._internalState.chain(e=>d({lkrpDataSource:t.input.lkrpDataSource,trustchainId:()=>i(e.trustchainId,"Missing Trustchain ID for GetTrustchain"),jwt:()=>i(e.jwt,"Missing JWT for GetTrustchain")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(e=>({raise:"success",assign:{trustchain:e}})))}}},CheckIsMembers:{always:[{target:"ExtractEncryptionKey",guard:"isTrustchainMember"},{target:"AddToTrustchain"}]},AddToTrustchain:{on:{success:"GetTrustchain",error:"Error"},invoke:{id:"AddToTrustchain",src:"addToTrustchainStateMachine",onSnapshot:{actions:s({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},input:({context:t})=>t._internalState.mapLeft(()=>new l("Missing data in the input for AddToTrustchain")).chain(e=>d({lkrpDataSource:t.input.lkrpDataSource,keypair:t.input.keypair,clientName:t.input.clientName,permissions:t.input.permissions,jwt:()=>i(e.jwt,"Missing JWT for AddToTrustchain"),appId:t.input.appId,trustchain:()=>i(e.trustchain,"Missing Trustchain for AddToTrustchain")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(()=>({raise:"success",assign:{wasAddedToTrustchain:!0}})))}}},ExtractEncryptionKey:{entry:s({intermediateValue:{step:o.ExtractEncryptionKey,requiredUserInteraction:h.None}}),on:{success:"Success",error:"Error"},invoke:{id:"ExtractEncryptionKey",src:"extractEncryptionKey",input:({context:t})=>({keypair:t.input.keypair,stream:t._internalState.chain(({trustchain:e})=>i(e?.getAppStream(t.input.appId).extract(),"Missing application stream for ExtractEncryptionKey"))}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(e=>({raise:"success",assign:{encryptionKey:e}})))}}},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.chain(e=>d({trustchainId:()=>i(e.trustchainId,"Missing Trustchain ID in the output"),jwt:()=>i(e.jwt,"Missing JWT in the output"),applicationPath:()=>i(e.trustchain?.getAppStream(t.input.appId).chain(r=>r.getPath()).extract(),"Missing application path in the output"),encryptionKey:()=>i(e.encryptionKey,"Missing encryption key in the output")}))})}extractDependencies(c){const u=new k,p=new M;return{deviceAuth:({input:n})=>u.run(n.lkrpDataSource,new w(c)),getTrustchain:n=>y.liftEither(n.input).chain(({lkrpDataSource:t,trustchainId:e,jwt:r})=>t.getTrustchainById(e,r)).run(),extractEncryptionKey:async({input:n})=>y.liftEither(n.stream).chain(t=>p.run(n.keypair,t))}}}export{F as AuthenticateWithDeviceDeviceAction};
|
|
2
|
+
//# sourceMappingURL=AuthenticateWithDeviceDeviceAction.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceActionStateMachine,\n type InternalApi,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type AuthenticateDAError,\n type AuthenticateDAIntermediateValue,\n type AuthenticateDAOutput,\n AuthenticateDAState,\n AuthenticateDAStep,\n} from \"@api/app-binder/AuthenticateDeviceActionTypes\";\nimport {\n LKRPMissingDataError,\n LKRPTrustchainNotReady,\n LKRPUnknownError,\n} from \"@api/app-binder/Errors\";\nimport { type JWT, type Keypair } from \"@api/index\";\nimport { AuthenticateTask } from \"@internal/app-binder/task/AuthenticateTask\";\nimport { ExtractEncryptionKeyTask } from \"@internal/app-binder/task/ExtractEncryptionKeyTask\";\nimport { SignChallengeWithDeviceTask } from \"@internal/app-binder/task/SignChallengeWithDeviceTask\";\nimport { type LKRPDataSource } from \"@internal/lkrp-datasource/data/LKRPDataSource\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\nimport { type LKRPBlockStream } from \"@internal/utils/LKRPBlockStream\";\nimport { required } from \"@internal/utils/required\";\n\nimport {\n type AuthenticateWithDeviceDAInput,\n type AuthenticateWithDeviceDAInternalState,\n} from \"./models/AuthenticateWithDeviceDeviceActionTypes\";\nimport { raiseAndAssign } from \"./utils/raiseAndAssign\";\nimport { AddToTrustchainDeviceAction } from \"./AddToTrustchainDeviceAction\";\n\nconst APP_NAME = \"Ledger Sync\";\n\nexport class AuthenticateWithDeviceDeviceAction extends XStateDeviceAction<\n AuthenticateDAOutput,\n AuthenticateWithDeviceDAInput,\n AuthenticateDAError,\n AuthenticateDAIntermediateValue,\n AuthenticateWithDeviceDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n AuthenticateDAOutput,\n AuthenticateWithDeviceDAInput,\n AuthenticateDAError,\n AuthenticateDAIntermediateValue,\n AuthenticateWithDeviceDAInternalState\n > {\n type types = StateMachineTypes<\n AuthenticateDAOutput,\n AuthenticateWithDeviceDAInput,\n AuthenticateDAError,\n AuthenticateDAIntermediateValue,\n AuthenticateWithDeviceDAInternalState\n >;\n\n const { deviceAuth, getTrustchain, extractEncryptionKey } =\n this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: APP_NAME },\n }).makeStateMachine(internalApi),\n\n deviceAuth: fromPromise(deviceAuth),\n\n getTrustchain: fromPromise(getTrustchain),\n\n addToTrustchainStateMachine: new AddToTrustchainDeviceAction({\n input: Left(\n new LKRPMissingDataError(\"Missing input for GetEncryptionKey\"),\n ),\n }).makeStateMachine(internalApi),\n\n extractEncryptionKey: fromPromise(extractEncryptionKey),\n },\n\n actions: {\n assignErrorFromEvent: raiseAndAssign(\n ({ event }) =>\n Left(\n new LKRPUnknownError(\n String((event as { error?: unknown }).error),\n ),\n ), // NOTE: it should never happen, the error is not typed anymore here\n ),\n },\n\n guards: {\n isTrustchainMember: ({ context }) =>\n context._internalState\n .toMaybe()\n .map(\n (state) =>\n state.wasAddedToTrustchain ||\n state.trustchain\n ?.getAppStream(context.input.appId)\n .mapOrDefault(\n (stream) =>\n stream.hasMember(context.input.keypair.pubKeyToHex()),\n false,\n ),\n )\n .extract() ?? false,\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QEECuAXAFmAduglgMYCG6YA6vlgCJgBuRYtDhYyhBA9jgHQDyAB1zIBAgMQRuYHvhx1OAa2mchOEQIDaABgC6iUAM6wq+bvpAAPRAEYAzADYeATgAcAFltuntrdYBMAfYANCAAnogA7G6OttYREU5aWgERyQC+aSFoWLgEJGSUNPSMzIzsXLyCwqJiYABOdZx1PAIANqQAZk0Atjwq1Zq65obGFeZWCNbWAKw80-Z+Xvb2ni5OEdPWIeEI9tN+PC720RtuyU52GVkY2HhEpBRUmKWsL2wcppWq6mKwqISsWCwbR6JAgEYmMxgia2FwRHhaCIuaxaLz7ZbTLTBMKIFwuA7JLTePwJVxRCJXEDZW55B6FZ7FV6M94VfjfGr1Rp1EHDIyQnDjRAOA7WPGYiLHaxOab47Y2GVaHheOKiiVOAIBSnU3L3ApPN5vcqfHiGm4SKQyOSKaQQZnUnlgiFjaGIeZuQ62Py+PxSrQucVyhASxyuNzRRKI3wrLU3HX5R5FFhMO0fbgmu1mzlNFrtdBdOq9W1J+1DR1852gCbTTE8WyuWFReyIhJbHG7CK2OaxPx4tz+bzTGM5O7x+kGlOs01YX7-QHA0sGcufQVB7w8FYk6XS6YRaxuaaB9WKwlraJe+z4txDmm6hMMpOG1O8KeYWoNJoOxejZcuoMJBH2FEdbVlM+5uIGMyxOuixaJi0wOLY0xXpkVKxiOdL6syj6sgA4mA6AACp1KgsDoIQmDELI5o4NIsjyEoPAwIRxGkeRlE4J+4JLlClaIOsLg8I2sE+CqTYuIGLios47jRLCe7rL415xhhiYlBOxp4cxJFkRRVFZs0bSdD0jH4UR2lsbInFOj+vEIOs1jrru+IbBcWJrIGu4OfBdjKtKorWEp6F6qpTLFk+PCaWZrG6TgM4AnA86gl+-Irv4YbQWiGpNmSh4XnMCz7P5vhgYFtLBfealhbhpksTp7FvlyVncQKv5TPiCKwU2iKLIkfgQW4ErOOSThhiiixuC4pW3mOWHqWmADC2CEAoACSsAALJgN0ABG9SwGITXfjxljyhNzj7n48G2J6+J+oe8Q8AE6r7vYTgFR2U2jphD5zbwi1gMta2bTte0HdYSVcUdLW2TMSKCZ4N3TL1SHYjs-h4jwUqgXWCwUih2pBXe45VcayAQBABGcFFdVUZINGWvR0hkxTVO1RZHELpDKWtUcswokhiIyv5tgQV6IoXlEqL+j6TifSpFWhWU4XM5T1Psw12aGXmxkq6z5kxYd3Mw7zgkdnWEQ9k4VthhBUyKvYe62Kk5w+D2cvlcTSusrrasxXFc6GxWJ0ID6r3OH4iFhscZywf1UpKgs1gO2sF51u7ROzSTaY+2zfv6YHNnB6H8KIcS6oW69cIQddnaJ5JhLddG+NoWVGc-VnvAAKIWOgdTEBwnc4IQdShAIFQANJgKE1G0VaDHd73-foIPw+jxPU8F8dEyijW7gSqinhaA44Ftv6tdEk7l37DuH3N8Orcze3XvGgvfcD0PI9j58k-T-pOZGQWHgr8l4r0-uvUIm9obBx3l5GY8wUQOzrNKDyTZMbwIuNKdwb106P0qs-NMwD36ry-twH+-sEqQJXKHJw4dI7RDDEkfY913TrHVDKDwCwr44O+ng1gRoCE9zfsvD+a9v5Tw1tyTm1kt6IGLrWJGnpy5+Ern1NsKIzjriOHvJGfZ1QZBQjgTgtp4BggJg-Hhis+FPl5FDFcABaVsOx5izGPhbUayJYiDjvjeL6IVkwdzZAMGxRtg4DQkuleIRJUTHB6kSbhfjsLGhfMEoOVYUSYxVPMBYPhOoST2EqJ2MphQXlgn4eJCt-H4N4JFXO7EUmFwmBcRwgFRQDQWE2ECh4j4FI2EiDwA0kYBW8cpD2mcqk8H+oDDaW1dp1BMclVJNgHDwmWDHWEb0PDqlyjQrEV8BrrD8E08pnsrHe3JqrWpsh6kyMmPEBypdrpiVcHsauSRoJxDWHYREMxJrDMJrgyxLIX6CJASIkhOAf7XKgdvO58jvAOD9M8g8bZpQEgKt5aIex-THLGac40ABlWcCUoVUNiJ2RYGx5gBD7E2CI91OwW2eohAI1YJo4qfnigh746gkt-AESSj1E5JAri4bs1dPS1l3EifYcJYI7n0WkIAA */\n\n id: \"AuthenticateWithDeviceDeviceAction\",\n context: ({ input }): types[\"context\"] => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: Right({\n trustchainId: null,\n jwt: null,\n trustchain: null,\n encryptionKey: null,\n wasAddedToTrustchain: false,\n }),\n }),\n\n initial: \"OpenApp\",\n states: {\n OpenApp: {\n on: { success: \"DeviceAuth\", error: \"Error\" },\n invoke: {\n id: \"openApp\",\n src: \"openAppStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) => ({\n step: AuthenticateDAStep.OpenApp,\n ...event.snapshot.context.intermediateValue,\n }),\n }),\n },\n input: { appName: APP_NAME },\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n DeviceAuth: {\n entry: assign({\n intermediateValue: {\n step: AuthenticateDAStep.Authenticate,\n requiredUserInteraction: AuthenticateDAState.Authenticate,\n },\n }),\n on: { success: \"GetTrustchain\", error: \"Error\" },\n invoke: {\n id: \"deviceAuth\",\n src: \"deviceAuth\",\n input: ({ context }) => context.input,\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.chain((payload) =>\n payload.trustchainId.caseOf({\n Nothing: () => Left(new LKRPTrustchainNotReady()),\n Just: (trustchainId) =>\n Right({\n raise: \"success\",\n assign: { jwt: payload.jwt, trustchainId },\n }),\n }),\n ),\n ),\n },\n },\n },\n\n GetTrustchain: {\n entry: assign({\n intermediateValue: {\n step: AuthenticateDAStep.GetTrustchain,\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n on: { success: \"CheckIsMembers\", error: \"Error\" },\n invoke: {\n id: \"getTrustchain\",\n src: \"getTrustchain\",\n input: ({ context }) =>\n context._internalState.chain((state) =>\n eitherSeqRecord({\n lkrpDataSource: context.input.lkrpDataSource,\n trustchainId: () =>\n required(\n state.trustchainId,\n \"Missing Trustchain ID for GetTrustchain\",\n ),\n jwt: () =>\n required(state.jwt, \"Missing JWT for GetTrustchain\"),\n }),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map((trustchain) => ({\n raise: \"success\",\n assign: { trustchain },\n })),\n ),\n },\n },\n },\n\n CheckIsMembers: {\n always: [\n { target: \"ExtractEncryptionKey\", guard: \"isTrustchainMember\" },\n { target: \"AddToTrustchain\" },\n ],\n },\n\n AddToTrustchain: {\n on: {\n success: \"GetTrustchain\",\n error: \"Error\",\n },\n invoke: {\n id: \"AddToTrustchain\",\n src: \"addToTrustchainStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n input: ({ context }) =>\n context._internalState\n .mapLeft(\n () =>\n new LKRPMissingDataError(\n \"Missing data in the input for AddToTrustchain\",\n ),\n )\n .chain((state) =>\n eitherSeqRecord({\n lkrpDataSource: context.input.lkrpDataSource,\n keypair: context.input.keypair,\n clientName: context.input.clientName,\n permissions: context.input.permissions,\n jwt: () =>\n required(state.jwt, \"Missing JWT for AddToTrustchain\"),\n appId: context.input.appId,\n trustchain: () =>\n required(\n state.trustchain,\n \"Missing Trustchain for AddToTrustchain\",\n ),\n }),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({\n raise: \"success\",\n assign: { wasAddedToTrustchain: true },\n })),\n ),\n },\n },\n },\n\n ExtractEncryptionKey: {\n entry: assign({\n intermediateValue: {\n step: AuthenticateDAStep.ExtractEncryptionKey,\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n on: { success: \"Success\", error: \"Error\" },\n invoke: {\n id: \"ExtractEncryptionKey\",\n src: \"extractEncryptionKey\",\n input: ({ context }) => ({\n keypair: context.input.keypair,\n stream: context._internalState.chain(({ trustchain }) =>\n required(\n trustchain?.getAppStream(context.input.appId).extract(),\n \"Missing application stream for ExtractEncryptionKey\",\n ),\n ),\n }),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map((encryptionKey) => ({\n raise: \"success\",\n assign: { encryptionKey },\n })),\n ),\n },\n },\n },\n\n Success: { type: \"final\" },\n\n Error: { type: \"final\" },\n },\n\n output: ({ context }) =>\n context._internalState.chain((state) =>\n eitherSeqRecord({\n trustchainId: () =>\n required(\n state.trustchainId,\n \"Missing Trustchain ID in the output\",\n ),\n jwt: () => required(state.jwt, \"Missing JWT in the output\"),\n applicationPath: () =>\n required(\n state.trustchain\n ?.getAppStream(context.input.appId)\n .chain((stream) => stream.getPath())\n .extract(),\n \"Missing application path in the output\",\n ),\n encryptionKey: () =>\n required(\n state.encryptionKey,\n \"Missing encryption key in the output\",\n ),\n }),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi) {\n const authentication = new AuthenticateTask();\n const encryptionKeyExtraction = new ExtractEncryptionKeyTask();\n\n return {\n deviceAuth: ({ input }: { input: AuthenticateWithDeviceDAInput }) =>\n authentication.run(\n input.lkrpDataSource,\n new SignChallengeWithDeviceTask(internalApi),\n ),\n\n getTrustchain: (args: {\n input: Either<\n AuthenticateDAError,\n {\n lkrpDataSource: LKRPDataSource;\n trustchainId: string;\n jwt: JWT;\n }\n >;\n }) =>\n EitherAsync.liftEither(args.input)\n .chain(({ lkrpDataSource, trustchainId, jwt }) =>\n lkrpDataSource.getTrustchainById(trustchainId, jwt),\n )\n .run(),\n\n extractEncryptionKey: async ({\n input,\n }: {\n input: {\n keypair: Keypair;\n stream: Either<AuthenticateDAError, LKRPBlockStream>;\n };\n }) =>\n EitherAsync.liftEither(input.stream).chain((stream) =>\n encryptionKeyExtraction.run(input.keypair, stream),\n ),\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["OpenAppDeviceAction", "UserInteractionRequired", "XStateDeviceAction", "EitherAsync", "Left", "Right", "assign", "fromPromise", "setup", "AuthenticateDAState", "AuthenticateDAStep", "LKRPMissingDataError", "LKRPTrustchainNotReady", "LKRPUnknownError", "AuthenticateTask", "ExtractEncryptionKeyTask", "SignChallengeWithDeviceTask", "eitherSeqRecord", "required", "raiseAndAssign", "AddToTrustchainDeviceAction", "APP_NAME", "AuthenticateWithDeviceDeviceAction", "internalApi", "deviceAuth", "getTrustchain", "extractEncryptionKey", "event", "context", "state", "stream", "input", "payload", "trustchainId", "trustchain", "encryptionKey", "authentication", "encryptionKeyExtraction", "args", "lkrpDataSource", "jwt"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{UserInteractionRequired as c,XStateDeviceAction as A}from"@ledgerhq/device-management-kit";import{EitherAsync as y,Left as m,Right as E}from"purify-ts";import{assign as p,fromPromise as s,setup as D}from"xstate";import{AuthenticateDAStep as h}from"../../../api/app-binder/AuthenticateDeviceActionTypes";import{LKRPDataSourceError as l,LKRPUnauthorizedError as K,LKRPUnknownError as d}from"../../../api/app-binder/Errors";import{AuthenticateTask as S}from"../../app-binder/task/AuthenticateTask";import{ExtractEncryptionKeyTask as I}from"../../app-binder/task/ExtractEncryptionKeyTask";import{SignChallengeWithKeypairTask as g}from"../../app-binder/task/SignChallengeWithKeypairTask";import{eitherSeqRecord as k}from"../../utils/eitherSeqRecord";import{required as a}from"../../utils/required";import{raiseAndAssign as u}from"./utils/raiseAndAssign";class q extends A{execute(){const n=this.makeStateMachine();return this._subscribeToStateMachine(n)}makeStateMachine(){const{keypairAuth:n,getTrustchain:o,extractEncryptionKey:r}=this.extractDependencies();return D({types:{input:{},context:{},output:{}},actors:{keypairAuth:s(n),getTrustchain:s(o),extractEncryptionKey:s(r)},actions:{assignErrorFromEvent:u(({event:t})=>m(new d(String(t.error))))}}).createMachine({id:"AuthenticateWithKeypairDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:c.None},_internalState:E({jwt:null,trustchain:null,encryptionKey:null})}),initial:"KeypairAuth",states:{KeypairAuth:{entry:p({intermediateValue:{requiredUserInteraction:c.None,step:h.Authenticate}}),on:{success:"GetTrustchain",error:"Error"},invoke:{id:"keypairAuth",src:"keypairAuth",input:({context:t})=>t.input,onError:{actions:"assignErrorFromEvent"},onDone:{actions:u(({context:t,event:e})=>e.output.map(({jwt:i})=>({raise:"success",assign:{jwt:i}})).mapLeft(i=>i instanceof l&&i.status==="UNAUTHORIZED"?new K(t.input.trustchainId):i))}}},GetTrustchain:{entry:p({intermediateValue:{requiredUserInteraction:c.None,step:h.GetTrustchain}}),on:{success:"ExtractEncryptionKey",error:"Error"},invoke:{id:"getTrustchain",src:"getTrustchain",input:({context:t})=>({lkrpDataSource:t.input.lkrpDataSource,trustchainId:t.input.trustchainId,jwt:t._internalState.chain(({jwt:e})=>a(e,"Missing JWT for GetTrustchain"))}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:u(({event:t})=>t.output.map(e=>({raise:"success",assign:{trustchain:e}})))}}},ExtractEncryptionKey:{entry:p({intermediateValue:{requiredUserInteraction:c.None,step:h.ExtractEncryptionKey}}),on:{success:"Success",error:"Error"},invoke:{id:"ExtractEncryptionKey",src:"extractEncryptionKey",input:({context:t})=>({keypair:t.input.keypair,stream:t._internalState.chain(({trustchain:e})=>a(e?.getAppStream(t.input.appId).extract(),"Missing application stream for ExtractEncryptionKey"))}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:u(({event:t})=>t.output.map(e=>({raise:"success",assign:{encryptionKey:e}})))}}},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.chain(e=>k({trustchainId:t.input.trustchainId,jwt:()=>a(e.jwt,"Missing JWT in the output"),applicationPath:()=>a(e.trustchain?.getAppStream(t.input.appId).chain(i=>i.getPath()).extract(),"Missing application path in the output"),encryptionKey:()=>a(e.encryptionKey,"Missing encryption key in the output")}))})}extractDependencies(){const n=new S,o=new I;return{keypairAuth:({input:r})=>n.run(r.lkrpDataSource,new g(r.keypair,r.trustchainId)),getTrustchain:({input:r})=>y.liftEither(r.jwt).chain(t=>r.lkrpDataSource.getTrustchainById(r.trustchainId,t)).run(),extractEncryptionKey:async({input:r})=>y.liftEither(r.stream).chain(t=>o.run(r.keypair,t))}}}export{q as AuthenticateWithKeypairDeviceAction};
|
|
2
|
+
//# sourceMappingURL=AuthenticateWithKeypairDeviceAction.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceActionStateMachine,\n type ExecuteDeviceActionReturnType,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type AuthenticateDAError,\n type AuthenticateDAIntermediateValue,\n type AuthenticateDAOutput,\n AuthenticateDAStep,\n} from \"@api/app-binder/AuthenticateDeviceActionTypes\";\nimport {\n LKRPDataSourceError,\n LKRPUnauthorizedError,\n LKRPUnknownError,\n} from \"@api/app-binder/Errors\";\nimport { type JWT, type Keypair } from \"@api/index\";\nimport { AuthenticateTask } from \"@internal/app-binder/task/AuthenticateTask\";\nimport { ExtractEncryptionKeyTask } from \"@internal/app-binder/task/ExtractEncryptionKeyTask\";\nimport { SignChallengeWithKeypairTask } from \"@internal/app-binder/task/SignChallengeWithKeypairTask\";\nimport { type LKRPDataSource } from \"@internal/lkrp-datasource/data/LKRPDataSource\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\nimport { type LKRPBlockStream } from \"@internal/utils/LKRPBlockStream\";\nimport { required } from \"@internal/utils/required\";\n\nimport {\n type AuthenticateWithKeypairDAInput,\n type AuthenticateWithKeypairDAInternalState,\n} from \"./models/AuthenticateWithKeypairDeviceActionTypes\";\nimport { raiseAndAssign } from \"./utils/raiseAndAssign\";\n\nexport class AuthenticateWithKeypairDeviceAction extends XStateDeviceAction<\n AuthenticateDAOutput,\n AuthenticateWithKeypairDAInput,\n AuthenticateDAError,\n AuthenticateDAIntermediateValue,\n AuthenticateWithKeypairDAInternalState\n> {\n execute(): ExecuteDeviceActionReturnType<\n AuthenticateDAOutput,\n AuthenticateDAError,\n AuthenticateDAIntermediateValue\n > {\n const stateMachine = this.makeStateMachine();\n return this._subscribeToStateMachine(stateMachine);\n }\n\n makeStateMachine(): DeviceActionStateMachine<\n AuthenticateDAOutput,\n AuthenticateWithKeypairDAInput,\n AuthenticateDAError,\n AuthenticateDAIntermediateValue,\n AuthenticateWithKeypairDAInternalState\n > {\n type types = StateMachineTypes<\n AuthenticateDAOutput,\n AuthenticateWithKeypairDAInput,\n AuthenticateDAError,\n AuthenticateDAIntermediateValue,\n AuthenticateWithKeypairDAInternalState\n >;\n\n const { keypairAuth, getTrustchain, extractEncryptionKey } =\n this.extractDependencies();\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n\n actors: {\n keypairAuth: fromPromise(keypairAuth),\n getTrustchain: fromPromise(getTrustchain),\n extractEncryptionKey: fromPromise(extractEncryptionKey),\n },\n\n actions: {\n assignErrorFromEvent: raiseAndAssign(\n ({ event }) =>\n Left(\n new LKRPUnknownError(\n String((event as { error?: unknown }).error),\n ),\n ), // NOTE: it should never happen, the error is not typed anymore here\n ),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QEECuAXAFmAduglgMYCG6YA6vlgNJgCeADsfgE4AiYAbkWMoQQHscAOlqNmLNFgDEEIWGH4cnAQGsF68aymYA2gAYAuolAMBsKviEmQAD0QBGfQFZhADgDMAdgBMXh24AbG7Ozl4ePgA0IHSOnsI+PoEuzg4ALACcGT4BAL650Tq4BCRklDT0TKwc3IS8-FYiYlWSGJjSYCwsAizCDAA2pABmPQC2wpotOgbGSCBmFoI4NvYI2cLJbj4eAZnpgWlRMYhBwofByV6BHmke2V75hW3FRKQUVJjNEjU8fEuilQkOmksFQhDqsFgMxsC0s1jmqxubg2IT8XmcGQxaQcDkC0ViCA8+g8wgcXi89y8+jcGWCPjSjxARTwrzKHy+1S4vwaQgBWlaMk63RY0LmsKWK0QSJRzjRGKxOLxxwQgVxwkxGSJaWcHhuHmcDIKTOeLNK7wq-J+dT+jWEAHEwOgACosVCwdCETDMHCyeSKZRqBQwZ2u92e72i0zmOHLBGIA36YTeDG0hx+BzOQJHAm7YQuTVZfTorxpTJuRnMkpvcqfQGc2r1f4OkNuj1epQdLo9PqDdAjFjjYMu1vhpSR+bRiVxhA6kn6HEZ0vOfQXfEnLwJZI+fRpYLZLPaismqtsi0tK2N23N4dh9s+0HguBQowwyeNSUINz6RPhTXakJpG4JZroSO55jiSROIcRIZkeWAvGaNYcuwXLWjyIjXqGbbep2wrjuK77Tl+P53DczgAUBaQgZkrjYiEZLXJikFwdgprVuydYoQ2Nq8gAorY6AsMQ-C8TghAsIwSxiL6OAKEoKjqMI-GCcJ6CieJkmNGI+FvvCoCrE4TjCKEGSZNutKeJ4IFksiPhZIksqpIqO4sQh7Fnt8qGXnxAlCSJYkSQwUn0Lh3YDMMYxKb5qnqYFwV0DpiyEfpjjzg4CQGjStypG4pZeCBbjpcu35EkEu66rKrlsaetaWl5PEiMpflqQFmlCNJD4Qs+sxRklel2I4uoZBlATeHZma6iBWruEupnJtcgEPEalasuatXnvV6FRSp-kaUFWkhUKPSJTGH4OENI2eL4mLXB4U2ZuqkHBLiZH6s4+RGjgAgQHANgrYhHF1dx6Gvn1sYpQgAC0DggZDrhZAjiNIx4VUnmtyEXg1fJTG0oOndOaT5cqPghHmPiyjRHgHDuKPLceq1IZxmNbZhI53njU4Q4TrjomSVymdi5UgSTrghCEf5Zok6K0088HVejTObf8TUxa1+3tfQHPJQNax+O4Li5bKxJFtkwtfnmGS5Q4tLJpbYSowzgMbcD-wAMpgl1Wv9QZu6BEmo1UwcHiWdmUpgTTOS0vompkjLxpy2jjNA9yytdiwXvgzr+x+zsniB7cIfUaZGxkmSu7LoEXhfkt+RAA */\n\n id: \"AuthenticateWithKeypairDeviceAction\",\n context: ({ input }): types[\"context\"] => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: Right({\n jwt: null,\n trustchain: null,\n encryptionKey: null,\n }),\n }),\n\n initial: \"KeypairAuth\",\n states: {\n KeypairAuth: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AuthenticateDAStep.Authenticate,\n },\n }),\n on: { success: \"GetTrustchain\", error: \"Error\" },\n invoke: {\n id: \"keypairAuth\",\n src: \"keypairAuth\",\n input: ({ context }) => context.input,\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ context, event }) =>\n event.output\n .map(({ jwt }) => ({ raise: \"success\", assign: { jwt } }))\n .mapLeft((error) =>\n error instanceof LKRPDataSourceError &&\n error.status === \"UNAUTHORIZED\"\n ? new LKRPUnauthorizedError(context.input.trustchainId)\n : error,\n ),\n ),\n },\n },\n },\n\n GetTrustchain: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AuthenticateDAStep.GetTrustchain,\n },\n }),\n on: { success: \"ExtractEncryptionKey\", error: \"Error\" },\n invoke: {\n id: \"getTrustchain\",\n src: \"getTrustchain\",\n input: ({ context }) => ({\n lkrpDataSource: context.input.lkrpDataSource,\n trustchainId: context.input.trustchainId,\n jwt: context._internalState.chain(({ jwt }) =>\n required(jwt, \"Missing JWT for GetTrustchain\"),\n ),\n }),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map((trustchain) => ({\n raise: \"success\",\n assign: { trustchain },\n })),\n ),\n },\n },\n },\n\n ExtractEncryptionKey: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AuthenticateDAStep.ExtractEncryptionKey,\n },\n }),\n on: { success: \"Success\", error: \"Error\" },\n invoke: {\n id: \"ExtractEncryptionKey\",\n src: \"extractEncryptionKey\",\n input: ({ context }) => ({\n keypair: context.input.keypair,\n stream: context._internalState.chain(({ trustchain }) =>\n required(\n trustchain?.getAppStream(context.input.appId).extract(),\n \"Missing application stream for ExtractEncryptionKey\",\n ),\n ),\n }),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map((encryptionKey) => ({\n raise: \"success\",\n assign: { encryptionKey },\n })),\n ),\n },\n },\n },\n\n Success: { type: \"final\" },\n\n Error: { type: \"final\" },\n },\n\n output: ({ context }) =>\n context._internalState.chain((state) =>\n eitherSeqRecord({\n trustchainId: context.input.trustchainId,\n jwt: () => required(state.jwt, \"Missing JWT in the output\"),\n applicationPath: () =>\n required(\n state.trustchain\n ?.getAppStream(context.input.appId)\n .chain((stream) => stream.getPath())\n .extract(),\n \"Missing application path in the output\",\n ),\n encryptionKey: () =>\n required(\n state.encryptionKey,\n \"Missing encryption key in the output\",\n ),\n }),\n ),\n });\n }\n\n extractDependencies() {\n const authentication = new AuthenticateTask();\n const encryptionKeyExtraction = new ExtractEncryptionKeyTask();\n\n return {\n keypairAuth: ({ input }: { input: AuthenticateWithKeypairDAInput }) =>\n authentication.run(\n input.lkrpDataSource,\n new SignChallengeWithKeypairTask(input.keypair, input.trustchainId),\n ),\n\n getTrustchain: ({\n input,\n }: {\n input: {\n lkrpDataSource: LKRPDataSource;\n trustchainId: string;\n jwt: Either<AuthenticateDAError, JWT>;\n };\n }) =>\n EitherAsync.liftEither(input.jwt)\n .chain((jwt) =>\n input.lkrpDataSource.getTrustchainById(input.trustchainId, jwt),\n )\n .run(),\n\n extractEncryptionKey: async ({\n input,\n }: {\n input: {\n keypair: Keypair;\n stream: Either<AuthenticateDAError, LKRPBlockStream>;\n };\n }) =>\n EitherAsync.liftEither(input.stream).chain((stream) =>\n encryptionKeyExtraction.run(input.keypair, stream),\n ),\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["UserInteractionRequired", "XStateDeviceAction", "EitherAsync", "Left", "Right", "assign", "fromPromise", "setup", "AuthenticateDAStep", "LKRPDataSourceError", "LKRPUnauthorizedError", "LKRPUnknownError", "AuthenticateTask", "ExtractEncryptionKeyTask", "SignChallengeWithKeypairTask", "eitherSeqRecord", "required", "raiseAndAssign", "AuthenticateWithKeypairDeviceAction", "stateMachine", "keypairAuth", "getTrustchain", "extractEncryptionKey", "event", "input", "context", "jwt", "error", "trustchain", "encryptionKey", "state", "stream", "authentication", "encryptionKeyExtraction"]
|
|
7
|
+
}
|
package/lib/esm/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=AuthenticateWithDeviceDeviceActionTypes.js.map
|
package/lib/esm/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=AuthenticateWithKeypairDeviceActionTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/AuthenticateTask.ts"],
|
|
4
|
+
"sourcesContent": ["import { type Either } from \"purify-ts\";\n\nimport { type AuthenticateDAError } from \"@api/index\";\nimport {\n type AuthenticationPayload,\n type AuthenticationResponse,\n type Challenge,\n type LKRPDataSource,\n} from \"@internal/lkrp-datasource/data/LKRPDataSource\";\n\nexport class AuthenticateTask {\n run(\n lkrpDataSource: LKRPDataSource,\n signerTask: {\n run: (\n challenge: Challenge,\n ) => PromiseLike<Either<AuthenticateDAError, AuthenticationPayload>>;\n },\n ): Promise<Either<AuthenticateDAError, AuthenticationResponse>> {\n return lkrpDataSource\n .getChallenge()\n .chain((challenge) => signerTask.run(challenge))\n .chain((payload) => lkrpDataSource.authenticate(payload))\n .run();\n }\n}\n"],
|
|
5
|
+
"mappings": "AAUO,MAAMA,CAAiB,CAC5B,IACEC,EACAC,EAK8D,CAC9D,OAAOD,EACJ,aAAa,EACb,MAAOE,GAAcD,EAAW,IAAIC,CAAS,CAAC,EAC9C,MAAOC,GAAYH,EAAe,aAAaG,CAAO,CAAC,EACvD,IAAI,CACT,CACF",
|
|
6
|
+
"names": ["AuthenticateTask", "lkrpDataSource", "signerTask", "challenge", "payload"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{LKRPUnknownError as o}from"../../../api/app-binder/Errors";class i{async run(r,e){return Promise.resolve(e.getPublishedKey(r).map(t=>t.privateKey).toEither(new o("There is no encryption key for the current member in the application stream.")))}}export{i as ExtractEncryptionKeyTask};
|
|
2
|
+
//# sourceMappingURL=ExtractEncryptionKeyTask.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ExtractEncryptionKeyTask.ts"],
|
|
4
|
+
"sourcesContent": ["import { LKRPUnknownError } from \"@api/app-binder/Errors\";\nimport { type Keypair } from \"@api/index\";\nimport { type LKRPBlockStream } from \"@internal/utils/LKRPBlockStream\";\n\nexport type ExtractEncryptionKeyTaskInput = {\n applicationStream: LKRPBlockStream;\n keypair: Keypair;\n};\n\nexport class ExtractEncryptionKeyTask {\n async run(keypair: Keypair, stream: LKRPBlockStream) {\n // TODO additional derivations should be supported:\n // https://github.com/LedgerHQ/ledger-live/blob/develop/libs/hw-ledger-key-ring-protocol/src/Device.ts#L216...L226\n // Probably not needed for Ledger Sync\n return Promise.resolve(\n stream\n .getPublishedKey(keypair)\n .map((key) => key.privateKey)\n .toEither(\n new LKRPUnknownError(\n \"There is no encryption key for the current member in the application stream.\",\n ),\n ),\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,oBAAAA,MAAwB,yBAS1B,MAAMC,CAAyB,CACpC,MAAM,IAAIC,EAAkBC,EAAyB,CAInD,OAAO,QAAQ,QACbA,EACG,gBAAgBD,CAAO,EACvB,IAAKE,GAAQA,EAAI,UAAU,EAC3B,SACC,IAAIJ,EACF,8EACF,CACF,CACJ,CACF,CACF",
|
|
6
|
+
"names": ["LKRPUnknownError", "ExtractEncryptionKeyTask", "keypair", "stream", "key"]
|
|
7
|
+
}
|
package/lib/esm/internal/di.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Container as
|
|
1
|
+
import{Container as s}from"inversify";import{LKRPEnv as e}from"../api/index";import{appBindingModuleFactory as m}from"./app-binder/di/appBinderModule";import{lkrpDatasourceModuleFactory as c}from"./lkrp-datasource/di/lkrpDatasourceModuleFactory";import{useCasesModuleFactory as l}from"./use-cases/di/useCasesModule";import{externalTypes as n}from"./externalTypes";const f=({dmk:o,applicationId:a,env:r=e.PROD,baseUrl:i,stub:p})=>{const t=new s;return t.bind(n.Dmk).toConstantValue(o),t.bind(n.ApplicationId).toConstantValue(a),t.loadSync(m(),c({baseUrl:i??d.get(r),stub:p}),l()),t},d=new Map([[e.PROD,"https://trustchain.api.live.ledger.com/v1"],[e.STAGING,"https://trustchain-backend.api.aws.stg.ldg-tech.com/v1"]]);export{f as makeContainer};
|
|
2
2
|
//# sourceMappingURL=di.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/di.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["Container", "LKRPEnv", "appBindingModuleFactory", "lkrpDatasourceModuleFactory", "useCasesModuleFactory", "externalTypes", "makeContainer", "dmk", "
|
|
4
|
+
"sourcesContent": ["import { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { LKRPEnv } from \"@api/index\";\nimport { appBindingModuleFactory } from \"@internal/app-binder/di/appBinderModule\";\n\nimport { lkrpDatasourceModuleFactory } from \"./lkrp-datasource/di/lkrpDatasourceModuleFactory\";\nimport { useCasesModuleFactory } from \"./use-cases/di/useCasesModule\";\nimport { externalTypes } from \"./externalTypes\";\n\nexport type MakeContainerProps = {\n dmk: DeviceManagementKit;\n applicationId: number;\n env?: LKRPEnv;\n baseUrl?: string; // Optional base URL for the LKRP network requests\n stub?: boolean;\n};\n\nexport const makeContainer = ({\n dmk,\n applicationId,\n env = LKRPEnv.PROD,\n baseUrl,\n stub,\n}: MakeContainerProps) => {\n const container = new Container();\n\n container.bind<DeviceManagementKit>(externalTypes.Dmk).toConstantValue(dmk);\n container.bind(externalTypes.ApplicationId).toConstantValue(applicationId);\n\n container.loadSync(\n appBindingModuleFactory(),\n lkrpDatasourceModuleFactory({\n baseUrl: baseUrl ?? lkrpBaseUrlMap.get(env),\n stub,\n }),\n useCasesModuleFactory(),\n );\n\n return container;\n};\n\nconst lkrpBaseUrlMap = new Map<LKRPEnv, string>([\n [LKRPEnv.PROD, \"https://trustchain.api.live.ledger.com/v1\"],\n [LKRPEnv.STAGING, \"https://trustchain-backend.api.aws.stg.ldg-tech.com/v1\"],\n]);\n"],
|
|
5
|
+
"mappings": "AACA,OAAS,aAAAA,MAAiB,YAE1B,OAAS,WAAAC,MAAe,aACxB,OAAS,2BAAAC,MAA+B,0CAExC,OAAS,+BAAAC,MAAmC,mDAC5C,OAAS,yBAAAC,MAA6B,gCACtC,OAAS,iBAAAC,MAAqB,kBAUvB,MAAMC,EAAgB,CAAC,CAC5B,IAAAC,EACA,cAAAC,EACA,IAAAC,EAAMR,EAAQ,KACd,QAAAS,EACA,KAAAC,CACF,IAA0B,CACxB,MAAMC,EAAY,IAAIZ,EAEtB,OAAAY,EAAU,KAA0BP,EAAc,GAAG,EAAE,gBAAgBE,CAAG,EAC1EK,EAAU,KAAKP,EAAc,aAAa,EAAE,gBAAgBG,CAAa,EAEzEI,EAAU,SACRV,EAAwB,EACxBC,EAA4B,CAC1B,QAASO,GAAWG,EAAe,IAAIJ,CAAG,EAC1C,KAAAE,CACF,CAAC,EACDP,EAAsB,CACxB,EAEOQ,CACT,EAEMC,EAAiB,IAAI,IAAqB,CAC9C,CAACZ,EAAQ,KAAM,2CAA2C,EAC1D,CAACA,EAAQ,QAAS,wDAAwD,CAC5E,CAAC",
|
|
6
|
+
"names": ["Container", "LKRPEnv", "appBindingModuleFactory", "lkrpDatasourceModuleFactory", "useCasesModuleFactory", "externalTypes", "makeContainer", "dmk", "applicationId", "env", "baseUrl", "stub", "container", "lkrpBaseUrlMap"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const r={Dmk:Symbol.for("Dmk"),
|
|
1
|
+
const r={Dmk:Symbol.for("Dmk"),ApplicationId:Symbol.for("ApplicationId")};export{r as externalTypes};
|
|
2
2
|
//# sourceMappingURL=externalTypes.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/externalTypes.ts"],
|
|
4
|
-
"sourcesContent": ["export const externalTypes = {\n Dmk: Symbol.for(\"Dmk\"),\n
|
|
5
|
-
"mappings": "AAAO,MAAMA,EAAgB,CAC3B,IAAK,OAAO,IAAI,KAAK,EACrB,
|
|
4
|
+
"sourcesContent": ["export const externalTypes = {\n Dmk: Symbol.for(\"Dmk\"),\n ApplicationId: Symbol.for(\"ApplicationId\"),\n};\n\nexport type TrustedProperty = {\n iv: Uint8Array;\n issuer: Uint8Array;\n xpriv: Uint8Array;\n ephemeralPubKey: Uint8Array;\n commandIV: Uint8Array;\n groupKey: Uint8Array;\n newMember: Uint8Array;\n};\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAgB,CAC3B,IAAK,OAAO,IAAI,KAAK,EACrB,cAAe,OAAO,IAAI,eAAe,CAC3C",
|
|
6
6
|
"names": ["externalTypes"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var d=Object.defineProperty;var
|
|
1
|
+
var d=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var g=(s,t,e,r)=>{for(var i=r>1?void 0:r?y(t,e):t,o=s.length-1,n;o>=0;o--)(n=s[o])&&(i=(r?n(t,e,i):n(i))||i);return r&&i&&d(t,e,i),i},f=(s,t)=>(e,r)=>t(e,r,s);import{inject as S,injectable as T}from"inversify";import{EitherAsync as c,Just as m,Left as R,Maybe as b,Nothing as l,Right as p}from"purify-ts";import{LKRPDataSourceError as N}from"../../../api/app-binder/Errors";import{lkrpDatasourceTypes as k}from"../../lkrp-datasource/di/lkrpDatasourceTypes";import{Trustchain as L}from"../../utils/Trustchain";let u=class{constructor(t){this.baseUrl=t}getChallenge(){return this.request("/challenge",l)}authenticate(t){return this.request("/authenticate",l,{method:"POST",body:JSON.stringify(t)}).map(e=>({jwt:e,trustchainId:b.fromNullable(Object.keys(e.permissions).find(r=>!!e.permissions[r]?.["m/"]))}))}getTrustchainById(t,e){return this.request(`/trustchain/${t}`,m(e)).map(r=>new L(t,r))}postDerivation(t,e,r){return this.request(`/trustchain/${t}/derivation`,m(r),{method:"POST",body:JSON.stringify(e.toString())})}putCommands(t,e,r,i){return this.request(`/trustchain/${t}/commands`,m(i),{method:"PUT",body:JSON.stringify({path:e,blocks:[r.toString()]})})}request(t,e,r){const i=this.baseUrl+t,o={...r?.headers,"Content-Type":"application/json",...e.mapOrDefault(({access_token:n})=>({Authorization:`Bearer ${n}`}),{})};return c(()=>fetch(i,{...r,headers:o})).mapLeft(n=>({status:"UNKNOWN",message:h(n)})).chain(async n=>{switch(n.status){case 204:return p(void 0);default:return c(()=>n.json()).mapLeft(h).map(a=>n.ok?p(a):R(h(a))).chain(c.liftEither).mapLeft(a=>({status:P.get(n.status)??"UNKNOWN",message:`[${n.status}] ${a||n.statusText}`}))}}).mapLeft(({status:n,message:a})=>new N({status:n,message:`${a||"Unknown error"} (from: ${i})`}))}};u=g([T(),f(0,S(k.BaseUrl))],u);const P=new Map([[400,"BAD_REQUEST"],[401,"UNAUTHORIZED"]]);function h(s){if(s){if(typeof s!="object"||s.toString!=={}.toString)return String(s);if("message"in s)return String(s.message)}}export{u as HttpLKRPDataSource};
|
|
2
2
|
//# sourceMappingURL=HttpLKRPDataSource.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/lkrp-datasource/data/HttpLKRPDataSource.ts"],
|
|
4
|
-
"sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport { EitherAsync, Just, Left, Maybe, Nothing, Right } from \"purify-ts\";\n\nimport {\n LKRPDataSourceError,\n LKRPDataSourceErrorStatus,\n} from \"@api/app-binder/Errors\";\nimport { JWT } from \"@api/app-binder/LKRPTypes\";\nimport { lkrpDatasourceTypes } from \"@internal/lkrp-datasource/di/lkrpDatasourceTypes\";\nimport { LKRPBlock } from \"@internal/utils/LKRPBlock\";\nimport {
|
|
5
|
-
"mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAS,eAAAC,EAAa,QAAAC,EAAM,QAAAC,EAAM,SAAAC,EAAO,WAAAC,EAAS,SAAAC,MAAa,YAE/D,OACE,uBAAAC,MAEK,yBAEP,OAAS,uBAAAC,MAA2B,mDAEpC,OAAS,
|
|
6
|
-
"names": ["inject", "injectable", "EitherAsync", "Just", "Left", "Maybe", "Nothing", "Right", "LKRPDataSourceError", "lkrpDatasourceTypes", "
|
|
4
|
+
"sourcesContent": ["import { inject, injectable } from \"inversify\";\nimport { EitherAsync, Just, Left, Maybe, Nothing, Right } from \"purify-ts\";\n\nimport {\n LKRPDataSourceError,\n LKRPDataSourceErrorStatus,\n} from \"@api/app-binder/Errors\";\nimport { JWT } from \"@api/app-binder/LKRPTypes\";\nimport { lkrpDatasourceTypes } from \"@internal/lkrp-datasource/di/lkrpDatasourceTypes\";\nimport { LKRPBlock } from \"@internal/utils/LKRPBlock\";\nimport { Trustchain } from \"@internal/utils/Trustchain\";\n\nimport {\n AuthenticationPayload,\n Challenge,\n LKRPDataSource,\n} from \"./LKRPDataSource\";\n\n@injectable()\nexport class HttpLKRPDataSource implements LKRPDataSource {\n constructor(\n @inject(lkrpDatasourceTypes.BaseUrl) private readonly baseUrl: string,\n ) {}\n\n getChallenge() {\n return this.request<Challenge>(\"/challenge\", Nothing);\n }\n\n authenticate(payload: AuthenticationPayload) {\n return this.request<JWT>(\"/authenticate\", Nothing, {\n method: \"POST\",\n body: JSON.stringify(payload),\n }).map((jwt) => ({\n jwt,\n trustchainId: Maybe.fromNullable(\n Object.keys(jwt.permissions).find((id) =>\n Boolean(jwt.permissions[id]?.[\"m/\"]),\n ),\n ),\n }));\n }\n\n getTrustchainById(id: string, jwt: JWT) {\n return this.request<{ [path: string]: string }>(\n `/trustchain/${id}`,\n Just(jwt),\n ).map((serialized) => new Trustchain(id, serialized));\n }\n\n postDerivation(id: string, block: LKRPBlock, jwt: JWT) {\n return this.request<void>(`/trustchain/${id}/derivation`, Just(jwt), {\n method: \"POST\",\n body: JSON.stringify(block.toString()),\n });\n }\n\n putCommands(id: string, path: string, block: LKRPBlock, jwt: JWT) {\n return this.request<void>(`/trustchain/${id}/commands`, Just(jwt), {\n method: \"PUT\",\n body: JSON.stringify({ path, blocks: [block.toString()] }),\n });\n }\n\n private request<Res>(\n endpoint: `/${string}`,\n jwt: Maybe<{ access_token: string }>,\n init?: RequestInit,\n ): EitherAsync<LKRPDataSourceError, Res> {\n const href = this.baseUrl + endpoint;\n const headers = {\n ...init?.headers,\n \"Content-Type\": \"application/json\",\n ...jwt.mapOrDefault<{ Authorization?: string }>(\n ({ access_token }) => ({ Authorization: `Bearer ${access_token}` }),\n {},\n ),\n };\n\n return EitherAsync(() => fetch(href, { ...init, headers }))\n .mapLeft((err) => ({\n status: \"UNKNOWN\" as const,\n message: errToString(err),\n }))\n .chain(async (response) => {\n switch (response.status) {\n case 204:\n return Right(undefined as Res);\n\n default:\n return EitherAsync(() => response.json())\n .mapLeft(errToString)\n .map((data) =>\n response.ok ? Right(data as Res) : Left(errToString(data)),\n )\n .chain(EitherAsync.liftEither)\n .mapLeft((message) => ({\n status: statusMap.get(response.status) ?? \"UNKNOWN\",\n message: `[${response.status}] ${message || response.statusText}`,\n }));\n }\n })\n .mapLeft(\n ({ status, message }) =>\n new LKRPDataSourceError({\n status,\n message: `${message || \"Unknown error\"} (from: ${href})`,\n }),\n );\n }\n}\n\nconst statusMap = new Map<unknown, LKRPDataSourceErrorStatus>([\n [400, \"BAD_REQUEST\"],\n [401, \"UNAUTHORIZED\"],\n]);\n\nfunction errToString(error: unknown): string | void {\n if (!error) return undefined;\n if (typeof error !== \"object\") return String(error);\n if (error.toString !== {}.toString) return String(error);\n if (\"message\" in error) return String(error.message);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["inject", "injectable", "EitherAsync", "Just", "Left", "Maybe", "Nothing", "Right", "LKRPDataSourceError", "lkrpDatasourceTypes", "Trustchain", "HttpLKRPDataSource", "baseUrl", "Nothing", "payload", "jwt", "Maybe", "id", "Just", "serialized", "Trustchain", "block", "path", "endpoint", "init", "href", "headers", "access_token", "EitherAsync", "err", "errToString", "response", "Right", "data", "Left", "message", "statusMap", "status", "LKRPDataSourceError", "__decorateClass", "injectable", "__decorateParam", "inject", "lkrpDatasourceTypes", "error"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Just as
|
|
1
|
+
import{Just as p,Left as d,Nothing as b,Right as r}from"purify-ts";import{LKRPDataSourceError as h}from"../../../api/app-binder/Errors";import{LKRPBlock as m}from"../../utils/LKRPBlock";import{Trustchain as S}from"../../utils/Trustchain";import{HttpLKRPDataSource as c}from"./HttpLKRPDataSource";const n={access_token:"ACCESS TOKEN",permissions:{TRUSTCHAIN_ID:{"m/":["owner"]}}},i={version:0,challenge:{data:"1010101010010101010",expiry:"2025-06-30T10:00:00Z"},host:"example.com",rp:[{credential:{version:0,curveId:33,signAlgorithm:1,publicKey:"aaaaaaaaaaaaaaaaaaaaaaaaaa"},signature:"abababababababab"}],protocolVersion:{major:1,minor:0,patch:0}},u={credential:{version:0,curveId:33,signAlgorithm:1,publicKey:"bbbbbbbbbbbbbbbbbbbbbbbbbbb"},signature:"acacacacacacacac",attestation:"0000000000000000"};describe("HttpLKRPDataSource",()=>{const a=vi.spyOn(global,"fetch"),t="https://example.com";afterEach(()=>{a.mockClear()}),describe("getChallenge",()=>{it("should fetch challenge successfully",async()=>{const e={tlv:"0f1234567890",json:i};a.mockResolvedValueOnce({ok:!0,json:()=>Promise.resolve(e)});const s=await new c(t).getChallenge();expect(a).toHaveBeenCalledWith(`${t}/challenge`,{headers:{"Content-Type":"application/json"}}),expect(s).toEqual(r(e))}),it("should handle fetch error",async()=>{const e={status:"UNKNOWN",message:"Random error"};a.mockRejectedValueOnce(e);const s=await new c(t).getChallenge();expect(s).toEqual(d(new h({status:"UNKNOWN",message:`Random error (from: ${t}/challenge)`})))})}),describe("authenticate",()=>{it("should fetch a JWT when the authentication is successful",async()=>{a.mockResolvedValueOnce({ok:!0,json:()=>Promise.resolve(n)});const o=await new c(t).authenticate({challenge:i,signature:u});expect(a).toHaveBeenCalledWith(`${t}/authenticate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({challenge:i,signature:u})}),expect(o).toEqual(r({jwt:n,trustchainId:p("TRUSTCHAIN_ID")}))}),it("should return no trustchainId the returned JWT does not contain one",async()=>{const e={access_token:"ACCESS TOKEN",permissions:{}};a.mockResolvedValueOnce({ok:!0,json:()=>Promise.resolve(e)});const s=await new c(t).authenticate({challenge:i,signature:u});expect(s).toEqual(r({jwt:e,trustchainId:b}))}),it("should handle authentication error",async()=>{a.mockResolvedValueOnce({ok:!1,status:401,statusText:"Unauthorized",json:()=>Promise.resolve({message:"Unauthorized access"})});const o=await new c(t).authenticate({challenge:i,signature:u});expect(o).toEqual(d(new h({status:"UNAUTHORIZED",message:`[401] Unauthorized access (from: ${t}/authenticate)`})))})}),describe("getTrustchainById",()=>{it("should fetch trustchain by ID successfully",async()=>{const e={"m/":"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1e1d","m/16'":"1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b"};a.mockResolvedValueOnce({ok:!0,json:()=>Promise.resolve(e)});const s=await new c(t).getTrustchainById("TRUSTCHAIN_ID",n);expect(a).toHaveBeenCalledWith(`${t}/trustchain/TRUSTCHAIN_ID`,{headers:{"Content-Type":"application/json",Authorization:`Bearer ${n.access_token}`}}),expect(s).toEqual(r(new S("TRUSTCHAIN_ID",e)))}),it("should handle errors",async()=>{a.mockResolvedValueOnce({ok:!1,status:500,statusText:"Internal Server Error",json:()=>Promise.resolve({})});const o=await new c(t).getTrustchainById("TRUSTCHAIN_ID",n);expect(o).toEqual(d(new h({status:"UNKNOWN",message:`[500] Internal Server Error (from: ${t}/trustchain/TRUSTCHAIN_ID)`})))})}),describe("postDerivation",()=>{it("should post derivation successfully",async()=>{const e="0102030405060708090a0b0c0d0e0f",o=m.fromHex(e);a.mockResolvedValueOnce({ok:!0,status:204});const l=await new c(t).postDerivation("TRUSTCHAIN_ID",o,n);expect(a).toHaveBeenCalledWith(`${t}/trustchain/TRUSTCHAIN_ID/derivation`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n.access_token}`},body:JSON.stringify(e)}),expect(l).toEqual(r(void 0))})}),describe("putCommands",()=>{it("should put commands successfully",async()=>{const e="0102030405060708090a0b0c0d0e0f",o=m.fromHex(e);a.mockResolvedValueOnce({ok:!0,status:204});const l=await new c(t).putCommands("TRUSTCHAIN_ID","m/0'/16'/0'",o,n);expect(a).toHaveBeenCalledWith(`${t}/trustchain/TRUSTCHAIN_ID/commands`,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n.access_token}`},body:JSON.stringify({path:"m/0'/16'/0'",blocks:[e]})}),expect(l).toEqual(r(void 0))})})});
|
|
2
2
|
//# sourceMappingURL=HttpLKRPDataSource.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/lkrp-datasource/data/HttpLKRPDataSource.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { Just, Left, Nothing, Right } from \"purify-ts\";\n\nimport { LKRPDataSourceError } from \"@api/app-binder/Errors\";\nimport { LKRPBlock } from \"@internal/utils/LKRPBlock\";\nimport {
|
|
5
|
-
"mappings": "AAAA,OAAS,QAAAA,EAAM,QAAAC,EAAM,WAAAC,EAAS,SAAAC,MAAa,YAE3C,OAAS,uBAAAC,MAA2B,yBACpC,OAAS,aAAAC,MAAiB,4BAC1B,OAAS,
|
|
6
|
-
"names": ["Just", "Left", "Nothing", "Right", "LKRPDataSourceError", "LKRPBlock", "
|
|
4
|
+
"sourcesContent": ["import { Just, Left, Nothing, Right } from \"purify-ts\";\n\nimport { LKRPDataSourceError } from \"@api/app-binder/Errors\";\nimport { LKRPBlock } from \"@internal/utils/LKRPBlock\";\nimport { Trustchain } from \"@internal/utils/Trustchain\";\n\nimport { HttpLKRPDataSource } from \"./HttpLKRPDataSource\";\n\nconst mockJwt = {\n access_token: \"ACCESS TOKEN\",\n permissions: { TRUSTCHAIN_ID: { \"m/\": [\"owner\"] } },\n};\n\nconst mockChallengeJSON = {\n version: 0,\n challenge: {\n data: \"1010101010010101010\",\n expiry: \"2025-06-30T10:00:00Z\",\n },\n host: \"example.com\",\n rp: [\n {\n credential: {\n version: 0,\n curveId: 33,\n signAlgorithm: 1,\n publicKey: \"aaaaaaaaaaaaaaaaaaaaaaaaaa\",\n },\n signature: \"abababababababab\",\n },\n ],\n protocolVersion: { major: 1, minor: 0, patch: 0 },\n};\n\nconst mockSignature = {\n credential: {\n version: 0,\n curveId: 33,\n signAlgorithm: 1,\n publicKey: \"bbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n },\n signature: \"acacacacacacacac\",\n attestation: \"0000000000000000\",\n};\n\ndescribe(\"HttpLKRPDataSource\", () => {\n const fetchSpy = vi.spyOn(global, \"fetch\");\n const baseUrl = \"https://example.com\";\n\n afterEach(() => {\n fetchSpy.mockClear();\n });\n\n describe(\"getChallenge\", () => {\n it(\"should fetch challenge successfully\", async () => {\n // GIVEN\n const mockChallenge = {\n tlv: \"0f1234567890\",\n json: mockChallengeJSON,\n };\n\n fetchSpy.mockResolvedValueOnce({\n ok: true,\n json: () => Promise.resolve(mockChallenge),\n } as Response);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.getChallenge();\n expect(fetchSpy).toHaveBeenCalledWith(`${baseUrl}/challenge`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // THEN\n expect(result).toEqual(Right(mockChallenge));\n });\n\n it(\"should handle fetch error\", async () => {\n // GIVEN\n const error = { status: \"UNKNOWN\", message: \"Random error\" } as const;\n fetchSpy.mockRejectedValueOnce(error);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.getChallenge();\n\n // THEN\n expect(result).toEqual(\n Left(\n new LKRPDataSourceError({\n status: \"UNKNOWN\",\n message: `Random error (from: ${baseUrl}/challenge)`,\n }),\n ),\n );\n });\n });\n\n describe(\"authenticate\", () => {\n it(\"should fetch a JWT when the authentication is successful\", async () => {\n // GIVEN\n fetchSpy.mockResolvedValueOnce({\n ok: true,\n json: () => Promise.resolve(mockJwt),\n } as Response);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.authenticate({\n challenge: mockChallengeJSON,\n signature: mockSignature,\n });\n\n // THEN\n expect(fetchSpy).toHaveBeenCalledWith(`${baseUrl}/authenticate`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n challenge: mockChallengeJSON,\n signature: mockSignature,\n }),\n });\n expect(result).toEqual(\n Right({ jwt: mockJwt, trustchainId: Just(\"TRUSTCHAIN_ID\") }),\n );\n });\n\n it(\"should return no trustchainId the returned JWT does not contain one\", async () => {\n // GIVEN\n const jwtWithoutTrustchainId = {\n access_token: \"ACCESS TOKEN\",\n permissions: {},\n };\n fetchSpy.mockResolvedValueOnce({\n ok: true,\n json: () => Promise.resolve(jwtWithoutTrustchainId),\n } as Response);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.authenticate({\n challenge: mockChallengeJSON,\n signature: mockSignature,\n });\n\n // THEN\n expect(result).toEqual(\n Right({ jwt: jwtWithoutTrustchainId, trustchainId: Nothing }),\n );\n });\n\n it(\"should handle authentication error\", async () => {\n // GIVEN\n fetchSpy.mockResolvedValueOnce({\n ok: false,\n status: 401,\n statusText: \"Unauthorized\",\n json: () => Promise.resolve({ message: \"Unauthorized access\" }),\n } as Response);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.authenticate({\n challenge: mockChallengeJSON,\n signature: mockSignature,\n });\n\n // THEN\n expect(result).toEqual(\n Left(\n new LKRPDataSourceError({\n status: \"UNAUTHORIZED\",\n message: `[401] Unauthorized access (from: ${baseUrl}/authenticate)`,\n }),\n ),\n );\n });\n });\n\n describe(\"getTrustchainById\", () => {\n it(\"should fetch trustchain by ID successfully\", async () => {\n // GIVEN\n const mockTrustchainData = {\n \"m/\": \"0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1e1d\",\n \"m/16'\": \"1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b\",\n };\n fetchSpy.mockResolvedValueOnce({\n ok: true,\n json: () => Promise.resolve(mockTrustchainData),\n } as Response);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.getTrustchainById(\n \"TRUSTCHAIN_ID\",\n mockJwt,\n );\n\n // THEN\n expect(fetchSpy).toHaveBeenCalledWith(\n `${baseUrl}/trustchain/TRUSTCHAIN_ID`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${mockJwt.access_token}`,\n },\n },\n );\n expect(result).toEqual(\n Right(new Trustchain(\"TRUSTCHAIN_ID\", mockTrustchainData)),\n );\n });\n\n it(\"should handle errors\", async () => {\n // GIVEN\n fetchSpy.mockResolvedValueOnce({\n ok: false,\n status: 500,\n statusText: \"Internal Server Error\",\n json: () => Promise.resolve({}),\n } as Response);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.getTrustchainById(\n \"TRUSTCHAIN_ID\",\n mockJwt,\n );\n\n // THEN\n expect(result).toEqual(\n Left(\n new LKRPDataSourceError({\n status: \"UNKNOWN\",\n message: `[500] Internal Server Error (from: ${baseUrl}/trustchain/TRUSTCHAIN_ID)`,\n }),\n ),\n );\n });\n });\n\n describe(\"postDerivation\", () => {\n it(\"should post derivation successfully\", async () => {\n // GIVEN\n const hex = \"0102030405060708090a0b0c0d0e0f\";\n const mockBlock = LKRPBlock.fromHex(hex);\n fetchSpy.mockResolvedValueOnce({\n ok: true,\n status: 204,\n } as Response);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.postDerivation(\n \"TRUSTCHAIN_ID\",\n mockBlock,\n mockJwt,\n );\n\n // THEN\n expect(fetchSpy).toHaveBeenCalledWith(\n `${baseUrl}/trustchain/TRUSTCHAIN_ID/derivation`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${mockJwt.access_token}`,\n },\n body: JSON.stringify(hex),\n },\n );\n expect(result).toEqual(Right(undefined));\n });\n });\n\n describe(\"putCommands\", () => {\n it(\"should put commands successfully\", async () => {\n // GIVEN\n const hex = \"0102030405060708090a0b0c0d0e0f\";\n const mockBlock = LKRPBlock.fromHex(hex);\n fetchSpy.mockResolvedValueOnce({\n ok: true,\n status: 204,\n } as Response);\n\n // WHEN\n const dataSource = new HttpLKRPDataSource(baseUrl);\n const result = await dataSource.putCommands(\n \"TRUSTCHAIN_ID\",\n \"m/0'/16'/0'\",\n mockBlock,\n mockJwt,\n );\n\n // THEN\n expect(fetchSpy).toHaveBeenCalledWith(\n `${baseUrl}/trustchain/TRUSTCHAIN_ID/commands`,\n {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${mockJwt.access_token}`,\n },\n body: JSON.stringify({ path: \"m/0'/16'/0'\", blocks: [hex] }),\n },\n );\n expect(result).toEqual(Right(undefined));\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,QAAAA,EAAM,QAAAC,EAAM,WAAAC,EAAS,SAAAC,MAAa,YAE3C,OAAS,uBAAAC,MAA2B,yBACpC,OAAS,aAAAC,MAAiB,4BAC1B,OAAS,cAAAC,MAAkB,6BAE3B,OAAS,sBAAAC,MAA0B,uBAEnC,MAAMC,EAAU,CACd,aAAc,eACd,YAAa,CAAE,cAAe,CAAE,KAAM,CAAC,OAAO,CAAE,CAAE,CACpD,EAEMC,EAAoB,CACxB,QAAS,EACT,UAAW,CACT,KAAM,sBACN,OAAQ,sBACV,EACA,KAAM,cACN,GAAI,CACF,CACE,WAAY,CACV,QAAS,EACT,QAAS,GACT,cAAe,EACf,UAAW,4BACb,EACA,UAAW,kBACb,CACF,EACA,gBAAiB,CAAE,MAAO,EAAG,MAAO,EAAG,MAAO,CAAE,CAClD,EAEMC,EAAgB,CACpB,WAAY,CACV,QAAS,EACT,QAAS,GACT,cAAe,EACf,UAAW,6BACb,EACA,UAAW,mBACX,YAAa,kBACf,EAEA,SAAS,qBAAsB,IAAM,CACnC,MAAMC,EAAW,GAAG,MAAM,OAAQ,OAAO,EACnCC,EAAU,sBAEhB,UAAU,IAAM,CACdD,EAAS,UAAU,CACrB,CAAC,EAED,SAAS,eAAgB,IAAM,CAC7B,GAAG,sCAAuC,SAAY,CAEpD,MAAME,EAAgB,CACpB,IAAK,eACL,KAAMJ,CACR,EAEAE,EAAS,sBAAsB,CAC7B,GAAI,GACJ,KAAM,IAAM,QAAQ,QAAQE,CAAa,CAC3C,CAAa,EAIb,MAAMC,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,aAAa,EAC7C,OAAOD,CAAQ,EAAE,qBAAqB,GAAGC,CAAO,aAAc,CAC5D,QAAS,CACP,eAAgB,kBAClB,CACF,CAAC,EAGD,OAAOE,CAAM,EAAE,QAAQX,EAAMU,CAAa,CAAC,CAC7C,CAAC,EAED,GAAG,4BAA6B,SAAY,CAE1C,MAAME,EAAQ,CAAE,OAAQ,UAAW,QAAS,cAAe,EAC3DJ,EAAS,sBAAsBI,CAAK,EAIpC,MAAMD,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,aAAa,EAG7C,OAAOE,CAAM,EAAE,QACbb,EACE,IAAIG,EAAoB,CACtB,OAAQ,UACR,QAAS,uBAAuBQ,CAAO,aACzC,CAAC,CACH,CACF,CACF,CAAC,CACH,CAAC,EAED,SAAS,eAAgB,IAAM,CAC7B,GAAG,2DAA4D,SAAY,CAEzED,EAAS,sBAAsB,CAC7B,GAAI,GACJ,KAAM,IAAM,QAAQ,QAAQH,CAAO,CACrC,CAAa,EAIb,MAAMM,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,aAAa,CAC3C,UAAWH,EACX,UAAWC,CACb,CAAC,EAGD,OAAOC,CAAQ,EAAE,qBAAqB,GAAGC,CAAO,gBAAiB,CAC/D,OAAQ,OACR,QAAS,CACP,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CACnB,UAAWH,EACX,UAAWC,CACb,CAAC,CACH,CAAC,EACD,OAAOI,CAAM,EAAE,QACbX,EAAM,CAAE,IAAKK,EAAS,aAAcR,EAAK,eAAe,CAAE,CAAC,CAC7D,CACF,CAAC,EAED,GAAG,sEAAuE,SAAY,CAEpF,MAAMgB,EAAyB,CAC7B,aAAc,eACd,YAAa,CAAC,CAChB,EACAL,EAAS,sBAAsB,CAC7B,GAAI,GACJ,KAAM,IAAM,QAAQ,QAAQK,CAAsB,CACpD,CAAa,EAIb,MAAMF,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,aAAa,CAC3C,UAAWH,EACX,UAAWC,CACb,CAAC,EAGD,OAAOI,CAAM,EAAE,QACbX,EAAM,CAAE,IAAKa,EAAwB,aAAcd,CAAQ,CAAC,CAC9D,CACF,CAAC,EAED,GAAG,qCAAsC,SAAY,CAEnDS,EAAS,sBAAsB,CAC7B,GAAI,GACJ,OAAQ,IACR,WAAY,eACZ,KAAM,IAAM,QAAQ,QAAQ,CAAE,QAAS,qBAAsB,CAAC,CAChE,CAAa,EAIb,MAAMG,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,aAAa,CAC3C,UAAWH,EACX,UAAWC,CACb,CAAC,EAGD,OAAOI,CAAM,EAAE,QACbb,EACE,IAAIG,EAAoB,CACtB,OAAQ,eACR,QAAS,oCAAoCQ,CAAO,gBACtD,CAAC,CACH,CACF,CACF,CAAC,CACH,CAAC,EAED,SAAS,oBAAqB,IAAM,CAClC,GAAG,6CAA8C,SAAY,CAE3D,MAAMK,EAAqB,CACzB,KAAM,+DACN,QAAS,8DACX,EACAN,EAAS,sBAAsB,CAC7B,GAAI,GACJ,KAAM,IAAM,QAAQ,QAAQM,CAAkB,CAChD,CAAa,EAIb,MAAMH,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,kBAC9B,gBACAJ,CACF,EAGA,OAAOG,CAAQ,EAAE,qBACf,GAAGC,CAAO,4BACV,CACE,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAUJ,EAAQ,YAAY,EAC/C,CACF,CACF,EACA,OAAOM,CAAM,EAAE,QACbX,EAAM,IAAIG,EAAW,gBAAiBW,CAAkB,CAAC,CAC3D,CACF,CAAC,EAED,GAAG,uBAAwB,SAAY,CAErCN,EAAS,sBAAsB,CAC7B,GAAI,GACJ,OAAQ,IACR,WAAY,wBACZ,KAAM,IAAM,QAAQ,QAAQ,CAAC,CAAC,CAChC,CAAa,EAIb,MAAMG,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,kBAC9B,gBACAJ,CACF,EAGA,OAAOM,CAAM,EAAE,QACbb,EACE,IAAIG,EAAoB,CACtB,OAAQ,UACR,QAAS,sCAAsCQ,CAAO,4BACxD,CAAC,CACH,CACF,CACF,CAAC,CACH,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,sCAAuC,SAAY,CAEpD,MAAMM,EAAM,iCACNC,EAAYd,EAAU,QAAQa,CAAG,EACvCP,EAAS,sBAAsB,CAC7B,GAAI,GACJ,OAAQ,GACV,CAAa,EAIb,MAAMG,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,eAC9B,gBACAO,EACAX,CACF,EAGA,OAAOG,CAAQ,EAAE,qBACf,GAAGC,CAAO,uCACV,CACE,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAUJ,EAAQ,YAAY,EAC/C,EACA,KAAM,KAAK,UAAUU,CAAG,CAC1B,CACF,EACA,OAAOJ,CAAM,EAAE,QAAQX,EAAM,MAAS,CAAC,CACzC,CAAC,CACH,CAAC,EAED,SAAS,cAAe,IAAM,CAC5B,GAAG,mCAAoC,SAAY,CAEjD,MAAMe,EAAM,iCACNC,EAAYd,EAAU,QAAQa,CAAG,EACvCP,EAAS,sBAAsB,CAC7B,GAAI,GACJ,OAAQ,GACV,CAAa,EAIb,MAAMG,EAAS,MADI,IAAIP,EAAmBK,CAAO,EACjB,YAC9B,gBACA,cACAO,EACAX,CACF,EAGA,OAAOG,CAAQ,EAAE,qBACf,GAAGC,CAAO,qCACV,CACE,OAAQ,MACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAUJ,EAAQ,YAAY,EAC/C,EACA,KAAM,KAAK,UAAU,CAAE,KAAM,cAAe,OAAQ,CAACU,CAAG,CAAE,CAAC,CAC7D,CACF,EACA,OAAOJ,CAAM,EAAE,QAAQX,EAAM,MAAS,CAAC,CACzC,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["Just", "Left", "Nothing", "Right", "LKRPDataSourceError", "LKRPBlock", "Trustchain", "HttpLKRPDataSource", "mockJwt", "mockChallengeJSON", "mockSignature", "fetchSpy", "baseUrl", "mockChallenge", "result", "error", "jwtWithoutTrustchainId", "mockTrustchainData", "hex", "mockBlock"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var d=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var c=(n,e,r,t)=>{for(var i=t>1?void 0:t?m(e,r):e,s=n.length-1,a;s>=0;s--)(a=n[s])&&(i=(t?a(e,r,i):a(i))||i);return t&&i&&d(e,r,i),i},p=(n,e)=>(r,t)=>e(r,t,n);import{DeviceActionStatus as u}from"@ledgerhq/device-management-kit";import{inject as f,injectable as h}from"inversify";import{of as I}from"rxjs";import{LKRPMissingDataError as y}from"../../../api/app-binder/Errors";import{appBinderTypes as g}from"../../app-binder/di/appBinderTypes";let o=class{constructor(e){this.appBinder=e}execute(e){if(e.trustchainId)return this.appBinder.authenticateWithKeypair(e);const r=e.sessionId;return r?this.appBinder.authenticateWithDevice({...e,sessionId:r}):{observable:I({status:u.Error,error:new y("Either a trustchainId or a device is required for authentication.")}),cancel:()=>{}}}};o=c([h(),p(0,f(g.AppBinding))],o);export{o as AuthenticateUseCase};
|
|
2
2
|
//# sourceMappingURL=AuthenticateUseCase.js.map
|