@interopio/browser-platform
Version:
IoConnect Browser main application package
670 lines (572 loc) • 21 kB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
import { IOConnectCore } from "@interopio/core";
import { IOConnectBrowser } from "@interopio/browser";
import { IOConnectDesktop } from "@interopio/desktop";
import type { AuthOptions as ManagerAuthOptions } from "@interopio/manager-api";
export namespace IOConnectBrowserPlatform {
export type LibDomains = "system" | "windows" | "appManager" | "layouts" | "workspaces" | "intents" | "channels" | "notifications" | "extension" | "search" | "themes" | "manager" | "prefs" | "ui";
export interface RemoteStore {
/**
* The url of the remote source of application definitions. The remote source needs to follow the [FDC3 AppDirectory standard](https://github.com/finos/FDC3). The applications provided by the remote need to either be IOConnectApplicationConfig or FDC3ApplicationConfig.
*/
url: string;
/**
* The polling interval for fetching from the remote source in milliseconds. If no pollingInterval is provided, the platform will fetch the definitions just once during startup.
* This also affects the cache refresh interval, if cache is enabled. Minimum accepted value is 5000.
* @default 0
*/
pollingInterval?: number;
/**
* The request timeout for fetching application definitions from the remote source in milliseconds.
* @default 30000
*/
requestTimeout?: number;
/**
* Name-value pairs of headers, which will be appended to every request to the provided url.
*/
customHeaders?: {
[key: string]: string;
};
/**
* A function which is expected to return a RequestInit object, which will be merged with the default one and appended to every request to the provided url.
*/
getRequestInit?: () => RequestInit;
/**
* If `true`, the platform will wait for the initial response before proceeding with the platform bootstrap.
* @default true
*/
waitInitialResponse?: boolean;
/**
* If cache is enabled the platform will cache the fetched definitions and respond with cache entries to the API calls.
*/
cache?: RemoteStoreCacheConfig;
}
export interface RemoteStoreCacheConfig {
/**
* If `true`, the platform will cache the fetched definitions in the browser's indexDB.
* @default false
*/
enabled?: boolean;
}
export namespace Applications {
export interface Config {
local?: Array<IOConnectBrowser.AppManager.Definition | IOConnectBrowser.AppManager.FDC3DefinitionV1 | IOConnectBrowser.AppManager.FDC3DefinitionV2>;
remote?: RemoteStore;
}
}
export namespace Layouts {
export interface Config {
mode?: "idb" | "session" | "rest" | "manager";
local?: IOConnectBrowser.Layouts.Layout[];
rest?: RemoteStore;
}
}
export namespace Channels {
/**
* Provide display hints for FDC3 User Channels intended to be visualized and selectable by end users.
*/
export interface FDC3ChannelDisplayMetadata {
/**
* A user-readable name for this channel, e.g: `"Red"`. */
name?: string;
/**
* The color that should be associated within this channel when displaying
* this channel in a UI, e.g: `#FF0000`. May be any color value supported by
* CSS, e.g. name, hex, rgba, etc.. */
color?: string;
/**
* A URL of an image that can be used to display this channel. */
glyph?: string;
}
export interface FDC3ChannelMeta {
id: string;
displayMetadata?: FDC3ChannelDisplayMetadata;
}
export interface ChannelMeta {
color: string;
/**
* Provide to enable FDC3 channel support.
*/
fdc3?: FDC3ChannelMeta;
[key: string]: any;
}
export interface ChannelDefinition {
name: string;
meta: ChannelMeta;
data?: any;
}
export interface Config {
definitions: ChannelDefinition[];
/**
* @default single
*/
mode?: IOConnectBrowser.Channels.Mode;
}
}
export namespace Prefs {
export interface Store {
type?: "local" | "manager" | "rest",
rest?: RemoteStore;
}
export interface Config {
store?: Store;
validNonExistentApps?: string[];
}
}
/**
* Configuration for publishing OpenTelemetry data and settings for the published data items.
*/
export namespace Otel {
/**
* Configuration for publishing OpenTelemetry data.
*/
export interface Config {
/**
* Additional attributes to add to the observability resource definition.
*/
additionalResourceAttributes?: Record<string, unknown>;
/**
* A function that returns additional attributes to add to observability entities (metrics, spans, log entries) by default.
*/
getAdditionalAttributes?: () => Record<string, unknown>;
/**
* Additional headers to send in HTTP requests.
*/
headers?: Record<string, string>;
/**
* Settings for publishing OpenTelemetry metrics.
*/
metrics?: MetricsDefinition;
}
/**
* Settings for publishing OpenTelemetry metrics.
*/
export interface MetricsDefinition {
/**
* URL pointing to an OpenTelemetry metrics server.
*/
url: string;
/**
* Interval in milliseconds at which to publish the generated metrics.
* @default 30000
*/
publishInterval?: number;
/**
* Definitions of the OpenTelemetry metrics to publish.
*/
metrics?: MetricDefinition[];
/**
* Additional attributes to add to the observability resource definition.
*/
additionalResourceAttributes?: Record<string, unknown>;
/**
* A function that returns additional attributes to add to observability entities (metrics, spans, log entries) by default.
*/
getAdditionalAttributes?: () => Record<string, unknown>;
/**
* Additional headers to send in HTTP requests.
*/
headers?: Record<string, string>;
}
/**
* Definition of an OpenTelemetry metric.
*/
export interface MetricDefinition {
/**
* If `true`, will enable publishing of the OpenTelemetry metric.
*/
enabled?: boolean;
/**
* Name for the OpenTelemetry metric. May be used in visualization tools.
*/
name?: string;
/**
* Description for the OpenTelemetry metric.
*/
description?: string;
/**
* Specify explicit bucket boundaries for the OpenTelemetry SDK if the metric has been created by a `HistogramAggregator`.
*/
buckets?: number[];
/**
* Type of the predefined OpenTelemetry metric.
*/
type:
"app_started" |
"app_stopped" |
"app_startup" |
"app_count" |
"app_duration" |
"app_error" |
"layout_startup" |
"workspace_startup" |
"workspace_stopped" |
"workspace_count" |
"platform_startup" |
"platform_error"
}
}
export namespace ServiceWorker {
export interface Config {
url?: string;
registrationPromise?: Promise<ServiceWorkerRegistration>;
}
}
export namespace Plugins {
export interface InterceptorRegistrationRequest {
callInterceptor: (config: ControlMessage) => Promise<any>;
interceptions: Array<{ domain: LibDomains, operation: string }>;
}
export interface BaseControlMessage {
domain: LibDomains;
operation: string;
data: any;
settings?: ControlSettings;
}
export interface ControlSettings {
skipInterception?: boolean;
}
export interface PluginInterception {
register: (request: InterceptorRegistrationRequest) => Promise<void>
}
export interface PlatformControls {
control: (args: BaseControlMessage) => Promise<any>;
interception: PluginInterception;
platformApi: API;
logger?: IOConnectBrowser.Logger.API;
system: {
sendControl: (args: BaseControlMessage) => Promise<any>;
}
}
export interface PluginDefinition {
name: string;
start: (io: IOConnectBrowser.API, config: any, platform: PlatformControls) => Promise<void> | void;
version?: string;
config?: any;
critical?: boolean;
stop?: () => void;
}
export interface Config {
definitions: PluginDefinition[];
}
}
export namespace Gateway {
export type LogLevel = "trace" | "debug" | "info" | "warn" | "error";
export type LogAppender = (logInfo: LogInfo) => void;
export interface LogInfo {
time: Date;
output: string;
level: string;
line: number;
message: string;
namespace: string;
stacktrace: string;
}
export interface Config {
logging?: {
level?: LogLevel;
appender?: LogAppender;
};
clients?: {
buffer_size?: number
}
bridge?: {
url: string
}
}
}
export namespace Connection {
export interface PreferredConnectionSettings {
url: string;
auth?: IOConnectCore.Auth;
forceIncompleteSwitch?: boolean;
discoveryIntervalMS?: number;
}
export interface Config {
alwaysPlatform?: boolean;
preferred?: PreferredConnectionSettings;
enableManualSwitching?: boolean;
allowedClientFallbackOrigin?: string;
blockList?: string[];
}
}
export namespace Workspaces {
export interface MaximumActiveWorkspacesRule {
threshold: number;
}
export interface IdleWorkspacesRule {
idleMSThreshold: number;
}
export interface HibernationConfig {
maximumActiveWorkspaces?: MaximumActiveWorkspacesRule;
idleWorkspaces?: IdleWorkspacesRule;
}
export interface LoadingConfig {
/**
* Default restore strategy when opening Workspaces.
*/
defaultStrategy?: "direct" | "delayed" | "lazy";
delayed?: {
/**
* Valid only in `delayed` mode. Initial period after which to start loading applications in batches. Defaults to 1000.
*/
initialOffsetInterval?: number;
/**
* Valid only in `delayed` mode. Interval in minutes at which to load the application batches. Defaults to 5000.
*/
interval?: number;
/**
* Valid only in `delayed` mode. Number of applications in a batch to be loaded at each interval. Defaults to 1.
*/
batch?: number;
};
/**
* Visual indicator `Zzz` on tabs of apps which are not loaded yet. Useful for developing and testing purposes.
*/
showDelayedIndicator?: boolean;
}
export interface IFrameSandboxConfig {
flags: string;
}
export interface IFramePermissionsPolicyConfig {
flags: string;
}
export interface Config {
src: string;
hibernation?: HibernationConfig;
loadingStrategy?: LoadingConfig;
isFrame?: boolean;
initAsEmpty?: boolean;
frameCache?: boolean;
iframeSandbox?: IFrameSandboxConfig;
iframePermissionsPolicy?: IFramePermissionsPolicyConfig;
}
}
export namespace Windows {
export interface Config {
windowResponseTimeoutMs?: number;
defaultWindowOpenBounds?: IOConnectBrowser.Windows.Bounds;
}
}
export namespace Notifications {
export interface Config extends IOConnectBrowser.Notifications.Configuration {
clearNotificationOnClick?: boolean;
}
}
export namespace Manager {
/**
* Settings for the requests sent to **io.Manager**.
*/
export interface RequestsConfig {
/**
* Interval in milliseconds to wait for a response from **io.Manager**.
* @default 10000
*/
timeout?: number;
/**
* Interval in milliseconds to wait for a response to the `openSession` request to **io.Manager** before proceeding from cache.
* @default 10000
*/
openSessionTimeout?: number;
/**
* Interval in milliseconds to wait for a response to the `closeSession` request to **io.Manager**.
* @default 10000
*/
closeSessionTimeout?: number;
}
/**
* Settings for persisting data received from **io.Manager**.
*/
export interface CacheConfig {
/**
* If `true`, will enable caching and persisting data from **io.Manager** locally (e.g., in case of connection interruptions).
* @default true
*/
enabled?: boolean;
/**
* If `true`, on opening a new session to **io.Manager**, all cache databases from previous sessions will be deleted.
* @default false
*/
clearOld?: boolean;
}
/**
* Settings for configuring what stores to be pulled from **io.Manager**.
*/
export interface ManagerFeatures {
/**
* If `true`, the library will pull the latest application definitions from **io.Manager**.
* @default true
*/
applicationsStore?: boolean;
/**
* If `true`, the library will pull the latest layouts definitions from **io.Manager**.
* @default true
*/
layoutsStore?: boolean;
/**
* If `true`, the library will pull the latest applications preferences from **io.Manager**.
* @default true
*/
preferencesStore?: boolean;
}
export interface Config {
/**
* URL pointing to **io.Manager**.
*/
url: string;
/**
* User authentication configuration.
*/
auth: ManagerAuthOptions;
/**
* Deprecated. If `true`, the library will wait for this module to be fully operational before completing its initialization.
* @default false
* @deprecated
*/
critical?: boolean;
/**
* Object containing key/value pairs of headers to be sent with every request.
*/
headers?: {
[key: string]: string;
};
/**
* Callback that will be invoked on every request. Use this callback to provide extra headers that will be applied to the request.
*/
getHeaders?: (req: any) => Promise<Record<string, string>>;
/**
* Settings for the requests sent to **io.Manager**.
*/
requests?: RequestsConfig;
/**
* Settings for persisting data received from **io.Manager**.
*/
cache?: CacheConfig;
/**
* Interval in milliseconds at which the server will be polled for new data (apps, Layouts).
* @default 60000
*/
fetchIntervalMS?: number;
/**
* Interval in milliseconds at which **io.Connect Browser** will try to refresh the **io.Manager** token.
* @default 3600000
*/
tokenRefreshIntervalMS?: number;
/**
* Settings for configuring what stores to be pulled from **io.Manager**.
*/
features?: ManagerFeatures
/**
* Deprecated. Use `requests.timeout` instead. Interval in milliseconds to wait for a response from **io.Manager**.
* @default 10000
* @deprecated
*/
responseTimeoutMS?: number;
}
}
export namespace Themes {
export interface Config {
defaultTheme?: "os" | "light" | "dark"
}
}
export namespace User {
export interface Config {
id: string;
username?: string;
firstName?: string;
lastName?: string;
email?: string;
type?: string;
role?: string;
meta?: any;
}
}
export interface ControlMessage extends Plugins.BaseControlMessage {
callerType: "plugin" | "client";
callerId: string;
commandId: string;
}
export namespace Widget {
export type DefaultConfig = Omit<IOConnectBrowser.WidgetConfig, "enable">;
export interface Config {
sources: Sources;
defaultConfig?: DefaultConfig;
blockList?: string[];
}
export interface Sources {
bundle: string;
styles: string[];
fonts?: string[];
}
}
export namespace Modals {
export interface Config {
sources: Sources;
blockList?: string[];
}
export interface Sources {
bundle: string;
styles: string[];
fonts?: string[];
}
}
export namespace IntentResolver {
export interface Config {
sources: Sources;
blockList?: string[];
}
export interface Sources {
bundle: string;
styles: string[];
fonts?: string[];
}
}
export interface Config {
licenseKey: string;
clientOnly?: boolean;
windows?: Windows.Config;
notifications?: Notifications.Config;
applications?: Applications.Config;
layouts?: Layouts.Config;
channels?: Channels.Config;
plugins?: Plugins.Config;
serviceWorker?: ServiceWorker.Config;
gateway?: Gateway.Config;
connection?: Connection.Config;
browser?: IOConnectBrowser.Config;
workspaces?: Workspaces.Config;
manager?: Manager.Config;
themes?: Themes.Config;
user?: User.Config;
environment?: any;
applicationPreferences?: Prefs.Config;
otel?: Otel.Config;
widget?: Widget.Config;
modals?: Modals.Config;
intentResolver?: IntentResolver.Config;
browserFactory?: (config?: IOConnectBrowser.Config) => Promise<IOConnectBrowser.API>;
}
export interface API {
version: string;
corePlus?: { version: string };
system: {
shutdown(): Promise<void>
}
}
export interface SystemInfo {
web: {
version: string;
};
platform: {
version: string;
plugins: Array<{ name: string, version: string }>;
};
workspaces?: {
version: string;
frameUrl?: string;
};
}
}
export type IOConnectBrowserPlatformFactoryFunction = (config: IOConnectBrowserPlatform.Config) => Promise<{ io: IOConnectBrowser.API | IOConnectDesktop.API; platform?: IOConnectBrowserPlatform.API }>;
declare const IOConnectBrowserPlatformFactory: IOConnectBrowserPlatformFactoryFunction;
export default IOConnectBrowserPlatformFactory;