From 96de471094d387cfe741e6e63622a968148dc984 Mon Sep 17 00:00:00 2001 From: Wroud Date: Mon, 27 Apr 2020 14:35:54 +0300 Subject: [PATCH] refactor(core): split Session servicerefactor(core): specify gql schema types --- .../schema/schema.graphqls | 14 +-- webapp/packages/core/src/AppBootstrap.ts | 10 +- .../core/src/app/TopNavBar/TopNavBar.tsx | 6 +- .../ConnectionsManagerService.ts | 33 +++---- .../queries/connectionState.gql | 8 ++ .../SessionExpire/SessionExpireService.ts | 49 ++++++++++ .../SessionExpire}/SessionExpiredDialog.tsx | 4 +- webapp/packages/core/src/dialogs/index.ts | 2 + .../src/localization/LocalizationService.ts | 19 +++- webapp/packages/core/src/manifest.ts | 6 +- .../packages/core/src/root/ServerService.ts | 28 ++++++ .../packages/core/src/root/SessionService.ts | 89 ++--------------- webapp/packages/core/src/root/index.ts | 1 + .../core/src/root/queries/openSession.gql | 8 +- .../core/src/root/queries/serverConfig.gql | 8 ++ .../core/src/root/queries/sessionState.gql | 8 +- webapp/packages/core/src/sdk/sdk.ts | 95 +++++++++++++++---- 17 files changed, 250 insertions(+), 138 deletions(-) create mode 100644 webapp/packages/core/src/app/shared/ConnectionsManager/queries/connectionState.gql create mode 100644 webapp/packages/core/src/dialogs/SessionExpire/SessionExpireService.ts rename webapp/packages/core/src/{root => dialogs/SessionExpire}/SessionExpiredDialog.tsx (91%) create mode 100644 webapp/packages/core/src/root/ServerService.ts diff --git a/server/bundles/io.cloudbeaver.server/schema/schema.graphqls b/server/bundles/io.cloudbeaver.server/schema/schema.graphqls index e75d8f8826..7821bb81f2 100644 --- a/server/bundles/io.cloudbeaver.server/schema/schema.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/schema.graphqls @@ -55,14 +55,14 @@ type WebServiceConfig { } type ServerConfig { - name: String - version: String + name: String! + version: String! supportsPredefinedConnections: Boolean supportsProvidedConnections: Boolean supportsCustomConnections: Boolean supportsConnectionBrowser: Boolean supportsWorkspaces: Boolean - supportedLanguages: [ ServerLanguage ] + supportedLanguages: [ ServerLanguage ]! services: [ WebServiceConfig ] productConfiguration: Object! } @@ -70,12 +70,12 @@ type ServerConfig { type SessionInfo { id: ID! - createTime: String - lastAccessTime: String - locale: String + createTime: String! + lastAccessTime: String! + locale: String! serverMessages: [ ServerMessage ] - connections: [ ConnectionInfo ] + connections: [ ConnectionInfo ]! } #################################################### diff --git a/webapp/packages/core/src/AppBootstrap.ts b/webapp/packages/core/src/AppBootstrap.ts index aa41c02045..a138b389e6 100644 --- a/webapp/packages/core/src/AppBootstrap.ts +++ b/webapp/packages/core/src/AppBootstrap.ts @@ -14,9 +14,11 @@ import { } from '@dbeaver/core/app'; import { injectable } from '@dbeaver/core/di'; import { ExceptionsCatcherService } from '@dbeaver/core/eventsLog'; -import { SessionService } from '@dbeaver/core/root'; import { ThemeService } from '@dbeaver/core/theming'; +import { SessionExpireService } from './dialogs'; +import { LocalizationService } from './localization'; + /** * AppBootstrap.init() will be executed between first and second phase of App initialization, * when application has registered all dependencies but plugins did'nt initialized. @@ -27,11 +29,12 @@ import { ThemeService } from '@dbeaver/core/theming'; export class AppBootstrap { constructor(private exceptionsCatcherService: ExceptionsCatcherService, - private sessionService: SessionService, + private localizationService: LocalizationService, private themeService: ThemeService, private connectionDialogService: ConnectionDialogsService, private connectionsManager: ConnectionsManagerService, private logViewerMenuService: LogViewerMenuService, + private sessionExpireService: SessionExpireService, private navigationTreeContextMenuService: NavigationTreeContextMenuService, private nodesManagerService: NodesManagerService, private navigationTabsService: NavigationTabsService, @@ -40,8 +43,9 @@ export class AppBootstrap { async init() { this.exceptionsCatcherService.subscribe(); + this.sessionExpireService.subscribe(); - await this.sessionService.init(); + await this.localizationService.init(); await this.themeService.init(); this.connectionSchemaManagerService.registerCallbacks(); diff --git a/webapp/packages/core/src/app/TopNavBar/TopNavBar.tsx b/webapp/packages/core/src/app/TopNavBar/TopNavBar.tsx index d555c2ed50..7a31466a7d 100644 --- a/webapp/packages/core/src/app/TopNavBar/TopNavBar.tsx +++ b/webapp/packages/core/src/app/TopNavBar/TopNavBar.tsx @@ -11,7 +11,7 @@ import styled from 'reshadow'; import { Icon } from '@dbeaver/core/blocks'; import { useService } from '@dbeaver/core/di'; -import { SessionService } from '@dbeaver/core/root'; +import { ServerService } from '@dbeaver/core/root'; import { useStyles } from '@dbeaver/core/theming'; import { ConnectionSelector } from './ConnectionSchemaManager/ConnectionSelector/ConnectionSelector'; @@ -23,8 +23,8 @@ import { topNavBarStyles } from './topNavBarStyles'; declare const version: string; // declared in webpack DefinePlugin // todo move to enviroment? export const TopNavBar = observer(function TopNavBar() { - const sessionService = useService(SessionService); - const title = `Frontend: ${version}\nBackend: ${sessionService.version}`; + const serverService = useService(ServerService); + const title = `Frontend: ${version}\nBackend: ${serverService.config.data?.version}`; return styled(useStyles(topNavBarStyles))(
diff --git a/webapp/packages/core/src/app/shared/ConnectionsManager/ConnectionsManagerService.ts b/webapp/packages/core/src/app/shared/ConnectionsManager/ConnectionsManagerService.ts index c68afdcb8e..1eaa86765a 100644 --- a/webapp/packages/core/src/app/shared/ConnectionsManager/ConnectionsManagerService.ts +++ b/webapp/packages/core/src/app/shared/ConnectionsManager/ConnectionsManagerService.ts @@ -10,13 +10,12 @@ import { computed, observable } from 'mobx'; import { Subject } from 'rxjs'; import { injectable } from '@dbeaver/core/di'; -import { ConnectionShortInfo, SessionService } from '@dbeaver/core/root'; +import { SessionService } from '@dbeaver/core/root'; import { ConnectionInfo, DataSourceInfo, DriverInfo, GraphQLService, - NavGetStructContainersQuery, CachedResource, DatabaseObjectInfo, } from '@dbeaver/core/sdk'; @@ -118,9 +117,16 @@ export class ConnectionsManagerService { } async restoreConnections() { - for (const connection of this.sessionService.getConnections()) { - this.restoreConnection(connection); + const config = await this.sessionService.session.load(); + if (!config) { + return; } + + // TODO: connections must be string[] + for (const connection of config.connections) { + await this.restoreConnection(connection); + } + await this.nodesManagerService.updateRootChildren(); } private async refreshObjectContainersAsync( @@ -130,7 +136,10 @@ export class ConnectionsManagerService { catalogId?: string, ): Promise> { if (refresh || !data.has(connectionId)) { - const { navGetStructContainers } = await this.loadSchemasAndCatalogs(connectionId, catalogId); + const { navGetStructContainers } = await this.graphQLService.gql.navGetStructContainers({ + connectionId, + catalogId, + }); data.set(connectionId, [...navGetStructContainers.schemaList, ...navGetStructContainers.catalogList]); } @@ -149,18 +158,10 @@ export class ConnectionsManagerService { return data; } - /** - * Note that this request returns either schemaList or catalogList. You never got both lists together - */ - private async loadSchemasAndCatalogs(connectionId: string, catalogId?: string): Promise { - return this.graphQLService.gql.navGetStructContainers({ connectionId, catalogId }); - } + private async restoreConnection(connection: Connection) { + // TODO: Must be loaded based on connection id + // const { connection } = await this.graphQLService.gql.connectionState({ id }); - private restoreConnection(connectionInfo: ConnectionShortInfo) { - const connection: Connection = { - ...connectionInfo, - connected: true, - }; this.connectionsMap.set(connection.id, connection); this.onOpenConnection.next(connection); } diff --git a/webapp/packages/core/src/app/shared/ConnectionsManager/queries/connectionState.gql b/webapp/packages/core/src/app/shared/ConnectionsManager/queries/connectionState.gql new file mode 100644 index 0000000000..6c9eb8d3a3 --- /dev/null +++ b/webapp/packages/core/src/app/shared/ConnectionsManager/queries/connectionState.gql @@ -0,0 +1,8 @@ +query connectionState($id: ID!) { + connection: connectionState(id: $id) { + id + name + driverId + connected + } +} diff --git a/webapp/packages/core/src/dialogs/SessionExpire/SessionExpireService.ts b/webapp/packages/core/src/dialogs/SessionExpire/SessionExpireService.ts new file mode 100644 index 0000000000..ea6354fe5f --- /dev/null +++ b/webapp/packages/core/src/dialogs/SessionExpire/SessionExpireService.ts @@ -0,0 +1,49 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { Subject } from 'rxjs'; + +import { injectable } from '@dbeaver/core/di'; +import { + GQLError, GraphQLService, +} from '@dbeaver/core/sdk'; + +import { EServerErrorCode } from '../../sdk/EServerErrorCode'; +import { CommonDialogService } from '../CommonDialog/CommonDialogService'; +import { SessionExpiredDialog } from './SessionExpiredDialog'; + +@injectable() +export class SessionExpireService { + private isNotifiedAboutExpiredSession = false; + + onSessionExpire = new Subject(); + constructor( + private graphQLService: GraphQLService, + private commonDialogService: CommonDialogService + ) { + } + + subscribe() { + this.graphQLService.registerInterceptor(this.sessionExpiredInterceptor.bind(this)); + } + + private async sessionExpiredInterceptor(request: Promise): Promise { + try { + return await request; + } catch (exception) { + if (exception instanceof GQLError + && exception.errorCode === EServerErrorCode.sessionExpired + && !this.isNotifiedAboutExpiredSession) { + this.isNotifiedAboutExpiredSession = true; + this.onSessionExpire.next(); + await this.commonDialogService.open(SessionExpiredDialog, null); + } + throw exception; + } + } +} diff --git a/webapp/packages/core/src/root/SessionExpiredDialog.tsx b/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx similarity index 91% rename from webapp/packages/core/src/root/SessionExpiredDialog.tsx rename to webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx index da81c33bc7..60a54e4643 100644 --- a/webapp/packages/core/src/root/SessionExpiredDialog.tsx +++ b/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx @@ -11,10 +11,12 @@ import { useCallback } from 'react'; import styled, { css } from 'reshadow'; import { Button } from '@dbeaver/core/blocks'; -import { CommonDialogWrapper, DialogComponent } from '@dbeaver/core/dialogs'; import { useTranslate } from '@dbeaver/core/localization'; import { useStyles } from '@dbeaver/core/theming'; +import { DialogComponent } from '../CommonDialog/CommonDialogService'; +import { CommonDialogWrapper } from '../CommonDialog/CommonDialogWrapper'; + const styles = css` dialog-content { display: flex; diff --git a/webapp/packages/core/src/dialogs/index.ts b/webapp/packages/core/src/dialogs/index.ts index a25db353a6..01d5b7d111 100644 --- a/webapp/packages/core/src/dialogs/index.ts +++ b/webapp/packages/core/src/dialogs/index.ts @@ -13,3 +13,5 @@ export * from './Menu/models/ComputedMenuPanelModel'; export * from './Menu/ContextMenu/ContextMenuService'; export * from './Menu/ContextMenu/IContextMenuItem'; export * from './Menu/ContextMenu/IMenuContext'; + +export * from './SessionExpire/SessionExpireService'; diff --git a/webapp/packages/core/src/localization/LocalizationService.ts b/webapp/packages/core/src/localization/LocalizationService.ts index e55fa1b7ae..deeac786f9 100644 --- a/webapp/packages/core/src/localization/LocalizationService.ts +++ b/webapp/packages/core/src/localization/LocalizationService.ts @@ -14,6 +14,7 @@ import { NotificationService } from '@dbeaver/core/eventsLog'; import { GraphQLService, ServerLanguage } from '@dbeaver/core/sdk'; import { SettingsService } from '@dbeaver/core/settings'; +import { SessionService, ServerService } from '../root'; import { Locale } from './Locale'; import { TLocalizationToken } from './TLocalizationToken'; @@ -37,6 +38,8 @@ export class LocalizationService { private localeMap: Map = new Map(); constructor(private notificationService: NotificationService, + private sessionService: SessionService, + private serverService: ServerService, private graphQLService: GraphQLService, private settingsService: SettingsService) { @@ -78,13 +81,19 @@ export class LocalizationService { return locale && locale[token]; } - async init(sessionLanguage: string | undefined, supportedLanguages: ServerLanguageShort[]) { - this.supportedLanguages = supportedLanguages; + async init() { + const session = await this.sessionService.session.load(); + const config = await this.serverService.config.load(); + + if (!session || !config) { + return; + } + + this.supportedLanguages = config.supportedLanguages; this.settingsService.registerSettings(this.settings, LANG_SETTINGS_KEY); // overwrite default value with settings - if (sessionLanguage) { - this.setCurrentLocale(sessionLanguage); // session language wins - } + this.setCurrentLocale(session.locale); // session language wins + await this.setLocale(this.getCurrentLanguage()); } diff --git a/webapp/packages/core/src/manifest.ts b/webapp/packages/core/src/manifest.ts index 8a42d71911..84cd5df71a 100644 --- a/webapp/packages/core/src/manifest.ts +++ b/webapp/packages/core/src/manifest.ts @@ -14,10 +14,10 @@ import { SettingsMenuService, LogViewerService, LogViewerMenuService, } from '@dbeaver/core/app'; import { PluginManifest } from '@dbeaver/core/di'; -import { CommonDialogService, ContextMenuService } from '@dbeaver/core/dialogs'; +import { CommonDialogService, ContextMenuService, SessionExpireService } from '@dbeaver/core/dialogs'; import { NotificationService, ExceptionsCatcherService } from '@dbeaver/core/eventsLog'; import { LocalizationService } from '@dbeaver/core/localization'; -import { SessionService } from '@dbeaver/core/root'; +import { SessionService, ServerService } from '@dbeaver/core/root'; import { EnvironmentService, GraphQLService } from '@dbeaver/core/sdk'; import { LocalStorageSaveService, SettingsService } from '@dbeaver/core/settings'; import { ThemeService } from '@dbeaver/core/theming'; @@ -30,6 +30,7 @@ export const coreManifest: PluginManifest = { providers: [ CommonDialogService, + SessionExpireService, ConnectionDialogsService, ConnectionSchemaManagerService, ConnectionsManagerService, @@ -52,6 +53,7 @@ export const coreManifest: PluginManifest = { SettingsMenuService, SettingsService, ThemeService, + ServerService, ], async initialize(services) { diff --git a/webapp/packages/core/src/root/ServerService.ts b/webapp/packages/core/src/root/ServerService.ts new file mode 100644 index 0000000000..0578b65dc9 --- /dev/null +++ b/webapp/packages/core/src/root/ServerService.ts @@ -0,0 +1,28 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { injectable } from '@dbeaver/core/di'; +import { GraphQLService, ServerConfig, CachedResource } from '@dbeaver/core/sdk'; + +@injectable() +export class ServerService { + config = new CachedResource(undefined, this.refreshConfigAsync.bind(this)); + + constructor(private graphQLService: GraphQLService) { + } + + private async refreshConfigAsync(data: ServerConfig | undefined): Promise { + if (data) { + return data; + } + + const { serverConfig } = await this.graphQLService.gql.serverConfig(); + + return serverConfig; + } +} diff --git a/webapp/packages/core/src/root/SessionService.ts b/webapp/packages/core/src/root/SessionService.ts index 4c66a3e6aa..c7424a6c67 100644 --- a/webapp/packages/core/src/root/SessionService.ts +++ b/webapp/packages/core/src/root/SessionService.ts @@ -6,98 +6,29 @@ * you may not use this file except in compliance with the License. */ -import { computed } from 'mobx'; - import { injectable } from '@dbeaver/core/di'; -import { CommonDialogService } from '@dbeaver/core/dialogs'; -import { LocalizationService } from '@dbeaver/core/localization'; import { - ConnectionInfo, GQLError, GraphQLService, ServerLanguage, SessionInfo, + ConnectionInfo, GraphQLService, SessionInfo, CachedResource, } from '@dbeaver/core/sdk'; -import { EServerErrorCode } from '../sdk/EServerErrorCode'; -import { SessionExpiredDialog } from './SessionExpiredDialog'; -export type ConnectionShortInfo = Pick; -export type SessionShortInfo = Pick; - -export type Session = { - name: string; - version: string; - language: string; - supportedLanguages: Pick[]; - connections: ConnectionShortInfo[]; -} - -export type Server = { - name: string; - version: string; - supportedLanguages: ConnectionShortInfo[]; -} +export type SessionState = Pick & { + connections: Array>; +}; @injectable() export class SessionService { - private session: Session = { - name: '', - version: '', - language: 'en', - supportedLanguages: [], - connections: [], - }; + session = new CachedResource(undefined, this.refreshSessionStateAsync.bind(this)); - @computed get version() { - return this.session.version; - } + constructor(private graphQLService: GraphQLService) {} - private isNotifiedAboutExpiredSession = false; - - constructor(private graphQLService: GraphQLService, - private localizationService: LocalizationService, - private commonDialogService: CommonDialogService) { - this.graphQLService.registerInterceptor(this.sessionExpiredInterceptor.bind(this)); - } - - getConnections(): ConnectionShortInfo[] { - return this.session.connections; - } - - async init(): Promise { - this.session = await this.fetchCurrentSession(); - - this.localizationService.init(this.session.language, this.session.supportedLanguages); - - } - - private async sessionExpiredInterceptor(request: Promise): Promise { - try { - return await request; - } catch (exception) { - if (exception instanceof GQLError - && exception.errorCode === EServerErrorCode.sessionExpired - && !this.isNotifiedAboutExpiredSession) { - this.isNotifiedAboutExpiredSession = true; - await this.commonDialogService.open(SessionExpiredDialog, null); - } - throw exception; + private async refreshSessionStateAsync(data: SessionState | undefined): Promise { + if (data) { + return data; } - } - private async fetchCurrentSession(): Promise { - const { serverConfig } = await this.graphQLService.gql.serverConfig(); - const sessionInfo = await this.openNewSession(); + const { session } = await this.graphQLService.gql.openSession(); - const session: Session = { - name: serverConfig.name || 'WHERE IS A NAME', - version: serverConfig.version || 'WHERE IS A VERSION', - language: sessionInfo.locale || 'en', - supportedLanguages: serverConfig.supportedLanguages, - connections: sessionInfo.connections || [], - }; return session; } - - private async openNewSession(): Promise { - const response = await this.graphQLService.gql.openSession(); - return response.session; - } } diff --git a/webapp/packages/core/src/root/index.ts b/webapp/packages/core/src/root/index.ts index 468ee859c8..9fad784387 100644 --- a/webapp/packages/core/src/root/index.ts +++ b/webapp/packages/core/src/root/index.ts @@ -1 +1,2 @@ export * from './SessionService'; +export * from './ServerService'; diff --git a/webapp/packages/core/src/root/queries/openSession.gql b/webapp/packages/core/src/root/queries/openSession.gql index 1d1b852393..889a61b8bc 100644 --- a/webapp/packages/core/src/root/queries/openSession.gql +++ b/webapp/packages/core/src/root/queries/openSession.gql @@ -1,10 +1,14 @@ mutation openSession { session: openSession { + id + createTime + lastAccessTime + locale connections { id - name, + name driverId + connected } - locale } } diff --git a/webapp/packages/core/src/root/queries/serverConfig.gql b/webapp/packages/core/src/root/queries/serverConfig.gql index 3385b3058e..44ef426a82 100644 --- a/webapp/packages/core/src/root/queries/serverConfig.gql +++ b/webapp/packages/core/src/root/queries/serverConfig.gql @@ -2,9 +2,17 @@ query serverConfig { serverConfig { name version + productConfiguration + supportsPredefinedConnections + supportsProvidedConnections + supportsCustomConnections + supportsConnectionBrowser + supportsWorkspaces supportedLanguages { isoCode + displayName nativeName } + productConfiguration } } diff --git a/webapp/packages/core/src/root/queries/sessionState.gql b/webapp/packages/core/src/root/queries/sessionState.gql index 12c6fbcd9e..c92ddca804 100644 --- a/webapp/packages/core/src/root/queries/sessionState.gql +++ b/webapp/packages/core/src/root/queries/sessionState.gql @@ -1,10 +1,14 @@ query sessionState { sessionState { + id + createTime + lastAccessTime + locale connections { id - name, + name driverId + connected } - locale } } diff --git a/webapp/packages/core/src/sdk/sdk.ts b/webapp/packages/core/src/sdk/sdk.ts index c4098afa50..c6bce13c21 100644 --- a/webapp/packages/core/src/sdk/sdk.ts +++ b/webapp/packages/core/src/sdk/sdk.ts @@ -24,6 +24,11 @@ export type AsyncTaskInfo = { status?: Maybe; error?: Maybe; result?: Maybe; + /** + * Task result. + * Can be some kind of identifier to obtain real result using another API function + */ + taskResult?: Maybe; }; export type AsyncTaskResult = SqlExecuteInfo; @@ -411,14 +416,14 @@ export type QueryMetadataGetNodeDdlArgs = { }; export type ServerConfig = { - name?: Maybe; - version?: Maybe; + name: Scalars["String"]; + version: Scalars["String"]; supportsPredefinedConnections?: Maybe; supportsProvidedConnections?: Maybe; supportsCustomConnections?: Maybe; supportsConnectionBrowser?: Maybe; supportsWorkspaces?: Maybe; - supportedLanguages?: Maybe>>; + supportedLanguages: Array>; services?: Maybe>>; productConfiguration: Scalars["Object"]; }; @@ -443,11 +448,11 @@ export type ServerMessage = { export type SessionInfo = { id: Scalars["ID"]; - createTime?: Maybe; - lastAccessTime?: Maybe; - locale?: Maybe; + createTime: Scalars["String"]; + lastAccessTime: Scalars["String"]; + locale: Scalars["String"]; serverMessages?: Maybe>>; - connections?: Maybe>>; + connections: Array>; }; export type SqlCompletionProposal = { @@ -562,6 +567,16 @@ export type CloseConnectionMutationVariables = { export type CloseConnectionMutation = Pick; +export type ConnectionStateQueryVariables = { + id: Scalars["ID"]; +}; + +export type ConnectionStateQuery = { + connection: Maybe< + Pick + >; +}; + export type CreateConnectionMutationVariables = { config: ConnectionConfig; }; @@ -1094,9 +1109,9 @@ export type OpenSessionMutationVariables = {}; export type OpenSessionMutation = { session: Maybe< - Pick & { - connections: Maybe< - Array>> + Pick & { + connections: Array< + Maybe> >; } >; @@ -1106,9 +1121,19 @@ export type ServerConfigQueryVariables = {}; export type ServerConfigQuery = { serverConfig: Maybe< - Pick & { - supportedLanguages: Maybe< - Array>> + Pick< + ServerConfig, + | "name" + | "version" + | "productConfiguration" + | "supportsPredefinedConnections" + | "supportsProvidedConnections" + | "supportsCustomConnections" + | "supportsConnectionBrowser" + | "supportsWorkspaces" + > & { + supportedLanguages: Array< + Maybe> >; } >; @@ -1118,9 +1143,9 @@ export type SessionStateQueryVariables = {}; export type SessionStateQuery = { sessionState: Maybe< - Pick & { - connections: Maybe< - Array>> + Pick & { + connections: Array< + Maybe> >; } >; @@ -1153,6 +1178,16 @@ export const CloseConnectionDocument = gql` closeConnection(id: $id) } `; +export const ConnectionStateDocument = gql` + query connectionState($id: ID!) { + connection: connectionState(id: $id) { + id + name + driverId + connected + } + } +`; export const CreateConnectionDocument = gql` mutation createConnection($config: ConnectionConfig!) { createConnection(config: $config) { @@ -1618,12 +1653,16 @@ export const UpdateResultsDataDocument = gql` export const OpenSessionDocument = gql` mutation openSession { session: openSession { + id + createTime + lastAccessTime + locale connections { id name driverId + connected } - locale } } `; @@ -1632,22 +1671,34 @@ export const ServerConfigDocument = gql` serverConfig { name version + productConfiguration + supportsPredefinedConnections + supportsProvidedConnections + supportsCustomConnections + supportsConnectionBrowser + supportsWorkspaces supportedLanguages { isoCode + displayName nativeName } + productConfiguration } } `; export const SessionStateDocument = gql` query sessionState { sessionState { + id + createTime + lastAccessTime + locale connections { id name driverId + connected } - locale } } `; @@ -1674,6 +1725,14 @@ export function getSdk(client: GraphQLClient) { variables, ); }, + connectionState( + variables: ConnectionStateQueryVariables, + ): Promise { + return client.request( + print(ConnectionStateDocument), + variables, + ); + }, createConnection( variables: CreateConnectionMutationVariables, ): Promise {