73 lines
2.0 KiB
JavaScript
73 lines
2.0 KiB
JavaScript
/**
|
|
* Updates an existing IPNS record or creates a new IPNS record using w3name.
|
|
* @param {string} cid The CID to publish to IPNS
|
|
* @param {string} keyPath The path to the signing key
|
|
* @param {boolean} newIpns Whether to create a new IPNS record
|
|
* @param {boolean} verbose Whether to print verbose output
|
|
*/
|
|
|
|
import * as Name from 'w3name';
|
|
import fs from 'fs';
|
|
import minimist from 'minimist';
|
|
import process from 'process';
|
|
|
|
const SIGNING_KEY_PATH = '.web3name.key';
|
|
|
|
async function saveSigningKey(name, outputFilename = SIGNING_KEY_PATH) {
|
|
const bytes = name.key.bytes;
|
|
await fs.promises.writeFile(outputFilename, bytes);
|
|
}
|
|
|
|
async function loadSigningKey(filename) {
|
|
const bytes = await fs.promises.readFile(filename);
|
|
const name = await Name.from(bytes);
|
|
return name;
|
|
}
|
|
|
|
const {
|
|
cid,
|
|
key: keyPath,
|
|
newIpns,
|
|
verbose,
|
|
} = minimist(process.argv.slice(2), {
|
|
string: ['cid', 'key'],
|
|
boolean: ['newIpns', 'verbose'],
|
|
default: { verbose: false },
|
|
alias: { c: 'cid', k: 'key' },
|
|
});
|
|
|
|
if (!cid) {
|
|
console.error('Error: Provide the CID with the --cid flag.');
|
|
process.exit(1);
|
|
}
|
|
|
|
if (!keyPath && !newIpns) {
|
|
console.error(
|
|
'Error: To update an existing IPNS record, provide the path to the key file with the --key flag or create a new IPNS record with the --newIpns flag.'
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
let name;
|
|
let newRevision;
|
|
|
|
if (newIpns) {
|
|
if (verbose) console.log(`Creating new IPNS record with cid ${cid}...`);
|
|
name = await Name.create();
|
|
newRevision = await Name.v0(name, `/ipfs/${cid}`);
|
|
|
|
await saveSigningKey(name, keyPath);
|
|
if (verbose)
|
|
console.log(`The associated signing key is saved to ${keyPath ?? SIGNING_KEY_PATH}`);
|
|
} else {
|
|
if (verbose) console.log(`Updating existing IPNS record with cid ${cid}...`);
|
|
name = await loadSigningKey(keyPath);
|
|
const latestRevision = await Name.resolve(name);
|
|
newRevision = await Name.increment(latestRevision, `/ipfs/${cid}`);
|
|
}
|
|
|
|
if (verbose) console.log('Publishing...');
|
|
await Name.publish(newRevision, name.key);
|
|
|
|
console.log(`ipns://${name.toString()}`);
|