{"version":3,"file":"JwkDidRegistrar.mjs","names":[],"sources":["../../../../../src/modules/dids/methods/jwk/JwkDidRegistrar.ts"],"sourcesContent":["import type { AgentContext } from '../../../../agent'\nimport type { XOR } from '../../../../types'\nimport {\n  KeyManagementApi,\n  type KmsCreateKeyOptions,\n  type KmsCreateKeyTypeAsymmetric,\n  type KmsJwkPublicAsymmetric,\n  PublicJwk,\n} from '../../../kms'\n\nimport { DidDocumentRole } from '../../domain/DidDocumentRole'\nimport type { DidRegistrar } from '../../domain/DidRegistrar'\nimport { DidRecord, DidRepository } from '../../repository'\nimport type { DidCreateOptions, DidCreateResult, DidDeactivateResult, DidUpdateResult } from '../../types'\nimport { DidJwk } from './DidJwk'\n\nexport class JwkDidRegistrar implements DidRegistrar {\n  public readonly supportedMethods = ['jwk']\n\n  public async create(agentContext: AgentContext, options: JwkDidCreateOptions): Promise<DidCreateResult> {\n    const didRepository = agentContext.dependencyManager.resolve(DidRepository)\n\n    try {\n      let publicJwk: KmsJwkPublicAsymmetric\n      let keyId: string\n      const kms = agentContext.dependencyManager.resolve(KeyManagementApi)\n\n      if (options.options.createKey) {\n        const createKeyResult = await kms.createKey(options.options.createKey)\n        publicJwk = createKeyResult.publicJwk\n        keyId = createKeyResult.keyId\n      } else if (options.options.keyId) {\n        const _publicJwk = await kms.getPublicKey({ keyId: options.options.keyId })\n        keyId = options.options.keyId\n        if (!_publicJwk) {\n          return {\n            didDocumentMetadata: {},\n            didRegistrationMetadata: {},\n            didState: {\n              state: 'failed',\n              reason: `notFound: key with key id '${options.options.keyId}' not found`,\n            },\n          }\n        }\n\n        if (_publicJwk.kty === 'oct') {\n          return {\n            didDocumentMetadata: {},\n            didRegistrationMetadata: {},\n            didState: {\n              state: 'failed',\n              reason: `notFound: key with key id '${options.options.keyId}' uses unsupported kty 'oct' for did:jwk`,\n            },\n          }\n        }\n\n        publicJwk = _publicJwk\n      } else {\n        return {\n          didDocumentMetadata: {},\n          didRegistrationMetadata: {},\n          didState: {\n            state: 'failed',\n            reason: 'Missing keyId or createKey',\n          },\n        }\n      }\n\n      const didJwk = DidJwk.fromPublicJwk(PublicJwk.fromPublicJwk(publicJwk))\n\n      // Save the did so we know we created it and can issue with it\n      const didRecord = new DidRecord({\n        did: didJwk.did,\n        role: DidDocumentRole.Created,\n        keys: [\n          {\n            didDocumentRelativeKeyId: '#0',\n            kmsKeyId: keyId,\n          },\n        ],\n      })\n      await didRepository.save(agentContext, didRecord)\n\n      return {\n        didDocumentMetadata: {},\n        didRegistrationMetadata: {},\n        didState: {\n          state: 'finished',\n          did: didJwk.did,\n          didDocument: didJwk.didDocument,\n        },\n      }\n    } catch (error) {\n      return {\n        didDocumentMetadata: {},\n        didRegistrationMetadata: {},\n        didState: {\n          state: 'failed',\n          reason: `unknownError: ${error.message}`,\n        },\n      }\n    }\n  }\n\n  public async update(): Promise<DidUpdateResult> {\n    return {\n      didDocumentMetadata: {},\n      didRegistrationMetadata: {},\n      didState: {\n        state: 'failed',\n        reason: 'notSupported: cannot update did:jwk did',\n      },\n    }\n  }\n\n  public async deactivate(): Promise<DidDeactivateResult> {\n    return {\n      didDocumentMetadata: {},\n      didRegistrationMetadata: {},\n      didState: {\n        state: 'failed',\n        reason: 'notSupported: cannot deactivate did:jwk did',\n      },\n    }\n  }\n}\n\nexport interface JwkDidCreateOptions extends DidCreateOptions {\n  method: 'jwk'\n  // For now we don't support creating a did:jwk with a did or did document\n  did?: never\n  didDocument?: never\n  secret?: never\n\n  /**\n   * You can create a did:jwk based on an existing `keyId`, or provide `createKey` options\n   * to create a new key.\n   */\n  options: XOR<{ createKey: KmsCreateKeyOptions<KmsCreateKeyTypeAsymmetric> }, { keyId: string }>\n}\n\n// Update and Deactivate not supported for did:jwk\nexport type JwkDidUpdateOptions = never\nexport type JwkDidDeactivateOptions = never\n"],"mappings":";;;;;;;;;;;;AAgBA,IAAa,kBAAb,MAAqD;;OACnC,mBAAmB,CAAC,MAAM;;CAE1C,MAAa,OAAO,cAA4B,SAAwD;EACtG,MAAM,gBAAgB,aAAa,kBAAkB,QAAQ,cAAc;AAE3E,MAAI;GACF,IAAI;GACJ,IAAI;GACJ,MAAM,MAAM,aAAa,kBAAkB,QAAQ,iBAAiB;AAEpE,OAAI,QAAQ,QAAQ,WAAW;IAC7B,MAAM,kBAAkB,MAAM,IAAI,UAAU,QAAQ,QAAQ,UAAU;AACtE,gBAAY,gBAAgB;AAC5B,YAAQ,gBAAgB;cACf,QAAQ,QAAQ,OAAO;IAChC,MAAM,aAAa,MAAM,IAAI,aAAa,EAAE,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,YAAQ,QAAQ,QAAQ;AACxB,QAAI,CAAC,WACH,QAAO;KACL,qBAAqB,EAAE;KACvB,yBAAyB,EAAE;KAC3B,UAAU;MACR,OAAO;MACP,QAAQ,8BAA8B,QAAQ,QAAQ,MAAM;MAC7D;KACF;AAGH,QAAI,WAAW,QAAQ,MACrB,QAAO;KACL,qBAAqB,EAAE;KACvB,yBAAyB,EAAE;KAC3B,UAAU;MACR,OAAO;MACP,QAAQ,8BAA8B,QAAQ,QAAQ,MAAM;MAC7D;KACF;AAGH,gBAAY;SAEZ,QAAO;IACL,qBAAqB,EAAE;IACvB,yBAAyB,EAAE;IAC3B,UAAU;KACR,OAAO;KACP,QAAQ;KACT;IACF;GAGH,MAAM,SAAS,OAAO,cAAc,UAAU,cAAc,UAAU,CAAC;GAGvE,MAAM,YAAY,IAAI,UAAU;IAC9B,KAAK,OAAO;IACZ,MAAM,gBAAgB;IACtB,MAAM,CACJ;KACE,0BAA0B;KAC1B,UAAU;KACX,CACF;IACF,CAAC;AACF,SAAM,cAAc,KAAK,cAAc,UAAU;AAEjD,UAAO;IACL,qBAAqB,EAAE;IACvB,yBAAyB,EAAE;IAC3B,UAAU;KACR,OAAO;KACP,KAAK,OAAO;KACZ,aAAa,OAAO;KACrB;IACF;WACM,OAAO;AACd,UAAO;IACL,qBAAqB,EAAE;IACvB,yBAAyB,EAAE;IAC3B,UAAU;KACR,OAAO;KACP,QAAQ,iBAAiB,MAAM;KAChC;IACF;;;CAIL,MAAa,SAAmC;AAC9C,SAAO;GACL,qBAAqB,EAAE;GACvB,yBAAyB,EAAE;GAC3B,UAAU;IACR,OAAO;IACP,QAAQ;IACT;GACF;;CAGH,MAAa,aAA2C;AACtD,SAAO;GACL,qBAAqB,EAAE;GACvB,yBAAyB,EAAE;GAC3B,UAAU;IACR,OAAO;IACP,QAAQ;IACT;GACF"}