diff --git a/examples/generic/handle-msg.ts b/examples/generic/handle-msg.ts index eb29d7e12..b1fae4769 100644 --- a/examples/generic/handle-msg.ts +++ b/examples/generic/handle-msg.ts @@ -1,4 +1,3 @@ -import { AbstractIdentity } from 'daf-core' import { agent } from './setup' async function main() { diff --git a/examples/generic/package.json b/examples/generic/package.json index ebe367f27..b6f0d54a4 100644 --- a/examples/generic/package.json +++ b/examples/generic/package.json @@ -1,5 +1,5 @@ { - "name": "send-vc", + "name": "daf-generic-examples", "private": true, "version": "2.0.0", "main": "index.ts", @@ -15,6 +15,7 @@ "daf-ethr-did": "../../packages/daf-ethr-did", "daf-libsodium": "../../packages/daf-libsodium", "daf-resolver": "../../packages/daf-resolver", + "daf-typeorm": "../../packages/daf-typeorm", "daf-w3c": "../../packages/daf-w3c", "pg": "^7.18.2", "reflect-metadata": "^0.1.13", diff --git a/examples/generic/send-vc.ts b/examples/generic/send-vc.ts index 4a71103eb..3351a2927 100644 --- a/examples/generic/send-vc.ts +++ b/examples/generic/send-vc.ts @@ -1,14 +1,14 @@ -import { AbstractIdentity } from 'daf-core' +import { IIdentity } from 'daf-core' import { agent } from './setup' async function main() { // Getting existing identity or creating a new one - let identity: AbstractIdentity - const identities = await agent.getIdentities() + let identity: IIdentity + const identities = await agent.identityManagerGetIdentities() if (identities.length > 0) { identity = identities[0] } else { - identity = await agent.createIdentity() + identity = await agent.identityManagerCreateIdentity({kms: 'local'}) } // Sign verifiable credential @@ -24,13 +24,15 @@ async function main() { }, }) + console.log(credential) + // Send verifiable credential using DIDComm const message = await agent.sendMessageDIDCommAlpha1({ data: { from: identity.did, to: 'did:ethr:rinkeby:0x79292ba5a516f04c3de11e8f06642c7bec16c490', type: 'jwt', - body: credential.raw, + body: credential.p, }, }) console.log({ message }) diff --git a/examples/generic/setup.ts b/examples/generic/setup.ts index 7897102fc..73626b3a1 100644 --- a/examples/generic/setup.ts +++ b/examples/generic/setup.ts @@ -1,7 +1,23 @@ -import { Entities } from 'daf-core' +import { + Agent, + KeyManager, + MessageHandler, + IdentityManager, + IAgentBase, + IAgentIdentityManager, + IAgentResolve, + IAgentKeyManager, + IAgentHandleMessage, +} from 'daf-core' +import { DafResolver} from 'daf-resolver' +import { JwtMessageHandler } from 'daf-did-jwt' +import { W3c, IAgentW3c, W3cMessageHandler } from 'daf-w3c' +import { DIDComm, DIDCommMessageHandler, IAgentSendMessageDIDCommAlpha1 } from 'daf-did-comm' +import { EthrIdentityProvider } from 'daf-ethr-did' +import { KeyManagementSystem, SecretBox } from 'daf-libsodium' +import { Entities, KeyStore, IdentityStore } from 'daf-typeorm' import { createConnection } from 'typeorm' -// Create database connection const dbConnection = createConnection({ type: 'sqlite', database: 'database.sqlite', @@ -10,56 +26,12 @@ const dbConnection = createConnection({ entities: Entities, }) -// We will be using 'did:ethr' identities -import { IdentityProvider } from 'daf-ethr-did' - -// SecretBox will encrypt/decrypt private keys in key store -import { SecretBox } from 'daf-libsodium' - -// Generate this by running `npx daf-cli crypto -s` const secretKey = '29739248cad1bd1a0fc4d9b75cd4d2990de535baf5caadfdf8d8f86664aa830c' -const secretBox = new SecretBox(secretKey) - -// Storing serialized key pairs in the file system -import { KeyStore } from 'daf-core' -const keyStore = new KeyStore(dbConnection, secretBox) - -// KeyManagementSystem is responsible for managing encryption and signing keys -import { KeyManagementSystem } from 'daf-libsodium' -const kms = new KeyManagementSystem(keyStore) - -// Storing serialized identities in the file system -import { IdentityStore } from 'daf-core' -const identityStore = new IdentityStore('rinkeby-ethr', dbConnection) - -// Infura is being used to access Ethereum blockchain. https://infura.io const infuraProjectId = '5ffc47f65c4042ce847ef66a3fa70d4c' -// Injecting required dependencies, and specifying which blockchain to use and how to access it -const rinkebyIdentityProvider = new IdentityProvider({ - kms, - identityStore, - network: 'rinkeby', - rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, -}) - -// Using local DID Document resolver. It is being used internally to -/// validate messages and to get information about service endpoints -import { DafResolver, IAgentResolve } from 'daf-resolver' - -// Setting up Message Validator Chain -import { IAgentHandleMessage, HandleMessage } from 'daf-core' -import { JwtMessageHandler } from 'daf-did-jwt' -import { W3cMessageHandler } from 'daf-w3c' - -// Setting up Action Handler Chain -import { DIDComm, IAgentSendMessageDIDCommAlpha1 } from 'daf-did-comm' -import { W3c, IAgentW3c } from 'daf-w3c' - -// Initializing the Core by injecting dependencies -import { Agent, IAgent, IAgentIdentityManager, IdentityManager } from 'daf-core' -type ConfiguredAgent = IAgent & +type ConfiguredAgent = IAgentBase & IAgentIdentityManager & + IAgentKeyManager & IAgentResolve & IAgentHandleMessage & IAgentSendMessageDIDCommAlpha1 & @@ -67,11 +39,30 @@ type ConfiguredAgent = IAgent & export const agent: ConfiguredAgent = new Agent({ plugins: [ - new IdentityManager({ identityProviders: [rinkebyIdentityProvider] }), + new KeyManager({ + store: new KeyStore(dbConnection, new SecretBox(secretKey)), + kms: { + local: new KeyManagementSystem() + } + }), + new IdentityManager({ + store: new IdentityStore(dbConnection), + defaultProvider: 'did:ethr:rinkeby', + providers: { + 'did:ethr:rinkeby': new EthrIdentityProvider({ + defaultKms: 'local', + network: 'rinkeby', + rpcUrl: 'https://rinkeby.infura.io/v3/' + infuraProjectId, + }) + } + }), new DafResolver({ infuraProjectId }), - new HandleMessage({ - dbConnection, - messageHandlers: [new JwtMessageHandler(), new W3cMessageHandler()], + new MessageHandler({ + messageHandlers: [ + new DIDCommMessageHandler(), + new JwtMessageHandler(), + new W3cMessageHandler() + ], }), new DIDComm(), new W3c(), diff --git a/examples/generic/yarn.lock b/examples/generic/yarn.lock index 602d2d0d3..25ed52b0b 100644 --- a/examples/generic/yarn.lock +++ b/examples/generic/yarn.lock @@ -312,11 +312,8 @@ cross-fetch@^3.0.4: daf-core@../../packages/daf-core, daf-core@^6.0.0: version "6.0.0" dependencies: - blakejs "^1.1.0" debug "^4.1.1" events "^3.0.0" - typeorm "^0.2.24" - uuid "^7.0.2" daf-did-comm@../../packages/daf-did-comm: version "6.0.0" @@ -359,6 +356,7 @@ daf-libsodium@../../packages/daf-libsodium: daf-resolver@../../packages/daf-resolver: version "6.0.0" dependencies: + daf-core "^6.0.0" debug "^4.1.1" did-resolver "^1.1.0" ethr-did-resolver "2.2.0" @@ -376,6 +374,13 @@ daf-resolver@^6.0.0: nacl-did "^1.0.0" web-did-resolver "^1.2.0" +daf-typeorm@../../packages/daf-typeorm: + version "6.0.0" + dependencies: + daf-core "^6.0.0" + debug "^4.1.1" + typeorm "^0.2.24" + daf-w3c@../../packages/daf-w3c: version "6.0.0" dependencies: @@ -1710,11 +1715,6 @@ uuid@^3.3.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - web-did-resolver@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/web-did-resolver/-/web-did-resolver-1.3.0.tgz#2d2ac2d1cab6f02633a095747eb1ee6eb80a3de0" diff --git a/packages/daf-ethr-did/src/identity-provider.ts b/packages/daf-ethr-did/src/identity-provider.ts index 46d496396..f99257047 100644 --- a/packages/daf-ethr-did/src/identity-provider.ts +++ b/packages/daf-ethr-did/src/identity-provider.ts @@ -17,6 +17,7 @@ export function toEthereumAddress(hexPublicKey: string): string { } export class EthrIdentityProvider extends AbstractIdentityProvider { + private defaultKms: string private network: string private web3Provider?: any private rpcUrl?: string @@ -25,6 +26,7 @@ export class EthrIdentityProvider extends AbstractIdentityProvider { private registry?: string constructor(options: { + defaultKms: string network: string rpcUrl?: string web3Provider?: object @@ -46,7 +48,7 @@ export class EthrIdentityProvider extends AbstractIdentityProvider { context: IContext, ): Promise> { - const key = await context.agent.keyManagerCreateKey({ kms, type: 'Secp256k1' }) + const key = await context.agent.keyManagerCreateKey({ kms: kms || this.defaultKms, type: 'Secp256k1' }) const address = toEthereumAddress(key.publicKeyHex) const identity: Omit = { did: 'did:ethr:' + (this.network !== 'mainnet' ? this.network + ':' : '') + address, diff --git a/packages/daf-typeorm/src/entities/key.ts b/packages/daf-typeorm/src/entities/key.ts index 7314fc916..fdeef486a 100644 --- a/packages/daf-typeorm/src/entities/key.ts +++ b/packages/daf-typeorm/src/entities/key.ts @@ -20,7 +20,7 @@ export class Key extends BaseEntity { @Column() privateKeyHex?: string - @Column({type: 'simple-json'}) + @Column({type: 'simple-json', nullable: true}) meta?: Record @ManyToOne( diff --git a/packages/daf-typeorm/src/index.ts b/packages/daf-typeorm/src/index.ts index 460473709..78a387ad2 100644 --- a/packages/daf-typeorm/src/index.ts +++ b/packages/daf-typeorm/src/index.ts @@ -5,7 +5,8 @@ import { Identity } from './entities/identity' import { Claim } from './entities/claim' import { Credential } from './entities/credential' import { Presentation } from './entities/presentation' +import { Service } from './entities/service' import { Message, MetaData } from './entities/message' -export const Entities = [Key, Identity, Message, Claim, Credential, Presentation] -export { KeyType, Key, Identity, Message, Claim, Credential, Presentation, MetaData } +export const Entities = [Key, Identity, Message, Claim, Credential, Presentation, Service] +export { KeyType, Key, Identity, Message, Claim, Credential, Presentation, MetaData, Service } export { migrations } from './migrations'