diff --git a/.eslintignore b/.eslintignore index a33538a95a6f8..59a5136a928ef 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,3 +3,5 @@ # Ignore WASM generated files: web/packages/teleport/src/ironrdp/pkg + +web/packages/teleterm/build diff --git a/package.json b/package.json index ddc78bcfd5489..530fa313ced4b 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "start-teleport-e": "yarn workspace @gravitational/teleport.e start", "build-term": "yarn workspace @gravitational/teleterm build", "start-term": "yarn workspace @gravitational/teleterm start", + "start-term-skip-native-deps": "yarn workspace @gravitational/teleterm start-skip-native-deps", "package-term": "yarn workspace @gravitational/teleterm package", "storybook": "start-storybook -p 9002 -c web/.storybook -s web/.storybook/public", "storybook-smoke-test": "yarn storybook --ci --smoke-test", @@ -18,10 +19,10 @@ "test-update-snapshot": "yarn test -- --updateSnapshot", "tdd": "jest --watch", "lint": "yarn prettier-check && yarn eslint", - "eslint": "eslint --quiet '+(e|web)/**/*.{ts,tsx,js,jsx}'", + "eslint": "eslint --quiet '+(e|web)/**/*.{ts,tsx,js,jsx,mts}'", "type-check": "NODE_OPTIONS='--max-old-space-size=4096' tsc --noEmit", - "prettier-check": "yarn prettier --check '+(e|web)/**/*.{ts,tsx,js,jsx}'", - "prettier-write": "yarn prettier --write --loglevel silent '+(e|web)/**/*.{ts,tsx,js,jsx}'", + "prettier-check": "yarn prettier --check '+(e|web)/**/*.{ts,tsx,js,jsx,mts}'", + "prettier-write": "yarn prettier --write --loglevel silent '+(e|web)/**/*.{ts,tsx,js,jsx,mts}'", "process-icons": "node web/packages/design/src/Icon/script/script.js & yarn prettier --loglevel silent --write 'web/packages/design/src/Icon/Icons/*.tsx'", "nop": "exit 0" }, diff --git a/web/packages/build/vite/csp.ts b/web/packages/build/vite/csp.ts new file mode 100644 index 0000000000000..65f9dc2da5c55 --- /dev/null +++ b/web/packages/build/vite/csp.ts @@ -0,0 +1,39 @@ +/** + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import type { Plugin } from 'vite'; + +export function cspPlugin(csp: string): Plugin { + return { + name: 'teleport-connect-html-plugin', + transformIndexHtml(html) { + return { + html, + tags: [ + { + tag: 'meta', + attrs: { + 'http-equiv': 'Content-Security-Policy', + content: csp, + }, + }, + ], + }; + }, + }; +} diff --git a/web/packages/build/webpack/webpack.base.js b/web/packages/build/webpack/webpack.base.js index e5c9c33cafbc8..fa23388d26e2c 100644 --- a/web/packages/build/webpack/webpack.base.js +++ b/web/packages/build/webpack/webpack.base.js @@ -157,6 +157,7 @@ function createDefaultConfig() { design: path.join(__dirname, '/../../design/src'), shared: path.join(__dirname, '/../../shared'), 'gen-proto-js': path.join(__dirname, '/../../../../gen/proto/js'), + 'gen-proto-ts': path.join(__dirname, '/../../../../gen/proto/ts'), }, /* diff --git a/web/packages/design/src/ThemeProvider/index.tsx b/web/packages/design/src/ThemeProvider/index.tsx index f40ed1fa47923..da83438cb8934 100644 --- a/web/packages/design/src/ThemeProvider/index.tsx +++ b/web/packages/design/src/ThemeProvider/index.tsx @@ -24,19 +24,20 @@ import { import { KeysEnum, storageService } from 'teleport/services/storageService'; -import { ThemePreference } from 'teleport/services/userPreferences/types'; import cfg from 'teleport/config'; +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; + import { darkTheme, lightTheme, bblpTheme } from '../theme'; import { GlobalStyle } from './globals'; -function themePreferenceToTheme(themePreference: ThemePreference) { - return themePreference === ThemePreference.Light ? lightTheme : darkTheme; +function themePreferenceToTheme(themePreference: Theme) { + return themePreference === Theme.LIGHT ? lightTheme : darkTheme; } const ThemeProvider = props => { - const [themePreference, setThemePreference] = useState( + const [themePreference, setThemePreference] = useState( storageService.getThemePreference() ); diff --git a/web/packages/shared/components/UnifiedResources/FilterPanel.tsx b/web/packages/shared/components/UnifiedResources/FilterPanel.tsx index 3733dd90441ff..1f134c0b4f10d 100644 --- a/web/packages/shared/components/UnifiedResources/FilterPanel.tsx +++ b/web/packages/shared/components/UnifiedResources/FilterPanel.tsx @@ -33,7 +33,8 @@ import { ArrowsOut, } from 'design/Icon'; -import { ViewMode } from 'shared/services/unifiedResourcePreferences'; +import { ViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; + import { HoverTooltip } from 'shared/components/ToolTip'; import { FilterKind } from './UnifiedResources'; @@ -132,7 +133,7 @@ export function FilterPanel({ {BulkActions} {!hideViewModeOptions && ( <> - {currentViewMode === ViewMode.VIEW_MODE_LIST && ( + {currentViewMode === ViewMode.LIST && ( setCurrentViewMode(ViewMode.VIEW_MODE_CARD)} + className={currentViewMode === ViewMode.CARD ? 'selected' : ''} + onClick={() => setCurrentViewMode(ViewMode.CARD)} css={` border-right: 1px solid ${props => props.theme.colors.spotBackground[2]}; @@ -482,10 +481,8 @@ function ViewModeSwitch({ setCurrentViewMode(ViewMode.VIEW_MODE_LIST)} + className={currentViewMode === ViewMode.LIST ? 'selected' : ''} + onClick={() => setCurrentViewMode(ViewMode.LIST)} css={` border-top-right-radius: 4px; border-bottom-right-radius: 4px; diff --git a/web/packages/shared/components/UnifiedResources/UnifiedResources.story.tsx b/web/packages/shared/components/UnifiedResources/UnifiedResources.story.tsx index 6429dbe4309c4..98f9c963f0234 100644 --- a/web/packages/shared/components/UnifiedResources/UnifiedResources.story.tsx +++ b/web/packages/shared/components/UnifiedResources/UnifiedResources.story.tsx @@ -30,11 +30,11 @@ import { UrlResourcesParams } from 'teleport/config'; import { ResourcesResponse } from 'teleport/services/agents'; import { - UnifiedResourcePreferences, DefaultTab, - ViewMode, LabelsViewMode, -} from 'shared/services/unifiedResourcePreferences'; + UnifiedResourcePreferences, + ViewMode, +} from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; import { makeErrorAttempt, makeProcessingAttempt } from 'shared/hooks/useAsync'; @@ -97,9 +97,9 @@ const story = ({ }; return () => { const [userPrefs, setUserPrefs] = useState({ - defaultTab: DefaultTab.DEFAULT_TAB_ALL, - viewMode: ViewMode.VIEW_MODE_CARD, - labelsViewMode: LabelsViewMode.LABELS_VIEW_MODE_COLLAPSED, + defaultTab: DefaultTab.ALL, + viewMode: ViewMode.CARD, + labelsViewMode: LabelsViewMode.COLLAPSED, }); const { fetch, attempt, resources } = useUnifiedResourcesFetch({ fetchFunc, diff --git a/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx b/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx index c361fdcc637bd..b093b0cf49d0f 100644 --- a/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx +++ b/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx @@ -43,10 +43,11 @@ import { ResourcesResponse } from 'teleport/services/agents'; import { DefaultTab, - ViewMode, - UnifiedResourcePreferences, LabelsViewMode, -} from 'shared/services/unifiedResourcePreferences'; + UnifiedResourcePreferences, + ViewMode, +} from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; + import { HoverTooltip } from 'shared/components/ToolTip'; import { makeEmptyAttempt, @@ -90,11 +91,11 @@ export const PINNING_NOT_SUPPORTED_MESSAGE = const tabs: { label: string; value: DefaultTab }[] = [ { label: 'All Resources', - value: DefaultTab.DEFAULT_TAB_ALL, + value: DefaultTab.ALL, }, { label: 'Pinned Resources', - value: DefaultTab.DEFAULT_TAB_PINNED, + value: DefaultTab.PINNED, }, ]; @@ -304,7 +305,7 @@ export function UnifiedResources(props: UnifiedResourcesProps) { }; const selectTab = (value: DefaultTab) => { - const pinnedOnly = value === DefaultTab.DEFAULT_TAB_PINNED; + const pinnedOnly = value === DefaultTab.PINNED; setParams({ ...params, pinnedOnly, @@ -366,8 +367,7 @@ export function UnifiedResources(props: UnifiedResourcesProps) { }; const expandAllLabels = - unifiedResourcePreferences.labelsViewMode === - LabelsViewMode.LABELS_VIEW_MODE_EXPANDED; + unifiedResourcePreferences.labelsViewMode === LabelsViewMode.EXPANDED; useEffect(() => { const resizeObserver = new ResizeObserver(entries => { @@ -386,8 +386,7 @@ export function UnifiedResources(props: UnifiedResourcesProps) { }, []); const ViewComponent = - unifiedResourcePreferences.viewMode === ViewMode.VIEW_MODE_CARD || - forceCardView + unifiedResourcePreferences.viewMode === ViewMode.CARD || forceCardView ? CardsView : ListView; @@ -448,9 +447,7 @@ export function UnifiedResources(props: UnifiedResourcesProps) { ClusterDropdown={ClusterDropdown} setExpandAllLabels={expandAllLabels => { setLabelsViewMode( - expandAllLabels - ? LabelsViewMode.LABELS_VIEW_MODE_EXPANDED - : LabelsViewMode.LABELS_VIEW_MODE_COLLAPSED + expandAllLabels ? LabelsViewMode.EXPANDED : LabelsViewMode.COLLAPSED ); }} hideViewModeOptions={forceCardView} @@ -498,14 +495,14 @@ export function UnifiedResources(props: UnifiedResourcesProps) { key={tab.value} onClick={() => selectTab(tab.value)} disabled={ - tab.value === DefaultTab.DEFAULT_TAB_PINNED && + tab.value === DefaultTab.PINNED && pinning.kind === 'not-supported' } title={tab.label} isSelected={ params.pinnedOnly - ? tab.value === DefaultTab.DEFAULT_TAB_PINNED - : tab.value === DefaultTab.DEFAULT_TAB_ALL + ? tab.value === DefaultTab.PINNED + : tab.value === DefaultTab.ALL } /> ))} diff --git a/web/packages/shared/services/unifiedResourcePreferences.ts b/web/packages/shared/services/unifiedResourcePreferences.ts deleted file mode 100644 index 8c277b2217362..0000000000000 --- a/web/packages/shared/services/unifiedResourcePreferences.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Teleport - * Copyright (C) 2023 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -// Should be kept in sync with -// https://github.com/gravitational/teleport/blob/cc330931e2b691b7438bfee73587e828e874fa47/api/proto/teleport/userpreferences/v1/unified_resource_preferences.proto -// -// The exported enums and types have the same names and values/properties as -// the values generated by protogen. -// It allows using them interchangeably with the generated values. -// -// Ideally, we should use the generated values, but it was a challenge -// to make them work with Vite (the generated files are in CommonJS format); -// additionally, they increased the bundle size significantly. - -/** Preferences related to the Unified Resource view. */ -export interface UnifiedResourcePreferences { - /** Default tab selected in the unified resource view. */ - defaultTab: DefaultTab; - /** View mode selected in the unified resource view (Cards/List). */ - viewMode: ViewMode; - /** Labels view mode is whether the labels for resources should all be collapsed or expanded. This only applies to the list view. */ - labelsViewMode: LabelsViewMode; -} - -export enum DefaultTab { - DEFAULT_TAB_UNSPECIFIED = 0, - DEFAULT_TAB_ALL = 1, - DEFAULT_TAB_PINNED = 2, -} - -export enum ViewMode { - VIEW_MODE_UNSPECIFIED = 0, - VIEW_MODE_CARD = 1, - VIEW_MODE_LIST = 2, -} - -export enum LabelsViewMode { - LABELS_VIEW_MODE_UNSPECIFIED = 0, - LABELS_VIEW_MODE_EXPANDED = 1, - LABELS_VIEW_MODE_COLLAPSED = 2, -} diff --git a/web/packages/teleport/src/Assist/Assist.tsx b/web/packages/teleport/src/Assist/Assist.tsx index fb82b0e560207..16bba80013ac7 100644 --- a/web/packages/teleport/src/Assist/Assist.tsx +++ b/web/packages/teleport/src/Assist/Assist.tsx @@ -20,6 +20,8 @@ import React, { useEffect, useState } from 'react'; import styled, { keyframes } from 'styled-components'; import { sharedStyles } from 'design/theme/themes/sharedStyles'; +import { AssistViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/assist_pb'; + import { Header } from 'teleport/Assist/Header'; import { ConversationHistory } from 'teleport/Assist/ConversationHistory'; import { @@ -28,7 +30,6 @@ import { } from 'teleport/Assist/context/AssistContext'; import { ConversationList } from 'teleport/Assist/ConversationList'; import { useLayout } from 'teleport/Main/LayoutContext'; -import { ViewMode } from 'teleport/Assist/types'; import { Settings } from 'teleport/Assist/Settings'; import { ErrorBanner, ErrorList } from 'teleport/Assist/ErrorBanner'; import { useUser } from 'teleport/User/UserContext'; @@ -60,9 +61,9 @@ const slideIn = keyframes` } `; -function variables(props: { viewMode: ViewMode }) { +function variables(props: { viewMode: AssistViewMode }) { switch (props.viewMode) { - case ViewMode.Popup: + case AssistViewMode.POPUP: return { '--assist-gutter': '20px', '--assist-border-radius': '15px', @@ -76,8 +77,8 @@ function variables(props: { viewMode: ViewMode }) { '--assist-bottom-padding': '5px', }; - case ViewMode.PopupExpanded: - case ViewMode.PopupExpandedSidebarVisible: + case AssistViewMode.POPUP_EXPANDED: + case AssistViewMode.POPUP_EXPANDED_SIDEBAR_VISIBLE: return { '--assist-gutter': '20px', '--assist-border-radius': '15px', @@ -91,7 +92,7 @@ function variables(props: { viewMode: ViewMode }) { '--assist-bottom-padding': '5px', }; - case ViewMode.Docked: + case AssistViewMode.DOCKED: return { '--assist-gutter': '0', '--assist-border-radius': '0', @@ -108,11 +109,11 @@ function variables(props: { viewMode: ViewMode }) { } function sidebarVariables(props: { - viewMode: ViewMode; + viewMode: AssistViewMode; sidebarVisible: boolean; }) { switch (props.viewMode) { - case ViewMode.Popup: + case AssistViewMode.POPUP: if (props.sidebarVisible) { return { '--conversation-width': '550px', @@ -134,8 +135,8 @@ function sidebarVariables(props: { '--conversation-list-position': 'absolute', }; - case ViewMode.PopupExpanded: - case ViewMode.PopupExpandedSidebarVisible: + case AssistViewMode.POPUP_EXPANDED: + case AssistViewMode.POPUP_EXPANDED_SIDEBAR_VISIBLE: if (props.sidebarVisible) { return { '--conversation-list-margin': '0', @@ -157,7 +158,7 @@ function sidebarVariables(props: { '--conversation-list-position': 'absolute', }; - case ViewMode.Docked: + case AssistViewMode.DOCKED: if (props.sidebarVisible) { return { '--conversation-width': `${dockedAssistWidth}px`, @@ -301,11 +302,17 @@ function AssistContent(props: AssistProps) { const { hasDockedElement, setHasDockedElement } = useLayout(); useEffect(() => { - if (!hasDockedElement && preferences.assist.viewMode === ViewMode.Docked) { + if ( + !hasDockedElement && + preferences.assist.viewMode === AssistViewMode.DOCKED + ) { setHasDockedElement(true); } - if (hasDockedElement && preferences.assist.viewMode !== ViewMode.Docked) { + if ( + hasDockedElement && + preferences.assist.viewMode !== AssistViewMode.DOCKED + ) { setHasDockedElement(false); } }, [hasDockedElement, preferences.assist.viewMode]); @@ -320,8 +327,8 @@ function AssistContent(props: AssistProps) { } if ( - preferences.assist.viewMode === ViewMode.Popup || - preferences.assist.viewMode === ViewMode.Docked + preferences.assist.viewMode === AssistViewMode.POPUP || + preferences.assist.viewMode === AssistViewMode.DOCKED ) { toggleSidebar(false); } @@ -333,7 +340,8 @@ function AssistContent(props: AssistProps) { if ( sidebarVisible && - preferences.assist.viewMode !== ViewMode.PopupExpandedSidebarVisible + preferences.assist.viewMode !== + AssistViewMode.POPUP_EXPANDED_SIDEBAR_VISIBLE ) { toggleSidebar(false); } @@ -365,7 +373,7 @@ function AssistContent(props: AssistProps) { )); - const docked = preferences.assist.viewMode === ViewMode.Docked; + const docked = preferences.assist.viewMode === AssistViewMode.DOCKED; return ( diff --git a/web/packages/teleport/src/Assist/ConversationHistory/ConversationHistory.tsx b/web/packages/teleport/src/Assist/ConversationHistory/ConversationHistory.tsx index f5e518736ca5e..ce0448ec609a3 100644 --- a/web/packages/teleport/src/Assist/ConversationHistory/ConversationHistory.tsx +++ b/web/packages/teleport/src/Assist/ConversationHistory/ConversationHistory.tsx @@ -19,14 +19,15 @@ import React, { useState } from 'react'; import styled from 'styled-components'; +import { AssistViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/assist_pb'; + import { useAssist } from 'teleport/Assist/context/AssistContext'; import { ConversationHistoryItem } from 'teleport/Assist/ConversationHistory/ConversationHistoryItem'; import { DeleteConversationDialog } from 'teleport/Assist/ConversationHistory/DeleteConversationDialog'; -import { ViewMode } from 'teleport/Assist/types'; interface ConversationHistoryProps { onConversationSelect: (id: string) => void; - viewMode: ViewMode; + viewMode: AssistViewMode; onError: (message: string) => void; } @@ -58,10 +59,10 @@ const List = styled.ul.attrs({ 'data-scrollbar': 'default' })` overflow-y: auto; `; -function isExpanded(viewMode: ViewMode) { +function isExpanded(viewMode: AssistViewMode) { return ( - viewMode === ViewMode.PopupExpanded || - viewMode === ViewMode.PopupExpandedSidebarVisible + viewMode === AssistViewMode.POPUP_EXPANDED || + viewMode === AssistViewMode.POPUP_EXPANDED_SIDEBAR_VISIBLE ); } diff --git a/web/packages/teleport/src/Assist/ConversationList/ConversationList.tsx b/web/packages/teleport/src/Assist/ConversationList/ConversationList.tsx index 1233977508ff6..57d5f444f1a3a 100644 --- a/web/packages/teleport/src/Assist/ConversationList/ConversationList.tsx +++ b/web/packages/teleport/src/Assist/ConversationList/ConversationList.tsx @@ -19,13 +19,14 @@ import React, { useEffect, useRef } from 'react'; import styled from 'styled-components'; +import { AssistViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/assist_pb'; + import { Conversation } from 'teleport/Assist/Conversation'; import { useAssist } from 'teleport/Assist/context/AssistContext'; import { MessageBox } from 'teleport/Assist/MessageBox'; -import { ViewMode } from 'teleport/Assist/types'; interface ConversationListProps { - viewMode: ViewMode; + viewMode: AssistViewMode; } const Container = styled.div.attrs({ 'data-scrollbar': 'default' })` diff --git a/web/packages/teleport/src/Assist/Header/Header.tsx b/web/packages/teleport/src/Assist/Header/Header.tsx index aa9d7cd59a773..01d441e7614c7 100644 --- a/web/packages/teleport/src/Assist/Header/Header.tsx +++ b/web/packages/teleport/src/Assist/Header/Header.tsx @@ -26,13 +26,14 @@ import { SettingsIcon, } from 'design/SVGIcon'; +import { AssistViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/assist_pb'; + import { useAssist } from 'teleport/Assist/context/AssistContext'; import { Tooltip } from 'teleport/Assist/shared/Tooltip'; -import { ViewMode } from 'teleport/Assist/types'; import { HeaderIcon } from 'teleport/Assist/shared'; interface HeaderProps { - viewMode: ViewMode; + viewMode: AssistViewMode; sidebarVisible: boolean; onClose: () => void; onToggleSidebar: () => void; diff --git a/web/packages/teleport/src/Assist/Settings/DisplaySettings.tsx b/web/packages/teleport/src/Assist/Settings/DisplaySettings.tsx index 91d45db041440..39a89bbfaf66f 100644 --- a/web/packages/teleport/src/Assist/Settings/DisplaySettings.tsx +++ b/web/packages/teleport/src/Assist/Settings/DisplaySettings.tsx @@ -19,14 +19,15 @@ import React from 'react'; import styled from 'styled-components'; +import { AssistViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/assist_pb'; + import logoLight from 'teleport/Navigation/logoLight.svg'; import logoDark from 'teleport/Navigation/logoDark.svg'; -import { ViewMode } from 'teleport/Assist/types'; import { Description, Title } from 'teleport/Assist/Settings/shared'; interface DisplaySettingsProps { - viewMode: ViewMode; - onChange: (viewMode: ViewMode) => void; + viewMode: AssistViewMode; + onChange: (viewMode: AssistViewMode) => void; } const ViewModes = styled.div` @@ -241,8 +242,8 @@ export function DisplaySettings(props: DisplaySettingsProps) { props.onChange(ViewMode.Popup)} + active={props.viewMode === AssistViewMode.POPUP} + onClick={() => props.onChange(AssistViewMode.POPUP)} > @@ -256,8 +257,8 @@ export function DisplaySettings(props: DisplaySettingsProps) { Popup props.onChange(ViewMode.Docked)} + active={props.viewMode === AssistViewMode.DOCKED} + onClick={() => props.onChange(AssistViewMode.DOCKED)} > @@ -269,8 +270,8 @@ export function DisplaySettings(props: DisplaySettingsProps) { Docked props.onChange(ViewMode.PopupExpanded)} + active={props.viewMode === AssistViewMode.POPUP_EXPANDED} + onClick={() => props.onChange(AssistViewMode.POPUP_EXPANDED)} > @@ -284,8 +285,12 @@ export function DisplaySettings(props: DisplaySettingsProps) { Expanded popup props.onChange(ViewMode.PopupExpandedSidebarVisible)} + active={ + props.viewMode === AssistViewMode.POPUP_EXPANDED_SIDEBAR_VISIBLE + } + onClick={() => + props.onChange(AssistViewMode.POPUP_EXPANDED_SIDEBAR_VISIBLE) + } > diff --git a/web/packages/teleport/src/Assist/Settings/Settings.tsx b/web/packages/teleport/src/Assist/Settings/Settings.tsx index 84e86587057fe..ef00279ce9925 100644 --- a/web/packages/teleport/src/Assist/Settings/Settings.tsx +++ b/web/packages/teleport/src/Assist/Settings/Settings.tsx @@ -23,7 +23,11 @@ import { CloseIcon, DisplayIcon, TerminalIcon } from 'design/SVGIcon'; import Flex from 'design/Flex'; -import { AssistUserPreferences, ViewMode } from 'teleport/Assist/types'; +import { + AssistUserPreferences, + AssistViewMode, +} from 'gen-proto-ts/teleport/userpreferences/v1/assist_pb'; + import { useAssist } from 'teleport/Assist/context/AssistContext'; import { Tooltip } from 'teleport/Assist/shared/Tooltip'; import { HeaderIcon } from 'teleport/Assist/shared'; @@ -40,7 +44,7 @@ interface SettingsProps { onDebugMenuToggle: (enabled: boolean) => void; } -const Container = styled.div<{ viewMode: ViewMode }>` +const Container = styled.div<{ viewMode: AssistViewMode }>` position: fixed; top: 0; left: 0; @@ -169,12 +173,12 @@ export function Settings(props: SettingsProps) { savingTimeoutRef.current = window.setTimeout(() => setSaving(false), 500); } - function handleChangeViewMode(viewMode: ViewMode) { + function handleChangeViewMode(viewMode: AssistViewMode) { if (viewMode === preferences.assist.viewMode) { return; } - toggleSidebar(viewMode === ViewMode.PopupExpandedSidebarVisible); + toggleSidebar(viewMode === AssistViewMode.POPUP_EXPANDED_SIDEBAR_VISIBLE); saveSettings({ viewMode }); } diff --git a/web/packages/teleport/src/Assist/types.ts b/web/packages/teleport/src/Assist/types.ts index 75c9fb3c8d826..2b5d72be7d1f0 100644 --- a/web/packages/teleport/src/Assist/types.ts +++ b/web/packages/teleport/src/Assist/types.ts @@ -275,15 +275,3 @@ export interface ExecuteRemoteCommandPayload { labels?: { key: string; value: string }[]; nodes?: string[]; } - -export enum ViewMode { - Docked = 1, - Popup = 2, - PopupExpanded = 3, - PopupExpandedSidebarVisible = 4, -} - -export interface AssistUserPreferences { - preferredLogins: string[]; - viewMode: ViewMode; -} diff --git a/web/packages/teleport/src/Discover/Discover.test.tsx b/web/packages/teleport/src/Discover/Discover.test.tsx index 204c584176401..8198ff5f69b12 100644 --- a/web/packages/teleport/src/Discover/Discover.test.tsx +++ b/web/packages/teleport/src/Discover/Discover.test.tsx @@ -22,6 +22,8 @@ import { MemoryRouter } from 'react-router'; import { render, screen } from 'design/utils/testing'; +import { Resource } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + import TeleportContextProvider from 'teleport/TeleportContextProvider'; import { Discover } from 'teleport/Discover/Discover'; import { FeaturesContextProvider } from 'teleport/FeaturesContext'; @@ -40,8 +42,6 @@ import { DATABASES_UNGUIDED_DOC, } from 'teleport/Discover/SelectResource/databases'; -import { ClusterResource } from 'teleport/services/userPreferences/types'; - import { mockUserContextProviderWith } from 'teleport/User/testHelpers/mockUserContextWith'; import { makeTestUserContext } from 'teleport/User/testHelpers/makeTestUserContext'; @@ -55,7 +55,7 @@ beforeEach(() => { type createProps = { initialEntry?: string; - preferredResource?: ClusterResource; + preferredResource?: Resource; }; const create = ({ initialEntry = '', preferredResource }: createProps) => { @@ -113,7 +113,7 @@ test('displays all resources by default', () => { test('location state applies filter/search', () => { create({ initialEntry: 'desktop', - preferredResource: ClusterResource.RESOURCE_WEB_APPLICATIONS, + preferredResource: Resource.WEB_APPLICATIONS, }); expect(screen.getAllByTestId(ResourceKind.Desktop)).toHaveLength( diff --git a/web/packages/teleport/src/Discover/SelectResource/SelectResource.story.tsx b/web/packages/teleport/src/Discover/SelectResource/SelectResource.story.tsx index 750e6e372c449..f9de6452bf2f3 100644 --- a/web/packages/teleport/src/Discover/SelectResource/SelectResource.story.tsx +++ b/web/packages/teleport/src/Discover/SelectResource/SelectResource.story.tsx @@ -19,6 +19,10 @@ import React from 'react'; import { MemoryRouter } from 'react-router'; +import { Resource } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + +import { UserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/userpreferences_pb'; + import { createTeleportContext, getAcl, @@ -30,10 +34,6 @@ import { UserContext } from 'teleport/User/UserContext'; import { makeDefaultUserPreferences } from 'teleport/services/userPreferences/userPreferences'; -import { - ClusterResource, - UserPreferences, -} from 'teleport/services/userPreferences/types'; import { Acl } from 'teleport/services/user'; import { SelectResource } from './SelectResource'; @@ -86,7 +86,7 @@ export const InitRouteEntryServer = () => ( type ProviderProps = { customAcl?: Acl; entity?: string; - resources?: ClusterResource[]; + resources?: Resource[]; children?: React.ReactNode; }; diff --git a/web/packages/teleport/src/Discover/SelectResource/SelectResource.test.tsx b/web/packages/teleport/src/Discover/SelectResource/SelectResource.test.tsx index 8c4c4e1eef042..b457cd50a1859 100644 --- a/web/packages/teleport/src/Discover/SelectResource/SelectResource.test.tsx +++ b/web/packages/teleport/src/Discover/SelectResource/SelectResource.test.tsx @@ -18,12 +18,13 @@ import { Platform, UserAgent } from 'design/platform'; -import { makeDefaultUserPreferences } from 'teleport/services/userPreferences/userPreferences'; - import { - ClusterResource, OnboardUserPreferences, -} from 'teleport/services/userPreferences/types'; + Resource, +} from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + +import { makeDefaultUserPreferences } from 'teleport/services/userPreferences/userPreferences'; + import { OnboardDiscover } from 'teleport/services/user'; import { ResourceKind } from '../Shared'; @@ -228,12 +229,12 @@ describe('preferred resources', () => { const testCases: { name: string; - preferred: ClusterResource[]; + preferred: Resource[]; expected: ResourceSpec[]; }[] = [ { name: 'preferred server/ssh', - preferred: [ClusterResource.RESOURCE_SERVER_SSH], + preferred: [Resource.SERVER_SSH], expected: [ // preferred first f_Server, @@ -255,7 +256,7 @@ describe('preferred resources', () => { }, { name: 'preferred databases', - preferred: [ClusterResource.RESOURCE_DATABASES], + preferred: [Resource.DATABASES], expected: [ // preferred first a_Database, @@ -277,7 +278,7 @@ describe('preferred resources', () => { }, { name: 'preferred windows', - preferred: [ClusterResource.RESOURCE_WINDOWS_DESKTOPS], + preferred: [Resource.WINDOWS_DESKTOPS], expected: [ // preferred first i_Desktop, @@ -299,7 +300,7 @@ describe('preferred resources', () => { }, { name: 'preferred applications', - preferred: [ClusterResource.RESOURCE_WEB_APPLICATIONS], + preferred: [Resource.WEB_APPLICATIONS], expected: [ // preferred first c_Application, @@ -321,7 +322,7 @@ describe('preferred resources', () => { }, { name: 'preferred kubernetes', - preferred: [ClusterResource.RESOURCE_KUBERNETES], + preferred: [Resource.KUBERNETES], expected: [ // preferred first; guided before unguided j_Kubernetes, @@ -369,7 +370,7 @@ describe('marketing params', () => { { name: 'marketing params instead of preferred resources', preferred: { - preferredResources: [ClusterResource.RESOURCE_WEB_APPLICATIONS], + preferredResources: [Resource.WEB_APPLICATIONS], marketingParams: { campaign: 'kubernetes', source: '', diff --git a/web/packages/teleport/src/Discover/SelectResource/SelectResource.tsx b/web/packages/teleport/src/Discover/SelectResource/SelectResource.tsx index b2f17b015b307..ba7f77258711e 100644 --- a/web/packages/teleport/src/Discover/SelectResource/SelectResource.tsx +++ b/web/packages/teleport/src/Discover/SelectResource/SelectResource.tsx @@ -24,6 +24,10 @@ import styled from 'styled-components'; import { Box, Flex, Link, Text } from 'design'; import { getPlatform, Platform } from 'design/platform'; +import { UserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/userpreferences_pb'; + +import { Resource } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + import useTeleport from 'teleport/useTeleport'; import { ToolTipNoPermBadge } from 'teleport/components/ToolTipNoPermBadge'; import { Acl, AuthType, OnboardDiscover } from 'teleport/services/user'; @@ -41,11 +45,6 @@ import AddApp from 'teleport/Apps/AddApp'; import { useUser } from 'teleport/User/UserContext'; import { storageService } from 'teleport/services/storageService'; -import { - ClusterResource, - UserPreferences, -} from 'teleport/services/userPreferences/types'; - import { resourceKindToPreferredResource } from 'teleport/Discover/Shared/ResourceKind'; import { getMarketingTermMatches } from './getMarketingTermMatches'; @@ -544,7 +543,7 @@ function getPrioritizedResources( const preferredResources = preferences.onboard.preferredResources || []; // hasPreferredResources will be false if all resources are selected - const maxResources = Object.keys(ClusterResource).length / 2 - 1; + const maxResources = Object.keys(Resource).length / 2 - 1; const selectedAll = preferredResources.length === maxResources; return { diff --git a/web/packages/teleport/src/Discover/SelectResource/constants.ts b/web/packages/teleport/src/Discover/SelectResource/constants.ts index fc3e7a6b5be86..5f2edb66ea0b0 100644 --- a/web/packages/teleport/src/Discover/SelectResource/constants.ts +++ b/web/packages/teleport/src/Discover/SelectResource/constants.ts @@ -16,14 +16,15 @@ * along with this program. If not, see . */ -import { ClusterResource } from 'teleport/services/userPreferences/types'; +import { Resource } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + import { SearchResource } from 'teleport/Discover/SelectResource/types'; -export const resourceMapping: { [key in ClusterResource]: SearchResource } = { - [ClusterResource.RESOURCE_UNSPECIFIED]: SearchResource.UNSPECIFIED, - [ClusterResource.RESOURCE_DATABASES]: SearchResource.DATABASE, - [ClusterResource.RESOURCE_KUBERNETES]: SearchResource.KUBERNETES, - [ClusterResource.RESOURCE_SERVER_SSH]: SearchResource.SERVER, - [ClusterResource.RESOURCE_WEB_APPLICATIONS]: SearchResource.APPLICATION, - [ClusterResource.RESOURCE_WINDOWS_DESKTOPS]: SearchResource.DESKTOP, +export const resourceMapping: { [key in Resource]: SearchResource } = { + [Resource.UNSPECIFIED]: SearchResource.UNSPECIFIED, + [Resource.DATABASES]: SearchResource.DATABASE, + [Resource.KUBERNETES]: SearchResource.KUBERNETES, + [Resource.SERVER_SSH]: SearchResource.SERVER, + [Resource.WEB_APPLICATIONS]: SearchResource.APPLICATION, + [Resource.WINDOWS_DESKTOPS]: SearchResource.DESKTOP, }; diff --git a/web/packages/teleport/src/Discover/SelectResource/getMarketingMatches.test.ts b/web/packages/teleport/src/Discover/SelectResource/getMarketingMatches.test.ts index 0cb2f5fc1eeb0..a645229c704dc 100644 --- a/web/packages/teleport/src/Discover/SelectResource/getMarketingMatches.test.ts +++ b/web/packages/teleport/src/Discover/SelectResource/getMarketingMatches.test.ts @@ -16,10 +16,9 @@ * along with this program. If not, see . */ -import { - ClusterResource, - MarketingParams, -} from 'teleport/services/userPreferences/types'; +import { Resource } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + +import { MarketingParams } from 'teleport/services/userPreferences/types'; import { getMarketingTermMatches } from './getMarketingTermMatches'; @@ -27,116 +26,107 @@ describe('getMarketingMatches', () => { const testCases: { name: string; param: MarketingParams; - expected: ClusterResource[]; + expected: Resource[]; }[] = [ { - name: 'database matches RESOURCE_DATABASES & k8s matches RESOURCE_KUBERNETES', + name: 'database matches DATABASES & k8s matches KUBERNETES', param: { campaign: 'foodatabasebar', source: 'k8ski', medium: '', intent: '', }, - expected: [ - ClusterResource.RESOURCE_DATABASES, - ClusterResource.RESOURCE_KUBERNETES, - ], + expected: [Resource.DATABASES, Resource.KUBERNETES], }, { - name: 'app matches RESOURCE_WEB_APPLICATIONS', + name: 'app matches WEB_APPLICATIONS', param: { campaign: '', source: 'baz', medium: '', intent: 'fooappbar', }, - expected: [ClusterResource.RESOURCE_WEB_APPLICATIONS], + expected: [Resource.WEB_APPLICATIONS], }, { - name: 'windows matches RESOURCE_WINDOWS_DESKTOPS', + name: 'windows matches WINDOWS_DESKTOPS', param: { campaign: 'foowindowsbar', source: '', medium: '', intent: 'aws', }, - expected: [ClusterResource.RESOURCE_WINDOWS_DESKTOPS], + expected: [Resource.WINDOWS_DESKTOPS], }, { - name: 'desktop matches RESOURCE_WINDOWS_DESKTOPS', + name: 'desktop matches WINDOWS_DESKTOPS', param: { campaign: '', source: '', medium: 'foodesktopbar', intent: 'shoo', }, - expected: [ClusterResource.RESOURCE_WINDOWS_DESKTOPS], + expected: [Resource.WINDOWS_DESKTOPS], }, { - name: 'ssh matches RESOURCE_SERVER_SSH', + name: 'ssh matches SERVER_SSH', param: { campaign: '', source: 'foosshbar', medium: 'bar', intent: '', }, - expected: [ClusterResource.RESOURCE_SERVER_SSH], + expected: [Resource.SERVER_SSH], }, { - name: 'server matches RESOURCE_SERVER_SSH', + name: 'server matches SERVER_SSH', param: { campaign: 'fooserverbar', source: '', medium: '', intent: 'ser', }, - expected: [ClusterResource.RESOURCE_SERVER_SSH], + expected: [Resource.SERVER_SSH], }, { - name: 'kube matches RESOURCE_KUBERNETES and windows matches RESOURCE_WINDOWS_DESKTOPS', + name: 'kube matches KUBERNETES and windows matches WINDOWS_DESKTOPS', param: { campaign: 'fookubebar', source: '', medium: 'windows', intent: '', }, - expected: [ - ClusterResource.RESOURCE_KUBERNETES, - ClusterResource.RESOURCE_WINDOWS_DESKTOPS, - ], + expected: [Resource.KUBERNETES, Resource.WINDOWS_DESKTOPS], }, { - name: 'kubernetes matches RESOURCE_KUBERNETES', + name: 'kubernetes matches KUBERNETES', param: { campaign: 'kubernetes', source: '', medium: '', intent: '', }, - expected: [ClusterResource.RESOURCE_KUBERNETES], + expected: [Resource.KUBERNETES], }, { - name: 'kube matches RESOURCE_KUBERNETES', + name: 'kube matches KUBERNETES', param: { campaign: '', source: 'kube', medium: '', intent: '', }, - expected: [ClusterResource.RESOURCE_KUBERNETES], + expected: [Resource.KUBERNETES], }, { - name: 'k8s matches RESOURCE_KUBERNETES and ssh matches RESOURCE_SERVER_SSH', + name: 'k8s matches KUBERNETES and ssh matches SERVER_SSH', param: { campaign: '', source: '', medium: 'fook8sbar', intent: 'ssh', }, - expected: [ - ClusterResource.RESOURCE_KUBERNETES, - ClusterResource.RESOURCE_SERVER_SSH, - ], + expected: [Resource.KUBERNETES, Resource.SERVER_SSH], }, { name: 'aws does not match', diff --git a/web/packages/teleport/src/Discover/SelectResource/getMarketingTermMatches.ts b/web/packages/teleport/src/Discover/SelectResource/getMarketingTermMatches.ts index 281fd257d766a..05b8b9e4b458c 100644 --- a/web/packages/teleport/src/Discover/SelectResource/getMarketingTermMatches.ts +++ b/web/packages/teleport/src/Discover/SelectResource/getMarketingTermMatches.ts @@ -16,21 +16,20 @@ * along with this program. If not, see . */ -import { - ClusterResource, - MarketingParams, -} from 'teleport/services/userPreferences/types'; +import { Resource } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + +import { MarketingParams } from 'teleport/services/userPreferences/types'; /** * Returns a list of resource kinds that match provided marketing parameters. * * @param marketingParams - MarketingParams from cluster user preferences which are set at signup - * @returns an array of ClusterResource associated with the marketing params for resource discoverability + * @returns an array of Resource associated with the marketing params for resource discoverability * */ export const getMarketingTermMatches = ( marketingParams: MarketingParams -): ClusterResource[] => { +): Resource[] => { const params = []; if (marketingParams) { marketingParams.campaign && params.push(marketingParams.campaign); @@ -42,7 +41,7 @@ export const getMarketingTermMatches = ( return []; } - const matches = new Set(); + const matches = new Set(); params.forEach(p => { Object.values(TermMatch).forEach(m => { const clusterResource = matchTerm(m); @@ -68,22 +67,22 @@ export enum TermMatch { AWS = 'aws', } -const matchTerm = (m: string): ClusterResource => { +const matchTerm = (m: string): Resource => { switch (m) { case TermMatch.App: - return ClusterResource.RESOURCE_WEB_APPLICATIONS; + return Resource.WEB_APPLICATIONS; case TermMatch.Database: - return ClusterResource.RESOURCE_DATABASES; + return Resource.DATABASES; case TermMatch.Kube: case TermMatch.Kubernetes: case TermMatch.K8s: - return ClusterResource.RESOURCE_KUBERNETES; + return Resource.KUBERNETES; case TermMatch.SSH: case TermMatch.Server: - return ClusterResource.RESOURCE_SERVER_SSH; + return Resource.SERVER_SSH; case TermMatch.Desktop: case TermMatch.Windows: - return ClusterResource.RESOURCE_WINDOWS_DESKTOPS; + return Resource.WINDOWS_DESKTOPS; // currently we have no resource kind nor cluster resource defined for AWS // in the future, we can search the resources based on this term. case TermMatch.AWS: diff --git a/web/packages/teleport/src/Discover/SelectResource/types.ts b/web/packages/teleport/src/Discover/SelectResource/types.ts index f10b8b0f79912..67decc82fb96e 100644 --- a/web/packages/teleport/src/Discover/SelectResource/types.ts +++ b/web/packages/teleport/src/Discover/SelectResource/types.ts @@ -18,7 +18,8 @@ import { Platform } from 'design/platform'; -import { ClusterResource } from 'teleport/services/userPreferences/types'; +import { Resource } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + import { AuthType } from 'teleport/services/user'; import { ResourceKind } from '../Shared/ResourceKind'; @@ -132,6 +133,6 @@ export enum SearchResource { } export type PrioritizedResources = { - preferredResources: ClusterResource[]; + preferredResources: Resource[]; hasPreferredResources: boolean; }; diff --git a/web/packages/teleport/src/Discover/Shared/ResourceKind.ts b/web/packages/teleport/src/Discover/Shared/ResourceKind.ts index 4b854326eb6be..be6d3ba2e93a0 100644 --- a/web/packages/teleport/src/Discover/Shared/ResourceKind.ts +++ b/web/packages/teleport/src/Discover/Shared/ResourceKind.ts @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import { ClusterResource } from 'teleport/services/userPreferences/types'; +import { Resource } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; import type { JoinRole } from 'teleport/services/joinToken'; @@ -50,23 +50,21 @@ export function resourceKindToJoinRole(kind: ResourceKind): JoinRole { } } -export function resourceKindToPreferredResource( - kind: ResourceKind -): ClusterResource { +export function resourceKindToPreferredResource(kind: ResourceKind): Resource { switch (kind) { case ResourceKind.Application: - return ClusterResource.RESOURCE_WEB_APPLICATIONS; + return Resource.WEB_APPLICATIONS; case ResourceKind.Database: - return ClusterResource.RESOURCE_DATABASES; + return Resource.DATABASES; case ResourceKind.Desktop: - return ClusterResource.RESOURCE_WINDOWS_DESKTOPS; + return Resource.WINDOWS_DESKTOPS; case ResourceKind.Kubernetes: - return ClusterResource.RESOURCE_KUBERNETES; + return Resource.KUBERNETES; case ResourceKind.Server: - return ClusterResource.RESOURCE_SERVER_SSH; + return Resource.SERVER_SSH; case ResourceKind.Discovery: - return ClusterResource.RESOURCE_UNSPECIFIED; + return Resource.UNSPECIFIED; case ResourceKind.ConnectMyComputer: - return ClusterResource.RESOURCE_SERVER_SSH; + return Resource.SERVER_SSH; } } diff --git a/web/packages/teleport/src/Main/Main.tsx b/web/packages/teleport/src/Main/Main.tsx index 3022f0607d16f..f9a13c4522689 100644 --- a/web/packages/teleport/src/Main/Main.tsx +++ b/web/packages/teleport/src/Main/Main.tsx @@ -37,6 +37,8 @@ import { matchPath, useHistory } from 'react-router'; import Dialog from 'design/Dialog'; import { sharedStyles } from 'design/theme/themes/sharedStyles'; +import { AssistViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/assist_pb'; + import { Redirect, Route, Switch } from 'teleport/components/Router'; import { CatchError } from 'teleport/components/CatchError'; import cfg from 'teleport/config'; @@ -54,7 +56,6 @@ import { import { NavigationCategory } from 'teleport/Navigation/categories'; import { TopBarProps } from 'teleport/TopBar/TopBar'; import { useUser } from 'teleport/User/UserContext'; -import { ViewMode } from 'teleport/Assist/types'; import { QuestionnaireProps } from 'teleport/Welcome/NewCredentials'; import { MainContainer } from './MainContainer'; @@ -196,7 +197,7 @@ export function Main(props: MainProps) { diff --git a/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx b/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx index cb035aa69526d..0799197a4f329 100644 --- a/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx +++ b/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx @@ -27,9 +27,10 @@ import { useUnifiedResourcesFetch, UnifiedResourcesPinning, } from 'shared/components/UnifiedResources'; -import { DefaultTab } from 'shared/services/unifiedResourcePreferences'; import { ClusterDropdown } from 'shared/components/ClusterDropdown/ClusterDropdown'; +import { DefaultTab } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; + import useStickyClusterId from 'teleport/useStickyClusterId'; import { storageService } from 'teleport/services/storageService'; import { useUser } from 'teleport/User/UserContext'; @@ -123,8 +124,7 @@ function ClusterResources({ dir: 'ASC', }, pinnedOnly: - preferences?.unifiedResourcePreferences?.defaultTab === - DefaultTab.DEFAULT_TAB_PINNED, + preferences?.unifiedResourcePreferences?.defaultTab === DefaultTab.PINNED, }); const getCurrentClusterPinnedResources = useCallback( diff --git a/web/packages/teleport/src/User/UserContext.test.tsx b/web/packages/teleport/src/User/UserContext.test.tsx index dbce69b748ad8..62a7b7ac9122a 100644 --- a/web/packages/teleport/src/User/UserContext.test.tsx +++ b/web/packages/teleport/src/User/UserContext.test.tsx @@ -26,11 +26,12 @@ import { render, screen, waitFor } from '@testing-library/react'; import '@testing-library/jest-dom'; +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; + import cfg from 'teleport/config'; import { UserContextProvider } from 'teleport/User'; -import { ThemePreference } from 'teleport/services/userPreferences/types'; import { useUser } from 'teleport/User/UserContext'; import { KeysEnum } from 'teleport/services/storageService'; @@ -38,9 +39,7 @@ function ThemeName() { const { preferences } = useUser(); return ( -
- theme: {preferences.theme === ThemePreference.Light ? 'light' : 'dark'} -
+
theme: {preferences.theme === Theme.LIGHT ? 'light' : 'dark'}
); } @@ -49,7 +48,7 @@ describe('user context - success state', () => { rest.get(cfg.api.userPreferencesPath, (req, res, ctx) => { return res( ctx.json({ - theme: ThemePreference.Light, + theme: Theme.LIGHT, assist: {}, }) ); @@ -76,7 +75,7 @@ describe('user context - success state', () => { }); it('should migrate the previous theme setting from local storage', async () => { - let updateBody: { theme?: ThemePreference } = {}; + let updateBody: { theme?: Theme } = {}; server.use( rest.put(cfg.api.userPreferencesPath, async (req, res, ctx) => { @@ -96,7 +95,7 @@ describe('user context - success state', () => { ); - await waitFor(() => expect(updateBody.theme).toEqual(ThemePreference.Dark)); + await waitFor(() => expect(updateBody.theme).toEqual(Theme.DARK)); const theme = await screen.findByText(/theme: dark/i); diff --git a/web/packages/teleport/src/User/UserContext.tsx b/web/packages/teleport/src/User/UserContext.tsx index 5b5146be8eb81..7a1eb47a51359 100644 --- a/web/packages/teleport/src/User/UserContext.tsx +++ b/web/packages/teleport/src/User/UserContext.tsx @@ -30,6 +30,12 @@ import useAttempt from 'shared/hooks/useAttemptNext'; import { Indicator } from 'design'; +import { UserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/userpreferences_pb'; + +import { ClusterUserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/cluster_preferences_pb'; + +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; + import { StyledIndicator } from 'teleport/Main'; import * as service from 'teleport/services/userPreferences'; @@ -37,18 +43,10 @@ import cfg from 'teleport/config'; import { KeysEnum, storageService } from 'teleport/services/storageService'; -import { - deprecatedThemeToThemePreference, - ThemePreference, -} from 'teleport/services/userPreferences/types'; +import { deprecatedThemeToThemePreference } from 'teleport/services/userPreferences/types'; import { makeDefaultUserPreferences } from 'teleport/services/userPreferences/userPreferences'; -import type { - UserClusterPreferences, - UserPreferences, -} from 'teleport/services/userPreferences/types'; - export interface UserContextValue { preferences: UserPreferences; updatePreferences: (preferences: Partial) => Promise; @@ -69,7 +67,7 @@ export function UserContextProvider(props: PropsWithChildren) { const { attempt, run } = useAttempt('processing'); // because we have to update cluster preferences with itself during the update // we useRef here to prevent infinite rerenders - const clusterPreferences = useRef>({}); + const clusterPreferences = useRef>({}); const [preferences, setPreferences] = useState( makeDefaultUserPreferences() @@ -80,12 +78,12 @@ export function UserContextProvider(props: PropsWithChildren) { // we know that pinned resources is supported because we've already successfully // fetched their pinned resources once before window.localStorage.removeItem(KeysEnum.PINNED_RESOURCES_NOT_SUPPORTED); - return clusterPreferences.current[clusterId].pinnedResources; + return clusterPreferences.current[clusterId].pinnedResources.resourceIds; } const prefs = await service.getUserClusterPreferences(clusterId); if (prefs) { clusterPreferences.current[clusterId] = prefs; - return prefs.pinnedResources; + return prefs.pinnedResources.resourceIds; } return null; }, []); @@ -95,9 +93,12 @@ export function UserContextProvider(props: PropsWithChildren) { pinnedResources: string[] ) => { if (!clusterPreferences.current[clusterId]) { - clusterPreferences.current[clusterId] = { pinnedResources: [] }; + clusterPreferences.current[clusterId] = { + pinnedResources: { resourceIds: [] }, + }; } - clusterPreferences.current[clusterId].pinnedResources = pinnedResources; + clusterPreferences.current[clusterId].pinnedResources.resourceIds = + pinnedResources; return service.updateUserClusterPreferences(clusterId, { ...preferences, @@ -121,7 +122,7 @@ export function UserContextProvider(props: PropsWithChildren) { if (theme) { preferences.theme = deprecatedThemeToThemePreference(theme); - if (preferences.theme !== ThemePreference.Light) { + if (preferences.theme !== Theme.LIGHT) { // the light theme is the default, so only update the backend if it is not light updatePreferences(preferences); } diff --git a/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.test.tsx b/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.test.tsx index c46e487afb887..d56b6565169a0 100644 --- a/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.test.tsx +++ b/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.test.tsx @@ -28,6 +28,8 @@ import { fireEvent, } from 'design/utils/testing'; +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; + import cfg from 'teleport/config'; import { FeaturesContextProvider } from 'teleport/FeaturesContext'; @@ -38,8 +40,6 @@ import TeleportContext from 'teleport/teleportContext'; import { makeUserContext } from 'teleport/services/user'; -import { ThemePreference } from 'teleport/services/userPreferences/types'; - import { mockUserContextProviderWith } from 'teleport/User/testHelpers/mockUserContextWith'; import { makeTestUserContext } from 'teleport/User/testHelpers/makeTestUserContext'; @@ -49,7 +49,7 @@ const server = setupServer( rest.get(cfg.api.userPreferencesPath, (req, res, ctx) => { return res( ctx.json({ - theme: ThemePreference.Light, + theme: Theme.LIGHT, assist: {}, }) ); diff --git a/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.tsx b/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.tsx index f1d0881a1e0de..1fb88f4d953fa 100644 --- a/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.tsx +++ b/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.tsx @@ -23,11 +23,12 @@ import { Moon, Sun, ChevronDown, Logout as LogoutIcon } from 'design/Icon'; import { Text } from 'design'; import { useRefClickOutside } from 'shared/hooks/useRefClickOutside'; +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; + import session from 'teleport/services/websession'; import { useFeatures } from 'teleport/FeaturesContext'; import { useTeleport } from 'teleport'; import { useUser } from 'teleport/User/UserContext'; -import { ThemePreference } from 'teleport/services/userPreferences/types'; import { Dropdown, DropdownItem, @@ -124,9 +125,7 @@ export function UserMenuNav({ username }: UserMenuNavProps) { const onThemeChange = () => { const nextTheme = - preferences.theme === ThemePreference.Light - ? ThemePreference.Dark - : ThemePreference.Light; + preferences.theme === Theme.LIGHT ? Theme.DARK : Theme.LIGHT; updatePreferences({ theme: nextTheme }); setOpen(false); @@ -180,14 +179,9 @@ export function UserMenuNav({ username }: UserMenuNavProps) { - {preferences.theme === ThemePreference.Dark ? ( - - ) : ( - - )} + {preferences.theme === Theme.DARK ? : } - Switch to{' '} - {preferences.theme === ThemePreference.Dark ? 'Light' : 'Dark'}{' '} + Switch to {preferences.theme === Theme.DARK ? 'Light' : 'Dark'}{' '} Theme diff --git a/web/packages/teleport/src/services/storageService/storageService.ts b/web/packages/teleport/src/services/storageService/storageService.ts index 07b79c6c7c571..090441b1ba6eb 100644 --- a/web/packages/teleport/src/services/storageService/storageService.ts +++ b/web/packages/teleport/src/services/storageService/storageService.ts @@ -18,14 +18,20 @@ import { DeprecatedThemeOption } from 'design/theme/types'; +import { UserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/userpreferences_pb'; + +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; + +import { OnboardUserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; + import { BearerToken } from 'teleport/services/websession'; import { OnboardDiscover } from 'teleport/services/user'; import { - OnboardUserPreferences, - ThemePreference, - UserPreferences, -} from 'teleport/services/userPreferences/types'; + BackendUserPreferences, + convertBackendUserPreferences, + isBackendUserPreferences, +} from 'teleport/services/userPreferences/userPreferences'; import { CloudUserInvites, KeysEnum, LocalStorageSurvey } from './types'; @@ -107,7 +113,17 @@ export const storageService = { getUserPreferences(): UserPreferences { const preferences = window.localStorage.getItem(KeysEnum.USER_PREFERENCES); if (preferences) { - return JSON.parse(preferences); + const parsed: UserPreferences | BackendUserPreferences = + JSON.parse(preferences); + + // TODO(ryan): DELETE in v17: remove reference to `BackendUserPreferences` - all + // locally stored copies of user preferences should be `UserPreferences` by then + // (they are updated on every login) + if (isBackendUserPreferences(parsed)) { + return convertBackendUserPreferences(parsed); + } + + return parsed; } return null; }, @@ -161,7 +177,7 @@ export const storageService = { window.localStorage.removeItem(KeysEnum.CLOUD_USER_INVITES); }, - getThemePreference(): ThemePreference { + getThemePreference(): Theme { const userPreferences = storageService.getUserPreferences(); if (userPreferences) { return userPreferences.theme; @@ -169,10 +185,10 @@ export const storageService = { const theme = this.getDeprecatedThemePreference(); if (theme) { - return theme === 'light' ? ThemePreference.Light : ThemePreference.Dark; + return theme === 'light' ? Theme.LIGHT : Theme.DARK; } - return ThemePreference.Light; + return Theme.LIGHT; }, getOnboardUserPreference(): OnboardUserPreferences { diff --git a/web/packages/teleport/src/services/userPreferences/types.ts b/web/packages/teleport/src/services/userPreferences/types.ts index fcc2017b3b45f..3bb2bffa347c6 100644 --- a/web/packages/teleport/src/services/userPreferences/types.ts +++ b/web/packages/teleport/src/services/userPreferences/types.ts @@ -18,23 +18,7 @@ import { DeprecatedThemeOption } from 'design/theme'; -import type { UnifiedResourcePreferences } from 'shared/services/unifiedResourcePreferences'; - -import type { AssistUserPreferences } from 'teleport/Assist/types'; - -export enum ThemePreference { - Light = 1, - Dark = 2, -} - -export enum ClusterResource { - RESOURCE_UNSPECIFIED = 0, - RESOURCE_WINDOWS_DESKTOPS = 1, - RESOURCE_SERVER_SSH = 2, - RESOURCE_DATABASES = 3, - RESOURCE_KUBERNETES = 4, - RESOURCE_WEB_APPLICATIONS = 5, -} +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; export type MarketingParams = { campaign: string; @@ -43,36 +27,13 @@ export type MarketingParams = { intent: string; }; -export type OnboardUserPreferences = { - preferredResources: ClusterResource[]; - marketingParams: MarketingParams; -}; - -export interface UserPreferences { - theme: ThemePreference; - assist: AssistUserPreferences; - onboard: OnboardUserPreferences; - clusterPreferences: UserClusterPreferences; - unifiedResourcePreferences: UnifiedResourcePreferences; -} - -// UserClusterPreferences are user preferences that are -// different per cluster. -export interface UserClusterPreferences { - // pinnedResources is an array of resource IDs. - pinnedResources: string[]; -} - -export type GetUserClusterPreferencesResponse = UserClusterPreferences; -export type GetUserPreferencesResponse = UserPreferences; - export function deprecatedThemeToThemePreference( theme: DeprecatedThemeOption -): ThemePreference { +): Theme { switch (theme) { case 'light': - return ThemePreference.Light; + return Theme.LIGHT; case 'dark': - return ThemePreference.Dark; + return Theme.DARK; } } diff --git a/web/packages/teleport/src/services/userPreferences/userPreferences.test.ts b/web/packages/teleport/src/services/userPreferences/userPreferences.test.ts new file mode 100644 index 0000000000000..d32b766245060 --- /dev/null +++ b/web/packages/teleport/src/services/userPreferences/userPreferences.test.ts @@ -0,0 +1,74 @@ +/** + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; +import { UserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/userpreferences_pb'; + +import { + BackendUserPreferences, + convertBackendUserPreferences, + convertUserPreferences, + isBackendUserPreferences, +} from 'teleport/services/userPreferences/userPreferences'; + +test('should convert the old cluster user preferences format to the new one', () => { + // this is how the backend currently returns cluster preferences - as an array of strings + // instead of the protobuf representation of an object with a `resourceIds` field that contains + // that array of strings + const oldBackendPreferences: BackendUserPreferences = { + theme: Theme.LIGHT, + clusterPreferences: { + pinnedResources: ['resource1', 'resource2'], + }, + }; + + const actualUserPreferences: UserPreferences = { + theme: Theme.LIGHT, + clusterPreferences: { + pinnedResources: { resourceIds: ['resource1', 'resource2'] }, + }, + }; + + // when we grab the user preferences from the local storage, we check if it is in the old format + expect(isBackendUserPreferences(oldBackendPreferences)).toBe(true); + expect(isBackendUserPreferences(actualUserPreferences)).toBe(false); + + // and convert it to the new format if it is + const newPreferences = convertBackendUserPreferences(oldBackendPreferences); + + expect(newPreferences.clusterPreferences.pinnedResources.resourceIds).toEqual( + oldBackendPreferences.clusterPreferences.pinnedResources + ); +}); + +test('should convert the user preferences back to the old format when updating', () => { + // the backend still expects the old format when updating user preferences + + const actualUserPreferences: UserPreferences = { + theme: Theme.LIGHT, + clusterPreferences: { + pinnedResources: { resourceIds: ['resource1', 'resource2'] }, + }, + }; + + const convertedPreferences = convertUserPreferences(actualUserPreferences); + + expect(convertedPreferences.clusterPreferences.pinnedResources).toEqual( + actualUserPreferences.clusterPreferences.pinnedResources.resourceIds + ); +}); diff --git a/web/packages/teleport/src/services/userPreferences/userPreferences.ts b/web/packages/teleport/src/services/userPreferences/userPreferences.ts index 2c4faa5654bbb..dcfb0cf9bb3c7 100644 --- a/web/packages/teleport/src/services/userPreferences/userPreferences.ts +++ b/web/packages/teleport/src/services/userPreferences/userPreferences.ts @@ -16,40 +16,63 @@ * along with this program. If not, see . */ -import * as unifiedResourcePreferences from 'shared/services/unifiedResourcePreferences'; +import { + DefaultTab, + LabelsViewMode, + UnifiedResourcePreferences, + ViewMode, +} from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; + +import { + AssistUserPreferences, + AssistViewMode, +} from 'gen-proto-ts/teleport/userpreferences/v1/assist_pb'; + +import { UserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/userpreferences_pb'; + +import { ClusterUserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/cluster_preferences_pb'; + +import { Theme } from 'gen-proto-ts/teleport/userpreferences/v1/theme_pb'; + +import { OnboardUserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/onboard_pb'; import cfg from 'teleport/config'; import api from 'teleport/services/api'; -import { ViewMode } from 'teleport/Assist/types'; import { KeysEnum } from '../storageService'; -import { ThemePreference } from './types'; +interface BackendClusterUserPreferences { + pinnedResources?: string[]; +} -import type { - GetUserPreferencesResponse, - UserClusterPreferences, - UserPreferences, -} from 'teleport/services/userPreferences/types'; +export interface BackendUserPreferences { + assist?: AssistUserPreferences; + theme: Theme; + onboard?: OnboardUserPreferences; + clusterPreferences?: BackendClusterUserPreferences; + unifiedResourcePreferences?: UnifiedResourcePreferences; +} -export async function getUserPreferences() { - const res: GetUserPreferencesResponse = await api.get( +export async function getUserPreferences(): Promise { + const res: BackendUserPreferences = await api.get( cfg.api.userPreferencesPath ); - return res; + return convertBackendUserPreferences(res); } -export async function getUserClusterPreferences(clusterId: string) { +export async function getUserClusterPreferences( + clusterId: string +): Promise { return await api .get(cfg.getUserClusterPreferencesUrl(clusterId)) - .then(res => { + .then((res: BackendClusterUserPreferences) => { // TODO (avatus) DELETE IN 16 // this item is used to disabled the pinned resources button if they // haven't upgraded to 14.1.0 yet. Anything lower than 14 doesn't matter // because the unified resource view isn't enabled so pinning isn't there either localStorage.removeItem(KeysEnum.PINNED_RESOURCES_NOT_SUPPORTED); - return res; + return convertBackendClusterUserPreferences(res); }) .catch(res => { if (res.response?.status === 403 || res.response?.status === 404) { @@ -68,18 +91,24 @@ export function updateUserClusterPreferences( clusterId: string, preferences: UserPreferences ) { - return api.put(cfg.getUserClusterPreferencesUrl(clusterId), preferences); + return api.put( + cfg.getUserClusterPreferencesUrl(clusterId), + convertUserPreferences(preferences) + ); } export function updateUserPreferences(preferences: Partial) { - return api.put(cfg.api.userPreferencesPath, preferences); + return api.put( + cfg.api.userPreferencesPath, + convertUserPreferences(preferences as UserPreferences) + ); } export function makeDefaultUserPreferences(): UserPreferences { return { - theme: ThemePreference.Light, + theme: Theme.LIGHT, assist: { - viewMode: ViewMode.Docked, + viewMode: AssistViewMode.DOCKED, preferredLogins: [], }, onboard: { @@ -92,17 +121,61 @@ export function makeDefaultUserPreferences(): UserPreferences { }, }, unifiedResourcePreferences: { - defaultTab: unifiedResourcePreferences.DefaultTab.DEFAULT_TAB_ALL, - viewMode: unifiedResourcePreferences.ViewMode.VIEW_MODE_CARD, - labelsViewMode: - unifiedResourcePreferences.LabelsViewMode.LABELS_VIEW_MODE_COLLAPSED, + defaultTab: DefaultTab.ALL, + viewMode: ViewMode.CARD, + labelsViewMode: LabelsViewMode.COLLAPSED, }, clusterPreferences: makeDefaultUserClusterPreferences(), }; } -export function makeDefaultUserClusterPreferences(): UserClusterPreferences { +export function makeDefaultUserClusterPreferences(): ClusterUserPreferences { return { - pinnedResources: [], + pinnedResources: { + resourceIds: [], + }, }; } + +export function convertUserPreferences( + preferences: UserPreferences +): BackendUserPreferences { + return { + ...preferences, + clusterPreferences: { + ...preferences.clusterPreferences, + pinnedResources: + preferences.clusterPreferences?.pinnedResources?.resourceIds ?? [], + }, + }; +} + +export function convertBackendUserPreferences( + preferences: BackendUserPreferences +): UserPreferences { + return { + ...preferences, + clusterPreferences: convertBackendClusterUserPreferences( + preferences.clusterPreferences + ), + }; +} + +export function convertBackendClusterUserPreferences( + clusterPreferences: BackendClusterUserPreferences +): ClusterUserPreferences { + return { + ...clusterPreferences, + pinnedResources: { + resourceIds: clusterPreferences?.pinnedResources ?? [], + }, + }; +} + +export function isBackendUserPreferences( + preferences: UserPreferences | BackendUserPreferences +): preferences is BackendUserPreferences { + return Array.isArray( + (preferences as BackendUserPreferences).clusterPreferences?.pinnedResources + ); +} diff --git a/web/packages/teleterm/babel.config.js b/web/packages/teleterm/babel.config.js index 69365ad001626..7ae725ec5ca2f 100644 --- a/web/packages/teleterm/babel.config.js +++ b/web/packages/teleterm/babel.config.js @@ -1,11 +1,4 @@ const baseCfg = require('@gravitational/build/.babelrc'); - -baseCfg.presets = [ - ['@babel/preset-env', { targets: { node: 'current' } }], - ['@babel/preset-react', { runtime: 'automatic' }], - '@babel/preset-typescript', -]; - module.exports = function (api) { api.cache(true); return baseCfg; diff --git a/web/packages/teleterm/csp.ts b/web/packages/teleterm/csp.ts new file mode 100644 index 0000000000000..e2ad7a5634179 --- /dev/null +++ b/web/packages/teleterm/csp.ts @@ -0,0 +1,42 @@ +/** + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +export function getConnectCsp(development: boolean) { + // feedbackAddress needs to be kept in sync with the same property in staticConfig.ts. + const feedbackAddress = development + ? 'https://kcwm2is93l.execute-api.us-west-2.amazonaws.com/prod' + : 'https://usage.teleport.dev'; + + let csp = ` +default-src 'self'; +connect-src 'self' ${feedbackAddress}; +style-src 'self' 'unsafe-inline'; +img-src 'self' data: blob:; +object-src 'none'; +font-src 'self' data:; +` + .replaceAll('\n', ' ') + .trim(); + + if (development) { + // Required to make source maps work in dev mode. + csp += " script-src 'self' 'unsafe-eval' 'unsafe-inline';"; + } + + return csp; +} diff --git a/web/packages/teleterm/electron-builder-config.js b/web/packages/teleterm/electron-builder-config.js index da151c2567f8f..74ac22cddfdf1 100644 --- a/web/packages/teleterm/electron-builder-config.js +++ b/web/packages/teleterm/electron-builder-config.js @@ -71,7 +71,7 @@ module.exports = { } }, files: [ - 'build/app/dist', + 'build/app', // node-pty creates some files that differ across architecture builds causing // the error "can't reconcile the non-macho files" as they cant be combined // with lipo for a universal build. They aren't needed so skip them. diff --git a/web/packages/teleterm/electron.vite.config.mts b/web/packages/teleterm/electron.vite.config.mts new file mode 100644 index 0000000000000..e83c461e79bea --- /dev/null +++ b/web/packages/teleterm/electron.vite.config.mts @@ -0,0 +1,170 @@ +/** + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { resolve } from 'path'; + +import { existsSync, readFileSync } from 'fs'; + +import react from '@vitejs/plugin-react-swc'; +import tsconfigPaths from 'vite-tsconfig-paths'; +import { defineConfig, externalizeDepsPlugin, UserConfig } from 'electron-vite'; + +import { cspPlugin } from '../build/vite/csp'; + +import { getStyledComponentsConfig } from '../build/vite/styled'; + +import { getConnectCsp } from './csp'; + +const rootDirectory = resolve(__dirname, '../../..'); +const outputDirectory = resolve(__dirname, 'build', 'app'); + +// these dependencies don't play well unless they're externalized +// if Vite complains about a dependency, add it here +const externalizeDeps = ['strip-ansi', 'ansi-regex', 'd3-color']; + +const config = defineConfig(env => { + const tsConfigPathsPlugin = tsconfigPaths({ + projects: [resolve(rootDirectory, 'tsconfig.json')], + }); + + const commonPlugins = [ + externalizeDepsPlugin({ exclude: externalizeDeps }), + tsConfigPathsPlugin, + ]; + + const config: UserConfig = { + main: { + build: { + outDir: resolve(outputDirectory, 'main'), + rollupOptions: { + input: { + index: resolve(__dirname, 'src/main.ts'), + sharedProcess: resolve( + __dirname, + 'src/sharedProcess/sharedProcess.ts' + ), + agentCleanupDaemon: resolve( + __dirname, + 'src/agentCleanupDaemon/agentCleanupDaemon.js' + ), + }, + output: { + manualChunks, + }, + }, + }, + plugins: commonPlugins, + define: { + // It's not common to pre-process Node code with NODE_ENV, but this is what our Webpack + // config used to do, so for compatibility purposes we kept the Vite config this way. + // + // If we were to get rid of this, we'd somehow need to set NODE_ENV when the packaged app + // gets started. + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), + }, + }, + preload: { + build: { + outDir: resolve(outputDirectory, 'preload'), + rollupOptions: { + input: { + index: resolve(__dirname, 'src/preload.ts'), + }, + output: { + manualChunks, + }, + }, + }, + plugins: commonPlugins, + define: { + // Preload is also mean to be run by Node, see the comment for define under main. + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), + }, + }, + renderer: { + root: '.', + build: { + outDir: resolve(outputDirectory, 'renderer'), + rollupOptions: { + input: { + index: resolve(__dirname, 'index.html'), + }, + }, + }, + server: { + host: '0.0.0.0', + port: 8080, + fs: { + allow: [rootDirectory, '.'], + }, + }, + plugins: [ + react({ + plugins: [ + [ + '@swc/plugin-styled-components', + getStyledComponentsConfig(env.mode), + ], + ], + }), + cspPlugin(getConnectCsp(env.mode === 'development')), + tsConfigPathsPlugin, + ], + define: { + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), + }, + }, + }; + + if (env.mode === 'development') { + if (process.env.VITE_HTTPS_KEY && process.env.VITE_HTTPS_CERT) { + config.renderer.server.https = { + key: readFileSync(process.env.VITE_HTTPS_KEY), + cert: readFileSync(process.env.VITE_HTTPS_CERT), + }; + } else { + const certsDirectory = resolve(rootDirectory, 'web/certs'); + + if (!existsSync(certsDirectory)) { + throw new Error( + 'Could not find SSL certificates. Please follow web/README.md to generate certificates.' + ); + } + + const keyPath = resolve(certsDirectory, 'server.key'); + const certPath = resolve(certsDirectory, 'server.crt'); + + config.renderer.server.https = { + key: readFileSync(keyPath), + cert: readFileSync(certPath), + }; + } + } + + return config; +}); + +export { config as default }; + +function manualChunks(id: string) { + for (const dep of externalizeDeps) { + if (id.includes(dep)) { + return dep; + } + } +} diff --git a/web/packages/teleterm/index.html b/web/packages/teleterm/index.html new file mode 100644 index 0000000000000..6768880201364 --- /dev/null +++ b/web/packages/teleterm/index.html @@ -0,0 +1,13 @@ + + + + + + + + + +
+ + + diff --git a/web/packages/teleterm/package.json b/web/packages/teleterm/package.json index ed837faa7b997..4eac15f3f8823 100644 --- a/web/packages/teleterm/package.json +++ b/web/packages/teleterm/package.json @@ -2,7 +2,7 @@ "name": "@gravitational/teleterm", "version": "1.0.0-dev", "description": "Teleport Connect", - "main": "build/app/dist/main/main.js", + "main": "build/app/main/index.js", "author": { "name": "Gravitational, Inc.", "email": "support@goteleport.com", @@ -10,15 +10,13 @@ }, "license": "Apache-2.0", "scripts": { - "start": "yarn build-native-deps && webpack serve --config webpack.renderer.dev.config.js --progress", - "start-main": "webpack build --config webpack.main.config.js --mode=development --progress --watch", + "start": "yarn build-native-deps && yarn start-skip-native-deps", + "start-skip-native-deps": "electron-vite dev", "start-electron": "electron build/app/dist/main/main.js", - "build": "yarn build-main && yarn build-renderer", - "build-main": "webpack build --config webpack.main.config.js --progress --mode=production", - "build-renderer": "webpack build --config webpack.renderer.prod.config.js --progress", + "build": "electron-vite build", "build-native-deps": "electron-builder install-app-deps", "package": "electron-builder build --config electron-builder-config.js --publish never -c.extraMetadata.name=teleport-connect", - "generate-grpc-shared": "npx -y --target_arch=x64 --package=grpc_tools_node_protoc_ts@5.3.2 --package=grpc-tools@1.12.4 -- grpc_tools_node_protoc -I=src/sharedProcess/api/proto --ts_out=service=grpc-node,mode=grpc-js:src/sharedProcess/api/protogen --grpc_out=grpc_js:src/sharedProcess/api/protogen --js_out=import_style=commonjs,binary:src/sharedProcess/api/protogen src/sharedProcess/api/proto/*.proto" + "generate-grpc-shared": "npx -y --target_arch=x64 --package=@protobuf-ts/plugin@2.9.3 -- protoc -I=src/sharedProcess/api/proto --ts_opt long_type_number,eslint_disable,add_pb_suffix,client_grpc1,server_grpc1,ts_nocheck --ts_out=src/sharedProcess/api/protogen src/sharedProcess/api/proto/*.proto" }, "repository": { "type": "git", @@ -28,35 +26,38 @@ "private": true, "homepage": "https://goteleport.com", "dependencies": { - "@types/tar-fs": "^2.0.1", + "@grpc/grpc-js": "1.8.8", + "node-forge": "^1.3.1", "node-pty": "1.1.0-beta5", + "split2": "4.1.0", "strip-ansi": "^7.1.0", - "tar-fs": "^3.0.3" + "tar-fs": "^3.0.3", + "winston": "^3.3.3" }, "devDependencies": { "@gravitational/build": "^1.0.0", "@gravitational/design": "1.0.0", "@gravitational/shared": "1.0.0", - "@grpc/grpc-js": "1.8.8", + "@protobuf-ts/runtime": "^2.9.3", + "@protobuf-ts/runtime-rpc": "^2.9.3", "@types/google-protobuf": "^3.10.0", "@types/node-forge": "^1.0.4", + "@types/tar-fs": "^2.0.1", "@types/whatwg-url": "^11.0.1", "clean-webpack-plugin": "4.0.0", - "cross-env": "5.0.5", "electron": "28.1.1", "electron-notarize": "^1.2.1", + "electron-vite": "^2.0.0", "eslint-import-resolver-webpack": "0.13.2", "eslint-loader": "3.0.3", - "google-protobuf": "^3.20.1", + "google-protobuf": "^3.21.2", "immer": "^9.0.7", "jest-canvas-mock": "^2.3.1", - "node-forge": "^1.3.1", "react-dnd": "^14.0.4", "react-dnd-html5-backend": "^14.0.2", - "split2": "4.1.0", "ts-loader": "^9.4.2", + "vite-plugin-commonjs": "^0.10.1", "whatwg-url": "^13.0.0", - "winston": "^3.3.3", "xterm": "^5.3.0", "xterm-addon-fit": "^0.8.0", "zod": "^3.22.3", diff --git a/web/packages/teleterm/src/helpers.ts b/web/packages/teleterm/src/helpers.ts new file mode 100644 index 0000000000000..74d117dbcff96 --- /dev/null +++ b/web/packages/teleterm/src/helpers.ts @@ -0,0 +1,198 @@ +/** + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// ExcludesFalse is a method that can be used instead of [].filter(Boolean) +// this removes the false values from the array type +import { PaginatedResource } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb'; +import { Server } from 'gen-proto-ts/teleport/lib/teleterm/v1/server_pb'; +import { Database } from 'gen-proto-ts/teleport/lib/teleterm/v1/database_pb'; +import { App } from 'gen-proto-ts/teleport/lib/teleterm/v1/app_pb'; +import { Kube } from 'gen-proto-ts/teleport/lib/teleterm/v1/kube_pb'; + +import * as prehog from 'gen-proto-ts/prehog/v1alpha/connect_pb'; + +import { + PtyClientEvent, + PtyEventData, + PtyEventExit, + PtyEventResize, + PtyEventStart, + PtyEventStartError, + PtyServerEvent, +} from 'teleterm/sharedProcess/api/protogen/ptyHostService_pb'; + +export function resourceOneOfIsServer( + resource: PaginatedResource['resource'] +): resource is { + oneofKind: 'server'; + server: Server; +} { + return resource.oneofKind === 'server'; +} + +export function resourceOneOfIsDatabase( + resource: PaginatedResource['resource'] +): resource is { + oneofKind: 'database'; + database: Database; +} { + return resource.oneofKind === 'database'; +} + +export function resourceOneOfIsApp( + resource: PaginatedResource['resource'] +): resource is { + oneofKind: 'app'; + app: App; +} { + return resource.oneofKind === 'app'; +} + +export function resourceOneOfIsKube( + resource: PaginatedResource['resource'] +): resource is { + oneofKind: 'kube'; + kube: Kube; +} { + return resource.oneofKind === 'kube'; +} + +export function ptyEventOneOfIsStart( + event: PtyClientEvent['event'] | PtyServerEvent['event'] +): event is { + oneofKind: 'start'; + start: PtyEventStart; +} { + return event.oneofKind === 'start'; +} + +export function ptyEventOneOfIsData( + event: PtyClientEvent['event'] | PtyServerEvent['event'] +): event is { + oneofKind: 'data'; + data: PtyEventData; +} { + return event.oneofKind === 'data'; +} + +export function ptyEventOneOfIsResize( + event: PtyClientEvent['event'] | PtyServerEvent['event'] +): event is { + oneofKind: 'resize'; + resize: PtyEventResize; +} { + return event.oneofKind === 'resize'; +} + +export function ptyEventOneOfIsExit( + event: PtyClientEvent['event'] | PtyServerEvent['event'] +): event is { + oneofKind: 'exit'; + exit: PtyEventExit; +} { + return event.oneofKind === 'exit'; +} +export function ptyEventOneOfIsStartError( + event: PtyClientEvent['event'] | PtyServerEvent['event'] +): event is { + oneofKind: 'startError'; + startError: PtyEventStartError; +} { + return event.oneofKind === 'startError'; +} + +export function connectEventOneOfIsClusterLogin( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'clusterLogin'; + clusterLogin: prehog.ConnectClusterLoginEvent; +} { + return event.oneofKind === 'clusterLogin'; +} + +export function connectEventOneOfIsProtocolUse( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'protocolUse'; + protocolUse: prehog.ConnectProtocolUseEvent; +} { + return event.oneofKind === 'protocolUse'; +} + +export function connectEventOneOfIsAccessRequestCreate( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'accessRequestCreate'; + accessRequestCreate: prehog.ConnectAccessRequestCreateEvent; +} { + return event.oneofKind === 'accessRequestCreate'; +} + +export function connectEventOneOfIsAccessRequestReview( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'accessRequestReview'; + accessRequestReview: prehog.ConnectAccessRequestReviewEvent; +} { + return event.oneofKind === 'accessRequestReview'; +} + +export function connectEventOneOfIsAccessRequestAssumeRole( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'accessRequestAssumeRole'; + accessRequestAssumeRole: prehog.ConnectAccessRequestAssumeRoleEvent; +} { + return event.oneofKind === 'accessRequestAssumeRole'; +} + +export function connectEventOneOfIsFileTransferRun( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'fileTransferRun'; + fileTransferRun: prehog.ConnectFileTransferRunEvent; +} { + return event.oneofKind === 'fileTransferRun'; +} + +export function connectEventOneOfIsUserJobRoleUpdate( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'userJobRoleUpdate'; + userJobRoleUpdate: prehog.ConnectUserJobRoleUpdateEvent; +} { + return event.oneofKind === 'userJobRoleUpdate'; +} + +export function connectEventOneOfIsConnectMyComputerSetup( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'connectMyComputerSetup'; + connectMyComputerSetup: prehog.ConnectConnectMyComputerSetup; +} { + return event.oneofKind === 'connectMyComputerSetup'; +} + +export function connectEventOneOfIsConnectMyComputerAgentStart( + event: prehog.SubmitConnectEventRequest['event'] +): event is { + oneofKind: 'connectMyComputerAgentStart'; + connectMyComputerAgentStart: prehog.ConnectConnectMyComputerAgentStart; +} { + return event.oneofKind === 'connectMyComputerAgentStart'; +} diff --git a/web/packages/teleterm/src/main.ts b/web/packages/teleterm/src/main.ts index 54ea4d2c7027a..c3c69bc00f04d 100644 --- a/web/packages/teleterm/src/main.ts +++ b/web/packages/teleterm/src/main.ts @@ -91,6 +91,7 @@ function initializeApp(): void { windowsManager, }); + //TODO(gzdunek): Make sure this is not needed after migrating to Vite. app.on( 'certificate-error', (event, webContents, url, error, certificate, callback) => { @@ -201,6 +202,10 @@ function initializeApp(): void { // https://github.com/electron/electron/blob/v17.2.0/docs/tutorial/security.md#12-verify-webview-options-before-creation app.on('web-contents-created', (_, contents) => { contents.on('will-navigate', (event, navigationUrl) => { + // Allow reloading the renderer app in dev mode. + if (settings.dev && new URL(navigationUrl).host === 'localhost:8080') { + return; + } logger.warn(`Navigation to ${navigationUrl} blocked by 'will-navigate'`); event.preventDefault(); }); diff --git a/web/packages/teleterm/src/mainProcess/runtimeSettings.ts b/web/packages/teleterm/src/mainProcess/runtimeSettings.ts index 6093e1d99dd7b..f757bf22353c9 100644 --- a/web/packages/teleterm/src/mainProcess/runtimeSettings.ts +++ b/web/packages/teleterm/src/mainProcess/runtimeSettings.ts @@ -36,13 +36,13 @@ const RESOURCES_PATH = app.isPackaged : path.join(__dirname, '../../../../'); const TSH_BIN_ENV_VAR = 'CONNECT_TSH_BIN_PATH'; -// __dirname of this file in dev mode is webapps/packages/teleterm/build/app/dist/main -// We default to webapps/../teleport/build/tsh. +// __dirname of this file in dev mode is teleport/web/packages/teleterm/build/app/main +// We default to teleport/build/tsh. // prettier-ignore const TSH_BIN_DEFAULT_PATH_FOR_DEV = path.resolve( __dirname, - '..', '..', '..', '..', '..', '..', '..', '..', - 'teleport', 'build', 'tsh', + '..', '..', '..', '..', '..', '..', + 'build', 'tsh', ); // Refer to the docs of RuntimeSettings type for an explanation behind dev, debug and insecure. diff --git a/web/packages/teleterm/src/mainProcess/windowsManager.ts b/web/packages/teleterm/src/mainProcess/windowsManager.ts index 720efecf79c89..01281ba77397f 100644 --- a/web/packages/teleterm/src/mainProcess/windowsManager.ts +++ b/web/packages/teleterm/src/mainProcess/windowsManager.ts @@ -121,7 +121,7 @@ export class WindowsManager { contextIsolation: true, nodeIntegration: false, sandbox: false, - preload: path.join(__dirname, 'preload.js'), + preload: path.join(__dirname, '../preload/index.js'), }, }); diff --git a/web/packages/teleterm/src/services/pty/ptyHost/ptyEventsStreamHandler.ts b/web/packages/teleterm/src/services/pty/ptyHost/ptyEventsStreamHandler.ts index b7b631880c243..ef0fdf9a07c83 100644 --- a/web/packages/teleterm/src/services/pty/ptyHost/ptyEventsStreamHandler.ts +++ b/web/packages/teleterm/src/services/pty/ptyHost/ptyEventsStreamHandler.ts @@ -27,6 +27,11 @@ import { PtyEventStart, PtyServerEvent, } from 'teleterm/sharedProcess/ptyHost'; +import { + ptyEventOneOfIsData, + ptyEventOneOfIsExit, + ptyEventOneOfIsStartError, +} from 'teleterm/helpers'; export class PtyEventsStreamHandler { private logger: Logger; @@ -46,23 +51,34 @@ export class PtyEventsStreamHandler { this.logger.info('Start'); this.writeOrThrow( - new PtyClientEvent().setStart( - new PtyEventStart().setColumns(columns).setRows(rows) - ) + PtyClientEvent.create({ + event: { + oneofKind: 'start', + start: PtyEventStart.create({ columns, rows }), + }, + }) ); } write(data: string): void { this.writeOrThrow( - new PtyClientEvent().setData(new PtyEventData().setMessage(data)) + PtyClientEvent.create({ + event: { + oneofKind: 'data', + data: PtyEventData.create({ message: data }), + }, + }) ); } resize(columns: number, rows: number): void { this.writeOrThrow( - new PtyClientEvent().setResize( - new PtyEventResize().setColumns(columns).setRows(rows) - ) + PtyClientEvent.create({ + event: { + oneofKind: 'resize', + resize: PtyEventResize.create({ columns, rows }), + }, + }) ); } @@ -80,7 +96,7 @@ export class PtyEventsStreamHandler { onOpen(callback: () => void): RemoveListenerFunction { return this.addDataListenerAndReturnRemovalFunction( (event: PtyServerEvent) => { - if (event.hasOpen()) { + if (event.event.oneofKind === 'open') { callback(); } } @@ -90,8 +106,8 @@ export class PtyEventsStreamHandler { onData(callback: (data: string) => void): RemoveListenerFunction { return this.addDataListenerAndReturnRemovalFunction( (event: PtyServerEvent) => { - if (event.hasData()) { - callback(event.getData().getMessage()); + if (ptyEventOneOfIsData(event.event)) { + callback(event.event.data.message); } } ); @@ -102,9 +118,9 @@ export class PtyEventsStreamHandler { ): RemoveListenerFunction { return this.addDataListenerAndReturnRemovalFunction( (event: PtyServerEvent) => { - if (event.hasExit()) { - this.logger.info('On exit', event.getExit().toObject()); - callback(event.getExit().toObject()); + if (ptyEventOneOfIsExit(event.event)) { + this.logger.info('On exit', event.event.exit); + callback(event.event.exit); } } ); @@ -113,12 +129,9 @@ export class PtyEventsStreamHandler { onStartError(callback: (message: string) => void): RemoveListenerFunction { return this.addDataListenerAndReturnRemovalFunction( (event: PtyServerEvent) => { - if (event.hasStartError()) { - this.logger.info( - 'On start error', - event.getStartError().toObject().message - ); - callback(event.getStartError().toObject().message); + if (ptyEventOneOfIsStartError(event.event)) { + this.logger.info('On start error', event.event.startError.message); + callback(event.event.startError.message); } } ); diff --git a/web/packages/teleterm/src/services/pty/ptyHost/ptyHostClient.ts b/web/packages/teleterm/src/services/pty/ptyHost/ptyHostClient.ts index 0964eb7ef8295..74c9dfd90fa29 100644 --- a/web/packages/teleterm/src/services/pty/ptyHost/ptyHostClient.ts +++ b/web/packages/teleterm/src/services/pty/ptyHost/ptyHostClient.ts @@ -17,7 +17,6 @@ */ import { ChannelCredentials, Metadata } from '@grpc/grpc-js'; -import { Struct } from 'google-protobuf/google/protobuf/struct_pb'; import { PtyHostClient as GrpcClient, @@ -25,6 +24,8 @@ import { PtyId, } from 'teleterm/sharedProcess/ptyHost'; +import { Struct } from 'teleterm/sharedProcess/api/protogen/google/protobuf/struct_pb'; + import { PtyHostClient } from '../types'; import { PtyEventsStreamHandler } from './ptyEventsStreamHandler'; @@ -36,16 +37,17 @@ export function createPtyHostClient( const client = new GrpcClient(address, credentials); return { createPtyProcess(ptyOptions) { - const request = new PtyCreate() - .setArgsList(ptyOptions.args) - .setPath(ptyOptions.path) - .setEnv(Struct.fromJavaScript(ptyOptions.env)); + const request = PtyCreate.create({ + args: ptyOptions.args, + path: ptyOptions.path, + env: Struct.fromJson(ptyOptions.env), + }); if (ptyOptions.cwd) { - request.setCwd(ptyOptions.cwd); + request.cwd = ptyOptions.cwd; } if (ptyOptions.initMessage) { - request.setInitMessage(ptyOptions.initMessage); + request.initMessage = ptyOptions.initMessage; } return new Promise((resolve, reject) => { @@ -53,18 +55,18 @@ export function createPtyHostClient( if (error) { reject(error); } else { - resolve(response.toObject().id); + resolve(response.id); } }); }); }, getCwd(ptyId) { return new Promise((resolve, reject) => { - client.getCwd(new PtyId().setId(ptyId), (error, response) => { + client.getCwd(PtyId.create({ id: ptyId }), (error, response) => { if (error) { reject(error); } else { - resolve(response.toObject().cwd); + resolve(response.cwd); } }); }); diff --git a/web/packages/teleterm/src/services/tshd/createClient.ts b/web/packages/teleterm/src/services/tshd/createClient.ts index 9b3218a876bd0..92d0865a72fdc 100644 --- a/web/packages/teleterm/src/services/tshd/createClient.ts +++ b/web/packages/teleterm/src/services/tshd/createClient.ts @@ -17,31 +17,39 @@ */ import grpc from '@grpc/grpc-js'; -import * as api from 'gen-proto-js/teleport/lib/teleterm/v1/service_pb'; -import { UserPreferences } from 'gen-proto-js/teleport/userpreferences/v1/userpreferences_pb'; +import * as api from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb'; +import { TerminalServiceClient } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb.grpc-client'; +import { UserPreferences } from 'gen-proto-ts/teleport/userpreferences/v1/userpreferences_pb'; import { ClusterUserPreferences, PinnedResourcesUserPreferences, -} from 'gen-proto-js/teleport/userpreferences/v1/cluster_preferences_pb'; -import { UnifiedResourcePreferences } from 'gen-proto-js/teleport/userpreferences/v1/unified_resource_preferences_pb'; -import { TerminalServiceClient } from 'gen-proto-js/teleport/lib/teleterm/v1/service_grpc_pb'; +} from 'gen-proto-ts/teleport/userpreferences/v1/cluster_preferences_pb'; +import { UnifiedResourcePreferences } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; import { AccessRequest, ResourceID, -} from 'gen-proto-js/teleport/lib/teleterm/v1/access_request_pb'; +} from 'gen-proto-ts/teleport/lib/teleterm/v1/access_request_pb'; import Logger from 'teleterm/logger'; import * as uri from 'teleterm/ui/uri'; +import { + resourceOneOfIsApp, + resourceOneOfIsDatabase, + resourceOneOfIsKube, + resourceOneOfIsServer, +} from 'teleterm/helpers'; + import { createFileTransferStream } from './createFileTransferStream'; import middleware, { withLogging } from './middleware'; import * as types from './types'; -import createAbortController from './createAbortController'; -import { mapUsageEvent } from './mapUsageEvent'; import { ReportUsageEventRequest, + UnifiedResourceResponse, UpdateHeadlessAuthenticationStateParams, } from './types'; +import createAbortController from './createAbortController'; +import { mapUsageEvent } from './mapUsageEvent'; export function createTshdClient( addr: string, @@ -57,7 +65,7 @@ export function createTshdClient( createAbortController, async logout(clusterUri: uri.RootClusterUri) { - const req = new api.LogoutRequest().setClusterUri(clusterUri); + const req = api.LogoutRequest.create({ clusterUri }); return new Promise((resolve, reject) => { tshd.logout(req, err => { if (err) { @@ -78,16 +86,17 @@ export function createTshdClient( startKey, limit, }: types.GetResourcesParams) { - const req = new api.GetKubesRequest() - .setClusterUri(clusterUri) - .setSearchAsRoles(searchAsRoles) - .setStartKey(startKey) - .setSearch(search) - .setQuery(query) - .setLimit(limit); + const req = api.GetKubesRequest.create({ + clusterUri, + searchAsRoles, + startKey, + search, + query, + limit, + }); if (sort) { - req.setSortBy(`${sort.fieldName}:${sort.dir.toLowerCase()}`); + req.sortBy = `${sort.fieldName}:${sort.dir.toLowerCase()}`; } return new Promise((resolve, reject) => { @@ -95,7 +104,7 @@ export function createTshdClient( if (err) { reject(err); } else { - resolve(response.toObject() as types.GetKubesResponse); + resolve(response as types.GetKubesResponse); } }); }); @@ -110,16 +119,17 @@ export function createTshdClient( startKey, limit, }: types.GetResourcesParams) { - const req = new api.GetAppsRequest() - .setClusterUri(clusterUri) - .setSearchAsRoles(searchAsRoles) - .setStartKey(startKey) - .setSearch(search) - .setQuery(query) - .setLimit(limit); + const req = api.GetAppsRequest.create({ + clusterUri, + searchAsRoles, + startKey, + search, + query, + limit, + }); if (sort) { - req.setSortBy(`${sort.fieldName}:${sort.dir.toLowerCase()}`); + req.sortBy = `${sort.fieldName}:${sort.dir.toLowerCase()}`; } return new Promise((resolve, reject) => { @@ -127,33 +137,33 @@ export function createTshdClient( if (err) { reject(err); } else { - resolve(response.toObject() as types.GetAppsResponse); + resolve(response as types.GetAppsResponse); } }); }); }, async listGateways() { - const req = new api.ListGatewaysRequest(); + const req = api.ListGatewaysRequest.create(); return new Promise((resolve, reject) => { tshd.listGateways(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject().gatewaysList as types.Gateway[]); + resolve(response.gateways as types.Gateway[]); } }); }); }, async listLeafClusters(clusterUri: uri.RootClusterUri) { - const req = new api.ListLeafClustersRequest().setClusterUri(clusterUri); + const req = api.ListLeafClustersRequest.create({ clusterUri }); return new Promise((resolve, reject) => { tshd.listLeafClusters(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject().clustersList as types.Cluster[]); + resolve(response.clusters as types.Cluster[]); } }); }); @@ -163,12 +173,12 @@ export function createTshdClient( return withAbort(abortSignal, callRef => { return new Promise((resolve, reject) => { callRef.current = tshd.listRootClusters( - new api.ListClustersRequest(), + api.ListClustersRequest.create(), (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject().clustersList as types.Cluster[]); + resolve(response.clusters as types.Cluster[]); } } ); @@ -185,16 +195,17 @@ export function createTshdClient( startKey, limit, }: types.GetResourcesParams) { - const req = new api.GetDatabasesRequest() - .setClusterUri(clusterUri) - .setSearchAsRoles(searchAsRoles) - .setStartKey(startKey) - .setSearch(search) - .setQuery(query) - .setLimit(limit); + const req = api.GetDatabasesRequest.create({ + clusterUri, + searchAsRoles, + startKey, + search, + query, + limit, + }); if (sort) { - req.setSortBy(`${sort.fieldName}:${sort.dir.toLowerCase()}`); + req.sortBy = `${sort.fieldName}:${sort.dir.toLowerCase()}`; } return new Promise((resolve, reject) => { @@ -202,48 +213,49 @@ export function createTshdClient( if (err) { reject(err); } else { - resolve(response.toObject() as types.GetDatabasesResponse); + resolve(response as types.GetDatabasesResponse); } }); }); }, async listDatabaseUsers(dbUri: uri.DatabaseUri) { - const req = new api.ListDatabaseUsersRequest().setDbUri(dbUri); + const req = api.ListDatabaseUsersRequest.create({ dbUri }); return new Promise((resolve, reject) => { tshd.listDatabaseUsers(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject().usersList); + resolve(response.users); } }); }); }, async getAccessRequest(clusterUri: uri.RootClusterUri, requestId: string) { - const req = new api.GetAccessRequestRequest() - .setClusterUri(clusterUri) - .setAccessRequestId(requestId); + const req = api.GetAccessRequestRequest.create({ + clusterUri, + accessRequestId: requestId, + }); return new Promise((resolve, reject) => { tshd.getAccessRequest(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject().request); + resolve(response.request); } }); }); }, async getAccessRequests(clusterUri: uri.RootClusterUri) { - const req = new api.GetAccessRequestsRequest().setClusterUri(clusterUri); + const req = api.GetAccessRequestsRequest.create({ clusterUri }); return new Promise((resolve, reject) => { tshd.getAccessRequests(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject().requestsList); + resolve(response.requests); } }); }); @@ -258,16 +270,17 @@ export function createTshdClient( startKey, limit, }: types.GetResourcesParams) { - const req = new api.GetServersRequest() - .setClusterUri(clusterUri) - .setSearchAsRoles(searchAsRoles) - .setStartKey(startKey) - .setSearch(search) - .setQuery(query) - .setLimit(limit); + const req = api.GetServersRequest.create({ + clusterUri, + searchAsRoles, + startKey, + search, + query, + limit, + }); if (sort) { - req.setSortBy(`${sort.fieldName}:${sort.dir.toLowerCase()}`); + req.sortBy = `${sort.fieldName}:${sort.dir.toLowerCase()}`; } return new Promise((resolve, reject) => { @@ -275,33 +288,32 @@ export function createTshdClient( if (err) { reject(err); } else { - resolve(response.toObject() as types.GetServersResponse); + resolve(response as types.GetServersResponse); } }); }); }, async createAccessRequest(params: types.CreateAccessRequestParams) { - const req = new api.CreateAccessRequestRequest() - .setRootClusterUri(params.rootClusterUri) - .setSuggestedReviewersList(params.suggestedReviewers) - .setRolesList(params.roles) - .setResourceIdsList( - params.resourceIds.map(({ id, clusterName, kind }) => { - const resourceId = new ResourceID(); - resourceId.setName(id); - resourceId.setClusterName(clusterName); - resourceId.setKind(kind); - return resourceId; + const req = api.CreateAccessRequestRequest.create({ + rootClusterUri: params.rootClusterUri, + suggestedReviewers: params.suggestedReviewers, + roles: params.roles, + reason: params.reason, + resourceIds: params.resourceIds.map(({ id, clusterName, kind }) => + ResourceID.create({ + name: id, + clusterName, + kind, }) - ) - .setReason(params.reason); - return new Promise((resolve, reject) => { + ), + }); + return new Promise((resolve, reject) => { tshd.createAccessRequest(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject().request); + resolve(response.request); } }); }); @@ -311,9 +323,10 @@ export function createTshdClient( clusterUri: uri.RootClusterUri, requestId: string ) { - const req = new api.DeleteAccessRequestRequest() - .setRootClusterUri(clusterUri) - .setAccessRequestId(requestId); + const req = api.DeleteAccessRequestRequest.create({ + rootClusterUri: clusterUri, + accessRequestId: requestId, + }); return new Promise((resolve, reject) => { tshd.deleteAccessRequest(req, err => { if (err) { @@ -330,10 +343,11 @@ export function createTshdClient( requestIds: string[], dropIds: string[] ) { - const req = new api.AssumeRoleRequest() - .setRootClusterUri(clusterUri) - .setAccessRequestIdsList(requestIds) - .setDropRequestIdsList(dropIds); + const req = api.AssumeRoleRequest.create({ + rootClusterUri: clusterUri, + accessRequestIds: requestIds, + dropRequestIds: dropIds, + }); return new Promise((resolve, reject) => { tshd.assumeRole(req, err => { if (err) { @@ -349,42 +363,42 @@ export function createTshdClient( clusterUri: uri.RootClusterUri, params: types.ReviewAccessRequestParams ) { - const req = new api.ReviewAccessRequestRequest() - .setRootClusterUri(clusterUri) - .setAccessRequestId(params.id) - .setState(params.state) - .setReason(params.reason) - .setRolesList(params.roles); + const req = api.ReviewAccessRequestRequest.create({ + rootClusterUri: clusterUri, + accessRequestId: params.id, + state: params.state, + reason: params.reason, + roles: params.roles, + }); return new Promise((resolve, reject) => { tshd.reviewAccessRequest(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject().request); + resolve(response.request); } }); }); }, async getRequestableRoles(params: types.GetRequestableRolesParams) { - const req = new api.GetRequestableRolesRequest() - .setClusterUri(params.rootClusterUri) - .setResourceIdsList( - params.resourceIds.map(({ id, clusterName, kind }) => { - const resourceId = new ResourceID(); - resourceId.setName(id); - resourceId.setClusterName(clusterName); - resourceId.setKind(kind); - return resourceId; + const req = api.GetRequestableRolesRequest.create({ + clusterUri: params.rootClusterUri, + resourceIds: params.resourceIds!.map(({ id, clusterName, kind }) => + ResourceID.create({ + name: id, + clusterName, + kind, }) - ); + ), + }); return new Promise( (resolve, reject) => { tshd.getRequestableRoles(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject()); + resolve(response); } }); } @@ -392,26 +406,26 @@ export function createTshdClient( }, async addRootCluster(addr: string) { - const req = new api.AddClusterRequest().setName(addr); + const req = api.AddClusterRequest.create({ name: addr }); return new Promise((resolve, reject) => { tshd.addCluster(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject() as types.Cluster); + resolve(response as types.Cluster); } }); }); }, async getCluster(uri: uri.RootClusterUri) { - const req = new api.GetClusterRequest().setClusterUri(uri); + const req = api.GetClusterRequest.create({ clusterUri: uri }); return new Promise((resolve, reject) => { tshd.getCluster(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject() as types.Cluster); + resolve(response as types.Cluster); } }); }); @@ -421,15 +435,19 @@ export function createTshdClient( params: types.LoginLocalParams, abortSignal?: types.TshAbortSignal ) { - const localParams = new api.LoginRequest.LocalParams() - .setToken(params.token) - .setUser(params.username) - .setPassword(params.password); - + const localParams = api.LoginRequest_LocalParams.create({ + token: params.token, + user: params.username, + password: params.password, + }); return withAbort(abortSignal, callRef => { - const req = new api.LoginRequest().setClusterUri(params.clusterUri); - req.setLocal(localParams); - + const req = api.LoginRequest.create({ + clusterUri: params.clusterUri, + params: { + oneofKind: 'local', + local: localParams, + }, + }); return new Promise((resolve, reject) => { callRef.current = tshd.login(req, err => { if (err) { @@ -446,14 +464,18 @@ export function createTshdClient( params: types.LoginSsoParams, abortSignal?: types.TshAbortSignal ) { - const ssoParams = new api.LoginRequest.SsoParams() - .setProviderName(params.providerName) - .setProviderType(params.providerType); - + const ssoParams = api.LoginRequest_SsoParams.create({ + providerName: params.providerName, + providerType: params.providerType, + }); return withAbort(abortSignal, callRef => { - const req = new api.LoginRequest().setClusterUri(params.clusterUri); - req.setSso(ssoParams); - + const req = api.LoginRequest.create({ + clusterUri: params.clusterUri, + params: { + oneofKind: 'sso', + sso: ssoParams, + }, + }); return new Promise((resolve, reject) => { callRef.current = tshd.login(req, err => { if (err) { @@ -472,13 +494,15 @@ export function createTshdClient( ) { return withAbort(abortSignal, callRef => { const streamInitReq = - new api.LoginPasswordlessRequest.LoginPasswordlessRequestInit().setClusterUri( - params.clusterUri - ); - const streamReq = new api.LoginPasswordlessRequest().setInit( - streamInitReq - ); - + api.LoginPasswordlessRequest_LoginPasswordlessRequestInit.create({ + clusterUri: params.clusterUri, + }); + const streamReq = api.LoginPasswordlessRequest.create({ + request: { + oneofKind: 'init', + init: streamInitReq, + }, + }); return new Promise((resolve, reject) => { callRef.current = tshd.loginPasswordless(); const stream = callRef.current as grpc.ClientDuplexStream< @@ -492,17 +516,20 @@ export function createTshdClient( stream.write(streamReq); stream.on('data', function (response: api.LoginPasswordlessResponse) { - const req = response.toObject(); - - switch (req.prompt) { - case api.PasswordlessPrompt.PASSWORDLESS_PROMPT_PIN: + switch (response.prompt) { + case api.PasswordlessPrompt.PIN: const pinResponse = pin => { const pinRes = - new api.LoginPasswordlessRequest.LoginPasswordlessPINResponse().setPin( - pin + api.LoginPasswordlessRequest_LoginPasswordlessPINResponse.create( + { pin } ); stream.write( - new api.LoginPasswordlessRequest().setPin(pinRes) + api.LoginPasswordlessRequest.create({ + request: { + oneofKind: 'pin', + pin: pinRes, + }, + }) ); }; @@ -512,25 +539,30 @@ export function createTshdClient( }); return; - case api.PasswordlessPrompt.PASSWORDLESS_PROMPT_CREDENTIAL: + case api.PasswordlessPrompt.CREDENTIAL: const credResponse = index => { const credRes = - new api.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse().setIndex( - index + api.LoginPasswordlessRequest_LoginPasswordlessCredentialResponse.create( + { index } ); stream.write( - new api.LoginPasswordlessRequest().setCredential(credRes) + api.LoginPasswordlessRequest.create({ + request: { + oneofKind: 'credential', + credential: credRes, + }, + }) ); }; params.onPromptCallback({ type: 'credential', onUserResponse: credResponse, - data: { credentials: req.credentialsList || [] }, + data: { credentials: response.credentials || [] }, }); return; - case api.PasswordlessPrompt.PASSWORDLESS_PROMPT_TAP: + case api.PasswordlessPrompt.TAP: if (hasDeviceBeenTapped) { params.onPromptCallback({ type: 'retap' }); } else { @@ -540,7 +572,7 @@ export function createTshdClient( return; // Following cases should never happen but just in case? - case api.PasswordlessPrompt.PASSWORDLESS_PROMPT_UNSPECIFIED: + case api.PasswordlessPrompt.UNSPECIFIED: stream.cancel(); return reject( new Error('no passwordless prompt was specified') @@ -549,7 +581,9 @@ export function createTshdClient( default: stream.cancel(); return reject( - new Error(`passwordless prompt '${req.prompt}' not supported`) + new Error( + `passwordless prompt '${response.prompt}' not supported` + ) ); } }); @@ -566,37 +600,38 @@ export function createTshdClient( }, async getAuthSettings(clusterUri: uri.RootClusterUri) { - const req = new api.GetAuthSettingsRequest().setClusterUri(clusterUri); + const req = api.GetAuthSettingsRequest.create({ clusterUri }); return new Promise((resolve, reject) => { tshd.getAuthSettings(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject()); + resolve(response); } }); }); }, async createGateway(params: types.CreateGatewayParams) { - const req = new api.CreateGatewayRequest() - .setTargetUri(params.targetUri) - .setTargetUser(params.user) - .setLocalPort(params.port) - .setTargetSubresourceName(params.subresource_name); + const req = api.CreateGatewayRequest.create({ + targetUri: params.targetUri, + targetUser: params.user, + localPort: params.port, + targetSubresourceName: params.subresource_name, + }); return new Promise((resolve, reject) => { tshd.createGateway(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject() as types.Gateway); + resolve(response as types.Gateway); } }); }); }, async removeCluster(clusterUri: uri.RootClusterUri) { - const req = new api.RemoveClusterRequest().setClusterUri(clusterUri); + const req = api.RemoveClusterRequest.create({ clusterUri }); return new Promise((resolve, reject) => { tshd.removeCluster(req, err => { if (err) { @@ -609,7 +644,7 @@ export function createTshdClient( }, async removeGateway(gatewayUri: uri.GatewayUri) { - const req = new api.RemoveGatewayRequest().setGatewayUri(gatewayUri); + const req = api.RemoveGatewayRequest.create({ gatewayUri }); return new Promise((resolve, reject) => { tshd.removeGateway(req, err => { if (err) { @@ -625,30 +660,32 @@ export function createTshdClient( gatewayUri: uri.GatewayUri, targetSubresourceName = '' ) { - const req = new api.SetGatewayTargetSubresourceNameRequest() - .setGatewayUri(gatewayUri) - .setTargetSubresourceName(targetSubresourceName); + const req = api.SetGatewayTargetSubresourceNameRequest.create({ + gatewayUri, + targetSubresourceName, + }); return new Promise((resolve, reject) => { tshd.setGatewayTargetSubresourceName(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject() as types.Gateway); + resolve(response as types.Gateway); } }); }); }, async setGatewayLocalPort(gatewayUri: uri.GatewayUri, localPort: string) { - const req = new api.SetGatewayLocalPortRequest() - .setGatewayUri(gatewayUri) - .setLocalPort(localPort); + const req = api.SetGatewayLocalPortRequest.create({ + gatewayUri, + localPort, + }); return new Promise((resolve, reject) => { tshd.setGatewayLocalPort(req, (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject() as types.Gateway); + resolve(response as types.Gateway); } }); }); @@ -658,20 +695,19 @@ export function createTshdClient( options: types.FileTransferRequest, abortSignal: types.TshAbortSignal ) { - const req = new api.FileTransferRequest() - .setServerUri(options.serverUri) - .setLogin(options.login) - .setSource(options.source) - .setDestination(options.destination) - .setDirection(options.direction); + const req = api.FileTransferRequest.create({ + serverUri: options.serverUri, + login: options.login, + source: options.source, + destination: options.destination, + direction: options.direction, + }); return createFileTransferStream(tshd.transferFile(req), abortSignal); }, updateTshdEventsServerAddress(address: string) { - const req = new api.UpdateTshdEventsServerAddressRequest().setAddress( - address - ); + const req = api.UpdateTshdEventsServerAddressRequest.create({ address }); return new Promise((resolve, reject) => { tshd.updateTshdEventsServerAddress(req, err => { if (err) { @@ -697,10 +733,9 @@ export function createTshdClient( }, createConnectMyComputerRole(rootClusterUri: uri.RootClusterUri) { - const req = - new api.CreateConnectMyComputerRoleRequest().setRootClusterUri( - rootClusterUri - ); + const req = api.CreateConnectMyComputerRoleRequest.create({ + rootClusterUri, + }); return new Promise( (resolve, reject) => { @@ -708,7 +743,7 @@ export function createTshdClient( if (err) { reject(err); } else { - resolve(response.toObject()); + resolve(response); } }); } @@ -719,14 +754,14 @@ export function createTshdClient( return new Promise( (resolve, reject) => { tshd.createConnectMyComputerNodeToken( - new api.CreateConnectMyComputerNodeTokenRequest().setRootClusterUri( - uri - ), + api.CreateConnectMyComputerNodeTokenRequest.create({ + rootClusterUri: uri, + }), (err, response) => { if (err) { reject(err); } else { - resolve(response.toObject()); + resolve(response); } } ); @@ -737,9 +772,10 @@ export function createTshdClient( deleteConnectMyComputerToken(uri: uri.RootClusterUri, token: string) { return new Promise((resolve, reject) => { tshd.deleteConnectMyComputerToken( - new api.DeleteConnectMyComputerTokenRequest() - .setRootClusterUri(uri) - .setToken(token), + api.DeleteConnectMyComputerTokenRequest.create({ + rootClusterUri: uri, + token, + }), err => { if (err) { reject(err); @@ -755,10 +791,9 @@ export function createTshdClient( uri: uri.RootClusterUri, abortSignal: types.TshAbortSignal ) { - const req = - new api.WaitForConnectMyComputerNodeJoinRequest().setRootClusterUri( - uri - ); + const req = api.WaitForConnectMyComputerNodeJoinRequest.create({ + rootClusterUri: uri, + }); return withAbort( abortSignal, @@ -772,7 +807,7 @@ export function createTshdClient( reject(err); } else { resolve( - response.toObject() as types.WaitForConnectMyComputerNodeJoinResponse + response as types.WaitForConnectMyComputerNodeJoinResponse ); } } @@ -785,7 +820,9 @@ export function createTshdClient( deleteConnectMyComputerNode(uri: uri.RootClusterUri) { return new Promise((resolve, reject) => { tshd.deleteConnectMyComputerNode( - new api.DeleteConnectMyComputerNodeRequest().setRootClusterUri(uri), + api.DeleteConnectMyComputerNodeRequest.create({ + rootClusterUri: uri, + }), err => { if (err) { reject(err); @@ -800,12 +837,14 @@ export function createTshdClient( getConnectMyComputerNodeName(uri: uri.RootClusterUri) { return new Promise((resolve, reject) => { tshd.getConnectMyComputerNodeName( - new api.GetConnectMyComputerNodeNameRequest().setRootClusterUri(uri), + api.GetConnectMyComputerNodeNameRequest.create({ + rootClusterUri: uri, + }), (err, response) => { if (err) { reject(err); } else { - resolve(response.getName() as uri.ServerUri); + resolve(response.name as uri.ServerUri); } } ); @@ -817,10 +856,11 @@ export function createTshdClient( abortSignal?: types.TshAbortSignal ) { return withAbort(abortSignal, callRef => { - const req = new api.UpdateHeadlessAuthenticationStateRequest() - .setRootClusterUri(params.rootClusterUri) - .setHeadlessAuthenticationId(params.headlessAuthenticationId) - .setState(params.state); + const req = api.UpdateHeadlessAuthenticationStateRequest.create({ + rootClusterUri: params.rootClusterUri, + headlessAuthenticationId: params.headlessAuthenticationId, + state: params.state, + }); return new Promise((resolve, reject) => { callRef.current = tshd.updateHeadlessAuthenticationState(req, err => { @@ -839,21 +879,21 @@ export function createTshdClient( abortSignal?: types.TshAbortSignal ) { return withAbort(abortSignal, callRef => { - const req = new api.ListUnifiedResourcesRequest() - .setClusterUri(params.clusterUri) - .setLimit(params.limit) - .setKindsList(params.kindsList) - .setStartKey(params.startKey) - .setSearch(params.search) - .setQuery(params.query) - .setPinnedOnly(params.pinnedOnly) - .setSearchAsRoles(params.searchAsRoles); + const req = api.ListUnifiedResourcesRequest.create({ + clusterUri: params.clusterUri, + limit: params.limit, + kinds: params.kinds, + startKey: params.startKey, + search: params.search, + query: params.query, + pinnedOnly: params.pinnedOnly, + searchAsRoles: params.searchAsRoles, + }); if (params.sortBy) { - req.setSortBy( - new api.SortBy() - .setField(params.sortBy.field) - .setIsDesc(params.sortBy.isDesc) - ); + req.sortBy = api.SortBy.create({ + field: params.sortBy.field, + isDesc: params.sortBy.isDesc, + }); } return new Promise( @@ -863,42 +903,42 @@ export function createTshdClient( reject(err); } else { resolve({ - nextKey: res.getNextKey(), - resources: res - .getResourcesList() + nextKey: res.nextKey, + resources: res.resources .map(p => { - switch (p.getResourceCase()) { - case api.PaginatedResource.ResourceCase.SERVER: - return { - kind: 'server' as const, - resource: p.getServer().toObject() as types.Server, - }; - case api.PaginatedResource.ResourceCase.DATABASE: - return { - kind: 'database' as const, - resource: p - .getDatabase() - .toObject() as types.Database, - }; - case api.PaginatedResource.ResourceCase.KUBE: - return { - kind: 'kube' as const, - resource: p.getKube().toObject() as types.Kube, - }; - case api.PaginatedResource.ResourceCase.APP: - return { - kind: 'app' as const, - resource: p.getApp().toObject() as types.App, - }; - default: - logger.info( - `Ignoring unsupported resource ${JSON.stringify( - p.toObject() - )}.` - ); + if (resourceOneOfIsServer(p.resource)) { + return { + kind: 'server', + resource: p.resource.server, + }; + } + + if (resourceOneOfIsDatabase(p.resource)) { + return { + kind: 'database', + resource: p.resource.database, + }; } + + if (resourceOneOfIsApp(p.resource)) { + return { + kind: 'app', + resource: p.resource.app, + }; + } + + if (resourceOneOfIsKube(p.resource)) { + return { + kind: 'kube', + resource: p.resource.kube, + }; + } + + logger.info( + `Ignoring unsupported resource ${JSON.stringify(p)}.` + ); }) - .filter(Boolean), + .filter(Boolean) as UnifiedResourceResponse[], }); } }); @@ -907,105 +947,101 @@ export function createTshdClient( }); }, getUserPreferences( - params: api.GetUserPreferencesRequest.AsObject, + params: api.GetUserPreferencesRequest, abortSignal?: types.TshAbortSignal - ): Promise { + ): Promise { return withAbort(abortSignal, callRef => { - const req = new api.GetUserPreferencesRequest().setClusterUri( - params.clusterUri - ); + const req = api.GetUserPreferencesRequest.create({ + clusterUri: params.clusterUri, + }); return new Promise((resolve, reject) => { callRef.current = tshd.getUserPreferences(req, (err, response) => { if (err) { reject(err); } else { - const res = response.toObject(); - resolve(res.userPreferences); + resolve(response.userPreferences); } }); }); }); }, updateUserPreferences( - params: api.UpdateUserPreferencesRequest.AsObject, + params: api.UpdateUserPreferencesRequest, abortSignal?: types.TshAbortSignal - ): Promise { - const userPreferences = new UserPreferences(); + ): Promise { + const userPreferences = UserPreferences.create(); if (params.userPreferences.clusterPreferences) { - userPreferences.setClusterPreferences( - new ClusterUserPreferences().setPinnedResources( - new PinnedResourcesUserPreferences().setResourceIdsList( + userPreferences.clusterPreferences = ClusterUserPreferences.create({ + pinnedResources: PinnedResourcesUserPreferences.create({ + resourceIds: params.userPreferences.clusterPreferences.pinnedResources - .resourceIdsList - ) - ) - ); + ?.resourceIds, + }), + }); } if (params.userPreferences.unifiedResourcePreferences) { - userPreferences.setUnifiedResourcePreferences( - new UnifiedResourcePreferences() - .setDefaultTab( - params.userPreferences.unifiedResourcePreferences.defaultTab - ) - .setViewMode( - params.userPreferences.unifiedResourcePreferences.viewMode - ) - .setLabelsViewMode( - params.userPreferences.unifiedResourcePreferences.labelsViewMode - ) - ); + userPreferences.unifiedResourcePreferences = + UnifiedResourcePreferences.create({ + defaultTab: + params.userPreferences.unifiedResourcePreferences.defaultTab, + viewMode: + params.userPreferences.unifiedResourcePreferences.viewMode, + labelsViewMode: + params.userPreferences.unifiedResourcePreferences.labelsViewMode, + }); } return withAbort(abortSignal, callRef => { - const req = new api.UpdateUserPreferencesRequest() - .setClusterUri(params.clusterUri) - .setUserPreferences(userPreferences); + const req = api.UpdateUserPreferencesRequest.create({ + clusterUri: params.clusterUri, + userPreferences, + }); return new Promise((resolve, reject) => { callRef.current = tshd.updateUserPreferences(req, (err, response) => { if (err) { reject(err); } else { - const res = response.toObject(); - resolve(res.userPreferences); + resolve(response.userPreferences); } }); }); }); }, promoteAccessRequest( - params: api.PromoteAccessRequestRequest.AsObject, + params: api.PromoteAccessRequestRequest, abortSignal?: types.TshAbortSignal ): Promise { return withAbort(abortSignal, callRef => { - const req = new api.PromoteAccessRequestRequest() - .setRootClusterUri(params.rootClusterUri) - .setAccessRequestId(params.accessRequestId) - .setAccessListId(params.accessListId) - .setReason(params.reason); + const req = api.PromoteAccessRequestRequest.create({ + rootClusterUri: params.rootClusterUri, + accessRequestId: params.accessRequestId, + accessListId: params.accessListId, + reason: params.reason, + }); return new Promise((resolve, reject) => { callRef.current = tshd.promoteAccessRequest(req, (err, response) => { if (err) { reject(err); } else { - const res = response.toObject(); - resolve(res.request); + resolve(response.request); } }); }); }); }, getSuggestedAccessLists( - params: api.GetSuggestedAccessListsRequest.AsObject, + params: api.GetSuggestedAccessListsRequest, abortSignal?: types.TshAbortSignal ): Promise { return withAbort(abortSignal, callRef => { - const req = new api.GetSuggestedAccessListsRequest() - .setRootClusterUri(params.rootClusterUri) - .setAccessRequestId(params.accessRequestId); + const req = api.GetSuggestedAccessListsRequest.create({ + rootClusterUri: params.rootClusterUri, + accessRequestId: params.accessRequestId, + }); return new Promise((resolve, reject) => { callRef.current = tshd.getSuggestedAccessLists( @@ -1014,8 +1050,7 @@ export function createTshdClient( if (err) { reject(err); } else { - const res = response.toObject(); - resolve(res.accessListsList); + resolve(response.accessLists); } } ); @@ -1028,21 +1063,21 @@ export function createTshdClient( } type CallRef = { - current?: { + current: { cancel(): void; - }; + } | null; }; async function withAbort( - sig: types.TshAbortSignal, + sig: types.TshAbortSignal | undefined, cb: (ref: CallRef) => Promise ) { - const ref = { + const ref: CallRef = { current: null, }; const abort = () => { - ref?.current.cancel(); + ref?.current?.cancel(); }; sig?.addEventListener(abort); diff --git a/web/packages/teleterm/src/services/tshd/createFileTransferStream.ts b/web/packages/teleterm/src/services/tshd/createFileTransferStream.ts index 84db0461eef1f..d9066526ccfad 100644 --- a/web/packages/teleterm/src/services/tshd/createFileTransferStream.ts +++ b/web/packages/teleterm/src/services/tshd/createFileTransferStream.ts @@ -18,8 +18,8 @@ import { ClientReadableStream } from '@grpc/grpc-js'; import { FileTransferListeners } from 'shared/components/FileTransfer'; -import { FileTransferProgress } from 'gen-proto-js/teleport/lib/teleterm/v1/service_pb'; -import * as api from 'gen-proto-js/teleport/lib/teleterm/v1/service_pb'; +import { FileTransferProgress } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb'; +import * as api from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb'; import { TshAbortSignal } from './types'; @@ -32,7 +32,7 @@ export function createFileTransferStream( return { onProgress(callback: (progress: number) => void) { stream.on('data', (data: api.FileTransferProgress) => - callback(data.getPercentage()) + callback(data.percentage) ); }, onComplete(callback: () => void) { diff --git a/web/packages/teleterm/src/services/tshd/gateway.test.ts b/web/packages/teleterm/src/services/tshd/gateway.test.ts index 940d1725c4f3d..fba0fad9461b6 100644 --- a/web/packages/teleterm/src/services/tshd/gateway.test.ts +++ b/web/packages/teleterm/src/services/tshd/gateway.test.ts @@ -20,12 +20,12 @@ import { getCliCommandArgs, getCliCommandEnv } from './gateway'; import { GatewayCLICommand } from './types'; describe('getCliCommandArgs', () => { - it("extracts Node.js-style args from cliCommand's argsList", () => { + it("extracts Node.js-style args from cliCommand's args", () => { const cliCommand = makeCliCommand(); const args = getCliCommandArgs(cliCommand); - expect(args).toEqual([cliCommand.argsList[1]]); + expect(args).toEqual([cliCommand.args[1]]); }); }); @@ -43,8 +43,8 @@ describe('getCliCommandEnv', () => { const makeCliCommand = (): GatewayCLICommand => { return { path: '/Users/foo/Applications/psql.app/MacOS/psql', - argsList: ['psql', 'localhost:1337'], - envList: ['foo=bar', 'baz=quux'], + args: ['psql', 'localhost:1337'], + env: ['foo=bar', 'baz=quux'], preview: 'foo=bar baz=quux psql localhost:1337', }; }; diff --git a/web/packages/teleterm/src/services/tshd/gateway.ts b/web/packages/teleterm/src/services/tshd/gateway.ts index ed2532b149f0a..629706188b24e 100644 --- a/web/packages/teleterm/src/services/tshd/gateway.ts +++ b/web/packages/teleterm/src/services/tshd/gateway.ts @@ -27,7 +27,7 @@ import { GatewayCLICommand } from './types'; * include just the args. */ export function getCliCommandArgs(cliCommand: GatewayCLICommand): string[] { - const [, ...args] = cliCommand.argsList; + const [, ...args] = cliCommand.args; return args; } @@ -36,7 +36,7 @@ export function getCliCommandArgs(cliCommand: GatewayCLICommand): string[] { * We are safe to use this as the presentational command name. */ export function getCliCommandArgv0(cliCommand: GatewayCLICommand): string { - return cliCommand.argsList[0]; + return cliCommand.args[0]; } /** @@ -48,7 +48,7 @@ export function getCliCommandEnv( cliCommand: GatewayCLICommand ): Record { return Object.fromEntries( - cliCommand.envList.map(nameEqualsValue => nameEqualsValue.split('=')) + cliCommand.env.map(nameEqualsValue => nameEqualsValue.split('=')) ); } diff --git a/web/packages/teleterm/src/services/tshd/mapUsageEvent.ts b/web/packages/teleterm/src/services/tshd/mapUsageEvent.ts index bfbb25abfcb92..ac04fba361c99 100644 --- a/web/packages/teleterm/src/services/tshd/mapUsageEvent.ts +++ b/web/packages/teleterm/src/services/tshd/mapUsageEvent.ts @@ -16,9 +16,19 @@ * along with this program. If not, see . */ -import { Timestamp } from 'google-protobuf/google/protobuf/timestamp_pb'; -import * as api from 'gen-proto-js/teleport/lib/teleterm/v1/usage_events_pb'; -import * as prehogApi from 'gen-proto-js/prehog/v1alpha/connect_pb'; +import * as api from 'gen-proto-ts/teleport/lib/teleterm/v1/usage_events_pb'; +import * as prehogApi from 'gen-proto-ts/prehog/v1alpha/connect_pb'; + +import { + connectEventOneOfIsAccessRequestAssumeRole, + connectEventOneOfIsAccessRequestCreate, + connectEventOneOfIsAccessRequestReview, + connectEventOneOfIsClusterLogin, + connectEventOneOfIsConnectMyComputerAgentStart, + connectEventOneOfIsConnectMyComputerSetup, + connectEventOneOfIsFileTransferRun, + connectEventOneOfIsProtocolUse, +} from 'teleterm/helpers'; import * as types from './types'; @@ -26,103 +36,162 @@ import * as types from './types'; * Maps a plain JS object into a gRPC request object. */ export function mapUsageEvent(event: types.ReportUsageEventRequest) { - return new api.ReportUsageEventRequest() - .setAuthClusterId(event.authClusterId) - .setPrehogReq(mapPrehogBody(event.prehogReq)); + return api.ReportUsageEventRequest.create({ + authClusterId: event.authClusterId, + prehogReq: mapPrehogBody(event.prehogReq), + }); } function mapPrehogBody( plainReq: types.ReportUsageEventRequest['prehogReq'] ): prehogApi.SubmitConnectEventRequest { - const req = new prehogApi.SubmitConnectEventRequest() - .setTimestamp(Timestamp.fromDate(plainReq.timestamp)) - .setDistinctId(plainReq.distinctId); + if (!plainReq) { + throw new Error(`Unrecognized event: ${JSON.stringify(plainReq)}`); + } - // Non-anonymized events. - if (plainReq.userJobRoleUpdate) { - const event = plainReq.userJobRoleUpdate; - const reqEvent = new prehogApi.ConnectUserJobRoleUpdateEvent().setJobRole( - event.jobRole - ); + const req = prehogApi.SubmitConnectEventRequest.create({ + timestamp: plainReq.timestamp, + distinctId: plainReq.distinctId, + }); - return req.setUserJobRoleUpdate(reqEvent); + // Non-anonymized events. + if (plainReq.event.oneofKind === 'userJobRoleUpdate') { + const event = plainReq.event.userJobRoleUpdate; + const reqEvent = prehogApi.ConnectUserJobRoleUpdateEvent.create({ + jobRole: event.jobRole, + }); + + req.event = { + oneofKind: 'userJobRoleUpdate', + userJobRoleUpdate: reqEvent, + }; + + return req; } // Anonymized events. - if (plainReq.clusterLogin) { - const event = plainReq.clusterLogin; - const reqEvent = new prehogApi.ConnectClusterLoginEvent() - .setClusterName(event.clusterName) - .setUserName(event.userName) - .setConnectorType(event.connectorType) - .setOs(event.os) - .setArch(event.arch) - .setOsVersion(event.osVersion) - .setAppVersion(event.appVersion); - - return req.setClusterLogin(reqEvent); + if (connectEventOneOfIsClusterLogin(plainReq.event)) { + const event = plainReq.event.clusterLogin; + const reqEvent = prehogApi.ConnectClusterLoginEvent.create({ + clusterName: event.clusterName, + userName: event.userName, + connectorType: event.connectorType, + os: event.os, + arch: event.arch, + osVersion: event.osVersion, + appVersion: event.appVersion, + }); + + req.event = { + oneofKind: 'clusterLogin', + clusterLogin: reqEvent, + }; + + return req; } - if (plainReq.protocolUse) { - const event = plainReq.protocolUse; - const reqEvent = new prehogApi.ConnectProtocolUseEvent() - .setClusterName(event.clusterName) - .setUserName(event.userName) - .setProtocol(event.protocol) - .setOrigin(event.origin); - - return req.setProtocolUse(reqEvent); + if (connectEventOneOfIsProtocolUse(plainReq.event)) { + const event = plainReq.event.protocolUse; + const reqEvent = prehogApi.ConnectProtocolUseEvent.create({ + clusterName: event.clusterName, + userName: event.userName, + protocol: event.protocol, + origin: event.origin, + }); + + req.event = { + oneofKind: 'protocolUse', + protocolUse: reqEvent, + }; + + return req; } - if (plainReq.accessRequestCreate) { - const event = plainReq.accessRequestCreate; - const reqEvent = new prehogApi.ConnectAccessRequestCreateEvent() - .setClusterName(event.clusterName) - .setUserName(event.userName) - .setKind(event.kind); - - return req.setAccessRequestCreate(reqEvent); + if (connectEventOneOfIsAccessRequestCreate(plainReq.event)) { + const event = plainReq.event.accessRequestCreate; + const reqEvent = prehogApi.ConnectAccessRequestCreateEvent.create({ + clusterName: event.clusterName, + userName: event.userName, + kind: event.kind, + }); + + req.event = { + oneofKind: 'accessRequestCreate', + accessRequestCreate: reqEvent, + }; + + return req; } - if (plainReq.accessRequestReview) { - const event = plainReq.accessRequestReview; - const reqEvent = new prehogApi.ConnectAccessRequestReviewEvent() - .setClusterName(event.clusterName) - .setUserName(event.userName); - - return req.setAccessRequestReview(reqEvent); + if (connectEventOneOfIsAccessRequestReview(plainReq.event)) { + const event = plainReq.event.accessRequestReview; + const reqEvent = prehogApi.ConnectAccessRequestReviewEvent.create({ + clusterName: event.clusterName, + userName: event.userName, + }); + + req.event = { + oneofKind: 'accessRequestReview', + accessRequestReview: reqEvent, + }; + + return req; } - if (plainReq.accessRequestAssumeRole) { - const event = plainReq.accessRequestAssumeRole; - const reqEvent = new prehogApi.ConnectAccessRequestAssumeRoleEvent() - .setClusterName(event.clusterName) - .setUserName(event.userName); - - return req.setAccessRequestAssumeRole(reqEvent); + if (connectEventOneOfIsAccessRequestAssumeRole(plainReq.event)) { + const event = plainReq.event.accessRequestAssumeRole; + const reqEvent = prehogApi.ConnectAccessRequestAssumeRoleEvent.create({ + clusterName: event.clusterName, + userName: event.userName, + }); + + req.event = { + oneofKind: 'accessRequestAssumeRole', + accessRequestAssumeRole: reqEvent, + }; + + return req; } - if (plainReq.fileTransferRun) { - const event = plainReq.fileTransferRun; - const reqEvent = new prehogApi.ConnectFileTransferRunEvent() - .setClusterName(event.clusterName) - .setUserName(event.userName) - .setIsUpload(event.isUpload); - - return req.setFileTransferRun(reqEvent); + if (connectEventOneOfIsFileTransferRun(plainReq.event)) { + const event = plainReq.event.fileTransferRun; + const reqEvent = prehogApi.ConnectFileTransferRunEvent.create({ + clusterName: event.clusterName, + userName: event.userName, + isUpload: event.isUpload, + }); + + req.event = { + oneofKind: 'fileTransferRun', + fileTransferRun: reqEvent, + }; + + return req; } - if (plainReq.connectMyComputerSetup) { - const event = plainReq.connectMyComputerSetup; - const reqEvent = new prehogApi.ConnectConnectMyComputerSetup() - .setClusterName(event.clusterName) - .setUserName(event.userName) - .setSuccess(event.success) - .setFailedStep(event.failedStep); - - return req.setConnectMyComputerSetup(reqEvent); + if (connectEventOneOfIsConnectMyComputerSetup(plainReq.event)) { + const event = plainReq.event.connectMyComputerSetup; + const reqEvent = prehogApi.ConnectConnectMyComputerSetup.create({ + clusterName: event.clusterName, + userName: event.userName, + success: event.success, + failedStep: event.failedStep, + }); + + req.event = { + oneofKind: 'connectMyComputerSetup', + connectMyComputerSetup: reqEvent, + }; + + return req; } - if (plainReq.connectMyComputerAgentStart) { - const event = plainReq.connectMyComputerAgentStart; - const reqEvent = new prehogApi.ConnectConnectMyComputerAgentStart() - .setClusterName(event.clusterName) - .setUserName(event.userName); - - return req.setConnectMyComputerAgentStart(reqEvent); + if (connectEventOneOfIsConnectMyComputerAgentStart(plainReq.event)) { + const event = plainReq.event.connectMyComputerAgentStart; + const reqEvent = prehogApi.ConnectConnectMyComputerAgentStart.create({ + clusterName: event.clusterName, + userName: event.userName, + }); + + req.event = { + oneofKind: 'connectMyComputerAgentStart', + connectMyComputerAgentStart: reqEvent, + }; + + return req; } throw new Error(`Unrecognized event: ${JSON.stringify(plainReq)}`); diff --git a/web/packages/teleterm/src/services/tshd/testHelpers.ts b/web/packages/teleterm/src/services/tshd/testHelpers.ts index 16bb0dfdbced3..d40b2d0ac149c 100644 --- a/web/packages/teleterm/src/services/tshd/testHelpers.ts +++ b/web/packages/teleterm/src/services/tshd/testHelpers.ts @@ -26,7 +26,7 @@ export const makeServer = (props: Partial = {}): tsh.Server => ({ name: '1234abcd-1234-abcd-1234-abcd1234abcd', hostname: 'foo', addr: '127.0.0.1:3022', - labelsList: [], + labels: [], subKind: 'teleport', ...props, }); @@ -44,20 +44,20 @@ export const makeDatabase = ( desc: '', hostname: '', addr: '', - labelsList: [], + labels: [], ...props, }); export const makeKube = (props: Partial = {}): tsh.Kube => ({ name: 'foo', - labelsList: [], + labels: [], uri: '/clusters/bar/kubes/foo', ...props, }); export const makeApp = (props: Partial = {}): App => ({ name: 'foo', - labelsList: [], + labels: [], endpointUri: 'tcp://localhost:3000', friendlyName: '', desc: '', @@ -104,7 +104,7 @@ export const makeLeafCluster = ( export const makeLoggedInUser = ( props: Partial = {} ): tsh.LoggedInUser => ({ - activeRequestsList: [], + activeRequests: [], assumedRequests: {}, name: 'alice', acl: { @@ -113,7 +113,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, activeSessions: { @@ -121,7 +121,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, authConnectors: { @@ -129,7 +129,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, roles: { @@ -137,7 +137,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, users: { @@ -145,7 +145,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, trustedClusters: { @@ -153,7 +153,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, events: { @@ -161,7 +161,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, tokens: { @@ -169,7 +169,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, servers: { @@ -177,7 +177,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, apps: { @@ -185,7 +185,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, dbs: { @@ -193,7 +193,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, kubeservers: { @@ -201,7 +201,7 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, accessRequests: { @@ -209,15 +209,15 @@ export const makeLoggedInUser = ( read: true, edit: true, create: true, - pb_delete: true, + delete: true, use: true, }, }, - sshLoginsList: [], - rolesList: [], - requestableRolesList: [], - suggestedReviewersList: [], - userType: tsh.UserType.USER_TYPE_LOCAL, + sshLogins: [], + roles: [], + requestableRoles: [], + suggestedReviewers: [], + userType: tsh.UserType.LOCAL, ...props, }); @@ -233,8 +233,8 @@ export const makeDatabaseGateway = ( protocol: 'postgres', gatewayCliCommand: { path: '/foo/psql', - argsList: ['psql', 'localhost:1337'], - envList: [], + args: ['psql', 'localhost:1337'], + env: [], preview: 'psql localhost:1337', }, targetSubresourceName: 'bar', @@ -253,8 +253,8 @@ export const makeKubeGateway = ( protocol: '', gatewayCliCommand: { path: '/bin/kubectl', - argsList: ['version'], - envList: ['KUBECONFIG=/path/to/kubeconfig'], + args: ['version'], + env: ['KUBECONFIG=/path/to/kubeconfig'], preview: 'KUBECONFIG=/path/to/kubeconfig /bin/kubectl version', }, targetSubresourceName: '', @@ -273,8 +273,8 @@ export const makeAppGateway = ( gatewayCliCommand: { path: '', preview: 'curl http://localhost:1337', - envList: [], - argsList: [], + env: [], + args: [], }, targetUser: '', protocol: 'HTTP', diff --git a/web/packages/teleterm/src/services/tshd/types.ts b/web/packages/teleterm/src/services/tshd/types.ts index 7f29a96a7edfd..8ea3778570f25 100644 --- a/web/packages/teleterm/src/services/tshd/types.ts +++ b/web/packages/teleterm/src/services/tshd/types.ts @@ -24,40 +24,38 @@ import { RequestState } from 'e-teleport/services/workflow'; import { SortType } from 'design/DataTable/types'; import { FileTransferListeners } from 'shared/components/FileTransfer'; import { NodeSubKind } from 'shared/services'; -import apiCluster from 'gen-proto-js/teleport/lib/teleterm/v1/cluster_pb'; -import apiDb from 'gen-proto-js/teleport/lib/teleterm/v1/database_pb'; -import apiGateway from 'gen-proto-js/teleport/lib/teleterm/v1/gateway_pb'; -import apiServer from 'gen-proto-js/teleport/lib/teleterm/v1/server_pb'; -import apiKube from 'gen-proto-js/teleport/lib/teleterm/v1/kube_pb'; -import apiApp from 'gen-proto-js/teleport/lib/teleterm/v1/app_pb'; -import apiLabel from 'gen-proto-js/teleport/lib/teleterm/v1/label_pb'; -import apiService, { - FileTransferDirection, - HeadlessAuthenticationState, -} from 'gen-proto-js/teleport/lib/teleterm/v1/service_pb'; -import apiAuthSettings from 'gen-proto-js/teleport/lib/teleterm/v1/auth_settings_pb'; -import apiAccessRequest from 'gen-proto-js/teleport/lib/teleterm/v1/access_request_pb'; -import apiUsageEvents from 'gen-proto-js/teleport/lib/teleterm/v1/usage_events_pb'; -import apiAccessList from 'gen-proto-js/teleport/accesslist/v1/accesslist_pb'; +import * as apiCluster from 'gen-proto-ts/teleport/lib/teleterm/v1/cluster_pb'; +import * as apiDb from 'gen-proto-ts/teleport/lib/teleterm/v1/database_pb'; +import * as apiGateway from 'gen-proto-ts/teleport/lib/teleterm/v1/gateway_pb'; +import * as apiServer from 'gen-proto-ts/teleport/lib/teleterm/v1/server_pb'; +import * as apiKube from 'gen-proto-ts/teleport/lib/teleterm/v1/kube_pb'; +import * as apiApp from 'gen-proto-ts/teleport/lib/teleterm/v1/app_pb'; +import * as apiLabel from 'gen-proto-ts/teleport/lib/teleterm/v1/label_pb'; +import * as apiService from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb'; +import * as apiAuthSettings from 'gen-proto-ts/teleport/lib/teleterm/v1/auth_settings_pb'; +import * as apiAccessRequest from 'gen-proto-ts/teleport/lib/teleterm/v1/access_request_pb'; +import * as apiUsageEvents from 'gen-proto-ts/teleport/lib/teleterm/v1/usage_events_pb'; +import * as apiAccessList from 'gen-proto-ts/teleport/accesslist/v1/accesslist_pb'; import * as uri from 'teleterm/ui/uri'; // We want to reexport both the type and the value of UserType. Because it's in a namespace, we have // to alias it first to do the reexport. // https://www.typescriptlang.org/docs/handbook/namespaces.html#aliases -import UserType = apiCluster.LoggedInUser.UserType; +import UserType = apiCluster.LoggedInUser_UserType; + export { UserType }; -export interface Kube extends apiKube.Kube.AsObject { +export interface Kube extends apiKube.Kube { uri: uri.KubeUri; } -export interface Server extends apiServer.Server.AsObject { +export interface Server extends apiServer.Server { uri: uri.ServerUri; subKind: NodeSubKind; } -export interface App extends apiApp.App.AsObject { +export interface App extends apiApp.App { uri: uri.AppUri; /** Name of the application. */ name: string; @@ -86,7 +84,7 @@ export interface App extends apiApp.App.AsObject { samlApp: boolean; } -export interface Gateway extends apiGateway.Gateway.AsObject { +export interface Gateway extends apiGateway.Gateway { uri: uri.GatewayUri; targetUri: uri.GatewayTargetUri; // The type of gatewayCliCommand was repeated here just to refer to the type with the JSDoc. @@ -107,43 +105,33 @@ export interface Gateway extends apiGateway.Gateway.AsObject { * if the user was to invoke it manually from the terminal. Should not be actually used to execute * anything in the shell. */ -export type GatewayCLICommand = apiGateway.GatewayCLICommand.AsObject; +export type GatewayCLICommand = apiGateway.GatewayCLICommand; -export type AccessRequest = apiAccessRequest.AccessRequest.AsObject; -export type ResourceId = apiAccessRequest.ResourceID.AsObject; -export type AccessRequestReview = apiAccessRequest.AccessRequestReview.AsObject; -export type AccessList = apiAccessList.AccessList.AsObject; +export type AccessRequest = apiAccessRequest.AccessRequest; +export type ResourceId = apiAccessRequest.ResourceID; +export type AccessRequestReview = apiAccessRequest.AccessRequestReview; +export type AccessList = apiAccessList.AccessList; -export interface GetServersResponse - extends apiService.GetServersResponse.AsObject { - agentsList: Server[]; +export interface GetServersResponse extends apiService.GetServersResponse { + agents: Server[]; } -export interface GetDatabasesResponse - extends apiService.GetDatabasesResponse.AsObject { - agentsList: Database[]; +export interface GetDatabasesResponse extends apiService.GetDatabasesResponse { + agents: Database[]; } -export interface GetKubesResponse extends apiService.GetKubesResponse.AsObject { - agentsList: Kube[]; +export interface GetKubesResponse extends apiService.GetKubesResponse { + agents: Kube[]; } -export interface GetAppsResponse extends apiService.GetAppsResponse.AsObject { - agentsList: App[]; +export interface GetAppsResponse extends apiService.GetAppsResponse { + agents: App[]; } export type GetRequestableRolesResponse = - apiService.GetRequestableRolesResponse.AsObject; - -export type ReportUsageEventRequest = Modify< - apiUsageEvents.ReportUsageEventRequest.AsObject, - { - prehogReq: Modify< - apiUsageEvents.ReportUsageEventRequest.AsObject['prehogReq'], - { timestamp: Date } - >; - } ->; + apiService.GetRequestableRolesResponse; + +export type ReportUsageEventRequest = apiUsageEvents.ReportUsageEventRequest; // Available types are listed here: // https://github.com/gravitational/teleport/blob/v9.0.3/lib/defaults/defaults.go#L513-L530 @@ -157,11 +145,11 @@ export type GatewayProtocol = | 'redis' | 'sqlserver'; -export interface Database extends apiDb.Database.AsObject { +export interface Database extends apiDb.Database { uri: uri.DatabaseUri; } -export interface Cluster extends apiCluster.Cluster.AsObject { +export interface Cluster extends apiCluster.Cluster { /** * The URI of the cluster. * @@ -196,22 +184,21 @@ export interface Cluster extends apiCluster.Cluster.AsObject { * includes a situation in which the cert has expired. If the cluster was added to the app but the * user is yet to log in, loggedInUser is not present. */ -export type LoggedInUser = apiCluster.LoggedInUser.AsObject & { +export type LoggedInUser = apiCluster.LoggedInUser & { assumedRequests?: Record; /** * acl is available only after the cluster details are fetched, as acl is not stored on disk. */ - acl?: apiCluster.ACL.AsObject; + acl?: apiCluster.ACL; }; -export type AuthProvider = apiAuthSettings.AuthProvider.AsObject; -export type AuthSettings = apiAuthSettings.AuthSettings.AsObject; +export type AuthProvider = apiAuthSettings.AuthProvider; +export type AuthSettings = apiAuthSettings.AuthSettings; -export interface FileTransferRequest - extends apiService.FileTransferRequest.AsObject { +export interface FileTransferRequest extends apiService.FileTransferRequest { serverUri: uri.ServerUri; } -export type WebauthnCredentialInfo = apiService.CredentialInfo.AsObject; +export type WebauthnCredentialInfo = apiService.CredentialInfo; export type WebauthnLoginPrompt = | WebauthnLoginTapPrompt | WebauthnLoginRetapPrompt @@ -229,7 +216,7 @@ export type WebauthnLoginCredentialPrompt = { onUserResponse(index: number): void; }; export type LoginPasswordlessRequest = - Partial; + Partial; export type TshdClient = { listRootClusters: (abortSignal?: TshAbortSignal) => Promise; @@ -327,20 +314,20 @@ export type TshdClient = { ) => Promise; listUnifiedResources: ( - params: apiService.ListUnifiedResourcesRequest.AsObject, + params: apiService.ListUnifiedResourcesRequest, abortSignal?: TshAbortSignal ) => Promise; getUserPreferences: ( - params: apiService.GetUserPreferencesRequest.AsObject, + params: apiService.GetUserPreferencesRequest, abortSignal?: TshAbortSignal ) => Promise; updateUserPreferences: ( - params: apiService.UpdateUserPreferencesRequest.AsObject, + params: apiService.UpdateUserPreferencesRequest, abortSignal?: TshAbortSignal ) => Promise; getSuggestedAccessLists: ( - params: apiService.GetSuggestedAccessListsRequest.AsObject, + params: apiService.GetSuggestedAccessListsRequest, abortSignal?: TshAbortSignal ) => Promise; promoteAccessRequest: ( @@ -433,21 +420,19 @@ export type AssumedRequest = { roles: string[]; }; -export { FileTransferDirection }; - -export type Label = apiLabel.Label.AsObject; +export type Label = apiLabel.Label; export type CreateConnectMyComputerRoleResponse = - apiService.CreateConnectMyComputerRoleResponse.AsObject; + apiService.CreateConnectMyComputerRoleResponse; export type CreateConnectMyComputerNodeTokenResponse = - apiService.CreateConnectMyComputerNodeTokenResponse.AsObject; + apiService.CreateConnectMyComputerNodeTokenResponse; export type WaitForConnectMyComputerNodeJoinResponse = - apiService.WaitForConnectMyComputerNodeJoinResponse.AsObject & { + apiService.WaitForConnectMyComputerNodeJoinResponse & { server: Server; }; export type ListUnifiedResourcesRequest = - apiService.ListUnifiedResourcesRequest.AsObject; + apiService.ListUnifiedResourcesRequest; export type ListUnifiedResourcesResponse = { resources: UnifiedResourceResponse[]; nextKey: string; @@ -461,19 +446,14 @@ export type UnifiedResourceResponse = | { kind: 'kube'; resource: Kube } | { kind: 'app'; resource: App }; -export type UserPreferences = apiService.UserPreferences.AsObject; +export type UserPreferences = apiService.UserPreferences; export type PromoteAccessRequestParams = - apiService.PromoteAccessRequestRequest.AsObject & { + apiService.PromoteAccessRequestRequest & { rootClusterUri: uri.RootClusterUri; }; -// Replaces object property with a new type -type Modify = Omit & R; - export type UpdateHeadlessAuthenticationStateParams = { rootClusterUri: uri.RootClusterUri; headlessAuthenticationId: string; state: apiService.HeadlessAuthenticationState; }; - -export { HeadlessAuthenticationState }; diff --git a/web/packages/teleterm/src/services/tshdEvents/index.ts b/web/packages/teleterm/src/services/tshdEvents/index.ts index 4136549f104a0..e52b021053fe8 100644 --- a/web/packages/teleterm/src/services/tshdEvents/index.ts +++ b/web/packages/teleterm/src/services/tshdEvents/index.ts @@ -17,40 +17,42 @@ */ import * as grpc from '@grpc/grpc-js'; -import * as api from 'gen-proto-js/teleport/lib/teleterm/v1/tshd_events_service_pb'; -import * as apiService from 'gen-proto-js/teleport/lib/teleterm/v1/tshd_events_service_grpc_pb'; -import * as protobuf from 'google-protobuf'; +import * as api from 'gen-proto-ts/teleport/lib/teleterm/v1/tshd_events_service_pb'; +import * as apiService from 'gen-proto-ts/teleport/lib/teleterm/v1/tshd_events_service_pb.grpc-server'; import * as uri from 'teleterm/ui/uri'; import Logger from 'teleterm/logger'; -import { TshdEventContextBridgeService } from 'teleterm/types'; +import { + ExtractRequestType, + ExtractResponseType, + TshdEventContextBridgeService, +} from 'teleterm/types'; import { filterSensitiveProperties } from 'teleterm/services/tshd/middleware'; -export interface ReloginRequest extends api.ReloginRequest.AsObject { +export interface ReloginRequest extends api.ReloginRequest { rootClusterUri: uri.RootClusterUri; gatewayCertExpired?: GatewayCertExpired; } -export interface GatewayCertExpired extends api.GatewayCertExpired.AsObject { +export interface GatewayCertExpired extends api.GatewayCertExpired { gatewayUri: uri.GatewayUri; targetUri: uri.DatabaseUri; } -export interface SendNotificationRequest - extends api.SendNotificationRequest.AsObject { +export interface SendNotificationRequest extends api.SendNotificationRequest { cannotProxyGatewayConnection?: CannotProxyGatewayConnection; } export interface CannotProxyGatewayConnection - extends api.CannotProxyGatewayConnection.AsObject { + extends api.CannotProxyGatewayConnection { gatewayUri: uri.GatewayUri; targetUri: uri.DatabaseUri; } -export type PromptMfaRequest = api.PromptMFARequest.AsObject & { +export type PromptMfaRequest = api.PromptMFARequest & { rootClusterUri: uri.RootClusterUri; }; export interface SendPendingHeadlessAuthenticationRequest - extends api.SendPendingHeadlessAuthenticationRequest.AsObject { + extends api.SendPendingHeadlessAuthenticationRequest { rootClusterUri: uri.RootClusterUri; } @@ -77,17 +79,7 @@ export async function createTshdEventsServer( ); const { service, setupTshdEventContextBridgeService } = createService(logger); - server.addService( - apiService.TshdEventsServiceService, - // Whatever we use for generating protobufs generated wrong types. The types say that - // server.addService expects an UntypedServiceImplementation as the second argument. - // ITshdEventsServiceService does implement UntypedServiceImplementation. - // - // However, what we actually need to pass as the second argument needs to have the shape of - // ITshdEventsServiceServer. That's why we ignore the error below. - // @ts-expect-error The generated protobuf types seem to be wrong. - service - ); + server.addService(apiService.tshdEventsServiceDefinition, service); return { resolvedAddress, setupTshdEventContextBridgeService }; } @@ -134,7 +126,7 @@ async function createServer( * See the JSDoc for TshdEventContextBridgeService for more details. */ function createService(logger: Logger): { - service: apiService.ITshdEventsServiceServer; + service: apiService.ITshdEventsService; setupTshdEventContextBridgeService: ( listener: TshdEventContextBridgeService ) => void; @@ -155,18 +147,20 @@ function createService(logger: Logger): { * through the context bridge) to a class instance (as expected by grpc-js). */ function processEvent< - RpcName extends keyof apiService.ITshdEventsServiceServer, - Request extends protobuf.Message, - Response extends protobuf.Message + RpcName extends keyof apiService.ITshdEventsService, + Request extends ExtractRequestType< + Parameters[0] + >, + Response extends ExtractResponseType< + Parameters[1] + > >( rpcName: RpcName, call: grpc.ServerUnaryCall, - callback: (error: Error, response: Response) => void, - mapResponseObjectToResponseInstance: ( - responseObject: ReturnType - ) => Response + callback: (error: Error | null, response: Response | null) => void, + mapResponseObjectToResponseInstance: (responseObject: Response) => Response ) { - const request = call.request.toObject(); + const request = call.request; logger.info(`got ${rpcName}`, filterSensitiveProperties(request)); @@ -190,12 +184,7 @@ function createService(logger: Logger): { throw new Error(`No context bridge handler for ${rpcName}`); } - contextBridgeHandler({ - // `as` is a workaround. We'd have to tell TypeScript somehow that `Request` is the same - // between `contextBridgeService` and `processEvent`, but it's not clear how to achieve that. - request: request as ReturnType, - onRequestCancelled, - }).then( + contextBridgeHandler({ request, onRequestCancelled }).then( response => { if (call.cancelled) { return; @@ -232,29 +221,25 @@ function createService(logger: Logger): { ); } - const service: apiService.ITshdEventsServiceServer = { + const service: apiService.ITshdEventsService = { relogin: (call, callback) => - processEvent('relogin', call, callback, () => new api.ReloginResponse()), + processEvent('relogin', call, callback, () => + api.ReloginResponse.create() + ), sendNotification: (call, callback) => - processEvent( - 'sendNotification', - call, - callback, - () => new api.SendNotificationResponse() + processEvent('sendNotification', call, callback, () => + api.SendNotificationResponse.create() ), sendPendingHeadlessAuthentication: (call, callback) => - processEvent( - 'sendPendingHeadlessAuthentication', - call, - callback, - () => new api.SendPendingHeadlessAuthenticationResponse() + processEvent('sendPendingHeadlessAuthentication', call, callback, () => + api.SendPendingHeadlessAuthenticationResponse.create() ), promptMFA: (call, callback) => { processEvent('promptMFA', call, callback, response => - new api.PromptMFAResponse().setTotpCode(response.totpCode) + api.PromptMFAResponse.create({ totpCode: response?.totpCode }) ); }, }; diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/google/protobuf/struct_pb.ts b/web/packages/teleterm/src/sharedProcess/api/protogen/google/protobuf/struct_pb.ts new file mode 100644 index 0000000000000..52db53154bc89 --- /dev/null +++ b/web/packages/teleterm/src/sharedProcess/api/protogen/google/protobuf/struct_pb.ts @@ -0,0 +1,484 @@ +/* eslint-disable */ +// @generated by protobuf-ts 2.9.3 with parameter long_type_number,eslint_disable,add_pb_suffix,client_grpc1,server_grpc1,ts_nocheck +// @generated from protobuf file "google/protobuf/struct.proto" (package "google.protobuf", syntax proto3) +// tslint:disable +// @ts-nocheck +// +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +import type { BinaryWriteOptions } from "@protobuf-ts/runtime"; +import type { IBinaryWriter } from "@protobuf-ts/runtime"; +import { WireType } from "@protobuf-ts/runtime"; +import type { BinaryReadOptions } from "@protobuf-ts/runtime"; +import type { IBinaryReader } from "@protobuf-ts/runtime"; +import { UnknownFieldHandler } from "@protobuf-ts/runtime"; +import type { PartialMessage } from "@protobuf-ts/runtime"; +import { reflectionMergePartial } from "@protobuf-ts/runtime"; +import { isJsonObject } from "@protobuf-ts/runtime"; +import { typeofJsonValue } from "@protobuf-ts/runtime"; +import type { JsonValue } from "@protobuf-ts/runtime"; +import type { JsonReadOptions } from "@protobuf-ts/runtime"; +import type { JsonWriteOptions } from "@protobuf-ts/runtime"; +import type { JsonObject } from "@protobuf-ts/runtime"; +import { MessageType } from "@protobuf-ts/runtime"; +/** + * `Struct` represents a structured data value, consisting of fields + * which map to dynamically typed values. In some languages, `Struct` + * might be supported by a native representation. For example, in + * scripting languages like JS a struct is represented as an + * object. The details of that representation are described together + * with the proto support for the language. + * + * The JSON representation for `Struct` is JSON object. + * + * @generated from protobuf message google.protobuf.Struct + */ +export interface Struct { + /** + * Unordered map of dynamically typed values. + * + * @generated from protobuf field: map fields = 1; + */ + fields: { + [key: string]: Value; + }; +} +/** + * `Value` represents a dynamically typed value which can be either + * null, a number, a string, a boolean, a recursive struct value, or a + * list of values. A producer of value is expected to set one of these + * variants. Absence of any variant indicates an error. + * + * The JSON representation for `Value` is JSON value. + * + * @generated from protobuf message google.protobuf.Value + */ +export interface Value { + /** + * @generated from protobuf oneof: kind + */ + kind: { + oneofKind: "nullValue"; + /** + * Represents a null value. + * + * @generated from protobuf field: google.protobuf.NullValue null_value = 1; + */ + nullValue: NullValue; + } | { + oneofKind: "numberValue"; + /** + * Represents a double value. + * + * @generated from protobuf field: double number_value = 2; + */ + numberValue: number; + } | { + oneofKind: "stringValue"; + /** + * Represents a string value. + * + * @generated from protobuf field: string string_value = 3; + */ + stringValue: string; + } | { + oneofKind: "boolValue"; + /** + * Represents a boolean value. + * + * @generated from protobuf field: bool bool_value = 4; + */ + boolValue: boolean; + } | { + oneofKind: "structValue"; + /** + * Represents a structured value. + * + * @generated from protobuf field: google.protobuf.Struct struct_value = 5; + */ + structValue: Struct; + } | { + oneofKind: "listValue"; + /** + * Represents a repeated `Value`. + * + * @generated from protobuf field: google.protobuf.ListValue list_value = 6; + */ + listValue: ListValue; + } | { + oneofKind: undefined; + }; +} +/** + * `ListValue` is a wrapper around a repeated field of values. + * + * The JSON representation for `ListValue` is JSON array. + * + * @generated from protobuf message google.protobuf.ListValue + */ +export interface ListValue { + /** + * Repeated field of dynamically typed values. + * + * @generated from protobuf field: repeated google.protobuf.Value values = 1; + */ + values: Value[]; +} +/** + * `NullValue` is a singleton enumeration to represent the null value for the + * `Value` type union. + * + * The JSON representation for `NullValue` is JSON `null`. + * + * @generated from protobuf enum google.protobuf.NullValue + */ +export enum NullValue { + /** + * Null value. + * + * @generated from protobuf enum value: NULL_VALUE = 0; + */ + NULL_VALUE = 0 +} +// @generated message type with reflection information, may provide speed optimized methods +class Struct$Type extends MessageType { + constructor() { + super("google.protobuf.Struct", [ + { no: 1, name: "fields", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => Value } } + ]); + } + /** + * Encode `Struct` to JSON object. + */ + internalJsonWrite(message: Struct, options: JsonWriteOptions): JsonValue { + let json: JsonObject = {}; + for (let [k, v] of Object.entries(message.fields)) { + json[k] = Value.toJson(v); + } + return json; + } + /** + * Decode `Struct` from JSON object. + */ + internalJsonRead(json: JsonValue, options: JsonReadOptions, target?: Struct): Struct { + if (!isJsonObject(json)) + throw new globalThis.Error("Unable to parse message " + this.typeName + " from JSON " + typeofJsonValue(json) + "."); + if (!target) + target = this.create(); + for (let [k, v] of globalThis.Object.entries(json)) { + target.fields[k] = Value.fromJson(v); + } + return target; + } + create(value?: PartialMessage): Struct { + const message = globalThis.Object.create((this.messagePrototype!)); + message.fields = {}; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Struct): Struct { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* map fields */ 1: + this.binaryReadMap1(message.fields, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap1(map: Struct["fields"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof Struct["fields"] | undefined, val: Struct["fields"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.string(); + break; + case 2: + val = Value.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field google.protobuf.Struct.fields"); + } + } + map[key ?? ""] = val ?? Value.create(); + } + internalBinaryWrite(message: Struct, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* map fields = 1; */ + for (let k of globalThis.Object.keys(message.fields)) { + writer.tag(1, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k); + writer.tag(2, WireType.LengthDelimited).fork(); + Value.internalBinaryWrite(message.fields[k], writer, options); + writer.join().join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message google.protobuf.Struct + */ +export const Struct = new Struct$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Value$Type extends MessageType { + constructor() { + super("google.protobuf.Value", [ + { no: 1, name: "null_value", kind: "enum", oneof: "kind", T: () => ["google.protobuf.NullValue", NullValue] }, + { no: 2, name: "number_value", kind: "scalar", oneof: "kind", T: 1 /*ScalarType.DOUBLE*/ }, + { no: 3, name: "string_value", kind: "scalar", oneof: "kind", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "bool_value", kind: "scalar", oneof: "kind", T: 8 /*ScalarType.BOOL*/ }, + { no: 5, name: "struct_value", kind: "message", oneof: "kind", T: () => Struct }, + { no: 6, name: "list_value", kind: "message", oneof: "kind", T: () => ListValue } + ]); + } + /** + * Encode `Value` to JSON value. + */ + internalJsonWrite(message: Value, options: JsonWriteOptions): JsonValue { + if (message.kind.oneofKind === undefined) + throw new globalThis.Error(); + switch (message.kind.oneofKind) { + case undefined: throw new globalThis.Error(); + case "boolValue": return message.kind.boolValue; + case "nullValue": return null; + case "numberValue": + let numberValue = message.kind.numberValue; + if (typeof numberValue == "number" && !Number.isFinite(numberValue)) + throw new globalThis.Error(); + return numberValue; + case "stringValue": return message.kind.stringValue; + case "listValue": + let listValueField = this.fields.find(f => f.no === 6); + if (listValueField?.kind !== "message") + throw new globalThis.Error(); + return listValueField.T().toJson(message.kind.listValue); + case "structValue": + let structValueField = this.fields.find(f => f.no === 5); + if (structValueField?.kind !== "message") + throw new globalThis.Error(); + return structValueField.T().toJson(message.kind.structValue); + } + } + /** + * Decode `Value` from JSON value. + */ + internalJsonRead(json: JsonValue, options: JsonReadOptions, target?: Value): Value { + if (!target) + target = this.create(); + switch (typeof json) { + case "number": + target.kind = { oneofKind: "numberValue", numberValue: json }; + break; + case "string": + target.kind = { oneofKind: "stringValue", stringValue: json }; + break; + case "boolean": + target.kind = { oneofKind: "boolValue", boolValue: json }; + break; + case "object": + if (json === null) { + target.kind = { oneofKind: "nullValue", nullValue: NullValue.NULL_VALUE }; + } + else if (globalThis.Array.isArray(json)) { + target.kind = { oneofKind: "listValue", listValue: ListValue.fromJson(json) }; + } + else { + target.kind = { oneofKind: "structValue", structValue: Struct.fromJson(json) }; + } + break; + default: throw new globalThis.Error("Unable to parse " + this.typeName + " from JSON " + typeofJsonValue(json)); + } + return target; + } + create(value?: PartialMessage): Value { + const message = globalThis.Object.create((this.messagePrototype!)); + message.kind = { oneofKind: undefined }; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Value): Value { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* google.protobuf.NullValue null_value */ 1: + message.kind = { + oneofKind: "nullValue", + nullValue: reader.int32() + }; + break; + case /* double number_value */ 2: + message.kind = { + oneofKind: "numberValue", + numberValue: reader.double() + }; + break; + case /* string string_value */ 3: + message.kind = { + oneofKind: "stringValue", + stringValue: reader.string() + }; + break; + case /* bool bool_value */ 4: + message.kind = { + oneofKind: "boolValue", + boolValue: reader.bool() + }; + break; + case /* google.protobuf.Struct struct_value */ 5: + message.kind = { + oneofKind: "structValue", + structValue: Struct.internalBinaryRead(reader, reader.uint32(), options, (message.kind as any).structValue) + }; + break; + case /* google.protobuf.ListValue list_value */ 6: + message.kind = { + oneofKind: "listValue", + listValue: ListValue.internalBinaryRead(reader, reader.uint32(), options, (message.kind as any).listValue) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Value, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* google.protobuf.NullValue null_value = 1; */ + if (message.kind.oneofKind === "nullValue") + writer.tag(1, WireType.Varint).int32(message.kind.nullValue); + /* double number_value = 2; */ + if (message.kind.oneofKind === "numberValue") + writer.tag(2, WireType.Bit64).double(message.kind.numberValue); + /* string string_value = 3; */ + if (message.kind.oneofKind === "stringValue") + writer.tag(3, WireType.LengthDelimited).string(message.kind.stringValue); + /* bool bool_value = 4; */ + if (message.kind.oneofKind === "boolValue") + writer.tag(4, WireType.Varint).bool(message.kind.boolValue); + /* google.protobuf.Struct struct_value = 5; */ + if (message.kind.oneofKind === "structValue") + Struct.internalBinaryWrite(message.kind.structValue, writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + /* google.protobuf.ListValue list_value = 6; */ + if (message.kind.oneofKind === "listValue") + ListValue.internalBinaryWrite(message.kind.listValue, writer.tag(6, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message google.protobuf.Value + */ +export const Value = new Value$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListValue$Type extends MessageType { + constructor() { + super("google.protobuf.ListValue", [ + { no: 1, name: "values", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Value } + ]); + } + /** + * Encode `ListValue` to JSON array. + */ + internalJsonWrite(message: ListValue, options: JsonWriteOptions): JsonValue { + return message.values.map(v => Value.toJson(v)); + } + /** + * Decode `ListValue` from JSON array. + */ + internalJsonRead(json: JsonValue, options: JsonReadOptions, target?: ListValue): ListValue { + if (!globalThis.Array.isArray(json)) + throw new globalThis.Error("Unable to parse " + this.typeName + " from JSON " + typeofJsonValue(json)); + if (!target) + target = this.create(); + let values = json.map(v => Value.fromJson(v)); + target.values.push(...values); + return target; + } + create(value?: PartialMessage): ListValue { + const message = globalThis.Object.create((this.messagePrototype!)); + message.values = []; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListValue): ListValue { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated google.protobuf.Value values */ 1: + message.values.push(Value.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListValue, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated google.protobuf.Value values = 1; */ + for (let i = 0; i < message.values.length; i++) + Value.internalBinaryWrite(message.values[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message google.protobuf.ListValue + */ +export const ListValue = new ListValue$Type(); diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_grpc_pb.d.ts b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_grpc_pb.d.ts deleted file mode 100644 index 87a48128a3e1b..0000000000000 --- a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_grpc_pb.d.ts +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Teleport - * Copyright (C) 2023 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -// package: -// file: ptyHostService.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as grpc from "grpc"; -import * as ptyHostService_pb from "./ptyHostService_pb"; -import * as google_protobuf_struct_pb from "google-protobuf/google/protobuf/struct_pb"; - -interface IPtyHostService extends grpc.ServiceDefinition { - createPtyProcess: IPtyHostService_ICreatePtyProcess; - exchangeEvents: IPtyHostService_IExchangeEvents; - getCwd: IPtyHostService_IGetCwd; -} - -interface IPtyHostService_ICreatePtyProcess extends grpc.MethodDefinition { - path: "/PtyHost/CreatePtyProcess"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize; - requestDeserialize: grpc.deserialize; - responseSerialize: grpc.serialize; - responseDeserialize: grpc.deserialize; -} -interface IPtyHostService_IExchangeEvents extends grpc.MethodDefinition { - path: "/PtyHost/ExchangeEvents"; - requestStream: true; - responseStream: true; - requestSerialize: grpc.serialize; - requestDeserialize: grpc.deserialize; - responseSerialize: grpc.serialize; - responseDeserialize: grpc.deserialize; -} -interface IPtyHostService_IGetCwd extends grpc.MethodDefinition { - path: "/PtyHost/GetCwd"; - requestStream: false; - responseStream: false; - requestSerialize: grpc.serialize; - requestDeserialize: grpc.deserialize; - responseSerialize: grpc.serialize; - responseDeserialize: grpc.deserialize; -} - -export const PtyHostService: IPtyHostService; - -export interface IPtyHostServer { - createPtyProcess: grpc.handleUnaryCall; - exchangeEvents: grpc.handleBidiStreamingCall; - getCwd: grpc.handleUnaryCall; -} - -export interface IPtyHostClient { - createPtyProcess(request: ptyHostService_pb.PtyCreate, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyId) => void): grpc.ClientUnaryCall; - createPtyProcess(request: ptyHostService_pb.PtyCreate, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyId) => void): grpc.ClientUnaryCall; - createPtyProcess(request: ptyHostService_pb.PtyCreate, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyId) => void): grpc.ClientUnaryCall; - exchangeEvents(): grpc.ClientDuplexStream; - exchangeEvents(options: Partial): grpc.ClientDuplexStream; - exchangeEvents(metadata: grpc.Metadata, options?: Partial): grpc.ClientDuplexStream; - getCwd(request: ptyHostService_pb.PtyId, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyCwd) => void): grpc.ClientUnaryCall; - getCwd(request: ptyHostService_pb.PtyId, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyCwd) => void): grpc.ClientUnaryCall; - getCwd(request: ptyHostService_pb.PtyId, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyCwd) => void): grpc.ClientUnaryCall; -} - -export class PtyHostClient extends grpc.Client implements IPtyHostClient { - constructor(address: string, credentials: grpc.ChannelCredentials, options?: object); - public createPtyProcess(request: ptyHostService_pb.PtyCreate, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyId) => void): grpc.ClientUnaryCall; - public createPtyProcess(request: ptyHostService_pb.PtyCreate, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyId) => void): grpc.ClientUnaryCall; - public createPtyProcess(request: ptyHostService_pb.PtyCreate, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyId) => void): grpc.ClientUnaryCall; - public exchangeEvents(options?: Partial): grpc.ClientDuplexStream; - public exchangeEvents(metadata?: grpc.Metadata, options?: Partial): grpc.ClientDuplexStream; - public getCwd(request: ptyHostService_pb.PtyId, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyCwd) => void): grpc.ClientUnaryCall; - public getCwd(request: ptyHostService_pb.PtyId, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyCwd) => void): grpc.ClientUnaryCall; - public getCwd(request: ptyHostService_pb.PtyId, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: ptyHostService_pb.PtyCwd) => void): grpc.ClientUnaryCall; -} diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_grpc_pb.js b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_grpc_pb.js deleted file mode 100644 index e369de46d8d52..0000000000000 --- a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_grpc_pb.js +++ /dev/null @@ -1,122 +0,0 @@ -// GENERATED CODE -- DO NOT EDIT! - -// Original file comments: -/* - * Teleport - * Copyright (C) 2023 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -// TODO(ravicious): Before introducing any changes, move this file to the /proto dir and -// remove the generate-grpc-shared script. -// -'use strict'; -var grpc = require('@grpc/grpc-js'); -var ptyHostService_pb = require('./ptyHostService_pb.js'); -var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js'); - -function serialize_PtyClientEvent(arg) { - if (!(arg instanceof ptyHostService_pb.PtyClientEvent)) { - throw new Error('Expected argument of type PtyClientEvent'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_PtyClientEvent(buffer_arg) { - return ptyHostService_pb.PtyClientEvent.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_PtyCreate(arg) { - if (!(arg instanceof ptyHostService_pb.PtyCreate)) { - throw new Error('Expected argument of type PtyCreate'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_PtyCreate(buffer_arg) { - return ptyHostService_pb.PtyCreate.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_PtyCwd(arg) { - if (!(arg instanceof ptyHostService_pb.PtyCwd)) { - throw new Error('Expected argument of type PtyCwd'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_PtyCwd(buffer_arg) { - return ptyHostService_pb.PtyCwd.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_PtyId(arg) { - if (!(arg instanceof ptyHostService_pb.PtyId)) { - throw new Error('Expected argument of type PtyId'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_PtyId(buffer_arg) { - return ptyHostService_pb.PtyId.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_PtyServerEvent(arg) { - if (!(arg instanceof ptyHostService_pb.PtyServerEvent)) { - throw new Error('Expected argument of type PtyServerEvent'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_PtyServerEvent(buffer_arg) { - return ptyHostService_pb.PtyServerEvent.deserializeBinary(new Uint8Array(buffer_arg)); -} - - -var PtyHostService = exports.PtyHostService = { - createPtyProcess: { - path: '/PtyHost/CreatePtyProcess', - requestStream: false, - responseStream: false, - requestType: ptyHostService_pb.PtyCreate, - responseType: ptyHostService_pb.PtyId, - requestSerialize: serialize_PtyCreate, - requestDeserialize: deserialize_PtyCreate, - responseSerialize: serialize_PtyId, - responseDeserialize: deserialize_PtyId, - }, - exchangeEvents: { - path: '/PtyHost/ExchangeEvents', - requestStream: true, - responseStream: true, - requestType: ptyHostService_pb.PtyClientEvent, - responseType: ptyHostService_pb.PtyServerEvent, - requestSerialize: serialize_PtyClientEvent, - requestDeserialize: deserialize_PtyClientEvent, - responseSerialize: serialize_PtyServerEvent, - responseDeserialize: deserialize_PtyServerEvent, - }, - getCwd: { - path: '/PtyHost/GetCwd', - requestStream: false, - responseStream: false, - requestType: ptyHostService_pb.PtyId, - responseType: ptyHostService_pb.PtyCwd, - requestSerialize: serialize_PtyId, - requestDeserialize: deserialize_PtyId, - responseSerialize: serialize_PtyCwd, - responseDeserialize: deserialize_PtyCwd, - }, -}; - -exports.PtyHostClient = grpc.makeGenericClientConstructor(PtyHostService); diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.d.ts b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.d.ts deleted file mode 100644 index fe71e09295a3f..0000000000000 --- a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.d.ts +++ /dev/null @@ -1,336 +0,0 @@ -/** - * Teleport - * Copyright (C) 2023 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -// package: -// file: ptyHostService.proto - -/* tslint:disable */ -/* eslint-disable */ - -import * as jspb from "google-protobuf"; -import * as google_protobuf_struct_pb from "google-protobuf/google/protobuf/struct_pb"; - -export class PtyId extends jspb.Message { - getId(): string; - setId(value: string): PtyId; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyId.AsObject; - static toObject(includeInstance: boolean, msg: PtyId): PtyId.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyId, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyId; - static deserializeBinaryFromReader(message: PtyId, reader: jspb.BinaryReader): PtyId; -} - -export namespace PtyId { - export type AsObject = { - id: string, - } -} - -export class PtyCreate extends jspb.Message { - getPath(): string; - setPath(value: string): PtyCreate; - clearArgsList(): void; - getArgsList(): Array; - setArgsList(value: Array): PtyCreate; - addArgs(value: string, index?: number): string; - getCwd(): string; - setCwd(value: string): PtyCreate; - - hasEnv(): boolean; - clearEnv(): void; - getEnv(): google_protobuf_struct_pb.Struct | undefined; - setEnv(value?: google_protobuf_struct_pb.Struct): PtyCreate; - getInitMessage(): string; - setInitMessage(value: string): PtyCreate; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyCreate.AsObject; - static toObject(includeInstance: boolean, msg: PtyCreate): PtyCreate.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyCreate, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyCreate; - static deserializeBinaryFromReader(message: PtyCreate, reader: jspb.BinaryReader): PtyCreate; -} - -export namespace PtyCreate { - export type AsObject = { - path: string, - argsList: Array, - cwd: string, - env?: google_protobuf_struct_pb.Struct.AsObject, - initMessage: string, - } -} - -export class PtyClientEvent extends jspb.Message { - - hasStart(): boolean; - clearStart(): void; - getStart(): PtyEventStart | undefined; - setStart(value?: PtyEventStart): PtyClientEvent; - - hasResize(): boolean; - clearResize(): void; - getResize(): PtyEventResize | undefined; - setResize(value?: PtyEventResize): PtyClientEvent; - - hasData(): boolean; - clearData(): void; - getData(): PtyEventData | undefined; - setData(value?: PtyEventData): PtyClientEvent; - - getEventCase(): PtyClientEvent.EventCase; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyClientEvent.AsObject; - static toObject(includeInstance: boolean, msg: PtyClientEvent): PtyClientEvent.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyClientEvent, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyClientEvent; - static deserializeBinaryFromReader(message: PtyClientEvent, reader: jspb.BinaryReader): PtyClientEvent; -} - -export namespace PtyClientEvent { - export type AsObject = { - start?: PtyEventStart.AsObject, - resize?: PtyEventResize.AsObject, - data?: PtyEventData.AsObject, - } - - export enum EventCase { - EVENT_NOT_SET = 0, - START = 2, - RESIZE = 3, - DATA = 4, - } - -} - -export class PtyServerEvent extends jspb.Message { - - hasResize(): boolean; - clearResize(): void; - getResize(): PtyEventResize | undefined; - setResize(value?: PtyEventResize): PtyServerEvent; - - hasData(): boolean; - clearData(): void; - getData(): PtyEventData | undefined; - setData(value?: PtyEventData): PtyServerEvent; - - hasOpen(): boolean; - clearOpen(): void; - getOpen(): PtyEventOpen | undefined; - setOpen(value?: PtyEventOpen): PtyServerEvent; - - hasExit(): boolean; - clearExit(): void; - getExit(): PtyEventExit | undefined; - setExit(value?: PtyEventExit): PtyServerEvent; - - hasStartError(): boolean; - clearStartError(): void; - getStartError(): PtyEventStartError | undefined; - setStartError(value?: PtyEventStartError): PtyServerEvent; - - getEventCase(): PtyServerEvent.EventCase; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyServerEvent.AsObject; - static toObject(includeInstance: boolean, msg: PtyServerEvent): PtyServerEvent.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyServerEvent, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyServerEvent; - static deserializeBinaryFromReader(message: PtyServerEvent, reader: jspb.BinaryReader): PtyServerEvent; -} - -export namespace PtyServerEvent { - export type AsObject = { - resize?: PtyEventResize.AsObject, - data?: PtyEventData.AsObject, - open?: PtyEventOpen.AsObject, - exit?: PtyEventExit.AsObject, - startError?: PtyEventStartError.AsObject, - } - - export enum EventCase { - EVENT_NOT_SET = 0, - RESIZE = 1, - DATA = 2, - OPEN = 3, - EXIT = 4, - START_ERROR = 5, - } - -} - -export class PtyEventStart extends jspb.Message { - getColumns(): number; - setColumns(value: number): PtyEventStart; - getRows(): number; - setRows(value: number): PtyEventStart; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyEventStart.AsObject; - static toObject(includeInstance: boolean, msg: PtyEventStart): PtyEventStart.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyEventStart, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyEventStart; - static deserializeBinaryFromReader(message: PtyEventStart, reader: jspb.BinaryReader): PtyEventStart; -} - -export namespace PtyEventStart { - export type AsObject = { - columns: number, - rows: number, - } -} - -export class PtyEventData extends jspb.Message { - getMessage(): string; - setMessage(value: string): PtyEventData; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyEventData.AsObject; - static toObject(includeInstance: boolean, msg: PtyEventData): PtyEventData.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyEventData, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyEventData; - static deserializeBinaryFromReader(message: PtyEventData, reader: jspb.BinaryReader): PtyEventData; -} - -export namespace PtyEventData { - export type AsObject = { - message: string, - } -} - -export class PtyEventResize extends jspb.Message { - getColumns(): number; - setColumns(value: number): PtyEventResize; - getRows(): number; - setRows(value: number): PtyEventResize; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyEventResize.AsObject; - static toObject(includeInstance: boolean, msg: PtyEventResize): PtyEventResize.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyEventResize, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyEventResize; - static deserializeBinaryFromReader(message: PtyEventResize, reader: jspb.BinaryReader): PtyEventResize; -} - -export namespace PtyEventResize { - export type AsObject = { - columns: number, - rows: number, - } -} - -export class PtyEventOpen extends jspb.Message { - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyEventOpen.AsObject; - static toObject(includeInstance: boolean, msg: PtyEventOpen): PtyEventOpen.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyEventOpen, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyEventOpen; - static deserializeBinaryFromReader(message: PtyEventOpen, reader: jspb.BinaryReader): PtyEventOpen; -} - -export namespace PtyEventOpen { - export type AsObject = { - } -} - -export class PtyEventExit extends jspb.Message { - getExitCode(): number; - setExitCode(value: number): PtyEventExit; - - hasSignal(): boolean; - clearSignal(): void; - getSignal(): number | undefined; - setSignal(value: number): PtyEventExit; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyEventExit.AsObject; - static toObject(includeInstance: boolean, msg: PtyEventExit): PtyEventExit.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyEventExit, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyEventExit; - static deserializeBinaryFromReader(message: PtyEventExit, reader: jspb.BinaryReader): PtyEventExit; -} - -export namespace PtyEventExit { - export type AsObject = { - exitCode: number, - signal?: number, - } -} - -export class PtyEventStartError extends jspb.Message { - getMessage(): string; - setMessage(value: string): PtyEventStartError; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyEventStartError.AsObject; - static toObject(includeInstance: boolean, msg: PtyEventStartError): PtyEventStartError.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyEventStartError, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyEventStartError; - static deserializeBinaryFromReader(message: PtyEventStartError, reader: jspb.BinaryReader): PtyEventStartError; -} - -export namespace PtyEventStartError { - export type AsObject = { - message: string, - } -} - -export class PtyCwd extends jspb.Message { - getCwd(): string; - setCwd(value: string): PtyCwd; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PtyCwd.AsObject; - static toObject(includeInstance: boolean, msg: PtyCwd): PtyCwd.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PtyCwd, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PtyCwd; - static deserializeBinaryFromReader(message: PtyCwd, reader: jspb.BinaryReader): PtyCwd; -} - -export namespace PtyCwd { - export type AsObject = { - cwd: string, - } -} diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.grpc-client.ts b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.grpc-client.ts new file mode 100644 index 0000000000000..69e6f944f6c2a --- /dev/null +++ b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.grpc-client.ts @@ -0,0 +1,91 @@ +/* eslint-disable */ +// @generated by protobuf-ts 2.9.3 with parameter long_type_number,eslint_disable,add_pb_suffix,client_grpc1,server_grpc1,ts_nocheck +// @generated from protobuf file "ptyHostService.proto" (syntax proto3) +// tslint:disable +// @ts-nocheck +// +// +// Teleport +// Copyright (C) 2023 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// +// +// TODO(ravicious): Before introducing any changes, move this file to the /proto dir and +// remove the generate-grpc-shared script. +// +import { PtyHost } from "./ptyHostService_pb"; +import type { BinaryWriteOptions } from "@protobuf-ts/runtime"; +import type { BinaryReadOptions } from "@protobuf-ts/runtime"; +import type { PtyCwd } from "./ptyHostService_pb"; +import type { PtyServerEvent } from "./ptyHostService_pb"; +import type { PtyClientEvent } from "./ptyHostService_pb"; +import type { PtyId } from "./ptyHostService_pb"; +import type { PtyCreate } from "./ptyHostService_pb"; +import * as grpc from "@grpc/grpc-js"; +/** + * @generated from protobuf service PtyHost + */ +export interface IPtyHostClient { + /** + * @generated from protobuf rpc: CreatePtyProcess(PtyCreate) returns (PtyId); + */ + createPtyProcess(input: PtyCreate, metadata: grpc.Metadata, options: grpc.CallOptions, callback: (err: grpc.ServiceError | null, value?: PtyId) => void): grpc.ClientUnaryCall; + createPtyProcess(input: PtyCreate, metadata: grpc.Metadata, callback: (err: grpc.ServiceError | null, value?: PtyId) => void): grpc.ClientUnaryCall; + createPtyProcess(input: PtyCreate, options: grpc.CallOptions, callback: (err: grpc.ServiceError | null, value?: PtyId) => void): grpc.ClientUnaryCall; + createPtyProcess(input: PtyCreate, callback: (err: grpc.ServiceError | null, value?: PtyId) => void): grpc.ClientUnaryCall; + /** + * @generated from protobuf rpc: ExchangeEvents(stream PtyClientEvent) returns (stream PtyServerEvent); + */ + exchangeEvents(metadata: grpc.Metadata, options?: grpc.CallOptions): grpc.ClientDuplexStream; + exchangeEvents(options?: grpc.CallOptions): grpc.ClientDuplexStream; + /** + * @generated from protobuf rpc: GetCwd(PtyId) returns (PtyCwd); + */ + getCwd(input: PtyId, metadata: grpc.Metadata, options: grpc.CallOptions, callback: (err: grpc.ServiceError | null, value?: PtyCwd) => void): grpc.ClientUnaryCall; + getCwd(input: PtyId, metadata: grpc.Metadata, callback: (err: grpc.ServiceError | null, value?: PtyCwd) => void): grpc.ClientUnaryCall; + getCwd(input: PtyId, options: grpc.CallOptions, callback: (err: grpc.ServiceError | null, value?: PtyCwd) => void): grpc.ClientUnaryCall; + getCwd(input: PtyId, callback: (err: grpc.ServiceError | null, value?: PtyCwd) => void): grpc.ClientUnaryCall; +} +/** + * @generated from protobuf service PtyHost + */ +export class PtyHostClient extends grpc.Client implements IPtyHostClient { + private readonly _binaryOptions: Partial; + constructor(address: string, credentials: grpc.ChannelCredentials, options: grpc.ClientOptions = {}, binaryOptions: Partial = {}) { + super(address, credentials, options); + this._binaryOptions = binaryOptions; + } + /** + * @generated from protobuf rpc: CreatePtyProcess(PtyCreate) returns (PtyId); + */ + createPtyProcess(input: PtyCreate, metadata: grpc.Metadata | grpc.CallOptions | ((err: grpc.ServiceError | null, value?: PtyId) => void), options?: grpc.CallOptions | ((err: grpc.ServiceError | null, value?: PtyId) => void), callback?: ((err: grpc.ServiceError | null, value?: PtyId) => void)): grpc.ClientUnaryCall { + const method = PtyHost.methods[0]; + return this.makeUnaryRequest(`/${PtyHost.typeName}/${method.name}`, (value: PtyCreate): Buffer => Buffer.from(method.I.toBinary(value, this._binaryOptions)), (value: Buffer): PtyId => method.O.fromBinary(value, this._binaryOptions), input, (metadata as any), (options as any), (callback as any)); + } + /** + * @generated from protobuf rpc: ExchangeEvents(stream PtyClientEvent) returns (stream PtyServerEvent); + */ + exchangeEvents(metadata?: grpc.Metadata | grpc.CallOptions, options?: grpc.CallOptions): grpc.ClientDuplexStream { + const method = PtyHost.methods[1]; + return this.makeBidiStreamRequest(`/${PtyHost.typeName}/${method.name}`, (value: PtyClientEvent): Buffer => Buffer.from(method.I.toBinary(value, this._binaryOptions)), (value: Buffer): PtyServerEvent => method.O.fromBinary(value, this._binaryOptions), (metadata as any), options); + } + /** + * @generated from protobuf rpc: GetCwd(PtyId) returns (PtyCwd); + */ + getCwd(input: PtyId, metadata: grpc.Metadata | grpc.CallOptions | ((err: grpc.ServiceError | null, value?: PtyCwd) => void), options?: grpc.CallOptions | ((err: grpc.ServiceError | null, value?: PtyCwd) => void), callback?: ((err: grpc.ServiceError | null, value?: PtyCwd) => void)): grpc.ClientUnaryCall { + const method = PtyHost.methods[2]; + return this.makeUnaryRequest(`/${PtyHost.typeName}/${method.name}`, (value: PtyId): Buffer => Buffer.from(method.I.toBinary(value, this._binaryOptions)), (value: Buffer): PtyCwd => method.O.fromBinary(value, this._binaryOptions), input, (metadata as any), (options as any), (callback as any)); + } +} diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.grpc-server.ts b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.grpc-server.ts new file mode 100644 index 0000000000000..fa0591e3818b6 --- /dev/null +++ b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.grpc-server.ts @@ -0,0 +1,93 @@ +/* eslint-disable */ +// @generated by protobuf-ts 2.9.3 with parameter long_type_number,eslint_disable,add_pb_suffix,client_grpc1,server_grpc1,ts_nocheck +// @generated from protobuf file "ptyHostService.proto" (syntax proto3) +// tslint:disable +// @ts-nocheck +// +// +// Teleport +// Copyright (C) 2023 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// +// +// TODO(ravicious): Before introducing any changes, move this file to the /proto dir and +// remove the generate-grpc-shared script. +// +import { PtyCwd } from "./ptyHostService_pb"; +import { PtyServerEvent } from "./ptyHostService_pb"; +import { PtyClientEvent } from "./ptyHostService_pb"; +import { PtyId } from "./ptyHostService_pb"; +import { PtyCreate } from "./ptyHostService_pb"; +import type * as grpc from "@grpc/grpc-js"; +/** + * @generated from protobuf service PtyHost + */ +export interface IPtyHost extends grpc.UntypedServiceImplementation { + /** + * @generated from protobuf rpc: CreatePtyProcess(PtyCreate) returns (PtyId); + */ + createPtyProcess: grpc.handleUnaryCall; + /** + * @generated from protobuf rpc: ExchangeEvents(stream PtyClientEvent) returns (stream PtyServerEvent); + */ + exchangeEvents: grpc.handleBidiStreamingCall; + /** + * @generated from protobuf rpc: GetCwd(PtyId) returns (PtyCwd); + */ + getCwd: grpc.handleUnaryCall; +} +/** + * @grpc/grpc-js definition for the protobuf service PtyHost. + * + * Usage: Implement the interface IPtyHost and add to a grpc server. + * + * ```typescript + * const server = new grpc.Server(); + * const service: IPtyHost = ... + * server.addService(ptyHostDefinition, service); + * ``` + */ +export const ptyHostDefinition: grpc.ServiceDefinition = { + createPtyProcess: { + path: "/PtyHost/CreatePtyProcess", + originalName: "CreatePtyProcess", + requestStream: false, + responseStream: false, + responseDeserialize: bytes => PtyId.fromBinary(bytes), + requestDeserialize: bytes => PtyCreate.fromBinary(bytes), + responseSerialize: value => Buffer.from(PtyId.toBinary(value)), + requestSerialize: value => Buffer.from(PtyCreate.toBinary(value)) + }, + exchangeEvents: { + path: "/PtyHost/ExchangeEvents", + originalName: "ExchangeEvents", + requestStream: true, + responseStream: true, + responseDeserialize: bytes => PtyServerEvent.fromBinary(bytes), + requestDeserialize: bytes => PtyClientEvent.fromBinary(bytes), + responseSerialize: value => Buffer.from(PtyServerEvent.toBinary(value)), + requestSerialize: value => Buffer.from(PtyClientEvent.toBinary(value)) + }, + getCwd: { + path: "/PtyHost/GetCwd", + originalName: "GetCwd", + requestStream: false, + responseStream: false, + responseDeserialize: bytes => PtyCwd.fromBinary(bytes), + requestDeserialize: bytes => PtyId.fromBinary(bytes), + responseSerialize: value => Buffer.from(PtyCwd.toBinary(value)), + requestSerialize: value => Buffer.from(PtyId.toBinary(value)) + } +}; diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.js b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.js deleted file mode 100644 index 8fe3572655761..0000000000000 --- a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.js +++ /dev/null @@ -1,2350 +0,0 @@ -// source: ptyHostService.proto -/** - * @fileoverview - * @enhanceable - * @suppress {missingRequire} reports error on implicit type usages. - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = require('google-protobuf'); -var goog = jspb; -var global = (function() { - if (this) { return this; } - if (typeof window !== 'undefined') { return window; } - if (typeof global !== 'undefined') { return global; } - if (typeof self !== 'undefined') { return self; } - return Function('return this')(); -}.call(null)); - -var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js'); -goog.object.extend(proto, google_protobuf_struct_pb); -goog.exportSymbol('proto.PtyClientEvent', null, global); -goog.exportSymbol('proto.PtyClientEvent.EventCase', null, global); -goog.exportSymbol('proto.PtyCreate', null, global); -goog.exportSymbol('proto.PtyCwd', null, global); -goog.exportSymbol('proto.PtyEventData', null, global); -goog.exportSymbol('proto.PtyEventExit', null, global); -goog.exportSymbol('proto.PtyEventOpen', null, global); -goog.exportSymbol('proto.PtyEventResize', null, global); -goog.exportSymbol('proto.PtyEventStart', null, global); -goog.exportSymbol('proto.PtyEventStartError', null, global); -goog.exportSymbol('proto.PtyId', null, global); -goog.exportSymbol('proto.PtyServerEvent', null, global); -goog.exportSymbol('proto.PtyServerEvent.EventCase', null, global); -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyId = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.PtyId, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyId.displayName = 'proto.PtyId'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyCreate = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.PtyCreate.repeatedFields_, null); -}; -goog.inherits(proto.PtyCreate, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyCreate.displayName = 'proto.PtyCreate'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyClientEvent = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.PtyClientEvent.oneofGroups_); -}; -goog.inherits(proto.PtyClientEvent, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyClientEvent.displayName = 'proto.PtyClientEvent'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyServerEvent = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.PtyServerEvent.oneofGroups_); -}; -goog.inherits(proto.PtyServerEvent, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyServerEvent.displayName = 'proto.PtyServerEvent'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyEventStart = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.PtyEventStart, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyEventStart.displayName = 'proto.PtyEventStart'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyEventData = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.PtyEventData, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyEventData.displayName = 'proto.PtyEventData'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyEventResize = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.PtyEventResize, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyEventResize.displayName = 'proto.PtyEventResize'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyEventOpen = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.PtyEventOpen, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyEventOpen.displayName = 'proto.PtyEventOpen'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyEventExit = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.PtyEventExit, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyEventExit.displayName = 'proto.PtyEventExit'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyEventStartError = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.PtyEventStartError, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyEventStartError.displayName = 'proto.PtyEventStartError'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.PtyCwd = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.PtyCwd, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.PtyCwd.displayName = 'proto.PtyCwd'; -} - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyId.prototype.toObject = function(opt_includeInstance) { - return proto.PtyId.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyId} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyId.toObject = function(includeInstance, msg) { - var f, obj = { - id: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyId} - */ -proto.PtyId.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyId; - return proto.PtyId.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyId} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyId} - */ -proto.PtyId.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setId(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyId.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyId.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyId} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyId.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getId(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string id = 1; - * @return {string} - */ -proto.PtyId.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.PtyId} returns this - */ -proto.PtyId.prototype.setId = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.PtyCreate.repeatedFields_ = [4]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyCreate.prototype.toObject = function(opt_includeInstance) { - return proto.PtyCreate.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyCreate} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyCreate.toObject = function(includeInstance, msg) { - var f, obj = { - path: jspb.Message.getFieldWithDefault(msg, 3, ""), - argsList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, - cwd: jspb.Message.getFieldWithDefault(msg, 5, ""), - env: (f = msg.getEnv()) && google_protobuf_struct_pb.Struct.toObject(includeInstance, f), - initMessage: jspb.Message.getFieldWithDefault(msg, 8, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyCreate} - */ -proto.PtyCreate.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyCreate; - return proto.PtyCreate.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyCreate} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyCreate} - */ -proto.PtyCreate.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setPath(value); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.addArgs(value); - break; - case 5: - var value = /** @type {string} */ (reader.readString()); - msg.setCwd(value); - break; - case 7: - var value = new google_protobuf_struct_pb.Struct; - reader.readMessage(value,google_protobuf_struct_pb.Struct.deserializeBinaryFromReader); - msg.setEnv(value); - break; - case 8: - var value = /** @type {string} */ (reader.readString()); - msg.setInitMessage(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyCreate.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyCreate.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyCreate} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyCreate.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPath(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getArgsList(); - if (f.length > 0) { - writer.writeRepeatedString( - 4, - f - ); - } - f = message.getCwd(); - if (f.length > 0) { - writer.writeString( - 5, - f - ); - } - f = message.getEnv(); - if (f != null) { - writer.writeMessage( - 7, - f, - google_protobuf_struct_pb.Struct.serializeBinaryToWriter - ); - } - f = message.getInitMessage(); - if (f.length > 0) { - writer.writeString( - 8, - f - ); - } -}; - - -/** - * optional string path = 3; - * @return {string} - */ -proto.PtyCreate.prototype.getPath = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.PtyCreate} returns this - */ -proto.PtyCreate.prototype.setPath = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * repeated string args = 4; - * @return {!Array} - */ -proto.PtyCreate.prototype.getArgsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 4)); -}; - - -/** - * @param {!Array} value - * @return {!proto.PtyCreate} returns this - */ -proto.PtyCreate.prototype.setArgsList = function(value) { - return jspb.Message.setField(this, 4, value || []); -}; - - -/** - * @param {string} value - * @param {number=} opt_index - * @return {!proto.PtyCreate} returns this - */ -proto.PtyCreate.prototype.addArgs = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.PtyCreate} returns this - */ -proto.PtyCreate.prototype.clearArgsList = function() { - return this.setArgsList([]); -}; - - -/** - * optional string cwd = 5; - * @return {string} - */ -proto.PtyCreate.prototype.getCwd = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); -}; - - -/** - * @param {string} value - * @return {!proto.PtyCreate} returns this - */ -proto.PtyCreate.prototype.setCwd = function(value) { - return jspb.Message.setProto3StringField(this, 5, value); -}; - - -/** - * optional google.protobuf.Struct env = 7; - * @return {?proto.google.protobuf.Struct} - */ -proto.PtyCreate.prototype.getEnv = function() { - return /** @type{?proto.google.protobuf.Struct} */ ( - jspb.Message.getWrapperField(this, google_protobuf_struct_pb.Struct, 7)); -}; - - -/** - * @param {?proto.google.protobuf.Struct|undefined} value - * @return {!proto.PtyCreate} returns this -*/ -proto.PtyCreate.prototype.setEnv = function(value) { - return jspb.Message.setWrapperField(this, 7, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyCreate} returns this - */ -proto.PtyCreate.prototype.clearEnv = function() { - return this.setEnv(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyCreate.prototype.hasEnv = function() { - return jspb.Message.getField(this, 7) != null; -}; - - -/** - * optional string init_message = 8; - * @return {string} - */ -proto.PtyCreate.prototype.getInitMessage = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "")); -}; - - -/** - * @param {string} value - * @return {!proto.PtyCreate} returns this - */ -proto.PtyCreate.prototype.setInitMessage = function(value) { - return jspb.Message.setProto3StringField(this, 8, value); -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.PtyClientEvent.oneofGroups_ = [[2,3,4]]; - -/** - * @enum {number} - */ -proto.PtyClientEvent.EventCase = { - EVENT_NOT_SET: 0, - START: 2, - RESIZE: 3, - DATA: 4 -}; - -/** - * @return {proto.PtyClientEvent.EventCase} - */ -proto.PtyClientEvent.prototype.getEventCase = function() { - return /** @type {proto.PtyClientEvent.EventCase} */(jspb.Message.computeOneofCase(this, proto.PtyClientEvent.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyClientEvent.prototype.toObject = function(opt_includeInstance) { - return proto.PtyClientEvent.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyClientEvent} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyClientEvent.toObject = function(includeInstance, msg) { - var f, obj = { - start: (f = msg.getStart()) && proto.PtyEventStart.toObject(includeInstance, f), - resize: (f = msg.getResize()) && proto.PtyEventResize.toObject(includeInstance, f), - data: (f = msg.getData()) && proto.PtyEventData.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyClientEvent} - */ -proto.PtyClientEvent.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyClientEvent; - return proto.PtyClientEvent.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyClientEvent} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyClientEvent} - */ -proto.PtyClientEvent.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 2: - var value = new proto.PtyEventStart; - reader.readMessage(value,proto.PtyEventStart.deserializeBinaryFromReader); - msg.setStart(value); - break; - case 3: - var value = new proto.PtyEventResize; - reader.readMessage(value,proto.PtyEventResize.deserializeBinaryFromReader); - msg.setResize(value); - break; - case 4: - var value = new proto.PtyEventData; - reader.readMessage(value,proto.PtyEventData.deserializeBinaryFromReader); - msg.setData(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyClientEvent.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyClientEvent.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyClientEvent} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyClientEvent.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStart(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.PtyEventStart.serializeBinaryToWriter - ); - } - f = message.getResize(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.PtyEventResize.serializeBinaryToWriter - ); - } - f = message.getData(); - if (f != null) { - writer.writeMessage( - 4, - f, - proto.PtyEventData.serializeBinaryToWriter - ); - } -}; - - -/** - * optional PtyEventStart start = 2; - * @return {?proto.PtyEventStart} - */ -proto.PtyClientEvent.prototype.getStart = function() { - return /** @type{?proto.PtyEventStart} */ ( - jspb.Message.getWrapperField(this, proto.PtyEventStart, 2)); -}; - - -/** - * @param {?proto.PtyEventStart|undefined} value - * @return {!proto.PtyClientEvent} returns this -*/ -proto.PtyClientEvent.prototype.setStart = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.PtyClientEvent.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyClientEvent} returns this - */ -proto.PtyClientEvent.prototype.clearStart = function() { - return this.setStart(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyClientEvent.prototype.hasStart = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional PtyEventResize resize = 3; - * @return {?proto.PtyEventResize} - */ -proto.PtyClientEvent.prototype.getResize = function() { - return /** @type{?proto.PtyEventResize} */ ( - jspb.Message.getWrapperField(this, proto.PtyEventResize, 3)); -}; - - -/** - * @param {?proto.PtyEventResize|undefined} value - * @return {!proto.PtyClientEvent} returns this -*/ -proto.PtyClientEvent.prototype.setResize = function(value) { - return jspb.Message.setOneofWrapperField(this, 3, proto.PtyClientEvent.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyClientEvent} returns this - */ -proto.PtyClientEvent.prototype.clearResize = function() { - return this.setResize(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyClientEvent.prototype.hasResize = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional PtyEventData data = 4; - * @return {?proto.PtyEventData} - */ -proto.PtyClientEvent.prototype.getData = function() { - return /** @type{?proto.PtyEventData} */ ( - jspb.Message.getWrapperField(this, proto.PtyEventData, 4)); -}; - - -/** - * @param {?proto.PtyEventData|undefined} value - * @return {!proto.PtyClientEvent} returns this -*/ -proto.PtyClientEvent.prototype.setData = function(value) { - return jspb.Message.setOneofWrapperField(this, 4, proto.PtyClientEvent.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyClientEvent} returns this - */ -proto.PtyClientEvent.prototype.clearData = function() { - return this.setData(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyClientEvent.prototype.hasData = function() { - return jspb.Message.getField(this, 4) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.PtyServerEvent.oneofGroups_ = [[1,2,3,4,5]]; - -/** - * @enum {number} - */ -proto.PtyServerEvent.EventCase = { - EVENT_NOT_SET: 0, - RESIZE: 1, - DATA: 2, - OPEN: 3, - EXIT: 4, - START_ERROR: 5 -}; - -/** - * @return {proto.PtyServerEvent.EventCase} - */ -proto.PtyServerEvent.prototype.getEventCase = function() { - return /** @type {proto.PtyServerEvent.EventCase} */(jspb.Message.computeOneofCase(this, proto.PtyServerEvent.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyServerEvent.prototype.toObject = function(opt_includeInstance) { - return proto.PtyServerEvent.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyServerEvent} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyServerEvent.toObject = function(includeInstance, msg) { - var f, obj = { - resize: (f = msg.getResize()) && proto.PtyEventResize.toObject(includeInstance, f), - data: (f = msg.getData()) && proto.PtyEventData.toObject(includeInstance, f), - open: (f = msg.getOpen()) && proto.PtyEventOpen.toObject(includeInstance, f), - exit: (f = msg.getExit()) && proto.PtyEventExit.toObject(includeInstance, f), - startError: (f = msg.getStartError()) && proto.PtyEventStartError.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyServerEvent} - */ -proto.PtyServerEvent.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyServerEvent; - return proto.PtyServerEvent.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyServerEvent} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyServerEvent} - */ -proto.PtyServerEvent.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.PtyEventResize; - reader.readMessage(value,proto.PtyEventResize.deserializeBinaryFromReader); - msg.setResize(value); - break; - case 2: - var value = new proto.PtyEventData; - reader.readMessage(value,proto.PtyEventData.deserializeBinaryFromReader); - msg.setData(value); - break; - case 3: - var value = new proto.PtyEventOpen; - reader.readMessage(value,proto.PtyEventOpen.deserializeBinaryFromReader); - msg.setOpen(value); - break; - case 4: - var value = new proto.PtyEventExit; - reader.readMessage(value,proto.PtyEventExit.deserializeBinaryFromReader); - msg.setExit(value); - break; - case 5: - var value = new proto.PtyEventStartError; - reader.readMessage(value,proto.PtyEventStartError.deserializeBinaryFromReader); - msg.setStartError(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyServerEvent.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyServerEvent.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyServerEvent} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyServerEvent.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getResize(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.PtyEventResize.serializeBinaryToWriter - ); - } - f = message.getData(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.PtyEventData.serializeBinaryToWriter - ); - } - f = message.getOpen(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.PtyEventOpen.serializeBinaryToWriter - ); - } - f = message.getExit(); - if (f != null) { - writer.writeMessage( - 4, - f, - proto.PtyEventExit.serializeBinaryToWriter - ); - } - f = message.getStartError(); - if (f != null) { - writer.writeMessage( - 5, - f, - proto.PtyEventStartError.serializeBinaryToWriter - ); - } -}; - - -/** - * optional PtyEventResize resize = 1; - * @return {?proto.PtyEventResize} - */ -proto.PtyServerEvent.prototype.getResize = function() { - return /** @type{?proto.PtyEventResize} */ ( - jspb.Message.getWrapperField(this, proto.PtyEventResize, 1)); -}; - - -/** - * @param {?proto.PtyEventResize|undefined} value - * @return {!proto.PtyServerEvent} returns this -*/ -proto.PtyServerEvent.prototype.setResize = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.PtyServerEvent.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyServerEvent} returns this - */ -proto.PtyServerEvent.prototype.clearResize = function() { - return this.setResize(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyServerEvent.prototype.hasResize = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional PtyEventData data = 2; - * @return {?proto.PtyEventData} - */ -proto.PtyServerEvent.prototype.getData = function() { - return /** @type{?proto.PtyEventData} */ ( - jspb.Message.getWrapperField(this, proto.PtyEventData, 2)); -}; - - -/** - * @param {?proto.PtyEventData|undefined} value - * @return {!proto.PtyServerEvent} returns this -*/ -proto.PtyServerEvent.prototype.setData = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.PtyServerEvent.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyServerEvent} returns this - */ -proto.PtyServerEvent.prototype.clearData = function() { - return this.setData(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyServerEvent.prototype.hasData = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional PtyEventOpen open = 3; - * @return {?proto.PtyEventOpen} - */ -proto.PtyServerEvent.prototype.getOpen = function() { - return /** @type{?proto.PtyEventOpen} */ ( - jspb.Message.getWrapperField(this, proto.PtyEventOpen, 3)); -}; - - -/** - * @param {?proto.PtyEventOpen|undefined} value - * @return {!proto.PtyServerEvent} returns this -*/ -proto.PtyServerEvent.prototype.setOpen = function(value) { - return jspb.Message.setOneofWrapperField(this, 3, proto.PtyServerEvent.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyServerEvent} returns this - */ -proto.PtyServerEvent.prototype.clearOpen = function() { - return this.setOpen(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyServerEvent.prototype.hasOpen = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional PtyEventExit exit = 4; - * @return {?proto.PtyEventExit} - */ -proto.PtyServerEvent.prototype.getExit = function() { - return /** @type{?proto.PtyEventExit} */ ( - jspb.Message.getWrapperField(this, proto.PtyEventExit, 4)); -}; - - -/** - * @param {?proto.PtyEventExit|undefined} value - * @return {!proto.PtyServerEvent} returns this -*/ -proto.PtyServerEvent.prototype.setExit = function(value) { - return jspb.Message.setOneofWrapperField(this, 4, proto.PtyServerEvent.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyServerEvent} returns this - */ -proto.PtyServerEvent.prototype.clearExit = function() { - return this.setExit(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyServerEvent.prototype.hasExit = function() { - return jspb.Message.getField(this, 4) != null; -}; - - -/** - * optional PtyEventStartError start_error = 5; - * @return {?proto.PtyEventStartError} - */ -proto.PtyServerEvent.prototype.getStartError = function() { - return /** @type{?proto.PtyEventStartError} */ ( - jspb.Message.getWrapperField(this, proto.PtyEventStartError, 5)); -}; - - -/** - * @param {?proto.PtyEventStartError|undefined} value - * @return {!proto.PtyServerEvent} returns this -*/ -proto.PtyServerEvent.prototype.setStartError = function(value) { - return jspb.Message.setOneofWrapperField(this, 5, proto.PtyServerEvent.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.PtyServerEvent} returns this - */ -proto.PtyServerEvent.prototype.clearStartError = function() { - return this.setStartError(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyServerEvent.prototype.hasStartError = function() { - return jspb.Message.getField(this, 5) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyEventStart.prototype.toObject = function(opt_includeInstance) { - return proto.PtyEventStart.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyEventStart} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventStart.toObject = function(includeInstance, msg) { - var f, obj = { - columns: jspb.Message.getFieldWithDefault(msg, 2, 0), - rows: jspb.Message.getFieldWithDefault(msg, 3, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyEventStart} - */ -proto.PtyEventStart.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyEventStart; - return proto.PtyEventStart.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyEventStart} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyEventStart} - */ -proto.PtyEventStart.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setColumns(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setRows(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyEventStart.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyEventStart.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyEventStart} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventStart.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getColumns(); - if (f !== 0) { - writer.writeUint32( - 2, - f - ); - } - f = message.getRows(); - if (f !== 0) { - writer.writeUint32( - 3, - f - ); - } -}; - - -/** - * optional uint32 columns = 2; - * @return {number} - */ -proto.PtyEventStart.prototype.getColumns = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.PtyEventStart} returns this - */ -proto.PtyEventStart.prototype.setColumns = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional uint32 rows = 3; - * @return {number} - */ -proto.PtyEventStart.prototype.getRows = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.PtyEventStart} returns this - */ -proto.PtyEventStart.prototype.setRows = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyEventData.prototype.toObject = function(opt_includeInstance) { - return proto.PtyEventData.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyEventData} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventData.toObject = function(includeInstance, msg) { - var f, obj = { - message: jspb.Message.getFieldWithDefault(msg, 2, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyEventData} - */ -proto.PtyEventData.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyEventData; - return proto.PtyEventData.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyEventData} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyEventData} - */ -proto.PtyEventData.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setMessage(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyEventData.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyEventData.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyEventData} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventData.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getMessage(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } -}; - - -/** - * optional string message = 2; - * @return {string} - */ -proto.PtyEventData.prototype.getMessage = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.PtyEventData} returns this - */ -proto.PtyEventData.prototype.setMessage = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyEventResize.prototype.toObject = function(opt_includeInstance) { - return proto.PtyEventResize.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyEventResize} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventResize.toObject = function(includeInstance, msg) { - var f, obj = { - columns: jspb.Message.getFieldWithDefault(msg, 2, 0), - rows: jspb.Message.getFieldWithDefault(msg, 3, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyEventResize} - */ -proto.PtyEventResize.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyEventResize; - return proto.PtyEventResize.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyEventResize} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyEventResize} - */ -proto.PtyEventResize.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setColumns(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setRows(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyEventResize.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyEventResize.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyEventResize} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventResize.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getColumns(); - if (f !== 0) { - writer.writeUint32( - 2, - f - ); - } - f = message.getRows(); - if (f !== 0) { - writer.writeUint32( - 3, - f - ); - } -}; - - -/** - * optional uint32 columns = 2; - * @return {number} - */ -proto.PtyEventResize.prototype.getColumns = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.PtyEventResize} returns this - */ -proto.PtyEventResize.prototype.setColumns = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional uint32 rows = 3; - * @return {number} - */ -proto.PtyEventResize.prototype.getRows = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.PtyEventResize} returns this - */ -proto.PtyEventResize.prototype.setRows = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyEventOpen.prototype.toObject = function(opt_includeInstance) { - return proto.PtyEventOpen.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyEventOpen} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventOpen.toObject = function(includeInstance, msg) { - var f, obj = { - - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyEventOpen} - */ -proto.PtyEventOpen.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyEventOpen; - return proto.PtyEventOpen.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyEventOpen} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyEventOpen} - */ -proto.PtyEventOpen.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyEventOpen.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyEventOpen.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyEventOpen} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventOpen.serializeBinaryToWriter = function(message, writer) { - var f = undefined; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyEventExit.prototype.toObject = function(opt_includeInstance) { - return proto.PtyEventExit.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyEventExit} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventExit.toObject = function(includeInstance, msg) { - var f, obj = { - exitCode: jspb.Message.getFieldWithDefault(msg, 1, 0), - signal: jspb.Message.getFieldWithDefault(msg, 2, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyEventExit} - */ -proto.PtyEventExit.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyEventExit; - return proto.PtyEventExit.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyEventExit} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyEventExit} - */ -proto.PtyEventExit.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setExitCode(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setSignal(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyEventExit.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyEventExit.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyEventExit} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventExit.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getExitCode(); - if (f !== 0) { - writer.writeUint32( - 1, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeUint32( - 2, - f - ); - } -}; - - -/** - * optional uint32 exit_code = 1; - * @return {number} - */ -proto.PtyEventExit.prototype.getExitCode = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.PtyEventExit} returns this - */ -proto.PtyEventExit.prototype.setExitCode = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional uint32 signal = 2; - * @return {number} - */ -proto.PtyEventExit.prototype.getSignal = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.PtyEventExit} returns this - */ -proto.PtyEventExit.prototype.setSignal = function(value) { - return jspb.Message.setField(this, 2, value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.PtyEventExit} returns this - */ -proto.PtyEventExit.prototype.clearSignal = function() { - return jspb.Message.setField(this, 2, undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.PtyEventExit.prototype.hasSignal = function() { - return jspb.Message.getField(this, 2) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyEventStartError.prototype.toObject = function(opt_includeInstance) { - return proto.PtyEventStartError.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyEventStartError} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventStartError.toObject = function(includeInstance, msg) { - var f, obj = { - message: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyEventStartError} - */ -proto.PtyEventStartError.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyEventStartError; - return proto.PtyEventStartError.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyEventStartError} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyEventStartError} - */ -proto.PtyEventStartError.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setMessage(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyEventStartError.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyEventStartError.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyEventStartError} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyEventStartError.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getMessage(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string message = 1; - * @return {string} - */ -proto.PtyEventStartError.prototype.getMessage = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.PtyEventStartError} returns this - */ -proto.PtyEventStartError.prototype.setMessage = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.PtyCwd.prototype.toObject = function(opt_includeInstance) { - return proto.PtyCwd.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.PtyCwd} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyCwd.toObject = function(includeInstance, msg) { - var f, obj = { - cwd: jspb.Message.getFieldWithDefault(msg, 1, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.PtyCwd} - */ -proto.PtyCwd.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.PtyCwd; - return proto.PtyCwd.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.PtyCwd} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.PtyCwd} - */ -proto.PtyCwd.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setCwd(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.PtyCwd.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.PtyCwd.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.PtyCwd} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.PtyCwd.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getCwd(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } -}; - - -/** - * optional string cwd = 1; - * @return {string} - */ -proto.PtyCwd.prototype.getCwd = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * @param {string} value - * @return {!proto.PtyCwd} returns this - */ -proto.PtyCwd.prototype.setCwd = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); -}; - - -goog.object.extend(exports, proto); diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.ts b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.ts new file mode 100644 index 0000000000000..cd6cd61badcea --- /dev/null +++ b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.ts @@ -0,0 +1,836 @@ +/* eslint-disable */ +// @generated by protobuf-ts 2.9.3 with parameter long_type_number,eslint_disable,add_pb_suffix,client_grpc1,server_grpc1,ts_nocheck +// @generated from protobuf file "ptyHostService.proto" (syntax proto3) +// tslint:disable +// @ts-nocheck +// +// +// Teleport +// Copyright (C) 2023 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// +// +// TODO(ravicious): Before introducing any changes, move this file to the /proto dir and +// remove the generate-grpc-shared script. +// +import { ServiceType } from "@protobuf-ts/runtime-rpc"; +import type { BinaryWriteOptions } from "@protobuf-ts/runtime"; +import type { IBinaryWriter } from "@protobuf-ts/runtime"; +import { WireType } from "@protobuf-ts/runtime"; +import type { BinaryReadOptions } from "@protobuf-ts/runtime"; +import type { IBinaryReader } from "@protobuf-ts/runtime"; +import { UnknownFieldHandler } from "@protobuf-ts/runtime"; +import type { PartialMessage } from "@protobuf-ts/runtime"; +import { reflectionMergePartial } from "@protobuf-ts/runtime"; +import { MessageType } from "@protobuf-ts/runtime"; +import { Struct } from "./google/protobuf/struct_pb"; +/** + * @generated from protobuf message PtyId + */ +export interface PtyId { + /** + * @generated from protobuf field: string id = 1; + */ + id: string; +} +/** + * @generated from protobuf message PtyCreate + */ +export interface PtyCreate { + /** + * @generated from protobuf field: string path = 3; + */ + path: string; + /** + * @generated from protobuf field: repeated string args = 4; + */ + args: string[]; + /** + * @generated from protobuf field: string cwd = 5; + */ + cwd: string; + /** + * @generated from protobuf field: google.protobuf.Struct env = 7; + */ + env?: Struct; + /** + * @generated from protobuf field: string init_message = 8; + */ + initMessage: string; +} +/** + * @generated from protobuf message PtyClientEvent + */ +export interface PtyClientEvent { + /** + * @generated from protobuf oneof: event + */ + event: { + oneofKind: "start"; + /** + * @generated from protobuf field: PtyEventStart start = 2; + */ + start: PtyEventStart; + } | { + oneofKind: "resize"; + /** + * @generated from protobuf field: PtyEventResize resize = 3; + */ + resize: PtyEventResize; + } | { + oneofKind: "data"; + /** + * @generated from protobuf field: PtyEventData data = 4; + */ + data: PtyEventData; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf message PtyServerEvent + */ +export interface PtyServerEvent { + /** + * @generated from protobuf oneof: event + */ + event: { + oneofKind: "resize"; + /** + * @generated from protobuf field: PtyEventResize resize = 1; + */ + resize: PtyEventResize; + } | { + oneofKind: "data"; + /** + * @generated from protobuf field: PtyEventData data = 2; + */ + data: PtyEventData; + } | { + oneofKind: "open"; + /** + * @generated from protobuf field: PtyEventOpen open = 3; + */ + open: PtyEventOpen; + } | { + oneofKind: "exit"; + /** + * @generated from protobuf field: PtyEventExit exit = 4; + */ + exit: PtyEventExit; + } | { + oneofKind: "startError"; + /** + * @generated from protobuf field: PtyEventStartError start_error = 5; + */ + startError: PtyEventStartError; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf message PtyEventStart + */ +export interface PtyEventStart { + /** + * @generated from protobuf field: uint32 columns = 2; + */ + columns: number; + /** + * @generated from protobuf field: uint32 rows = 3; + */ + rows: number; +} +/** + * @generated from protobuf message PtyEventData + */ +export interface PtyEventData { + /** + * @generated from protobuf field: string message = 2; + */ + message: string; +} +/** + * @generated from protobuf message PtyEventResize + */ +export interface PtyEventResize { + /** + * @generated from protobuf field: uint32 columns = 2; + */ + columns: number; + /** + * @generated from protobuf field: uint32 rows = 3; + */ + rows: number; +} +/** + * @generated from protobuf message PtyEventOpen + */ +export interface PtyEventOpen { +} +/** + * @generated from protobuf message PtyEventExit + */ +export interface PtyEventExit { + /** + * @generated from protobuf field: uint32 exit_code = 1; + */ + exitCode: number; + /** + * @generated from protobuf field: optional uint32 signal = 2; + */ + signal?: number; +} +/** + * @generated from protobuf message PtyEventStartError + */ +export interface PtyEventStartError { + /** + * @generated from protobuf field: string message = 1; + */ + message: string; +} +/** + * @generated from protobuf message PtyCwd + */ +export interface PtyCwd { + /** + * @generated from protobuf field: string cwd = 1; + */ + cwd: string; +} +// @generated message type with reflection information, may provide speed optimized methods +class PtyId$Type extends MessageType { + constructor() { + super("PtyId", [ + { no: 1, name: "id", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PtyId { + const message = globalThis.Object.create((this.messagePrototype!)); + message.id = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyId): PtyId { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string id */ 1: + message.id = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyId, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string id = 1; */ + if (message.id !== "") + writer.tag(1, WireType.LengthDelimited).string(message.id); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyId + */ +export const PtyId = new PtyId$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyCreate$Type extends MessageType { + constructor() { + super("PtyCreate", [ + { no: 3, name: "path", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "args", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }, + { no: 5, name: "cwd", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 7, name: "env", kind: "message", T: () => Struct }, + { no: 8, name: "init_message", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PtyCreate { + const message = globalThis.Object.create((this.messagePrototype!)); + message.path = ""; + message.args = []; + message.cwd = ""; + message.initMessage = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyCreate): PtyCreate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string path */ 3: + message.path = reader.string(); + break; + case /* repeated string args */ 4: + message.args.push(reader.string()); + break; + case /* string cwd */ 5: + message.cwd = reader.string(); + break; + case /* google.protobuf.Struct env */ 7: + message.env = Struct.internalBinaryRead(reader, reader.uint32(), options, message.env); + break; + case /* string init_message */ 8: + message.initMessage = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyCreate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string path = 3; */ + if (message.path !== "") + writer.tag(3, WireType.LengthDelimited).string(message.path); + /* repeated string args = 4; */ + for (let i = 0; i < message.args.length; i++) + writer.tag(4, WireType.LengthDelimited).string(message.args[i]); + /* string cwd = 5; */ + if (message.cwd !== "") + writer.tag(5, WireType.LengthDelimited).string(message.cwd); + /* google.protobuf.Struct env = 7; */ + if (message.env) + Struct.internalBinaryWrite(message.env, writer.tag(7, WireType.LengthDelimited).fork(), options).join(); + /* string init_message = 8; */ + if (message.initMessage !== "") + writer.tag(8, WireType.LengthDelimited).string(message.initMessage); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyCreate + */ +export const PtyCreate = new PtyCreate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyClientEvent$Type extends MessageType { + constructor() { + super("PtyClientEvent", [ + { no: 2, name: "start", kind: "message", oneof: "event", T: () => PtyEventStart }, + { no: 3, name: "resize", kind: "message", oneof: "event", T: () => PtyEventResize }, + { no: 4, name: "data", kind: "message", oneof: "event", T: () => PtyEventData } + ]); + } + create(value?: PartialMessage): PtyClientEvent { + const message = globalThis.Object.create((this.messagePrototype!)); + message.event = { oneofKind: undefined }; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyClientEvent): PtyClientEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* PtyEventStart start */ 2: + message.event = { + oneofKind: "start", + start: PtyEventStart.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).start) + }; + break; + case /* PtyEventResize resize */ 3: + message.event = { + oneofKind: "resize", + resize: PtyEventResize.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).resize) + }; + break; + case /* PtyEventData data */ 4: + message.event = { + oneofKind: "data", + data: PtyEventData.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).data) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyClientEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* PtyEventStart start = 2; */ + if (message.event.oneofKind === "start") + PtyEventStart.internalBinaryWrite(message.event.start, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* PtyEventResize resize = 3; */ + if (message.event.oneofKind === "resize") + PtyEventResize.internalBinaryWrite(message.event.resize, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* PtyEventData data = 4; */ + if (message.event.oneofKind === "data") + PtyEventData.internalBinaryWrite(message.event.data, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyClientEvent + */ +export const PtyClientEvent = new PtyClientEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyServerEvent$Type extends MessageType { + constructor() { + super("PtyServerEvent", [ + { no: 1, name: "resize", kind: "message", oneof: "event", T: () => PtyEventResize }, + { no: 2, name: "data", kind: "message", oneof: "event", T: () => PtyEventData }, + { no: 3, name: "open", kind: "message", oneof: "event", T: () => PtyEventOpen }, + { no: 4, name: "exit", kind: "message", oneof: "event", T: () => PtyEventExit }, + { no: 5, name: "start_error", kind: "message", oneof: "event", T: () => PtyEventStartError } + ]); + } + create(value?: PartialMessage): PtyServerEvent { + const message = globalThis.Object.create((this.messagePrototype!)); + message.event = { oneofKind: undefined }; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyServerEvent): PtyServerEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* PtyEventResize resize */ 1: + message.event = { + oneofKind: "resize", + resize: PtyEventResize.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).resize) + }; + break; + case /* PtyEventData data */ 2: + message.event = { + oneofKind: "data", + data: PtyEventData.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).data) + }; + break; + case /* PtyEventOpen open */ 3: + message.event = { + oneofKind: "open", + open: PtyEventOpen.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).open) + }; + break; + case /* PtyEventExit exit */ 4: + message.event = { + oneofKind: "exit", + exit: PtyEventExit.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).exit) + }; + break; + case /* PtyEventStartError start_error */ 5: + message.event = { + oneofKind: "startError", + startError: PtyEventStartError.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).startError) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyServerEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* PtyEventResize resize = 1; */ + if (message.event.oneofKind === "resize") + PtyEventResize.internalBinaryWrite(message.event.resize, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* PtyEventData data = 2; */ + if (message.event.oneofKind === "data") + PtyEventData.internalBinaryWrite(message.event.data, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* PtyEventOpen open = 3; */ + if (message.event.oneofKind === "open") + PtyEventOpen.internalBinaryWrite(message.event.open, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* PtyEventExit exit = 4; */ + if (message.event.oneofKind === "exit") + PtyEventExit.internalBinaryWrite(message.event.exit, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + /* PtyEventStartError start_error = 5; */ + if (message.event.oneofKind === "startError") + PtyEventStartError.internalBinaryWrite(message.event.startError, writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyServerEvent + */ +export const PtyServerEvent = new PtyServerEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyEventStart$Type extends MessageType { + constructor() { + super("PtyEventStart", [ + { no: 2, name: "columns", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 3, name: "rows", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): PtyEventStart { + const message = globalThis.Object.create((this.messagePrototype!)); + message.columns = 0; + message.rows = 0; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyEventStart): PtyEventStart { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 columns */ 2: + message.columns = reader.uint32(); + break; + case /* uint32 rows */ 3: + message.rows = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyEventStart, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 columns = 2; */ + if (message.columns !== 0) + writer.tag(2, WireType.Varint).uint32(message.columns); + /* uint32 rows = 3; */ + if (message.rows !== 0) + writer.tag(3, WireType.Varint).uint32(message.rows); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyEventStart + */ +export const PtyEventStart = new PtyEventStart$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyEventData$Type extends MessageType { + constructor() { + super("PtyEventData", [ + { no: 2, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PtyEventData { + const message = globalThis.Object.create((this.messagePrototype!)); + message.message = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyEventData): PtyEventData { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string message */ 2: + message.message = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyEventData, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string message = 2; */ + if (message.message !== "") + writer.tag(2, WireType.LengthDelimited).string(message.message); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyEventData + */ +export const PtyEventData = new PtyEventData$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyEventResize$Type extends MessageType { + constructor() { + super("PtyEventResize", [ + { no: 2, name: "columns", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 3, name: "rows", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): PtyEventResize { + const message = globalThis.Object.create((this.messagePrototype!)); + message.columns = 0; + message.rows = 0; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyEventResize): PtyEventResize { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 columns */ 2: + message.columns = reader.uint32(); + break; + case /* uint32 rows */ 3: + message.rows = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyEventResize, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 columns = 2; */ + if (message.columns !== 0) + writer.tag(2, WireType.Varint).uint32(message.columns); + /* uint32 rows = 3; */ + if (message.rows !== 0) + writer.tag(3, WireType.Varint).uint32(message.rows); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyEventResize + */ +export const PtyEventResize = new PtyEventResize$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyEventOpen$Type extends MessageType { + constructor() { + super("PtyEventOpen", []); + } + create(value?: PartialMessage): PtyEventOpen { + const message = globalThis.Object.create((this.messagePrototype!)); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyEventOpen): PtyEventOpen { + return target ?? this.create(); + } + internalBinaryWrite(message: PtyEventOpen, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyEventOpen + */ +export const PtyEventOpen = new PtyEventOpen$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyEventExit$Type extends MessageType { + constructor() { + super("PtyEventExit", [ + { no: 1, name: "exit_code", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 2, name: "signal", kind: "scalar", opt: true, T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): PtyEventExit { + const message = globalThis.Object.create((this.messagePrototype!)); + message.exitCode = 0; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyEventExit): PtyEventExit { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 exit_code */ 1: + message.exitCode = reader.uint32(); + break; + case /* optional uint32 signal */ 2: + message.signal = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyEventExit, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 exit_code = 1; */ + if (message.exitCode !== 0) + writer.tag(1, WireType.Varint).uint32(message.exitCode); + /* optional uint32 signal = 2; */ + if (message.signal !== undefined) + writer.tag(2, WireType.Varint).uint32(message.signal); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyEventExit + */ +export const PtyEventExit = new PtyEventExit$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyEventStartError$Type extends MessageType { + constructor() { + super("PtyEventStartError", [ + { no: 1, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PtyEventStartError { + const message = globalThis.Object.create((this.messagePrototype!)); + message.message = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyEventStartError): PtyEventStartError { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string message */ 1: + message.message = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyEventStartError, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string message = 1; */ + if (message.message !== "") + writer.tag(1, WireType.LengthDelimited).string(message.message); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyEventStartError + */ +export const PtyEventStartError = new PtyEventStartError$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PtyCwd$Type extends MessageType { + constructor() { + super("PtyCwd", [ + { no: 1, name: "cwd", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PtyCwd { + const message = globalThis.Object.create((this.messagePrototype!)); + message.cwd = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PtyCwd): PtyCwd { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string cwd */ 1: + message.cwd = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PtyCwd, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string cwd = 1; */ + if (message.cwd !== "") + writer.tag(1, WireType.LengthDelimited).string(message.cwd); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message PtyCwd + */ +export const PtyCwd = new PtyCwd$Type(); +/** + * @generated ServiceType for protobuf service PtyHost + */ +export const PtyHost = new ServiceType("PtyHost", [ + { name: "CreatePtyProcess", options: {}, I: PtyCreate, O: PtyId }, + { name: "ExchangeEvents", serverStreaming: true, clientStreaming: true, options: {}, I: PtyClientEvent, O: PtyServerEvent }, + { name: "GetCwd", options: {}, I: PtyId, O: PtyCwd } +]); diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/index.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/index.ts index 4f0f5d3778fe5..afe07d9a76920 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/index.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/index.ts @@ -17,5 +17,6 @@ */ export * from './types'; -export * from '../api/protogen/ptyHostService_grpc_pb'; +export * from '../api/protogen/ptyHostService_pb.grpc-server'; +export * from '../api/protogen/ptyHostService_pb.grpc-client'; export * from '../api/protogen/ptyHostService_pb'; diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyEventsStreamHandler.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyEventsStreamHandler.ts index 92a7953d2577d..dd122964b356c 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyEventsStreamHandler.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyEventsStreamHandler.ts @@ -20,6 +20,12 @@ import { ServerDuplexStream } from '@grpc/grpc-js'; import Logger from 'teleterm/logger'; +import { + ptyEventOneOfIsData, + ptyEventOneOfIsResize, + ptyEventOneOfIsStart, +} from 'teleterm/helpers'; + import { PtyClientEvent, PtyEventData, @@ -43,7 +49,7 @@ export class PtyEventsStreamHandler { private readonly ptyProcesses: Map ) { this.ptyId = stream.metadata.get('ptyId')[0].toString(); - this.ptyProcess = ptyProcesses.get(this.ptyId); + this.ptyProcess = ptyProcesses.get(this.ptyId)!; this.logger = new Logger(`PtyEventsStreamHandler (id: ${this.ptyId})`); stream.addListener('data', event => this.handleStreamData(event)); @@ -52,49 +58,70 @@ export class PtyEventsStreamHandler { } private handleStreamData(event: PtyClientEvent): void { - switch (event.getEventCase()) { - case PtyClientEvent.EventCase.START: - return this.handleStartEvent(event.getStart()); - case PtyClientEvent.EventCase.DATA: - return this.handleDataEvent(event.getData()); - case PtyClientEvent.EventCase.RESIZE: - return this.handleResizeEvent(event.getResize()); + if (ptyEventOneOfIsStart(event.event)) { + return this.handleStartEvent(event.event.start); + } + + if (ptyEventOneOfIsData(event.event)) { + return this.handleDataEvent(event.event.data); + } + + if (ptyEventOneOfIsResize(event.event)) { + return this.handleResizeEvent(event.event.resize); } } private handleStartEvent(event: PtyEventStart): void { this.ptyProcess.onData(data => this.stream.write( - new PtyServerEvent().setData(new PtyEventData().setMessage(data)) + PtyServerEvent.create({ + event: { + oneofKind: 'data', + data: PtyEventData.create({ message: data }), + }, + }) ) ); this.ptyProcess.onOpen(() => - this.stream.write(new PtyServerEvent().setOpen(new PtyEventOpen())) + this.stream.write( + PtyServerEvent.create({ + event: { + oneofKind: 'open', + open: PtyEventOpen.create(), + }, + }) + ) ); this.ptyProcess.onExit(({ exitCode, signal }) => this.stream.write( - new PtyServerEvent().setExit( - new PtyEventExit().setExitCode(exitCode).setSignal(signal) - ) + PtyServerEvent.create({ + event: { + oneofKind: 'exit', + exit: PtyEventExit.create({ exitCode, signal }), + }, + }) ) ); this.ptyProcess.onStartError(message => { this.stream.write( - new PtyServerEvent().setStartError( - new PtyEventStartError().setMessage(message) - ) + PtyServerEvent.create({ + event: { + oneofKind: 'startError', + startError: PtyEventStartError.create({ message }), + }, + }) ); }); - this.ptyProcess.start(event.getColumns(), event.getRows()); + this.ptyProcess.start(event.columns, event.rows); this.logger.info(`stream has started`); } private handleDataEvent(event: PtyEventData): void { - this.ptyProcess.write(event.getMessage()); + this.ptyProcess.write(event.message); } private handleResizeEvent(event: PtyEventResize): void { - this.ptyProcess.resize(event.getColumns(), event.getRows()); + this.ptyProcess.resize(event.columns, event.rows); } private handleStreamError(error: Error): void { diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyHostService.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyHostService.ts index 4a60aac44787a..651a196e5ad6d 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyHostService.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyHostService.ts @@ -20,26 +20,28 @@ import { unique } from 'teleterm/ui/utils'; import Logger from 'teleterm/logger'; +import { Struct } from 'teleterm/sharedProcess/api/protogen/google/protobuf/struct_pb'; + import { PtyProcess } from './ptyProcess'; -import { IPtyHostServer } from './../api/protogen/ptyHostService_grpc_pb'; +import { IPtyHost } from './../api/protogen/ptyHostService_pb.grpc-server'; import { PtyCwd, PtyId } from './../api/protogen/ptyHostService_pb'; import { PtyEventsStreamHandler } from './ptyEventsStreamHandler'; -export function createPtyHostService(): IPtyHostServer { +export function createPtyHostService(): IPtyHost { const logger = new Logger('PtyHostService'); const ptyProcesses = new Map(); return { createPtyProcess: (call, callback) => { - const ptyOptions = call.request.toObject(); + const ptyOptions = call.request; const ptyId = unique(); try { const ptyProcess = new PtyProcess({ path: ptyOptions.path, - args: ptyOptions.argsList, + args: ptyOptions.args, cwd: ptyOptions.cwd, ptyId, - env: call.request.getEnv()?.toJavaScript() as Record, + env: Struct.toJson(call.request.env!) as Record, initMessage: ptyOptions.initMessage, }); ptyProcesses.set(ptyId, ptyProcess); @@ -48,11 +50,11 @@ export function createPtyHostService(): IPtyHostServer { callback(error); return; } - callback(null, new PtyId().setId(ptyId)); + callback(null, PtyId.create({ id: ptyId })); logger.info(`created PTY process for id ${ptyId}`); }, getCwd: (call, callback) => { - const id = call.request.getId(); + const id = call.request.id; const ptyProcess = ptyProcesses.get(id); if (!ptyProcess) { const message = `PTY process with id: ${id} does not exist`; @@ -62,7 +64,7 @@ export function createPtyHostService(): IPtyHostServer { ptyProcess .getCwd() .then(cwd => { - const response = new PtyCwd().setCwd(cwd); + const response = PtyCwd.create({ cwd }); callback(null, response); }) .catch(error => { diff --git a/web/packages/teleterm/src/sharedProcess/sharedProcess.ts b/web/packages/teleterm/src/sharedProcess/sharedProcess.ts index 33419c8e69b11..b4f0f5c06c861 100644 --- a/web/packages/teleterm/src/sharedProcess/sharedProcess.ts +++ b/web/packages/teleterm/src/sharedProcess/sharedProcess.ts @@ -31,7 +31,8 @@ import { import { RuntimeSettings } from 'teleterm/mainProcess/types'; import Logger from 'teleterm/logger'; -import { PtyHostService } from './api/protogen/ptyHostService_grpc_pb'; +import { ptyHostDefinition } from 'teleterm/sharedProcess/api/protogen/ptyHostService_pb.grpc-server'; + import { createPtyHostService } from './ptyHost/ptyHostService'; const runtimeSettings = getRuntimeSettings(); @@ -73,8 +74,7 @@ async function initializeServer( } const server = new Server(); - // @ts-expect-error we have a typed service - server.addService(PtyHostService, createPtyHostService()); + server.addService(ptyHostDefinition, createPtyHostService()); // grpc-js requires us to pass localhost:port for TCP connections, const grpcServerAddress = address.replace('tcp://', ''); diff --git a/web/packages/teleterm/src/types.ts b/web/packages/teleterm/src/types.ts index 0244a2421fca9..1b3bcfb9ba77c 100644 --- a/web/packages/teleterm/src/types.ts +++ b/web/packages/teleterm/src/types.ts @@ -16,13 +16,15 @@ * along with this program. If not, see . */ -import { ITshdEventsServiceServer } from 'gen-proto-js/teleport/lib/teleterm/v1/tshd_events_service_grpc_pb'; +import { ITshdEventsService } from 'gen-proto-ts/teleport/lib/teleterm/v1/tshd_events_service_pb.grpc-server'; + +import { sendUnaryData, ServerUnaryCall } from 'grpc'; -import { TshdClient } from 'teleterm/services/tshd/types'; -import { PtyServiceClient } from 'teleterm/services/pty'; -import { RuntimeSettings, MainProcessClient } from 'teleterm/mainProcess/types'; -import { FileStorage } from 'teleterm/services/fileStorage'; import { Logger, LoggerService } from 'teleterm/services/logger/types'; +import { FileStorage } from 'teleterm/services/fileStorage'; +import { MainProcessClient, RuntimeSettings } from 'teleterm/mainProcess/types'; +import { PtyServiceClient } from 'teleterm/services/pty'; +import { TshdClient } from 'teleterm/services/tshd/types'; export type { Logger, @@ -78,13 +80,11 @@ export type { * actually uses the returned object. */ export type TshdEventContextBridgeService = { - [RpcName in keyof ITshdEventsServiceServer]: (args: { + [RpcName in keyof ITshdEventsService]: (args: { /** * request is the result of calling call.request.toObject() in a gRPC handler. */ - request: ReturnType< - Parameters[0]['request']['toObject'] - >; + request: ExtractRequestType[0]>; /** * onRequestCancelled sets up a callback that is called when the request gets canceled by the * client (tshd in this case). @@ -93,14 +93,18 @@ export type TshdEventContextBridgeService = { }) => Promise< // The following type maps to the object version of the response type expected as the second // argument to the callback function in a gRPC handler. - ReturnType< - Parameters< - Parameters[1] - >[1]['toObject'] - > + ExtractResponseType[1]> >; }; +export type ExtractRequestType = T extends ServerUnaryCall + ? Req + : never; + +export type ExtractResponseType = T extends sendUnaryData + ? Res + : never; + export type ElectronGlobals = { readonly mainProcessClient: MainProcessClient; readonly tshClient: TshdClient; diff --git a/web/packages/teleterm/src/ui/AppInitializer/AppInitializer.tsx b/web/packages/teleterm/src/ui/AppInitializer/AppInitializer.tsx index 5d6b0d6336eb3..c931f0fcab39a 100644 --- a/web/packages/teleterm/src/ui/AppInitializer/AppInitializer.tsx +++ b/web/packages/teleterm/src/ui/AppInitializer/AppInitializer.tsx @@ -36,11 +36,8 @@ export const AppInitializer = () => { const initializeApp = useCallback(async () => { try { await appContext.pullInitialState(); - setShouldShowUi(true); - await showStartupModalsAndNotifications(appContext); - appContext.mainProcessClient.signalUserInterfaceReadiness({ success: true, }); diff --git a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.story.tsx b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.story.tsx index 29c82eccacd28..47c2e7a0a5e13 100644 --- a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.story.tsx +++ b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.story.tsx @@ -50,7 +50,7 @@ function makeProps(): ClusterLoginPresentationProps { data: { preferredMfa: 'webauthn', localAuthEnabled: true, - authProvidersList: [], + authProviders: [], type: '', secondFactor: 'optional', hasMessageOfTheDay: false, @@ -172,7 +172,7 @@ export const SsoOnly = () => { const props = makeProps(); props.initAttempt.data.localAuthEnabled = false; props.initAttempt.data.authType = 'github'; - props.initAttempt.data.authProvidersList = [ + props.initAttempt.data.authProviders = [ { type: 'github', name: 'github', displayName: 'github' }, { type: 'saml', name: 'microsoft', displayName: 'microsoft' }, ]; @@ -205,7 +205,7 @@ export const LocalLoggedInUserWithPasswordless = () => { export const LocalWithSso = () => { const props = makeProps(); - props.initAttempt.data.authProvidersList = [ + props.initAttempt.data.authProviders = [ { type: 'github', name: 'github', displayName: 'github' }, { type: 'saml', name: 'microsoft', displayName: 'microsoft' }, ]; @@ -243,7 +243,7 @@ export const PasswordlessWithLocalLoggedInUser = () => { export const SsoWithLocalAndPasswordless = () => { const props = makeProps(); props.initAttempt.data.authType = 'github'; - props.initAttempt.data.authProvidersList = [ + props.initAttempt.data.authProviders = [ { type: 'github', name: 'github', displayName: 'github' }, { type: 'saml', name: 'microsoft', displayName: 'microsoft' }, ]; diff --git a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormLogin.tsx b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormLogin.tsx index 0da2df062128a..1653a5e3ba64c 100644 --- a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormLogin.tsx +++ b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormLogin.tsx @@ -39,7 +39,7 @@ export default function LoginForm(props: Props) { const { loginAttempt, onAbort, - authProvidersList, + authProviders, localAuthEnabled = true, shouldPromptSsoStatus, webauthnLogin, @@ -53,7 +53,7 @@ export default function LoginForm(props: Props) { return ; } - const ssoEnabled = authProvidersList?.length > 0; + const ssoEnabled = authProviders?.length > 0; // If local auth was not enabled, disregard any primary auth type config // and display sso providers if any. @@ -107,7 +107,7 @@ const Primary = ({ hasTransitionEnded, ...otherProps }: Props & StepComponentProps) => { - const ssoEnabled = otherProps.authProvidersList?.length > 0; + const ssoEnabled = otherProps.authProviders?.length > 0; let otherOptionsAvailable = true; let $primary; @@ -161,7 +161,7 @@ const Secondary = ({ refCallback, ...otherProps }: Props & StepComponentProps) => { - const ssoEnabled = otherProps.authProvidersList?.length > 0; + const ssoEnabled = otherProps.authProviders?.length > 0; const { primaryAuthType, allowPasswordless } = otherProps; let $secondary; diff --git a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormSso/FormSso.tsx b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormSso/FormSso.tsx index a51d308a2ef08..9aa3474e0d36e 100644 --- a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormSso/FormSso.tsx +++ b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormSso/FormSso.tsx @@ -25,7 +25,7 @@ import type { Props } from '../FormLogin'; export const FormSso = ({ loginAttempt, - authProvidersList, + authProviders, onLoginWithSso, autoFocus = false, }: Props) => { @@ -34,7 +34,7 @@ export const FormSso = ({ diff --git a/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.story.tsx b/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.story.tsx index 981829732c491..29fd1e4c12f94 100644 --- a/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.story.tsx +++ b/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.story.tsx @@ -136,7 +136,7 @@ export function NoAccess() { export function AccessUnknown() { const cluster = makeRootCluster(); - cluster.loggedInUser.userType = UserType.USER_TYPE_UNSPECIFIED; + cluster.loggedInUser.userType = UserType.UNSPECIFIED; const appContext = new MockAppContext({}); return ( diff --git a/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.test.tsx b/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.test.tsx index 6f9cae7f07f4a..5d26f150de4d2 100644 --- a/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.test.tsx +++ b/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Setup.test.tsx @@ -167,7 +167,7 @@ function setupAppContext(): { list: true, read: true, edit: true, - pb_delete: true, + delete: true, use: true, }, }, diff --git a/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Status.story.tsx b/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Status.story.tsx index a19806d2937e9..0f46c1cdf5376 100644 --- a/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Status.story.tsx +++ b/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Status.story.tsx @@ -68,7 +68,7 @@ export function Running() { Promise.resolve( makeServer({ hostname: 'staging-mac-mini', - labelsList: makeLabelsList({ + labels: makeLabelsList({ hostname: 'staging-mac-mini', 'teleport.dev/connect-my-computer/owner': 'testuser@goteleport.com', }), diff --git a/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Status.tsx b/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Status.tsx index dc2e1462e96a4..b28493ecd3458 100644 --- a/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Status.tsx +++ b/web/packages/teleterm/src/ui/ConnectMyComputer/DocumentConnectMyComputer/Status.tsx @@ -227,7 +227,7 @@ export function Status(props: { closeDocument?: () => void }) { {/* Explicitly check for existence of agentNode because Transition doesn't seem to unmount immediately when `in` becomes falsy. */} - {agentNode?.labelsList && renderLabels(agentNode.labelsList)} + {agentNode?.labels && renderLabels(agentNode.labels)} )} diff --git a/web/packages/teleterm/src/ui/ConnectMyComputer/access.test.ts b/web/packages/teleterm/src/ui/ConnectMyComputer/access.test.ts index 494c66a6d31f7..cbe29910e407d 100644 --- a/web/packages/teleterm/src/ui/ConnectMyComputer/access.test.ts +++ b/web/packages/teleterm/src/ui/ConnectMyComputer/access.test.ts @@ -70,7 +70,7 @@ test.each(testCases)('$name', testCase => { list: false, use: false, read: false, - pb_delete: false, + delete: false, }, }, }); diff --git a/web/packages/teleterm/src/ui/ConnectMyComputer/access.ts b/web/packages/teleterm/src/ui/ConnectMyComputer/access.ts index bea3c41961baf..2729cba25192e 100644 --- a/web/packages/teleterm/src/ui/ConnectMyComputer/access.ts +++ b/web/packages/teleterm/src/ui/ConnectMyComputer/access.ts @@ -52,13 +52,13 @@ export function getConnectMyComputerAccess( if ( !loggedInUser || - loggedInUser.userType === tsh.UserType.USER_TYPE_UNSPECIFIED || + loggedInUser.userType === tsh.UserType.UNSPECIFIED || !loggedInUser.acl ) { return { status: 'unknown' }; } - if (loggedInUser.userType === tsh.UserType.USER_TYPE_SSO) { + if (loggedInUser.userType === tsh.UserType.SSO) { return { status: 'no-access', reason: 'sso-user' }; } diff --git a/web/packages/teleterm/src/ui/ConnectMyComputer/connectMyComputerContext.test.tsx b/web/packages/teleterm/src/ui/ConnectMyComputer/connectMyComputerContext.test.tsx index 12fadfe00acd4..714df65ef1af9 100644 --- a/web/packages/teleterm/src/ui/ConnectMyComputer/connectMyComputerContext.test.tsx +++ b/web/packages/teleterm/src/ui/ConnectMyComputer/connectMyComputerContext.test.tsx @@ -58,7 +58,7 @@ function getMocks() { list: false, use: false, read: false, - pb_delete: false, + delete: false, }, }, }), diff --git a/web/packages/teleterm/src/ui/DocumentCluster/ActionButtons.story.tsx b/web/packages/teleterm/src/ui/DocumentCluster/ActionButtons.story.tsx index 67f80c77286f9..f0aa95f897ae8 100644 --- a/web/packages/teleterm/src/ui/DocumentCluster/ActionButtons.story.tsx +++ b/web/packages/teleterm/src/ui/DocumentCluster/ActionButtons.story.tsx @@ -114,7 +114,7 @@ function HttpApp() { function Server() { const appContext = new MockAppContext(); const testCluster = makeRootCluster(); - testCluster.loggedInUser.sshLoginsList = ['ec2-user']; + testCluster.loggedInUser.sshLogins = ['ec2-user']; appContext.workspacesService.setState(d => { d.rootClusterUri = testCluster.uri; }); diff --git a/web/packages/teleterm/src/ui/DocumentCluster/ActionButtons.tsx b/web/packages/teleterm/src/ui/DocumentCluster/ActionButtons.tsx index a2b881abe7c1c..bcdb9b3a33ede 100644 --- a/web/packages/teleterm/src/ui/DocumentCluster/ActionButtons.tsx +++ b/web/packages/teleterm/src/ui/DocumentCluster/ActionButtons.tsx @@ -50,7 +50,7 @@ export function ConnectServerActionButton(props: { function getSshLogins(): string[] { const cluster = ctx.clustersService.findClusterByResource(props.server.uri); - return cluster?.loggedInUser?.sshLoginsList || []; + return cluster?.loggedInUser?.sshLogins || []; } function connect(login: string): void { diff --git a/web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.story.tsx b/web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.story.tsx index 211c19075240e..2337cbd6276ec 100644 --- a/web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.story.tsx +++ b/web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.story.tsx @@ -65,13 +65,13 @@ export const OnlineEmptyResourcesAndCanAddResourcesAndConnectComputer = () => { makeRootCluster({ uri: rootClusterDoc.clusterUri, loggedInUser: makeLoggedInUser({ - userType: tsh.UserType.USER_TYPE_LOCAL, + userType: tsh.UserType.LOCAL, acl: { tokens: { create: true, list: true, edit: true, - pb_delete: true, + delete: true, read: true, use: true, }, @@ -101,13 +101,13 @@ export const OnlineEmptyResourcesAndCanAddResourcesButCannotConnectComputer = makeRootCluster({ uri: rootClusterDoc.clusterUri, loggedInUser: makeLoggedInUser({ - userType: tsh.UserType.USER_TYPE_SSO, + userType: tsh.UserType.SSO, acl: { tokens: { create: true, list: true, edit: true, - pb_delete: true, + delete: true, read: true, use: true, }, @@ -141,7 +141,7 @@ export const OnlineEmptyResourcesAndCannotAddResources = () => { create: false, list: true, edit: true, - pb_delete: true, + delete: true, read: true, use: true, }, diff --git a/web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.test.tsx b/web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.test.tsx index edfa57a91194c..5d6802dfdce64 100644 --- a/web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.test.tsx +++ b/web/packages/teleterm/src/ui/DocumentCluster/DocumentCluster.test.tsx @@ -48,13 +48,13 @@ it('displays a button for Connect My Computer in the empty state if the user can makeRootCluster({ uri: doc.clusterUri, loggedInUser: makeLoggedInUser({ - userType: tsh.UserType.USER_TYPE_LOCAL, + userType: tsh.UserType.LOCAL, acl: { tokens: { create: true, list: true, edit: true, - pb_delete: true, + delete: true, read: true, use: true, }, @@ -118,13 +118,13 @@ it('does not display a button for Connect My Computer in the empty state if the makeRootCluster({ uri: doc.clusterUri, loggedInUser: makeLoggedInUser({ - userType: tsh.UserType.USER_TYPE_LOCAL, + userType: tsh.UserType.LOCAL, acl: { tokens: { create: false, list: true, edit: true, - pb_delete: true, + delete: true, read: true, use: true, }, diff --git a/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx b/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx index dae70baace1ae..0437934111708 100644 --- a/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx +++ b/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx @@ -37,10 +37,10 @@ import * as icons from 'design/Icon'; import Image from 'design/Image'; import stack from 'design/assets/resources/stack.png'; -import { DefaultTab } from 'shared/services/unifiedResourcePreferences'; - import { Attempt } from 'shared/hooks/useAsync'; +import { DefaultTab } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; + import { UnifiedResourceResponse, UserPreferences, @@ -86,8 +86,7 @@ export function UnifiedResources(props: { () => ({ kinds: props.queryParams.resourceKinds, sort: props.queryParams.sort, - pinnedOnly: - unifiedResourcePreferences.defaultTab === DefaultTab.DEFAULT_TAB_PINNED, + pinnedOnly: unifiedResourcePreferences.defaultTab === DefaultTab.PINNED, search: props.queryParams.advancedSearchEnabled ? '' : props.queryParams.search, @@ -190,7 +189,7 @@ const Resources = memo( field: props.queryParams.sort.fieldName, }, search: props.queryParams.search, - kindsList: props.queryParams.kinds, + kinds: props.queryParams.kinds, query: props.queryParams.query, pinnedOnly: props.queryParams.pinnedOnly, startKey: paginationParams.startKey, @@ -228,24 +227,23 @@ const Resources = memo( return cleanup; }, [onResourcesRefreshRequest, fetch, clear]); - const resourceIdsList = - props.userPreferences.clusterPreferences?.pinnedResources - ?.resourceIdsList; + const resourceIds = + props.userPreferences.clusterPreferences?.pinnedResources?.resourceIds; const { updateUserPreferences } = props; const pinning = useMemo(() => { - return resourceIdsList + return resourceIds ? { kind: 'supported', - getClusterPinnedResources: async () => resourceIdsList, + getClusterPinnedResources: async () => resourceIds, updateClusterPinnedResources: pinnedIds => updateUserPreferences({ clusterPreferences: { - pinnedResources: { resourceIdsList: pinnedIds }, + pinnedResources: { resourceIds: pinnedIds }, }, }), } : { kind: 'not-supported' }; - }, [updateUserPreferences, resourceIdsList]); + }, [updateUserPreferences, resourceIds]); return ( { const newPreferences: UserPreferences = { clusterPreferences: {}, unifiedResourcePreferences: { - viewMode: ViewMode.VIEW_MODE_LIST, - defaultTab: DefaultTab.DEFAULT_TAB_PINNED, - labelsViewMode: LabelsViewMode.LABELS_VIEW_MODE_COLLAPSED, + viewMode: ViewMode.LIST, + defaultTab: DefaultTab.PINNED, + labelsViewMode: LabelsViewMode.COLLAPSED, }, }; @@ -201,9 +202,9 @@ describe('updating preferences', () => { const newPreferences: UserPreferences = { clusterPreferences: {}, unifiedResourcePreferences: { - viewMode: ViewMode.VIEW_MODE_LIST, - defaultTab: DefaultTab.DEFAULT_TAB_PINNED, - labelsViewMode: LabelsViewMode.LABELS_VIEW_MODE_COLLAPSED, + viewMode: ViewMode.LIST, + defaultTab: DefaultTab.PINNED, + labelsViewMode: LabelsViewMode.COLLAPSED, }, }; @@ -232,11 +233,11 @@ describe('updating preferences', () => { // (e.g., because they were changed it in the browser in the meantime) act(() => resolveUpdateUserPreferencesPromise({ - clusterPreferences: { pinnedResources: { resourceIdsList: ['abc'] } }, + clusterPreferences: { pinnedResources: { resourceIds: ['abc'] } }, unifiedResourcePreferences: { - viewMode: ViewMode.VIEW_MODE_CARD, - defaultTab: DefaultTab.DEFAULT_TAB_PINNED, - labelsViewMode: LabelsViewMode.LABELS_VIEW_MODE_COLLAPSED, + viewMode: ViewMode.CARD, + defaultTab: DefaultTab.PINNED, + labelsViewMode: LabelsViewMode.COLLAPSED, }, }) ); @@ -248,7 +249,7 @@ describe('updating preferences', () => { ); expect( result.current.userPreferences.clusterPreferences.pinnedResources - .resourceIdsList + .resourceIds ).toEqual(['abc']); }); }); diff --git a/web/packages/teleterm/src/ui/DocumentCluster/useUserPreferences.ts b/web/packages/teleterm/src/ui/DocumentCluster/useUserPreferences.ts index 033ac6fc31fdb..f1113f509d8b6 100644 --- a/web/packages/teleterm/src/ui/DocumentCluster/useUserPreferences.ts +++ b/web/packages/teleterm/src/ui/DocumentCluster/useUserPreferences.ts @@ -32,10 +32,10 @@ import { import { DefaultTab, - ViewMode, - UnifiedResourcePreferences, LabelsViewMode, -} from 'shared/services/unifiedResourcePreferences'; + UnifiedResourcePreferences, + ViewMode, +} from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; import { useAppContext } from 'teleterm/ui/appContextProvider'; @@ -62,16 +62,16 @@ export function useUserPreferences(clusterUri: ClusterUri): { routing.ensureRootClusterUri(clusterUri) ) ) || { - defaultTab: DefaultTab.DEFAULT_TAB_ALL, - viewMode: ViewMode.VIEW_MODE_CARD, - labelsViewMode: LabelsViewMode.LABELS_VIEW_MODE_COLLAPSED, + defaultTab: DefaultTab.ALL, + viewMode: ViewMode.CARD, + labelsViewMode: LabelsViewMode.COLLAPSED, } ); const [clusterPreferences, setClusterPreferences] = useState< UserPreferences['clusterPreferences'] >({ // we pass an empty array, so pinning is enabled by default - pinnedResources: { resourceIdsList: [] }, + pinnedResources: { resourceIds: [] }, }); const [initialFetchAttempt, runInitialFetchAttempt] = useAsync( @@ -221,17 +221,16 @@ function mergeWithDefaultUnifiedResourcePreferences( return { defaultTab: unifiedResourcePreferences ? unifiedResourcePreferences.defaultTab - : DefaultTab.DEFAULT_TAB_ALL, + : DefaultTab.ALL, viewMode: unifiedResourcePreferences && - unifiedResourcePreferences.viewMode !== ViewMode.VIEW_MODE_UNSPECIFIED + unifiedResourcePreferences.viewMode !== ViewMode.UNSPECIFIED ? unifiedResourcePreferences.viewMode - : ViewMode.VIEW_MODE_CARD, + : ViewMode.CARD, labelsViewMode: unifiedResourcePreferences && - unifiedResourcePreferences.labelsViewMode !== - LabelsViewMode.LABELS_VIEW_MODE_UNSPECIFIED + unifiedResourcePreferences.labelsViewMode !== LabelsViewMode.UNSPECIFIED ? unifiedResourcePreferences.labelsViewMode - : LabelsViewMode.LABELS_VIEW_MODE_COLLAPSED, + : LabelsViewMode.COLLAPSED, }; } diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/useTshFileTransferHandlers.ts b/web/packages/teleterm/src/ui/DocumentTerminal/useTshFileTransferHandlers.ts index 7eed1e058c741..5fdc9c3b2835e 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/useTshFileTransferHandlers.ts +++ b/web/packages/teleterm/src/ui/DocumentTerminal/useTshFileTransferHandlers.ts @@ -21,7 +21,8 @@ import { createFileTransferEventsEmitter, } from 'shared/components/FileTransfer'; -import { FileTransferDirection } from 'teleterm/services/tshd/types'; +import { FileTransferDirection } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb'; + import { retryWithRelogin } from 'teleterm/ui/utils'; import { useAppContext } from 'teleterm/ui/appContextProvider'; import { IAppContext } from 'teleterm/ui/types'; @@ -40,7 +41,7 @@ export function useTshFileTransferHandlers() { appContext, file, abortController, - FileTransferDirection.FILE_TRANSFER_DIRECTION_UPLOAD + FileTransferDirection.UPLOAD ); }, download( @@ -51,7 +52,7 @@ export function useTshFileTransferHandlers() { appContext, file, abortController, - FileTransferDirection.FILE_TRANSFER_DIRECTION_DOWNLOAD + FileTransferDirection.DOWNLOAD ); }, }; diff --git a/web/packages/teleterm/src/ui/HeadlessAuthn/HeadlessAuthentication.tsx b/web/packages/teleterm/src/ui/HeadlessAuthn/HeadlessAuthentication.tsx index 298cd8cfeaddf..83cfc4b78c896 100644 --- a/web/packages/teleterm/src/ui/HeadlessAuthn/HeadlessAuthentication.tsx +++ b/web/packages/teleterm/src/ui/HeadlessAuthn/HeadlessAuthentication.tsx @@ -20,11 +20,11 @@ import React, { useRef, useEffect } from 'react'; import { useAsync } from 'shared/hooks/useAsync'; +import { HeadlessAuthenticationState } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb'; + import { useAppContext } from 'teleterm/ui/appContextProvider'; import { RootClusterUri } from 'teleterm/ui/uri'; -import { HeadlessAuthenticationState } from 'teleterm/services/tshd/types'; - import { HeadlessPrompt } from './HeadlessPrompt'; interface HeadlessAuthenticationProps { @@ -55,7 +55,7 @@ export function HeadlessAuthentication(props: HeadlessAuthenticationProps) { async function handleHeadlessApprove(): Promise { const [, error] = await updateHeadlessState( - HeadlessAuthenticationState.HEADLESS_AUTHENTICATION_STATE_APPROVED + HeadlessAuthenticationState.APPROVED ); if (!error) { props.onSuccess(); @@ -64,7 +64,7 @@ export function HeadlessAuthentication(props: HeadlessAuthenticationProps) { async function handleHeadlessReject(): Promise { const [, error] = await updateHeadlessState( - HeadlessAuthenticationState.HEADLESS_AUTHENTICATION_STATE_DENIED + HeadlessAuthenticationState.DENIED ); if (!error) { props.onSuccess(); diff --git a/web/packages/teleterm/src/ui/Search/actions.tsx b/web/packages/teleterm/src/ui/Search/actions.tsx index 7f6ee5d16c326..a76478fdc9079 100644 --- a/web/packages/teleterm/src/ui/Search/actions.tsx +++ b/web/packages/teleterm/src/ui/Search/actions.tsx @@ -65,7 +65,7 @@ export function mapToAction( parameter: { getSuggestions: async () => ctx.clustersService.findClusterByResource(result.resource.uri) - ?.loggedInUser?.sshLoginsList, + ?.loggedInUser?.sshLogins, placeholder: 'Provide login', }, perform: login => { diff --git a/web/packages/teleterm/src/ui/Search/pickers/ActionPicker.tsx b/web/packages/teleterm/src/ui/Search/pickers/ActionPicker.tsx index 7bf4b6b4edf6c..e925389c276c2 100644 --- a/web/packages/teleterm/src/ui/Search/pickers/ActionPicker.tsx +++ b/web/packages/teleterm/src/ui/Search/pickers/ActionPicker.tsx @@ -966,7 +966,7 @@ function Labels( scoreMap.set(match.labelName, currentScore + match.score); }); - const sortedLabelsList = [...searchResult.resource.labelsList]; + const sortedLabelsList = [...searchResult.resource.labels]; sortedLabelsList.sort( (a, b) => // Highest score first. diff --git a/web/packages/teleterm/src/ui/Search/pickers/results.story.tsx b/web/packages/teleterm/src/ui/Search/pickers/results.story.tsx index e87c399c961d5..263e9d72f432b 100644 --- a/web/packages/teleterm/src/ui/Search/pickers/results.story.tsx +++ b/web/packages/teleterm/src/ui/Search/pickers/results.story.tsx @@ -110,7 +110,7 @@ const SearchResultItems = () => { hostname: 'long-label-list', uri: `${clusterUri}/servers/2f96e498-88ec-442f-a25b-569fa915041c`, name: '2f96e498-88ec-442f-a25b-569fa915041c', - labelsList: makeLabelsList({ + labels: makeLabelsList({ arch: 'aarch64', external: '32.192.113.93', internal: '10.0.0.175', @@ -127,7 +127,7 @@ const SearchResultItems = () => { tunnel: true, uri: `${clusterUri}/servers/90a29595-aac7-42eb-a484-c6c0e23f1a21`, name: '90a29595-aac7-42eb-a484-c6c0e23f1a21', - labelsList: makeLabelsList({ + labels: makeLabelsList({ arch: 'aarch64', service: 'ansible', external: '32.192.113.93', @@ -144,7 +144,7 @@ const SearchResultItems = () => { tunnel: true, uri: `${clusterUri}/servers/bbaaceba-6bd1-4750-9d3d-1a80e0cc8a63`, name: 'bbaaceba-6bd1-4750-9d3d-1a80e0cc8a63', - labelsList: makeLabelsList({ + labels: makeLabelsList({ internal: '10.0.0.175', service: 'ansible', external: '32.192.113.93', @@ -158,7 +158,7 @@ const SearchResultItems = () => { hostname: 'super-long-server-name-with-uuid-2f96e498-88ec-442f-a25b-569fa915041c', uri: `${longClusterUri}/servers/super-long-desc`, - labelsList: makeLabelsList({ + labels: makeLabelsList({ internal: '10.0.0.175', service: 'ansible', external: '32.192.113.93', @@ -172,7 +172,7 @@ const SearchResultItems = () => { uri: `${clusterUri}/apps/no-desc`, name: 'no-desc', desc: '', - labelsList: makeLabelsList({ + labels: makeLabelsList({ access: 'cloudwatch-metrics,ec2,s3,cloudtrail', 'aws/Environment': 'demo-13-biz', 'aws/Owner': 'foobar', @@ -187,7 +187,7 @@ const SearchResultItems = () => { uri: `${clusterUri}/apps/short-desc`, name: 'short-desc', desc: 'Lorem ipsum', - labelsList: makeLabelsList({ + labels: makeLabelsList({ access: 'cloudwatch-metrics,ec2,s3,cloudtrail', 'aws/Environment': 'demo-13-biz', 'aws/Owner': 'foobar', @@ -202,7 +202,7 @@ const SearchResultItems = () => { uri: `${clusterUri}/apps/long-desc`, name: 'long-desc', desc: 'Eget dignissim lectus nisi vitae nunc', - labelsList: makeLabelsList({ + labels: makeLabelsList({ access: 'cloudwatch-metrics,ec2,s3,cloudtrail', 'aws/Environment': 'demo-13-biz', 'aws/Owner': 'foobar', @@ -217,7 +217,7 @@ const SearchResultItems = () => { uri: `${clusterUri}/apps/super-long-desc`, name: 'super-long-desc', desc: 'Duis id tortor at purus tincidunt finibus. Mauris eu semper orci, non commodo lacus. Praesent sollicitudin magna id laoreet porta. Nunc lobortis varius sem vel fringilla.', - labelsList: makeLabelsList({ + labels: makeLabelsList({ access: 'cloudwatch-metrics,ec2,s3,cloudtrail', 'aws/Environment': 'demo-13-biz', 'aws/Owner': 'foobar', @@ -232,7 +232,7 @@ const SearchResultItems = () => { name: 'super-long-app-with-uuid-1f96e498-88ec-442f-a25b-569fa915041c', desc: 'short-desc', uri: `${longClusterUri}/apps/super-long-desc`, - labelsList: makeLabelsList({ + labels: makeLabelsList({ access: 'cloudwatch-metrics,ec2,s3,cloudtrail', 'aws/Environment': 'demo-13-biz', 'aws/Owner': 'foobar', @@ -248,7 +248,7 @@ const SearchResultItems = () => { uri: `${clusterUri}/dbs/no-desc`, name: 'no-desc', desc: '', - labelsList: makeLabelsList({ + labels: makeLabelsList({ 'aws/Accounting': 'dev-ops', 'aws/Environment': 'demo-13-biz', 'aws/Name': 'db-bastion-4-13biz', @@ -266,7 +266,7 @@ const SearchResultItems = () => { uri: `${clusterUri}/dbs/short-desc`, name: 'short-desc', desc: 'Lorem ipsum', - labelsList: makeLabelsList({ + labels: makeLabelsList({ 'aws/Environment': 'demo-13-biz', 'aws/Name': 'db-bastion-4-13biz', 'aws/Accounting': 'dev-ops', @@ -284,7 +284,7 @@ const SearchResultItems = () => { uri: `${clusterUri}/dbs/long-desc`, name: 'long-desc', desc: 'Eget dignissim lectus nisi vitae nunc', - labelsList: makeLabelsList({ + labels: makeLabelsList({ 'aws/Environment': 'demo-13-biz', 'aws/Name': 'db-bastion-4-13biz', 'aws/Accounting': 'dev-ops', @@ -302,7 +302,7 @@ const SearchResultItems = () => { uri: `${clusterUri}/dbs/super-long-desc`, name: 'super-long-desc', desc: 'Duis id tortor at purus tincidunt finibus. Mauris eu semper orci, non commodo lacus. Praesent sollicitudin magna id laoreet porta. Nunc lobortis varius sem vel fringilla.', - labelsList: makeLabelsList({ + labels: makeLabelsList({ 'aws/Environment': 'demo-13-biz', 'aws/Accounting': 'dev-ops', 'aws/Name': 'db-bastion-4-13biz', @@ -319,7 +319,7 @@ const SearchResultItems = () => { resource: makeDatabase({ name: 'super-long-server-db-with-uuid-2f96e498-88ec-442f-a25b-569fa915041c', uri: `${longClusterUri}/dbs/super-long-desc`, - labelsList: makeLabelsList({ + labels: makeLabelsList({ 'aws/Environment': 'demo-13-biz', 'aws/Accounting': 'dev-ops', 'aws/Name': 'db-bastion-4-13biz', @@ -335,7 +335,7 @@ const SearchResultItems = () => { kind: 'kube', resource: makeKube({ name: 'short-label-list', - labelsList: makeLabelsList({ + labels: makeLabelsList({ 'im-just-a-smol': 'kube', kube: 'kubersson', with: 'little-to-no-labels', @@ -347,7 +347,7 @@ const SearchResultItems = () => { resource: makeKube({ name: 'long-label-list', uri: `${clusterUri}/kubes/long-label-list`, - labelsList: makeLabelsList({ + labels: makeLabelsList({ 'aws/Environment': 'demo-13-biz', 'aws/Owner': 'foobar', 'aws/Name': 'db-bastion-4-13biz', @@ -361,7 +361,7 @@ const SearchResultItems = () => { resource: makeKube({ name: 'super-long-kube-name-with-uuid-2f96e498-88ec-442f-a25b-569fa915041c', uri: `/clusters/teleport-very-long-cluster-name-with-uuid-2f96e498-88ec-442f-a25b-569fa915041c/kubes/super-long-desc`, - labelsList: makeLabelsList({ + labels: makeLabelsList({ 'im-just-a-smol': 'kube', kube: 'kubersson', with: 'little-to-no-labels', diff --git a/web/packages/teleterm/src/ui/Search/searchResult.ts b/web/packages/teleterm/src/ui/Search/searchResult.ts index e3c4e27da86e8..006dafffeb7bd 100644 --- a/web/packages/teleterm/src/ui/Search/searchResult.ts +++ b/web/packages/teleterm/src/ui/Search/searchResult.ts @@ -109,10 +109,7 @@ export const mainResourceField: { // fields of string type. export const searchableFields: { [Kind in ResourceSearchResult['kind']]: ReadonlyArray< - Exclude< - keyof resourcesServiceTypes.SearchResultResource, - 'labelsList' - > + Exclude, 'labels'> >; } = { server: ['name', 'hostname', 'addr'], diff --git a/web/packages/teleterm/src/ui/Search/useSearch.test.tsx b/web/packages/teleterm/src/ui/Search/useSearch.test.tsx index f8034b68969e5..d61f35b34d5e3 100644 --- a/web/packages/teleterm/src/ui/Search/useSearch.test.tsx +++ b/web/packages/teleterm/src/ui/Search/useSearch.test.tsx @@ -58,7 +58,7 @@ describe('rankResults', () => { const server = makeResourceResult({ kind: 'server', resource: makeServer({ - labelsList: makeLabelsList({ quux: 'bar-baz', foo: 'bar' }), + labels: makeLabelsList({ quux: 'bar-baz', foo: 'bar' }), }), }); @@ -87,7 +87,7 @@ describe('rankResults', () => { makeResourceResult({ kind: 'server', resource: makeServer({ - labelsList: makeLabelsList({ foo: 'bar1' }), + labels: makeLabelsList({ foo: 'bar1' }), }), }) ); @@ -99,7 +99,7 @@ describe('rankResults', () => { kind: 'server', resource: makeServer({ uri: lowestScoreServerUri, - labelsList: makeLabelsList({ foo: 'bar123456' }), + labels: makeLabelsList({ foo: 'bar123456' }), }), }) ); @@ -111,7 +111,7 @@ describe('rankResults', () => { kind: 'server', resource: makeServer({ uri: highestScoreServerUri, - labelsList: makeLabelsList({ foo: 'bar' }), + labels: makeLabelsList({ foo: 'bar' }), }), }) ); diff --git a/web/packages/teleterm/src/ui/Search/useSearch.ts b/web/packages/teleterm/src/ui/Search/useSearch.ts index 85cc9c9fcac2c..ca6a31eb36674 100644 --- a/web/packages/teleterm/src/ui/Search/useSearch.ts +++ b/web/packages/teleterm/src/ui/Search/useSearch.ts @@ -277,7 +277,7 @@ function populateMatches( const resourceMatches: ResourceMatch[] = []; terms.forEach(term => { - searchResult.resource.labelsList.forEach(label => { + searchResult.resource.labels.forEach(label => { // indexOf is faster on Chrome than includes or regex. // https://jsbench.me/b7lf9kvrux/1 const nameIndex = label.name.toLocaleLowerCase().indexOf(term); @@ -328,7 +328,7 @@ function calculateScore( let searchResultScore = 0; const labelMatches = searchResult.labelMatches.map(match => { - const label = searchResult.resource.labelsList.find( + const label = searchResult.resource.labels.find( label => label.name === match.labelName ); let matchedValue: string; diff --git a/web/packages/teleterm/src/ui/TopBar/Identity/Identity.story.tsx b/web/packages/teleterm/src/ui/TopBar/Identity/Identity.story.tsx index ed40a8fe5b01a..40bf70dceca99 100644 --- a/web/packages/teleterm/src/ui/TopBar/Identity/Identity.story.tsx +++ b/web/packages/teleterm/src/ui/TopBar/Identity/Identity.story.tsx @@ -97,8 +97,8 @@ export function OneClusterWithActiveCluster() { proxyHost: 'localhost:3080', loggedInUser: makeLoggedInUser({ name: 'alice', - rolesList: ['access', 'editor'], - sshLoginsList: ['root'], + roles: ['access', 'editor'], + sshLogins: ['root'], }), }); @@ -183,8 +183,8 @@ export function ManyClustersWithActiveCluster() { proxyHost: 'localhost:3080', loggedInUser: makeLoggedInUser({ name: activeIdentityRootCluster.userName, - rolesList: ['access', 'editor'], - sshLoginsList: ['root'], + roles: ['access', 'editor'], + sshLogins: ['root'], }), }); @@ -234,7 +234,7 @@ export function LongNamesWithManyRoles() { proxyHost: 'localhost:3080', loggedInUser: makeLoggedInUser({ name: activeIdentityRootCluster.userName, - rolesList: [ + roles: [ 'circle-mark-app-access', 'grafana-lite-app-access', 'grafana-gold-app-access', @@ -245,7 +245,7 @@ export function LongNamesWithManyRoles() { 'sales-center-shop-app-access', 'sales-center-floor-db-access', ], - sshLoginsList: ['root'], + sshLogins: ['root'], }), }); diff --git a/web/packages/teleterm/src/ui/TopBar/Identity/IdentityList/IdentityList.tsx b/web/packages/teleterm/src/ui/TopBar/Identity/IdentityList/IdentityList.tsx index 4da4221e9c17d..b1cf1a8bb86f0 100644 --- a/web/packages/teleterm/src/ui/TopBar/Identity/IdentityList/IdentityList.tsx +++ b/web/packages/teleterm/src/ui/TopBar/Identity/IdentityList/IdentityList.tsx @@ -48,7 +48,7 @@ export function IdentityList(props: IdentityListProps) { {props.loggedInUser.name} - {props.loggedInUser.rolesList.map(role => ( + {props.loggedInUser.roles.map(role => ( diff --git a/web/packages/teleterm/src/ui/services/clusters/clustersService.ts b/web/packages/teleterm/src/ui/services/clusters/clustersService.ts index fd0c6140d26ea..0ad49bef48897 100644 --- a/web/packages/teleterm/src/ui/services/clusters/clustersService.ts +++ b/web/packages/teleterm/src/ui/services/clusters/clustersService.ts @@ -177,6 +177,7 @@ export class ClustersService extends ImmutableStore clusters.map(c => [c.uri, this.removeInternalLoginsFromCluster(c)]) ); }); + clusters .filter(c => c.connected) .forEach(c => this.syncRootClusterAndCatchErrors(c.uri)); @@ -520,7 +521,7 @@ export class ClustersService extends ImmutableStore // TODO: this information should eventually be gathered by getCluster const assumedRequests = cluster.loggedInUser ? await this.fetchClusterAssumedRequests( - cluster.loggedInUser.activeRequestsList, + cluster.loggedInUser.activeRequests, clusterUri ) : undefined; @@ -555,7 +556,7 @@ export class ClustersService extends ImmutableStore requestsMap[request.id] = { id: request.id, expires: new Date(request.expires.seconds * 1000), - roles: request.rolesList, + roles: request.roles, }; return requestsMap; }, {}); @@ -569,7 +570,7 @@ export class ClustersService extends ImmutableStore ...cluster, loggedInUser: cluster.loggedInUser && { ...cluster.loggedInUser, - sshLoginsList: cluster.loggedInUser.sshLoginsList.filter( + sshLogins: cluster.loggedInUser.sshLogins.filter( login => !login.startsWith('-') ), }, @@ -583,7 +584,7 @@ export function makeServer(source: tsh.Server) { id: source.name, clusterId: source.name, hostname: source.hostname, - labels: source.labelsList, + labels: source.labels, addr: source.addr, tunnel: source.tunnel, sshLogins: [], @@ -600,7 +601,7 @@ export function makeDatabase(source: tsh.Database) { source.protocol as DbProtocol ).title, protocol: source.protocol, - labels: source.labelsList, + labels: source.labels, }; } @@ -608,7 +609,7 @@ export function makeKube(source: tsh.Kube) { return { uri: source.uri, name: source.name, - labels: source.labelsList, + labels: source.labels, }; } diff --git a/web/packages/teleterm/src/ui/services/fileTransferClient/fileTransferService.ts b/web/packages/teleterm/src/ui/services/fileTransferClient/fileTransferService.ts index de6e3d9910350..b64574ffe6db6 100644 --- a/web/packages/teleterm/src/ui/services/fileTransferClient/fileTransferService.ts +++ b/web/packages/teleterm/src/ui/services/fileTransferClient/fileTransferService.ts @@ -18,11 +18,9 @@ import { FileTransferListeners } from 'shared/components/FileTransfer'; -import { - FileTransferDirection, - FileTransferRequest, - TshdClient, -} from 'teleterm/services/tshd/types'; +import { FileTransferDirection } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb'; + +import { FileTransferRequest, TshdClient } from 'teleterm/services/tshd/types'; import { UsageService } from 'teleterm/ui/services/usage'; export class FileTransferService { @@ -52,17 +50,12 @@ export class FileTransferService { { once: true } ); const listeners = this.tshClient.transferFile(options, abortSignal); - if ( - options.direction === - FileTransferDirection.FILE_TRANSFER_DIRECTION_DOWNLOAD - ) { + if (options.direction === FileTransferDirection.DOWNLOAD) { this.usageService.captureFileTransferRun(options.serverUri, { isUpload: false, }); } - if ( - options.direction === FileTransferDirection.FILE_TRANSFER_DIRECTION_UPLOAD - ) { + if (options.direction === FileTransferDirection.UPLOAD) { this.usageService.captureFileTransferRun(options.serverUri, { isUpload: true, }); diff --git a/web/packages/teleterm/src/ui/services/resources/resourcesService.test.ts b/web/packages/teleterm/src/ui/services/resources/resourcesService.test.ts index c613fbdca9c4d..718c23aa739f1 100644 --- a/web/packages/teleterm/src/ui/services/resources/resourcesService.test.ts +++ b/web/packages/teleterm/src/ui/services/resources/resourcesService.test.ts @@ -45,7 +45,7 @@ describe('getServerByHostname', () => { { name: 'returns a server when the hostname matches a single server', getServersMockedValue: { - agentsList: [server], + agents: [server], totalCount: 1, startKey: 'foo', }, @@ -54,7 +54,7 @@ describe('getServerByHostname', () => { { name: 'throws an error when the hostname matches multiple servers', getServersMockedValue: { - agentsList: [server, server], + agents: [server, server], totalCount: 2, startKey: 'foo', }, @@ -63,7 +63,7 @@ describe('getServerByHostname', () => { { name: 'returns nothing if the hostname does not match any servers', getServersMockedValue: { - agentsList: [], + agents: [], totalCount: 0, startKey: 'foo', }, @@ -107,22 +107,22 @@ describe('searchResources', () => { const tshClient: Partial = { getServers: jest.fn().mockResolvedValueOnce({ - agentsList: [server], + agents: [server], totalCount: 1, startKey: '', }), getDatabases: jest.fn().mockResolvedValueOnce({ - agentsList: [db], + agents: [db], totalCount: 1, startKey: '', }), getKubes: jest.fn().mockResolvedValueOnce({ - agentsList: [kube], + agents: [kube], totalCount: 1, startKey: '', }), getApps: jest.fn().mockResolvedValueOnce({ - agentsList: [app], + agents: [app], totalCount: 1, startKey: '', }), @@ -161,7 +161,7 @@ describe('searchResources', () => { const server = makeServer(); const tshClient: Partial = { getServers: jest.fn().mockResolvedValueOnce({ - agentsList: [server], + agents: [server], totalCount: 1, startKey: '', }), diff --git a/web/packages/teleterm/src/ui/services/resources/resourcesService.ts b/web/packages/teleterm/src/ui/services/resources/resourcesService.ts index 7d9730e2aa42a..fcf8dadbc2609 100644 --- a/web/packages/teleterm/src/ui/services/resources/resourcesService.ts +++ b/web/packages/teleterm/src/ui/services/resources/resourcesService.ts @@ -38,7 +38,7 @@ export class ResourcesService { hostname: string ): Promise { const query = `name == "${hostname}"`; - const { agentsList: servers } = await this.fetchServers({ + const { agents: servers } = await this.fetchServers({ clusterUri, query, limit: 2, @@ -94,7 +94,7 @@ export class ResourcesService { const getServers = () => this.fetchServers(params).then( res => - res.agentsList.map(resource => ({ + res.agents.map(resource => ({ kind: 'server' as const, resource, })), @@ -104,7 +104,7 @@ export class ResourcesService { const getApps = () => this.fetchApps(params).then( res => - res.agentsList.map(resource => ({ + res.agents.map(resource => ({ kind: 'app' as const, resource: makeApp(resource), })), @@ -113,7 +113,7 @@ export class ResourcesService { const getDatabases = () => this.fetchDatabases(params).then( res => - res.agentsList.map(resource => ({ + res.agents.map(resource => ({ kind: 'database' as const, resource, })), @@ -123,7 +123,7 @@ export class ResourcesService { const getKubes = () => this.fetchKubes(params).then( res => - res.agentsList.map(resource => ({ + res.agents.map(resource => ({ kind: 'kube' as const, resource, })), diff --git a/web/packages/teleterm/src/ui/services/usage/usageService.ts b/web/packages/teleterm/src/ui/services/usage/usageService.ts index 17ee6535842eb..e2092f590283d 100644 --- a/web/packages/teleterm/src/ui/services/usage/usageService.ts +++ b/web/packages/teleterm/src/ui/services/usage/usageService.ts @@ -16,12 +16,12 @@ * along with this program. If not, see . */ +import { SubmitConnectEventRequest } from 'gen-proto-ts/prehog/v1alpha/connect_pb'; + +import { Timestamp } from 'gen-proto-ts/google/protobuf/timestamp_pb'; + import { ClusterOrResourceUri, ClusterUri, routing } from 'teleterm/ui/uri'; -import { - Cluster, - ReportUsageEventRequest, - TshdClient, -} from 'teleterm/services/tshd/types'; +import { Cluster, TshdClient } from 'teleterm/services/tshd/types'; import { RuntimeSettings } from 'teleterm/mainProcess/types'; import { ConfigService } from 'teleterm/services/config'; import Logger from 'teleterm/logger'; @@ -30,7 +30,7 @@ import { NotificationsService } from 'teleterm/ui/services/notifications'; import { DocumentOrigin } from 'teleterm/ui/services/workspacesService'; type PrehogEventReq = Omit< - ReportUsageEventRequest['prehogReq'], + SubmitConnectEventRequest, 'distinctId' | 'timestamp' >; @@ -59,14 +59,17 @@ export class UsageService { } const { arch, platform, osVersion, appVersion } = this.runtimeSettings; this.reportEvent(clusterProperties.authClusterId, { - clusterLogin: { - clusterName: clusterProperties.clusterName, - userName: clusterProperties.userName, - connectorType, - arch, - os: platform, - osVersion, - appVersion, + event: { + oneofKind: 'clusterLogin', + clusterLogin: { + clusterName: clusterProperties.clusterName, + userName: clusterProperties.userName, + connectorType, + arch, + os: platform, + osVersion, + appVersion, + }, }, }); } @@ -84,11 +87,14 @@ export class UsageService { return; } this.reportEvent(clusterProperties.authClusterId, { - protocolUse: { - clusterName: clusterProperties.clusterName, - userName: clusterProperties.userName, - protocol, - origin, + event: { + oneofKind: 'protocolUse', + protocolUse: { + clusterName: clusterProperties.clusterName, + userName: clusterProperties.userName, + protocol, + origin, + }, }, }); } @@ -105,10 +111,13 @@ export class UsageService { return; } this.reportEvent(clusterProperties.authClusterId, { - accessRequestCreate: { - clusterName: clusterProperties.clusterName, - userName: clusterProperties.userName, - kind, + event: { + oneofKind: 'accessRequestCreate', + accessRequestCreate: { + clusterName: clusterProperties.clusterName, + userName: clusterProperties.userName, + kind, + }, }, }); } @@ -122,9 +131,12 @@ export class UsageService { return; } this.reportEvent(clusterProperties.authClusterId, { - accessRequestReview: { - clusterName: clusterProperties.clusterName, - userName: clusterProperties.userName, + event: { + oneofKind: 'accessRequestReview', + accessRequestReview: { + clusterName: clusterProperties.clusterName, + userName: clusterProperties.userName, + }, }, }); } @@ -138,9 +150,12 @@ export class UsageService { return; } this.reportEvent(clusterProperties.authClusterId, { - accessRequestAssumeRole: { - clusterName: clusterProperties.clusterName, - userName: clusterProperties.userName, + event: { + oneofKind: 'accessRequestAssumeRole', + accessRequestAssumeRole: { + clusterName: clusterProperties.clusterName, + userName: clusterProperties.userName, + }, }, }); } @@ -157,18 +172,24 @@ export class UsageService { return; } this.reportEvent(clusterProperties.authClusterId, { - fileTransferRun: { - clusterName: clusterProperties.clusterName, - userName: clusterProperties.userName, - isUpload, + event: { + oneofKind: 'fileTransferRun', + fileTransferRun: { + clusterName: clusterProperties.clusterName, + userName: clusterProperties.userName, + isUpload, + }, }, }); } captureUserJobRoleUpdate(jobRole: string): void { this.reportNonAnonymizedEvent({ - userJobRoleUpdate: { - jobRole, + event: { + oneofKind: 'userJobRoleUpdate', + userJobRoleUpdate: { + jobRole, + }, }, }); } @@ -185,12 +206,16 @@ export class UsageService { return; } this.reportEvent(clusterProperties.authClusterId, { - connectMyComputerSetup: { - clusterName: clusterProperties.clusterName, - userName: clusterProperties.userName, - success: properties.success, - failedStep: - (properties.success === false && properties.failedStep) || undefined, + event: { + oneofKind: 'connectMyComputerSetup', + connectMyComputerSetup: { + clusterName: clusterProperties.clusterName, + userName: clusterProperties.userName, + success: properties.success, + failedStep: + (properties.success === false && properties.failedStep) || + undefined, + }, }, }); } @@ -204,9 +229,12 @@ export class UsageService { return; } this.reportEvent(clusterProperties.authClusterId, { - connectMyComputerAgentStart: { - clusterName: clusterProperties.clusterName, - userName: clusterProperties.userName, + event: { + oneofKind: 'connectMyComputerAgentStart', + connectMyComputerAgentStart: { + clusterName: clusterProperties.clusterName, + userName: clusterProperties.userName, + }, }, }); } @@ -232,7 +260,7 @@ export class UsageService { authClusterId, prehogReq: { distinctId: this.runtimeSettings.installationId, - timestamp: new Date(), + timestamp: Timestamp.now(), ...prehogEventReq, }, }); diff --git a/web/packages/teleterm/src/ui/services/workspacesService/workspacesService.ts b/web/packages/teleterm/src/ui/services/workspacesService/workspacesService.ts index 9023845454fc8..6c94dc2497e21 100644 --- a/web/packages/teleterm/src/ui/services/workspacesService/workspacesService.ts +++ b/web/packages/teleterm/src/ui/services/workspacesService/workspacesService.ts @@ -25,11 +25,11 @@ import { arrayObjectIsEqual } from 'shared/utils/highbar'; import { ResourceKind } from 'e-teleport/Workflow/NewRequest/useNewRequest'; import { - UnifiedResourcePreferences, DefaultTab, - ViewMode, LabelsViewMode, -} from 'shared/services/unifiedResourcePreferences'; + UnifiedResourcePreferences, + ViewMode, +} from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; import { ModalsService } from 'teleterm/ui/services/modals'; import { ClustersService } from 'teleterm/ui/services/clusters'; diff --git a/web/packages/teleterm/src/ui/tshdEvents.ts b/web/packages/teleterm/src/ui/tshdEvents.ts index df80d0675fb83..4a84aed01f544 100644 --- a/web/packages/teleterm/src/ui/tshdEvents.ts +++ b/web/packages/teleterm/src/ui/tshdEvents.ts @@ -61,7 +61,10 @@ export function createTshdEventsContextBridgeService( promptMfaRequest: request as tshdEvents.PromptMfaRequest, onSuccess: totpCode => resolve({ hasCanceledModal: false, totpCode }), onCancel: () => - resolve({ hasCanceledModal: true, totpCode: undefined }), + resolve({ + hasCanceledModal: true, + totpCode: undefined, + }), }); // If Webauthn is available, tshd starts two goroutines – one that sends this request and diff --git a/web/packages/teleterm/webpack.main.config.js b/web/packages/teleterm/webpack.main.config.js deleted file mode 100644 index 41e39cc58b446..0000000000000 --- a/web/packages/teleterm/webpack.main.config.js +++ /dev/null @@ -1,97 +0,0 @@ -const path = require('path'); -const { spawn } = require('child_process'); - -const { CleanWebpackPlugin } = require('clean-webpack-plugin'); -const resolvepath = require('@gravitational/build/webpack/resolvepath'); -const configFactory = require('@gravitational/build/webpack/webpack.base'); - -function onFirstBuildDonePlugin(env) { - let isInitialBuild = true; - return { - apply: compiler => { - compiler.hooks.done.tap('OnFirstBuildDonePlugin', (/*compilation*/) => { - if (!isInitialBuild) { - return; - } - isInitialBuild = false; - - const child = spawn('yarn', ['start-electron', '--inspect'], { - shell: true, - env, - stdio: 'inherit', - detached: true, // detaching the process will allow restarting electron without terminating the dev server - }); - - child.unref(); - }); - }, - }; -} - -const cfg = { - entry: { - main: './src/main.ts', - preload: './src/preload.ts', - sharedProcess: './src/sharedProcess/sharedProcess.ts', - agentCleanupDaemon: './src/agentCleanupDaemon/agentCleanupDaemon.js', - }, - - output: { - path: resolvepath('build/app/dist/main'), - filename: '[name].js', - }, - - resolve: { - ...configFactory.createDefaultConfig().resolve, - alias: { - ...configFactory.createDefaultConfig().resolve.alias, - teleterm: path.join(__dirname, './src'), - }, - }, - - devtool: false, - - target: 'electron-main', - - optimization: { - minimize: false, - }, - - module: { - strictExportPresence: true, - rules: [configFactory.rules.jsx()], - }, - - externals: { - 'node-pty': 'commonjs2 node-pty', - }, - - plugins: [new CleanWebpackPlugin()], - - /** - * Disables webpack processing of __dirname and __filename. - * If you run the bundle in node.js it falls back to these values of node.js. - * https://github.com/webpack/webpack/issues/2010 - */ - node: { - __dirname: false, - __filename: false, - }, -}; - -module.exports = (env, argv) => { - if (argv.mode === 'development') { - process.env.BABEL_ENV = 'development'; - process.env.NODE_ENV = 'development'; - cfg.mode = 'development'; - cfg.plugins.push(onFirstBuildDonePlugin(process.env)); - } - - if (argv.mode === 'production') { - process.env.BABEL_ENV = 'production'; - process.env.NODE_ENV = 'production'; - cfg.mode = 'production'; - } - - return cfg; -}; diff --git a/web/packages/teleterm/webpack.renderer.dev.config.js b/web/packages/teleterm/webpack.renderer.dev.config.js deleted file mode 100644 index 9390f095169a6..0000000000000 --- a/web/packages/teleterm/webpack.renderer.dev.config.js +++ /dev/null @@ -1,36 +0,0 @@ -const { spawn } = require('child_process'); -const path = require('path'); - -const defaultCfg = require('@gravitational/build/webpack/webpack.dev.config'); -const configFactory = require('@gravitational/build/webpack/webpack.base'); - -const { extend } = require('./webpack.renderer.extend'); -const devCfg = extend(defaultCfg); - -devCfg.devServer = { - hot: true, - static: { - publicPath: '/', - directory: path.join(__dirname, 'build/app/dist/renderer'), - serveIndex: false, - }, - allowedHosts: 'all', - server: { - type: 'https', - }, - onBeforeSetupMiddleware() { - spawn('yarn', ['start-main'], { - shell: true, - env: process.env, - stdio: 'inherit', - }).on('error', spawnError => console.error(spawnError)); - }, -}; - -devCfg.output.publicPath = ''; -devCfg.plugins.push( - configFactory.plugins.tsChecker(), - configFactory.plugins.reactRefresh() -); - -module.exports = devCfg; diff --git a/web/packages/teleterm/webpack.renderer.extend.js b/web/packages/teleterm/webpack.renderer.extend.js deleted file mode 100644 index baf59de2af169..0000000000000 --- a/web/packages/teleterm/webpack.renderer.extend.js +++ /dev/null @@ -1,72 +0,0 @@ -const path = require('path'); - -const HtmlWebPackPlugin = require('html-webpack-plugin'); -const resolvepath = require('@gravitational/build/webpack/resolvepath'); - -function extend(cfg) { - const isDev = cfg.mode === 'development'; - - cfg.entry = { app: ['./src/ui/boot'] }; - cfg.output.publicPath = 'auto'; - cfg.output.path = resolvepath('build/app/dist/renderer'); - cfg.output.libraryTarget = 'umd'; - cfg.output.globalObject = 'this'; - cfg.resolve.alias['teleterm'] = path.join(__dirname, './src'); - cfg.plugins = [createHtmlPlugin({ isDev })]; - - return cfg; -} - -function createHtmlPlugin({ isDev }) { - const csp = getCsp({ isDev }); - - return new HtmlWebPackPlugin({ - filename: 'index.html', - title: '', - inject: true, - templateContent: ` - - - - - - - - - - -
- - `, - }); -} - -function getCsp({ isDev }) { - // feedbackAddress needs to be kept in sync with the same property in staticConfig.ts. - const feedbackAddress = isDev - ? 'https://kcwm2is93l.execute-api.us-west-2.amazonaws.com/prod' - : 'https://usage.teleport.dev'; - - let csp = ` -default-src 'self'; -connect-src 'self' ${feedbackAddress}; -style-src 'self' 'unsafe-inline'; -img-src 'self' data: blob:; -object-src 'none'; -font-src 'self' data:; -` - .replaceAll('\n', ' ') - .trim(); - - if (isDev) { - // Required to make source maps work in dev mode. - csp += " script-src 'self' 'unsafe-eval';"; - } - - return csp; -} - -module.exports = { - extend, - createHtmlPlugin, -}; diff --git a/web/packages/teleterm/webpack.renderer.prod.config.js b/web/packages/teleterm/webpack.renderer.prod.config.js deleted file mode 100644 index 53f4b1096c97a..0000000000000 --- a/web/packages/teleterm/webpack.renderer.prod.config.js +++ /dev/null @@ -1,11 +0,0 @@ -const { CleanWebpackPlugin } = require('clean-webpack-plugin'); - -const defaultCfg = require('@gravitational/build/webpack/webpack.prod.config'); - -const { extend } = require('./webpack.renderer.extend'); - -const prodCfg = extend(defaultCfg); - -prodCfg.plugins.unshift(new CleanWebpackPlugin()); - -module.exports = prodCfg; diff --git a/yarn.lock b/yarn.lock index 397c47a5314d4..a456bd86f8d0f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,10 +33,10 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.22.9": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@7.12.9": version "7.12.9" @@ -60,33 +60,33 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.23.2", "@babel/core@^7.7.5": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== +"@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.23.2", "@babel/core@^7.23.5", "@babel/core@^7.7.5": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" + integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.7" + "@babel/parser" "^7.23.6" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.23.0", "@babel/generator@^7.23.5", "@babel/generator@^7.7.2": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" - integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.23.6", "@babel/generator@^7.7.2": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: - "@babel/types" "^7.23.5" + "@babel/types" "^7.23.6" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -106,14 +106,14 @@ "@babel/helper-explode-assignable-expression" "^7.16.0" "@babel/types" "^7.16.0" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3", "@babel/helper-compilation-targets@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" @@ -209,10 +209,10 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.0", "@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.0", "@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -286,10 +286,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.14.5", "@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.14.5", "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.16.0": version "7.16.0" @@ -301,14 +301,14 @@ "@babel/traverse" "^7.16.0" "@babel/types" "^7.16.0" -"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.7": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.8.tgz#fc6b2d65b16847fd50adddbd4232c76378959e34" + integrity sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" "@babel/highlight@^7.23.4": version "7.23.4" @@ -319,10 +319,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" - integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": version "7.16.2" @@ -648,12 +648,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" - integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.16.0", "@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-async-to-generator@^7.16.0": version "7.16.0" @@ -1096,26 +1096,26 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.23.2", "@babel/traverse@^7.4.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" - integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== +"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.23.7", "@babel/traverse@^7.4.5": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" + integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" + "@babel/generator" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.5" - "@babel/types" "^7.23.5" - debug "^4.1.0" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.2.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" - integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w== +"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.2.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -1406,111 +1406,226 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@esbuild/aix-ppc64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" + integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== + +"@esbuild/android-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" + integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== + "@esbuild/android-arm64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz#fb7130103835b6d43ea499c3f30cfb2b2ed58456" integrity sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA== +"@esbuild/android-arm@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" + integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== + "@esbuild/android-arm@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.8.tgz#b46e4d9e984e6d6db6c4224d72c86b7757e35bcb" integrity sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA== +"@esbuild/android-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" + integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== + "@esbuild/android-x64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.8.tgz#a13db9441b5a4f4e4fec4a6f8ffacfea07888db7" integrity sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A== +"@esbuild/darwin-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" + integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== + "@esbuild/darwin-arm64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz#49f5718d36541f40dd62bfdf84da9c65168a0fc2" integrity sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw== +"@esbuild/darwin-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" + integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== + "@esbuild/darwin-x64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz#75c5c88371eea4bfc1f9ecfd0e75104c74a481ac" integrity sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q== +"@esbuild/freebsd-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" + integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== + "@esbuild/freebsd-arm64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz#9d7259fea4fd2b5f7437b52b542816e89d7c8575" integrity sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw== +"@esbuild/freebsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" + integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== + "@esbuild/freebsd-x64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz#abac03e1c4c7c75ee8add6d76ec592f46dbb39e3" integrity sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg== +"@esbuild/linux-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" + integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== + "@esbuild/linux-arm64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz#c577932cf4feeaa43cb9cec27b89cbe0df7d9098" integrity sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ== +"@esbuild/linux-arm@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" + integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== + "@esbuild/linux-arm@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz#d6014d8b98b5cbc96b95dad3d14d75bb364fdc0f" integrity sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ== +"@esbuild/linux-ia32@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" + integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== + "@esbuild/linux-ia32@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz#2379a0554307d19ac4a6cdc15b08f0ea28e7a40d" integrity sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ== +"@esbuild/linux-loong64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" + integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== + "@esbuild/linux-loong64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz#e2a5bbffe15748b49356a6cd7b2d5bf60c5a7123" integrity sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ== +"@esbuild/linux-mips64el@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" + integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== + "@esbuild/linux-mips64el@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz#1359331e6f6214f26f4b08db9b9df661c57cfa24" integrity sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q== +"@esbuild/linux-ppc64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" + integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== + "@esbuild/linux-ppc64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz#9ba436addc1646dc89dae48c62d3e951ffe70951" integrity sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg== +"@esbuild/linux-riscv64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" + integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== + "@esbuild/linux-riscv64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz#fbcf0c3a0b20f40b5fc31c3b7695f0769f9de66b" integrity sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg== +"@esbuild/linux-s390x@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" + integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== + "@esbuild/linux-s390x@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz#989e8a05f7792d139d5564ffa7ff898ac6f20a4a" integrity sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg== +"@esbuild/linux-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" + integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== + "@esbuild/linux-x64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz#b187295393a59323397fe5ff51e769ec4e72212b" integrity sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg== +"@esbuild/netbsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" + integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== + "@esbuild/netbsd-x64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz#c1ec0e24ea82313cb1c7bae176bd5acd5bde7137" integrity sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw== +"@esbuild/openbsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" + integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== + "@esbuild/openbsd-x64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz#0c5b696ac66c6d70cf9ee17073a581a28af9e18d" integrity sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ== +"@esbuild/sunos-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" + integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== + "@esbuild/sunos-x64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz#2a697e1f77926ff09fcc457d8f29916d6cd48fb1" integrity sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w== +"@esbuild/win32-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" + integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== + "@esbuild/win32-arm64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz#ec029e62a2fca8c071842ecb1bc5c2dd20b066f1" integrity sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg== +"@esbuild/win32-ia32@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" + integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== + "@esbuild/win32-ia32@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz#cbb9a3146bde64dc15543e48afe418c7a3214851" integrity sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw== +"@esbuild/win32-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" + integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== + "@esbuild/win32-x64@0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz#c8285183dbdb17008578dbacb6e22748709b4822" @@ -1857,7 +1972,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -2418,6 +2533,18 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@protobuf-ts/runtime-rpc@^2.9.3": + version "2.9.3" + resolved "https://registry.yarnpkg.com/@protobuf-ts/runtime-rpc/-/runtime-rpc-2.9.3.tgz#7316373f2ffc2b5ab4c7e0c1ca0cad0a3c92585d" + integrity sha512-WelHpctvZeG8yhbb7tnsrLzotq9xjMCXuGuhJ8qMyEdNoBBEodbXseofAYFTebo2/PN2LzyEq3X6vwr5f8jqTA== + dependencies: + "@protobuf-ts/runtime" "^2.9.3" + +"@protobuf-ts/runtime@^2.9.3": + version "2.9.3" + resolved "https://registry.yarnpkg.com/@protobuf-ts/runtime/-/runtime-2.9.3.tgz#b906223debaf42c9bd281e985a9f5652729153a4" + integrity sha512-nivzCpg/qYD0RX2OmHOahJALb8ndjGmUhNBcTJ0BbXoqKwCSM6vYA+vegzS3rhuaPgbyC7Ec8idlnizzUfIRuw== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -5762,7 +5889,7 @@ browser-assert@^1.2.1: resolved "https://registry.yarnpkg.com/browser-assert/-/browser-assert-1.2.1.tgz#9aaa5a2a8c74685c2ae05bfe46efd606f068c200" integrity sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ== -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.17.6, browserslist@^4.21.9: +browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.17.6: version "4.22.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== @@ -5772,6 +5899,16 @@ browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.17.6, browserslist@^ node-releases "^2.0.13" update-browserslist-db "^1.0.13" +browserslist@^4.22.2: + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== + dependencies: + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -5860,6 +5997,11 @@ c8@^7.6.0: yargs "^16.2.0" yargs-parser "^20.2.7" +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + cacache@^15.0.5: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" @@ -5987,6 +6129,11 @@ caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001541: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz#d4f92efc488aab3c7f92c738d3977c2a3180472b" integrity sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA== +caniuse-lite@^1.0.30001565: + version "1.0.30001579" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz#45c065216110f46d6274311a4b3fcf6278e0852a" + integrity sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA== + case-sensitive-paths-webpack-plugin@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" @@ -7440,6 +7587,23 @@ electron-to-chromium@^1.4.535: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.551.tgz#14db6660a88f66ce095ea2657abe5653bc7f42ed" integrity sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw== +electron-to-chromium@^1.4.601: + version "1.4.637" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.637.tgz#ed8775cf5e0c380c3e8452e9818a0e4b7a671ac4" + integrity sha512-G7j3UCOukFtxVO1vWrPQUoDk3kL70mtvjc/DC/k2o7lE0wAdq+Vwp1ipagOow+BH0uVztFysLWbkM/RTIrbK3w== + +electron-vite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/electron-vite/-/electron-vite-2.0.0.tgz#707424b0040602f0e48eca3712794d9762fa1a74" + integrity sha512-EQiuPVSwJQRPGbZiVrCsCFMDVfNyNtSpDiyUV4fNwPKNadTjBfYMOudnLUpSeBTocKUZYf58SXSzSCAkNg0GTQ== + dependencies: + "@babel/core" "^7.23.5" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + cac "^6.7.14" + esbuild "^0.19.8" + magic-string "^0.30.5" + picocolors "^1.0.0" + electron@28.1.1: version "28.1.1" resolved "https://registry.yarnpkg.com/electron/-/electron-28.1.1.tgz#37254967e32a4a69e18378f3b1aba1475522d08d" @@ -7723,6 +7887,35 @@ esbuild@^0.19.3: "@esbuild/win32-ia32" "0.19.8" "@esbuild/win32-x64" "0.19.8" +esbuild@^0.19.8: + version "0.19.11" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" + integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.11" + "@esbuild/android-arm" "0.19.11" + "@esbuild/android-arm64" "0.19.11" + "@esbuild/android-x64" "0.19.11" + "@esbuild/darwin-arm64" "0.19.11" + "@esbuild/darwin-x64" "0.19.11" + "@esbuild/freebsd-arm64" "0.19.11" + "@esbuild/freebsd-x64" "0.19.11" + "@esbuild/linux-arm" "0.19.11" + "@esbuild/linux-arm64" "0.19.11" + "@esbuild/linux-ia32" "0.19.11" + "@esbuild/linux-loong64" "0.19.11" + "@esbuild/linux-mips64el" "0.19.11" + "@esbuild/linux-ppc64" "0.19.11" + "@esbuild/linux-riscv64" "0.19.11" + "@esbuild/linux-s390x" "0.19.11" + "@esbuild/linux-x64" "0.19.11" + "@esbuild/netbsd-x64" "0.19.11" + "@esbuild/openbsd-x64" "0.19.11" + "@esbuild/sunos-x64" "0.19.11" + "@esbuild/win32-arm64" "0.19.11" + "@esbuild/win32-ia32" "0.19.11" + "@esbuild/win32-x64" "0.19.11" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -8233,6 +8426,17 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.2.12: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.9, fast-glob@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" @@ -8875,10 +9079,10 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -google-protobuf@^3.20.1: - version "3.20.1" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.20.1.tgz#1b255c2b59bcda7c399df46c65206aa3c7a0ce8b" - integrity sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw== +google-protobuf@^3.21.2: + version "3.21.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4" + integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA== gopd@^1.0.1: version "1.0.1" @@ -11003,6 +11207,13 @@ lz-string@^1.5.0: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== +magic-string@^0.30.1, magic-string@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -12033,6 +12244,11 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + nopt@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" @@ -15639,6 +15855,26 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +vite-plugin-commonjs@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/vite-plugin-commonjs/-/vite-plugin-commonjs-0.10.1.tgz#18585abc6020adaee733150847972f55a1f88c55" + integrity sha512-taP8R9kYGlCW5OzkVR0UIWRCnG6rSxeWWuA7tnU5b9t5MniibOnDY219NhisTeDhJAeGT8cEnrhVWZ9A5yD+vg== + dependencies: + acorn "^8.8.2" + fast-glob "^3.2.12" + magic-string "^0.30.1" + vite-plugin-dynamic-import "^1.5.0" + +vite-plugin-dynamic-import@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.5.0.tgz#a28f4768da977f0e448009489617aec259180b63" + integrity sha512-Qp85c+AVJmLa8MLni74U4BDiWpUeFNx7NJqbGZyR2XJOU7mgW0cb7nwlAMucFyM4arEd92Nfxp4j44xPi6Fu7g== + dependencies: + acorn "^8.8.2" + es-module-lexer "^1.2.1" + fast-glob "^3.2.12" + magic-string "^0.30.1" + vite-plugin-wasm@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/vite-plugin-wasm/-/vite-plugin-wasm-3.2.2.tgz#7a66fef27733a0dea9b2b14f942a6389a2523f7c"