/*
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
*/
import { SDKCore } from "../core.js";
import { encodeFormQuery, encodeJSON } from "../lib/encodings.js";
import { matchStatusCode } from "../lib/http.js";
import * as M from "../lib/matchers.js";
import { compactMap } from "../lib/primitives.js";
import { safeParse } from "../lib/schemas.js";
import { RequestOptions } from "../lib/sdks.js";
import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js";
import { pathToFunc } from "../lib/url.js";
import {
ConnectionError,
InvalidRequestError,
RequestAbortedError,
RequestTimeoutError,
UnexpectedClientError,
} from "../models/errors/httpclienterrors.js";
import * as errors from "../models/errors/index.js";
import { ResponseValidationError } from "../models/errors/responsevalidationerror.js";
import { SDKBaseError } from "../models/errors/sdkbaseerror.js";
import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
import * as operations from "../models/operations/index.js";
import { APICall, APIPromise } from "../types/async.js";
import { Result } from "../types/fp.js";
/**
* Live Discovery: Initiate a new scan
*
* @remarks
* Initiate a scan to look for a currently unobserved service at a specific IP and port (`ip:port`) or hostname and port (`hostname:port`). This is equivalent to the [Live Discovery](https://docs.censys.com/docs/platform-threat-hunting-use-live-scan-and-rescan-to-validate-infrastructure#/) feature available in the UI, but you can also target web properties in addition to hosts.
The scan may take several minutes to complete. The response will contain a scan ID that you can use to [monitor the scan's status](https://docs.censys.com/reference/v3-threathunting-scans-get#/). After the scan completes, perform a lookup on the target asset to retrieve detailed scan information.
This endpoint is available to organizations that have access to the Adversary Investigation module. It costs 15 credits to execute this endpoint.
*/
export function threatHuntingCreateTrackedScan(
client: SDKCore,
request: operations.V3ThreathuntingScansDiscoveryRequest,
options?: RequestOptions,
): APIPromise<
Result<
operations.V3ThreathuntingScansDiscoveryResponse,
| errors.AuthenticationError
| errors.ErrorModel
| SDKBaseError
| ResponseValidationError
| ConnectionError
| RequestAbortedError
| RequestTimeoutError
| InvalidRequestError
| UnexpectedClientError
| SDKValidationError
>
> {
return new APIPromise($do(
client,
request,
options,
));
}
async function $do(
client: SDKCore,
request: operations.V3ThreathuntingScansDiscoveryRequest,
options?: RequestOptions,
): Promise<
[
Result<
operations.V3ThreathuntingScansDiscoveryResponse,
| errors.AuthenticationError
| errors.ErrorModel
| SDKBaseError
| ResponseValidationError
| ConnectionError
| RequestAbortedError
| RequestTimeoutError
| InvalidRequestError
| UnexpectedClientError
| SDKValidationError
>,
APICall,
]
> {
const parsed = safeParse(
request,
(value) =>
operations.V3ThreathuntingScansDiscoveryRequest$outboundSchema.parse(
value,
),
"Input validation failed",
);
if (!parsed.ok) {
return [parsed, { status: "invalid" }];
}
const payload = parsed.value;
const body = encodeJSON("body", payload.ScansDiscoveryInputBody, {
explode: true,
});
const path = pathToFunc("/v3/threat-hunting/scans/discovery")();
const query = encodeFormQuery({
"organization_id": payload.organization_id
?? client._options.organizationId,
}, { explode: false });
const headers = new Headers(compactMap({
"Content-Type": "application/json",
Accept: "application/json",
}));
const secConfig = await extractSecurity(client._options.personalAccessToken);
const securityInput = secConfig == null
? {}
: { personalAccessToken: secConfig };
const requestSecurity = resolveGlobalSecurity(securityInput);
const context = {
options: client._options,
baseURL: options?.serverURL ?? client._baseURL ?? "",
operationID: "v3-threathunting-scans-discovery",
oAuth2Scopes: null,
resolvedSecurity: requestSecurity,
securitySource: client._options.personalAccessToken,
retryConfig: options?.retries
|| client._options.retryConfig
|| { strategy: "none" },
retryCodes: options?.retryCodes || ["429", "500", "502", "503", "504"],
};
const requestRes = client._createRequest(context, {
security: requestSecurity,
method: "POST",
baseURL: options?.serverURL,
path: path,
headers: headers,
query: query,
body: body,
userAgent: client._options.userAgent,
timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1,
}, options);
if (!requestRes.ok) {
return [requestRes, { status: "invalid" }];
}
const req = requestRes.value;
const doResult = await client._do(req, {
context,
isErrorStatusCode: (statusCode: number) =>
matchStatusCode({ status: statusCode } as Response, ["4XX", "5XX"]),
retryConfig: context.retryConfig,
retryCodes: context.retryCodes,
});
if (!doResult.ok) {
return [doResult, { status: "request-error", request: req }];
}
const response = doResult.value;
const responseFields = {
HttpMeta: { Response: response, Request: req },
};
const [result] = await M.match<
operations.V3ThreathuntingScansDiscoveryResponse,
| errors.AuthenticationError
| errors.ErrorModel
| SDKBaseError
| ResponseValidationError
| ConnectionError
| RequestAbortedError
| RequestTimeoutError
| InvalidRequestError
| UnexpectedClientError
| SDKValidationError
>(
M.json(
200,
operations.V3ThreathuntingScansDiscoveryResponse$inboundSchema,
{ hdrs: true, key: "Result" },
),
M.jsonErr(401, errors.AuthenticationError$inboundSchema),
M.jsonErr([400, 403, 422], errors.ErrorModel$inboundSchema, {
ctype: "application/problem+json",
}),
M.jsonErr(500, errors.ErrorModel$inboundSchema, {
ctype: "application/problem+json",
}),
M.fail("4XX"),
M.fail("5XX"),
)(response, req, { extraFields: responseFields });
if (!result.ok) {
return [result, { status: "complete", request: req, response }];
}
return [result, { status: "complete", request: req, response }];
}