Skip to content

Commit

Permalink
feat: CLI Data explorer
Browse files Browse the repository at this point in the history
  • Loading branch information
simonas-notcat committed Sep 22, 2020
1 parent 269780a commit fb7d155
Show file tree
Hide file tree
Showing 12 changed files with 428 additions and 136 deletions.
6 changes: 4 additions & 2 deletions packages/daf-cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@
"update-daf-beta": "yarn add daf-core@beta daf-resolver@beta daf-did-jwt@beta daf-w3c@beta daf-ethr-did@beta daf-web-did@beta daf-did-comm@beta daf-libsodium@beta daf-selective-disclosure@beta daf-typeorm@beta daf-key-manager@beta daf-message-handler@beta daf-identity-manager@beta daf-resolver-universal@beta daf-url@beta daf-graphql@beta"
},
"dependencies": {
"@types/blessed": "^0.1.17",
"apollo-server": "^2.9.12",
"commander": "^5.0.0",
"blessed": "^0.1.81",
"commander": "^6.1.0",
"console-table-printer": "^2.0.0",
"cross-fetch": "^3.0.6",
"daf-core": "^7.0.0-beta.21",
Expand Down Expand Up @@ -57,7 +59,7 @@
"@types/lodash.merge": "4.6.6",
"@types/node-fetch": "2.5.7",
"@types/ws": "7.2.6",
"typescript": "^3.8.3"
"typescript": "^4.0.3"
},
"peerDependencies": {
"daf-elem-did": "^7.0.0-beta.20"
Expand Down
2 changes: 1 addition & 1 deletion packages/daf-cli/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@ import './setup'
if (!process.argv.slice(2).length) {
program.outputHelp()
} else {
program.parse()
program.parse(process.argv)
}
121 changes: 0 additions & 121 deletions packages/daf-cli/src/data-explorer.ts

This file was deleted.

77 changes: 77 additions & 0 deletions packages/daf-cli/src/data-explorer/credentials.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import blessed, { Widgets } from 'blessed'
import { IMessage, VerifiableCredential } from 'daf-core'
import { shortDate, shortDid } from './utils'
import { ConfiguredAgent } from '../setup'
import { styles } from './styles'

export const getCredentialsTable = async (agent: ConfiguredAgent, screen: Widgets.Screen) => {
screen.title = 'Credentials'

const credentialsTable = blessed.listtable({
top: '0',
left: '0',
border: 'line',
align: 'left',
tags: true,
keys: true,
width: '100%',
height: '100%',
mouse: true,
style: styles.listtable,
})

const credentials = await agent.dataStoreORMGetVerifiableCredentials()
credentialsTable.setData(
[['Created', 'Type', 'From', 'To']].concat(
credentials.map((m) => [
shortDate(m.issuanceDate),
m.type.join(','),
shortDid(m.issuer.id),
shortDid(m.credentialSubject.id),
]),
),
)

credentialsTable.on('select', async function (data) {
const i = credentialsTable.getItemIndex(data)
showCredential(credentials[i - 1])
})

function showCredential(message: VerifiableCredential) {
const credentialBox = blessed.box({
label: 'Credential',
top: 'center',
left: 'center',
height: '90%',
width: '90%',
border: 'line',
shadow: true,
mouse: true,
keys: true,
scrollable: true,
vi: true,
alwaysScroll: true,
scrollbar: {
ch: ' ',
track: {
bg: 'grey',
},
style: {
inverse: false,
},
},

content: JSON.stringify(message, null, 2),
})
credentialBox.key(['escape'], function (ch, key) {
credentialBox.destroy()
screen.render()
})

credentialBox.focus()
screen.append(credentialBox)
screen.render()
}

return credentialsTable
}
11 changes: 11 additions & 0 deletions packages/daf-cli/src/data-explorer/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { getAgent } from '../setup'
import program from 'commander'
import { renderMainScreen } from './main'

program
.command('data-explorer')
.description('Data explorer')
.action(async (cmd) => {
const agent = getAgent(program.config)
await renderMainScreen(agent)
})
65 changes: 65 additions & 0 deletions packages/daf-cli/src/data-explorer/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import blessed from 'blessed'
import { IMessage } from 'daf-core'
import { ConfiguredAgent } from '../setup'
import { styles } from './styles'

import { getManagedIdentitiesTable } from './managed-identities'
import { getMessagesTable } from './messages'
import { getCredentialsTable } from './credentials'
import { getPresentationsTable } from './presentations'

const defaultScreenTitle = 'Agent'

export const renderMainScreen = async (agent: ConfiguredAgent) => {
// Create a screen object.
const screen = blessed.screen({
smartCSR: true,
})

screen.title = defaultScreenTitle

const mainMenuItems = [
{ title: 'Managed identities', getComponent: getManagedIdentitiesTable },
{ title: 'Messages', getComponent: getMessagesTable },
{ title: 'Credentials', getComponent: getCredentialsTable },
{ title: 'Presentations', getComponent: getPresentationsTable },
]

const menu = blessed.list({
label: 'Agent',
top: 'center',
left: 'center',
border: 'line',
align: 'center',
keys: true,
width: 'shrink',
height: '70%',
vi: true,
mouse: true,
style: styles.list,
items: mainMenuItems.map((i) => i.title),
})

menu.on('select', async function (data) {
const i = menu.getItemIndex(data)
const component = await mainMenuItems[i].getComponent(agent, screen)

component.key(['escape'], function (ch, key) {
component.destroy()
screen.title = defaultScreenTitle
screen.render()
})

screen.append(component)
component.focus()
screen.render()
})

screen.append(menu)
menu.focus()

screen.key(['q', 'C-c'], function (ch, key) {
return process.exit(0)
})
screen.render()
}
67 changes: 67 additions & 0 deletions packages/daf-cli/src/data-explorer/managed-identities.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import blessed, { Widgets } from 'blessed'
import { IIdentity } from 'daf-core'
import { ConfiguredAgent } from '../setup'
import { styles } from './styles'

export const getManagedIdentitiesTable = async (agent: ConfiguredAgent, screen: Widgets.Screen) => {
screen.title = 'Managed identities'

const managedIdentitiesTable = blessed.listtable({
top: '0',
left: '0',
border: 'line',
align: 'left',
tags: true,
keys: true,
width: '100%',
height: '100%',
mouse: true,
style: styles.listtable,
})

const identities = await agent.identityManagerGetIdentities()
managedIdentitiesTable.setData([['DID', 'Alias']].concat(identities.map((i) => [i.did, i.alias || ''])))

managedIdentitiesTable.on('select', async function (data) {
const i = managedIdentitiesTable.getItemIndex(data)
showIdentity(identities[i - 1])
})

function showIdentity(identity: IIdentity) {
const identityBox = blessed.box({
label: identity.did,
top: 'center',
left: 'center',
height: '90%',
width: '90%',
border: 'line',
shadow: true,
mouse: true,
keys: true,
scrollable: true,
vi: true,
alwaysScroll: true,
scrollbar: {
ch: ' ',
track: {
bg: 'grey',
},
style: {
inverse: false,
},
},

content: JSON.stringify(identity, null, 2),
})
identityBox.key(['escape'], function (ch, key) {
identityBox.destroy()
screen.render()
})

identityBox.focus()
screen.append(identityBox)
screen.render()
}

return managedIdentitiesTable
}
Loading

0 comments on commit fb7d155

Please sign in to comment.