@braidlabs/fdc3 0.7.1 → 0.8.1
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 +30 -4
- package/package.json +4 -3
- package/src/agent.d.ts +52 -3
- package/src/agent.js +286 -43
- package/src/agent.js.map +1 -1
- package/src/index.d.ts +3 -1
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/resolver.d.ts +15 -0
- package/src/resolver.js +91 -0
- package/src/resolver.js.map +1 -0
package/README.md
CHANGED
|
@@ -18,9 +18,35 @@ The agent is built on the FINOS reference implementation (`@finos/fdc3-web-impl`
|
|
|
18
18
|
`@finos/fdc3-agent-proxy`). Trusted fragments, compat and custom-element, get `window.fdc3` before
|
|
19
19
|
their first script runs. A fragment whose id has no directory record gets none.
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
Give the agent a `container` and it can launch apps:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
const agent = createBraidDesktopAgent({
|
|
25
|
+
directory: applications,
|
|
26
|
+
container: document.getElementById('desk')!, // where fdc3.open and intents mount apps
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- **Launching.** `fdc3.open`, `newInstance: true`, and intents no running app can take mount a
|
|
31
|
+
`<fragment-slot>` in the container.
|
|
32
|
+
- **Resolving.** A built-in dialog chooses among several apps; a `resolveIntent` hook replaces it.
|
|
33
|
+
|
|
34
|
+
Preferences, per-app settings and saved layouts are not part of FDC3 and not part of this package.
|
|
35
|
+
They are the workspace in `@braidlabs/console/workspace`, which composes around the agent:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { createBraidDesktopAgent, dialogResolver } from '@braidlabs/fdc3';
|
|
39
|
+
import { createWorkspace } from '@braidlabs/console/workspace';
|
|
40
|
+
|
|
41
|
+
const workspace = createWorkspace();
|
|
42
|
+
const agent = createBraidDesktopAgent({
|
|
43
|
+
directory: applications,
|
|
44
|
+
...workspace.fdc3(dialogResolver(document, { remember: true })), // container and resolveIntent
|
|
45
|
+
});
|
|
46
|
+
initBraid({ realmGlobals: workspace.realmGlobals(agent.realmGlobals) });
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Not supported yet: `fdc3.close()`, FDC3 for untrusted or contract fragments, and a live-updating
|
|
50
|
+
directory.
|
|
25
51
|
|
|
26
52
|
Full documentation: https://braidjs.github.io/braid/packages/fdc3
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@braidlabs/fdc3",
|
|
3
|
-
"version": "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.",
|
|
3
|
+
"version": "0.8.1",
|
|
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, with launching and an intent resolver. Built on the FINOS reference implementation.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"braid",
|
|
7
7
|
"micro-frontends",
|
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@finos/fdc3-agent-proxy": "3.0.0",
|
|
30
30
|
"@finos/fdc3-standard": "3.0.0",
|
|
31
|
-
"@finos/fdc3-web-impl": "3.0.0"
|
|
31
|
+
"@finos/fdc3-web-impl": "3.0.0",
|
|
32
|
+
"uuid": "^14.0.0"
|
|
32
33
|
},
|
|
33
34
|
"publishConfig": {
|
|
34
35
|
"access": "public"
|
package/src/agent.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type DirectoryApp } from '@finos/fdc3-web-impl';
|
|
2
|
-
import { type DesktopAgent } from '@finos/fdc3-standard';
|
|
2
|
+
import { type AppIdentifier, type Context, type DesktopAgent } from '@finos/fdc3-standard';
|
|
3
3
|
/**
|
|
4
4
|
* An FDC3 3.0 Desktop Agent for one Braid page.
|
|
5
5
|
*
|
|
@@ -17,6 +17,12 @@ import { type DesktopAgent } from '@finos/fdc3-standard';
|
|
|
17
17
|
* per message — the isolation and ordering a MessagePort gives, without one.
|
|
18
18
|
* - **Lifetime is the fragment's.** When the fragment is torn down its instance is terminated: its
|
|
19
19
|
* listeners stop receiving and `findInstances` no longer reports it.
|
|
20
|
+
* - **Launching is mounting.** With a `container`, `fdc3.open` and intents for apps that are not
|
|
21
|
+
* running mount a `<fragment-slot>` there.
|
|
22
|
+
*
|
|
23
|
+
* That is all of it. What FDC3 does not standardize — remembered choices, preferences, per-app
|
|
24
|
+
* settings, saved layouts — is not here: it is the workspace in `@braidlabs/console/workspace`,
|
|
25
|
+
* which composes around this agent through `resolveIntent` and `realmGlobals`.
|
|
20
26
|
*/
|
|
21
27
|
export interface BraidDesktopAgentOptions {
|
|
22
28
|
/**
|
|
@@ -26,15 +32,58 @@ export interface BraidDesktopAgentOptions {
|
|
|
26
32
|
* one whose record's `fdc3Version` range excludes 3.0.
|
|
27
33
|
*/
|
|
28
34
|
directory: readonly DirectoryApp[];
|
|
35
|
+
/**
|
|
36
|
+
* Where the agent mounts fragments it launches — for `fdc3.open`, and for an intent whose app is
|
|
37
|
+
* not running. A `<fragment-slot>` the host places there itself counts as that app starting.
|
|
38
|
+
* Without one nothing is launched: `fdc3.open` rejects with `ErrorOnLaunch`.
|
|
39
|
+
*
|
|
40
|
+
* A function is asked each time, for a container a framework renders after the agent is
|
|
41
|
+
* created or replaces later; while it returns nothing, a launch is refused as if there were none.
|
|
42
|
+
*/
|
|
43
|
+
container?: Element | (() => Element | null | undefined);
|
|
44
|
+
/**
|
|
45
|
+
* Chooses among the apps that can take an intent, when there is more than one. Defaults to a
|
|
46
|
+
* built-in dialog in a browser; `false` refuses such a raise with `UserCancelledResolution`.
|
|
47
|
+
*/
|
|
48
|
+
resolveIntent?: IntentResolverHook | false;
|
|
29
49
|
}
|
|
50
|
+
/** One app — a running instance, or the app itself to be launched — that can take an intent. */
|
|
51
|
+
export interface IntentCandidate {
|
|
52
|
+
intent: string;
|
|
53
|
+
appId: string;
|
|
54
|
+
/** Set for a running instance; absent for the app itself, which choosing launches — or, when `starting`, waits for. */
|
|
55
|
+
instanceId?: string;
|
|
56
|
+
/** The app is open but not yet listening for the intent; choosing it waits for that instance rather than launching one. */
|
|
57
|
+
starting?: true;
|
|
58
|
+
/** The directory's title for the app, or its id. */
|
|
59
|
+
title: string;
|
|
60
|
+
/** The directory's first icon, if it has one. */
|
|
61
|
+
icon?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface IntentChoiceRequest {
|
|
64
|
+
context: Context;
|
|
65
|
+
raisedBy: AppIdentifier;
|
|
66
|
+
/** Two or more, in the order the agent found them. */
|
|
67
|
+
candidates: IntentCandidate[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Chooses for a raise: one of the candidates, or undefined to cancel. The agent keeps nothing, so
|
|
71
|
+
* `remember` is for whatever wraps the hook — the console workspace's `intentResolver` stores the
|
|
72
|
+
* choice and answers the next raise itself.
|
|
73
|
+
*/
|
|
74
|
+
export type IntentResolverHook = (request: IntentChoiceRequest) => Promise<{
|
|
75
|
+
candidate: IntentCandidate;
|
|
76
|
+
remember?: boolean;
|
|
77
|
+
} | undefined>;
|
|
30
78
|
export interface BraidDesktopAgent {
|
|
31
79
|
/**
|
|
32
|
-
* The hook for `initBraid({ realmGlobals })`: a fragment in the directory gets `{ fdc3 }`,
|
|
33
|
-
*
|
|
80
|
+
* The hook for `initBraid({ realmGlobals })`: a fragment in the directory gets `{ fdc3 }`, bound
|
|
81
|
+
* to its id, before any of its code runs; its signal releases the instance.
|
|
34
82
|
*/
|
|
35
83
|
realmGlobals(fragment: {
|
|
36
84
|
fragmentId: string;
|
|
37
85
|
signal: AbortSignal;
|
|
86
|
+
slot?: Element;
|
|
38
87
|
}): Promise<{
|
|
39
88
|
fdc3: DesktopAgent;
|
|
40
89
|
} | undefined>;
|
package/src/agent.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { BasicDirectory, ChannelType, DefaultFDC3Server, IntentHandler, State, } from '@finos/fdc3-web-impl';
|
|
2
2
|
import { AbstractMessaging, DefaultAppSupport, DefaultChannelSupport, DefaultHeartbeatSupport, DefaultIntentSupport, DesktopAgentProxy, } from '@finos/fdc3-agent-proxy';
|
|
3
3
|
import { ChannelError, CloseError, LogLevel, OpenError, ResolveError, } from '@finos/fdc3-standard';
|
|
4
|
+
import { dialogResolver } from './resolver.js';
|
|
4
5
|
/** The FDC3 version the agent implements; the directory drops records whose `fdc3Version` excludes it. */
|
|
5
6
|
const FDC3_VERSION = '3.0';
|
|
6
7
|
/** A request is answered within this, or the proxy reports `ApiTimeout`. */
|
|
@@ -18,19 +19,53 @@ const USER_CHANNELS = [
|
|
|
18
19
|
['magenta', '7'],
|
|
19
20
|
['purple', '8'],
|
|
20
21
|
];
|
|
21
|
-
/** The proxy's
|
|
22
|
+
/** The proxy's channel selector, and its connectables, when the host supplies no UI. */
|
|
22
23
|
const NO_UI = {
|
|
23
24
|
connect: async () => undefined,
|
|
24
25
|
disconnect: async () => undefined,
|
|
25
|
-
// no resolver UI: a raise that needs a choice is refused, as FDC3 says, with UserCancelledResolution
|
|
26
26
|
chooseIntent: async () => undefined,
|
|
27
27
|
updateChannel: async () => undefined,
|
|
28
28
|
setChannelChangeCallback: () => undefined,
|
|
29
29
|
};
|
|
30
30
|
export function createBraidDesktopAgent(options) {
|
|
31
31
|
// a directory that failed to load is an empty one, not a page that fails to compose
|
|
32
|
-
const
|
|
33
|
-
const
|
|
32
|
+
const records = Array.isArray(options.directory) ? [...options.directory] : [];
|
|
33
|
+
const directory = new BasicDirectory(records, FDC3_VERSION);
|
|
34
|
+
/** The container now: the one given, or whatever the host's function finds at this moment. */
|
|
35
|
+
const containerNow = () => (typeof options.container === 'function' ? options.container() : options.container) ?? undefined;
|
|
36
|
+
const canLaunch = options.container !== undefined;
|
|
37
|
+
const resolveIntent = options.resolveIntent === false
|
|
38
|
+
? undefined
|
|
39
|
+
: (options.resolveIntent ?? (typeof document === 'undefined' ? undefined : dialogResolver(document)));
|
|
40
|
+
/** Slots the agent mounted, until their fragment connects. */
|
|
41
|
+
const launches = new WeakMap();
|
|
42
|
+
/** Connected fragments' instance ids, by the slot they boot in. */
|
|
43
|
+
const bySlot = new Map();
|
|
44
|
+
const context = new BraidServerContext(taskQueue(), (appId) => {
|
|
45
|
+
const container = containerNow();
|
|
46
|
+
if (!container)
|
|
47
|
+
return undefined;
|
|
48
|
+
const instanceId = crypto.randomUUID();
|
|
49
|
+
mountSlot(container, appId, (slot) => launches.set(slot, { instanceId }));
|
|
50
|
+
return instanceId;
|
|
51
|
+
});
|
|
52
|
+
context.launchable = canLaunch;
|
|
53
|
+
context.knows = (appId) => directory.retrieveAppsById(appId).length > 0;
|
|
54
|
+
// a slot in the container that has not connected yet: launched by the agent, or placed by the host
|
|
55
|
+
context.mounting = (appId) => {
|
|
56
|
+
const container = containerNow();
|
|
57
|
+
if (!container)
|
|
58
|
+
return undefined;
|
|
59
|
+
for (const slot of slotsIn(container)) {
|
|
60
|
+
if (slot.getAttribute('name') !== appId || bySlot.has(slot))
|
|
61
|
+
continue;
|
|
62
|
+
let launch = launches.get(slot);
|
|
63
|
+
if (!launch)
|
|
64
|
+
launches.set(slot, (launch = { instanceId: crypto.randomUUID() }));
|
|
65
|
+
return launch.instanceId;
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
};
|
|
34
69
|
const userChannels = USER_CHANNELS.map(([color, glyph]) => ({
|
|
35
70
|
id: `fdc3.channel.${glyph}`,
|
|
36
71
|
type: ChannelType.user,
|
|
@@ -41,21 +76,61 @@ export function createBraidDesktopAgent(options) {
|
|
|
41
76
|
// which instances are listening for what: the agent's intent handler is the source of truth
|
|
42
77
|
const intentHandler = server.handlers.find((handler) => handler instanceof IntentHandler);
|
|
43
78
|
context.hasListener = (instanceId, intent, contextType) => intentHandler?.hasListener(instanceId, intent, contextType) ?? false;
|
|
44
|
-
|
|
45
|
-
|
|
79
|
+
context.heldIntents = () => intentHandler?.pendingIntents ?? new Set();
|
|
80
|
+
/** The candidates for a raise, as the resolver sees them. */
|
|
81
|
+
function candidatesOf(appIntents) {
|
|
82
|
+
return appIntents.flatMap((appIntent) => appIntent.apps.map((app) => {
|
|
83
|
+
const record = directory.retrieveAppsById(app.appId)[0];
|
|
84
|
+
const icon = record?.icons?.[0]?.src;
|
|
85
|
+
return {
|
|
86
|
+
intent: appIntent.intent.name,
|
|
87
|
+
appId: app.appId,
|
|
88
|
+
...(app.instanceId
|
|
89
|
+
? { instanceId: app.instanceId }
|
|
90
|
+
: app.instanceMetadata?.braidStarting === true
|
|
91
|
+
? { starting: true }
|
|
92
|
+
: {}),
|
|
93
|
+
title: record?.title ?? app.appId,
|
|
94
|
+
...(icon ? { icon } : {}),
|
|
95
|
+
};
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
/** The proxy's intent resolver for one instance: the only candidate, or the host's choice among several. */
|
|
99
|
+
async function choose(raisedBy, appIntents, raised) {
|
|
100
|
+
const candidates = candidatesOf(appIntents);
|
|
101
|
+
let choice = candidates.length === 1 ? candidates[0] : undefined;
|
|
102
|
+
if (!choice && candidates.length > 1 && resolveIntent) {
|
|
103
|
+
// a resolver that throws has chosen nothing
|
|
104
|
+
const answer = await resolveIntent({ context: raised, raisedBy, candidates: candidates.map((candidate) => ({ ...candidate })) }).catch(() => undefined);
|
|
105
|
+
// only one of what was offered: a resolver cannot route the intent anywhere else
|
|
106
|
+
choice = answer && candidates.find((candidate) => sameCandidate(candidate, answer.candidate));
|
|
107
|
+
}
|
|
108
|
+
if (!choice)
|
|
109
|
+
return undefined;
|
|
110
|
+
return {
|
|
111
|
+
intent: choice.intent,
|
|
112
|
+
appId: choice.instanceId ? { appId: choice.appId, instanceId: choice.instanceId } : { appId: choice.appId },
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async function connect(appId, signal, slot) {
|
|
116
|
+
// kept until the connect succeeds: a boot cut short and retried connects as the same launch
|
|
117
|
+
const launch = slot ? launches.get(slot) : undefined;
|
|
118
|
+
const instanceId = launch?.instanceId ?? context.createUUID();
|
|
46
119
|
let open = true;
|
|
47
120
|
// A fragment holds its `fdc3` and everything reachable from it. The server — and through it
|
|
48
121
|
// every other instance — is reachable only through this closure, never as a property, so a
|
|
49
122
|
// fragment can speak only as itself.
|
|
50
|
-
const messaging = new InProcessMessaging({ appId, instanceId }, (message) => server.receive(context.
|
|
123
|
+
const messaging = new InProcessMessaging({ appId, instanceId }, (message) => server.receive(context.inspect(message, instanceId), instanceId), () => open, canLaunch);
|
|
51
124
|
context.setInstanceDetails(instanceId, { appId, instanceId, state: State.Connected });
|
|
52
125
|
context.onMessage(instanceId, (message) => {
|
|
53
126
|
if (open)
|
|
54
127
|
messaging.deliver(message);
|
|
55
128
|
});
|
|
129
|
+
const identity = { appId, instanceId };
|
|
130
|
+
const resolver = { ...NO_UI, chooseIntent: (appIntents, raised) => choose(identity, appIntents, raised) };
|
|
56
131
|
const heartbeat = new DefaultHeartbeatSupport(messaging);
|
|
57
132
|
const channels = new DefaultChannelSupport(messaging, NO_UI, MESSAGE_TIMEOUT_MS);
|
|
58
|
-
const intents = new DefaultIntentSupport(messaging,
|
|
133
|
+
const intents = new DefaultIntentSupport(messaging, resolver, MESSAGE_TIMEOUT_MS, INTENT_TIMEOUT_MS);
|
|
59
134
|
const apps = new DefaultAppSupport(messaging, MESSAGE_TIMEOUT_MS, INTENT_TIMEOUT_MS);
|
|
60
135
|
// the proxy logs every message at its default level; warnings and errors are what a host wants
|
|
61
136
|
const agent = new DesktopAgentProxy(heartbeat, channels, intents, apps, [heartbeat, channels, NO_UI, NO_UI], LogLevel.WARN);
|
|
@@ -63,6 +138,8 @@ export function createBraidDesktopAgent(options) {
|
|
|
63
138
|
if (!open)
|
|
64
139
|
return;
|
|
65
140
|
open = false;
|
|
141
|
+
if (slot && bySlot.get(slot) === instanceId)
|
|
142
|
+
bySlot.delete(slot);
|
|
66
143
|
// terminates the instance and drops its listeners and channel membership on the agent side
|
|
67
144
|
server.cleanup(instanceId);
|
|
68
145
|
// the agent will not answer what was in flight, so answer it here
|
|
@@ -77,17 +154,50 @@ export function createBraidDesktopAgent(options) {
|
|
|
77
154
|
release();
|
|
78
155
|
return undefined;
|
|
79
156
|
}
|
|
80
|
-
|
|
157
|
+
// A launched app is one FINOS is waiting for: an open to answer, or an intent to deliver. It
|
|
158
|
+
// learns of the arrival from the Web Connection Protocol's identity check, so the instance
|
|
159
|
+
// announces itself with one — before the fragment has its `fdc3`, so the context listener it
|
|
160
|
+
// adds next finds FINOS ready to deliver the open's context to it.
|
|
161
|
+
if (launch)
|
|
162
|
+
await context.announce(server, instanceId);
|
|
163
|
+
// held intents tied to an instance of this app that is gone are this one's now
|
|
164
|
+
const container = containerNow();
|
|
165
|
+
if (container)
|
|
166
|
+
context.adopt(appId, instanceId, (id) => slotsIn(container).some((other) => launches.get(other)?.instanceId === id));
|
|
167
|
+
if (signal.aborted)
|
|
168
|
+
return undefined;
|
|
169
|
+
if (slot) {
|
|
170
|
+
launches.delete(slot);
|
|
171
|
+
bySlot.set(slot, instanceId);
|
|
172
|
+
}
|
|
173
|
+
return { fdc3: agent };
|
|
81
174
|
}
|
|
82
175
|
return {
|
|
83
|
-
async realmGlobals({ fragmentId, signal }) {
|
|
176
|
+
async realmGlobals({ fragmentId, signal, slot }) {
|
|
84
177
|
if (signal.aborted || directory.retrieveAppsById(fragmentId).length === 0)
|
|
85
178
|
return undefined;
|
|
86
|
-
|
|
87
|
-
return fdc3 ? { fdc3 } : undefined;
|
|
179
|
+
return connect(fragmentId, signal, slot);
|
|
88
180
|
},
|
|
89
181
|
};
|
|
90
182
|
}
|
|
183
|
+
/** The `<fragment-slot>` children of a container, in document order. */
|
|
184
|
+
function slotsIn(container) {
|
|
185
|
+
return [...container.children].filter((child) => child.localName === 'fragment-slot');
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Mounts a `<fragment-slot>` for an app at the end of `container`. `prepare` runs before the slot
|
|
189
|
+
* connects — which is when it boots and its fragment asks for its globals.
|
|
190
|
+
*/
|
|
191
|
+
function mountSlot(container, appId, prepare) {
|
|
192
|
+
const slot = container.ownerDocument.createElement('fragment-slot');
|
|
193
|
+
slot.setAttribute('name', appId);
|
|
194
|
+
prepare?.(slot);
|
|
195
|
+
container.append(slot);
|
|
196
|
+
return slot;
|
|
197
|
+
}
|
|
198
|
+
function sameCandidate(a, b) {
|
|
199
|
+
return !!b && a.intent === b.intent && a.appId === b.appId && (a.instanceId ?? null) === (b.instanceId ?? null);
|
|
200
|
+
}
|
|
91
201
|
/**
|
|
92
202
|
* One app instance's side of the in-process transport. State is in `#private` fields, which a
|
|
93
203
|
* fragment cannot read through the proxy that holds this.
|
|
@@ -95,13 +205,15 @@ export function createBraidDesktopAgent(options) {
|
|
|
95
205
|
class InProcessMessaging extends AbstractMessaging {
|
|
96
206
|
#send;
|
|
97
207
|
#isOpen;
|
|
208
|
+
#canLaunch;
|
|
98
209
|
#listeners = new Map();
|
|
99
210
|
/** Requests sent and not yet answered, by request id. */
|
|
100
211
|
#inFlight = new Map();
|
|
101
|
-
constructor(identity, send, isOpen) {
|
|
212
|
+
constructor(identity, send, isOpen, canLaunch) {
|
|
102
213
|
super(identity);
|
|
103
214
|
this.#send = send;
|
|
104
215
|
this.#isOpen = isOpen;
|
|
216
|
+
this.#canLaunch = canLaunch;
|
|
105
217
|
}
|
|
106
218
|
createUUID() {
|
|
107
219
|
return crypto.randomUUID();
|
|
@@ -114,13 +226,15 @@ class InProcessMessaging extends AbstractMessaging {
|
|
|
114
226
|
async post(message) {
|
|
115
227
|
if (!this.#isOpen())
|
|
116
228
|
return this.#refuse(message, 'AgentDisconnected');
|
|
117
|
-
//
|
|
118
|
-
//
|
|
229
|
+
// without a container nothing can be launched: neither `open` nor a raise that asks for a new
|
|
230
|
+
// instance (the agent would hand that to the instance already running)
|
|
119
231
|
const { type: kind, payload: request } = message;
|
|
120
|
-
if (
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
232
|
+
if (!this.#canLaunch) {
|
|
233
|
+
if (kind === 'openRequest')
|
|
234
|
+
return this.#refuse(message, OpenError.ErrorOnLaunch);
|
|
235
|
+
if ((kind === 'raiseIntentRequest' || kind === 'raiseIntentForContextRequest') && request?.newInstance === true) {
|
|
236
|
+
return this.#refuse(message, ResolveError.TargetAppUnavailable);
|
|
237
|
+
}
|
|
124
238
|
}
|
|
125
239
|
let copy;
|
|
126
240
|
try {
|
|
@@ -214,17 +328,29 @@ function taskQueue() {
|
|
|
214
328
|
channel.port2.postMessage(null);
|
|
215
329
|
};
|
|
216
330
|
}
|
|
217
|
-
/**
|
|
331
|
+
/**
|
|
332
|
+
* The agent's view of the page: instances are connected fragments, and launching one is the
|
|
333
|
+
* `launch` callback's — mounting a slot — when the host gave a container.
|
|
334
|
+
*/
|
|
218
335
|
class BraidServerContext {
|
|
219
336
|
schedule;
|
|
337
|
+
launch;
|
|
220
338
|
/**
|
|
221
339
|
* Registrations are plain data: the agent copies them into its responses (an intent's candidate
|
|
222
340
|
* apps), so a delivery callback kept on one would be sent along with it.
|
|
223
341
|
*/
|
|
224
342
|
instances = new Map();
|
|
225
343
|
deliveries = new Map();
|
|
226
|
-
|
|
344
|
+
/**
|
|
345
|
+
* Raises in progress that asked for a new instance, noted by {@link inspect} for
|
|
346
|
+
* {@link narrowIntents}, which has no other way to tell; dropped after a task.
|
|
347
|
+
*/
|
|
348
|
+
newInstance = [];
|
|
349
|
+
constructor(schedule,
|
|
350
|
+
/** Mounts a new instance of the app, returning the instance id it will connect as; undefined if nothing can be launched. */
|
|
351
|
+
launch) {
|
|
227
352
|
this.schedule = schedule;
|
|
353
|
+
this.launch = launch;
|
|
228
354
|
}
|
|
229
355
|
/** Whether an instance has an intent listener for `intent` (and `contextType`, if given); set by the agent. */
|
|
230
356
|
hasListener = () => false;
|
|
@@ -232,14 +358,47 @@ class BraidServerContext {
|
|
|
232
358
|
live(appId) {
|
|
233
359
|
return [...this.instances.values()].filter((instance) => instance.appId === appId && instance.state === State.Connected);
|
|
234
360
|
}
|
|
361
|
+
/** Set when the host gave a container. */
|
|
362
|
+
launchable = false;
|
|
235
363
|
/**
|
|
236
|
-
* A
|
|
237
|
-
*
|
|
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.
|
|
364
|
+
* A mounted instance of the app that has not connected yet — one the agent launched, or a slot
|
|
365
|
+
* the host placed in the container — as the instance id it will connect as. Set by the agent.
|
|
240
366
|
*/
|
|
241
|
-
|
|
367
|
+
mounting = () => undefined;
|
|
368
|
+
/** The app has an instance that will be able to take an intent, but none listening for it yet. */
|
|
369
|
+
booting(appId) {
|
|
370
|
+
return this.live(appId).length > 0 || this.mounting(appId) !== undefined;
|
|
371
|
+
}
|
|
372
|
+
/** Adds `note` to `list` for one task. */
|
|
373
|
+
static hold(list, note) {
|
|
374
|
+
list.push(note);
|
|
375
|
+
setTimeout(() => {
|
|
376
|
+
const index = list.indexOf(note);
|
|
377
|
+
if (index >= 0)
|
|
378
|
+
list.splice(index, 1);
|
|
379
|
+
}, 0);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Looks at a request on its way to the agent, and returns what the agent should get:
|
|
383
|
+
*
|
|
384
|
+
* - A raise that names an app but no instance is resolved here to the instance that will take
|
|
385
|
+
* it: the one listening for the intent, or — when none is yet — the app's only instance, so
|
|
386
|
+
* the agent holds the intent until that fragment's listener arrives. FINOS would otherwise
|
|
387
|
+
* treat it as a request to launch the app. A raise asking for a new instance is left alone.
|
|
388
|
+
* - A raise asking for a new instance is noted, so {@link narrowIntents} offers it launches.
|
|
389
|
+
*/
|
|
390
|
+
inspect(message, from) {
|
|
242
391
|
const { type, payload } = message;
|
|
392
|
+
if (type !== 'raiseIntentRequest' && type !== 'raiseIntentForContextRequest')
|
|
393
|
+
return message;
|
|
394
|
+
if (payload?.newInstance === true) {
|
|
395
|
+
BraidServerContext.hold(this.newInstance, {
|
|
396
|
+
from,
|
|
397
|
+
...(typeof payload.intent === 'string' ? { intent: payload.intent } : {}),
|
|
398
|
+
...(typeof payload.context?.type === 'string' ? { contextType: payload.context.type } : {}),
|
|
399
|
+
});
|
|
400
|
+
return message;
|
|
401
|
+
}
|
|
243
402
|
const app = payload?.app;
|
|
244
403
|
if (type !== 'raiseIntentRequest' || typeof payload?.intent !== 'string' || typeof app?.appId !== 'string' || app.instanceId) {
|
|
245
404
|
return message;
|
|
@@ -250,6 +409,13 @@ class BraidServerContext {
|
|
|
250
409
|
const target = listening.length === 1 ? listening[0] : listening.length === 0 && live.length === 1 ? live[0] : undefined;
|
|
251
410
|
return target ? { ...message, payload: { ...payload, app: { appId: target.appId, instanceId: target.instanceId } } } : message;
|
|
252
411
|
}
|
|
412
|
+
/**
|
|
413
|
+
* Tells FINOS a launched instance has arrived, with the Web Connection Protocol identity check
|
|
414
|
+
* it would otherwise wait for. Its answer, addressed to the instance, is ignored there.
|
|
415
|
+
*/
|
|
416
|
+
async announce(server, instanceId) {
|
|
417
|
+
await server.receive({ type: 'WCP4ValidateAppIdentity', meta: { connectionAttemptUuid: this.createUUID(), timestamp: new Date() }, payload: {} }, instanceId);
|
|
418
|
+
}
|
|
253
419
|
/** Where messages for an instance go. */
|
|
254
420
|
onMessage(id, deliver) {
|
|
255
421
|
this.deliveries.set(id, deliver);
|
|
@@ -265,13 +431,73 @@ class BraidServerContext {
|
|
|
265
431
|
this.schedule(() => deliver(copy));
|
|
266
432
|
}
|
|
267
433
|
/**
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
434
|
+
* Called for `fdc3.open`, and when FINOS holds an intent for an app to start. FINOS adds the held
|
|
435
|
+
* intent and calls this in one step, so the newest held intent for the app from this raiser that
|
|
436
|
+
* is not yet tied to an instance is that raise's — and none means `fdc3.open`.
|
|
437
|
+
*
|
|
438
|
+
* - `fdc3.open` launches. An app the directory does not know rejects with `AppNotFound`, which
|
|
439
|
+
* FINOS answers the open with.
|
|
440
|
+
* - A held intent launches when its raise asked for a new instance. Otherwise it waits for an
|
|
441
|
+
* instance that is booting — connected but not listening for it, or mounted and not yet
|
|
442
|
+
* connected, including one an earlier raise just launched — and launches only when there is
|
|
443
|
+
* none; deciding here, when the launch would happen, keeps two quick raises from mounting the
|
|
444
|
+
* app twice.
|
|
445
|
+
*
|
|
446
|
+
* Either way the held intent is then tied to that instance (see {@link adopt}): FINOS holds it
|
|
447
|
+
* for "any instance of the app" and drops the id returned here, so otherwise whichever instance
|
|
448
|
+
* added a listener first would take it.
|
|
272
449
|
*/
|
|
273
|
-
async open(appId) {
|
|
274
|
-
|
|
450
|
+
async open(appId, from) {
|
|
451
|
+
if (!this.launchable)
|
|
452
|
+
return this.live(appId)[0]?.instanceId ?? this.createUUID();
|
|
453
|
+
const raiser = from?.instanceId;
|
|
454
|
+
const held = [...this.heldIntents()]
|
|
455
|
+
.reverse()
|
|
456
|
+
.find((intent) => intent.appId?.appId === appId && intent.appId.instanceId === undefined && intent.r?.from?.instanceId === raiser);
|
|
457
|
+
// a string the directory has: anything else is refused before a slot is mounted for it
|
|
458
|
+
const known = typeof appId === 'string' && this.knows(appId);
|
|
459
|
+
if (!held) {
|
|
460
|
+
if (!known)
|
|
461
|
+
throw new Error(OpenError.AppNotFound);
|
|
462
|
+
// a container that is not on the page right now: refused, rather than an open that waits out its timeout
|
|
463
|
+
const launched = this.launch(appId);
|
|
464
|
+
if (!launched)
|
|
465
|
+
throw new Error(OpenError.ErrorOnLaunch);
|
|
466
|
+
return launched;
|
|
467
|
+
}
|
|
468
|
+
if (!known)
|
|
469
|
+
return this.createUUID();
|
|
470
|
+
const request = held.r ?? {};
|
|
471
|
+
const contextType = typeof request.context?.type === 'string' ? request.context.type : undefined;
|
|
472
|
+
const booting = request.newInstance === true
|
|
473
|
+
? undefined
|
|
474
|
+
: (this.live(appId).find((instance) => !this.hasListener(instance.instanceId, String(request.intent), contextType))?.instanceId ??
|
|
475
|
+
this.mounting(appId));
|
|
476
|
+
const instanceId = booting ?? this.launch(appId);
|
|
477
|
+
if (!instanceId)
|
|
478
|
+
return this.createUUID();
|
|
479
|
+
held.appId = { appId, instanceId };
|
|
480
|
+
return instanceId;
|
|
481
|
+
}
|
|
482
|
+
/** Whether the directory has the app; set by the agent. */
|
|
483
|
+
knows = () => false;
|
|
484
|
+
/** The intents FINOS is holding for an app to start; set by the agent from its intent handler. */
|
|
485
|
+
heldIntents = () => new Set();
|
|
486
|
+
/**
|
|
487
|
+
* A new instance of `appId` takes over the held intents tied to an instance of that app that is
|
|
488
|
+
* gone — torn down, or its slot removed before it connected (a restore replaces slots) — so they
|
|
489
|
+
* reach the instance that replaced it rather than waiting out their timeout. `pending` says which
|
|
490
|
+
* not-yet-connected instance ids still have a slot.
|
|
491
|
+
*/
|
|
492
|
+
adopt(appId, instanceId, pending) {
|
|
493
|
+
for (const held of this.heldIntents()) {
|
|
494
|
+
const tied = held.appId?.instanceId;
|
|
495
|
+
if (held.appId?.appId !== appId || tied === undefined || tied === instanceId)
|
|
496
|
+
continue;
|
|
497
|
+
if (this.instances.get(tied)?.state === State.Connected || pending(tied))
|
|
498
|
+
continue;
|
|
499
|
+
held.appId = { appId, instanceId };
|
|
500
|
+
}
|
|
275
501
|
}
|
|
276
502
|
/**
|
|
277
503
|
* `fdc3.close()`, refused: fragments are torn down by their host, not by the agent. The agent
|
|
@@ -323,25 +549,42 @@ class BraidServerContext {
|
|
|
323
549
|
return FDC3_VERSION;
|
|
324
550
|
}
|
|
325
551
|
/**
|
|
326
|
-
* The candidates an intent may go to
|
|
552
|
+
* The candidates an intent may go to:
|
|
327
553
|
*
|
|
328
554
|
* - an instance only once it listens for the intent, for this context's type — before then,
|
|
329
555
|
* sending it the intent would lose it;
|
|
330
|
-
* - an app without an instance (the directory's entry)
|
|
331
|
-
*
|
|
556
|
+
* - an app without an instance (the directory's entry) while one is booting — connected, or
|
|
557
|
+
* mounted and not yet connected — and none listens yet: the agent then holds the intent until
|
|
558
|
+
* the listener arrives, and {@link open} hands it that instance rather than launching another;
|
|
559
|
+
* - with a container, an app the directory names for the intent that has no instance listening
|
|
560
|
+
* or booting, which choosing launches. A raise that asked for a new instance launches even
|
|
561
|
+
* when one is booting.
|
|
332
562
|
*
|
|
333
|
-
*
|
|
563
|
+
* Without a container, an app with no live instance drops out, which makes the raise a clean
|
|
564
|
+
* `NoAppsFound`.
|
|
334
565
|
*/
|
|
335
|
-
async narrowIntents(
|
|
336
|
-
|
|
566
|
+
async narrowIntents(raiser, appIntents, context) {
|
|
567
|
+
// a raise for a new instance is not held for a booting one; open() takes the note when it launches
|
|
568
|
+
const fresh = this.newInstance.some((note) => note.from === raiser.instanceId &&
|
|
569
|
+
(note.contextType ?? 'fdc3.nothing') === (context?.type ?? 'fdc3.nothing') &&
|
|
570
|
+
(note.intent === undefined || appIntents.some((appIntent) => appIntent.intent.name === note.intent)));
|
|
571
|
+
const narrowed = appIntents
|
|
337
572
|
.map((appIntent) => {
|
|
338
|
-
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
573
|
+
// a raise for a new instance is offered launches only: every app the directory names for it
|
|
574
|
+
const listening = fresh
|
|
575
|
+
? []
|
|
576
|
+
: appIntent.apps.filter((app) => app.instanceId !== undefined && this.hasListener(app.instanceId, appIntent.intent.name, context?.type));
|
|
577
|
+
const listens = (appId) => listening.some((candidate) => candidate.appId === appId);
|
|
578
|
+
const entries = appIntent.apps.filter((app) => app.instanceId === undefined && !listens(app.appId));
|
|
579
|
+
const waiting = fresh ? [] : entries.filter((app) => this.booting(app.appId));
|
|
580
|
+
// launching is for an app nothing running or booting can take the intent for
|
|
581
|
+
const launches = this.launchable ? entries.filter((app) => !waiting.includes(app)) : [];
|
|
582
|
+
// marked, so the resolver can say choosing it waits rather than launches
|
|
583
|
+
const marked = waiting.map((app) => ({ ...app, instanceMetadata: { ...app.instanceMetadata, braidStarting: true } }));
|
|
584
|
+
return { ...appIntent, apps: [...listening, ...marked, ...launches] };
|
|
343
585
|
})
|
|
344
586
|
.filter((appIntent) => appIntent.apps.length > 0);
|
|
587
|
+
return narrowed;
|
|
345
588
|
}
|
|
346
589
|
}
|
|
347
590
|
//# sourceMappingURL=agent.js.map
|
package/src/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../libs/braid-fdc3/src/agent.ts"],"names":[],"mappings":"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"}
|
|
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
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { createBraidDesktopAgent } from './agent.js';
|
|
2
|
-
export type { BraidDesktopAgent, BraidDesktopAgentOptions } from './agent.js';
|
|
2
|
+
export type { BraidDesktopAgent, BraidDesktopAgentOptions, IntentCandidate, IntentChoiceRequest, IntentResolverHook, } from './agent.js';
|
|
3
|
+
export { dialogResolver } from './resolver.js';
|
|
4
|
+
export type { DialogResolverOptions } from './resolver.js';
|
package/src/index.js
CHANGED
package/src/index.js.map
CHANGED
|
@@ -1 +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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/braid-fdc3/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAQrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IntentResolverHook } from './agent.js';
|
|
2
|
+
export interface DialogResolverOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Shows "Remember my choice", and answers with `remember: true` when it is ticked. Off by
|
|
5
|
+
* default: the agent keeps nothing, so offer it only when the hook is wrapped by something that
|
|
6
|
+
* does — the console workspace's `intentResolver`.
|
|
7
|
+
*/
|
|
8
|
+
remember?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The built-in intent resolver: a modal `<dialog>` listing the candidates. Keyboard-usable as a
|
|
12
|
+
* dialog is — Tab between choices, Enter to pick, Escape to cancel — and announced by its heading.
|
|
13
|
+
* It lives in a shadow root of its own, so the page's styles do not reach it.
|
|
14
|
+
*/
|
|
15
|
+
export declare function dialogResolver(document: Document, options?: DialogResolverOptions): IntentResolverHook;
|
package/src/resolver.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in intent resolver: a modal `<dialog>` listing the candidates. Keyboard-usable as a
|
|
3
|
+
* dialog is — Tab between choices, Enter to pick, Escape to cancel — and announced by its heading.
|
|
4
|
+
* It lives in a shadow root of its own, so the page's styles do not reach it.
|
|
5
|
+
*/
|
|
6
|
+
export function dialogResolver(document, options = {}) {
|
|
7
|
+
return ({ candidates, context }) => new Promise((resolve) => {
|
|
8
|
+
const host = document.createElement('braid-intent-resolver');
|
|
9
|
+
const root = host.attachShadow({ mode: 'open' });
|
|
10
|
+
const dialog = document.createElement('dialog');
|
|
11
|
+
dialog.setAttribute('aria-labelledby', 'title');
|
|
12
|
+
const intents = [...new Set(candidates.map((candidate) => candidate.intent))];
|
|
13
|
+
const style = document.createElement('style');
|
|
14
|
+
style.textContent = `
|
|
15
|
+
dialog { font: 14px/1.4 system-ui, sans-serif; border: 1px solid #8886; border-radius: 8px; padding: 16px; min-width: 280px; max-width: 420px; color: CanvasText; background: Canvas; }
|
|
16
|
+
dialog::backdrop { background: #0004; }
|
|
17
|
+
h2 { font-size: 15px; margin: 0 0 4px; }
|
|
18
|
+
p { margin: 0 0 12px; color: GrayText; }
|
|
19
|
+
ul { list-style: none; margin: 0 0 12px; padding: 0; display: grid; gap: 4px; }
|
|
20
|
+
button { font: inherit; width: 100%; text-align: start; padding: 8px 10px; border: 1px solid #8886; border-radius: 6px; background: transparent; color: inherit; cursor: pointer; display: flex; gap: 8px; align-items: center; }
|
|
21
|
+
button:hover { background: #8882; }
|
|
22
|
+
button:focus-visible { outline: 2px solid Highlight; outline-offset: 1px; }
|
|
23
|
+
img { width: 20px; height: 20px; }
|
|
24
|
+
.note { margin-inline-start: auto; color: GrayText; font-size: 12px; }
|
|
25
|
+
footer { display: flex; justify-content: space-between; align-items: center; gap: 12px; }
|
|
26
|
+
footer button { width: auto; margin-inline-start: auto; }
|
|
27
|
+
`;
|
|
28
|
+
const title = document.createElement('h2');
|
|
29
|
+
title.id = 'title';
|
|
30
|
+
title.textContent = intents.length === 1 ? `Open with…` : 'Choose an action';
|
|
31
|
+
const detail = document.createElement('p');
|
|
32
|
+
detail.textContent = intents.length === 1 ? `${intents[0]} · ${context?.type ?? ''}` : String(context?.type ?? '');
|
|
33
|
+
const list = document.createElement('ul');
|
|
34
|
+
candidates.forEach((candidate, index) => {
|
|
35
|
+
const item = document.createElement('li');
|
|
36
|
+
const button = document.createElement('button');
|
|
37
|
+
button.type = 'button';
|
|
38
|
+
button.dataset.index = String(index);
|
|
39
|
+
if (candidate.icon && /^https:/i.test(candidate.icon)) {
|
|
40
|
+
const icon = document.createElement('img');
|
|
41
|
+
icon.src = candidate.icon;
|
|
42
|
+
icon.alt = '';
|
|
43
|
+
button.append(icon);
|
|
44
|
+
}
|
|
45
|
+
const name = document.createElement('span');
|
|
46
|
+
name.textContent = intents.length === 1 ? candidate.title : `${candidate.title} — ${candidate.intent}`;
|
|
47
|
+
const note = document.createElement('span');
|
|
48
|
+
note.className = 'note';
|
|
49
|
+
const state = candidate.instanceId ? 'open' : candidate.starting ? 'starting' : 'new';
|
|
50
|
+
note.textContent = state;
|
|
51
|
+
button.append(name, note);
|
|
52
|
+
const spoken = { open: 'already open', starting: 'starting', new: 'opens a new one' }[state];
|
|
53
|
+
button.setAttribute('aria-label', `${name.textContent}, ${spoken}`);
|
|
54
|
+
if (index === 0)
|
|
55
|
+
button.autofocus = true;
|
|
56
|
+
item.append(button);
|
|
57
|
+
list.append(item);
|
|
58
|
+
});
|
|
59
|
+
const footer = document.createElement('footer');
|
|
60
|
+
const label = document.createElement('label');
|
|
61
|
+
const remember = document.createElement('input');
|
|
62
|
+
remember.type = 'checkbox';
|
|
63
|
+
remember.name = 'remember';
|
|
64
|
+
label.append(remember, ' Remember my choice');
|
|
65
|
+
const cancel = document.createElement('button');
|
|
66
|
+
cancel.type = 'button';
|
|
67
|
+
cancel.textContent = 'Cancel';
|
|
68
|
+
cancel.dataset.cancel = '';
|
|
69
|
+
footer.append(...(options.remember ? [label] : []), cancel);
|
|
70
|
+
dialog.append(title, detail, list, footer);
|
|
71
|
+
root.append(style, dialog);
|
|
72
|
+
let answer;
|
|
73
|
+
dialog.addEventListener('click', (event) => {
|
|
74
|
+
const button = event.target.closest?.('button');
|
|
75
|
+
if (!button)
|
|
76
|
+
return;
|
|
77
|
+
if (button.dataset.index !== undefined) {
|
|
78
|
+
answer = { candidate: candidates[Number(button.dataset.index)], ...(options.remember ? { remember: remember.checked } : {}) };
|
|
79
|
+
}
|
|
80
|
+
dialog.close();
|
|
81
|
+
});
|
|
82
|
+
// Escape, or the dialog closed any other way, is a cancel unless a choice was made
|
|
83
|
+
dialog.addEventListener('close', () => {
|
|
84
|
+
host.remove();
|
|
85
|
+
resolve(answer);
|
|
86
|
+
});
|
|
87
|
+
document.body.append(host);
|
|
88
|
+
dialog.showModal();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../../libs/braid-fdc3/src/resolver.ts"],"names":[],"mappings":"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"}
|