-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.d.ts
219 lines (201 loc) · 7.01 KB
/
index.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/**
* Copyright © 2014-2019 Tick42 OOD
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export enum OpenError {
AppNotFound = "AppNotFound",
ErrorOnLaunch = "ErrorOnLaunch",
AppTimeout = "AppTimeout",
ResolverUnavailable = "ResolverUnavailable"
}
export enum ResolveError {
NoAppsFound = "NoAppsFound",
ResolverUnavailable = "ResolverUnavailable",
ResolverTimeout = "ResolverTimeout"
}
export interface Context {
/**
* The type of the context that uniquely identifies it, e.g. "fdc3.instrument"
* Used to refer to the accepted context(s) when declaring intents.
*/
type: string;
/**
* The name of the context data (optional).
* Implementors of context may choose to make the name mandatory.
*/
name?: string;
/**
* An optional map of any equivalent identifiers for the
* context type, e.g. ISIN, CUSIP, etc. for an instrument.
*/
id?: {
[x: string]: string;
};
/**
* A context object is open for extension with any custom properties/metadata.
*/
[x: string]: any;
}
/**
* Intent descriptor
*/
export interface IntentMetadata {
name: string;
displayName: string;
}
/**
* An interface that relates an intent to apps
*/
export interface AppIntent {
intent: IntentMetadata;
apps: AppMetadata[];
}
/**
* App metadata is Desktop Agent specific - but should support a name property.
*/
export interface AppMetadata {
name: string;
}
/**
* IntentResolution provides a standard format for data returned upon resolving an intent.
* ```javascript
* //resolve a "Chain" type intent
* var intentR = await agent.raiseIntent("intentName", context);
* //resolve a "Client-Service" type intent with data response
* var intentR = await agent.raiseIntent("intentName", context);
* var dataR = intentR.data;
* ```
*/
export interface IntentResolution {
source: string;
data?: object;
version: string;
}
export interface Listener {
/**
* Unsubscribe the listener object.
*/
unsubscribe();
}
/**
* A Desktop Agent is a desktop component (or aggregate of components) that serves as a
* launcher and message router (broker) for applications in its domain.
*
* A Desktop Agent can be connected to one or more App Directories and will use directories for application
* identity and discovery. Typically, a Desktop Agent will contain the proprietary logic of
* a given platform, handling functionality like explicit application interop workflows where
* security, consistency, and implementation requirements are proprietary.
*/
export interface DesktopAgent {
/**
* Launches/links to an app by name.
*
* If a Context object is passed in, this object will be provided to the opened application via a contextListener.
* The Context argument is functionally equivalent to opening the target app with no context and broadcasting the context directly to it.
*
* If opening errors, it returns an `Error` with a string from the `OpenError` enumeration.
*
* ```javascript
* //no context
* agent.open('myApp');
* //with context
* agent.open('myApp', context);
* ```
*/
open(name: string, context?: Context): Promise<void>;
/**
* Find out more information about a particular intent by passing its name, and optionally its context.
*
* findIntent is effectively granting programmatic access to the Desktop Agent's resolver.
* A promise resolving to the intent, its metadata and metadata about the apps that registered it is returned.
* This can be used to raise the intent against a specific app.
*
* If the resolution fails, the promise will return an `Error` with a string from the `ResolveError` enumeration.
*
* ```javascript
* // I know 'StartChat' exists as a concept, and want to know more about it ...
* const appIntent = await agent.findIntent("StartChat");
*
* // returns a single AppIntent:
* // {
* // intent: { name: "StartChat", displayName: "Chat" },
* // apps: [{ name: "Skype" }, { name: "Symphony" }, { name: "Slack" }]
* // }
*
* // raise the intent against a particular app
* await agent.raiseIntent(appIntent.intent.name, context, appIntent.apps[0].name);
* ```
*/
findIntent(intent: string, context?: Context): Promise<AppIntent>;
/**
* Find all the avalable intents for a particular context.
*
* findIntents is effectively granting programmatic access to the Desktop Agent's resolver.
* A promise resolving to all the intents, their metadata and metadata about the apps that registered it is returned,
* based on the context types the intents have registered.
*
* If the resolution fails, the promise will return an `Error` with a string from the `ResolveError` enumeration.
*
* ```javascript
* // I have a context object, and I want to know what I can do with it, hence, I look for for intents...
* const appIntents = await agent.findIntentsForContext(context);
*
* // returns for example:
* // [{
* // intent: { name: "StartCall", displayName: "Call" },
* // apps: [{ name: "Skype" }]
* // },
* // {
* // intent: { name: "StartChat", displayName: "Chat" },
* // apps: [{ name: "Skype" }, { name: "Symphony" }, { name: "Slack" }]
* // }];
*
* // select a particular intent to raise
* const startChat = appIntents[1];
*
* // target a particular app
* const selectedApp = startChat.apps[0];
*
* // raise the intent, passing the given context, targeting the app
* await agent.raiseIntent(startChat.intent.name, context, selectedApp.name);
* ```
*/
findIntentsByContext(context: Context): Promise<AppIntent[]>;
/**
* Publishes context to other apps on the desktop.
* ```javascript
* agent.broadcast(context);
* ```
*/
broadcast(context: Context): void;
/**
* Raises an intent to the desktop agent to resolve.
* ```javascript
* //raise an intent to start a chat with a given contact
* const intentR = await agent.findIntents("StartChat", context);
* //use the IntentResolution object to target the same chat app with a new context
* agent.raiseIntent("StartChat", newContext, intentR.source);
* ```
*/
raiseIntent(intent: string, context: Context, target?: string): Promise<IntentResolution>;
/**
* Adds a listener for incoming Intents from the Agent.
*/
addIntentListener(intent: string, handler: (context: Context) => void): Listener;
/**
* Adds a listener for incoming context broadcast from the Desktop Agent.
*/
addContextListener(handler: (context: Context) => void): Listener;
}