UNPKG

@dwn-protocol/id-sdk

Version:

SDK for accessing the features and capabilities

163 lines (142 loc) 4.78 kB
import type { IDAgent } from '../agent/index.js'; import { CID } from 'multiformats'; import { Encoder, Encryption } from '@dwn-protocol/id'; import bs58 from 'bs58'; import IPFS from 'ipfs-infura'; import { getServiceDwnEndpoints } from '../service-options.js'; import _ from 'lodash'; export class Metadata { private agent: IDAgent; private connectedDid: string; private _ipfs: IPFS; constructor(options: { agent: IDAgent, connectedDid: string }) { this.agent = options.agent; this.connectedDid = options.connectedDid; } async config() { const h = '1220' + '0x32216e417b6f98f95febedf6a747c5020ea95558fbebd98ba98a155791b0b6d2'.slice(2); const b = Buffer.from(h, 'hex'); const c = bs58.encode(b); const r = await fetch(`https://dwn.infura-ipfs.io/ipfs/${CID.parse(c).toV1().toString()}`); return JSON.parse(bs58.decode(await r.text()).toString()); } async aliasGet(alias) { const relayer = _.sample(await getServiceDwnEndpoints()); const response = await fetch(`${relayer}/did/${alias}`, { method : 'GET', mode : 'cors', cache : 'no-cache', headers : { 'Accept' : '*/*', 'Content-Type' : 'application/json', }, }); return await response.text(); } async aliasSet(alias, did, metadata = { VerifiableCredentials: [] }) { const relayer = _.sample(await getServiceDwnEndpoints()); const response = await fetch(`${relayer}/did`, { method : 'POST', mode : 'cors', cache : 'no-cache', headers : { 'Accept' : '*/*', 'Content-Type' : 'application/json', }, body: JSON.stringify({ alias, did, metadata, }), }); return await response.text(); } async aliasPut(alias, did, metadata = { VerifiableCredentials: [] }) { const relayer = _.sample(await getServiceDwnEndpoints()); const response = await fetch(`${relayer}/did`, { method : 'PUT', mode : 'cors', cache : 'no-cache', headers : { 'Accept' : '*/*', 'Content-Type' : 'application/json', }, body: JSON.stringify({ alias, did, metadata, }), }); return await response.text(); } async save(data) { try { const b = Buffer.from(data); const d = bs58.encode(b); this._ipfs = new IPFS(await this.config()); const cid = await this._ipfs.add(d); this._ipfs = undefined; return this.getBytes32FromIpfsHash(cid.toString()); } catch (e) { throw new Error('Failure to submit file to IPFS'); } } async get(id) { try { const cid = this.getIpfsHashFromBytes32(id); const response = await fetch(`https://dwn.infura-ipfs.io/ipfs/${CID.parse(cid).toV1().toString()}`); const text = await response.text(); return bs58.decode(text).toString(); } catch (e) { throw new Error('Failure to get file from IPFS'); } } async saveJson(jsonData) { try { this._ipfs = new IPFS(await this.config()); const cid = await this._ipfs.addJSON(jsonData); this._ipfs = undefined; return this.getBytes32FromIpfsHash(cid.toString()); } catch (e) { throw new Error('Failure to submit file to IPFS'); } } async getJson(id) { try { const cid = this.getIpfsHashFromBytes32(id); const response = await fetch(`https://dwn.infura-ipfs.io/ipfs/${CID.parse(cid).toV1().toString()}`); const json = await response.json(); return json; } catch (e) { throw new Error('Failure to get file from IPFS'); } } async encrypt(publicKey, input) { let encryptionOutput = await Encryption.eciesSecp256k1Encrypt(publicKey, input); return Buffer.from(Encoder.bytesToString(Encoder.objectToBytes(encryptionOutput))).toString('base64'); } async decrypt(privateKey, output) { let newOutput = {}; let json = Buffer.from(output, 'base64').toString('ascii'); Object.entries(JSON.parse(json)).forEach((entry) => { const [key, value] = entry; //@ts-ignore newOutput[key] = value.type == 'Buffer' ? Buffer.from(value.data) : value; }); const decryptionInput = { privateKey, ...newOutput }; //@ts-ignore const decryptedPlaintext = await Encryption.eciesSecp256k1Decrypt(decryptionInput); return new TextDecoder().decode(decryptedPlaintext); } private getBytes32FromIpfsHash(ipfsHash) { return ( '0x' + bs58.decode(ipfsHash).slice(2).toString('hex') ); } private getIpfsHashFromBytes32(bytes32Hex) { const hashHex = '1220' + bytes32Hex.slice(2); const hashBytes = Buffer.from(hashHex, 'hex'); const hashStr = bs58.encode(hashBytes); return hashStr; } }