Skip to content

Commit fa9b5fd

Browse files
committed
fix: update default useragent string to comply metrics requirements
1 parent 1f4b7cf commit fa9b5fd

File tree

8 files changed

+166
-51
lines changed

8 files changed

+166
-51
lines changed

codegen/.vscode/settings.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"java.project.referencedLibraries": [
3+
"lib/**/*.jar",
4+
"/home/ec2-user/workspace/smithy-typescript/**/*.jar",
5+
"/home/ec2-user/workspace/smithy/**/*.jar"
6+
],
7+
"java.checkstyle.configuration": "${workspaceFolder}/config/checkstyle/checkstyle.xml"
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.smithy.aws.typescript.codegen;
17+
18+
import java.util.Collections;
19+
import java.util.Map;
20+
import java.util.function.Consumer;
21+
import software.amazon.smithy.codegen.core.SymbolProvider;
22+
import software.amazon.smithy.model.Model;
23+
import software.amazon.smithy.typescript.codegen.LanguageTarget;
24+
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
25+
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;
26+
import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration;
27+
import software.amazon.smithy.utils.MapUtils;
28+
29+
/**
30+
* Adds default user agent to AWS clients
31+
*/
32+
public final class AddDefaultUserAgentConfig implements TypeScriptIntegration {
33+
34+
@Override
35+
public void addConfigInterfaceFields(
36+
TypeScriptSettings settings,
37+
Model model,
38+
SymbolProvider symbolProvider,
39+
TypeScriptWriter writer
40+
) {
41+
writer.writeDocs("The string that will be used to populate default value in 'User-Agent' header");
42+
writer.write("defaultUserAgent?: string;\n");
43+
}
44+
45+
@Override
46+
public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
47+
TypeScriptSettings settings,
48+
Model model,
49+
SymbolProvider symbolProvider,
50+
LanguageTarget target
51+
) {
52+
switch (target) {
53+
case NODE:
54+
return MapUtils.of(
55+
"defaultUserAgent", writer -> {
56+
writer.addDependency(AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.dependency);
57+
writer.addImport("defaultUserAgent", "defaultUserAgent", AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName);
58+
writer.addDefaultImport("packageInfo", "./package.json");
59+
writer.write("defaultUserAgent: defaultUserAgent(packageInfo.name, packageInfo.version),");
60+
}
61+
);
62+
case BROWSER:
63+
return MapUtils.of(
64+
"defaultUserAgent", writer -> {
65+
writer.addDependency(AwsDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER.dependency);
66+
writer.addImport("defaultUserAgent", "defaultUserAgent", AwsDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER.packageName);
67+
writer.addDefaultImport("packageInfo", "./package.json");
68+
writer.write("defaultUserAgent: defaultUserAgent(packageInfo.name, packageInfo.version),");
69+
}
70+
);
71+
case REACT_NATIVE:
72+
return MapUtils.of(
73+
"defaultUserAgent", writer -> {
74+
writer.addDependency(AwsDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER.dependency);
75+
writer.addImport("defaultUserAgent", "defaultUserAgent", AwsDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER.packageName);
76+
writer.addDefaultImport("packageInfo", "./package.json");
77+
writer.write("defaultUserAgent: defaultUserAgent(packageInfo.name, packageInfo.version),");
78+
}
79+
);
80+
default:
81+
return Collections.emptyMap();
82+
}
83+
}
84+
}

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AwsDependency.java

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -29,39 +29,41 @@
2929
*/
3030
public enum AwsDependency implements SymbolDependencyContainer {
3131

32-
MIDDLEWARE_SIGNING(NORMAL_DEPENDENCY, "@aws-sdk/middleware-signing", "^1.0.0-beta.1"),
33-
CREDENTIAL_PROVIDER_NODE(NORMAL_DEPENDENCY, "@aws-sdk/credential-provider-node", "^1.0.0-beta.1"),
34-
ACCEPT_HEADER(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-api-gateway", "^1.0.0-beta.1"),
35-
S3_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-s3", "^1.0.0-beta.1"),
36-
ADD_EXPECT_CONTINUE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-expect-continue", "^1.0.0-beta.1"),
37-
GLACIER_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-glacier", "^1.0.0-beta.1"),
38-
MACHINELEARNING_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-machinelearning", "^1.0.0-beta.1"),
39-
S3_CONTROL_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-s3-control", "^1.0.0-beta.1"),
40-
SSEC_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-ssec", "^1.0.0-beta.1"),
41-
RDS_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-rds", "^1.0.0-beta.1"),
42-
LOCATION_CONSTRAINT(NORMAL_DEPENDENCY, "@aws-sdk/middleware-location-constraint", "^1.0.0-beta.1"),
43-
MD5_BROWSER(NORMAL_DEPENDENCY, "@aws-sdk/md5-js", "^1.0.0-beta.1"),
44-
STREAM_HASHER_NODE(NORMAL_DEPENDENCY, "@aws-sdk/hash-stream-node", "^1.0.0-beta.1"),
45-
STREAM_HASHER_BROWSER(NORMAL_DEPENDENCY, "@aws-sdk/hash-blob-browser", "^1.0.0-beta.1"),
46-
ROUTE53_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-route53", "^1.0.0-beta.1"),
47-
EC2_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-ec2", "^1.0.0-beta.0"),
48-
BUCKET_ENDPOINT_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-bucket-endpoint", "^1.0.0-beta.1"),
49-
BODY_CHECKSUM(NORMAL_DEPENDENCY, "@aws-sdk/middleware-apply-body-checksum", "^1.0.0-beta.1"),
50-
MIDDLEWARE_HOST_HEADER(NORMAL_DEPENDENCY, "@aws-sdk/middleware-host-header", "^1.0.0-beta.1"),
51-
SQS_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-sqs", "^1.0.0-beta.0"),
52-
BODY_CHECKSUM_GENERATOR_BROWSER(NORMAL_DEPENDENCY, "@aws-sdk/body-checksum-browser", "^1.0.0-beta.0"),
53-
BODY_CHECKSUM_GENERATOR_NODE(NORMAL_DEPENDENCY, "@aws-sdk/body-checksum-node", "^1.0.0-beta.0"),
54-
XML_BUILDER(NORMAL_DEPENDENCY, "@aws-sdk/xml-builder", "^1.0.0-beta.1"),
32+
MIDDLEWARE_SIGNING(NORMAL_DEPENDENCY, "@aws-sdk/middleware-signing", "^1.0.0-rc.1"),
33+
CREDENTIAL_PROVIDER_NODE(NORMAL_DEPENDENCY, "@aws-sdk/credential-provider-node", "^1.0.0-rc.1"),
34+
ACCEPT_HEADER(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-api-gateway", "^1.0.0-rc.1"),
35+
S3_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-s3", "^1.0.0-rc.1"),
36+
ADD_EXPECT_CONTINUE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-expect-continue", "^1.0.0-rc.1"),
37+
GLACIER_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-glacier", "^1.0.0-rc.1"),
38+
MACHINELEARNING_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-machinelearning", "^1.0.0-rc.1"),
39+
S3_CONTROL_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-s3-control", "^1.0.0-rc.1"),
40+
SSEC_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-ssec", "^1.0.0-rc.1"),
41+
RDS_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-rds", "^1.0.0-rc.1"),
42+
LOCATION_CONSTRAINT(NORMAL_DEPENDENCY, "@aws-sdk/middleware-location-constraint", "^1.0.0-rc.1"),
43+
MD5_BROWSER(NORMAL_DEPENDENCY, "@aws-sdk/md5-js", "^1.0.0-rc.1"),
44+
STREAM_HASHER_NODE(NORMAL_DEPENDENCY, "@aws-sdk/hash-stream-node", "^1.0.0-rc.1"),
45+
STREAM_HASHER_BROWSER(NORMAL_DEPENDENCY, "@aws-sdk/hash-blob-browser", "^1.0.0-rc.1"),
46+
ROUTE53_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-route53", "^1.0.0-rc.1"),
47+
EC2_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-ec2", "^1.0.0-rc.1"),
48+
BUCKET_ENDPOINT_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-bucket-endpoint", "^1.0.0-rc.1"),
49+
BODY_CHECKSUM(NORMAL_DEPENDENCY, "@aws-sdk/middleware-apply-body-checksum", "^1.0.0-rc.1"),
50+
MIDDLEWARE_HOST_HEADER(NORMAL_DEPENDENCY, "@aws-sdk/middleware-host-header", "^1.0.0-rc.1"),
51+
SQS_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-sqs", "^1.0.0-rc.1"),
52+
BODY_CHECKSUM_GENERATOR_BROWSER(NORMAL_DEPENDENCY, "@aws-sdk/body-checksum-browser", "^1.0.0-rc.1"),
53+
BODY_CHECKSUM_GENERATOR_NODE(NORMAL_DEPENDENCY, "@aws-sdk/body-checksum-node", "^1.0.0-rc.1"),
54+
XML_BUILDER(NORMAL_DEPENDENCY, "@aws-sdk/xml-builder", "^1.0.0-rc.1"),
5555
XML_PARSER(NORMAL_DEPENDENCY, "fast-xml-parser", "^3.16.0"),
5656
UUID_GENERATOR(NORMAL_DEPENDENCY, "uuid", "^3.0.0"),
5757
UUID_GENERATOR_TYPES(DEV_DEPENDENCY, "@types/uuid", "^3.0.0"),
58-
MIDDLEWARE_EVENTSTREAM(NORMAL_DEPENDENCY, "@aws-sdk/middleware-eventstream", "^1.0.0-beta.0"),
59-
AWS_SDK_EVENTSTREAM_HANDLER_NODE(NORMAL_DEPENDENCY, "@aws-sdk/eventstream-handler-node", "^1.0.0-beta.0"),
58+
MIDDLEWARE_EVENTSTREAM(NORMAL_DEPENDENCY, "@aws-sdk/middleware-eventstream", "^1.0.0-rc.1"),
59+
AWS_SDK_EVENTSTREAM_HANDLER_NODE(NORMAL_DEPENDENCY, "@aws-sdk/eventstream-handler-node", "^1.0.0-rc.1"),
6060
TRANSCRIBE_STREAMING_MIDDLEWARE(NORMAL_DEPENDENCY, "@aws-sdk/middleware-sdk-transcribe-streaming",
61-
"^1.0.0-gamma.0"),
62-
RETRY_CONFIG_PROVIDER(NORMAL_DEPENDENCY, "@aws-sdk/retry-config-provider", "^1.0.0-gamma.0"),
63-
NODE_CONFIG_PROVIDER(NORMAL_DEPENDENCY, "@aws-sdk/node-config-provider", "^1.0.0-gamma.0"),
64-
MIDDLEWARE_LOGGER(NORMAL_DEPENDENCY, "@aws-sdk/middleware-logger", "^1.0.0-gamma.0");
61+
"^1.0.0-rc.1"),
62+
RETRY_CONFIG_PROVIDER(NORMAL_DEPENDENCY, "@aws-sdk/retry-config-provider", "^1.0.0-rc.1"),
63+
NODE_CONFIG_PROVIDER(NORMAL_DEPENDENCY, "@aws-sdk/node-config-provider", "^1.0.0-rc.1"),
64+
MIDDLEWARE_LOGGER(NORMAL_DEPENDENCY, "@aws-sdk/middleware-logger", "^1.0.0-rc.1"),
65+
AWS_SDK_UTIL_USER_AGENT_BROWSER(NORMAL_DEPENDENCY, "@aws-sdk/util-user-agent-browser", "1.0.0-rc.1"),
66+
AWS_SDK_UTIL_USER_AGENT_NODE(NORMAL_DEPENDENCY, "@aws-sdk/util-user-agent-node", "1.0.0-rc.1");
6567

6668
public final String packageName;
6769
public final String version;

codegen/smithy-aws-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ software.amazon.smithy.aws.typescript.codegen.AddS3ControlDependency
1212
software.amazon.smithy.aws.typescript.codegen.AddEventStreamHandlingDependency
1313
software.amazon.smithy.aws.typescript.codegen.AddHttp2Dependency
1414
software.amazon.smithy.aws.typescript.codegen.AddTranscribeStreamingDependency
15+
software.amazon.smithy.aws.typescript.codegen.AddDefaultUserAgentConfig
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import { defaultUserAgent } from ".";
22

3-
it("should response basic node default user agent", () => {
3+
it("should response basic browser default user agent", () => {
44
let originUserAgent = "";
55
if (typeof navigator === "undefined") {
66
navigator = {} as any;
7-
originUserAgent = "foo/1.0";
7+
originUserAgent =
8+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36";
89
(navigator.userAgent as any) = originUserAgent;
910
} else {
1011
originUserAgent = navigator.userAgent;
1112
}
12-
13-
expect(defaultUserAgent("client-s3-node", "0.1.0")).toBe(`aws-sdk-js-v3-client-s3-node/0.1.0 ${originUserAgent}`);
13+
const userAgent = defaultUserAgent("client-s3", "0.1.0");
14+
expect(userAgent).toEqual(expect.stringContaining("aws-sdk-js/0.1.0"));
15+
expect(userAgent).toEqual(expect.stringContaining(originUserAgent));
16+
expect(userAgent).toEqual(expect.stringContaining("sdk-client/client-s3"));
1417
});
Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
export function defaultUserAgent(packageName: string, packageVersion: string): string {
2-
const originUserAgent =
3-
typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
4-
return `aws-sdk-js-v3-${packageName}/${packageVersion} ${originUserAgent}`;
5-
}
1+
export const defaultUserAgent = (packageName: string, packageVersion: string): string =>
2+
[
3+
// sdk-metadata
4+
// TODO: remove this post GA and version changed to 3.x.x
5+
`aws-sdk-js/${packageVersion.replace(/^1\./, "3.")}`,
6+
// os-metadata
7+
window?.navigator?.product,
8+
window?.navigator?.userAgent,
9+
// language-metadata
10+
`sdk-client/${packageName}`,
11+
]
12+
.filter((section) => section && section.length > 0)
13+
.join(" ");

packages/util-user-agent-node/src/index.spec.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,19 @@ describe("defaultUserAgent", () => {
66
it("should response basic node default user agent", () => {
77
const originEnv = process.env.AWS_EXECUTION_ENV;
88
delete process.env.AWS_EXECUTION_ENV;
9-
expect(defaultUserAgent("client-s3-node", "0.1.0")).toBe(
10-
`aws-sdk-nodejs-v3-client-s3-node/0.1.0 ${process.platform}/${process.version}`
11-
);
9+
const userAgent = defaultUserAgent("client-s3", "0.1.0");
10+
expect(userAgent).toEqual(expect.stringContaining("aws-sdk-nodejs/0.1.0"));
11+
expect(userAgent).toEqual(expect.stringContaining(process.platform));
12+
expect(userAgent).toEqual(expect.stringContaining(`nodejs/${process.versions.node}`));
13+
expect(userAgent).toEqual(expect.stringContaining("sdk-client/client-s3"));
1214
if (originEnv) process.env.AWS_EXECUTION_ENV = originEnv;
1315
});
1416

1517
it("should add AWS_EXECUTION_ENV", () => {
1618
const originEnv = process.env.AWS_EXECUTION_ENV;
1719
process.env.AWS_EXECUTION_ENV = "ecs";
18-
expect(defaultUserAgent("client-s3-node", "0.1.0")).toBe(
19-
`aws-sdk-nodejs-v3-client-s3-node/0.1.0 ${process.platform}/${process.version} exec-env/ecs`
20-
);
20+
const userAgent = defaultUserAgent("client-s3", "0.1.0");
21+
expect(userAgent).toEqual(expect.stringContaining("exec-env/ecs"));
2122
if (originEnv) process.env.AWS_EXECUTION_ENV = originEnv;
2223
});
2324
});
Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
import process from "process";
22

3-
export function defaultUserAgent(packageName: string, packageVersion: string): string {
4-
let engine = `${process.platform}/${process.version}`;
5-
if (process.env.AWS_EXECUTION_ENV) {
6-
engine += ` exec-env/${process.env.AWS_EXECUTION_ENV}`;
7-
}
8-
return `aws-sdk-nodejs-v3-${packageName}/${packageVersion} ${engine}`;
9-
}
3+
export const defaultUserAgent = (packageName: string, packageVersion: string): string =>
4+
[
5+
// sdk-metadata
6+
// TODO: remove this post GA and version changed to 3.x.x
7+
`aws-sdk-nodejs/${packageVersion.replace(/^1\./, "3.")}`,
8+
// os-metadata
9+
process.platform,
10+
`nodejs/${process.versions.node}`,
11+
// language-metadata
12+
`sdk-client/${packageName}`,
13+
// env-metadata
14+
process.env.AWS_EXECUTION_ENV ? `exec-env/${process.env.AWS_EXECUTION_ENV}` : undefined,
15+
]
16+
.filter((section) => section && section.length > 0)
17+
.join(" ");

0 commit comments

Comments
 (0)