@takaro/apiclient 0.0.0-dev.8756fcb → 0.0.0-dev.88b923e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/api.d.ts +37 -1
- package/dist/generated/api.d.ts.map +1 -1
- package/dist/generated/api.js.map +1 -1
- package/dist/lib/baseClient.d.ts +14 -0
- package/dist/lib/baseClient.d.ts.map +1 -1
- package/dist/lib/baseClient.js +13 -0
- package/dist/lib/baseClient.js.map +1 -1
- package/package.json +1 -1
- package/src/generated/api.ts +37 -1
- package/src/lib/__tests__/baseClient.unit.test.ts +17 -0
- package/src/lib/baseClient.ts +16 -0
package/dist/lib/baseClient.d.ts
CHANGED
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
import { MetaApi } from '../generated/api.js';
|
|
2
2
|
import { AxiosInstance } from 'axios';
|
|
3
|
+
/**
|
|
4
|
+
* Axios defaults to NO timeout, so a request whose TCP connection stalls blocks its
|
|
5
|
+
* await forever. During incident run-29688761260 a single POST hung for ~80 minutes
|
|
6
|
+
* (Tempo trace 15f5708701c38676355a0e42cb9f7ffe: a client span with no server span),
|
|
7
|
+
* freezing 3 of 4 CI shards until the 53-minute job timeout.
|
|
8
|
+
*
|
|
9
|
+
* 120s is deliberately generous — the goal is "not infinite", not "tight". The slowest
|
|
10
|
+
* legitimate single call is a domain create under full 4-shard CI load at roughly 30s.
|
|
11
|
+
* Individual long-running calls should pass a per-request `{ timeout }` override rather
|
|
12
|
+
* than raising this.
|
|
13
|
+
*/
|
|
14
|
+
export declare const DEFAULT_REQUEST_TIMEOUT_MS = 120000;
|
|
3
15
|
export interface IBaseApiClientConfig {
|
|
4
16
|
url: string;
|
|
5
17
|
log?: Logger | false;
|
|
18
|
+
/** Per-request timeout in ms. Defaults to DEFAULT_REQUEST_TIMEOUT_MS. */
|
|
19
|
+
timeoutMs?: number;
|
|
6
20
|
}
|
|
7
21
|
interface Logger {
|
|
8
22
|
info: (msg: string, meta?: unknown) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseClient.d.ts","sourceRoot":"","sources":["../../src/lib/baseClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAc,EAAc,aAAa,EAAsB,MAAM,OAAO,CAAC;AAE7E,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"baseClient.d.ts","sourceRoot":"","sources":["../../src/lib/baseClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAc,EAAc,aAAa,EAAsB,MAAM,OAAO,CAAC;AAE7E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B,SAAU,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,MAAM;IACd,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAED,qBAAa,aAAa,CAAC,CAAC,SAAS,oBAAoB;IAS3C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IARxC,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE,MAAM,CAKnB;gBAE6B,MAAM,EAAE,CAAC;IAqBxC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIpC,SAAS,CAAC,QAAQ,EAAE,MAAM;IAI1B,IAAI,aAAa,kBAEhB;IAED,UAAU,CAAC,IAAI,EAAE,MAAM;IAIvB,OAAO,CAAC,UAAU;IAgElB;;;OAGG;IACG,gBAAgB,CAAC,OAAO,SAAS;IAqBvC,IAAI,IAAI,YAQP;CACF"}
|
package/dist/lib/baseClient.js
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { MetaApi } from '../generated/api.js';
|
|
2
2
|
import axios from 'axios';
|
|
3
|
+
/**
|
|
4
|
+
* Axios defaults to NO timeout, so a request whose TCP connection stalls blocks its
|
|
5
|
+
* await forever. During incident run-29688761260 a single POST hung for ~80 minutes
|
|
6
|
+
* (Tempo trace 15f5708701c38676355a0e42cb9f7ffe: a client span with no server span),
|
|
7
|
+
* freezing 3 of 4 CI shards until the 53-minute job timeout.
|
|
8
|
+
*
|
|
9
|
+
* 120s is deliberately generous — the goal is "not infinite", not "tight". The slowest
|
|
10
|
+
* legitimate single call is a domain create under full 4-shard CI load at roughly 30s.
|
|
11
|
+
* Individual long-running calls should pass a per-request `{ timeout }` override rather
|
|
12
|
+
* than raising this.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_REQUEST_TIMEOUT_MS = 120_000;
|
|
3
15
|
export class BaseApiClient {
|
|
4
16
|
constructor(config) {
|
|
5
17
|
this.config = config;
|
|
@@ -21,6 +33,7 @@ export class BaseApiClient {
|
|
|
21
33
|
...(!isBrowser && { 'User-Agent': 'Takaro-API-Client' }),
|
|
22
34
|
},
|
|
23
35
|
withCredentials: true,
|
|
36
|
+
timeout: this.config.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
|
|
24
37
|
};
|
|
25
38
|
this.axios = this.addLoggers(axios.create(axiosConfig));
|
|
26
39
|
if (this.config.log)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseClient.js","sourceRoot":"","sources":["../../src/lib/baseClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAwD,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"baseClient.js","sourceRoot":"","sources":["../../src/lib/baseClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/generated/api.ts
CHANGED
|
@@ -2264,6 +2264,18 @@ export interface DomainCreateInputDTO {
|
|
|
2264
2264
|
* @memberof DomainCreateInputDTO
|
|
2265
2265
|
*/
|
|
2266
2266
|
maxFunctionsInModule?: number;
|
|
2267
|
+
/**
|
|
2268
|
+
*
|
|
2269
|
+
* @type {number}
|
|
2270
|
+
* @memberof DomainCreateInputDTO
|
|
2271
|
+
*/
|
|
2272
|
+
maxCustomRoles?: number;
|
|
2273
|
+
/**
|
|
2274
|
+
*
|
|
2275
|
+
* @type {number}
|
|
2276
|
+
* @memberof DomainCreateInputDTO
|
|
2277
|
+
*/
|
|
2278
|
+
maxDiscordLinkedRoles?: number;
|
|
2267
2279
|
}
|
|
2268
2280
|
|
|
2269
2281
|
export const DomainCreateInputDTOStateEnum = {
|
|
@@ -2422,6 +2434,18 @@ export interface DomainOutputDTO {
|
|
|
2422
2434
|
* @memberof DomainOutputDTO
|
|
2423
2435
|
*/
|
|
2424
2436
|
maxFunctionsInModule: number;
|
|
2437
|
+
/**
|
|
2438
|
+
*
|
|
2439
|
+
* @type {number}
|
|
2440
|
+
* @memberof DomainOutputDTO
|
|
2441
|
+
*/
|
|
2442
|
+
maxCustomRoles: number;
|
|
2443
|
+
/**
|
|
2444
|
+
*
|
|
2445
|
+
* @type {number}
|
|
2446
|
+
* @memberof DomainOutputDTO
|
|
2447
|
+
*/
|
|
2448
|
+
maxDiscordLinkedRoles: number;
|
|
2425
2449
|
/**
|
|
2426
2450
|
*
|
|
2427
2451
|
* @type {string}
|
|
@@ -2653,6 +2677,18 @@ export interface DomainUpdateInputDTO {
|
|
|
2653
2677
|
* @memberof DomainUpdateInputDTO
|
|
2654
2678
|
*/
|
|
2655
2679
|
maxFunctionsInModule?: number;
|
|
2680
|
+
/**
|
|
2681
|
+
*
|
|
2682
|
+
* @type {number}
|
|
2683
|
+
* @memberof DomainUpdateInputDTO
|
|
2684
|
+
*/
|
|
2685
|
+
maxCustomRoles?: number;
|
|
2686
|
+
/**
|
|
2687
|
+
*
|
|
2688
|
+
* @type {number}
|
|
2689
|
+
* @memberof DomainUpdateInputDTO
|
|
2690
|
+
*/
|
|
2691
|
+
maxDiscordLinkedRoles?: number;
|
|
2656
2692
|
}
|
|
2657
2693
|
|
|
2658
2694
|
export const DomainUpdateInputDTOStateEnum = {
|
|
@@ -13360,7 +13396,7 @@ export interface RoleUpdateInputDTO {
|
|
|
13360
13396
|
* @type {string}
|
|
13361
13397
|
* @memberof RoleUpdateInputDTO
|
|
13362
13398
|
*/
|
|
13363
|
-
linkedDiscordRoleId?: string;
|
|
13399
|
+
linkedDiscordRoleId?: string | null;
|
|
13364
13400
|
}
|
|
13365
13401
|
/**
|
|
13366
13402
|
*
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import { expect } from '@takaro/test';
|
|
3
|
+
import { BaseApiClient, DEFAULT_REQUEST_TIMEOUT_MS } from '../baseClient.js';
|
|
4
|
+
|
|
5
|
+
describe('BaseApiClient timeouts', () => {
|
|
6
|
+
it('sets a default request timeout so a stalled request cannot hang forever', () => {
|
|
7
|
+
const client = new BaseApiClient({ url: 'http://localhost:3000', log: false });
|
|
8
|
+
|
|
9
|
+
expect(client.axiosInstance.defaults.timeout).to.equal(DEFAULT_REQUEST_TIMEOUT_MS);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('lets a caller override the timeout', () => {
|
|
13
|
+
const client = new BaseApiClient({ url: 'http://localhost:3000', log: false, timeoutMs: 5000 });
|
|
14
|
+
|
|
15
|
+
expect(client.axiosInstance.defaults.timeout).to.equal(5000);
|
|
16
|
+
});
|
|
17
|
+
});
|
package/src/lib/baseClient.ts
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import { MetaApi } from '../generated/api.js';
|
|
2
2
|
import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from 'axios';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Axios defaults to NO timeout, so a request whose TCP connection stalls blocks its
|
|
6
|
+
* await forever. During incident run-29688761260 a single POST hung for ~80 minutes
|
|
7
|
+
* (Tempo trace 15f5708701c38676355a0e42cb9f7ffe: a client span with no server span),
|
|
8
|
+
* freezing 3 of 4 CI shards until the 53-minute job timeout.
|
|
9
|
+
*
|
|
10
|
+
* 120s is deliberately generous — the goal is "not infinite", not "tight". The slowest
|
|
11
|
+
* legitimate single call is a domain create under full 4-shard CI load at roughly 30s.
|
|
12
|
+
* Individual long-running calls should pass a per-request `{ timeout }` override rather
|
|
13
|
+
* than raising this.
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_REQUEST_TIMEOUT_MS = 120_000;
|
|
16
|
+
|
|
4
17
|
export interface IBaseApiClientConfig {
|
|
5
18
|
url: string;
|
|
6
19
|
log?: Logger | false;
|
|
20
|
+
/** Per-request timeout in ms. Defaults to DEFAULT_REQUEST_TIMEOUT_MS. */
|
|
21
|
+
timeoutMs?: number;
|
|
7
22
|
}
|
|
8
23
|
|
|
9
24
|
interface Logger {
|
|
@@ -36,6 +51,7 @@ export class BaseApiClient<T extends IBaseApiClientConfig> {
|
|
|
36
51
|
...(!isBrowser && { 'User-Agent': 'Takaro-API-Client' }),
|
|
37
52
|
},
|
|
38
53
|
withCredentials: true,
|
|
54
|
+
timeout: this.config.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
|
|
39
55
|
};
|
|
40
56
|
this.axios = this.addLoggers(axios.create(axiosConfig));
|
|
41
57
|
|