Skip to content

Commit a51a950

Browse files
authored
fix: add options to clients (#16)
1 parent d3af41e commit a51a950

File tree

20 files changed

+126
-80
lines changed

20 files changed

+126
-80
lines changed

clients/algoliasearch-client-javascript/client-search/apis.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ import { SearchApi } from './searchApi';
44
export class searchClient extends SearchApi {}
55

66
export * from '../utils/errors';
7-
export { EchoRequester } from '../utils/EchoRequester';
7+
export { EchoRequester } from '../utils/requester/EchoRequester';
88

99
export const APIS = [SearchApi];

clients/algoliasearch-client-javascript/client-search/searchApi.ts

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { shuffle } from '../utils/helpers';
22
import { Transporter } from '../utils/Transporter';
33
import { Headers, Host, Request, RequestOptions } from '../utils/types';
4-
import { Requester } from '../utils/Requester';
4+
import { Requester } from '../utils/requester/Requester';
55

66
import { BatchObject } from '../model/batchObject';
77
import { BatchResponse } from '../model/batchResponse';
@@ -27,22 +27,11 @@ export class SearchApi {
2727
appId: new ApiKeyAuth('header', 'X-Algolia-Application-Id'),
2828
};
2929

30-
constructor(appId: string, apiKey: string, requester?: Requester) {
30+
constructor(appId: string, apiKey: string, options?: { requester?: Requester; hosts?: Host[] }) {
3131
this.setApiKey(SearchApiApiKeys.appId, appId);
3232
this.setApiKey(SearchApiApiKeys.apiKey, apiKey);
3333
this.transporter = new Transporter({
34-
hosts: (
35-
[
36-
{ url: `${appId}-dsn.algolia.net`, accept: 'read', protocol: 'https' },
37-
{ url: `${appId}.algolia.net`, accept: 'write', protocol: 'https' },
38-
] as Host[]
39-
).concat(
40-
shuffle([
41-
{ url: `${appId}-1.algolianet.com`, accept: 'readWrite', protocol: 'https' },
42-
{ url: `${appId}-2.algolianet.com`, accept: 'readWrite', protocol: 'https' },
43-
{ url: `${appId}-3.algolianet.com`, accept: 'readWrite', protocol: 'https' },
44-
])
45-
),
34+
hosts: options?.hosts ?? this.getDefaultHosts(appId, apiKey),
4635
baseHeaders: {
4736
'content-type': 'application/x-www-form-urlencoded',
4837
},
@@ -52,10 +41,33 @@ export class SearchApi {
5241
read: 5,
5342
write: 30,
5443
},
55-
requester,
44+
requester: options?.requester,
5645
});
5746
}
5847

48+
public getDefaultHosts(appId: string, apiKey: string): Host[] {
49+
return (
50+
[
51+
{ url: `${appId}-dsn.algolia.net`, accept: 'read', protocol: 'https' },
52+
{ url: `${appId}.algolia.net`, accept: 'write', protocol: 'https' },
53+
] as Host[]
54+
).concat(
55+
shuffle([
56+
{ url: `${appId}-1.algolianet.com`, accept: 'readWrite', protocol: 'https' },
57+
{ url: `${appId}-2.algolianet.com`, accept: 'readWrite', protocol: 'https' },
58+
{ url: `${appId}-3.algolianet.com`, accept: 'readWrite', protocol: 'https' },
59+
])
60+
);
61+
}
62+
63+
public setRequest(requester: Requester): void {
64+
this.transporter.setRequester(requester);
65+
}
66+
67+
public setHosts(hosts: Host[]): void {
68+
this.transporter.setHosts(hosts);
69+
}
70+
5971
public setApiKey(key: SearchApiApiKeys, value: string) {
6072
this.authentications[SearchApiApiKeys[key]].apiKey = value;
6173
}

clients/algoliasearch-client-javascript/utils/EchoRequester.ts

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

clients/algoliasearch-client-javascript/utils/Requester.ts

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

clients/algoliasearch-client-javascript/utils/Transporter.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import type {
77
Response,
88
EndRequest,
99
} from './types';
10-
import { MemoryCache } from './MemoryCache';
11-
import type { Cache } from './Cache';
10+
import { MemoryCache } from './cache/MemoryCache';
11+
import type { Cache } from './cache/Cache';
1212
import { StatefulHost } from './StatefulHost';
1313
import {
1414
deserializeFailure,
@@ -20,8 +20,8 @@ import {
2020
import { Headers } from './types';
2121
import { RetryError } from './errors';
2222
import * as responseUtils from './Response';
23-
import { Requester } from './Requester';
24-
import { HttpRequester } from './HttpRequester';
23+
import { Requester } from './requester/Requester';
24+
import { HttpRequester } from './requester/HttpRequester';
2525

2626
export class Transporter {
2727
private hosts: Host[];
@@ -52,6 +52,15 @@ export class Transporter {
5252
this.requester = requester;
5353
}
5454

55+
public setHosts(hosts: Host[]): void {
56+
this.hosts = hosts;
57+
this.hostsCache.clear();
58+
}
59+
60+
public setRequester(requester: Requester): void {
61+
this.requester = requester;
62+
}
63+
5564
async createRetryableOptions(compatibleHosts: Host[]): Promise<{
5665
hosts: Host[];
5766
getTimeout: (retryCount: number, timeout: number) => number;
@@ -169,7 +178,7 @@ export class Transporter {
169178
return stackFrame;
170179
};
171180

172-
const response = await this.requester.send(payload);
181+
const response = await this.requester.send(payload, request);
173182

174183
if (responseUtils.isRetryable(response)) {
175184
pushToStackTrace(response);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { EndRequest, Request, Response } from '../types';
2+
import { Requester } from './Requester';
3+
4+
export class EchoRequester extends Requester {
5+
constructor(private status = 200) {
6+
super();
7+
}
8+
9+
async send(request: EndRequest, originalRequest: Request): Promise<Response> {
10+
return {
11+
content: JSON.stringify(originalRequest),
12+
isTimedOut: false,
13+
status: this.status,
14+
};
15+
}
16+
}

clients/utils/javascript/HttpRequester.ts renamed to clients/algoliasearch-client-javascript/utils/requester/HttpRequester.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EndRequest, Response } from './types';
1+
import { EndRequest, Response } from '../types';
22
import * as http from 'http';
33
import * as https from 'https';
44
import { Requester } from './Requester';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { EndRequest, Request, Response } from '../types';
2+
export abstract class Requester {
3+
abstract send(request: EndRequest, originalRequest: Request): Promise<Response>;
4+
}

clients/utils/javascript/EchoRequester.ts

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

clients/utils/javascript/Requester.ts

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

clients/utils/javascript/Transporter.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import type {
77
Response,
88
EndRequest,
99
} from './types';
10-
import { MemoryCache } from './MemoryCache';
11-
import type { Cache } from './Cache';
10+
import { MemoryCache } from './cache/MemoryCache';
11+
import type { Cache } from './cache/Cache';
1212
import { StatefulHost } from './StatefulHost';
1313
import {
1414
deserializeFailure,
@@ -20,8 +20,8 @@ import {
2020
import { Headers } from './types';
2121
import { RetryError } from './errors';
2222
import * as responseUtils from './Response';
23-
import { Requester } from './Requester';
24-
import { HttpRequester } from './HttpRequester';
23+
import { Requester } from './requester/Requester';
24+
import { HttpRequester } from './requester/HttpRequester';
2525

2626
export class Transporter {
2727
private hosts: Host[];
@@ -52,6 +52,15 @@ export class Transporter {
5252
this.requester = requester;
5353
}
5454

55+
public setHosts(hosts: Host[]): void {
56+
this.hosts = hosts;
57+
this.hostsCache.clear();
58+
}
59+
60+
public setRequester(requester: Requester): void {
61+
this.requester = requester;
62+
}
63+
5564
async createRetryableOptions(compatibleHosts: Host[]): Promise<{
5665
hosts: Host[];
5766
getTimeout: (retryCount: number, timeout: number) => number;
@@ -169,7 +178,7 @@ export class Transporter {
169178
return stackFrame;
170179
};
171180

172-
const response = await this.requester.send(payload);
181+
const response = await this.requester.send(payload, request);
173182

174183
if (responseUtils.isRetryable(response)) {
175184
pushToStackTrace(response);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { EndRequest, Request, Response } from '../types';
2+
import { Requester } from './Requester';
3+
4+
export class EchoRequester extends Requester {
5+
constructor(private status = 200) {
6+
super();
7+
}
8+
9+
async send(request: EndRequest, originalRequest: Request): Promise<Response> {
10+
return {
11+
content: JSON.stringify(originalRequest),
12+
isTimedOut: false,
13+
status: this.status,
14+
};
15+
}
16+
}

clients/algoliasearch-client-javascript/utils/HttpRequester.ts renamed to clients/utils/javascript/requester/HttpRequester.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EndRequest, Response } from './types';
1+
import { EndRequest, Response } from '../types';
22
import * as http from 'http';
33
import * as https from 'https';
44
import { Requester } from './Requester';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { EndRequest, Request, Response } from '../types';
2+
export abstract class Requester {
3+
abstract send(request: EndRequest, originalRequest: Request): Promise<Response>;
4+
}

templates/javascript/api-all.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export * from './{{ classFilename }}Interface'
1212
export class searchClient extends SearchApi{}
1313

1414
export * from '../utils/errors';
15-
export { EchoRequester } from '../utils/EchoRequester';
15+
export { EchoRequester } from '../utils/requester/EchoRequester';
1616

1717
export const APIS = [{{#apis}}{{#operations}}{{ classname }}{{/operations}}{{^-last}}, {{/-last}}{{/apis}}];
1818
{{/apiInfo}}

templates/javascript/api-single.mustache

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { shuffle } from '../utils/helpers';
22
import { Transporter } from '../utils/Transporter';
33
import { Headers, Host, Request, RequestOptions } from '../utils/types';
4-
import { Requester } from '../utils/Requester';
4+
import { Requester } from '../utils/requester/Requester';
55

66
{{#imports}}
77
import { {{classname}} } from '{{filename}}';
@@ -37,22 +37,11 @@ export class {{classname}} {
3737
{{/hasAuthMethods}}
3838
}
3939

40-
constructor(appId: string, apiKey: string, requester?: Requester) {
40+
constructor(appId: string, apiKey: string, options?: {requester?: Requester, hosts?: Host[]}) {
4141
this.setApiKey(SearchApiApiKeys.appId, appId);
4242
this.setApiKey(SearchApiApiKeys.apiKey, apiKey);
4343
this.transporter = new Transporter({
44-
hosts: (
45-
[
46-
{ url: `${appId}-dsn.algolia.net`, accept: 'read', protocol: 'https' },
47-
{ url: `${appId}.algolia.net`, accept: 'write', protocol: 'https' },
48-
] as Host[]
49-
).concat(
50-
shuffle([
51-
{ url: `${appId}-1.algolianet.com`, accept: 'readWrite', protocol: 'https' },
52-
{ url: `${appId}-2.algolianet.com`, accept: 'readWrite', protocol: 'https' },
53-
{ url: `${appId}-3.algolianet.com`, accept: 'readWrite', protocol: 'https' },
54-
])
55-
),
44+
hosts: options?.hosts ?? this.getDefaultHosts(appId, apiKey),
5645
baseHeaders: {
5746
'content-type': 'application/x-www-form-urlencoded'
5847
},
@@ -62,17 +51,36 @@ export class {{classname}} {
6251
read: 5,
6352
write: 30,
6453
},
65-
requester,
54+
requester: options?.requester,
6655
});
6756
}
6857

58+
public getDefaultHosts(appId: string, apiKey: string): Host[] {
59+
return (
60+
[
61+
{ url: `${appId}-dsn.algolia.net`, accept: 'read', protocol: 'https' },
62+
{ url: `${appId}.algolia.net`, accept: 'write', protocol: 'https' },
63+
] as Host[]
64+
).concat(
65+
shuffle([
66+
{ url: `${appId}-1.algolianet.com`, accept: 'readWrite', protocol: 'https' },
67+
{ url: `${appId}-2.algolianet.com`, accept: 'readWrite', protocol: 'https' },
68+
{ url: `${appId}-3.algolianet.com`, accept: 'readWrite', protocol: 'https' },
69+
])
70+
);
71+
}
72+
73+
public setRequest(requester: Requester): void {
74+
this.transporter.setRequester(requester);
75+
}
76+
77+
public setHosts(hosts: Host[]): void {
78+
this.transporter.setHosts(hosts);
79+
}
80+
6981
public setApiKey(key: {{classname}}ApiKeys, value: string) {
7082
this.authentications[{{classname}}ApiKeys[key]].apiKey = value;
7183
}
72-
{{#hasAuthMethods}}
73-
{{#authMethods}}
74-
{{/authMethods}}
75-
{{/hasAuthMethods}}
7684

7785
private async sendRequest<TResponse>(request: Request, requestOptions: RequestOptions): Promise<TResponse> {
7886
{{#authMethods}}

0 commit comments

Comments
 (0)