Skip to content

Commit

Permalink
chore: merge branch '0.3.0-pre' into feat/indyNameSpace
Browse files Browse the repository at this point in the history
Signed-off-by: Moriarty <moritz@animo.id>
  • Loading branch information
Moriarty committed Sep 22, 2022
2 parents 0b6562e + 5e9e0fc commit cb449c1
Show file tree
Hide file tree
Showing 145 changed files with 5,646 additions and 1,170 deletions.
2 changes: 1 addition & 1 deletion demo/src/BaseAgent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export class BaseAgent {

this.config = config

this.agent = new Agent(config, agentDependencies)
this.agent = new Agent({ config, dependencies: agentDependencies })
this.agent.registerInboundTransport(new HttpInboundTransport({ port }))
this.agent.registerOutboundTransport(new HttpOutboundTransport())
}
Expand Down
180 changes: 73 additions & 107 deletions packages/core/src/agent/Agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { InboundTransport } from '../transport/InboundTransport'
import type { OutboundTransport } from '../transport/OutboundTransport'
import type { InitConfig } from '../types'
import type { AgentDependencies } from './AgentDependencies'
import type { AgentModulesInput, ModulesMap } from './AgentModules'
import type { AgentMessageReceivedEvent } from './Events'
import type { Subscription } from 'rxjs'

Expand All @@ -12,48 +13,90 @@ import { CacheRepository } from '../cache'
import { InjectionSymbols } from '../constants'
import { JwsService } from '../crypto/JwsService'
import { AriesFrameworkError } from '../error'
import { BasicMessagesModule } from '../modules/basic-messages'
import { ConnectionsModule } from '../modules/connections'
import { CredentialsModule } from '../modules/credentials'
import { DidsModule } from '../modules/dids'
import { DiscoverFeaturesModule } from '../modules/discover-features'
import { GenericRecordsModule } from '../modules/generic-records'
import { IndyModule } from '../modules/indy'
import { LedgerModule } from '../modules/ledger'
import { OutOfBandModule } from '../modules/oob'
import { ProofsModule } from '../modules/proofs'
import { QuestionAnswerModule } from '../modules/question-answer'
import { MediatorModule, RecipientModule } from '../modules/routing'
import { W3cVcModule } from '../modules/vc'
import { DependencyManager } from '../plugins'
import { DidCommMessageRepository, StorageUpdateService, StorageVersionRepository } from '../storage'
import { InMemoryMessageRepository } from '../storage/InMemoryMessageRepository'
import { IndyStorageService } from '../storage/IndyStorageService'
import { WalletModule } from '../wallet'
import { IndyWallet } from '../wallet/IndyWallet'

import { AgentConfig } from './AgentConfig'
import { extendModulesWithDefaultModules } from './AgentModules'
import { BaseAgent } from './BaseAgent'
import { Dispatcher } from './Dispatcher'
import { EnvelopeService } from './EnvelopeService'
import { EventEmitter } from './EventEmitter'
import { AgentEventTypes } from './Events'
import { FeatureRegistry } from './FeatureRegistry'
import { MessageReceiver } from './MessageReceiver'
import { MessageSender } from './MessageSender'
import { TransportService } from './TransportService'
import { AgentContext, DefaultAgentContextProvider } from './context'

export class Agent extends BaseAgent {
interface AgentOptions<AgentModules extends AgentModulesInput> {
config: InitConfig
modules?: AgentModules
dependencies: AgentDependencies
}

export class Agent<AgentModules extends AgentModulesInput = ModulesMap> extends BaseAgent<AgentModules> {
public messageSubscription: Subscription

public constructor(
initialConfig: InitConfig,
dependencies: AgentDependencies,
dependencyManager?: DependencyManager
) {
// NOTE: we can't create variables before calling super as TS will complain that the super call must be the
// the first statement in the constructor.
super(new AgentConfig(initialConfig, dependencies), dependencyManager ?? new DependencyManager())
public constructor(options: AgentOptions<AgentModules>, dependencyManager = new DependencyManager()) {
const agentConfig = new AgentConfig(options.config, options.dependencies)
const modulesWithDefaultModules = extendModulesWithDefaultModules(agentConfig, options.modules)

// Register internal dependencies
dependencyManager.registerSingleton(EventEmitter)
dependencyManager.registerSingleton(MessageSender)
dependencyManager.registerSingleton(MessageReceiver)
dependencyManager.registerSingleton(TransportService)
dependencyManager.registerSingleton(Dispatcher)
dependencyManager.registerSingleton(EnvelopeService)
dependencyManager.registerSingleton(FeatureRegistry)
dependencyManager.registerSingleton(JwsService)
dependencyManager.registerSingleton(CacheRepository)
dependencyManager.registerSingleton(DidCommMessageRepository)
dependencyManager.registerSingleton(StorageVersionRepository)
dependencyManager.registerSingleton(StorageUpdateService)

dependencyManager.registerInstance(AgentConfig, agentConfig)
dependencyManager.registerInstance(InjectionSymbols.AgentDependencies, agentConfig.agentDependencies)
dependencyManager.registerInstance(InjectionSymbols.Stop$, new Subject<boolean>())
dependencyManager.registerInstance(InjectionSymbols.FileSystem, new agentConfig.agentDependencies.FileSystem())

// Register possibly already defined services
if (!dependencyManager.isRegistered(InjectionSymbols.Wallet)) {
dependencyManager.registerContextScoped(InjectionSymbols.Wallet, IndyWallet)
}
if (!dependencyManager.isRegistered(InjectionSymbols.Logger)) {
dependencyManager.registerInstance(InjectionSymbols.Logger, agentConfig.logger)
}
if (!dependencyManager.isRegistered(InjectionSymbols.StorageService)) {
dependencyManager.registerSingleton(InjectionSymbols.StorageService, IndyStorageService)
}
if (!dependencyManager.isRegistered(InjectionSymbols.MessageRepository)) {
dependencyManager.registerSingleton(InjectionSymbols.MessageRepository, InMemoryMessageRepository)
}

// Register all modules. This will also include the default modules
dependencyManager.registerModules(modulesWithDefaultModules)

// TODO: contextCorrelationId for base wallet
// Bind the default agent context to the container for use in modules etc.
dependencyManager.registerInstance(
AgentContext,
new AgentContext({
dependencyManager,
contextCorrelationId: 'default',
})
)

// If no agent context provider has been registered we use the default agent context provider.
if (!dependencyManager.isRegistered(InjectionSymbols.AgentContextProvider)) {
dependencyManager.registerSingleton(InjectionSymbols.AgentContextProvider, DefaultAgentContextProvider)
}

super(agentConfig, dependencyManager)

const stop$ = this.dependencyManager.resolve<Subject<boolean>>(InjectionSymbols.Stop$)

Expand Down Expand Up @@ -92,6 +135,13 @@ export class Agent extends BaseAgent {
return this.eventEmitter
}

/**
* Agent's feature registry
*/
public get features() {
return this.featureRegistry
}

public async initialize() {
await super.initialize()

Expand Down Expand Up @@ -148,90 +198,6 @@ export class Agent extends BaseAgent {
this._isInitialized = false
}

protected registerDependencies(dependencyManager: DependencyManager) {
// Register internal dependencies
dependencyManager.registerSingleton(EventEmitter)
dependencyManager.registerSingleton(MessageSender)
dependencyManager.registerSingleton(MessageReceiver)
dependencyManager.registerSingleton(TransportService)
dependencyManager.registerSingleton(Dispatcher)
dependencyManager.registerSingleton(EnvelopeService)
dependencyManager.registerSingleton(JwsService)
dependencyManager.registerSingleton(CacheRepository)
dependencyManager.registerSingleton(DidCommMessageRepository)
dependencyManager.registerSingleton(StorageVersionRepository)
dependencyManager.registerSingleton(StorageUpdateService)

dependencyManager.registerInstance(AgentConfig, this.agentConfig)
dependencyManager.registerInstance(InjectionSymbols.AgentDependencies, this.agentConfig.agentDependencies)
dependencyManager.registerInstance(InjectionSymbols.Stop$, new Subject<boolean>())
dependencyManager.registerInstance(InjectionSymbols.FileSystem, new this.agentConfig.agentDependencies.FileSystem())

// Register possibly already defined services
if (!dependencyManager.isRegistered(InjectionSymbols.Wallet)) {
dependencyManager.registerContextScoped(InjectionSymbols.Wallet, IndyWallet)
}
if (!dependencyManager.isRegistered(InjectionSymbols.Logger)) {
dependencyManager.registerInstance(InjectionSymbols.Logger, this.logger)
}
if (!dependencyManager.isRegistered(InjectionSymbols.StorageService)) {
dependencyManager.registerSingleton(InjectionSymbols.StorageService, IndyStorageService)
}
if (!dependencyManager.isRegistered(InjectionSymbols.MessageRepository)) {
dependencyManager.registerSingleton(InjectionSymbols.MessageRepository, InMemoryMessageRepository)
}

// Register all modules
dependencyManager.registerModules(
new ConnectionsModule({
autoAcceptConnections: this.agentConfig.autoAcceptConnections,
}),
new CredentialsModule({
autoAcceptCredentials: this.agentConfig.autoAcceptCredentials,
}),
new ProofsModule({
autoAcceptProofs: this.agentConfig.autoAcceptProofs,
}),
new MediatorModule({
autoAcceptMediationRequests: this.agentConfig.autoAcceptMediationRequests,
}),
new RecipientModule({
maximumMessagePickup: this.agentConfig.maximumMessagePickup,
mediatorInvitationUrl: this.agentConfig.mediatorConnectionsInvite,
mediatorPickupStrategy: this.agentConfig.mediatorPickupStrategy,
mediatorPollingInterval: this.agentConfig.mediatorPollingInterval,
}),
new BasicMessagesModule(),
new QuestionAnswerModule(),
new GenericRecordsModule(),
new LedgerModule({
connectToIndyLedgersOnStartup: this.agentConfig.connectToIndyLedgersOnStartup,
indyLedgers: this.agentConfig.indyLedgers,
}),
new DiscoverFeaturesModule(),
new DidsModule(),
new WalletModule(),
new OutOfBandModule(),
new IndyModule(),
new W3cVcModule()
)

// TODO: contextCorrelationId for base wallet
// Bind the default agent context to the container for use in modules etc.
dependencyManager.registerInstance(
AgentContext,
new AgentContext({
dependencyManager,
contextCorrelationId: 'default',
})
)

// If no agent context provider has been registered we use the default agent context provider.
if (!this.dependencyManager.isRegistered(InjectionSymbols.AgentContextProvider)) {
this.dependencyManager.registerSingleton(InjectionSymbols.AgentContextProvider, DefaultAgentContextProvider)
}
}

protected async getMediationConnection(mediatorInvitationUrl: string) {
const outOfBandInvitation = this.oob.parseInvitation(mediatorInvitationUrl)
const outOfBandRecord = await this.oob.findByInvitationId(outOfBandInvitation.id)
Expand Down
Loading

0 comments on commit cb449c1

Please sign in to comment.