Implement commands for record operations
This commit is contained in:
parent
977d9a8ffa
commit
97dbbf87c0
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
|
|
||||||
dist/*
|
dist/*
|
||||||
|
|
||||||
|
config.yml
|
||||||
|
7
config.example.yml
Normal file
7
config.example.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
services:
|
||||||
|
cns:
|
||||||
|
restEndpoint: 'http://localhost:1317'
|
||||||
|
gqlEndpoint: 'http://localhost:9473/api'
|
||||||
|
userKey:
|
||||||
|
bondId:
|
||||||
|
chainId: chibaclonk_9000-1
|
@ -6,11 +6,17 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/js-yaml": "^4.0.5",
|
||||||
|
"@types/lodash": "^4.14.182",
|
||||||
"@types/node": "^17.0.25",
|
"@types/node": "^17.0.25",
|
||||||
"@types/yargs": "^17.0.10",
|
"@types/yargs": "^17.0.10",
|
||||||
"typescript": "^4.6.3"
|
"typescript": "^4.6.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"chiba-clonk-client": "https://github.com/vulcanize/chiba-clonk-client.git#646e44c1d29bc312834604ada7088e955dbc2303",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"lodash-clean": "^2.2.3",
|
||||||
"yargs": "^17.4.1"
|
"yargs": "^17.4.1"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
25
src/cmds/cns-cmds/record-cmds/get.ts
Normal file
25
src/cmds/cns-cmds/record-cmds/get.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import { Arguments } from 'yargs';
|
||||||
|
import assert from 'assert';
|
||||||
|
import { Registry } from 'chiba-clonk-client';
|
||||||
|
|
||||||
|
import { getConfig, getConnectionInfo } from '../../../util';
|
||||||
|
|
||||||
|
export const command = 'get';
|
||||||
|
|
||||||
|
export const desc = 'Get record.';
|
||||||
|
|
||||||
|
export const handler = async (argv: Arguments) => {
|
||||||
|
const { id, config } = argv;
|
||||||
|
assert(id, 'Invalid Record ID.');
|
||||||
|
|
||||||
|
const { services: { cns: cnsConfig } } = getConfig(config as string)
|
||||||
|
const { restEndpoint, gqlEndpoint, chainId } = getConnectionInfo(argv, cnsConfig);
|
||||||
|
assert(restEndpoint, 'Invalid CNS REST endpoint.');
|
||||||
|
assert(gqlEndpoint, 'Invalid CNS GQL endpoint.');
|
||||||
|
assert(chainId, 'Invalid CNS Chain ID.');
|
||||||
|
|
||||||
|
const registry = new Registry(restEndpoint, gqlEndpoint, chainId);
|
||||||
|
const result = await registry.getRecordsByIds([id as string]);
|
||||||
|
|
||||||
|
console.log(JSON.stringify(result, undefined, 2));
|
||||||
|
}
|
40
src/cmds/cns-cmds/record-cmds/list.ts
Normal file
40
src/cmds/cns-cmds/record-cmds/list.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import { Arguments } from 'yargs';
|
||||||
|
import assert from 'assert';
|
||||||
|
import { Registry } from 'chiba-clonk-client';
|
||||||
|
|
||||||
|
import { getConfig, getConnectionInfo } from '../../../util';
|
||||||
|
|
||||||
|
export const command = 'list';
|
||||||
|
|
||||||
|
export const desc = 'List records.';
|
||||||
|
|
||||||
|
export const builder = {
|
||||||
|
'bond-id': {
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
|
all: {
|
||||||
|
type: 'boolean',
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const handler = async (argv: Arguments) => {
|
||||||
|
const { services: { cns: cnsConfig } } = getConfig(argv.config as string)
|
||||||
|
const { restEndpoint, gqlEndpoint, chainId } = getConnectionInfo(argv, cnsConfig);
|
||||||
|
const { type, name, bondId, all } = argv;
|
||||||
|
|
||||||
|
assert(restEndpoint, 'Invalid CNS REST endpoint.');
|
||||||
|
assert(gqlEndpoint, 'Invalid CNS GQL endpoint.');
|
||||||
|
assert(chainId, 'Invalid CNS Chain ID.');
|
||||||
|
|
||||||
|
const registry = new Registry(restEndpoint, gqlEndpoint, chainId);
|
||||||
|
|
||||||
|
const result = await registry.queryRecords({ bondId, type, name }, all as boolean);
|
||||||
|
console.log(JSON.stringify(result, undefined, 2));
|
||||||
|
}
|
44
src/cmds/cns-cmds/record-cmds/publish.ts
Normal file
44
src/cmds/cns-cmds/record-cmds/publish.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import { Arguments } from 'yargs';
|
||||||
|
import assert from 'assert';
|
||||||
|
import path from 'path';
|
||||||
|
import yaml from 'js-yaml';
|
||||||
|
import fs from 'fs';
|
||||||
|
import { Registry } from 'chiba-clonk-client';
|
||||||
|
|
||||||
|
import { getConfig, getGasAndFees, getConnectionInfo } from '../../../util';
|
||||||
|
|
||||||
|
export const command = 'publish';
|
||||||
|
|
||||||
|
export const desc = 'Register record.';
|
||||||
|
|
||||||
|
export const builder = {
|
||||||
|
'bond-id': {
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export const handler = async (argv: Arguments) => {
|
||||||
|
const { txKey, filename, verbose, config } = argv;
|
||||||
|
const { services: { cns: cnsConfig } } = getConfig(config as string)
|
||||||
|
const { restEndpoint, gqlEndpoint, userKey, bondId, chainId } = getConnectionInfo(argv, cnsConfig);
|
||||||
|
|
||||||
|
assert(restEndpoint, 'Invalid CNS REST endpoint.');
|
||||||
|
assert(gqlEndpoint, 'Invalid CNS GQL endpoint.');
|
||||||
|
assert(userKey, 'Invalid User Key.');
|
||||||
|
assert(bondId, 'Invalid Bond ID.');
|
||||||
|
assert(chainId, 'Invalid CNS Chain ID.');
|
||||||
|
|
||||||
|
let file = null;
|
||||||
|
if (filename) {
|
||||||
|
file = path.join(process.cwd(), filename as string);
|
||||||
|
} else {
|
||||||
|
file = 0; // stdin
|
||||||
|
}
|
||||||
|
|
||||||
|
const { record } = await yaml.load(fs.readFileSync(file, 'utf-8')) as any;
|
||||||
|
const registry = new Registry(restEndpoint, gqlEndpoint, chainId);
|
||||||
|
const fee = getGasAndFees(argv, cnsConfig);
|
||||||
|
const result = await registry.setRecord({ privateKey: userKey, record, bondId }, txKey as string, fee);
|
||||||
|
|
||||||
|
console.log(verbose ? JSON.stringify(result, undefined, 2) : result.data);
|
||||||
|
}
|
9
src/cmds/cns-cmds/record.ts
Normal file
9
src/cmds/cns-cmds/record.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import yargs from 'yargs';
|
||||||
|
|
||||||
|
export const command = 'record';
|
||||||
|
|
||||||
|
export const desc = 'Record operations.';
|
||||||
|
|
||||||
|
exports.builder = (yargs: yargs.Argv) => {
|
||||||
|
return yargs.commandDir('record-cmds')
|
||||||
|
}
|
@ -1,17 +0,0 @@
|
|||||||
import yargs, { Arguments } from 'yargs';
|
|
||||||
|
|
||||||
export const command = 'start';
|
|
||||||
|
|
||||||
export const desc = 'Start local CNS.';
|
|
||||||
|
|
||||||
exports.builder = {
|
|
||||||
'log-file': {
|
|
||||||
type: 'string'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.handler = function (argv: Arguments) {
|
|
||||||
const { logFile } = argv;
|
|
||||||
|
|
||||||
console.log('option logFile', logFile)
|
|
||||||
}
|
|
24
src/cmds/cns-cmds/status.ts
Normal file
24
src/cmds/cns-cmds/status.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { Arguments } from 'yargs';
|
||||||
|
import assert from 'assert';
|
||||||
|
import { Registry } from 'chiba-clonk-client';
|
||||||
|
|
||||||
|
import { getConfig, getConnectionInfo } from '../../util';
|
||||||
|
|
||||||
|
export const command = 'status';
|
||||||
|
|
||||||
|
export const desc = 'Get CNS status.';
|
||||||
|
|
||||||
|
export const handler = async (argv: Arguments) => {
|
||||||
|
const { services: { cns } } = getConfig(argv.config as string)
|
||||||
|
const { restEndpoint, gqlEndpoint, chainId } = getConnectionInfo(argv, cns);
|
||||||
|
assert(restEndpoint, 'Invalid CNS REST endpoint.');
|
||||||
|
assert(gqlEndpoint, 'Invalid CNS GQL endpoint.');
|
||||||
|
assert(chainId, 'Invalid CNS Chain ID.');
|
||||||
|
|
||||||
|
console.log('parse argv', restEndpoint, gqlEndpoint, chainId)
|
||||||
|
const registry = new Registry(restEndpoint, gqlEndpoint, chainId);
|
||||||
|
|
||||||
|
// TODO: Implement getStatus method.
|
||||||
|
// const result = await registry.getStatus();
|
||||||
|
// console.log(JSON.stringify(result, undefined, 2));
|
||||||
|
}
|
@ -5,5 +5,17 @@ export const command = 'cns';
|
|||||||
export const desc = 'CNS tools';
|
export const desc = 'CNS tools';
|
||||||
|
|
||||||
exports.builder = (yargs: yargs.Argv) => {
|
exports.builder = (yargs: yargs.Argv) => {
|
||||||
return yargs.commandDir('cns-cmds')
|
return yargs
|
||||||
|
.options({
|
||||||
|
'user-key': { type: 'string' },
|
||||||
|
'tx-key': { type: 'string' },
|
||||||
|
'bond-id': { type: 'string' },
|
||||||
|
'chain-id': { type: 'string' },
|
||||||
|
'filename': { alias: 'f' },
|
||||||
|
'id': { type: 'string' },
|
||||||
|
'gas': { type: 'string' },
|
||||||
|
'fees': { type: 'string' }
|
||||||
|
})
|
||||||
|
.commandDir('cns-cmds')
|
||||||
|
.help()
|
||||||
}
|
}
|
||||||
|
1
src/decs.d.ts
vendored
Normal file
1
src/decs.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
declare module 'lodash-clean'
|
15
src/index.ts
15
src/index.ts
@ -2,6 +2,21 @@ import yargs from 'yargs/yargs';
|
|||||||
import { hideBin } from 'yargs/helpers';
|
import { hideBin } from 'yargs/helpers';
|
||||||
|
|
||||||
yargs(hideBin(process.argv))
|
yargs(hideBin(process.argv))
|
||||||
|
.options({
|
||||||
|
verbose: {
|
||||||
|
description: 'Verbose output',
|
||||||
|
demand: false,
|
||||||
|
default: false,
|
||||||
|
type: 'boolean',
|
||||||
|
alias: 'v'
|
||||||
|
},
|
||||||
|
config: {
|
||||||
|
alias: 'c',
|
||||||
|
default: 'config.yml',
|
||||||
|
describe: 'Config file path.',
|
||||||
|
type: 'string'
|
||||||
|
}
|
||||||
|
})
|
||||||
.commandDir('cmds')
|
.commandDir('cmds')
|
||||||
.demandCommand()
|
.demandCommand()
|
||||||
.help()
|
.help()
|
||||||
|
16
src/util/common.ts
Normal file
16
src/util/common.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { Arguments } from "yargs";
|
||||||
|
import clean from 'lodash-clean';
|
||||||
|
|
||||||
|
export const getConnectionInfo = (argv: Arguments, config: any) => {
|
||||||
|
const { server, userKey, bondId, txKey, chainId, fees, gas } = argv;
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
...config,
|
||||||
|
...clean({ server, userKey, bondId, txKey, chainId }),
|
||||||
|
privateKey: txKey || userKey || config.userKey,
|
||||||
|
gas: String(gas || config.gas),
|
||||||
|
fees: String(fees || config.fees)
|
||||||
|
};
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
9
src/util/config.ts
Normal file
9
src/util/config.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import yaml from 'js-yaml'
|
||||||
|
import fs from 'fs'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
|
export const getConfig = (configFilePath: string): any => {
|
||||||
|
const resolvedFilePath = path.resolve(process.cwd(), configFilePath);
|
||||||
|
const configFile = fs.readFileSync(resolvedFilePath, 'utf-8')
|
||||||
|
return yaml.load(configFile);
|
||||||
|
};
|
20
src/util/fees.ts
Normal file
20
src/util/fees.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import assert from 'assert';
|
||||||
|
import { Arguments } from 'yargs';
|
||||||
|
|
||||||
|
export const parseGasAndFees = (gas: string, fees = '') => {
|
||||||
|
assert(gas, 'Invalid gas.');
|
||||||
|
|
||||||
|
const [{ amount, denom }] = fees.trim().split(',')
|
||||||
|
.map(fee => fee.trim().split(/(\d+)/))
|
||||||
|
.filter(([_, amount, denom]) => (denom && amount))
|
||||||
|
.map(([_, amount, denom]) => ({ denom, amount }));
|
||||||
|
|
||||||
|
return { amount, denom, gas };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getGasAndFees = (argv: Arguments, config: any = {}) => {
|
||||||
|
return parseGasAndFees(
|
||||||
|
String(argv.gas || config.gas),
|
||||||
|
String(argv.fees || config.fees)
|
||||||
|
);
|
||||||
|
};
|
3
src/util/index.ts
Normal file
3
src/util/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export * from './fees';
|
||||||
|
export * from './config';
|
||||||
|
export * from './common';
|
Loading…
Reference in New Issue
Block a user