UNPKG

dag-jose

Version:

Typescript implementation of the IPLD dag-jose format

81 lines 2.29 kB
import { fromBase64url, toBase64url } from './utils.js'; import { CID } from 'multiformats/cid'; export function fromSplit(split) { const [protectedHeader, payload, signature] = split; return { payload, signatures: [{ protected: protectedHeader, signature }], link: CID.decode(fromBase64url(payload)), }; } function encodeSignature(signature) { const encoded = { signature: fromBase64url(signature.signature), }; if (signature.header) encoded.header = signature.header; if (signature.protected) encoded.protected = fromBase64url(signature.protected); return encoded; } export function encode(jws) { const payload = fromBase64url(jws.payload); return { payload, signatures: jws.signatures.map(encodeSignature), }; } function decodeSignature(encoded) { const sign = { signature: toBase64url(encoded.signature), }; if (encoded.header) sign.header = encoded.header; if (encoded.protected) sign.protected = toBase64url(encoded.protected); return sign; } export function decode(encoded) { const decoded = { payload: toBase64url(encoded.payload), signatures: encoded.signatures.map(decodeSignature), }; try { decoded.pld = replaceCIDs(payloadToJSON(encoded.payload)); return decoded; } catch (e) { try { decoded.link = CID.decode(new Uint8Array(encoded.payload)); return decoded; } catch (e) { throw new Error('Invalid payload, must be either JSON or CID'); } } } function replaceCIDs(data) { if (typeof data === 'string') { if (data.startsWith('ipfs://')) { return CID.parse(data.slice(7)); } } else if (Array.isArray(data)) { return data.map(replaceCIDs); } else if (isObject(data)) { const newObj = {}; for (const key in data) { newObj[key] = replaceCIDs(data[key]); } return newObj; } return data; } function isObject(data) { return typeof data === 'object' && data !== null; } function payloadToJSON(data) { return JSON.parse(new TextDecoder().decode(data)); } //# sourceMappingURL=signing.js.map