dag-jose
Version:
Typescript implementation of the IPLD dag-jose format
81 lines • 2.29 kB
JavaScript
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