ipns-did
Version:
Library for resolving, creating, and publishing DID documents over IPNS
1 lines • 8.9 kB
Source Map (JSON)
{"version":3,"file":"index.modern.mjs","sources":["../src/index.ts"],"sourcesContent":["import { DIDResolutionResult, Resolver } from \"did-resolver\";\nimport { IPFS } from \"ipfs-core-types\";\nimport * as IPNSMethod from \"ipns-did-resolver\";\n\nimport { BlockMulticodec } from \"multiformat-multicodec\";\nimport { BlockCodec } from \"multiformats/codecs/interface\";\nimport { Hasher } from \"multiformats/hashes/hasher\";\n\nimport { sha256 } from \"multiformats/hashes/sha2\";\nimport * as json from \"@ipld/dag-json\";\nimport * as cbor from \"@ipld/dag-cbor\";\nimport * as pb from \"@ipld/dag-pb\";\n\nexport { DIDResolutionResult } from \"did-resolver\";\n\nimport { DIDDocument } from \"did-doc\";\n\nimport * as ipns from \"ipns\";\nimport { PeerId } from \"@libp2p/interface-peer-id\";\nimport { CID } from \"multiformats\";\n\ntype MultidecoderParam = {\n codecs?: [BlockCodec<any, any>];\n hashers?: [Hasher<any, any>];\n};\n\nexport default function (opts: {\n ipfs: IPFS;\n multicodecs?: MultidecoderParam;\n}) {\n const { ipfs, multicodecs } = opts;\n\n const multicodec = new BlockMulticodec<DIDDocument>({\n codecs: [json, pb, cbor as any].concat(multicodecs?.codecs || ([] as any)),\n hashers: multicodecs?.hashers || [],\n });\n\n const ipnsResolver = IPNSMethod.getResolver(\n ipfs.block,\n ipfs.name,\n multicodec as any\n );\n const resolver = new Resolver(ipnsResolver);\n\n return {\n /**\n * Resolve an IPNS method DID into a document.\n * @throws Will throw if DID method isn't `ipns`\n * @throws Will throw if IPNS cannot resolve into an IPFS CID\n * @throws Will throw if the document can't be found, or if the given path can't be followed\n */\n async resolve(did: string): Promise<DIDResolutionResult> {\n return await resolver.resolve(did);\n },\n\n async _publishValue(\n value: any,\n codec: number = cbor.code,\n hasher: number = sha256.code\n ): Promise<CID> {\n const serialized = await multicodec.encode({\n codec,\n value,\n hasher,\n });\n\n // Discard the returned CID, as we already got it during serialization;\n // and the ipfs-core API isn't as dynamic in what codecs it supports as we\n // are.\n await ipfs.block.put(serialized.bytes);\n return serialized.cid.toV1();\n },\n\n /**\n * Publish a DID document to IPNS using a given peer ID.\n * @param {DIDDocument} doc The DID document to publish\n * @param {Object} opts Document serialization options\n * @param {number} opts.codec Code of the codec used to serialize\n * @param {number} opts.hasher Code of the hasher used to serialize\n * @param {PeerId} peerId The peer ID (keypair) used to create the IPNS block\n * @param {number} lifetime The lifetime (TTL) of the published document, in milliseconds\n * @throws {TypeError} Will throw if the passed document isn't valid\n * @returns Returns the CIDs of the document and IPNS blocks\n */\n async publishDid(\n doc: DIDDocument,\n opts: { codec?: number; hasher?: number },\n peerId: PeerId,\n lifetime: number\n ): Promise<{ ipnsCid: CID; docCid: CID }> {\n if (!DIDDocument.isDoc(doc))\n throw new TypeError(\"Passed doc isn't valid DID document\");\n\n const ipfsCid: CID = await this._publishValue(\n doc,\n opts.codec || cbor.code,\n opts.hasher || sha256.code\n );\n const ipfsPath = \"/ipfs/\" + ipfsCid.toString();\n const pathBytes = Buffer.from(ipfsPath);\n\n const ipnsCid = peerId.toCID();\n const strkey = \"/ipns/\" + ipnsCid.toString();\n\n let rev: bigint = BigInt(0);\n try {\n for await (const e of ipfs.dht.get(strkey)) {\n if (e.name === \"VALUE\") {\n rev = ipns.unmarshal(e.value).sequence + BigInt(1);\n }\n }\n } catch {}\n\n const ipnsEntry = await ipns.create(peerId, pathBytes, rev, lifetime);\n const ipnsBlock = ipns.marshal(ipnsEntry);\n\n for await (const m of ipfs.dht.put(strkey, ipnsBlock));\n\n return {\n docCid: ipfsCid,\n ipnsCid,\n };\n },\n\n peerIdToDid(peerId: PeerId) {\n return `did:ipns:${peerId.toCID()}`;\n },\n\n domainToDid(domain: string) {\n return `did:ipns:${domain}`;\n },\n };\n}\n"],"names":["opts","ipfs","multicodecs","multicodec","BlockMulticodec","codecs","json","pb","cbor","concat","hashers","ipnsResolver","IPNSMethod","getResolver","block","name","resolver","Resolver","resolve","did","_publishValue","value","codec","code","hasher","sha256","serialized","encode","put","bytes","cid","toV1","publishDid","doc","peerId","lifetime","DIDDocument","isDoc","TypeError","ipfsCid","ipfsPath","toString","pathBytes","Buffer","from","ipnsCid","toCID","strkey","rev","BigInt","dht","get","e","ipns","unmarshal","sequence","ipnsEntry","create","ipnsBlock","marshal","m","docCid","peerIdToDid","domainToDid","domain"],"mappings":"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"}