@onkernel/sdk 0.107.0 → 0.108.0
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/CHANGELOG.md +7 -0
- package/lib/config-registry-wait.d.mts +12 -0
- package/lib/config-registry-wait.d.mts.map +1 -0
- package/lib/config-registry-wait.d.ts +12 -0
- package/lib/config-registry-wait.d.ts.map +1 -0
- package/lib/config-registry-wait.js +99 -0
- package/lib/config-registry-wait.js.map +1 -0
- package/lib/config-registry-wait.mjs +96 -0
- package/lib/config-registry-wait.mjs.map +1 -0
- package/package.json +1 -1
- package/resources/config-registry/analyses.d.mts +11 -2
- package/resources/config-registry/analyses.d.mts.map +1 -1
- package/resources/config-registry/analyses.d.ts +11 -2
- package/resources/config-registry/analyses.d.ts.map +1 -1
- package/resources/config-registry/analyses.js +11 -0
- package/resources/config-registry/analyses.js.map +1 -1
- package/resources/config-registry/analyses.mjs +11 -0
- package/resources/config-registry/analyses.mjs.map +1 -1
- package/resources/config-registry/index.d.mts +1 -1
- package/resources/config-registry/index.d.mts.map +1 -1
- package/resources/config-registry/index.d.ts +1 -1
- package/resources/config-registry/index.d.ts.map +1 -1
- package/resources/config-registry/index.js.map +1 -1
- package/resources/config-registry/index.mjs.map +1 -1
- package/src/lib/config-registry-wait.ts +133 -0
- package/src/resources/config-registry/analyses.ts +23 -2
- package/src/resources/config-registry/index.ts +1 -1
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.108.0](https://github.com/kernel/kernel-node-sdk/compare/v0.107.0...v0.108.0) (2026-09-17)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* feat: add config registry analysis waiter ([0c8d02a](https://github.com/kernel/kernel-node-sdk/commit/0c8d02a9f4baf1da7bb14cef4969d31e12ce804a))
|
|
9
|
+
|
|
3
10
|
## [0.107.0](https://github.com/kernel/kernel-node-sdk/compare/v0.106.0...v0.107.0) (2026-09-16)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RequestOptions } from "../internal/request-options.mjs";
|
|
2
|
+
import type { ConfigRegistryResponse } from "../resources/config-registry/config-registry.mjs";
|
|
3
|
+
export type ConfigRegistryAnalysisWaitOptions = Pick<RequestOptions, 'headers' | 'maxRetries' | 'timeout' | 'fetchOptions' | 'signal' | 'defaultBaseURL'> & {
|
|
4
|
+
pollIntervalMs?: number;
|
|
5
|
+
maxWaitMs?: number | null;
|
|
6
|
+
};
|
|
7
|
+
type AnalysisRetriever = {
|
|
8
|
+
retrieve(id: string, options?: RequestOptions): Promise<ConfigRegistryResponse>;
|
|
9
|
+
};
|
|
10
|
+
export declare function waitForConfigRegistryAnalysis(resource: AnalysisRetriever, id: string, options?: ConfigRegistryAnalysisWaitOptions): Promise<ConfigRegistryResponse>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=config-registry-wait.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-wait.d.mts","sourceRoot":"","sources":["../src/lib/config-registry-wait.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,wCAAoC;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,yDAAqD;AAK3F,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,cAAc,EACd,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,QAAQ,GAAG,gBAAgB,CACpF,GAAG;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACjF,CAAC;AAoEF,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,iBAAiB,EAC3B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,sBAAsB,CAAC,CA0CjC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RequestOptions } from "../internal/request-options.js";
|
|
2
|
+
import type { ConfigRegistryResponse } from "../resources/config-registry/config-registry.js";
|
|
3
|
+
export type ConfigRegistryAnalysisWaitOptions = Pick<RequestOptions, 'headers' | 'maxRetries' | 'timeout' | 'fetchOptions' | 'signal' | 'defaultBaseURL'> & {
|
|
4
|
+
pollIntervalMs?: number;
|
|
5
|
+
maxWaitMs?: number | null;
|
|
6
|
+
};
|
|
7
|
+
type AnalysisRetriever = {
|
|
8
|
+
retrieve(id: string, options?: RequestOptions): Promise<ConfigRegistryResponse>;
|
|
9
|
+
};
|
|
10
|
+
export declare function waitForConfigRegistryAnalysis(resource: AnalysisRetriever, id: string, options?: ConfigRegistryAnalysisWaitOptions): Promise<ConfigRegistryResponse>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=config-registry-wait.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-wait.d.ts","sourceRoot":"","sources":["../src/lib/config-registry-wait.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,uCAAoC;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,wDAAqD;AAK3F,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,cAAc,EACd,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,QAAQ,GAAG,gBAAgB,CACpF,GAAG;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACjF,CAAC;AAoEF,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,iBAAiB,EAC3B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,sBAAsB,CAAC,CA0CjC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.waitForConfigRegistryAnalysis = waitForConfigRegistryAnalysis;
|
|
4
|
+
const error_1 = require("../core/error.js");
|
|
5
|
+
const headers_1 = require("../internal/headers.js");
|
|
6
|
+
const defaultPollIntervalMs = 5000;
|
|
7
|
+
const terminalStatuses = new Set(['completed', 'failed', 'canceled', 'expired']);
|
|
8
|
+
const timeoutError = (id, polls, lastStatus, startedAt) => new error_1.APIConnectionTimeoutError({
|
|
9
|
+
message: `Timed out waiting for config registry analysis ${JSON.stringify(id)} after ${(performance.now() - startedAt).toFixed(0)}ms and ${polls} polls; last status was ${JSON.stringify(lastStatus)}`,
|
|
10
|
+
});
|
|
11
|
+
const wait = (ms, signal) => {
|
|
12
|
+
if (signal?.aborted) {
|
|
13
|
+
return Promise.reject(new error_1.APIUserAbortError());
|
|
14
|
+
}
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
let settled = false;
|
|
17
|
+
const finish = (error) => {
|
|
18
|
+
if (settled)
|
|
19
|
+
return;
|
|
20
|
+
settled = true;
|
|
21
|
+
clearTimeout(timer);
|
|
22
|
+
signal?.removeEventListener('abort', onAbort);
|
|
23
|
+
if (error)
|
|
24
|
+
reject(error);
|
|
25
|
+
else
|
|
26
|
+
resolve();
|
|
27
|
+
};
|
|
28
|
+
const onAbort = () => finish(new error_1.APIUserAbortError());
|
|
29
|
+
const timer = setTimeout(() => finish(), ms);
|
|
30
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
31
|
+
if (signal?.aborted)
|
|
32
|
+
onAbort();
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
const analysisFinished = (response, requestedID) => {
|
|
36
|
+
const analysis = response.analysis;
|
|
37
|
+
if (!analysis || typeof analysis !== 'object') {
|
|
38
|
+
throw new error_1.KernelError(`Config registry response for ${JSON.stringify(requestedID)} is missing an analysis`);
|
|
39
|
+
}
|
|
40
|
+
if (typeof analysis.id !== 'string' || !analysis.id) {
|
|
41
|
+
throw new error_1.KernelError(`Config registry response for ${JSON.stringify(requestedID)} has no valid analysis ID`);
|
|
42
|
+
}
|
|
43
|
+
if (analysis.id !== requestedID) {
|
|
44
|
+
throw new error_1.KernelError(`Config registry response for ${JSON.stringify(requestedID)} returned analysis ${JSON.stringify(analysis.id)}`);
|
|
45
|
+
}
|
|
46
|
+
if (typeof analysis.status !== 'string' || !analysis.status) {
|
|
47
|
+
throw new error_1.KernelError(`Config registry analysis ${JSON.stringify(requestedID)} has no valid status`);
|
|
48
|
+
}
|
|
49
|
+
if (!Object.prototype.hasOwnProperty.call(analysis, 'finished_at')) {
|
|
50
|
+
throw new error_1.KernelError(`Config registry analysis ${JSON.stringify(requestedID)} is missing finished_at`);
|
|
51
|
+
}
|
|
52
|
+
if (analysis.finished_at !== null &&
|
|
53
|
+
(typeof analysis.finished_at !== 'string' || Number.isNaN(Date.parse(analysis.finished_at)))) {
|
|
54
|
+
throw new error_1.KernelError(`Config registry analysis ${JSON.stringify(requestedID)} has an invalid finished_at`);
|
|
55
|
+
}
|
|
56
|
+
return [analysis.finished_at !== null || terminalStatuses.has(analysis.status), analysis.status];
|
|
57
|
+
};
|
|
58
|
+
async function waitForConfigRegistryAnalysis(resource, id, options = {}) {
|
|
59
|
+
if (!id) {
|
|
60
|
+
throw new TypeError('id must be non-empty');
|
|
61
|
+
}
|
|
62
|
+
const { pollIntervalMs = defaultPollIntervalMs, maxWaitMs, ...requestOptions } = options;
|
|
63
|
+
if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {
|
|
64
|
+
throw new RangeError('pollIntervalMs must be finite and positive');
|
|
65
|
+
}
|
|
66
|
+
if (maxWaitMs != null && (!Number.isFinite(maxWaitMs) || maxWaitMs < 0)) {
|
|
67
|
+
throw new RangeError('maxWaitMs must be finite and non-negative');
|
|
68
|
+
}
|
|
69
|
+
const startedAt = performance.now();
|
|
70
|
+
const deadline = maxWaitMs == null ? undefined : startedAt + maxWaitMs;
|
|
71
|
+
const retrieveOptions = {
|
|
72
|
+
...requestOptions,
|
|
73
|
+
headers: (0, headers_1.buildHeaders)([requestOptions.headers, { 'X-Stainless-Poll-Helper': 'true' }]),
|
|
74
|
+
};
|
|
75
|
+
let polls = 0;
|
|
76
|
+
let lastStatus;
|
|
77
|
+
while (true) {
|
|
78
|
+
if (polls > 0 && deadline !== undefined && performance.now() >= deadline) {
|
|
79
|
+
throw timeoutError(id, polls, lastStatus, startedAt);
|
|
80
|
+
}
|
|
81
|
+
// oxlint-disable-next-line no-await-in-loop -- each retrieval determines whether another poll is needed.
|
|
82
|
+
const response = await resource.retrieve(id, retrieveOptions);
|
|
83
|
+
polls += 1;
|
|
84
|
+
const [finished, status] = analysisFinished(response, id);
|
|
85
|
+
lastStatus = status;
|
|
86
|
+
if (finished)
|
|
87
|
+
return response;
|
|
88
|
+
let delay = pollIntervalMs * (0.9 + Math.random() * 0.2);
|
|
89
|
+
if (deadline !== undefined) {
|
|
90
|
+
const remaining = deadline - performance.now();
|
|
91
|
+
if (remaining <= 0)
|
|
92
|
+
throw timeoutError(id, polls, lastStatus, startedAt);
|
|
93
|
+
delay = Math.min(delay, remaining);
|
|
94
|
+
}
|
|
95
|
+
// oxlint-disable-next-line no-await-in-loop -- cancellation and the polling deadline must cover the delay.
|
|
96
|
+
await wait(delay, requestOptions.signal);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=config-registry-wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-wait.js","sourceRoot":"","sources":["../src/lib/config-registry-wait.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { APIConnectionTimeoutError, APIUserAbortError, KernelError } from "../core/error.mjs";
|
|
2
|
+
import { buildHeaders } from "../internal/headers.mjs";
|
|
3
|
+
const defaultPollIntervalMs = 5000;
|
|
4
|
+
const terminalStatuses = new Set(['completed', 'failed', 'canceled', 'expired']);
|
|
5
|
+
const timeoutError = (id, polls, lastStatus, startedAt) => new APIConnectionTimeoutError({
|
|
6
|
+
message: `Timed out waiting for config registry analysis ${JSON.stringify(id)} after ${(performance.now() - startedAt).toFixed(0)}ms and ${polls} polls; last status was ${JSON.stringify(lastStatus)}`,
|
|
7
|
+
});
|
|
8
|
+
const wait = (ms, signal) => {
|
|
9
|
+
if (signal?.aborted) {
|
|
10
|
+
return Promise.reject(new APIUserAbortError());
|
|
11
|
+
}
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
let settled = false;
|
|
14
|
+
const finish = (error) => {
|
|
15
|
+
if (settled)
|
|
16
|
+
return;
|
|
17
|
+
settled = true;
|
|
18
|
+
clearTimeout(timer);
|
|
19
|
+
signal?.removeEventListener('abort', onAbort);
|
|
20
|
+
if (error)
|
|
21
|
+
reject(error);
|
|
22
|
+
else
|
|
23
|
+
resolve();
|
|
24
|
+
};
|
|
25
|
+
const onAbort = () => finish(new APIUserAbortError());
|
|
26
|
+
const timer = setTimeout(() => finish(), ms);
|
|
27
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
28
|
+
if (signal?.aborted)
|
|
29
|
+
onAbort();
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const analysisFinished = (response, requestedID) => {
|
|
33
|
+
const analysis = response.analysis;
|
|
34
|
+
if (!analysis || typeof analysis !== 'object') {
|
|
35
|
+
throw new KernelError(`Config registry response for ${JSON.stringify(requestedID)} is missing an analysis`);
|
|
36
|
+
}
|
|
37
|
+
if (typeof analysis.id !== 'string' || !analysis.id) {
|
|
38
|
+
throw new KernelError(`Config registry response for ${JSON.stringify(requestedID)} has no valid analysis ID`);
|
|
39
|
+
}
|
|
40
|
+
if (analysis.id !== requestedID) {
|
|
41
|
+
throw new KernelError(`Config registry response for ${JSON.stringify(requestedID)} returned analysis ${JSON.stringify(analysis.id)}`);
|
|
42
|
+
}
|
|
43
|
+
if (typeof analysis.status !== 'string' || !analysis.status) {
|
|
44
|
+
throw new KernelError(`Config registry analysis ${JSON.stringify(requestedID)} has no valid status`);
|
|
45
|
+
}
|
|
46
|
+
if (!Object.prototype.hasOwnProperty.call(analysis, 'finished_at')) {
|
|
47
|
+
throw new KernelError(`Config registry analysis ${JSON.stringify(requestedID)} is missing finished_at`);
|
|
48
|
+
}
|
|
49
|
+
if (analysis.finished_at !== null &&
|
|
50
|
+
(typeof analysis.finished_at !== 'string' || Number.isNaN(Date.parse(analysis.finished_at)))) {
|
|
51
|
+
throw new KernelError(`Config registry analysis ${JSON.stringify(requestedID)} has an invalid finished_at`);
|
|
52
|
+
}
|
|
53
|
+
return [analysis.finished_at !== null || terminalStatuses.has(analysis.status), analysis.status];
|
|
54
|
+
};
|
|
55
|
+
export async function waitForConfigRegistryAnalysis(resource, id, options = {}) {
|
|
56
|
+
if (!id) {
|
|
57
|
+
throw new TypeError('id must be non-empty');
|
|
58
|
+
}
|
|
59
|
+
const { pollIntervalMs = defaultPollIntervalMs, maxWaitMs, ...requestOptions } = options;
|
|
60
|
+
if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {
|
|
61
|
+
throw new RangeError('pollIntervalMs must be finite and positive');
|
|
62
|
+
}
|
|
63
|
+
if (maxWaitMs != null && (!Number.isFinite(maxWaitMs) || maxWaitMs < 0)) {
|
|
64
|
+
throw new RangeError('maxWaitMs must be finite and non-negative');
|
|
65
|
+
}
|
|
66
|
+
const startedAt = performance.now();
|
|
67
|
+
const deadline = maxWaitMs == null ? undefined : startedAt + maxWaitMs;
|
|
68
|
+
const retrieveOptions = {
|
|
69
|
+
...requestOptions,
|
|
70
|
+
headers: buildHeaders([requestOptions.headers, { 'X-Stainless-Poll-Helper': 'true' }]),
|
|
71
|
+
};
|
|
72
|
+
let polls = 0;
|
|
73
|
+
let lastStatus;
|
|
74
|
+
while (true) {
|
|
75
|
+
if (polls > 0 && deadline !== undefined && performance.now() >= deadline) {
|
|
76
|
+
throw timeoutError(id, polls, lastStatus, startedAt);
|
|
77
|
+
}
|
|
78
|
+
// oxlint-disable-next-line no-await-in-loop -- each retrieval determines whether another poll is needed.
|
|
79
|
+
const response = await resource.retrieve(id, retrieveOptions);
|
|
80
|
+
polls += 1;
|
|
81
|
+
const [finished, status] = analysisFinished(response, id);
|
|
82
|
+
lastStatus = status;
|
|
83
|
+
if (finished)
|
|
84
|
+
return response;
|
|
85
|
+
let delay = pollIntervalMs * (0.9 + Math.random() * 0.2);
|
|
86
|
+
if (deadline !== undefined) {
|
|
87
|
+
const remaining = deadline - performance.now();
|
|
88
|
+
if (remaining <= 0)
|
|
89
|
+
throw timeoutError(id, polls, lastStatus, startedAt);
|
|
90
|
+
delay = Math.min(delay, remaining);
|
|
91
|
+
}
|
|
92
|
+
// oxlint-disable-next-line no-await-in-loop -- cancellation and the polling deadline must cover the delay.
|
|
93
|
+
await wait(delay, requestOptions.signal);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=config-registry-wait.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-wait.mjs","sourceRoot":"","sources":["../src/lib/config-registry-wait.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,6 +4,7 @@ import { AnalysisSummariesOffsetPagination } from "./config-registry.mjs";
|
|
|
4
4
|
import { APIPromise } from "../../core/api-promise.mjs";
|
|
5
5
|
import { type OffsetPaginationParams, PagePromise } from "../../core/pagination.mjs";
|
|
6
6
|
import { RequestOptions } from "../../internal/request-options.mjs";
|
|
7
|
+
import { type ConfigRegistryAnalysisWaitOptions } from "../../lib/config-registry-wait.mjs";
|
|
7
8
|
/**
|
|
8
9
|
* Resolve browser and proxy recommendations for bot-protected sites.
|
|
9
10
|
*/
|
|
@@ -19,6 +20,14 @@ export declare class Analyses extends APIResource {
|
|
|
19
20
|
* ```
|
|
20
21
|
*/
|
|
21
22
|
retrieve(id: string, options?: RequestOptions): APIPromise<ConfigRegistryAPI.ConfigRegistryResponse>;
|
|
23
|
+
/**
|
|
24
|
+
* Wait for an analysis to finish and return its complete result.
|
|
25
|
+
*
|
|
26
|
+
* The first retrieval happens immediately. `maxWaitMs` is a soft polling
|
|
27
|
+
* deadline: an in-flight request and its normal retries may finish after it.
|
|
28
|
+
* Timing out or aborting does not cancel the remote analysis.
|
|
29
|
+
*/
|
|
30
|
+
waitForResult(id: string, options?: ConfigRegistryAnalysisWaitOptions): Promise<ConfigRegistryAPI.ConfigRegistryResponse>;
|
|
22
31
|
/**
|
|
23
32
|
* Lists analyses for the selected project, newest first.
|
|
24
33
|
*
|
|
@@ -52,7 +61,7 @@ export interface AnalysisListParams extends OffsetPaginationParams {
|
|
|
52
61
|
search?: string;
|
|
53
62
|
}
|
|
54
63
|
export declare namespace Analyses {
|
|
55
|
-
export { type AnalysisListParams as AnalysisListParams };
|
|
64
|
+
export { type AnalysisListParams as AnalysisListParams, type ConfigRegistryAnalysisWaitOptions as ConfigRegistryAnalysisWaitOptions, };
|
|
56
65
|
}
|
|
57
|
-
export { type AnalysisSummariesOffsetPagination };
|
|
66
|
+
export { type AnalysisSummariesOffsetPagination, type ConfigRegistryAnalysisWaitOptions };
|
|
58
67
|
//# sourceMappingURL=analyses.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyses.d.mts","sourceRoot":"","sources":["../../src/resources/config-registry/analyses.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,gCAA4B;AAClD,OAAO,KAAK,iBAAiB,8BAA0B;AACvD,OAAO,EAAE,iCAAiC,EAAE,8BAA0B;AACtE,OAAO,EAAE,UAAU,EAAE,mCAA+B;AACpD,OAAO,EAAoB,KAAK,sBAAsB,EAAE,WAAW,EAAE,kCAA8B;AACnG,OAAO,EAAE,cAAc,EAAE,2CAAuC;
|
|
1
|
+
{"version":3,"file":"analyses.d.mts","sourceRoot":"","sources":["../../src/resources/config-registry/analyses.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,gCAA4B;AAClD,OAAO,KAAK,iBAAiB,8BAA0B;AACvD,OAAO,EAAE,iCAAiC,EAAE,8BAA0B;AACtE,OAAO,EAAE,UAAU,EAAE,mCAA+B;AACpD,OAAO,EAAoB,KAAK,sBAAsB,EAAE,WAAW,EAAE,kCAA8B;AACnG,OAAO,EAAE,cAAc,EAAE,2CAAuC;AAEhE,OAAO,EAEL,KAAK,iCAAiC,EACvC,2CAAuC;AAExC;;GAEG;AACH,qBAAa,QAAS,SAAQ,WAAW;IACvC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;IAIpG;;;;;;OAMG;IACG,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,iCAAiC,GAC1C,OAAO,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;IAIpD;;;;;;;;;;OAUG;IACH,IAAI,CACF,KAAK,GAAE,kBAAkB,GAAG,IAAI,GAAG,SAAc,EACjD,OAAO,CAAC,EAAE,cAAc,GACvB,WAAW,CAAC,iCAAiC,EAAE,iBAAiB,CAAC,eAAe,CAAC;IAQpF;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;CAGnG;AAED,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,WAAW,QAAQ,CAAC;IAChC,OAAO,EACL,KAAK,kBAAkB,IAAI,kBAAkB,EAC7C,KAAK,iCAAiC,IAAI,iCAAiC,GAC5E,CAAC;CACH;AAED,OAAO,EAAE,KAAK,iCAAiC,EAAE,KAAK,iCAAiC,EAAE,CAAC"}
|
|
@@ -4,6 +4,7 @@ import { AnalysisSummariesOffsetPagination } from "./config-registry.js";
|
|
|
4
4
|
import { APIPromise } from "../../core/api-promise.js";
|
|
5
5
|
import { type OffsetPaginationParams, PagePromise } from "../../core/pagination.js";
|
|
6
6
|
import { RequestOptions } from "../../internal/request-options.js";
|
|
7
|
+
import { type ConfigRegistryAnalysisWaitOptions } from "../../lib/config-registry-wait.js";
|
|
7
8
|
/**
|
|
8
9
|
* Resolve browser and proxy recommendations for bot-protected sites.
|
|
9
10
|
*/
|
|
@@ -19,6 +20,14 @@ export declare class Analyses extends APIResource {
|
|
|
19
20
|
* ```
|
|
20
21
|
*/
|
|
21
22
|
retrieve(id: string, options?: RequestOptions): APIPromise<ConfigRegistryAPI.ConfigRegistryResponse>;
|
|
23
|
+
/**
|
|
24
|
+
* Wait for an analysis to finish and return its complete result.
|
|
25
|
+
*
|
|
26
|
+
* The first retrieval happens immediately. `maxWaitMs` is a soft polling
|
|
27
|
+
* deadline: an in-flight request and its normal retries may finish after it.
|
|
28
|
+
* Timing out or aborting does not cancel the remote analysis.
|
|
29
|
+
*/
|
|
30
|
+
waitForResult(id: string, options?: ConfigRegistryAnalysisWaitOptions): Promise<ConfigRegistryAPI.ConfigRegistryResponse>;
|
|
22
31
|
/**
|
|
23
32
|
* Lists analyses for the selected project, newest first.
|
|
24
33
|
*
|
|
@@ -52,7 +61,7 @@ export interface AnalysisListParams extends OffsetPaginationParams {
|
|
|
52
61
|
search?: string;
|
|
53
62
|
}
|
|
54
63
|
export declare namespace Analyses {
|
|
55
|
-
export { type AnalysisListParams as AnalysisListParams };
|
|
64
|
+
export { type AnalysisListParams as AnalysisListParams, type ConfigRegistryAnalysisWaitOptions as ConfigRegistryAnalysisWaitOptions, };
|
|
56
65
|
}
|
|
57
|
-
export { type AnalysisSummariesOffsetPagination };
|
|
66
|
+
export { type AnalysisSummariesOffsetPagination, type ConfigRegistryAnalysisWaitOptions };
|
|
58
67
|
//# sourceMappingURL=analyses.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyses.d.ts","sourceRoot":"","sources":["../../src/resources/config-registry/analyses.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,+BAA4B;AAClD,OAAO,KAAK,iBAAiB,6BAA0B;AACvD,OAAO,EAAE,iCAAiC,EAAE,6BAA0B;AACtE,OAAO,EAAE,UAAU,EAAE,kCAA+B;AACpD,OAAO,EAAoB,KAAK,sBAAsB,EAAE,WAAW,EAAE,iCAA8B;AACnG,OAAO,EAAE,cAAc,EAAE,0CAAuC;
|
|
1
|
+
{"version":3,"file":"analyses.d.ts","sourceRoot":"","sources":["../../src/resources/config-registry/analyses.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,+BAA4B;AAClD,OAAO,KAAK,iBAAiB,6BAA0B;AACvD,OAAO,EAAE,iCAAiC,EAAE,6BAA0B;AACtE,OAAO,EAAE,UAAU,EAAE,kCAA+B;AACpD,OAAO,EAAoB,KAAK,sBAAsB,EAAE,WAAW,EAAE,iCAA8B;AACnG,OAAO,EAAE,cAAc,EAAE,0CAAuC;AAEhE,OAAO,EAEL,KAAK,iCAAiC,EACvC,0CAAuC;AAExC;;GAEG;AACH,qBAAa,QAAS,SAAQ,WAAW;IACvC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;IAIpG;;;;;;OAMG;IACG,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,iCAAiC,GAC1C,OAAO,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;IAIpD;;;;;;;;;;OAUG;IACH,IAAI,CACF,KAAK,GAAE,kBAAkB,GAAG,IAAI,GAAG,SAAc,EACjD,OAAO,CAAC,EAAE,cAAc,GACvB,WAAW,CAAC,iCAAiC,EAAE,iBAAiB,CAAC,eAAe,CAAC;IAQpF;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;CAGnG;AAED,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,WAAW,QAAQ,CAAC;IAChC,OAAO,EACL,KAAK,kBAAkB,IAAI,kBAAkB,EAC7C,KAAK,iCAAiC,IAAI,iCAAiC,GAC5E,CAAC;CACH;AAED,OAAO,EAAE,KAAK,iCAAiC,EAAE,KAAK,iCAAiC,EAAE,CAAC"}
|
|
@@ -5,6 +5,7 @@ exports.Analyses = void 0;
|
|
|
5
5
|
const resource_1 = require("../../core/resource.js");
|
|
6
6
|
const pagination_1 = require("../../core/pagination.js");
|
|
7
7
|
const path_1 = require("../../internal/utils/path.js");
|
|
8
|
+
const config_registry_wait_1 = require("../../lib/config-registry-wait.js");
|
|
8
9
|
/**
|
|
9
10
|
* Resolve browser and proxy recommendations for bot-protected sites.
|
|
10
11
|
*/
|
|
@@ -22,6 +23,16 @@ class Analyses extends resource_1.APIResource {
|
|
|
22
23
|
retrieve(id, options) {
|
|
23
24
|
return this._client.get((0, path_1.path) `/config-registry/analyses/${id}`, options);
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Wait for an analysis to finish and return its complete result.
|
|
28
|
+
*
|
|
29
|
+
* The first retrieval happens immediately. `maxWaitMs` is a soft polling
|
|
30
|
+
* deadline: an in-flight request and its normal retries may finish after it.
|
|
31
|
+
* Timing out or aborting does not cancel the remote analysis.
|
|
32
|
+
*/
|
|
33
|
+
async waitForResult(id, options) {
|
|
34
|
+
return await (0, config_registry_wait_1.waitForConfigRegistryAnalysis)(this, id, options);
|
|
35
|
+
}
|
|
25
36
|
/**
|
|
26
37
|
* Lists analyses for the selected project, newest first.
|
|
27
38
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyses.js","sourceRoot":"","sources":["../../src/resources/config-registry/analyses.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,qDAAkD;AAIlD,yDAAmG;AAEnG,uDAAiD;
|
|
1
|
+
{"version":3,"file":"analyses.js","sourceRoot":"","sources":["../../src/resources/config-registry/analyses.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,qDAAkD;AAIlD,yDAAmG;AAEnG,uDAAiD;AACjD,4EAGwC;AAExC;;GAEG;AACH,MAAa,QAAS,SAAQ,sBAAW;IACvC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAU,EAAE,OAAwB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAA,WAAI,EAAA,6BAA6B,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CACjB,EAAU,EACV,OAA2C;QAE3C,OAAO,MAAM,IAAA,oDAA6B,EAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;;;;;;;;;OAUG;IACH,IAAI,CACF,QAA+C,EAAE,EACjD,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAC5B,2BAA2B,EAC3B,CAAA,6BAAmD,CAAA,EACnD,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CACtB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAU,EAAE,OAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,WAAI,EAAA,6BAA6B,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;CACF;AAlED,4BAkEC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { APIResource } from "../../core/resource.mjs";
|
|
3
3
|
import { OffsetPagination } from "../../core/pagination.mjs";
|
|
4
4
|
import { path } from "../../internal/utils/path.mjs";
|
|
5
|
+
import { waitForConfigRegistryAnalysis, } from "../../lib/config-registry-wait.mjs";
|
|
5
6
|
/**
|
|
6
7
|
* Resolve browser and proxy recommendations for bot-protected sites.
|
|
7
8
|
*/
|
|
@@ -19,6 +20,16 @@ export class Analyses extends APIResource {
|
|
|
19
20
|
retrieve(id, options) {
|
|
20
21
|
return this._client.get(path `/config-registry/analyses/${id}`, options);
|
|
21
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Wait for an analysis to finish and return its complete result.
|
|
25
|
+
*
|
|
26
|
+
* The first retrieval happens immediately. `maxWaitMs` is a soft polling
|
|
27
|
+
* deadline: an in-flight request and its normal retries may finish after it.
|
|
28
|
+
* Timing out or aborting does not cancel the remote analysis.
|
|
29
|
+
*/
|
|
30
|
+
async waitForResult(id, options) {
|
|
31
|
+
return await waitForConfigRegistryAnalysis(this, id, options);
|
|
32
|
+
}
|
|
22
33
|
/**
|
|
23
34
|
* Lists analyses for the selected project, newest first.
|
|
24
35
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyses.mjs","sourceRoot":"","sources":["../../src/resources/config-registry/analyses.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,WAAW,EAAE,gCAA4B;AAIlD,OAAO,EAAE,gBAAgB,EAA4C,kCAA8B;AAEnG,OAAO,EAAE,IAAI,EAAE,sCAAkC;
|
|
1
|
+
{"version":3,"file":"analyses.mjs","sourceRoot":"","sources":["../../src/resources/config-registry/analyses.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,WAAW,EAAE,gCAA4B;AAIlD,OAAO,EAAE,gBAAgB,EAA4C,kCAA8B;AAEnG,OAAO,EAAE,IAAI,EAAE,sCAAkC;AACjD,OAAO,EACL,6BAA6B,GAE9B,2CAAuC;AAExC;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,WAAW;IACvC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAU,EAAE,OAAwB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,6BAA6B,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CACjB,EAAU,EACV,OAA2C;QAE3C,OAAO,MAAM,6BAA6B,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;;;;;;;;;OAUG;IACH,IAAI,CACF,QAA+C,EAAE,EACjD,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAC5B,2BAA2B,EAC3B,CAAA,gBAAmD,CAAA,EACnD,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CACtB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAU,EAAE,OAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA,6BAA6B,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;CACF"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { Analyses, type AnalysisListParams } from "./analyses.mjs";
|
|
1
|
+
export { Analyses, type AnalysisListParams, type ConfigRegistryAnalysisWaitOptions } from "./analyses.mjs";
|
|
2
2
|
export { ConfigRegistry, type Analysis, type AnalysisSummary, type Browser, type ConfigRegistryResponse, type Evidence, type LookupRequest, type LookupResponse, type NoRecommendation, type Proxy, type Recommendation, type RecommendationResult, type RecommendationSummary, type ResolveRequest, type Target, type ConfigRegistryListParams, type ConfigRegistryLookupParams, type ConfigRegistryResolveParams, type AnalysisSummariesOffsetPagination, type RecommendationSummariesOffsetPagination, } from "./config-registry.mjs";
|
|
3
3
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/resources/config-registry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,kBAAkB,EAAE,uBAAmB;
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/resources/config-registry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,kBAAkB,EAAE,KAAK,iCAAiC,EAAE,uBAAmB;AACvG,OAAO,EACL,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,uCAAuC,GAC7C,8BAA0B"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { Analyses, type AnalysisListParams } from "./analyses.js";
|
|
1
|
+
export { Analyses, type AnalysisListParams, type ConfigRegistryAnalysisWaitOptions } from "./analyses.js";
|
|
2
2
|
export { ConfigRegistry, type Analysis, type AnalysisSummary, type Browser, type ConfigRegistryResponse, type Evidence, type LookupRequest, type LookupResponse, type NoRecommendation, type Proxy, type Recommendation, type RecommendationResult, type RecommendationSummary, type ResolveRequest, type Target, type ConfigRegistryListParams, type ConfigRegistryLookupParams, type ConfigRegistryResolveParams, type AnalysisSummariesOffsetPagination, type RecommendationSummariesOffsetPagination, } from "./config-registry.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/config-registry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,kBAAkB,EAAE,sBAAmB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/config-registry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,kBAAkB,EAAE,KAAK,iCAAiC,EAAE,sBAAmB;AACvG,OAAO,EACL,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,uCAAuC,GAC7C,6BAA0B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/config-registry/index.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/config-registry/index.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,0CAAuG;AAA9F,oGAAA,QAAQ,OAAA;AACjB,wDAqB2B;AApBzB,iHAAA,cAAc,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/resources/config-registry/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/resources/config-registry/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,QAAQ,EAAmE,uBAAmB;AACvG,OAAO,EACL,cAAc,GAoBf,8BAA0B"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { APIConnectionTimeoutError, APIUserAbortError, KernelError } from '../core/error';
|
|
2
|
+
import { buildHeaders } from '../internal/headers';
|
|
3
|
+
import type { RequestOptions } from '../internal/request-options';
|
|
4
|
+
import type { ConfigRegistryResponse } from '../resources/config-registry/config-registry';
|
|
5
|
+
|
|
6
|
+
const defaultPollIntervalMs = 5_000;
|
|
7
|
+
const terminalStatuses = new Set(['completed', 'failed', 'canceled', 'expired']);
|
|
8
|
+
|
|
9
|
+
export type ConfigRegistryAnalysisWaitOptions = Pick<
|
|
10
|
+
RequestOptions,
|
|
11
|
+
'headers' | 'maxRetries' | 'timeout' | 'fetchOptions' | 'signal' | 'defaultBaseURL'
|
|
12
|
+
> & {
|
|
13
|
+
pollIntervalMs?: number;
|
|
14
|
+
maxWaitMs?: number | null;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type AnalysisRetriever = {
|
|
18
|
+
retrieve(id: string, options?: RequestOptions): Promise<ConfigRegistryResponse>;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const timeoutError = (id: string, polls: number, lastStatus: string | undefined, startedAt: number) =>
|
|
22
|
+
new APIConnectionTimeoutError({
|
|
23
|
+
message: `Timed out waiting for config registry analysis ${JSON.stringify(id)} after ${(
|
|
24
|
+
performance.now() - startedAt
|
|
25
|
+
).toFixed(0)}ms and ${polls} polls; last status was ${JSON.stringify(lastStatus)}`,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const wait = (ms: number, signal?: AbortSignal | null): Promise<void> => {
|
|
29
|
+
if (signal?.aborted) {
|
|
30
|
+
return Promise.reject(new APIUserAbortError());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
let settled = false;
|
|
35
|
+
const finish = (error?: Error) => {
|
|
36
|
+
if (settled) return;
|
|
37
|
+
settled = true;
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
signal?.removeEventListener('abort', onAbort);
|
|
40
|
+
if (error) reject(error);
|
|
41
|
+
else resolve();
|
|
42
|
+
};
|
|
43
|
+
const onAbort = () => finish(new APIUserAbortError());
|
|
44
|
+
const timer = setTimeout(() => finish(), ms);
|
|
45
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
46
|
+
if (signal?.aborted) onAbort();
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const analysisFinished = (response: ConfigRegistryResponse, requestedID: string): [boolean, string] => {
|
|
51
|
+
const analysis = response.analysis;
|
|
52
|
+
if (!analysis || typeof analysis !== 'object') {
|
|
53
|
+
throw new KernelError(
|
|
54
|
+
`Config registry response for ${JSON.stringify(requestedID)} is missing an analysis`,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
if (typeof analysis.id !== 'string' || !analysis.id) {
|
|
58
|
+
throw new KernelError(
|
|
59
|
+
`Config registry response for ${JSON.stringify(requestedID)} has no valid analysis ID`,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
if (analysis.id !== requestedID) {
|
|
63
|
+
throw new KernelError(
|
|
64
|
+
`Config registry response for ${JSON.stringify(requestedID)} returned analysis ${JSON.stringify(
|
|
65
|
+
analysis.id,
|
|
66
|
+
)}`,
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
if (typeof analysis.status !== 'string' || !analysis.status) {
|
|
70
|
+
throw new KernelError(`Config registry analysis ${JSON.stringify(requestedID)} has no valid status`);
|
|
71
|
+
}
|
|
72
|
+
if (!Object.prototype.hasOwnProperty.call(analysis, 'finished_at')) {
|
|
73
|
+
throw new KernelError(`Config registry analysis ${JSON.stringify(requestedID)} is missing finished_at`);
|
|
74
|
+
}
|
|
75
|
+
if (
|
|
76
|
+
analysis.finished_at !== null &&
|
|
77
|
+
(typeof analysis.finished_at !== 'string' || Number.isNaN(Date.parse(analysis.finished_at)))
|
|
78
|
+
) {
|
|
79
|
+
throw new KernelError(
|
|
80
|
+
`Config registry analysis ${JSON.stringify(requestedID)} has an invalid finished_at`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return [analysis.finished_at !== null || terminalStatuses.has(analysis.status), analysis.status];
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export async function waitForConfigRegistryAnalysis(
|
|
88
|
+
resource: AnalysisRetriever,
|
|
89
|
+
id: string,
|
|
90
|
+
options: ConfigRegistryAnalysisWaitOptions = {},
|
|
91
|
+
): Promise<ConfigRegistryResponse> {
|
|
92
|
+
if (!id) {
|
|
93
|
+
throw new TypeError('id must be non-empty');
|
|
94
|
+
}
|
|
95
|
+
const { pollIntervalMs = defaultPollIntervalMs, maxWaitMs, ...requestOptions } = options;
|
|
96
|
+
if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {
|
|
97
|
+
throw new RangeError('pollIntervalMs must be finite and positive');
|
|
98
|
+
}
|
|
99
|
+
if (maxWaitMs != null && (!Number.isFinite(maxWaitMs) || maxWaitMs < 0)) {
|
|
100
|
+
throw new RangeError('maxWaitMs must be finite and non-negative');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const startedAt = performance.now();
|
|
104
|
+
const deadline = maxWaitMs == null ? undefined : startedAt + maxWaitMs;
|
|
105
|
+
const retrieveOptions: RequestOptions = {
|
|
106
|
+
...requestOptions,
|
|
107
|
+
headers: buildHeaders([requestOptions.headers, { 'X-Stainless-Poll-Helper': 'true' }]),
|
|
108
|
+
};
|
|
109
|
+
let polls = 0;
|
|
110
|
+
let lastStatus: string | undefined;
|
|
111
|
+
|
|
112
|
+
while (true) {
|
|
113
|
+
if (polls > 0 && deadline !== undefined && performance.now() >= deadline) {
|
|
114
|
+
throw timeoutError(id, polls, lastStatus, startedAt);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// oxlint-disable-next-line no-await-in-loop -- each retrieval determines whether another poll is needed.
|
|
118
|
+
const response = await resource.retrieve(id, retrieveOptions);
|
|
119
|
+
polls += 1;
|
|
120
|
+
const [finished, status] = analysisFinished(response, id);
|
|
121
|
+
lastStatus = status;
|
|
122
|
+
if (finished) return response;
|
|
123
|
+
|
|
124
|
+
let delay = pollIntervalMs * (0.9 + Math.random() * 0.2);
|
|
125
|
+
if (deadline !== undefined) {
|
|
126
|
+
const remaining = deadline - performance.now();
|
|
127
|
+
if (remaining <= 0) throw timeoutError(id, polls, lastStatus, startedAt);
|
|
128
|
+
delay = Math.min(delay, remaining);
|
|
129
|
+
}
|
|
130
|
+
// oxlint-disable-next-line no-await-in-loop -- cancellation and the polling deadline must cover the delay.
|
|
131
|
+
await wait(delay, requestOptions.signal);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -7,6 +7,10 @@ import { APIPromise } from '../../core/api-promise';
|
|
|
7
7
|
import { OffsetPagination, type OffsetPaginationParams, PagePromise } from '../../core/pagination';
|
|
8
8
|
import { RequestOptions } from '../../internal/request-options';
|
|
9
9
|
import { path } from '../../internal/utils/path';
|
|
10
|
+
import {
|
|
11
|
+
waitForConfigRegistryAnalysis,
|
|
12
|
+
type ConfigRegistryAnalysisWaitOptions,
|
|
13
|
+
} from '../../lib/config-registry-wait';
|
|
10
14
|
|
|
11
15
|
/**
|
|
12
16
|
* Resolve browser and proxy recommendations for bot-protected sites.
|
|
@@ -26,6 +30,20 @@ export class Analyses extends APIResource {
|
|
|
26
30
|
return this._client.get(path`/config-registry/analyses/${id}`, options);
|
|
27
31
|
}
|
|
28
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Wait for an analysis to finish and return its complete result.
|
|
35
|
+
*
|
|
36
|
+
* The first retrieval happens immediately. `maxWaitMs` is a soft polling
|
|
37
|
+
* deadline: an in-flight request and its normal retries may finish after it.
|
|
38
|
+
* Timing out or aborting does not cancel the remote analysis.
|
|
39
|
+
*/
|
|
40
|
+
async waitForResult(
|
|
41
|
+
id: string,
|
|
42
|
+
options?: ConfigRegistryAnalysisWaitOptions,
|
|
43
|
+
): Promise<ConfigRegistryAPI.ConfigRegistryResponse> {
|
|
44
|
+
return await waitForConfigRegistryAnalysis(this, id, options);
|
|
45
|
+
}
|
|
46
|
+
|
|
29
47
|
/**
|
|
30
48
|
* Lists analyses for the selected project, newest first.
|
|
31
49
|
*
|
|
@@ -73,7 +91,10 @@ export interface AnalysisListParams extends OffsetPaginationParams {
|
|
|
73
91
|
}
|
|
74
92
|
|
|
75
93
|
export declare namespace Analyses {
|
|
76
|
-
export {
|
|
94
|
+
export {
|
|
95
|
+
type AnalysisListParams as AnalysisListParams,
|
|
96
|
+
type ConfigRegistryAnalysisWaitOptions as ConfigRegistryAnalysisWaitOptions,
|
|
97
|
+
};
|
|
77
98
|
}
|
|
78
99
|
|
|
79
|
-
export { type AnalysisSummariesOffsetPagination };
|
|
100
|
+
export { type AnalysisSummariesOffsetPagination, type ConfigRegistryAnalysisWaitOptions };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
export { Analyses, type AnalysisListParams } from './analyses';
|
|
3
|
+
export { Analyses, type AnalysisListParams, type ConfigRegistryAnalysisWaitOptions } from './analyses';
|
|
4
4
|
export {
|
|
5
5
|
ConfigRegistry,
|
|
6
6
|
type Analysis,
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = '0.
|
|
1
|
+
export const VERSION = '0.108.0'; // x-release-please-version
|
package/version.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.108.0";
|
|
2
2
|
//# sourceMappingURL=version.d.mts.map
|
package/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.108.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/version.js
CHANGED
package/version.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = '0.
|
|
1
|
+
export const VERSION = '0.108.0'; // x-release-please-version
|
|
2
2
|
//# sourceMappingURL=version.mjs.map
|