Skip to content

Commit e4eb8db

Browse files
committed
refactor: migrate some piece to sdkv3 with types
1 parent 2827c0f commit e4eb8db

File tree

4 files changed

+66
-50
lines changed

4 files changed

+66
-50
lines changed

packages/core/src/awsService/apprunner/explorer/apprunnerNode.ts

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import { AWSTreeNodeBase } from '../../../shared/treeview/nodes/awsTreeNodeBase'
88
import { AppRunnerServiceNode } from './apprunnerServiceNode'
99
import { PlaceholderNode } from '../../../shared/treeview/nodes/placeholderNode'
1010
import * as nls from 'vscode-nls'
11-
import { AppRunnerClient } from '../../../shared/clients/apprunner'
12-
import { getPaginatedAwsCallIter } from '../../../shared/utilities/collectionUtils'
11+
import { AppRunnerClient, AppRunnerServiceSummary } from '../../../shared/clients/apprunner'
1312
import { AppRunner } from 'aws-sdk'
1413
import { PollingSet } from '../../../shared/utilities/pollingSet'
14+
import { ListServicesRequest, ServiceSummary } from '@aws-sdk/client-apprunner'
15+
import { hasProps } from '../../../shared/utilities/tsUtils'
1516

1617
const localize = nls.loadMessageBundle()
1718

@@ -43,30 +44,13 @@ export class AppRunnerNode extends AWSTreeNodeBase {
4344
})
4445
}
4546

46-
private async getServiceSummaries(request: AppRunner.ListServicesRequest = {}): Promise<AppRunner.Service[]> {
47-
const iterator = getPaginatedAwsCallIter({
48-
awsCall: async (request) => await this.client.listServices(request),
49-
nextTokenNames: {
50-
request: 'NextToken',
51-
response: 'NextToken',
52-
},
53-
request,
54-
})
55-
56-
const services: AppRunner.Service[] = []
47+
private async getServiceSummaries(request: ListServicesRequest = {}): Promise<AppRunnerServiceSummary[]> {
48+
// TODO: avoid resolving all services at once.
49+
return await this.client.paginateServices(request).flatten().filter(isService).promise()
5750

58-
while (true) {
59-
const next = await iterator.next()
60-
61-
// eslint-disable-next-line unicorn/no-array-for-each
62-
next.value.ServiceSummaryList.forEach((summary: AppRunner.Service) => services.push(summary))
63-
64-
if (next.done) {
65-
break
66-
}
51+
function isService(s: ServiceSummary): s is AppRunnerServiceSummary {
52+
return hasProps(s, 'ServiceName', 'ServiceArn', 'Status', 'ServiceId')
6753
}
68-
69-
return services
7054
}
7155

7256
public async updateChildren(): Promise<void> {

packages/core/src/awsService/apprunner/explorer/apprunnerServiceNode.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55

66
import AsyncLock from 'async-lock'
7-
import { AppRunnerClient } from '../../../shared/clients/apprunner'
7+
import { AppRunnerClient, AppRunnerService, AppRunnerServiceSummary } from '../../../shared/clients/apprunner'
88
import { AppRunner } from 'aws-sdk'
99
import { AppRunnerNode } from './apprunnerNode'
1010

@@ -17,6 +17,7 @@ import * as nls from 'vscode-nls'
1717
import { getLogger } from '../../../shared/logger/logger'
1818
import { getIcon } from '../../../shared/icons'
1919
import { DefaultCloudWatchLogsClient } from '../../../shared/clients/cloudWatchLogsClient'
20+
import { UpdateServiceRequest } from '@aws-sdk/client-apprunner'
2021
const localize = nls.loadMessageBundle()
2122

2223
const contextBase = 'awsAppRunnerServiceNode'
@@ -41,7 +42,7 @@ export class AppRunnerServiceNode extends CloudWatchLogsBase implements AWSResou
4142
constructor(
4243
public readonly parent: AppRunnerNode,
4344
private readonly client: AppRunnerClient,
44-
private _info: AppRunner.Service,
45+
private _info: AppRunnerServiceSummary,
4546
private currentOperation: AppRunner.OperationSummary & { Type?: ServiceOperation } = {},
4647
cloudwatchClient = new DefaultCloudWatchLogsClient(client.regionCode)
4748
) {
@@ -55,7 +56,7 @@ export class AppRunnerServiceNode extends CloudWatchLogsBase implements AWSResou
5556
this.update(_info)
5657
}
5758

58-
public get info(): Readonly<AppRunner.Service> {
59+
public get info(): Readonly<AppRunnerServiceSummary> {
5960
return this._info
6061
}
6162

@@ -81,7 +82,8 @@ export class AppRunnerServiceNode extends CloudWatchLogsBase implements AWSResou
8182
this.label = `${this._info.ServiceName} [${displayStatus}]`
8283
}
8384

84-
public update(info: AppRunner.ServiceSummary | AppRunner.Service): void {
85+
// eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents
86+
public update(info: AppRunnerServiceSummary | AppRunnerService): void {
8587
// update can be called multiple times during an event loop
8688
// this would rarely cause the node's status to appear as 'Operation in progress'
8789
this.lock
@@ -161,7 +163,7 @@ export class AppRunnerServiceNode extends CloudWatchLogsBase implements AWSResou
161163
this.setOperation(resp.Service, resp.OperationId, 'DELETE_SERVICE')
162164
}
163165

164-
public async updateService(request: AppRunner.UpdateServiceRequest): Promise<void> {
166+
public async updateService(request: UpdateServiceRequest): Promise<void> {
165167
const resp = await this.client.updateService({ ...request, ServiceArn: this._info.ServiceArn })
166168
this.setOperation(resp.Service, resp.OperationId, 'UPDATE_SERVICE')
167169
}
@@ -171,13 +173,14 @@ export class AppRunnerServiceNode extends CloudWatchLogsBase implements AWSResou
171173
this.setOperation(this._info, resp.OperationId, 'START_DEPLOYMENT')
172174
}
173175

174-
public setOperation(info: AppRunner.Service, id?: string, type?: ServiceOperation): void {
176+
// eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents
177+
public setOperation(info: AppRunnerService | AppRunnerServiceSummary, id?: string, type?: ServiceOperation): void {
175178
this.currentOperation.Id = id
176179
this.currentOperation.Type = type
177180
this.update(info)
178181
}
179182

180-
public async describe(): Promise<AppRunner.Service> {
183+
public async describe(): Promise<AppRunnerServiceSummary> {
181184
const resp = await this.client.describeService({ ServiceArn: this.arn })
182185
this.update(resp.Service)
183186
return this._info

packages/core/src/shared/clients/apprunner.ts

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,41 @@ import { AppRunner } from 'aws-sdk'
77
import globals from '../extensionGlobals'
88
import {
99
AppRunnerClient as AppRunnerClientSDK,
10+
DeleteServiceCommand,
11+
DeleteServiceRequest,
12+
DeleteServiceResponse,
13+
DescribeServiceCommand,
14+
DescribeServiceRequest,
15+
DescribeServiceResponse,
1016
ListServicesCommand,
1117
ListServicesRequest,
1218
ListServicesResponse,
19+
paginateListServices,
20+
PauseServiceCommand,
21+
PauseServiceRequest,
22+
PauseServiceResponse,
23+
ResumeServiceCommand,
24+
ResumeServiceRequest,
25+
ResumeServiceResponse,
26+
Service,
27+
ServiceSummary,
28+
StartDeploymentCommand,
29+
StartDeploymentRequest,
30+
StartDeploymentResponse,
31+
UpdateServiceCommand,
32+
UpdateServiceRequest,
33+
UpdateServiceResponse,
1334
} from '@aws-sdk/client-apprunner'
1435
import { ClientWrapper } from './clientWrapper'
36+
import { RequiredProps } from '../utilities/tsUtils'
37+
38+
export type AppRunnerService = RequiredProps<Service, 'ServiceName' | 'ServiceArn' | 'Status' | 'ServiceId'>
39+
export type AppRunnerServiceSummary = RequiredProps<
40+
ServiceSummary,
41+
'ServiceName' | 'ServiceArn' | 'Status' | 'ServiceId'
42+
>
43+
44+
type WithService<T> = T & { Service: AppRunnerService }
1545

1646
export class AppRunnerClient extends ClientWrapper<AppRunnerClientSDK> {
1747
public constructor(regionCode: string) {
@@ -26,16 +56,20 @@ export class AppRunnerClient extends ClientWrapper<AppRunnerClientSDK> {
2656
return await this.makeRequest(ListServicesCommand, request)
2757
}
2858

29-
public async pauseService(request: AppRunner.PauseServiceRequest): Promise<AppRunner.PauseServiceResponse> {
30-
return (await this.createSdkClient()).pauseService(request).promise()
59+
public paginateServices(request: ListServicesRequest) {
60+
return this.makePaginatedRequest(paginateListServices, request, (page) => page.ServiceSummaryList)
61+
}
62+
63+
public async pauseService(request: PauseServiceRequest): Promise<WithService<PauseServiceResponse>> {
64+
return await this.makeRequest(PauseServiceCommand, request)
3165
}
3266

33-
public async resumeService(request: AppRunner.ResumeServiceRequest): Promise<AppRunner.ResumeServiceResponse> {
34-
return (await this.createSdkClient()).resumeService(request).promise()
67+
public async resumeService(request: ResumeServiceRequest): Promise<WithService<ResumeServiceResponse>> {
68+
return await this.makeRequest(ResumeServiceCommand, request)
3569
}
3670

37-
public async updateService(request: AppRunner.UpdateServiceRequest): Promise<AppRunner.UpdateServiceResponse> {
38-
return (await this.createSdkClient()).updateService(request).promise()
71+
public async updateService(request: UpdateServiceRequest): Promise<WithService<UpdateServiceResponse>> {
72+
return await this.makeRequest(UpdateServiceCommand, request)
3973
}
4074

4175
public async createConnection(
@@ -50,24 +84,20 @@ export class AppRunnerClient extends ClientWrapper<AppRunnerClientSDK> {
5084
return (await this.createSdkClient()).listConnections(request).promise()
5185
}
5286

53-
public async describeService(
54-
request: AppRunner.DescribeServiceRequest
55-
): Promise<AppRunner.DescribeServiceResponse> {
56-
return (await this.createSdkClient()).describeService(request).promise()
87+
public async describeService(request: DescribeServiceRequest): Promise<WithService<DescribeServiceResponse>> {
88+
return await this.makeRequest(DescribeServiceCommand, request)
5789
}
5890

59-
public async startDeployment(
60-
request: AppRunner.StartDeploymentRequest
61-
): Promise<AppRunner.StartDeploymentResponse> {
62-
return (await this.createSdkClient()).startDeployment(request).promise()
91+
public async startDeployment(request: StartDeploymentRequest): Promise<StartDeploymentResponse> {
92+
return await this.makeRequest(StartDeploymentCommand, request)
6393
}
6494

6595
public async listOperations(request: AppRunner.ListOperationsRequest): Promise<AppRunner.ListOperationsResponse> {
6696
return (await this.createSdkClient()).listOperations(request).promise()
6797
}
6898

69-
public async deleteService(request: AppRunner.DeleteServiceRequest): Promise<AppRunner.DeleteServiceResponse> {
70-
return (await this.createSdkClient()).deleteService(request).promise()
99+
public async deleteService(request: DeleteServiceRequest): Promise<WithService<DeleteServiceResponse>> {
100+
return this.makeRequest(DeleteServiceCommand, request)
71101
}
72102

73103
protected async createSdkClient(): Promise<AppRunner> {

packages/core/src/test/awsService/apprunner/explorer/apprunnerServiceNode.test.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55

66
import assert from 'assert'
77
import * as sinon from 'sinon'
8-
import { AppRunner } from 'aws-sdk'
98
import { AppRunnerNode } from '../../../../awsService/apprunner/explorer/apprunnerNode'
109
import { AppRunnerServiceNode } from '../../../../awsService/apprunner/explorer/apprunnerServiceNode'
11-
import { AppRunnerClient } from '../../../../shared/clients/apprunner'
10+
import { AppRunnerClient, AppRunnerService } from '../../../../shared/clients/apprunner'
1211
import { DefaultCloudWatchLogsClient } from '../../../../shared/clients/cloudWatchLogsClient'
1312
import { asyncGenerator } from '../../../../shared/utilities/collectionUtils'
1413
import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase'
@@ -20,7 +19,7 @@ describe('AppRunnerServiceNode', function () {
2019
let mockParentNode: AppRunnerNode
2120
let node: AppRunnerServiceNode
2221

23-
const exampleInfo: AppRunner.Service = {
22+
const exampleInfo: AppRunnerService = {
2423
ServiceName: 'test1',
2524
Status: 'RUNNING',
2625
ServiceArn: 'test-arn1',

0 commit comments

Comments
 (0)