Skip to content

Commit f7b5f75

Browse files
committed
updates files to typescript and related test files to use them
1 parent 5c2c729 commit f7b5f75

19 files changed

+217
-153
lines changed

src/AgentSender.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/AgentSender.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Request, Response, Sender } from "./types";
2+
3+
export default class AgentSender {
4+
private sender: Sender;
5+
6+
constructor(innerSender: Sender) {
7+
this.sender = innerSender;
8+
}
9+
10+
send(request: Request): Promise<Response> {
11+
request.parameters["agent"] =
12+
"smarty (sdk:javascript@" + require("../../package.json").version + ")";
13+
return new Promise((resolve, reject) => {
14+
this.sender.send(request).then(resolve).catch(reject);
15+
});
16+
}
17+
}

src/BaseUrlSender.js

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/BaseUrlSender.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Request, Response, Sender } from "./types";
2+
3+
export default class BaseUrlSender {
4+
private urlOverride: string;
5+
private sender: Sender;
6+
7+
constructor(innerSender: Sender, urlOverride: string) {
8+
this.urlOverride = urlOverride;
9+
this.sender = innerSender;
10+
}
11+
12+
send(request: Request): Promise<Response> {
13+
return new Promise((resolve, reject) => {
14+
request.baseUrl = `${this.urlOverride}${
15+
request.baseUrlParam ? `/${request.baseUrlParam}` : ""
16+
}`;
17+
18+
this.sender.send(request).then(resolve).catch(reject);
19+
});
20+
}
21+
}

src/ClientBuilder.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const CustomHeaderSender = require("./CustomHeaderSender");
88
const StatusCodeSender = require("./StatusCodeSender");
99
const LicenseSender = require("./LicenseSender");
1010
const BadCredentialsError = require("./Errors").BadCredentialsError;
11-
const RetrySender = require("./RetrySender.js");
11+
const RetrySender = require("./RetrySender");
1212
const Sleeper = require("./util/Sleeper.ts");
1313

1414
//TODO: refactor this to work more cleanly with a bundler.
@@ -27,7 +27,8 @@ const US_EXTRACT_API_URL = "https://us-extract.api.smarty.com/";
2727
const US_STREET_API_URL = "https://us-street.api.smarty.com/street-address";
2828
const US_ZIP_CODE_API_URL = "https://us-zipcode.api.smarty.com/lookup";
2929
const US_REVERSE_GEO_API_URL = "https://us-reverse-geo.api.smarty.com/lookup";
30-
const INTERNATIONAL_ADDRESS_AUTOCOMPLETE_API_URL = "https://international-autocomplete.api.smarty.com/v2/lookup";
30+
const INTERNATIONAL_ADDRESS_AUTOCOMPLETE_API_URL =
31+
"https://international-autocomplete.api.smarty.com/v2/lookup";
3132
const US_ENRICHMENT_API_URL = "https://us-enrichment.api.smarty.com/lookup";
3233

3334
/**
@@ -201,7 +202,10 @@ class ClientBuilder {
201202
}
202203

203204
buildInternationalAddressAutocompleteClient() {
204-
return this.buildClient(INTERNATIONAL_ADDRESS_AUTOCOMPLETE_API_URL, InternationalAddressAutocompleteClient);
205+
return this.buildClient(
206+
INTERNATIONAL_ADDRESS_AUTOCOMPLETE_API_URL,
207+
InternationalAddressAutocompleteClient,
208+
);
205209
}
206210

207211
buildUsEnrichmentClient() {

src/CustomHeaderSender.js

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/CustomHeaderSender.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Request, Response, Sender } from "./types";
2+
3+
export default class CustomHeaderSender {
4+
private sender: Sender;
5+
private customHeaders: Record<string, string>;
6+
7+
constructor(innerSender: Sender, customHeaders: Record<string, string>) {
8+
this.sender = innerSender;
9+
this.customHeaders = customHeaders;
10+
}
11+
12+
send(request: Request): Promise<Response> {
13+
for (let key in this.customHeaders) {
14+
request.headers[key] = this.customHeaders[key];
15+
}
16+
17+
return new Promise((resolve, reject) => {
18+
this.sender.send(request).then(resolve).catch(reject);
19+
});
20+
}
21+
}

src/RetrySender.js

Lines changed: 0 additions & 50 deletions
This file was deleted.

src/RetrySender.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { Request, Response, Sender, Sleeper } from "./types";
2+
3+
export default class RetrySender {
4+
private maxRetries: number;
5+
private statusToRetry: number[];
6+
private statusTooManyRequests: number;
7+
private maxBackoffDuration: number;
8+
private inner: Sender;
9+
private sleeper: Sleeper;
10+
11+
constructor(maxRetries: number = 5, inner: Sender, sleeper: Sleeper) {
12+
this.maxRetries = maxRetries;
13+
this.statusToRetry = [408, 429, 500, 502, 503, 504];
14+
this.statusTooManyRequests = 429;
15+
this.maxBackoffDuration = 10;
16+
this.inner = inner;
17+
this.sleeper = sleeper;
18+
}
19+
20+
async send(request: Request): Promise<Response> {
21+
let response = await this.inner.send(request);
22+
23+
for (let i = 0; i < this.maxRetries; i++) {
24+
const statusCode = parseInt(String(response.statusCode));
25+
if (!this.statusToRetry.includes(statusCode)) {
26+
break;
27+
}
28+
29+
if (statusCode === this.statusTooManyRequests) {
30+
let secondsToBackoff = 10;
31+
if (response.headers) {
32+
const retryAfterHeader = response.headers["Retry-After"];
33+
if (Number.isInteger(Number(retryAfterHeader))) {
34+
secondsToBackoff = Number(retryAfterHeader);
35+
}
36+
}
37+
await this.rateLimitBackOff(secondsToBackoff);
38+
} else {
39+
await this.backoff(i);
40+
}
41+
response = await this.inner.send(request);
42+
}
43+
44+
return response;
45+
}
46+
47+
private async backoff(attempt: number): Promise<void> {
48+
const backoffDuration = Math.min(attempt, this.maxBackoffDuration);
49+
console.log(
50+
`There was an error processing the request. Retrying in ${backoffDuration} seconds...`,
51+
);
52+
await this.sleeper.sleep(backoffDuration);
53+
}
54+
55+
private async rateLimitBackOff(backoffDuration: number): Promise<void> {
56+
console.log(`Rate limit reached. Retrying in ${backoffDuration} seconds...`);
57+
await this.sleeper.sleep(backoffDuration);
58+
}
59+
}

src/SharedCredentials.js renamed to src/SharedCredentials.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
class SharedCredentials {
2-
constructor(authId, hostName) {
1+
export default class SharedCredentials {
2+
private authId: string;
3+
private hostName: string | undefined;
4+
5+
constructor(authId: string, hostName?: string) {
36
this.authId = authId;
47
this.hostName = hostName;
58
}
69

7-
sign(request) {
10+
sign(request: any): void {
811
request.parameters["key"] = this.authId;
912
if (this.hostName) request.headers["Referer"] = "https://" + this.hostName;
1013
}
1114
}
12-
13-
module.exports = SharedCredentials;

0 commit comments

Comments
 (0)