Skip to content

Commit 454cba7

Browse files
committed
Support Dynamic intent handler registrations
fixes #1610
1 parent c656662 commit 454cba7

1 file changed

Lines changed: 19 additions & 3 deletions

File tree

toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/IntentHandler.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { MessageHandler } from '../BasicFDC3Server';
2-
import { AppRegistration, InstanceID, ServerContext } from '../ServerContext';
2+
import { AppRegistration, InstanceID, ServerContext, State } from '../ServerContext';
33
import { Directory, DirectoryIntent } from '../directory/DirectoryInterface';
44
import { Context } from '@finos/fdc3-context';
55
import { AppIntent, ResolveError, AppIdentifier } from '@finos/fdc3-standard';
@@ -380,11 +380,27 @@ export class IntentHandler implements MessageHandler {
380380
async raiseIntentToAnyApp(arg0: IntentRequest[], sc: ServerContext<AppRegistration>): Promise<void> {
381381
const connectedApps = await sc.getConnectedApps();
382382
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);
384392

385393
const appIntents: AppIntent[] = uniqueIntentNames.map(i => {
386394
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];
388404

389405
return {
390406
intent: {

0 commit comments

Comments
 (0)