Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions web/packages/teleterm/src/mainProcess/mainProcess.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@ import { getAssetPath } from 'teleterm/mainProcess/runtimeSettings';
import { RootClusterUri } from 'teleterm/ui/uri';
import Logger from 'teleterm/logger';
import * as grpcCreds from 'teleterm/services/grpcCredentials';
import { createTshdClient } from 'teleterm/services/tshd/createClient';
import { TshdClient } from 'teleterm/services/tshd/types';
import { createTshdClient, TshdClient } from 'teleterm/services/tshd';
import { loggingInterceptor } from 'teleterm/services/tshd/interceptors';

import {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import { ipcMain } from 'electron';
import { isAbortError } from 'shared/utils/abortError';

import { proxyHostToBrowserProxyHost } from 'teleterm/services/tshd/cluster';
import { TshdClient } from 'teleterm/services/tshd/types';
import { TshdClient } from 'teleterm/services/tshd';
import { Logger } from 'teleterm/types';
import { MainProcessIpc } from 'teleterm/mainProcess/types';
import * as tshd from 'teleterm/services/tshd/types';
Expand Down
5 changes: 1 addition & 4 deletions web/packages/teleterm/src/preload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,7 @@ import { contextBridge } from 'electron';
import { ChannelCredentials, ServerCredentials } from '@grpc/grpc-js';
import { GrpcTransport } from '@protobuf-ts/grpc-transport';

import {
createTshdClient,
createVnetClient,
} from 'teleterm/services/tshd/createClient';
import { createTshdClient, createVnetClient } from 'teleterm/services/tshd';
import { loggingInterceptor } from 'teleterm/services/tshd/interceptors';
import createMainProcessClient from 'teleterm/mainProcess/mainProcessClient';
import { createFileLoggerService } from 'teleterm/services/logger';
Expand Down
26 changes: 17 additions & 9 deletions web/packages/teleterm/src/services/tshd/createClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,27 @@
*/

import { GrpcTransport } from '@protobuf-ts/grpc-transport';
import { TerminalServiceClient } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb.client';
import * as vnetServiceProtobuf from 'gen-proto-ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.client';
import {
ITerminalServiceClient,
TerminalServiceClient,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb.client';
import {
IVnetServiceClient,
VnetServiceClient,
} from 'gen-proto-ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.client';

import { CloneableClient, cloneClient } from './cloneableClient';
import * as types from './types';

export function createTshdClient(transport: GrpcTransport): types.TshdClient {
// Creating the client type based on the interface (ITerminalServiceClient) and not the class
// (TerminalServiceClient) lets us omit a bunch of properties when mocking a client.
export type TshdClient = CloneableClient<ITerminalServiceClient>;

export type VnetClient = CloneableClient<IVnetServiceClient>;

export function createTshdClient(transport: GrpcTransport): TshdClient {
return cloneClient(new TerminalServiceClient(transport));
}

export function createVnetClient(transport: GrpcTransport): VnetServiceClient {
return cloneClient(new vnetServiceProtobuf.VnetServiceClient(transport));
export function createVnetClient(transport: GrpcTransport): VnetClient {
return cloneClient(new VnetServiceClient(transport));
}

export type VnetServiceClient =
CloneableClient<vnetServiceProtobuf.VnetServiceClient>;
10 changes: 3 additions & 7 deletions web/packages/teleterm/src/services/tshd/fixtures/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,10 @@ import {
makeAppGateway,
} from 'teleterm/services/tshd/testHelpers';

import * as types from '../types';
import { VnetServiceClient } from '../createClient';
import { VnetClient, TshdClient } from '../createClient';
import { MockedUnaryCall } from '../cloneableClient';

export class MockTshClient implements types.TshdClient {
export class MockTshClient implements TshdClient {
listRootClusters = () => new MockedUnaryCall({ clusters: [] });
listLeafClusters = () => new MockedUnaryCall({ clusters: [] });
getKubes = () =>
Expand Down Expand Up @@ -116,10 +115,7 @@ export class MockTshClient implements types.TshdClient {
authenticateWebDevice = () => new MockedUnaryCall({});
}

export class MockVnetClient implements VnetServiceClient {
typeName: never;
methods: never;
options: never;
export class MockVnetClient implements VnetClient {
start = () => new MockedUnaryCall({});
stop = () => new MockedUnaryCall({});
}
21 changes: 21 additions & 0 deletions web/packages/teleterm/src/services/tshd/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/**
* Teleport
* Copyright (C) 2024 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 <http://www.gnu.org/licenses/>.
*/

export * from './createClient';
export { cloneAbortSignal, isTshdRpcError } from './cloneableClient';
export type { CloneableAbortSignal } from './cloneableClient';
109 changes: 87 additions & 22 deletions web/packages/teleterm/src/services/tshd/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,34 +16,99 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

import { ITerminalServiceClient } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb.client';

import { SortType } from 'design/DataTable/types';

import { CloneableClient } from './cloneableClient';

import type * as uri from 'teleterm/ui/uri';

export * from 'gen-proto-ts/teleport/lib/teleterm/v1/cluster_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/database_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/gateway_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/server_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/kube_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/app_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/label_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/auth_settings_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/access_request_pb';
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/usage_events_pb';
export * from 'gen-proto-ts/teleport/accesslist/v1/accesslist_pb';
/*
*
* Do not add new imports to this file, we're trying to get rid of types.ts files.
*
*/

export type {
CloneableAbortSignal,
CloneableRpcOptions,
CloneableClient,
} from './cloneableClient';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
Cluster,
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
LoggedInUser,
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
LoggedInUser_UserType,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/cluster_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
Database,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/database_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
Gateway,
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
GatewayCLICommand,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/gateway_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
Server,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/server_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
Kube,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/kube_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
App,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/app_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
Label,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/label_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
AuthSettings,
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
AuthProvider,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/auth_settings_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
AccessRequest,
} from 'gen-proto-ts/teleport/lib/teleterm/v1/access_request_pb';
export {
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
AccessList,
} from 'gen-proto-ts/teleport/accesslist/v1/accesslist_pb';

export type TshdClient = CloneableClient<ITerminalServiceClient>;
// There's too many re-exports from this file to list them individually.
// A @deprecated annotation like this Unfortunately has no effect on the language server.
/**
* @deprecated Import directly from gen-proto-ts instead.
*/
export * from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb';

/**
* Available types are listed here:
Expand Down
5 changes: 2 additions & 3 deletions web/packages/teleterm/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ 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';
import { VnetServiceClient } from 'teleterm/services/tshd/createClient';
import { VnetClient, TshdClient } from 'teleterm/services/tshd/createClient';

export type {
Logger,
Expand Down Expand Up @@ -107,7 +106,7 @@ export type ExtractResponseType<T> =
export type ElectronGlobals = {
readonly mainProcessClient: MainProcessClient;
readonly tshClient: TshdClient;
readonly vnetClient: VnetServiceClient;
readonly vnetClient: VnetClient;
readonly ptyServiceClient: PtyServiceClient;
readonly setupTshdEventContextBridgeService: (
listener: TshdEventContextBridgeService
Expand Down
5 changes: 2 additions & 3 deletions web/packages/teleterm/src/ui/appContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,10 @@ import { UsageService } from 'teleterm/ui/services/usage';
import { ResourcesService } from 'teleterm/ui/services/resources';
import { ConnectMyComputerService } from 'teleterm/ui/services/connectMyComputer';
import { ConfigService } from 'teleterm/services/config';
import { TshdClient } from 'teleterm/services/tshd/types';
import { TshdClient, VnetClient } from 'teleterm/services/tshd/createClient';
import { IAppContext } from 'teleterm/ui/types';
import { DeepLinksService } from 'teleterm/ui/services/deepLinks';
import { parseDeepLink } from 'teleterm/deepLinks';
import { VnetServiceClient } from 'teleterm/services/tshd/createClient';

import { CommandLauncher } from './commandLauncher';
import { createTshdEventsContextBridgeService } from './tshdEvents';
Expand All @@ -64,7 +63,7 @@ export default class AppContext implements IAppContext {
fileTransferService: FileTransferService;
resourcesService: ResourcesService;
tshd: TshdClient;
vnet: VnetServiceClient;
vnet: VnetClient;
/**
* setupTshdEventContextBridgeService adds a context-bridge-compatible version of a gRPC service
* that's going to be called every time a client makes a particular RPC to the tshd events
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import { MockedUnaryCall } from 'teleterm/services/tshd/cloneableClient';
import { ClustersService } from './clustersService';

import type * as uri from 'teleterm/ui/uri';
import type * as tsh from 'teleterm/services/tshd/types';
import type { TshdClient } from 'teleterm/services/tshd';

jest.mock('teleterm/ui/services/notifications');
jest.mock('teleterm/ui/services/usage');
Expand Down Expand Up @@ -58,9 +58,9 @@ const NotificationsServiceMock = NotificationsService as jest.MockedClass<
>;
const UsageServiceMock = UsageService as jest.MockedClass<typeof UsageService>;

function createService(client: Partial<tsh.TshdClient>): ClustersService {
function createService(client: Partial<TshdClient>): ClustersService {
return new ClustersService(
client as tsh.TshdClient,
client as TshdClient,
{
removeKubeConfig: jest.fn().mockResolvedValueOnce(undefined),
} as unknown as MainProcessClient,
Expand All @@ -69,7 +69,7 @@ function createService(client: Partial<tsh.TshdClient>): ClustersService {
);
}

function getClientMocks(): Partial<tsh.TshdClient> {
function getClientMocks(): Partial<TshdClient> {
return {
login: jest.fn().mockReturnValueOnce(new MockedUnaryCall({})),
logout: jest.fn().mockReturnValueOnce(new MockedUnaryCall({})),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import { UsageService } from 'teleterm/ui/services/usage';
import { ImmutableStore } from '../immutableStore';

import type * as types from './types';
import type { TshdClient, CloneableAbortSignal } from 'teleterm/services/tshd';
import type * as tsh from 'teleterm/services/tshd/types';

const { routing } = uri;
Expand All @@ -56,7 +57,7 @@ export class ClustersService extends ImmutableStore<types.ClustersServiceState>
state: types.ClustersServiceState = createClusterServiceState();

constructor(
public client: tsh.TshdClient,
public client: TshdClient,
private mainProcessClient: MainProcessClient,
private notificationsService: NotificationsService,
private usageService: UsageService
Expand Down Expand Up @@ -101,7 +102,7 @@ export class ClustersService extends ImmutableStore<types.ClustersServiceState>

async loginLocal(
params: types.LoginLocalParams,
abortSignal: tsh.CloneableAbortSignal
abortSignal: CloneableAbortSignal
) {
await this.client.login(
{
Expand All @@ -126,7 +127,7 @@ export class ClustersService extends ImmutableStore<types.ClustersServiceState>

async loginSso(
params: types.LoginSsoParams,
abortSignal: tsh.CloneableAbortSignal
abortSignal: CloneableAbortSignal
) {
await this.client.login(
{
Expand All @@ -147,7 +148,7 @@ export class ClustersService extends ImmutableStore<types.ClustersServiceState>

async loginPasswordless(
params: types.LoginPasswordlessParams,
abortSignal: tsh.CloneableAbortSignal
abortSignal: CloneableAbortSignal
) {
await new Promise<void>((resolve, reject) => {
const stream = this.client.loginPasswordless({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ import {
Cluster,
CreateConnectMyComputerRoleResponse,
Server,
CloneableAbortSignal,
TshdClient,
} from 'teleterm/services/tshd/types';
import { TshdClient, CloneableAbortSignal } from 'teleterm/services/tshd';

import type * as uri from 'teleterm/ui/uri';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ import { FileTransferListeners } from 'shared/components/FileTransfer';

import { FileTransferDirection } from 'gen-proto-ts/teleport/lib/teleterm/v1/service_pb';

import { FileTransferRequest, TshdClient } from 'teleterm/services/tshd/types';
import { FileTransferRequest } from 'teleterm/services/tshd/types';
import { TshdClient } from 'teleterm/services/tshd';
import { UsageService } from 'teleterm/ui/services/usage';
import { cloneAbortSignal } from 'teleterm/services/tshd/cloneableClient';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,14 @@ import { MainProcessClient } from 'teleterm/types';
import { ModalsService } from 'teleterm/ui/services/modals';
import { ConfigService } from 'teleterm/services/config';

import type { TshdClient, CloneableAbortSignal } from 'teleterm/services/tshd';
import type * as types from 'teleterm/services/tshd/types';

export class HeadlessAuthenticationService {
constructor(
private mainProcessClient: MainProcessClient,
private modalsService: ModalsService,
private tshClient: types.TshdClient,
private tshClient: TshdClient,
private configService: ConfigService
) {}

Expand Down Expand Up @@ -60,7 +61,7 @@ export class HeadlessAuthenticationService {

async updateHeadlessAuthenticationState(
params: types.UpdateHeadlessAuthenticationStateRequest,
abortSignal: types.CloneableAbortSignal
abortSignal: CloneableAbortSignal
): Promise<void> {
await this.tshClient.updateHeadlessAuthenticationState(params, {
abort: abortSignal,
Expand Down
Loading