@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 CHANGED
@@ -1,3 +1,26 @@
1
- # Temporary Holding Version
1
+ # @braidlabs/fdc3
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
@@ -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
@@ -0,0 +1,2 @@
1
+ export { createBraidDesktopAgent } from './agent.js';
2
+ export type { BraidDesktopAgent, BraidDesktopAgentOptions } from './agent.js';
package/src/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { createBraidDesktopAgent } from './agent.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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"}