|
1 | 1 | import { MessageHandler } from '../BasicFDC3Server'; |
2 | | -import { AppRegistration, InstanceID, ServerContext } from '../ServerContext'; |
| 2 | +import { AppRegistration, InstanceID, ServerContext, State } from '../ServerContext'; |
3 | 3 | import { Directory, DirectoryIntent } from '../directory/DirectoryInterface'; |
4 | 4 | import { Context } from '@finos/fdc3-context'; |
5 | 5 | import { AppIntent, ResolveError, AppIdentifier } from '@finos/fdc3-standard'; |
@@ -380,11 +380,27 @@ export class IntentHandler implements MessageHandler { |
380 | 380 | async raiseIntentToAnyApp(arg0: IntentRequest[], sc: ServerContext<AppRegistration>): Promise<void> { |
381 | 381 | const connectedApps = await sc.getConnectedApps(); |
382 | 382 | const matchingIntents = arg0.flatMap(i => this.directory.retrieveIntents(i.context.type, i.intent, undefined)); |
383 | | - const uniqueIntentNames = matchingIntents.map(i => i.intentName).filter((v, i, a) => a.indexOf(v) === i); |
| 383 | + const matchingRegistrations = arg0.flatMap(i => |
| 384 | + this.registrations.filter( |
| 385 | + r => r.intentName == i.intent && (r.contextTypes == null || r.contextTypes.includes(i.context.type)) |
| 386 | + ) |
| 387 | + ); // Get a list of intent listeners that match the intent and context type |
| 388 | + const uniqueIntentNames = [ |
| 389 | + ...matchingIntents.map(i => i.intentName), |
| 390 | + ...matchingRegistrations.map(r => r.intentName), |
| 391 | + ].filter((v, i, a) => a.indexOf(v) === i); |
384 | 392 |
|
385 | 393 | const appIntents: AppIntent[] = uniqueIntentNames.map(i => { |
386 | 394 | const directoryAppsWithIntent = matchingIntents.filter(mi => mi.intentName == i).map(mi => mi.appId); |
387 | | - const runningApps = connectedApps.filter(ca => directoryAppsWithIntent.includes(ca.appId)); |
| 395 | + const runningDirectoryApps = connectedApps.filter(ca => directoryAppsWithIntent.includes(ca.appId)); |
| 396 | + const appRegistrations = matchingRegistrations |
| 397 | + .filter(registration => registration.intentName === i) // filter registrations for the current intent |
| 398 | + .map(listener => ({ appId: listener.appId, instanceId: listener.instanceId, state: State.Connected })) |
| 399 | + .filter(appRegistration => |
| 400 | + runningDirectoryApps.every(runningApp => runningApp.instanceId !== appRegistration.instanceId) |
| 401 | + ); // filter out apps that are already included from the directory listing |
| 402 | + |
| 403 | + const runningApps: AppRegistration[] = [...runningDirectoryApps, ...appRegistrations]; |
388 | 404 |
|
389 | 405 | return { |
390 | 406 | intent: { |
|
0 commit comments