{
  "version": 3,
  "sources": ["../../src/did-ion.ts", "../../src/did-key.ts", "../../src/utils.ts", "../../src/nop-cache.ts", "../../src/did-resolver.ts"],
  "sourcesContent": ["import type { PublicKeyJwk, PrivateKeyJwk } from '@tbd54566975/crypto';\nimport type { DidResolutionResult, DidMethodResolver, DidMethodCreator, DidState, DwnServiceEndpoint, DidDocument } from './types.js';\n\nimport { DID, generateKeyPair } from '@decentralized-identity/ion-tools';\n\nexport type DidIonCreateOptions = {\n  keys?: KeyOption[];\n  services?: ServiceOption[];\n};\n\nexport type ServiceOption = {\n  id: string;\n  type: string;\n  serviceEndpoint: string | DwnServiceEndpoint;\n}\n\nexport type KeyOption = {\n  id: string;\n  type: string;\n  keyPair: {\n    publicJwk: PublicKeyJwk;\n    privateJwk: PrivateKeyJwk;\n  },\n  purposes: string[];\n}\n\nexport class DidIonApi implements DidMethodResolver, DidMethodCreator {\n  /**\n   * @param resolutionEndpoint optional custom URL to send DID resolution request to\n   */\n  constructor (private resolutionEndpoint: string = 'https://discover.did.msidentity.com/1.0/identifiers/') {}\n\n  get methodName() {\n    return 'ion';\n  }\n\n  // TODO: discuss. need to normalize what's returned from `create`. DidIon.create and DidKey.create return different things.\n  async create(options: DidIonCreateOptions = {}): Promise<DidState> {\n    options.keys ||= [\n      {\n        id       : 'dwn',\n        type     : 'JsonWebKey2020',\n        keyPair  : await generateKeyPair(),\n        purposes : ['authentication'],\n      },\n    ];\n\n    const didOptions: any = { publicKeys: [] };\n    if (options.services) {\n      didOptions.services = options.services;\n    }\n\n    for (let key of options.keys) {\n      const publicKey: any = { ...key };\n\n      publicKey.publicKeyJwk = key.keyPair.publicJwk;\n      delete publicKey.keyPair;\n\n      didOptions.publicKeys.push(publicKey);\n    }\n\n    const did = new DID({ content: didOptions });\n    const didState = {\n      id         : await did.getURI(),\n      internalId : await did.getURI('short'),\n      methodData : await did.getAllOperations(),\n    };\n\n    // TODO: Migrate this to a utility function that generates a DID document given DidState.\n    // TODO: Add tests to DID Document generation function to ensure that it produces results identical to DidResolver.\n    // TODO: Ensure both DID ION and KEY do this consistently.\n    const didDocument: DidDocument = {\n      '@context'         : 'https://www.w3.org/ns/did/v1',\n      id                 : didState.id,\n      verificationMethod : [],\n    };\n\n    for (let key of didState.methodData[0].content.publicKeys) {\n      const verificationMethod = {\n        id           : `#${key.id}`,\n        controller   : didState.id,\n        type         : key.type,\n        publicKeyJwk : key.publicKeyJwk\n      };\n      didDocument.verificationMethod.push(verificationMethod);\n\n      for (let purpose of key.purposes) {\n        if (didDocument[purpose]) {\n          didDocument[purpose].push(key.id);\n        } else {\n          didDocument[purpose] = [`#${key.id}`];\n        }\n      }\n    }\n\n    for (let service of didState.methodData[0]?.content?.services || []) {\n      const serviceEntry = {\n        id              : `#${service.id}`,\n        type            : service.type,\n        serviceEndpoint : { ...service.serviceEndpoint }\n      };\n      if (didDocument.service) {\n        didDocument.service.push(serviceEntry);\n      } else {\n        didDocument.service = [serviceEntry];\n      }\n    }\n\n    const keys = [];\n    for (let keyOption of options.keys) {\n      const key = {\n        id            : `${didState.id}#${keyOption.id}`,\n        type          : keyOption.type,\n        controller    : didState.id,\n        publicKeyJwk  : keyOption.keyPair.publicJwk,\n        privateKeyJwk : keyOption.keyPair.privateJwk\n      };\n\n      keys.push(key);\n    }\n\n    return {\n      id          : didState.id,\n      internalId  : didState.internalId,\n      didDocument : didDocument,\n      methodData  : didState.methodData,\n      keys        : keys  // TODO: Remove keys once KeyManager/KeyStore implemented since everything BUT privateKeyJwk is already in the returned didDocument.\n    };\n  }\n\n  async resolve(did: string): Promise<DidResolutionResult> {\n    // TODO: Support resolutionOptions as defined in https://www.w3.org/TR/did-core/#did-resolution\n    // using `URL` constructor to handle both existence and absence of trailing slash '/' in resolution endpoint\n    // appending './' to DID so 'did' in 'did:ion:abc' doesn't get interpreted as a URL scheme (e.g. like 'http') due to the colon\n    // TODO: Add tests to ensure that the scenarios this contemplated are checked.\n    const resolutionUrl = new URL('./' + did, this.resolutionEndpoint).toString();\n    const response = await fetch(resolutionUrl);\n\n    // TODO: Replace with check of resonse.ok to catch other 2XX codes.\n    if (response.status !== 200) {\n      throw new Error(`unable to resolve ${did}, got http status ${response.status}`);\n    }\n\n    const didResolutionResult = await response.json();\n    return didResolutionResult;\n  }\n\n  /**\n   * Generates two key pairs used for authorization and encryption purposes\n   * when interfacing with DWNs. The IDs of these keys are referenced in the\n   * service object that includes the dwnUrls provided.\n   */\n  async generateDwnConfiguration(dwnUrls: string[]): Promise<DidIonCreateOptions> {\n    return DidIonApi.generateDwnConfiguration(dwnUrls);\n  }\n\n  /**\n   * Generates two key pairs used for authorization and encryption purposes\n   * when interfacing with DWNs. The IDs of these keys are referenced in the\n   * service object that includes the dwnUrls provided.\n   */\n  static async generateDwnConfiguration(dwnUrls: string[]): Promise<DidIonCreateOptions> {\n    const keys = [{\n      id       : 'authz',\n      type     : 'JsonWebKey2020',\n      keyPair  : await generateKeyPair('secp256k1'),\n      purposes : ['authentication'],\n    }, {\n      id       : 'enc',\n      type     : 'JsonWebKey2020',\n      keyPair  : await generateKeyPair('secp256k1'),\n      purposes : ['keyAgreement'],\n    }];\n\n    const services = [{\n      'id'              : 'dwn',\n      'type'            : 'DecentralizedWebNode',\n      'serviceEndpoint' : {\n        'nodes'                    : dwnUrls,\n        'messageAuthorizationKeys' : ['#authz'],\n        'recordEncryptionKeys'     : ['#enc']\n      }\n    }];\n\n    return { keys, services };\n  }\n}", "import { ed25519, utils } from '@tbd54566975/crypto';\nimport { DidKeyResolver } from '@tbd54566975/dwn-sdk-js';\nimport { createVerificationMethodWithPrivateKeyJwk } from './utils.js';\nimport { DidMethodCreator, DidMethodResolver, DidState } from './types.js';\n\nconst didKeyResolver = new DidKeyResolver();\n\nexport type DidKeyOptions = never;\n\n//! i know dwn-sdk-js has a resolver that includes both creation and resolving. but they're slightly different and we really\n//! need to settle on what the normalized result of did creation is.\n\nexport class DidKeyApi implements DidMethodResolver, DidMethodCreator {\n  get methodName() {\n    return 'key';\n  }\n\n  async create(_options: any = {}): Promise<DidState> {\n    // Generate new sign key pair.\n    const verificationKeyPair = ed25519.generateKeyPair();\n    const keyAgreementKeyPair = ed25519.deriveX25519KeyPair(verificationKeyPair);\n\n    const verificationKeyId = utils.bytesToBase58btcMultibase(utils.MULTICODEC_HEADERS.ED25519.PUB, verificationKeyPair.publicKey);\n    const keyAgreementKeyId = utils.bytesToBase58btcMultibase(utils.MULTICODEC_HEADERS.X25519.PUB, keyAgreementKeyPair.publicKey);\n\n    const id = `did:key:${verificationKeyId}`;\n\n    const verificationJwkPair = ed25519.keyPairToJwk(verificationKeyPair, verificationKeyId);\n    const verificationKey = createVerificationMethodWithPrivateKeyJwk(id, verificationJwkPair);\n\n    const keyAgreementJwkPair = ed25519.keyPairToJwk(keyAgreementKeyPair, keyAgreementKeyId, { crv: 'X25519' });\n    const keyAgreementKey = createVerificationMethodWithPrivateKeyJwk(id, keyAgreementJwkPair);\n\n    return {\n      id,\n      internalId : id,\n      // didDocument : {},  //! TODO: Add DidDocument to object returned.\n      keys       : [verificationKey, keyAgreementKey],\n      methodData : {}\n    };\n  }\n\n  resolve(did: string) {\n    // TODO: Support resolutionOptions as defined in https://www.w3.org/TR/did-core/#did-resolution\n    // TODO: move did:key resolving logic to this package. resolved Did Doc does **not** include keyAgreement\n    return didKeyResolver.resolve(did);\n  }\n}\n\n", "import type { KeyPairJwk } from '@tbd54566975/crypto';\nimport type { DidDocument, VerificationMethodWithPrivateKeyJwk, ServiceEndpoint } from './types.js';\n\nexport type ParsedDid = {\n  method: string;\n  id: string;\n}\n\nexport function parseDid(did: string): ParsedDid {\n  if (!DID_REGEX.test(did)) {\n    throw new Error('Invalid DID');\n  }\n\n  const [didString,] = did.split('#');\n  const [, method, id] = didString.split(':', 3);\n\n  return { method, id };\n}\n\nexport function createVerificationMethodWithPrivateKeyJwk(id: string, keyPairJwk: KeyPairJwk): VerificationMethodWithPrivateKeyJwk {\n  const { publicKeyJwk, privateKeyJwk } = keyPairJwk;\n\n  return {\n    id         : `${id}#${keyPairJwk.publicKeyJwk.kid}`,\n    type       : 'JsonWebKey2020',\n    controller : id,\n    publicKeyJwk,\n    privateKeyJwk\n  };\n}\n\nexport type GetServicesOptions = {\n  id?: string;\n  type?: string;\n};\n\n/**\n * returns services from the provided DID Document based on the filter. will return all services if no filter is provided\n * @param didDocument the did document to search\n * @param options search filter\n * @returns matched services\n */\nexport function getServices(didDocument: DidDocument, options: GetServicesOptions = {}): ServiceEndpoint[] {\n  return didDocument?.service?.filter(service => {\n    if (options?.id && service.id !== options.id) return false;\n    if (options?.type && service.type !== options.type) return false;\n    return true;\n  }) ?? [ ];\n}\n\nexport const DID_REGEX = /^did:([a-z0-9]+):((?:(?:[a-zA-Z0-9._-]|(?:%[0-9a-fA-F]{2}))*:)*((?:[a-zA-Z0-9._-]|(?:%[0-9a-fA-F]{2}))+))((;[a-zA-Z0-9_.:%-]+=[a-zA-Z0-9_.:%-]*)*)(\\/[^#?]*)?([?][^#]*)?(#.*)?$/;\n", "import type { DidResolutionResult, DidResolverCache } from './types.js';\n\n/**\n * no-op cache that is used as the default cache for did-resolver.\n * The motivation behind using a no-op cache as the default stems from\n * the desire to maximize the potential for this library to be used\n * in as many JS runtimes as possible\n */\nexport const nopCache: DidResolverCache = {\n  get: function (_key: string): Promise<DidResolutionResult> {\n    return;\n  },\n  set: function (_key: string, _value: DidResolutionResult): Promise<void> {\n    return;\n  },\n  delete: function (_key: string): Promise<void> {\n    return;\n  },\n  clear: function (): Promise<void> {\n    return;\n  },\n  close: function (): Promise<void> {\n    return;\n  }\n};", "import type { DidResolutionResult, DidMethodResolver, DidResolverCache } from './types.js';\n\nimport { parseDid } from './utils.js';\nimport { nopCache } from './nop-cache.js';\n\nexport type DidResolverOptions = {\n  methodResolvers: DidMethodResolver[];\n  cache?: DidResolverCache;\n}\n\nexport class DidResolver {\n  cache: DidResolverCache;\n  methodResolverMap: Map<string, DidMethodResolver> = new Map();\n\n  constructor(options: DidResolverOptions) {\n    this.cache = options.cache || nopCache;\n\n    for (let methodResolver of options.methodResolvers) {\n      this.methodResolverMap.set(methodResolver.methodName, methodResolver);\n    }\n  }\n\n  async resolve(did: string): Promise<DidResolutionResult> {\n    // TODO: Support resolutionOptions as defined in https://www.w3.org/TR/did-core/#did-resolution\n    const { method } = parseDid(did);\n    const resolver = this.methodResolverMap.get(method);\n\n    if (!resolver) {\n      throw new Error(`no resolver for ${method}`);\n    }\n\n    const cachedResolution = await this.cache.get(did);\n\n    if (cachedResolution) {\n      return cachedResolution;\n    } else {\n      const didResolutionResult = await resolver.resolve(did);\n      await this.cache.set(did, didResolutionResult);\n\n      return didResolutionResult;\n    }\n  }\n}"],
  "mappings": "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",
  "names": []
}
