@braidlabs/fdc3 0.0.0-stage → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -2
- package/package.json +43 -3
- package/src/agent.d.ts +42 -0
- package/src/agent.js +347 -0
- package/src/agent.js.map +1 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +2 -0
- package/src/index.js.map +1 -0
package/README.md
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @braidlabs/fdc3
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
An FDC3 3.0 Desktop Agent for Braid pages. Every composed fragment gets a `window.fdc3` bound to its
|
|
4
|
+
own app identity. Fragments share user channels, app channels and intents, resolved against an FDC3
|
|
5
|
+
App Directory that the Braid registry serves.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { initBraid } from '@braidlabs/core';
|
|
9
|
+
import { createBraidDesktopAgent } from '@braidlabs/fdc3';
|
|
10
|
+
|
|
11
|
+
// the gateway serves this with createGateway({ registry, discovery: { appd: true } })
|
|
12
|
+
const response = await fetch('/__braid/registry/appd/v2/apps');
|
|
13
|
+
const applications = response.ok ? (await response.json()).applications : [];
|
|
14
|
+
initBraid({ realmGlobals: createBraidDesktopAgent({ directory: applications }).realmGlobals });
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The agent is built on the FINOS reference implementation (`@finos/fdc3-web-impl` and
|
|
18
|
+
`@finos/fdc3-agent-proxy`). Trusted fragments, compat and custom-element, get `window.fdc3` before
|
|
19
|
+
their first script runs. A fragment whose id has no directory record gets none.
|
|
20
|
+
|
|
21
|
+
An intent raised to a fragment that is mounted but still booting is held until its listener
|
|
22
|
+
arrives. Not supported yet: `fdc3.open()`, `fdc3.close()`, raising with `newInstance: true`, and
|
|
23
|
+
launching apps that aren't mounted; an intent resolver UI; and FDC3 for untrusted or contract
|
|
24
|
+
fragments.
|
|
25
|
+
|
|
26
|
+
Full documentation: https://braidjs.github.io/braid/packages/fdc3
|
package/package.json
CHANGED
|
@@ -1,6 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@braidlabs/fdc3",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "An FDC3 3.0 Desktop Agent for Braid pages: every composed fragment gets a window.fdc3 bound to its own app identity, with user channels, app channels and intents across fragments, resolved against an FDC3 App Directory. Built on the FINOS reference implementation.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"braid",
|
|
7
|
+
"micro-frontends",
|
|
8
|
+
"fdc3",
|
|
9
|
+
"desktop-agent",
|
|
10
|
+
"interop",
|
|
11
|
+
"finos"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=24"
|
|
16
|
+
},
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"type": "module",
|
|
19
|
+
"main": "./src/index.js",
|
|
20
|
+
"types": "./src/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./src/index.d.ts",
|
|
24
|
+
"default": "./src/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./package.json": "./package.json"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@finos/fdc3-agent-proxy": "3.0.0",
|
|
30
|
+
"@finos/fdc3-standard": "3.0.0",
|
|
31
|
+
"@finos/fdc3-web-impl": "3.0.0"
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/braidjs/braid.git",
|
|
39
|
+
"directory": "libs/braid-fdc3"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/braidjs/braid#readme",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/braidjs/braid/issues"
|
|
44
|
+
},
|
|
45
|
+
"module": "./src/index.js"
|
|
6
46
|
}
|
package/src/agent.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type DirectoryApp } from '@finos/fdc3-web-impl';
|
|
2
|
+
import { type DesktopAgent } from '@finos/fdc3-standard';
|
|
3
|
+
/**
|
|
4
|
+
* An FDC3 3.0 Desktop Agent for one Braid page.
|
|
5
|
+
*
|
|
6
|
+
* The page is the desktop: the host runs the agent, and each composed fragment is an app instance
|
|
7
|
+
* on it. The agent is the FINOS reference implementation — `DefaultFDC3Server` from
|
|
8
|
+
* `@finos/fdc3-web-impl` for the agent, `DesktopAgentProxy` from `@finos/fdc3-agent-proxy` for each
|
|
9
|
+
* app's `fdc3` — so channel and intent semantics are FDC3's own rather than an approximation of
|
|
10
|
+
* them. What Braid adds is the part FDC3 for the Web leaves to the platform:
|
|
11
|
+
*
|
|
12
|
+
* - **Identity is known, not claimed.** A web app normally proves who it is with the Web Connection
|
|
13
|
+
* Protocol, matching its URL against the directory. A fragment's identity is its registry id,
|
|
14
|
+
* which the host already knows when it boots the fragment, so each fragment is registered under
|
|
15
|
+
* that id directly and no handshake runs.
|
|
16
|
+
* - **Transport is in-process.** The proxy and the agent exchange structured clones, one task
|
|
17
|
+
* per message — the isolation and ordering a MessagePort gives, without one.
|
|
18
|
+
* - **Lifetime is the fragment's.** When the fragment is torn down its instance is terminated: its
|
|
19
|
+
* listeners stop receiving and `findInstances` no longer reports it.
|
|
20
|
+
*/
|
|
21
|
+
export interface BraidDesktopAgentOptions {
|
|
22
|
+
/**
|
|
23
|
+
* The App Directory records the agent resolves against — the `applications` of a Braid AppD
|
|
24
|
+
* listing (`createRegistryApi({ appd })` or the gateway's `discovery: { appd: true }`). Each
|
|
25
|
+
* record's `appId` is a fragment id; a fragment with no record gets no `fdc3`, and neither does
|
|
26
|
+
* one whose record's `fdc3Version` range excludes 3.0.
|
|
27
|
+
*/
|
|
28
|
+
directory: readonly DirectoryApp[];
|
|
29
|
+
}
|
|
30
|
+
export interface BraidDesktopAgent {
|
|
31
|
+
/**
|
|
32
|
+
* The hook for `initBraid({ realmGlobals })`: a fragment in the directory gets `{ fdc3 }`, an
|
|
33
|
+
* agent bound to its id, before any of its code runs; its signal releases the instance.
|
|
34
|
+
*/
|
|
35
|
+
realmGlobals(fragment: {
|
|
36
|
+
fragmentId: string;
|
|
37
|
+
signal: AbortSignal;
|
|
38
|
+
}): Promise<{
|
|
39
|
+
fdc3: DesktopAgent;
|
|
40
|
+
} | undefined>;
|
|
41
|
+
}
|
|
42
|
+
export declare function createBraidDesktopAgent(options: BraidDesktopAgentOptions): BraidDesktopAgent;
|
package/src/agent.js
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { BasicDirectory, ChannelType, DefaultFDC3Server, IntentHandler, State, } from '@finos/fdc3-web-impl';
|
|
2
|
+
import { AbstractMessaging, DefaultAppSupport, DefaultChannelSupport, DefaultHeartbeatSupport, DefaultIntentSupport, DesktopAgentProxy, } from '@finos/fdc3-agent-proxy';
|
|
3
|
+
import { ChannelError, CloseError, LogLevel, OpenError, ResolveError, } from '@finos/fdc3-standard';
|
|
4
|
+
/** The FDC3 version the agent implements; the directory drops records whose `fdc3Version` excludes it. */
|
|
5
|
+
const FDC3_VERSION = '3.0';
|
|
6
|
+
/** A request is answered within this, or the proxy reports `ApiTimeout`. */
|
|
7
|
+
const MESSAGE_TIMEOUT_MS = 10_000;
|
|
8
|
+
/** How long a raised intent may take to be handled. */
|
|
9
|
+
const INTENT_TIMEOUT_MS = 20_000;
|
|
10
|
+
/** FDC3's eight recommended user channels, as `@finos/fdc3-standard` defines them. */
|
|
11
|
+
const USER_CHANNELS = [
|
|
12
|
+
['red', '1'],
|
|
13
|
+
['orange', '2'],
|
|
14
|
+
['yellow', '3'],
|
|
15
|
+
['green', '4'],
|
|
16
|
+
['cyan', '5'],
|
|
17
|
+
['blue', '6'],
|
|
18
|
+
['magenta', '7'],
|
|
19
|
+
['purple', '8'],
|
|
20
|
+
];
|
|
21
|
+
/** The proxy's intent resolver and channel selector, when the host supplies no UI for either. */
|
|
22
|
+
const NO_UI = {
|
|
23
|
+
connect: async () => undefined,
|
|
24
|
+
disconnect: async () => undefined,
|
|
25
|
+
// no resolver UI: a raise that needs a choice is refused, as FDC3 says, with UserCancelledResolution
|
|
26
|
+
chooseIntent: async () => undefined,
|
|
27
|
+
updateChannel: async () => undefined,
|
|
28
|
+
setChannelChangeCallback: () => undefined,
|
|
29
|
+
};
|
|
30
|
+
export function createBraidDesktopAgent(options) {
|
|
31
|
+
// a directory that failed to load is an empty one, not a page that fails to compose
|
|
32
|
+
const directory = new BasicDirectory(Array.isArray(options.directory) ? [...options.directory] : [], FDC3_VERSION);
|
|
33
|
+
const context = new BraidServerContext(taskQueue());
|
|
34
|
+
const userChannels = USER_CHANNELS.map(([color, glyph]) => ({
|
|
35
|
+
id: `fdc3.channel.${glyph}`,
|
|
36
|
+
type: ChannelType.user,
|
|
37
|
+
context: [],
|
|
38
|
+
displayMetadata: { name: `Channel ${glyph}`, color, glyph },
|
|
39
|
+
}));
|
|
40
|
+
const server = new DefaultFDC3Server(context, directory, userChannels, false, INTENT_TIMEOUT_MS, MESSAGE_TIMEOUT_MS);
|
|
41
|
+
// which instances are listening for what: the agent's intent handler is the source of truth
|
|
42
|
+
const intentHandler = server.handlers.find((handler) => handler instanceof IntentHandler);
|
|
43
|
+
context.hasListener = (instanceId, intent, contextType) => intentHandler?.hasListener(instanceId, intent, contextType) ?? false;
|
|
44
|
+
async function connect(appId, signal) {
|
|
45
|
+
const instanceId = context.createUUID();
|
|
46
|
+
let open = true;
|
|
47
|
+
// A fragment holds its `fdc3` and everything reachable from it. The server — and through it
|
|
48
|
+
// every other instance — is reachable only through this closure, never as a property, so a
|
|
49
|
+
// fragment can speak only as itself.
|
|
50
|
+
const messaging = new InProcessMessaging({ appId, instanceId }, (message) => server.receive(context.targetInstance(message), instanceId), () => open);
|
|
51
|
+
context.setInstanceDetails(instanceId, { appId, instanceId, state: State.Connected });
|
|
52
|
+
context.onMessage(instanceId, (message) => {
|
|
53
|
+
if (open)
|
|
54
|
+
messaging.deliver(message);
|
|
55
|
+
});
|
|
56
|
+
const heartbeat = new DefaultHeartbeatSupport(messaging);
|
|
57
|
+
const channels = new DefaultChannelSupport(messaging, NO_UI, MESSAGE_TIMEOUT_MS);
|
|
58
|
+
const intents = new DefaultIntentSupport(messaging, NO_UI, MESSAGE_TIMEOUT_MS, INTENT_TIMEOUT_MS);
|
|
59
|
+
const apps = new DefaultAppSupport(messaging, MESSAGE_TIMEOUT_MS, INTENT_TIMEOUT_MS);
|
|
60
|
+
// the proxy logs every message at its default level; warnings and errors are what a host wants
|
|
61
|
+
const agent = new DesktopAgentProxy(heartbeat, channels, intents, apps, [heartbeat, channels, NO_UI, NO_UI], LogLevel.WARN);
|
|
62
|
+
const release = () => {
|
|
63
|
+
if (!open)
|
|
64
|
+
return;
|
|
65
|
+
open = false;
|
|
66
|
+
// terminates the instance and drops its listeners and channel membership on the agent side
|
|
67
|
+
server.cleanup(instanceId);
|
|
68
|
+
// the agent will not answer what was in flight, so answer it here
|
|
69
|
+
messaging.refuseInFlight();
|
|
70
|
+
};
|
|
71
|
+
signal.addEventListener('abort', release, { once: true });
|
|
72
|
+
try {
|
|
73
|
+
// a teardown during connect refuses its requests at once (see `post`), so this settles promptly
|
|
74
|
+
await agent.connect();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
release();
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
return signal.aborted ? undefined : agent;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
async realmGlobals({ fragmentId, signal }) {
|
|
84
|
+
if (signal.aborted || directory.retrieveAppsById(fragmentId).length === 0)
|
|
85
|
+
return undefined;
|
|
86
|
+
const fdc3 = await connect(fragmentId, signal);
|
|
87
|
+
return fdc3 ? { fdc3 } : undefined;
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* One app instance's side of the in-process transport. State is in `#private` fields, which a
|
|
93
|
+
* fragment cannot read through the proxy that holds this.
|
|
94
|
+
*/
|
|
95
|
+
class InProcessMessaging extends AbstractMessaging {
|
|
96
|
+
#send;
|
|
97
|
+
#isOpen;
|
|
98
|
+
#listeners = new Map();
|
|
99
|
+
/** Requests sent and not yet answered, by request id. */
|
|
100
|
+
#inFlight = new Map();
|
|
101
|
+
constructor(identity, send, isOpen) {
|
|
102
|
+
super(identity);
|
|
103
|
+
this.#send = send;
|
|
104
|
+
this.#isOpen = isOpen;
|
|
105
|
+
}
|
|
106
|
+
createUUID() {
|
|
107
|
+
return crypto.randomUUID();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Requests are always answered: refused here, at once, after teardown or when the message
|
|
111
|
+
* cannot be cloned (a context carrying a function). Dropped, the caller would wait out its
|
|
112
|
+
* timeout; thrown, the proxy — which does not await `post` — would leave it unhandled.
|
|
113
|
+
*/
|
|
114
|
+
async post(message) {
|
|
115
|
+
if (!this.#isOpen())
|
|
116
|
+
return this.#refuse(message, 'AgentDisconnected');
|
|
117
|
+
// launching a fragment is the host's to do, and is not wired yet: neither `open` nor a raise
|
|
118
|
+
// that asks for a new instance (the agent would hand that to the instance already running)
|
|
119
|
+
const { type: kind, payload: request } = message;
|
|
120
|
+
if (kind === 'openRequest')
|
|
121
|
+
return this.#refuse(message, OpenError.ErrorOnLaunch);
|
|
122
|
+
if ((kind === 'raiseIntentRequest' || kind === 'raiseIntentForContextRequest') && request?.newInstance === true) {
|
|
123
|
+
return this.#refuse(message, ResolveError.TargetAppUnavailable);
|
|
124
|
+
}
|
|
125
|
+
let copy;
|
|
126
|
+
try {
|
|
127
|
+
// a clone, as a MessagePort would make: neither side holds the other's objects
|
|
128
|
+
copy = structuredClone(message);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return this.#refuse(message, ChannelError.MalformedContext);
|
|
132
|
+
}
|
|
133
|
+
const { type, meta } = message;
|
|
134
|
+
if (typeof type === 'string' && type.endsWith('Request') && typeof meta?.requestUuid === 'string') {
|
|
135
|
+
this.#inFlight.set(meta.requestUuid, message);
|
|
136
|
+
}
|
|
137
|
+
await this.#send(copy);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Answers every request still waiting, after the instance is torn down. An intent's result is
|
|
141
|
+
* the exception: the proxy sends it without waiting on the answer, so refusing it would surface
|
|
142
|
+
* as an unhandled rejection — and the raiser already has whatever the agent will give it.
|
|
143
|
+
*/
|
|
144
|
+
refuseInFlight() {
|
|
145
|
+
for (const message of this.#inFlight.values()) {
|
|
146
|
+
if (message.type === 'intentResultRequest')
|
|
147
|
+
this.#answer(message, {});
|
|
148
|
+
else
|
|
149
|
+
this.#refuse(message, 'AgentDisconnected');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** A message from the agent, to whichever of this instance's listeners it is for. */
|
|
153
|
+
deliver(message) {
|
|
154
|
+
const requestUuid = message.meta?.requestUuid;
|
|
155
|
+
if (typeof requestUuid === 'string')
|
|
156
|
+
this.#inFlight.delete(requestUuid);
|
|
157
|
+
for (const listener of [...this.#listeners.values()]) {
|
|
158
|
+
// one app handler that throws must not starve the rest, or a request waiting on a response
|
|
159
|
+
try {
|
|
160
|
+
if (listener.filter(message))
|
|
161
|
+
listener.action(message);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
if (typeof reportError === 'function')
|
|
165
|
+
reportError(error);
|
|
166
|
+
else
|
|
167
|
+
console.error(error);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
register(listener) {
|
|
172
|
+
if (listener.id)
|
|
173
|
+
this.#listeners.set(listener.id, listener);
|
|
174
|
+
}
|
|
175
|
+
unregister(id) {
|
|
176
|
+
this.#listeners.delete(id);
|
|
177
|
+
}
|
|
178
|
+
createMeta() {
|
|
179
|
+
return { requestUuid: this.createUUID(), timestamp: new Date(), source: this.getAppIdentifier() };
|
|
180
|
+
}
|
|
181
|
+
async disconnect() {
|
|
182
|
+
this.#listeners.clear();
|
|
183
|
+
}
|
|
184
|
+
#refuse(message, error) {
|
|
185
|
+
this.#answer(message, { error });
|
|
186
|
+
}
|
|
187
|
+
/** Delivers a response to `message` as if from the agent. Only requests have one. */
|
|
188
|
+
#answer(message, payload) {
|
|
189
|
+
const { type, meta } = message;
|
|
190
|
+
if (typeof type !== 'string' || !type.endsWith('Request') || typeof meta?.requestUuid !== 'string')
|
|
191
|
+
return;
|
|
192
|
+
const response = {
|
|
193
|
+
type: type.replace(/Request$/, 'Response'),
|
|
194
|
+
meta: { requestUuid: meta.requestUuid, responseUuid: this.createUUID(), timestamp: new Date() },
|
|
195
|
+
payload,
|
|
196
|
+
};
|
|
197
|
+
queueMicrotask(() => this.deliver(response));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Runs each callback as its own task, in order — as a MessagePort delivers messages. The agent
|
|
202
|
+
* relies on that: it answers a listener's registration and then at once delivers an intent held
|
|
203
|
+
* for it, and the proxy only finishes registering the listener in the continuations of the first.
|
|
204
|
+
* On one microtask queue the intent would overtake them and be lost.
|
|
205
|
+
*/
|
|
206
|
+
function taskQueue() {
|
|
207
|
+
const tasks = [];
|
|
208
|
+
const channel = new MessageChannel();
|
|
209
|
+
channel.port1.onmessage = () => tasks.shift()?.();
|
|
210
|
+
// in Node, an idle port would otherwise keep the process alive
|
|
211
|
+
channel.port1.unref?.();
|
|
212
|
+
return (task) => {
|
|
213
|
+
tasks.push(task);
|
|
214
|
+
channel.port2.postMessage(null);
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/** The agent's view of the page: instances are connected fragments, and nothing is launched. */
|
|
218
|
+
class BraidServerContext {
|
|
219
|
+
schedule;
|
|
220
|
+
/**
|
|
221
|
+
* Registrations are plain data: the agent copies them into its responses (an intent's candidate
|
|
222
|
+
* apps), so a delivery callback kept on one would be sent along with it.
|
|
223
|
+
*/
|
|
224
|
+
instances = new Map();
|
|
225
|
+
deliveries = new Map();
|
|
226
|
+
constructor(schedule) {
|
|
227
|
+
this.schedule = schedule;
|
|
228
|
+
}
|
|
229
|
+
/** Whether an instance has an intent listener for `intent` (and `contextType`, if given); set by the agent. */
|
|
230
|
+
hasListener = () => false;
|
|
231
|
+
/** Live instances of an app, oldest first. */
|
|
232
|
+
live(appId) {
|
|
233
|
+
return [...this.instances.values()].filter((instance) => instance.appId === appId && instance.state === State.Connected);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* A raise that names an app but no instance is resolved here to the instance that will take
|
|
237
|
+
* it: the one listening for the intent, or — when none is yet — the app's only instance, so the
|
|
238
|
+
* agent holds the intent until that fragment's listener arrives. FINOS would otherwise treat it
|
|
239
|
+
* as a request to launch the app, which a Braid page cannot do.
|
|
240
|
+
*/
|
|
241
|
+
targetInstance(message) {
|
|
242
|
+
const { type, payload } = message;
|
|
243
|
+
const app = payload?.app;
|
|
244
|
+
if (type !== 'raiseIntentRequest' || typeof payload?.intent !== 'string' || typeof app?.appId !== 'string' || app.instanceId) {
|
|
245
|
+
return message;
|
|
246
|
+
}
|
|
247
|
+
const live = this.live(app.appId);
|
|
248
|
+
const contextType = typeof payload.context?.type === 'string' ? payload.context.type : undefined;
|
|
249
|
+
const listening = live.filter((instance) => this.hasListener(instance.instanceId, payload.intent, contextType));
|
|
250
|
+
const target = listening.length === 1 ? listening[0] : listening.length === 0 && live.length === 1 ? live[0] : undefined;
|
|
251
|
+
return target ? { ...message, payload: { ...payload, app: { appId: target.appId, instanceId: target.instanceId } } } : message;
|
|
252
|
+
}
|
|
253
|
+
/** Where messages for an instance go. */
|
|
254
|
+
onMessage(id, deliver) {
|
|
255
|
+
this.deliveries.set(id, deliver);
|
|
256
|
+
}
|
|
257
|
+
createUUID() {
|
|
258
|
+
return crypto.randomUUID();
|
|
259
|
+
}
|
|
260
|
+
async post(message, instanceId) {
|
|
261
|
+
const deliver = this.deliveries.get(instanceId);
|
|
262
|
+
if (!deliver || this.instances.get(instanceId)?.state === State.Terminated)
|
|
263
|
+
return;
|
|
264
|
+
const copy = structuredClone(message);
|
|
265
|
+
this.schedule(() => deliver(copy));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Nothing is launched: `fdc3.open` is refused before it reaches the agent, and launching a
|
|
269
|
+
* fragment is the host's to do. The agent still calls this when it holds an intent for an app
|
|
270
|
+
* that is mounted but not yet listening (see {@link narrowIntents}) — the instance it waits for
|
|
271
|
+
* already exists, so this names it. It never rejects: the agent does not handle a rejection here.
|
|
272
|
+
*/
|
|
273
|
+
async open(appId) {
|
|
274
|
+
return this.live(appId)[0]?.instanceId ?? this.createUUID();
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* `fdc3.close()`, refused: fragments are torn down by their host, not by the agent. The agent
|
|
278
|
+
* answers a close only when this throws, so a no-op would leave the app waiting out its timeout.
|
|
279
|
+
*/
|
|
280
|
+
async close() {
|
|
281
|
+
throw new Error(CloseError.ErrorOnClose);
|
|
282
|
+
}
|
|
283
|
+
setFDC3Server() {
|
|
284
|
+
// the server is held by the agent that created this context
|
|
285
|
+
}
|
|
286
|
+
setInstanceDetails(id, details) {
|
|
287
|
+
this.instances.set(id, details);
|
|
288
|
+
}
|
|
289
|
+
getInstanceDetails(id) {
|
|
290
|
+
return this.instances.get(id);
|
|
291
|
+
}
|
|
292
|
+
async setAppState(id, state) {
|
|
293
|
+
const instance = this.instances.get(id);
|
|
294
|
+
if (!instance)
|
|
295
|
+
return;
|
|
296
|
+
instance.state = state;
|
|
297
|
+
// a terminated fragment is gone for good; it never reconnects under the same instance
|
|
298
|
+
if (state === State.Terminated) {
|
|
299
|
+
this.instances.delete(id);
|
|
300
|
+
this.deliveries.delete(id);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
async getConnectedApps() {
|
|
304
|
+
return [...this.instances.values()].filter((instance) => instance.state === State.Connected);
|
|
305
|
+
}
|
|
306
|
+
async getAllApps() {
|
|
307
|
+
return [...this.instances.values()];
|
|
308
|
+
}
|
|
309
|
+
async isAppConnected(id) {
|
|
310
|
+
return this.instances.get(id)?.state === State.Connected;
|
|
311
|
+
}
|
|
312
|
+
log() {
|
|
313
|
+
// quiet: the proxy rejects with FDC3 errors, which is what an app sees
|
|
314
|
+
}
|
|
315
|
+
provider() {
|
|
316
|
+
return 'Braid';
|
|
317
|
+
}
|
|
318
|
+
providerVersion() {
|
|
319
|
+
// the release stamps versions into the built package.json only, so the source has none to give
|
|
320
|
+
return '';
|
|
321
|
+
}
|
|
322
|
+
fdc3Version() {
|
|
323
|
+
return FDC3_VERSION;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* The candidates an intent may go to, given that nothing can be launched:
|
|
327
|
+
*
|
|
328
|
+
* - an instance only once it listens for the intent, for this context's type — before then,
|
|
329
|
+
* sending it the intent would lose it;
|
|
330
|
+
* - an app without an instance (the directory's entry) only while one is mounted and none of its
|
|
331
|
+
* instances listens yet — the agent then holds the intent until the listener arrives.
|
|
332
|
+
*
|
|
333
|
+
* An app with no live instance drops out, which makes the raise a clean `NoAppsFound`.
|
|
334
|
+
*/
|
|
335
|
+
async narrowIntents(_raiser, appIntents, context) {
|
|
336
|
+
return appIntents
|
|
337
|
+
.map((appIntent) => {
|
|
338
|
+
const listening = appIntent.apps.filter((app) => app.instanceId !== undefined && this.hasListener(app.instanceId, appIntent.intent.name, context?.type));
|
|
339
|
+
const waiting = appIntent.apps.filter((app) => app.instanceId === undefined &&
|
|
340
|
+
this.live(app.appId).length > 0 &&
|
|
341
|
+
!listening.some((candidate) => candidate.appId === app.appId));
|
|
342
|
+
return { ...appIntent, apps: [...listening, ...waiting] };
|
|
343
|
+
})
|
|
344
|
+
.filter((appIntent) => appIntent.apps.length > 0);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=agent.js.map
|
package/src/agent.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../libs/braid-fdc3/src/agent.ts"],"names":[],"mappings":"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"}
|
package/src/index.d.ts
ADDED
package/src/index.js
ADDED
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/braid-fdc3/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|