diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..f0caba8 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,311 @@ +import { Got } from 'got'; +import { UUID } from 'node:crypto'; + +type CheckIn = { + status: StatusSummary | null; + options: { + [k: string]: Feature; + }; +}; +type StatusSummary = { + page: Page; + incidents: Incident[]; + scheduled_maintenances: Maintenance[]; +}; +type Page = { + name: string; + url: string; +}; +type Incident = { + name: string; + status: string; + impact: string; + shortlink: string; +}; +type Maintenance = { + name: string; + status: string; + impact: string; + shortlink: string; + scheduled_for: string; + scheduled_until: string; +}; +type Feature = { + variant: boolean | string; + payload?: string; +}; + +/** + * JSON sent to server. + */ +type AnonymizedCorrelationHashes = { + correlation_source: string; + repository?: string; + run?: string; + run_differentiator?: string; + workflow?: string; + groups: Record; +}; + +/** + * Coerce a value of type `unknown` into a string. + */ +declare function stringifyError(e: unknown): string; + +/** + * Host information for install.determinate.systems. + */ +declare class IdsHost { + private idsProjectName; + private diagnosticsSuffix?; + private runtimeDiagnosticsUrl?; + private prioritizedURLs?; + private client?; + constructor(idsProjectName: string, diagnosticsSuffix: string | undefined, runtimeDiagnosticsUrl: string | undefined); + getGot(recordFailoverCallback?: (prevUrl: URL, nextUrl: URL) => void): Promise; + markCurrentHostBroken(): void; + setPrioritizedUrls(urls: URL[]): void; + isUrlSubjectToDynamicUrls(url: URL): boolean; + getDynamicRootUrl(): Promise; + getRootUrl(): Promise; + getDiagnosticsUrl(): Promise; + private getUrlsByPreference; +} + +type SourceDef = { + path?: string; + url?: string; + tag?: string; + pr?: string; + branch?: string; + revision?: string; +}; + +/** + * Get a Boolean input from the Action's configuration by name. + */ +declare const getBool: (name: string) => boolean; +/** + * The character used to separate values in the input string. + */ +type Separator = "space" | "comma"; +/** + * Convert a comma-separated string input into an array of strings. If `comma` is selected, + * all whitespace is removed from the string before converting to an array. + */ +declare const getArrayOfStrings: (name: string, separator: Separator) => string[]; +/** + * Convert a string input into an array of strings or `null` if no value is set. + */ +declare const getArrayOfStringsOrNull: (name: string, separator: Separator) => string[] | null; +declare const handleString: (input: string, separator: Separator) => string[]; +/** + * Get a multi-line string input from the Action's configuration by name or return `null` if not set. + */ +declare const getMultilineStringOrNull: (name: string) => string[] | null; +/** + * Get a number input from the Action's configuration by name or return `null` if not set. + */ +declare const getNumberOrNull: (name: string) => number | null; +/** + * Get a string input from the Action's configuration. + */ +declare const getString: (name: string) => string; +/** + * Get a string input from the Action's configuration by name or return `null` if not set. + */ +declare const getStringOrNull: (name: string) => string | null; +/** + * Get a string input from the Action's configuration by name or return `undefined` if not set. + */ +declare const getStringOrUndefined: (name: string) => string | undefined; + +type inputs_Separator = Separator; +declare const inputs_getArrayOfStrings: typeof getArrayOfStrings; +declare const inputs_getArrayOfStringsOrNull: typeof getArrayOfStringsOrNull; +declare const inputs_getBool: typeof getBool; +declare const inputs_getMultilineStringOrNull: typeof getMultilineStringOrNull; +declare const inputs_getNumberOrNull: typeof getNumberOrNull; +declare const inputs_getString: typeof getString; +declare const inputs_getStringOrNull: typeof getStringOrNull; +declare const inputs_getStringOrUndefined: typeof getStringOrUndefined; +declare const inputs_handleString: typeof handleString; +declare namespace inputs { + export { type inputs_Separator as Separator, inputs_getArrayOfStrings as getArrayOfStrings, inputs_getArrayOfStringsOrNull as getArrayOfStringsOrNull, inputs_getBool as getBool, inputs_getMultilineStringOrNull as getMultilineStringOrNull, inputs_getNumberOrNull as getNumberOrNull, inputs_getString as getString, inputs_getStringOrNull as getStringOrNull, inputs_getStringOrUndefined as getStringOrUndefined, inputs_handleString as handleString }; +} + +/** + * Get the current architecture plus OS. Examples include `X64-Linux` and `ARM64-macOS`. + */ +declare function getArchOs(): string; +/** + * Get the current Nix system. Examples include `x86_64-linux` and `aarch64-darwin`. + */ +declare function getNixPlatform(archOs: string): string; + +declare const platform_getArchOs: typeof getArchOs; +declare const platform_getNixPlatform: typeof getNixPlatform; +declare namespace platform { + export { platform_getArchOs as getArchOs, platform_getNixPlatform as getNixPlatform }; +} + +/** + * An enum for describing different "fetch suffixes" for i.d.s. + * + * - `nix-style` means that system names like `x86_64-linux` and `aarch64-darwin` are used + * - `gh-env-style` means that names like `X64-Linux` and `ARM64-macOS` are used + * - `universal` means that the suffix is the static `universal` (for non-system-specific things) + */ +type FetchSuffixStyle = "nix-style" | "gh-env-style" | "universal"; +/** + * GitHub Actions has two possible execution phases: `main` and `post`. + */ +type ExecutionPhase = "main" | "post"; +/** + * How to handle whether Nix is currently installed on the runner. + * + * - `fail` means that the workflow fails if Nix isn't installed + * - `warn` means that a warning is logged if Nix isn't installed + * - `ignore` means that Nix will not be checked + */ +type NixRequirementHandling = "fail" | "warn" | "ignore"; +/** + * Whether the Nix store on the runner is trusted. + * + * - `trusted` means yes + * - `untrusted` means no + * - `unknown` means that the status couldn't be determined + * + * This is determined via the output of `nix store info --json`. + */ +type NixStoreTrust = "trusted" | "untrusted" | "unknown"; +type ActionOptions = { + name: string; + idsProjectName?: string; + eventPrefix?: string; + fetchStyle: FetchSuffixStyle; + legacySourcePrefix?: string; + requireNix: NixRequirementHandling; + diagnosticsSuffix?: string; +}; +/** + * A confident version of Options, where defaults have been resolved into final values. + */ +type ConfidentActionOptions = { + name: string; + idsProjectName: string; + eventPrefix: string; + fetchStyle: FetchSuffixStyle; + legacySourcePrefix?: string; + requireNix: NixRequirementHandling; + providedDiagnosticsUrl?: URL; +}; +/** + * An event to send to the diagnostic endpoint of i.d.s. + */ +type DiagnosticEvent = { + event_name: string; + context: Record; + correlation: AnonymizedCorrelationHashes; + facts: Record; + features: { + [k: string]: string | boolean; + }; + timestamp: Date; + uuid: UUID; +}; +declare abstract class DetSysAction { + nixStoreTrust: NixStoreTrust; + strictMode: boolean; + private actionOptions; + private exceptionAttachments; + private archOs; + private executionPhase; + private nixSystem; + private architectureFetchSuffix; + private sourceParameters; + private facts; + private events; + private identity; + private idsHost; + private features; + private featureEventMetadata; + private determineExecutionPhase; + constructor(actionOptions: ActionOptions); + /** + * Attach a file to the diagnostics data in error conditions. + * + * The file at `location` doesn't need to exist when stapleFile is called. + * + * If the file doesn't exist or is unreadable when trying to staple the attachments, the JS error will be stored in a context value at `staple_failure_{name}`. + * If the file is readable, the file's contents will be stored in a context value at `staple_value_{name}`. + */ + stapleFile(name: string, location: string): void; + /** + * The main execution phase. + */ + abstract main(): Promise; + /** + * The post execution phase. + */ + abstract post(): Promise; + /** + * Execute the Action as defined. + */ + execute(): void; + getTemporaryName(): string; + addFact(key: string, value: string | boolean): void; + getDiagnosticsUrl(): Promise; + getUniqueId(): string; + getCorrelationHashes(): AnonymizedCorrelationHashes; + recordEvent(eventName: string, context?: Record): void; + /** + * Unpacks the closure returned by `fetchArtifact()`, imports the + * contents into the Nix store, and returns the path of the executable at + * `/nix/store/STORE_PATH/bin/${bin}`. + */ + unpackClosure(bin: string): Promise; + /** + * Fetches the executable at the URL determined by the `source-*` inputs and + * other facts, `chmod`s it, and returns the path to the executable on disk. + */ + fetchExecutable(): Promise; + private get isMain(); + private get isPost(); + private executeAsync; + getClient(): Promise; + private checkIn; + getFeature(name: string): Feature | undefined; + /** + * Check in to install.determinate.systems, to accomplish three things: + * + * 1. Preflight the server selected from IdsHost, to increase the chances of success. + * 2. Fetch any incidents and maintenance events to let users know in case things are weird. + * 3. Get feature flag data so we can gently roll out new features. + */ + private requestCheckIn; + /** + * Fetch an artifact, such as a tarball, from the location determined by the + * `source-*` inputs. If `source-binary` is specified, this will return a path + * to a binary on disk; otherwise, the artifact will be downloaded from the + * URL determined by the other `source-*` inputs (`source-url`, `source-pr`, + * etc.). + */ + private fetchArtifact; + /** + * A helper function for failing on error only if strict mode is enabled. + * This is intended only for CI environments testing Actions themselves. + */ + failOnError(msg: string): void; + private complete; + private getCheckInUrl; + private getSourceUrl; + private cacheKey; + private getCachedVersion; + private saveCachedVersion; + private preflightRequireNix; + private preflightNixStoreInfo; + private submitEvents; +} + +export { type ActionOptions, type AnonymizedCorrelationHashes, type CheckIn, type ConfidentActionOptions, DetSysAction, type DiagnosticEvent, type ExecutionPhase, type Feature, type FetchSuffixStyle, IdsHost, type Incident, type Maintenance, type NixRequirementHandling, type NixStoreTrust, type Page, type SourceDef, type StatusSummary, inputs, platform, stringifyError }; diff --git a/dist/index.js.map b/dist/index.js.map index 4e5d078..c73dd5a 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../package.json","../src/linux-release-info.ts","../src/actions-core-platform.ts","../src/correlation.ts","../src/errors.ts","../src/ids-host.ts","../src/inputs.ts","../src/platform.ts","../src/sourcedef.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"detsys-ts\",\n \"version\": \"1.0.0\",\n \"description\": \"TypeScript goodies for DetSys projects\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"check-fmt\": \"prettier --check .\",\n \"format\": \"prettier --write .\",\n \"lint\": \"eslint src/**/*.ts\",\n \"docs\": \"typedoc\",\n \"test\": \"vitest --watch false\",\n \"test-dev\": \"vitest\",\n \"all\": \"rm -rf dist && pnpm run format && pnpm run lint && pnpm run build\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/DeterminateSystems/detsys-ts.git\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/DeterminateSystems/detsys-ts/issues\"\n },\n \"homepage\": \"https://github.com/DeterminateSystems/detsys-ts#readme\",\n \"dependencies\": {\n \"@actions/cache\": \"^3.2.4\",\n \"@actions/core\": \"^1.10.1\",\n \"@actions/exec\": \"^1.1.1\",\n \"got\": \"^14.4.0\",\n \"type-fest\": \"^4.19.0\"\n },\n \"devDependencies\": {\n \"@trivago/prettier-plugin-sort-imports\": \"^4.3.0\",\n \"@types/node\": \"^20.14.2\",\n \"@typescript-eslint/eslint-plugin\": \"^7.12.0\",\n \"eslint\": \"^8.57.0\",\n \"eslint-import-resolver-typescript\": \"^3.6.1\",\n \"eslint-plugin-github\": \"^4.10.2\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-prettier\": \"^5.1.3\",\n \"prettier\": \"^3.3.1\",\n \"tsup\": \"^8.1.0\",\n \"typedoc\": \"^0.25.13\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^1.6.0\"\n }\n}\n","/*!\n * linux-release-info\n * Get Linux release info (distribution name, version, arch, release, etc.)\n * from '/etc/os-release' or '/usr/lib/os-release' files and from native os\n * module. On Windows and Darwin platforms it only returns common node os module\n * info (platform, hostname, release, and arch)\n *\n * Licensed under MIT\n * Copyright (c) 2018-2020 [Samuel Carreira]\n */\n// NOTE: we depend on this directly to get around some un-fun issues with mixing CommonJS\n// and ESM in the bundle. We've modified the original logic to improve things like typing\n// and fixing ESLint issues. Originally drawn from:\n// https://github.com/samuelcarreira/linux-release-info/blob/84a91aa5442b47900da03020c590507545d3dc74/src/index.ts\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport { promisify } from \"node:util\";\n\nconst readFileAsync = promisify(fs.readFile);\n\nexport interface LinuxReleaseInfoOptions {\n /**\n * read mode, possible values: 'async' and 'sync'\n *\n * @default 'async'\n */\n mode?: \"async\" | \"sync\";\n /**\n * custom complete file path with os info default null/none\n * if not provided the system will search on the '/etc/os-release'\n * and '/usr/lib/os-release' files\n *\n * @default null\n */\n customFile?: string | null | undefined;\n /**\n * if true, show console debug messages\n *\n * @default false\n */\n debug?: boolean;\n}\n\nconst linuxReleaseInfoOptionsDefaults: LinuxReleaseInfoOptions = {\n mode: \"async\",\n customFile: null,\n debug: false,\n};\n\n/**\n * Get OS release info from 'os-release' file and from native os module\n * on Windows or Darwin it only returns common os module info\n * (uses native fs module)\n * @returns {object} info from the current os\n */\nexport function releaseInfo(infoOptions: LinuxReleaseInfoOptions): object {\n const options = { ...linuxReleaseInfoOptionsDefaults, ...infoOptions };\n\n const searchOsReleaseFileList: string[] = osReleaseFileList(\n options.customFile,\n );\n\n if (os.type() !== \"Linux\") {\n if (options.mode === \"sync\") {\n return getOsInfo();\n } else {\n return Promise.resolve(getOsInfo());\n }\n }\n\n if (options.mode === \"sync\") {\n return readSyncOsreleaseFile(searchOsReleaseFileList, options);\n } else {\n return Promise.resolve(\n readAsyncOsReleaseFile(searchOsReleaseFileList, options),\n );\n }\n}\n\n/**\n * Format file data: convert data to object keys/values\n *\n * @param {object} sourceData Source object to be appended\n * @param {string} srcParseData Input file data to be parsed\n * @returns {object} Formated object\n */\nfunction formatFileData(sourceData: OsInfo, srcParseData: string): OsInfo {\n const lines: string[] = srcParseData.split(\"\\n\");\n\n for (const line of lines) {\n const lineData = line.split(\"=\");\n\n if (lineData.length === 2) {\n lineData[1] = lineData[1].replace(/[\"'\\r]/gi, \"\"); // remove quotes and return character\n\n Object.defineProperty(sourceData, lineData[0].toLowerCase(), {\n value: lineData[1],\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n return sourceData;\n}\n\n/**\n * Export a list of os-release files\n *\n * @param {string} customFile optional custom complete filepath\n * @returns {array} list of os-release files\n */\nfunction osReleaseFileList(customFile: string | null | undefined): string[] {\n const DEFAULT_OS_RELEASE_FILES = [\"/etc/os-release\", \"/usr/lib/os-release\"];\n\n if (!customFile) {\n return DEFAULT_OS_RELEASE_FILES;\n } else {\n return Array(customFile);\n }\n}\n\n/**\n * Operating system info.\n */\ntype OsInfo = {\n type: string;\n platform: string;\n hostname: string;\n arch: string;\n release: string;\n};\n\n/**\n * Get OS Basic Info\n * (uses node 'os' native module)\n *\n * @returns {OsInfo} os basic info\n */\nfunction getOsInfo(): OsInfo {\n return {\n type: os.type(),\n platform: os.platform(),\n hostname: os.hostname(),\n arch: os.arch(),\n release: os.release(),\n };\n}\n\n/* Helper functions */\n\nasync function readAsyncOsReleaseFile(\n fileList: string[],\n options: LinuxReleaseInfoOptions,\n): Promise {\n let fileData = null;\n\n for (const osReleaseFile of fileList) {\n try {\n if (options.debug) {\n /* eslint-disable no-console */\n console.log(`Trying to read '${osReleaseFile}'...`);\n }\n\n fileData = await readFileAsync(osReleaseFile, \"binary\");\n\n if (options.debug) {\n console.log(`Read data:\\n${fileData}`);\n }\n\n break;\n } catch (error) {\n if (options.debug) {\n console.error(error);\n }\n }\n }\n\n if (fileData === null) {\n throw new Error(\"Cannot read os-release file!\");\n //return getOsInfo();\n }\n\n return formatFileData(getOsInfo(), fileData);\n}\n\nfunction readSyncOsreleaseFile(\n releaseFileList: string[],\n options: LinuxReleaseInfoOptions,\n): OsInfo {\n let fileData = null;\n\n for (const osReleaseFile of releaseFileList) {\n try {\n if (options.debug) {\n console.log(`Trying to read '${osReleaseFile}'...`);\n }\n\n fileData = fs.readFileSync(osReleaseFile, \"binary\");\n\n if (options.debug) {\n console.log(`Read data:\\n${fileData}`);\n }\n\n break;\n } catch (error) {\n if (options.debug) {\n console.error(error);\n }\n }\n }\n\n if (fileData === null) {\n throw new Error(\"Cannot read os-release file!\");\n //return getOsInfo();\n }\n\n return formatFileData(getOsInfo(), fileData);\n}\n","// MIT, mostly lifted from https://github.com/actions/toolkit/blob/5a736647a123ecf8582376bdaee833fbae5b3847/packages/core/src/platform.ts\n// since it isn't in @actions/core 1.10.1 which is their current release as 2024-04-19.\n// Changes: Replaced the lsb_release call in Linux with `linux-release-info` to parse the os-release file directly.\nimport { releaseInfo } from \"./linux-release-info.js\";\nimport * as actionsCore from \"@actions/core\";\nimport * as exec from \"@actions/exec\";\nimport os from \"os\";\n\n/**\n * The name and version of the Action runner's system.\n */\ntype SystemInfo = {\n name: string;\n version: string;\n};\n\n/**\n * Get the name and version of the current Windows system.\n */\nconst getWindowsInfo = async (): Promise => {\n const { stdout: version } = await exec.getExecOutput(\n 'powershell -command \"(Get-CimInstance -ClassName Win32_OperatingSystem).Version\"',\n undefined,\n {\n silent: true,\n },\n );\n\n const { stdout: name } = await exec.getExecOutput(\n 'powershell -command \"(Get-CimInstance -ClassName Win32_OperatingSystem).Caption\"',\n undefined,\n {\n silent: true,\n },\n );\n\n return {\n name: name.trim(),\n version: version.trim(),\n };\n};\n\n/**\n * Get the name and version of the current macOS system.\n */\nconst getMacOsInfo = async (): Promise => {\n const { stdout } = await exec.getExecOutput(\"sw_vers\", undefined, {\n silent: true,\n });\n\n const version = stdout.match(/ProductVersion:\\s*(.+)/)?.[1] ?? \"\";\n const name = stdout.match(/ProductName:\\s*(.+)/)?.[1] ?? \"\";\n\n return {\n name,\n version,\n };\n};\n\n/**\n * Get the name and version of the current Linux system.\n */\nconst getLinuxInfo = async (): Promise => {\n let data: object = {};\n\n try {\n data = releaseInfo({ mode: \"sync\" });\n actionsCore.debug(`Identified release info: ${JSON.stringify(data)}`);\n } catch (e) {\n actionsCore.debug(`Error collecting release info: ${e}`);\n }\n\n return {\n name: getPropertyViaWithDefault(\n data,\n [\"id\", \"name\", \"pretty_name\", \"id_like\"],\n \"unknown\",\n ),\n version: getPropertyViaWithDefault(\n data,\n [\"version_id\", \"version\", \"version_codename\"],\n \"unknown\",\n ),\n };\n};\n\nfunction getPropertyViaWithDefault(\n data: object,\n names: Property[],\n defaultValue: T,\n): T {\n for (const name of names) {\n const ret: T = getPropertyWithDefault(data, name, defaultValue);\n\n if (ret !== defaultValue) {\n return ret;\n }\n }\n\n return defaultValue;\n}\n\nfunction getPropertyWithDefault(\n data: object,\n name: Property,\n defaultValue: T,\n): T {\n if (!data.hasOwnProperty(name)) {\n return defaultValue;\n }\n\n const value = (data as { [K in Property]: T })[name];\n\n // NB. this check won't work for object instances\n if (typeof value !== typeof defaultValue) {\n return defaultValue;\n }\n\n return value;\n}\n\n/**\n * The Action runner's platform.\n */\nexport const platform = os.platform();\n\n/**\n * The Action runner's architecture.\n */\nexport const arch = os.arch();\n\n/**\n * Whether the Action runner is a Windows system.\n */\nexport const isWindows = platform === \"win32\";\n\n/**\n * Whether the Action runner is a macOS system.\n */\nexport const isMacOS = platform === \"darwin\";\n\n/**\n * Whether the Action runner is a Linux system.\n */\nexport const isLinux = platform === \"linux\";\n\n/**\n * System-level information about the current host (platform, architecture, etc.).\n */\ntype SystemDetails = {\n name: string;\n platform: string;\n arch: string;\n version: string;\n isWindows: boolean;\n isMacOS: boolean;\n isLinux: boolean;\n};\n\n/**\n * Get system-level information about the current host (platform, architecture, etc.).\n */\nexport async function getDetails(): Promise {\n return {\n ...(await (isWindows\n ? getWindowsInfo()\n : isMacOS\n ? getMacOsInfo()\n : getLinuxInfo())),\n platform,\n arch,\n isWindows,\n isMacOS,\n isLinux,\n };\n}\n","import * as actionsCore from \"@actions/core\";\nimport { createHash } from \"node:crypto\";\n\nconst OPTIONAL_VARIABLES = [\"INVOCATION_ID\"];\n\n/* eslint-disable camelcase */\n/**\n * JSON sent to server.\n */\nexport type AnonymizedCorrelationHashes = {\n correlation_source: string;\n repository?: string;\n run?: string;\n run_differentiator?: string;\n workflow?: string;\n groups: Record;\n};\n\nexport function identify(projectName: string): AnonymizedCorrelationHashes {\n const ident = {\n correlation_source: \"github-actions\",\n\n repository: hashEnvironmentVariables(\"GHR\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n ]),\n workflow: hashEnvironmentVariables(\"GHW\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n \"GITHUB_WORKFLOW\",\n ]),\n job: hashEnvironmentVariables(\"GHWJ\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n \"GITHUB_WORKFLOW\",\n \"GITHUB_JOB\",\n ]),\n run: hashEnvironmentVariables(\"GHWJR\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n \"GITHUB_WORKFLOW\",\n \"GITHUB_JOB\",\n \"GITHUB_RUN_ID\",\n ]),\n run_differentiator: hashEnvironmentVariables(\"GHWJA\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n \"GITHUB_WORKFLOW\",\n \"GITHUB_JOB\",\n \"GITHUB_RUN_ID\",\n \"GITHUB_RUN_NUMBER\",\n \"GITHUB_RUN_ATTEMPT\",\n \"INVOCATION_ID\",\n ]),\n groups: {\n ci: \"github-actions\",\n project: projectName,\n github_organization: hashEnvironmentVariables(\"GHO\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n ]),\n },\n };\n\n actionsCore.debug(\"Correlation data:\");\n actionsCore.debug(JSON.stringify(ident, null, 2));\n\n return ident;\n}\n\nfunction hashEnvironmentVariables(\n prefix: string,\n variables: string[],\n): undefined | string {\n const hash = createHash(\"sha256\");\n\n for (const varName of variables) {\n let value = process.env[varName];\n\n if (value === undefined) {\n if (OPTIONAL_VARIABLES.includes(varName)) {\n actionsCore.debug(\n `Optional environment variable not set: ${varName} -- substituting with the variable name`,\n );\n value = varName;\n } else {\n actionsCore.debug(\n `Environment variable not set: ${varName} -- can't generate the requested identity`,\n );\n return undefined;\n }\n }\n\n hash.update(value);\n hash.update(\"\\0\");\n }\n\n return `${prefix}-${hash.digest(\"hex\")}`;\n}\n","/**\n * Coerce a value of type `unknown` into a string.\n */\nexport function stringifyError(e: unknown): string {\n if (e instanceof Error) {\n return e.message;\n } else if (typeof e === \"string\") {\n return e;\n } else {\n return JSON.stringify(e);\n }\n}\n","/**\n * @packageDocumentation\n * Identifies and discovers backend servers for install.determinate.systems\n */\nimport { stringifyError } from \"./errors.js\";\nimport * as actionsCore from \"@actions/core\";\nimport got, { Got } from \"got\";\nimport { SrvRecord } from \"node:dns\";\nimport { resolveSrv } from \"node:dns/promises\";\n\nconst DEFAULT_LOOKUP = \"_detsys_ids._tcp.install.determinate.systems.\";\nconst ALLOWED_SUFFIXES = [\n \".install.determinate.systems\",\n \".install.detsys.dev\",\n];\n\nconst DEFAULT_IDS_HOST = \"https://install.determinate.systems\";\nconst LOOKUP = process.env[\"IDS_LOOKUP\"] ?? DEFAULT_LOOKUP;\n\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds in milliseconds\n\n/**\n * Host information for install.determinate.systems.\n */\nexport class IdsHost {\n private idsProjectName: string;\n private diagnosticsSuffix?: string;\n private runtimeDiagnosticsUrl?: string;\n private prioritizedURLs?: URL[];\n private records?: SrvRecord[];\n private client?: Got;\n\n constructor(\n idsProjectName: string,\n diagnosticsSuffix: string | undefined,\n runtimeDiagnosticsUrl: string | undefined,\n ) {\n this.idsProjectName = idsProjectName;\n this.diagnosticsSuffix = diagnosticsSuffix;\n this.runtimeDiagnosticsUrl = runtimeDiagnosticsUrl;\n this.client = undefined;\n }\n\n async getGot(\n recordFailoverCallback?: (prevUrl: URL, nextUrl: URL) => void,\n ): Promise {\n if (this.client === undefined) {\n this.client = got.extend({\n timeout: {\n request: DEFAULT_TIMEOUT,\n },\n\n retry: {\n limit: (await this.getUrlsByPreference()).length,\n methods: [\"GET\", \"HEAD\"],\n },\n\n hooks: {\n beforeRetry: [\n async (error, retryCount) => {\n const prevUrl = await this.getRootUrl();\n this.markCurrentHostBroken();\n const nextUrl = await this.getRootUrl();\n\n if (recordFailoverCallback !== undefined) {\n recordFailoverCallback(prevUrl, nextUrl);\n }\n\n actionsCore.info(\n `Retrying after error ${error.code}, retry #: ${retryCount}`,\n );\n },\n ],\n\n beforeRequest: [\n async (options) => {\n // The getter always returns a URL, even though the setter accepts a string\n const currentUrl: URL = options.url as URL;\n\n if (this.isUrlSubjectToDynamicUrls(currentUrl)) {\n const newUrl: URL = new URL(currentUrl);\n\n const url: URL = await this.getRootUrl();\n newUrl.host = url.host;\n\n options.url = newUrl;\n actionsCore.debug(`Transmuted ${currentUrl} into ${newUrl}`);\n } else {\n actionsCore.debug(`No transmutations on ${currentUrl}`);\n }\n },\n ],\n },\n });\n }\n\n return this.client;\n }\n\n markCurrentHostBroken(): void {\n this.prioritizedURLs?.shift();\n }\n\n setPrioritizedUrls(urls: URL[]): void {\n this.prioritizedURLs = urls;\n }\n\n isUrlSubjectToDynamicUrls(url: URL): boolean {\n if (url.origin === DEFAULT_IDS_HOST) {\n return true;\n }\n\n for (const suffix of ALLOWED_SUFFIXES) {\n if (url.host.endsWith(suffix)) {\n return true;\n }\n }\n\n return false;\n }\n\n async getDynamicRootUrl(): Promise {\n const idsHost = process.env[\"IDS_HOST\"];\n if (idsHost !== undefined) {\n try {\n return new URL(idsHost);\n } catch (err: unknown) {\n actionsCore.error(\n `IDS_HOST environment variable is not a valid URL. Ignoring. ${stringifyError(err)}`,\n );\n }\n }\n\n let url: URL | undefined = undefined;\n try {\n const urls = await this.getUrlsByPreference();\n url = urls[0];\n } catch (err: unknown) {\n actionsCore.error(\n `Error collecting IDS URLs by preference: ${stringifyError(err)}`,\n );\n }\n\n if (url === undefined) {\n return undefined;\n } else {\n // This is a load-bearing `new URL(url)` so that callers can't mutate\n // getRootUrl's return value.\n return new URL(url);\n }\n }\n\n async getRootUrl(): Promise {\n const url = await this.getDynamicRootUrl();\n\n if (url === undefined) {\n return new URL(DEFAULT_IDS_HOST);\n }\n\n return url;\n }\n\n async getDiagnosticsUrl(): Promise {\n if (this.runtimeDiagnosticsUrl === \"\") {\n // User specifically set the diagnostics URL to an empty string\n // so disable diagnostics\n return undefined;\n }\n\n if (\n this.runtimeDiagnosticsUrl !== \"-\" &&\n this.runtimeDiagnosticsUrl !== undefined\n ) {\n try {\n // Caller specified a specific diagnostics URL\n return new URL(this.runtimeDiagnosticsUrl);\n } catch (err: unknown) {\n actionsCore.info(\n `User-provided diagnostic endpoint ignored: not a valid URL: ${stringifyError(err)}`,\n );\n }\n }\n\n try {\n const diagnosticUrl = await this.getRootUrl();\n diagnosticUrl.pathname += this.idsProjectName;\n diagnosticUrl.pathname += \"/\";\n diagnosticUrl.pathname += this.diagnosticsSuffix || \"diagnostics\";\n return diagnosticUrl;\n } catch (err: unknown) {\n actionsCore.info(\n `Generated diagnostic endpoint ignored, and diagnostics are disabled: not a valid URL: ${stringifyError(err)}`,\n );\n return undefined;\n }\n }\n\n private async getUrlsByPreference(): Promise {\n if (this.prioritizedURLs === undefined) {\n this.prioritizedURLs = orderRecordsByPriorityWeight(\n await discoverServiceRecords(),\n ).flatMap((record) => recordToUrl(record) || []);\n }\n\n return this.prioritizedURLs;\n }\n}\n\nexport function recordToUrl(record: SrvRecord): URL | undefined {\n const urlStr = `https://${record.name}:${record.port}`;\n try {\n return new URL(urlStr);\n } catch (err: unknown) {\n actionsCore.debug(\n `Record ${JSON.stringify(record)} produced an invalid URL: ${urlStr} (${err})`,\n );\n return undefined;\n }\n}\n\nasync function discoverServiceRecords(): Promise {\n return await discoverServicesStub(resolveSrv(LOOKUP), 1_000);\n}\n\nexport async function discoverServicesStub(\n lookup: Promise,\n timeout: number,\n): Promise {\n const defaultFallback: Promise = new Promise(\n (resolve, _reject) => {\n setTimeout(resolve, timeout, []);\n },\n );\n\n let records: SrvRecord[];\n\n try {\n records = await Promise.race([lookup, defaultFallback]);\n } catch (reason: unknown) {\n actionsCore.debug(`Error resolving SRV records: ${stringifyError(reason)}`);\n records = [];\n }\n\n const acceptableRecords = records.filter((record: SrvRecord): boolean => {\n for (const suffix of ALLOWED_SUFFIXES) {\n if (record.name.endsWith(suffix)) {\n return true;\n }\n }\n\n actionsCore.debug(\n `Unacceptable domain due to an invalid suffix: ${record.name}`,\n );\n\n return false;\n });\n\n if (acceptableRecords.length === 0) {\n actionsCore.debug(`No records found for ${LOOKUP}`);\n } else {\n actionsCore.debug(\n `Resolved ${LOOKUP} to ${JSON.stringify(acceptableRecords)}`,\n );\n }\n\n return acceptableRecords;\n}\n\nexport function orderRecordsByPriorityWeight(\n records: SrvRecord[],\n): SrvRecord[] {\n const byPriorityWeight: Map = new Map();\n for (const record of records) {\n const existing = byPriorityWeight.get(record.priority);\n if (existing) {\n existing.push(record);\n } else {\n byPriorityWeight.set(record.priority, [record]);\n }\n }\n\n const prioritizedRecords: SrvRecord[] = [];\n const keys: number[] = Array.from(byPriorityWeight.keys()).sort(\n (a, b) => a - b,\n );\n\n for (const priority of keys) {\n const recordsByPrio = byPriorityWeight.get(priority);\n if (recordsByPrio === undefined) {\n continue;\n }\n\n prioritizedRecords.push(...weightedRandom(recordsByPrio));\n }\n\n return prioritizedRecords;\n}\n\nexport function weightedRandom(records: SrvRecord[]): SrvRecord[] {\n // Duplicate records so we don't accidentally change our caller's data\n const scratchRecords: SrvRecord[] = records.slice();\n const result: SrvRecord[] = [];\n\n while (scratchRecords.length > 0) {\n const weights: number[] = [];\n\n {\n for (let i = 0; i < scratchRecords.length; i++) {\n weights.push(\n scratchRecords[i].weight + (i > 0 ? scratchRecords[i - 1].weight : 0),\n );\n }\n }\n\n const point = Math.random() * weights[weights.length - 1];\n\n for (\n let selectedIndex = 0;\n selectedIndex < weights.length;\n selectedIndex++\n ) {\n if (weights[selectedIndex] > point) {\n // Remove our selected record and add it to the result\n result.push(scratchRecords.splice(selectedIndex, 1)[0]);\n break;\n }\n }\n }\n\n return result;\n}\n","/**\n * @packageDocumentation\n * Helpers for getting values from an Action's configuration.\n */\nimport * as actionsCore from \"@actions/core\";\n\n/**\n * Get a Boolean input from the Action's configuration by name.\n */\nconst getBool = (name: string): boolean => {\n return actionsCore.getBooleanInput(name);\n};\n\n/**\n * The character used to separate values in the input string.\n */\nexport type Separator = \"space\" | \"comma\";\n\n/**\n * Convert a comma-separated string input into an array of strings. If `comma` is selected,\n * all whitespace is removed from the string before converting to an array.\n */\nconst getArrayOfStrings = (name: string, separator: Separator): string[] => {\n const original = getString(name);\n return handleString(original, separator);\n};\n\n/**\n * Convert a string input into an array of strings or `null` if no value is set.\n */\nconst getArrayOfStringsOrNull = (\n name: string,\n separator: Separator,\n): string[] | null => {\n const original = getStringOrNull(name);\n if (original === null) {\n return null;\n } else {\n return handleString(original, separator);\n }\n};\n\n// Split out this function for use in testing\nexport const handleString = (input: string, separator: Separator): string[] => {\n const sepChar = separator === \"comma\" ? \",\" : /\\s+/;\n const trimmed = input.trim(); // Remove whitespace at the beginning and end\n if (trimmed === \"\") {\n return [];\n }\n\n return trimmed.split(sepChar).map((s: string) => s.trim());\n};\n\n/**\n * Get a multi-line string input from the Action's configuration by name or return `null` if not set.\n */\nconst getMultilineStringOrNull = (name: string): string[] | null => {\n const value = actionsCore.getMultilineInput(name);\n if (value.length === 0) {\n return null;\n } else {\n return value;\n }\n};\n\n/**\n * Get a number input from the Action's configuration by name or return `null` if not set.\n */\nconst getNumberOrNull = (name: string): number | null => {\n const value = actionsCore.getInput(name);\n if (value === \"\") {\n return null;\n } else {\n return Number(value);\n }\n};\n\n/**\n * Get a string input from the Action's configuration.\n */\nconst getString = (name: string): string => {\n return actionsCore.getInput(name);\n};\n\n/**\n * Get a string input from the Action's configuration by name or return `null` if not set.\n */\nconst getStringOrNull = (name: string): string | null => {\n const value = actionsCore.getInput(name);\n if (value === \"\") {\n return null;\n } else {\n return value;\n }\n};\n\n/**\n * Get a string input from the Action's configuration by name or return `undefined` if not set.\n */\nconst getStringOrUndefined = (name: string): string | undefined => {\n const value = actionsCore.getInput(name);\n if (value === \"\") {\n return undefined;\n } else {\n return value;\n }\n};\n\nexport {\n getBool,\n getArrayOfStrings,\n getArrayOfStringsOrNull,\n getMultilineStringOrNull,\n getNumberOrNull,\n getString,\n getStringOrNull,\n getStringOrUndefined,\n};\n","/**\n * @packageDocumentation\n * Helpers for determining system attributes of the current runner.\n */\nimport * as actionsCore from \"@actions/core\";\n\n/**\n * Get the current architecture plus OS. Examples include `X64-Linux` and `ARM64-macOS`.\n */\nexport function getArchOs(): string {\n const envArch = process.env.RUNNER_ARCH;\n const envOs = process.env.RUNNER_OS;\n\n if (envArch && envOs) {\n return `${envArch}-${envOs}`;\n } else {\n actionsCore.error(\n `Can't identify the platform: RUNNER_ARCH or RUNNER_OS undefined (${envArch}-${envOs})`,\n );\n throw new Error(\"RUNNER_ARCH and/or RUNNER_OS is not defined\");\n }\n}\n\n/**\n * Get the current Nix system. Examples include `x86_64-linux` and `aarch64-darwin`.\n */\nexport function getNixPlatform(archOs: string): string {\n const archOsMap: Map = new Map([\n [\"X64-macOS\", \"x86_64-darwin\"],\n [\"ARM64-macOS\", \"aarch64-darwin\"],\n [\"X64-Linux\", \"x86_64-linux\"],\n [\"ARM64-Linux\", \"aarch64-linux\"],\n ]);\n\n const mappedTo = archOsMap.get(archOs);\n if (mappedTo) {\n return mappedTo;\n } else {\n actionsCore.error(\n `ArchOs (${archOs}) doesn't map to a supported Nix platform.`,\n );\n throw new Error(\n `Cannot convert ArchOs (${archOs}) to a supported Nix platform.`,\n );\n }\n}\n","import { getStringOrUndefined } from \"./inputs.js\";\nimport * as actionsCore from \"@actions/core\";\n\nexport type SourceDef = {\n path?: string;\n url?: string;\n tag?: string;\n pr?: string;\n branch?: string;\n revision?: string;\n};\n\nexport function constructSourceParameters(legacyPrefix?: string): SourceDef {\n return {\n path: noisilyGetInput(\"path\", legacyPrefix),\n url: noisilyGetInput(\"url\", legacyPrefix),\n tag: noisilyGetInput(\"tag\", legacyPrefix),\n pr: noisilyGetInput(\"pr\", legacyPrefix),\n branch: noisilyGetInput(\"branch\", legacyPrefix),\n revision: noisilyGetInput(\"revision\", legacyPrefix),\n };\n}\n\nfunction noisilyGetInput(\n suffix: string,\n legacyPrefix: string | undefined,\n): string | undefined {\n const preferredInput = getStringOrUndefined(`source-${suffix}`);\n\n if (!legacyPrefix) {\n return preferredInput;\n }\n\n // Remaining is for handling cases where the legacy prefix\n // should be examined.\n const legacyInput = getStringOrUndefined(`${legacyPrefix}-${suffix}`);\n\n if (preferredInput && legacyInput) {\n actionsCore.warning(\n `The supported option source-${suffix} and the legacy option ${legacyPrefix}-${suffix} are both set. Preferring source-${suffix}. Please stop setting ${legacyPrefix}-${suffix}.`,\n );\n return preferredInput;\n } else if (legacyInput) {\n actionsCore.warning(\n `The legacy option ${legacyPrefix}-${suffix} is set. Please migrate to source-${suffix}.`,\n );\n return legacyInput;\n } else {\n return preferredInput;\n }\n}\n","/**\n * @packageDocumentation\n * Determinate Systems' TypeScript library for creating GitHub Actions logic.\n */\nimport { version as pkgVersion } from \"../package.json\";\nimport * as ghActionsCorePlatform from \"./actions-core-platform.js\";\nimport { CheckIn, Feature } from \"./check-in.js\";\nimport * as correlation from \"./correlation.js\";\nimport { IdsHost } from \"./ids-host.js\";\nimport { getBool, getStringOrNull } from \"./inputs.js\";\nimport * as platform from \"./platform.js\";\nimport { SourceDef, constructSourceParameters } from \"./sourcedef.js\";\nimport * as actionsCache from \"@actions/cache\";\nimport * as actionsCore from \"@actions/core\";\nimport * as actionsExec from \"@actions/exec\";\nimport { Got } from \"got\";\nimport { exec } from \"node:child_process\";\nimport { UUID, randomUUID } from \"node:crypto\";\nimport { PathLike, createWriteStream, readFileSync } from \"node:fs\";\nimport fs, { chmod, copyFile, mkdir } from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport { tmpdir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { promisify } from \"node:util\";\nimport { gzip } from \"node:zlib\";\n\nconst EVENT_EXCEPTION = \"exception\";\nconst EVENT_ARTIFACT_CACHE_HIT = \"artifact_cache_hit\";\nconst EVENT_ARTIFACT_CACHE_MISS = \"artifact_cache_miss\";\nconst EVENT_ARTIFACT_CACHE_PERSIST = \"artifact_cache_persist\";\nconst EVENT_PREFLIGHT_REQUIRE_NIX_DENIED = \"preflight-require-nix-denied\";\n\nconst FACT_ARTIFACT_FETCHED_FROM_CACHE = \"artifact_fetched_from_cache\";\nconst FACT_ENDED_WITH_EXCEPTION = \"ended_with_exception\";\nconst FACT_FINAL_EXCEPTION = \"final_exception\";\nconst FACT_OS = \"$os\";\nconst FACT_OS_VERSION = \"$os_version\";\nconst FACT_SOURCE_URL = \"source_url\";\nconst FACT_SOURCE_URL_ETAG = \"source_url_etag\";\n\nconst FACT_NIX_LOCATION = \"nix_location\";\nconst FACT_NIX_STORE_TRUST = \"nix_store_trusted\";\nconst FACT_NIX_STORE_VERSION = \"nix_store_version\";\nconst FACT_NIX_STORE_CHECK_METHOD = \"nix_store_check_method\";\nconst FACT_NIX_STORE_CHECK_ERROR = \"nix_store_check_error\";\n\nconst STATE_KEY_EXECUTION_PHASE = \"detsys_action_execution_phase\";\nconst STATE_KEY_NIX_NOT_FOUND = \"detsys_action_nix_not_found\";\nconst STATE_NOT_FOUND = \"not-found\";\n\nconst DIAGNOSTIC_ENDPOINT_TIMEOUT_MS = 30_000; // 30 seconds in milliseconds\nconst CHECK_IN_ENDPOINT_TIMEOUT_MS = 5_000; // 5 seconds in milliseconds\n\n/**\n * An enum for describing different \"fetch suffixes\" for i.d.s.\n *\n * - `nix-style` means that system names like `x86_64-linux` and `aarch64-darwin` are used\n * - `gh-env-style` means that names like `X64-Linux` and `ARM64-macOS` are used\n * - `universal` means that the suffix is the static `universal` (for non-system-specific things)\n */\nexport type FetchSuffixStyle = \"nix-style\" | \"gh-env-style\" | \"universal\";\n\n/**\n * GitHub Actions has two possible execution phases: `main` and `post`.\n */\nexport type ExecutionPhase = \"main\" | \"post\";\n\n/**\n * How to handle whether Nix is currently installed on the runner.\n *\n * - `fail` means that the workflow fails if Nix isn't installed\n * - `warn` means that a warning is logged if Nix isn't installed\n * - `ignore` means that Nix will not be checked\n */\nexport type NixRequirementHandling = \"fail\" | \"warn\" | \"ignore\";\n\n/**\n * Whether the Nix store on the runner is trusted.\n *\n * - `trusted` means yes\n * - `untrusted` means no\n * - `unknown` means that the status couldn't be determined\n *\n * This is determined via the output of `nix store info --json`.\n */\nexport type NixStoreTrust = \"trusted\" | \"untrusted\" | \"unknown\";\n\nexport type ActionOptions = {\n // Name of the project generally, and the name of the binary on disk.\n name: string;\n\n // Defaults to `name`, Corresponds to the ProjectHost entry on i.d.s.\n idsProjectName?: string;\n\n // Defaults to `action:`\n eventPrefix?: string;\n\n // The \"architecture\" URL component expected by I.D.S. for the ProjectHost.\n fetchStyle: FetchSuffixStyle;\n\n // IdsToolbox assumes the GitHub Action exposes source overrides, like branch/pr/etc. to be named `source-*`.\n // This prefix adds a fallback name, prefixed by `${legacySourcePrefix}-`.\n // Users who configure legacySourcePrefix will get warnings asking them to change to `source-*`.\n legacySourcePrefix?: string;\n\n // Check if Nix is installed before running this action.\n // If Nix isn't installed, this action will not fail, and will instead do nothing.\n // The action will emit a user-visible warning instructing them to install Nix.\n requireNix: NixRequirementHandling;\n\n // The URL suffix to send diagnostics events to.\n //\n // The final URL is constructed via IDS_HOST/idsProjectName/diagnosticsSuffix.\n //\n // Default: `diagnostics`.\n diagnosticsSuffix?: string;\n};\n\n/**\n * A confident version of Options, where defaults have been resolved into final values.\n */\nexport type ConfidentActionOptions = {\n name: string;\n idsProjectName: string;\n eventPrefix: string;\n fetchStyle: FetchSuffixStyle;\n legacySourcePrefix?: string;\n requireNix: NixRequirementHandling;\n providedDiagnosticsUrl?: URL;\n};\n\n/**\n * An event to send to the diagnostic endpoint of i.d.s.\n */\nexport type DiagnosticEvent = {\n // Note: putting a Map in here won't serialize to json properly.\n // It'll just be {} on serialization.\n event_name: string;\n context: Record;\n correlation: correlation.AnonymizedCorrelationHashes;\n facts: Record;\n features: { [k: string]: string | boolean };\n timestamp: Date;\n uuid: UUID;\n};\n\nexport abstract class DetSysAction {\n nixStoreTrust: NixStoreTrust;\n strictMode: boolean;\n\n private actionOptions: ConfidentActionOptions;\n private exceptionAttachments: Map;\n private archOs: string;\n private executionPhase: ExecutionPhase;\n private nixSystem: string;\n private architectureFetchSuffix: string;\n private sourceParameters: SourceDef;\n private facts: Record;\n private events: DiagnosticEvent[];\n private identity: correlation.AnonymizedCorrelationHashes;\n private idsHost: IdsHost;\n private features: { [k: string]: Feature };\n private featureEventMetadata: { [k: string]: string | boolean };\n\n private determineExecutionPhase(): ExecutionPhase {\n const currentPhase = actionsCore.getState(STATE_KEY_EXECUTION_PHASE);\n if (currentPhase === \"\") {\n actionsCore.saveState(STATE_KEY_EXECUTION_PHASE, \"post\");\n return \"main\";\n } else {\n return \"post\";\n }\n }\n\n constructor(actionOptions: ActionOptions) {\n this.actionOptions = makeOptionsConfident(actionOptions);\n this.idsHost = new IdsHost(\n this.actionOptions.idsProjectName,\n actionOptions.diagnosticsSuffix,\n // Note: we don't use actionsCore.getInput('diagnostic-endpoint') on purpose:\n // getInput silently converts absent data to an empty string.\n process.env[\"INPUT_DIAGNOSTIC-ENDPOINT\"],\n );\n this.exceptionAttachments = new Map();\n this.nixStoreTrust = \"unknown\";\n this.strictMode = getBool(\"_internal-strict-mode\");\n\n this.features = {};\n this.featureEventMetadata = {};\n this.events = [];\n\n // JSON sent to server\n /* eslint-disable camelcase */\n this.facts = {\n $lib: \"idslib\",\n $lib_version: pkgVersion,\n project: this.actionOptions.name,\n ids_project: this.actionOptions.idsProjectName,\n };\n\n const params = [\n [\"github_action_ref\", \"GITHUB_ACTION_REF\"],\n [\"github_action_repository\", \"GITHUB_ACTION_REPOSITORY\"],\n [\"github_event_name\", \"GITHUB_EVENT_NAME\"],\n [\"$os\", \"RUNNER_OS\"],\n [\"arch\", \"RUNNER_ARCH\"],\n ];\n for (const [target, env] of params) {\n const value = process.env[env];\n if (value) {\n this.facts[target] = value;\n }\n }\n\n this.identity = correlation.identify(this.actionOptions.name);\n this.archOs = platform.getArchOs();\n this.nixSystem = platform.getNixPlatform(this.archOs);\n\n this.facts.arch_os = this.archOs;\n this.facts.nix_system = this.nixSystem;\n\n {\n ghActionsCorePlatform\n .getDetails()\n // eslint-disable-next-line github/no-then\n .then((details) => {\n if (details.name !== \"unknown\") {\n this.addFact(FACT_OS, details.name);\n }\n if (details.version !== \"unknown\") {\n this.addFact(FACT_OS_VERSION, details.version);\n }\n })\n // eslint-disable-next-line github/no-then\n .catch((e: unknown) => {\n actionsCore.debug(\n `Failure getting platform details: ${stringifyError(e)}`,\n );\n });\n }\n\n this.executionPhase = this.determineExecutionPhase();\n this.facts.execution_phase = this.executionPhase;\n\n if (this.actionOptions.fetchStyle === \"gh-env-style\") {\n this.architectureFetchSuffix = this.archOs;\n } else if (this.actionOptions.fetchStyle === \"nix-style\") {\n this.architectureFetchSuffix = this.nixSystem;\n } else if (this.actionOptions.fetchStyle === \"universal\") {\n this.architectureFetchSuffix = \"universal\";\n } else {\n throw new Error(\n `fetchStyle ${this.actionOptions.fetchStyle} is not a valid style`,\n );\n }\n\n this.sourceParameters = constructSourceParameters(\n this.actionOptions.legacySourcePrefix,\n );\n\n this.recordEvent(`begin_${this.executionPhase}`);\n }\n\n /**\n * Attach a file to the diagnostics data in error conditions.\n *\n * The file at `location` doesn't need to exist when stapleFile is called.\n *\n * If the file doesn't exist or is unreadable when trying to staple the attachments, the JS error will be stored in a context value at `staple_failure_{name}`.\n * If the file is readable, the file's contents will be stored in a context value at `staple_value_{name}`.\n */\n stapleFile(name: string, location: string): void {\n this.exceptionAttachments.set(name, location);\n }\n\n /**\n * The main execution phase.\n */\n abstract main(): Promise;\n\n /**\n * The post execution phase.\n */\n abstract post(): Promise;\n\n /**\n * Execute the Action as defined.\n */\n execute(): void {\n // eslint-disable-next-line github/no-then\n this.executeAsync().catch((error: Error) => {\n // eslint-disable-next-line no-console\n console.log(error);\n process.exitCode = 1;\n });\n }\n\n getTemporaryName(): string {\n const tmpDir = process.env[\"RUNNER_TEMP\"] || tmpdir();\n return path.join(tmpDir, `${this.actionOptions.name}-${randomUUID()}`);\n }\n\n addFact(key: string, value: string | boolean): void {\n this.facts[key] = value;\n }\n\n async getDiagnosticsUrl(): Promise {\n return await this.idsHost.getDiagnosticsUrl();\n }\n\n getUniqueId(): string {\n return (\n this.identity.run_differentiator ||\n process.env.RUNNER_TRACKING_ID ||\n randomUUID()\n );\n }\n\n getCorrelationHashes(): correlation.AnonymizedCorrelationHashes {\n return this.identity;\n }\n\n recordEvent(eventName: string, context: Record = {}): void {\n const prefixedName =\n eventName === \"$feature_flag_called\"\n ? eventName\n : `${this.actionOptions.eventPrefix}${eventName}`;\n this.events.push({\n event_name: prefixedName,\n context,\n correlation: this.identity,\n facts: this.facts,\n features: this.featureEventMetadata,\n timestamp: new Date(),\n uuid: randomUUID(),\n });\n }\n\n /**\n * Unpacks the closure returned by `fetchArtifact()`, imports the\n * contents into the Nix store, and returns the path of the executable at\n * `/nix/store/STORE_PATH/bin/${bin}`.\n */\n async unpackClosure(bin: string): Promise {\n const artifact = await this.fetchArtifact();\n const { stdout } = await promisify(exec)(\n `cat \"${artifact}\" | xz -d | nix-store --import`,\n );\n const paths = stdout.split(os.EOL);\n const lastPath = paths.at(-2);\n return `${lastPath}/bin/${bin}`;\n }\n\n /**\n * Fetches the executable at the URL determined by the `source-*` inputs and\n * other facts, `chmod`s it, and returns the path to the executable on disk.\n */\n async fetchExecutable(): Promise {\n const binaryPath = await this.fetchArtifact();\n await chmod(binaryPath, fs.constants.S_IXUSR | fs.constants.S_IXGRP);\n return binaryPath;\n }\n\n private get isMain(): boolean {\n return this.executionPhase === \"main\";\n }\n\n private get isPost(): boolean {\n return this.executionPhase === \"post\";\n }\n\n private async executeAsync(): Promise {\n try {\n await this.checkIn();\n\n process.env.DETSYS_CORRELATION = JSON.stringify(\n this.getCorrelationHashes(),\n );\n\n if (!(await this.preflightRequireNix())) {\n this.recordEvent(EVENT_PREFLIGHT_REQUIRE_NIX_DENIED);\n return;\n } else {\n await this.preflightNixStoreInfo();\n this.addFact(FACT_NIX_STORE_TRUST, this.nixStoreTrust);\n }\n\n if (this.isMain) {\n await this.main();\n } else if (this.isPost) {\n await this.post();\n }\n this.addFact(FACT_ENDED_WITH_EXCEPTION, false);\n } catch (e: unknown) {\n this.addFact(FACT_ENDED_WITH_EXCEPTION, true);\n\n const reportable = stringifyError(e);\n\n this.addFact(FACT_FINAL_EXCEPTION, reportable);\n\n if (this.isPost) {\n actionsCore.warning(reportable);\n } else {\n actionsCore.setFailed(reportable);\n }\n\n const doGzip = promisify(gzip);\n\n const exceptionContext: Map = new Map();\n for (const [attachmentLabel, filePath] of this.exceptionAttachments) {\n try {\n const logText = readFileSync(filePath);\n const buf = await doGzip(logText);\n exceptionContext.set(\n `staple_value_${attachmentLabel}`,\n buf.toString(\"base64\"),\n );\n } catch (innerError: unknown) {\n exceptionContext.set(\n `staple_failure_${attachmentLabel}`,\n stringifyError(innerError),\n );\n }\n }\n\n this.recordEvent(EVENT_EXCEPTION, Object.fromEntries(exceptionContext));\n } finally {\n await this.complete();\n }\n }\n\n async getClient(): Promise {\n return await this.idsHost.getGot((prevUrl: URL, nextUrl: URL) => {\n this.recordEvent(\"ids-failover\", {\n previousUrl: prevUrl.toString(),\n nextUrl: nextUrl.toString(),\n });\n });\n }\n\n private async checkIn(): Promise {\n const checkin = await this.requestCheckIn();\n if (checkin === undefined) {\n return;\n }\n\n this.features = checkin.options;\n for (const [key, feature] of Object.entries(this.features)) {\n this.featureEventMetadata[key] = feature.variant;\n }\n\n const impactSymbol: Map = new Map([\n [\"none\", \"⚪\"],\n [\"maintenance\", \"🛠️\"],\n [\"minor\", \"🟡\"],\n [\"major\", \"🟠\"],\n [\"critical\", \"🔴\"],\n ]);\n const defaultImpactSymbol = \"🔵\";\n\n if (checkin.status !== null) {\n const summaries: string[] = [];\n\n for (const incident of checkin.status.incidents) {\n summaries.push(\n `${impactSymbol.get(incident.impact) || defaultImpactSymbol} ${incident.status.replace(\"_\", \" \")}: ${incident.name} (${incident.shortlink})`,\n );\n }\n\n for (const maintenance of checkin.status.scheduled_maintenances) {\n summaries.push(\n `${impactSymbol.get(maintenance.impact) || defaultImpactSymbol} ${maintenance.status.replace(\"_\", \" \")}: ${maintenance.name} (${maintenance.shortlink})`,\n );\n }\n\n if (summaries.length > 0) {\n actionsCore.info(\n // Bright red, Bold, Underline\n `${\"\\u001b[0;31m\"}${\"\\u001b[1m\"}${\"\\u001b[4m\"}${checkin.status.page.name} Status`,\n );\n for (const notice of summaries) {\n actionsCore.info(notice);\n }\n actionsCore.info(`See: ${checkin.status.page.url}`);\n actionsCore.info(``);\n }\n }\n }\n\n getFeature(name: string): Feature | undefined {\n if (!this.features.hasOwnProperty(name)) {\n return undefined;\n }\n\n const result = this.features[name];\n if (result === undefined) {\n return undefined;\n }\n\n this.recordEvent(\"$feature_flag_called\", {\n $feature_flag: name,\n $feature_flag_response: result.variant,\n });\n\n return result;\n }\n\n /**\n * Check in to install.determinate.systems, to accomplish three things:\n *\n * 1. Preflight the server selected from IdsHost, to increase the chances of success.\n * 2. Fetch any incidents and maintenance events to let users know in case things are weird.\n * 3. Get feature flag data so we can gently roll out new features.\n */\n private async requestCheckIn(): Promise {\n for (\n let attemptsRemaining = 5;\n attemptsRemaining > 0;\n attemptsRemaining--\n ) {\n const checkInUrl = await this.getCheckInUrl();\n if (checkInUrl === undefined) {\n return undefined;\n }\n\n try {\n actionsCore.debug(`Preflighting via ${checkInUrl}`);\n\n checkInUrl.searchParams.set(\"ci\", \"github\");\n checkInUrl.searchParams.set(\n \"correlation\",\n JSON.stringify(this.identity),\n );\n\n return (await this.getClient())\n .get(checkInUrl, {\n timeout: {\n request: CHECK_IN_ENDPOINT_TIMEOUT_MS,\n },\n })\n .json();\n } catch (e: unknown) {\n actionsCore.debug(`Error checking in: ${stringifyError(e)}`);\n this.idsHost.markCurrentHostBroken();\n }\n }\n\n return undefined;\n }\n\n /**\n * Fetch an artifact, such as a tarball, from the location determined by the\n * `source-*` inputs. If `source-binary` is specified, this will return a path\n * to a binary on disk; otherwise, the artifact will be downloaded from the\n * URL determined by the other `source-*` inputs (`source-url`, `source-pr`,\n * etc.).\n */\n private async fetchArtifact(): Promise {\n const sourceBinary = getStringOrNull(\"source-binary\");\n\n // If source-binary is set, use that. Otherwise fall back to the source-* parameters.\n if (sourceBinary !== null && sourceBinary !== \"\") {\n actionsCore.debug(`Using the provided source binary at ${sourceBinary}`);\n return sourceBinary;\n }\n\n actionsCore.startGroup(\n `Downloading ${this.actionOptions.name} for ${this.architectureFetchSuffix}`,\n );\n\n try {\n actionsCore.info(`Fetching from ${await this.getSourceUrl()}`);\n\n const correlatedUrl = await this.getSourceUrl();\n correlatedUrl.searchParams.set(\"ci\", \"github\");\n correlatedUrl.searchParams.set(\n \"correlation\",\n JSON.stringify(this.identity),\n );\n\n const versionCheckup = await (await this.getClient()).head(correlatedUrl);\n if (versionCheckup.headers.etag) {\n const v = versionCheckup.headers.etag;\n this.addFact(FACT_SOURCE_URL_ETAG, v);\n\n actionsCore.debug(\n `Checking the tool cache for ${await this.getSourceUrl()} at ${v}`,\n );\n const cached = await this.getCachedVersion(v);\n if (cached) {\n this.facts[FACT_ARTIFACT_FETCHED_FROM_CACHE] = true;\n actionsCore.debug(`Tool cache hit.`);\n return cached;\n }\n }\n\n this.facts[FACT_ARTIFACT_FETCHED_FROM_CACHE] = false;\n\n actionsCore.debug(\n `No match from the cache, re-fetching from the redirect: ${versionCheckup.url}`,\n );\n\n const destFile = this.getTemporaryName();\n const fetchStream = (await this.getClient()).stream(versionCheckup.url);\n\n await pipeline(\n fetchStream,\n createWriteStream(destFile, {\n encoding: \"binary\",\n mode: 0o755,\n }),\n );\n\n if (fetchStream.response?.headers.etag) {\n const v = fetchStream.response.headers.etag;\n\n try {\n await this.saveCachedVersion(v, destFile);\n } catch (e: unknown) {\n actionsCore.debug(`Error caching the artifact: ${stringifyError(e)}`);\n }\n }\n\n return destFile;\n } finally {\n actionsCore.endGroup();\n }\n }\n\n /**\n * A helper function for failing on error only if strict mode is enabled.\n * This is intended only for CI environments testing Actions themselves.\n */\n failOnError(msg: string): void {\n if (this.strictMode) {\n actionsCore.setFailed(`strict mode failure: ${msg}`);\n }\n }\n\n private async complete(): Promise {\n this.recordEvent(`complete_${this.executionPhase}`);\n await this.submitEvents();\n }\n\n private async getCheckInUrl(): Promise {\n const checkInUrl = await this.idsHost.getDynamicRootUrl();\n\n if (checkInUrl === undefined) {\n return undefined;\n }\n\n checkInUrl.pathname += \"check-in\";\n return checkInUrl;\n }\n\n private async getSourceUrl(): Promise {\n const p = this.sourceParameters;\n\n if (p.url) {\n this.addFact(FACT_SOURCE_URL, p.url);\n return new URL(p.url);\n }\n\n const fetchUrl = await this.idsHost.getRootUrl();\n fetchUrl.pathname += this.actionOptions.idsProjectName;\n\n if (p.tag) {\n fetchUrl.pathname += `/tag/${p.tag}`;\n } else if (p.pr) {\n fetchUrl.pathname += `/pr/${p.pr}`;\n } else if (p.branch) {\n fetchUrl.pathname += `/branch/${p.branch}`;\n } else if (p.revision) {\n fetchUrl.pathname += `/rev/${p.revision}`;\n } else {\n fetchUrl.pathname += `/stable`;\n }\n\n fetchUrl.pathname += `/${this.architectureFetchSuffix}`;\n\n this.addFact(FACT_SOURCE_URL, fetchUrl.toString());\n\n return fetchUrl;\n }\n\n private cacheKey(version: string): string {\n const cleanedVersion = version.replace(/[^a-zA-Z0-9-+.]/g, \"\");\n return `determinatesystem-${this.actionOptions.name}-${this.architectureFetchSuffix}-${cleanedVersion}`;\n }\n\n private async getCachedVersion(version: string): Promise {\n const startCwd = process.cwd();\n\n try {\n const tempDir = this.getTemporaryName();\n await mkdir(tempDir);\n process.chdir(tempDir);\n\n // extremely evil shit right here:\n process.env.GITHUB_WORKSPACE_BACKUP = process.env.GITHUB_WORKSPACE;\n delete process.env.GITHUB_WORKSPACE;\n\n if (\n await actionsCache.restoreCache(\n [this.actionOptions.name],\n this.cacheKey(version),\n [],\n undefined,\n true,\n )\n ) {\n this.recordEvent(EVENT_ARTIFACT_CACHE_HIT);\n return `${tempDir}/${this.actionOptions.name}`;\n }\n\n this.recordEvent(EVENT_ARTIFACT_CACHE_MISS);\n return undefined;\n } finally {\n process.env.GITHUB_WORKSPACE = process.env.GITHUB_WORKSPACE_BACKUP;\n delete process.env.GITHUB_WORKSPACE_BACKUP;\n process.chdir(startCwd);\n }\n }\n\n private async saveCachedVersion(\n version: string,\n toolPath: string,\n ): Promise {\n const startCwd = process.cwd();\n\n try {\n const tempDir = this.getTemporaryName();\n await mkdir(tempDir);\n process.chdir(tempDir);\n await copyFile(toolPath, `${tempDir}/${this.actionOptions.name}`);\n\n // extremely evil shit right here:\n process.env.GITHUB_WORKSPACE_BACKUP = process.env.GITHUB_WORKSPACE;\n delete process.env.GITHUB_WORKSPACE;\n\n await actionsCache.saveCache(\n [this.actionOptions.name],\n this.cacheKey(version),\n undefined,\n true,\n );\n this.recordEvent(EVENT_ARTIFACT_CACHE_PERSIST);\n } finally {\n process.env.GITHUB_WORKSPACE = process.env.GITHUB_WORKSPACE_BACKUP;\n delete process.env.GITHUB_WORKSPACE_BACKUP;\n process.chdir(startCwd);\n }\n }\n\n private async preflightRequireNix(): Promise {\n let nixLocation: string | undefined;\n\n const pathParts = (process.env[\"PATH\"] || \"\").split(\":\");\n for (const location of pathParts) {\n const candidateNix = path.join(location, \"nix\");\n\n try {\n await fs.access(candidateNix, fs.constants.X_OK);\n actionsCore.debug(`Found Nix at ${candidateNix}`);\n nixLocation = candidateNix;\n break;\n } catch {\n actionsCore.debug(`Nix not at ${candidateNix}`);\n }\n }\n this.addFact(FACT_NIX_LOCATION, nixLocation || \"\");\n\n if (this.actionOptions.requireNix === \"ignore\") {\n return true;\n }\n\n const currentNotFoundState = actionsCore.getState(STATE_KEY_NIX_NOT_FOUND);\n if (currentNotFoundState === STATE_NOT_FOUND) {\n // It was previously not found, so don't run subsequent actions\n return false;\n }\n\n if (nixLocation !== undefined) {\n return true;\n }\n actionsCore.saveState(STATE_KEY_NIX_NOT_FOUND, STATE_NOT_FOUND);\n\n switch (this.actionOptions.requireNix) {\n case \"fail\":\n actionsCore.setFailed(\n [\n \"This action can only be used when Nix is installed.\",\n \"Add `- uses: DeterminateSystems/nix-installer-action@main` earlier in your workflow.\",\n ].join(\" \"),\n );\n break;\n case \"warn\":\n actionsCore.warning(\n [\n \"This action is in no-op mode because Nix is not installed.\",\n \"Add `- uses: DeterminateSystems/nix-installer-action@main` earlier in your workflow.\",\n ].join(\" \"),\n );\n break;\n }\n\n return false;\n }\n\n private async preflightNixStoreInfo(): Promise {\n let output = \"\";\n\n const options: actionsExec.ExecOptions = {};\n options.silent = true;\n options.listeners = {\n stdout: (data) => {\n output += data.toString();\n },\n };\n\n try {\n output = \"\";\n await actionsExec.exec(\"nix\", [\"store\", \"info\", \"--json\"], options);\n this.addFact(FACT_NIX_STORE_CHECK_METHOD, \"info\");\n } catch {\n try {\n // reset output\n output = \"\";\n await actionsExec.exec(\"nix\", [\"store\", \"ping\", \"--json\"], options);\n this.addFact(FACT_NIX_STORE_CHECK_METHOD, \"ping\");\n } catch {\n this.addFact(FACT_NIX_STORE_CHECK_METHOD, \"none\");\n return;\n }\n }\n\n try {\n const parsed = JSON.parse(output);\n if (parsed.trusted === 1) {\n this.nixStoreTrust = \"trusted\";\n } else if (parsed.trusted === 0) {\n this.nixStoreTrust = \"untrusted\";\n } else if (parsed.trusted !== undefined) {\n this.addFact(\n FACT_NIX_STORE_CHECK_ERROR,\n `Mysterious trusted value: ${JSON.stringify(parsed.trusted)}`,\n );\n }\n\n this.addFact(FACT_NIX_STORE_VERSION, JSON.stringify(parsed.version));\n } catch (e: unknown) {\n this.addFact(FACT_NIX_STORE_CHECK_ERROR, stringifyError(e));\n }\n }\n\n private async submitEvents(): Promise {\n const diagnosticsUrl = await this.idsHost.getDiagnosticsUrl();\n if (diagnosticsUrl === undefined) {\n actionsCore.debug(\n \"Diagnostics are disabled. Not sending the following events:\",\n );\n actionsCore.debug(JSON.stringify(this.events, undefined, 2));\n return;\n }\n\n const batch = {\n type: \"eventlog\",\n sent_at: new Date(),\n events: this.events,\n };\n\n try {\n await (\n await this.getClient()\n ).post(diagnosticsUrl, {\n json: batch,\n timeout: {\n request: DIAGNOSTIC_ENDPOINT_TIMEOUT_MS,\n },\n });\n } catch (err: unknown) {\n actionsCore.debug(\n `Error submitting diagnostics event to ${diagnosticsUrl}: ${stringifyError(err)}`,\n );\n }\n this.events = [];\n }\n}\n\nfunction stringifyError(error: unknown): string {\n return error instanceof Error || typeof error == \"string\"\n ? error.toString()\n : JSON.stringify(error);\n}\n\nfunction makeOptionsConfident(\n actionOptions: ActionOptions,\n): ConfidentActionOptions {\n const idsProjectName = actionOptions.idsProjectName ?? actionOptions.name;\n\n const finalOpts: ConfidentActionOptions = {\n name: actionOptions.name,\n idsProjectName,\n eventPrefix: actionOptions.eventPrefix || \"action:\",\n fetchStyle: actionOptions.fetchStyle,\n legacySourcePrefix: actionOptions.legacySourcePrefix,\n requireNix: actionOptions.requireNix,\n };\n\n actionsCore.debug(\"idslib options:\");\n actionsCore.debug(JSON.stringify(finalOpts, undefined, 2));\n\n return finalOpts;\n}\n\n// Public exports from other files\nexport {\n CheckIn,\n Feature,\n Incident,\n Maintenance,\n Page,\n StatusSummary,\n} from \"./check-in.js\";\nexport { AnonymizedCorrelationHashes } from \"./correlation.js\";\nexport { stringifyError } from \"./errors.js\";\nexport { IdsHost } from \"./ids-host.js\";\nexport { SourceDef } from \"./sourcedef.js\";\nexport * as inputs from \"./inputs.js\";\nexport * as platform from \"./platform.js\";\n"],"mappings":"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","names":["error","os","version","platform","arch","actionsCore","actionsCore","error","actionsCore","actionsCore","actionsCore","actionsCore","exec","readFileSync","fs","os","promisify","stringifyError","error","promisify","exec","fs","readFileSync","version"]} \ No newline at end of file +{"version":3,"sources":["../package.json","../src/linux-release-info.ts","../src/actions-core-platform.ts","../src/correlation.ts","../src/errors.ts","../src/ids-host.ts","../src/inputs.ts","../src/platform.ts","../src/sourcedef.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"detsys-ts\",\n \"version\": \"1.0.0\",\n \"description\": \"TypeScript goodies for DetSys projects\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"check-fmt\": \"prettier --check .\",\n \"format\": \"prettier --write .\",\n \"lint\": \"eslint src/**/*.ts\",\n \"docs\": \"typedoc\",\n \"test\": \"vitest --watch false\",\n \"test-dev\": \"vitest\",\n \"all\": \"rm -rf dist && pnpm run format && pnpm run lint && pnpm run build\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/DeterminateSystems/detsys-ts.git\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/DeterminateSystems/detsys-ts/issues\"\n },\n \"homepage\": \"https://github.com/DeterminateSystems/detsys-ts#readme\",\n \"dependencies\": {\n \"@actions/cache\": \"^3.2.4\",\n \"@actions/core\": \"^1.10.1\",\n \"@actions/exec\": \"^1.1.1\",\n \"got\": \"^14.4.0\",\n \"type-fest\": \"^4.19.0\"\n },\n \"devDependencies\": {\n \"@trivago/prettier-plugin-sort-imports\": \"^4.3.0\",\n \"@types/node\": \"^20.14.2\",\n \"@typescript-eslint/eslint-plugin\": \"^7.12.0\",\n \"eslint\": \"^8.57.0\",\n \"eslint-import-resolver-typescript\": \"^3.6.1\",\n \"eslint-plugin-github\": \"^4.10.2\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-prettier\": \"^5.1.3\",\n \"prettier\": \"^3.3.1\",\n \"tsup\": \"^8.1.0\",\n \"typedoc\": \"^0.25.13\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^1.6.0\"\n }\n}\n","/*!\n * linux-release-info\n * Get Linux release info (distribution name, version, arch, release, etc.)\n * from '/etc/os-release' or '/usr/lib/os-release' files and from native os\n * module. On Windows and Darwin platforms it only returns common node os module\n * info (platform, hostname, release, and arch)\n *\n * Licensed under MIT\n * Copyright (c) 2018-2020 [Samuel Carreira]\n */\n// NOTE: we depend on this directly to get around some un-fun issues with mixing CommonJS\n// and ESM in the bundle. We've modified the original logic to improve things like typing\n// and fixing ESLint issues. Originally drawn from:\n// https://github.com/samuelcarreira/linux-release-info/blob/84a91aa5442b47900da03020c590507545d3dc74/src/index.ts\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport { promisify } from \"node:util\";\n\nconst readFileAsync = promisify(fs.readFile);\n\nexport interface LinuxReleaseInfoOptions {\n /**\n * read mode, possible values: 'async' and 'sync'\n *\n * @default 'async'\n */\n mode?: \"async\" | \"sync\";\n /**\n * custom complete file path with os info default null/none\n * if not provided the system will search on the '/etc/os-release'\n * and '/usr/lib/os-release' files\n *\n * @default null\n */\n customFile?: string | null | undefined;\n /**\n * if true, show console debug messages\n *\n * @default false\n */\n debug?: boolean;\n}\n\nconst linuxReleaseInfoOptionsDefaults: LinuxReleaseInfoOptions = {\n mode: \"async\",\n customFile: null,\n debug: false,\n};\n\n/**\n * Get OS release info from 'os-release' file and from native os module\n * on Windows or Darwin it only returns common os module info\n * (uses native fs module)\n * @returns {object} info from the current os\n */\nexport function releaseInfo(infoOptions: LinuxReleaseInfoOptions): object {\n const options = { ...linuxReleaseInfoOptionsDefaults, ...infoOptions };\n\n const searchOsReleaseFileList: string[] = osReleaseFileList(\n options.customFile,\n );\n\n if (os.type() !== \"Linux\") {\n if (options.mode === \"sync\") {\n return getOsInfo();\n } else {\n return Promise.resolve(getOsInfo());\n }\n }\n\n if (options.mode === \"sync\") {\n return readSyncOsreleaseFile(searchOsReleaseFileList, options);\n } else {\n return Promise.resolve(\n readAsyncOsReleaseFile(searchOsReleaseFileList, options),\n );\n }\n}\n\n/**\n * Format file data: convert data to object keys/values\n *\n * @param {object} sourceData Source object to be appended\n * @param {string} srcParseData Input file data to be parsed\n * @returns {object} Formated object\n */\nfunction formatFileData(sourceData: OsInfo, srcParseData: string): OsInfo {\n const lines: string[] = srcParseData.split(\"\\n\");\n\n for (const line of lines) {\n const lineData = line.split(\"=\");\n\n if (lineData.length === 2) {\n lineData[1] = lineData[1].replace(/[\"'\\r]/gi, \"\"); // remove quotes and return character\n\n Object.defineProperty(sourceData, lineData[0].toLowerCase(), {\n value: lineData[1],\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n return sourceData;\n}\n\n/**\n * Export a list of os-release files\n *\n * @param {string} customFile optional custom complete filepath\n * @returns {array} list of os-release files\n */\nfunction osReleaseFileList(customFile: string | null | undefined): string[] {\n const DEFAULT_OS_RELEASE_FILES = [\"/etc/os-release\", \"/usr/lib/os-release\"];\n\n if (!customFile) {\n return DEFAULT_OS_RELEASE_FILES;\n } else {\n return Array(customFile);\n }\n}\n\n/**\n * Operating system info.\n */\ntype OsInfo = {\n type: string;\n platform: string;\n hostname: string;\n arch: string;\n release: string;\n};\n\n/**\n * Get OS Basic Info\n * (uses node 'os' native module)\n *\n * @returns {OsInfo} os basic info\n */\nfunction getOsInfo(): OsInfo {\n return {\n type: os.type(),\n platform: os.platform(),\n hostname: os.hostname(),\n arch: os.arch(),\n release: os.release(),\n };\n}\n\n/* Helper functions */\n\nasync function readAsyncOsReleaseFile(\n fileList: string[],\n options: LinuxReleaseInfoOptions,\n): Promise {\n let fileData = null;\n\n for (const osReleaseFile of fileList) {\n try {\n if (options.debug) {\n /* eslint-disable no-console */\n console.log(`Trying to read '${osReleaseFile}'...`);\n }\n\n fileData = await readFileAsync(osReleaseFile, \"binary\");\n\n if (options.debug) {\n console.log(`Read data:\\n${fileData}`);\n }\n\n break;\n } catch (error) {\n if (options.debug) {\n console.error(error);\n }\n }\n }\n\n if (fileData === null) {\n throw new Error(\"Cannot read os-release file!\");\n //return getOsInfo();\n }\n\n return formatFileData(getOsInfo(), fileData);\n}\n\nfunction readSyncOsreleaseFile(\n releaseFileList: string[],\n options: LinuxReleaseInfoOptions,\n): OsInfo {\n let fileData = null;\n\n for (const osReleaseFile of releaseFileList) {\n try {\n if (options.debug) {\n console.log(`Trying to read '${osReleaseFile}'...`);\n }\n\n fileData = fs.readFileSync(osReleaseFile, \"binary\");\n\n if (options.debug) {\n console.log(`Read data:\\n${fileData}`);\n }\n\n break;\n } catch (error) {\n if (options.debug) {\n console.error(error);\n }\n }\n }\n\n if (fileData === null) {\n throw new Error(\"Cannot read os-release file!\");\n //return getOsInfo();\n }\n\n return formatFileData(getOsInfo(), fileData);\n}\n","// MIT, mostly lifted from https://github.com/actions/toolkit/blob/5a736647a123ecf8582376bdaee833fbae5b3847/packages/core/src/platform.ts\n// since it isn't in @actions/core 1.10.1 which is their current release as 2024-04-19.\n// Changes: Replaced the lsb_release call in Linux with `linux-release-info` to parse the os-release file directly.\nimport { releaseInfo } from \"./linux-release-info.js\";\nimport * as actionsCore from \"@actions/core\";\nimport * as exec from \"@actions/exec\";\nimport os from \"os\";\n\n/**\n * The name and version of the Action runner's system.\n */\ntype SystemInfo = {\n name: string;\n version: string;\n};\n\n/**\n * Get the name and version of the current Windows system.\n */\nconst getWindowsInfo = async (): Promise => {\n const { stdout: version } = await exec.getExecOutput(\n 'powershell -command \"(Get-CimInstance -ClassName Win32_OperatingSystem).Version\"',\n undefined,\n {\n silent: true,\n },\n );\n\n const { stdout: name } = await exec.getExecOutput(\n 'powershell -command \"(Get-CimInstance -ClassName Win32_OperatingSystem).Caption\"',\n undefined,\n {\n silent: true,\n },\n );\n\n return {\n name: name.trim(),\n version: version.trim(),\n };\n};\n\n/**\n * Get the name and version of the current macOS system.\n */\nconst getMacOsInfo = async (): Promise => {\n const { stdout } = await exec.getExecOutput(\"sw_vers\", undefined, {\n silent: true,\n });\n\n const version = stdout.match(/ProductVersion:\\s*(.+)/)?.[1] ?? \"\";\n const name = stdout.match(/ProductName:\\s*(.+)/)?.[1] ?? \"\";\n\n return {\n name,\n version,\n };\n};\n\n/**\n * Get the name and version of the current Linux system.\n */\nconst getLinuxInfo = async (): Promise => {\n let data: object = {};\n\n try {\n data = releaseInfo({ mode: \"sync\" });\n actionsCore.debug(`Identified release info: ${JSON.stringify(data)}`);\n } catch (e) {\n actionsCore.debug(`Error collecting release info: ${e}`);\n }\n\n return {\n name: getPropertyViaWithDefault(\n data,\n [\"id\", \"name\", \"pretty_name\", \"id_like\"],\n \"unknown\",\n ),\n version: getPropertyViaWithDefault(\n data,\n [\"version_id\", \"version\", \"version_codename\"],\n \"unknown\",\n ),\n };\n};\n\nfunction getPropertyViaWithDefault(\n data: object,\n names: Property[],\n defaultValue: T,\n): T {\n for (const name of names) {\n const ret: T = getPropertyWithDefault(data, name, defaultValue);\n\n if (ret !== defaultValue) {\n return ret;\n }\n }\n\n return defaultValue;\n}\n\nfunction getPropertyWithDefault(\n data: object,\n name: Property,\n defaultValue: T,\n): T {\n if (!data.hasOwnProperty(name)) {\n return defaultValue;\n }\n\n const value = (data as { [K in Property]: T })[name];\n\n // NB. this check won't work for object instances\n if (typeof value !== typeof defaultValue) {\n return defaultValue;\n }\n\n return value;\n}\n\n/**\n * The Action runner's platform.\n */\nexport const platform = os.platform();\n\n/**\n * The Action runner's architecture.\n */\nexport const arch = os.arch();\n\n/**\n * Whether the Action runner is a Windows system.\n */\nexport const isWindows = platform === \"win32\";\n\n/**\n * Whether the Action runner is a macOS system.\n */\nexport const isMacOS = platform === \"darwin\";\n\n/**\n * Whether the Action runner is a Linux system.\n */\nexport const isLinux = platform === \"linux\";\n\n/**\n * System-level information about the current host (platform, architecture, etc.).\n */\ntype SystemDetails = {\n name: string;\n platform: string;\n arch: string;\n version: string;\n isWindows: boolean;\n isMacOS: boolean;\n isLinux: boolean;\n};\n\n/**\n * Get system-level information about the current host (platform, architecture, etc.).\n */\nexport async function getDetails(): Promise {\n return {\n ...(await (isWindows\n ? getWindowsInfo()\n : isMacOS\n ? getMacOsInfo()\n : getLinuxInfo())),\n platform,\n arch,\n isWindows,\n isMacOS,\n isLinux,\n };\n}\n","import * as actionsCore from \"@actions/core\";\nimport { createHash } from \"node:crypto\";\n\nconst OPTIONAL_VARIABLES = [\"INVOCATION_ID\"];\n\n/* eslint-disable camelcase */\n/**\n * JSON sent to server.\n */\nexport type AnonymizedCorrelationHashes = {\n correlation_source: string;\n repository?: string;\n run?: string;\n run_differentiator?: string;\n workflow?: string;\n groups: Record;\n};\n\nexport function identify(projectName: string): AnonymizedCorrelationHashes {\n const ident = {\n correlation_source: \"github-actions\",\n\n repository: hashEnvironmentVariables(\"GHR\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n ]),\n workflow: hashEnvironmentVariables(\"GHW\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n \"GITHUB_WORKFLOW\",\n ]),\n job: hashEnvironmentVariables(\"GHWJ\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n \"GITHUB_WORKFLOW\",\n \"GITHUB_JOB\",\n ]),\n run: hashEnvironmentVariables(\"GHWJR\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n \"GITHUB_WORKFLOW\",\n \"GITHUB_JOB\",\n \"GITHUB_RUN_ID\",\n ]),\n run_differentiator: hashEnvironmentVariables(\"GHWJA\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n \"GITHUB_REPOSITORY\",\n \"GITHUB_REPOSITORY_ID\",\n \"GITHUB_WORKFLOW\",\n \"GITHUB_JOB\",\n \"GITHUB_RUN_ID\",\n \"GITHUB_RUN_NUMBER\",\n \"GITHUB_RUN_ATTEMPT\",\n \"INVOCATION_ID\",\n ]),\n groups: {\n ci: \"github-actions\",\n project: projectName,\n github_organization: hashEnvironmentVariables(\"GHO\", [\n \"GITHUB_SERVER_URL\",\n \"GITHUB_REPOSITORY_OWNER\",\n \"GITHUB_REPOSITORY_OWNER_ID\",\n ]),\n },\n };\n\n actionsCore.debug(\"Correlation data:\");\n actionsCore.debug(JSON.stringify(ident, null, 2));\n\n return ident;\n}\n\nfunction hashEnvironmentVariables(\n prefix: string,\n variables: string[],\n): undefined | string {\n const hash = createHash(\"sha256\");\n\n for (const varName of variables) {\n let value = process.env[varName];\n\n if (value === undefined) {\n if (OPTIONAL_VARIABLES.includes(varName)) {\n actionsCore.debug(\n `Optional environment variable not set: ${varName} -- substituting with the variable name`,\n );\n value = varName;\n } else {\n actionsCore.debug(\n `Environment variable not set: ${varName} -- can't generate the requested identity`,\n );\n return undefined;\n }\n }\n\n hash.update(value);\n hash.update(\"\\0\");\n }\n\n return `${prefix}-${hash.digest(\"hex\")}`;\n}\n","/**\n * Coerce a value of type `unknown` into a string.\n */\nexport function stringifyError(e: unknown): string {\n if (e instanceof Error) {\n return e.message;\n } else if (typeof e === \"string\") {\n return e;\n } else {\n return JSON.stringify(e);\n }\n}\n","/**\n * @packageDocumentation\n * Identifies and discovers backend servers for install.determinate.systems\n */\nimport { stringifyError } from \"./errors.js\";\nimport * as actionsCore from \"@actions/core\";\nimport got, { Got } from \"got\";\nimport type { SrvRecord } from \"node:dns\";\nimport { resolveSrv } from \"node:dns/promises\";\n\nconst DEFAULT_LOOKUP = \"_detsys_ids._tcp.install.determinate.systems.\";\nconst ALLOWED_SUFFIXES = [\n \".install.determinate.systems\",\n \".install.detsys.dev\",\n];\n\nconst DEFAULT_IDS_HOST = \"https://install.determinate.systems\";\nconst LOOKUP = process.env[\"IDS_LOOKUP\"] ?? DEFAULT_LOOKUP;\n\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds in milliseconds\n\n/**\n * Host information for install.determinate.systems.\n */\nexport class IdsHost {\n private idsProjectName: string;\n private diagnosticsSuffix?: string;\n private runtimeDiagnosticsUrl?: string;\n private prioritizedURLs?: URL[];\n private client?: Got;\n\n constructor(\n idsProjectName: string,\n diagnosticsSuffix: string | undefined,\n runtimeDiagnosticsUrl: string | undefined,\n ) {\n this.idsProjectName = idsProjectName;\n this.diagnosticsSuffix = diagnosticsSuffix;\n this.runtimeDiagnosticsUrl = runtimeDiagnosticsUrl;\n this.client = undefined;\n }\n\n async getGot(\n recordFailoverCallback?: (prevUrl: URL, nextUrl: URL) => void,\n ): Promise {\n if (this.client === undefined) {\n this.client = got.extend({\n timeout: {\n request: DEFAULT_TIMEOUT,\n },\n\n retry: {\n limit: (await this.getUrlsByPreference()).length,\n methods: [\"GET\", \"HEAD\"],\n },\n\n hooks: {\n beforeRetry: [\n async (error, retryCount) => {\n const prevUrl = await this.getRootUrl();\n this.markCurrentHostBroken();\n const nextUrl = await this.getRootUrl();\n\n if (recordFailoverCallback !== undefined) {\n recordFailoverCallback(prevUrl, nextUrl);\n }\n\n actionsCore.info(\n `Retrying after error ${error.code}, retry #: ${retryCount}`,\n );\n },\n ],\n\n beforeRequest: [\n async (options) => {\n // The getter always returns a URL, even though the setter accepts a string\n const currentUrl: URL = options.url as URL;\n\n if (this.isUrlSubjectToDynamicUrls(currentUrl)) {\n const newUrl: URL = new URL(currentUrl);\n\n const url: URL = await this.getRootUrl();\n newUrl.host = url.host;\n\n options.url = newUrl;\n actionsCore.debug(`Transmuted ${currentUrl} into ${newUrl}`);\n } else {\n actionsCore.debug(`No transmutations on ${currentUrl}`);\n }\n },\n ],\n },\n });\n }\n\n return this.client;\n }\n\n markCurrentHostBroken(): void {\n this.prioritizedURLs?.shift();\n }\n\n setPrioritizedUrls(urls: URL[]): void {\n this.prioritizedURLs = urls;\n }\n\n isUrlSubjectToDynamicUrls(url: URL): boolean {\n if (url.origin === DEFAULT_IDS_HOST) {\n return true;\n }\n\n for (const suffix of ALLOWED_SUFFIXES) {\n if (url.host.endsWith(suffix)) {\n return true;\n }\n }\n\n return false;\n }\n\n async getDynamicRootUrl(): Promise {\n const idsHost = process.env[\"IDS_HOST\"];\n if (idsHost !== undefined) {\n try {\n return new URL(idsHost);\n } catch (err: unknown) {\n actionsCore.error(\n `IDS_HOST environment variable is not a valid URL. Ignoring. ${stringifyError(err)}`,\n );\n }\n }\n\n let url: URL | undefined = undefined;\n try {\n const urls = await this.getUrlsByPreference();\n url = urls[0];\n } catch (err: unknown) {\n actionsCore.error(\n `Error collecting IDS URLs by preference: ${stringifyError(err)}`,\n );\n }\n\n if (url === undefined) {\n return undefined;\n } else {\n // This is a load-bearing `new URL(url)` so that callers can't mutate\n // getRootUrl's return value.\n return new URL(url);\n }\n }\n\n async getRootUrl(): Promise {\n const url = await this.getDynamicRootUrl();\n\n if (url === undefined) {\n return new URL(DEFAULT_IDS_HOST);\n }\n\n return url;\n }\n\n async getDiagnosticsUrl(): Promise {\n if (this.runtimeDiagnosticsUrl === \"\") {\n // User specifically set the diagnostics URL to an empty string\n // so disable diagnostics\n return undefined;\n }\n\n if (\n this.runtimeDiagnosticsUrl !== \"-\" &&\n this.runtimeDiagnosticsUrl !== undefined\n ) {\n try {\n // Caller specified a specific diagnostics URL\n return new URL(this.runtimeDiagnosticsUrl);\n } catch (err: unknown) {\n actionsCore.info(\n `User-provided diagnostic endpoint ignored: not a valid URL: ${stringifyError(err)}`,\n );\n }\n }\n\n try {\n const diagnosticUrl = await this.getRootUrl();\n diagnosticUrl.pathname += this.idsProjectName;\n diagnosticUrl.pathname += \"/\";\n diagnosticUrl.pathname += this.diagnosticsSuffix || \"diagnostics\";\n return diagnosticUrl;\n } catch (err: unknown) {\n actionsCore.info(\n `Generated diagnostic endpoint ignored, and diagnostics are disabled: not a valid URL: ${stringifyError(err)}`,\n );\n return undefined;\n }\n }\n\n private async getUrlsByPreference(): Promise {\n if (this.prioritizedURLs === undefined) {\n this.prioritizedURLs = orderRecordsByPriorityWeight(\n await discoverServiceRecords(),\n ).flatMap((record) => recordToUrl(record) || []);\n }\n\n return this.prioritizedURLs;\n }\n}\n\nexport function recordToUrl(record: SrvRecord): URL | undefined {\n const urlStr = `https://${record.name}:${record.port}`;\n try {\n return new URL(urlStr);\n } catch (err: unknown) {\n actionsCore.debug(\n `Record ${JSON.stringify(record)} produced an invalid URL: ${urlStr} (${err})`,\n );\n return undefined;\n }\n}\n\nasync function discoverServiceRecords(): Promise {\n return await discoverServicesStub(resolveSrv(LOOKUP), 1_000);\n}\n\nexport async function discoverServicesStub(\n lookup: Promise,\n timeout: number,\n): Promise {\n const defaultFallback: Promise = new Promise(\n (resolve, _reject) => {\n setTimeout(resolve, timeout, []);\n },\n );\n\n let records: SrvRecord[];\n\n try {\n records = await Promise.race([lookup, defaultFallback]);\n } catch (reason: unknown) {\n actionsCore.debug(`Error resolving SRV records: ${stringifyError(reason)}`);\n records = [];\n }\n\n const acceptableRecords = records.filter((record: SrvRecord): boolean => {\n for (const suffix of ALLOWED_SUFFIXES) {\n if (record.name.endsWith(suffix)) {\n return true;\n }\n }\n\n actionsCore.debug(\n `Unacceptable domain due to an invalid suffix: ${record.name}`,\n );\n\n return false;\n });\n\n if (acceptableRecords.length === 0) {\n actionsCore.debug(`No records found for ${LOOKUP}`);\n } else {\n actionsCore.debug(\n `Resolved ${LOOKUP} to ${JSON.stringify(acceptableRecords)}`,\n );\n }\n\n return acceptableRecords;\n}\n\nexport function orderRecordsByPriorityWeight(\n records: SrvRecord[],\n): SrvRecord[] {\n const byPriorityWeight: Map = new Map();\n for (const record of records) {\n const existing = byPriorityWeight.get(record.priority);\n if (existing) {\n existing.push(record);\n } else {\n byPriorityWeight.set(record.priority, [record]);\n }\n }\n\n const prioritizedRecords: SrvRecord[] = [];\n const keys: number[] = Array.from(byPriorityWeight.keys()).sort(\n (a, b) => a - b,\n );\n\n for (const priority of keys) {\n const recordsByPrio = byPriorityWeight.get(priority);\n if (recordsByPrio === undefined) {\n continue;\n }\n\n prioritizedRecords.push(...weightedRandom(recordsByPrio));\n }\n\n return prioritizedRecords;\n}\n\nexport function weightedRandom(records: SrvRecord[]): SrvRecord[] {\n // Duplicate records so we don't accidentally change our caller's data\n const scratchRecords: SrvRecord[] = records.slice();\n const result: SrvRecord[] = [];\n\n while (scratchRecords.length > 0) {\n const weights: number[] = [];\n\n {\n for (let i = 0; i < scratchRecords.length; i++) {\n weights.push(\n scratchRecords[i].weight + (i > 0 ? scratchRecords[i - 1].weight : 0),\n );\n }\n }\n\n const point = Math.random() * weights[weights.length - 1];\n\n for (\n let selectedIndex = 0;\n selectedIndex < weights.length;\n selectedIndex++\n ) {\n if (weights[selectedIndex] > point) {\n // Remove our selected record and add it to the result\n result.push(scratchRecords.splice(selectedIndex, 1)[0]);\n break;\n }\n }\n }\n\n return result;\n}\n","/**\n * @packageDocumentation\n * Helpers for getting values from an Action's configuration.\n */\nimport * as actionsCore from \"@actions/core\";\n\n/**\n * Get a Boolean input from the Action's configuration by name.\n */\nconst getBool = (name: string): boolean => {\n return actionsCore.getBooleanInput(name);\n};\n\n/**\n * The character used to separate values in the input string.\n */\nexport type Separator = \"space\" | \"comma\";\n\n/**\n * Convert a comma-separated string input into an array of strings. If `comma` is selected,\n * all whitespace is removed from the string before converting to an array.\n */\nconst getArrayOfStrings = (name: string, separator: Separator): string[] => {\n const original = getString(name);\n return handleString(original, separator);\n};\n\n/**\n * Convert a string input into an array of strings or `null` if no value is set.\n */\nconst getArrayOfStringsOrNull = (\n name: string,\n separator: Separator,\n): string[] | null => {\n const original = getStringOrNull(name);\n if (original === null) {\n return null;\n } else {\n return handleString(original, separator);\n }\n};\n\n// Split out this function for use in testing\nexport const handleString = (input: string, separator: Separator): string[] => {\n const sepChar = separator === \"comma\" ? \",\" : /\\s+/;\n const trimmed = input.trim(); // Remove whitespace at the beginning and end\n if (trimmed === \"\") {\n return [];\n }\n\n return trimmed.split(sepChar).map((s: string) => s.trim());\n};\n\n/**\n * Get a multi-line string input from the Action's configuration by name or return `null` if not set.\n */\nconst getMultilineStringOrNull = (name: string): string[] | null => {\n const value = actionsCore.getMultilineInput(name);\n if (value.length === 0) {\n return null;\n } else {\n return value;\n }\n};\n\n/**\n * Get a number input from the Action's configuration by name or return `null` if not set.\n */\nconst getNumberOrNull = (name: string): number | null => {\n const value = actionsCore.getInput(name);\n if (value === \"\") {\n return null;\n } else {\n return Number(value);\n }\n};\n\n/**\n * Get a string input from the Action's configuration.\n */\nconst getString = (name: string): string => {\n return actionsCore.getInput(name);\n};\n\n/**\n * Get a string input from the Action's configuration by name or return `null` if not set.\n */\nconst getStringOrNull = (name: string): string | null => {\n const value = actionsCore.getInput(name);\n if (value === \"\") {\n return null;\n } else {\n return value;\n }\n};\n\n/**\n * Get a string input from the Action's configuration by name or return `undefined` if not set.\n */\nconst getStringOrUndefined = (name: string): string | undefined => {\n const value = actionsCore.getInput(name);\n if (value === \"\") {\n return undefined;\n } else {\n return value;\n }\n};\n\nexport {\n getBool,\n getArrayOfStrings,\n getArrayOfStringsOrNull,\n getMultilineStringOrNull,\n getNumberOrNull,\n getString,\n getStringOrNull,\n getStringOrUndefined,\n};\n","/**\n * @packageDocumentation\n * Helpers for determining system attributes of the current runner.\n */\nimport * as actionsCore from \"@actions/core\";\n\n/**\n * Get the current architecture plus OS. Examples include `X64-Linux` and `ARM64-macOS`.\n */\nexport function getArchOs(): string {\n const envArch = process.env.RUNNER_ARCH;\n const envOs = process.env.RUNNER_OS;\n\n if (envArch && envOs) {\n return `${envArch}-${envOs}`;\n } else {\n actionsCore.error(\n `Can't identify the platform: RUNNER_ARCH or RUNNER_OS undefined (${envArch}-${envOs})`,\n );\n throw new Error(\"RUNNER_ARCH and/or RUNNER_OS is not defined\");\n }\n}\n\n/**\n * Get the current Nix system. Examples include `x86_64-linux` and `aarch64-darwin`.\n */\nexport function getNixPlatform(archOs: string): string {\n const archOsMap: Map = new Map([\n [\"X64-macOS\", \"x86_64-darwin\"],\n [\"ARM64-macOS\", \"aarch64-darwin\"],\n [\"X64-Linux\", \"x86_64-linux\"],\n [\"ARM64-Linux\", \"aarch64-linux\"],\n ]);\n\n const mappedTo = archOsMap.get(archOs);\n if (mappedTo) {\n return mappedTo;\n } else {\n actionsCore.error(\n `ArchOs (${archOs}) doesn't map to a supported Nix platform.`,\n );\n throw new Error(\n `Cannot convert ArchOs (${archOs}) to a supported Nix platform.`,\n );\n }\n}\n","import { getStringOrUndefined } from \"./inputs.js\";\nimport * as actionsCore from \"@actions/core\";\n\nexport type SourceDef = {\n path?: string;\n url?: string;\n tag?: string;\n pr?: string;\n branch?: string;\n revision?: string;\n};\n\nexport function constructSourceParameters(legacyPrefix?: string): SourceDef {\n return {\n path: noisilyGetInput(\"path\", legacyPrefix),\n url: noisilyGetInput(\"url\", legacyPrefix),\n tag: noisilyGetInput(\"tag\", legacyPrefix),\n pr: noisilyGetInput(\"pr\", legacyPrefix),\n branch: noisilyGetInput(\"branch\", legacyPrefix),\n revision: noisilyGetInput(\"revision\", legacyPrefix),\n };\n}\n\nfunction noisilyGetInput(\n suffix: string,\n legacyPrefix: string | undefined,\n): string | undefined {\n const preferredInput = getStringOrUndefined(`source-${suffix}`);\n\n if (!legacyPrefix) {\n return preferredInput;\n }\n\n // Remaining is for handling cases where the legacy prefix\n // should be examined.\n const legacyInput = getStringOrUndefined(`${legacyPrefix}-${suffix}`);\n\n if (preferredInput && legacyInput) {\n actionsCore.warning(\n `The supported option source-${suffix} and the legacy option ${legacyPrefix}-${suffix} are both set. Preferring source-${suffix}. Please stop setting ${legacyPrefix}-${suffix}.`,\n );\n return preferredInput;\n } else if (legacyInput) {\n actionsCore.warning(\n `The legacy option ${legacyPrefix}-${suffix} is set. Please migrate to source-${suffix}.`,\n );\n return legacyInput;\n } else {\n return preferredInput;\n }\n}\n","/**\n * @packageDocumentation\n * Determinate Systems' TypeScript library for creating GitHub Actions logic.\n */\nimport { version as pkgVersion } from \"../package.json\";\nimport * as ghActionsCorePlatform from \"./actions-core-platform.js\";\nimport { CheckIn, Feature } from \"./check-in.js\";\nimport * as correlation from \"./correlation.js\";\nimport { IdsHost } from \"./ids-host.js\";\nimport { getBool, getStringOrNull } from \"./inputs.js\";\nimport * as platform from \"./platform.js\";\nimport { SourceDef, constructSourceParameters } from \"./sourcedef.js\";\nimport * as actionsCache from \"@actions/cache\";\nimport * as actionsCore from \"@actions/core\";\nimport * as actionsExec from \"@actions/exec\";\nimport { Got } from \"got\";\nimport { exec } from \"node:child_process\";\nimport { UUID, randomUUID } from \"node:crypto\";\nimport { PathLike, createWriteStream, readFileSync } from \"node:fs\";\nimport fs, { chmod, copyFile, mkdir } from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport { tmpdir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { promisify } from \"node:util\";\nimport { gzip } from \"node:zlib\";\n\nconst EVENT_EXCEPTION = \"exception\";\nconst EVENT_ARTIFACT_CACHE_HIT = \"artifact_cache_hit\";\nconst EVENT_ARTIFACT_CACHE_MISS = \"artifact_cache_miss\";\nconst EVENT_ARTIFACT_CACHE_PERSIST = \"artifact_cache_persist\";\nconst EVENT_PREFLIGHT_REQUIRE_NIX_DENIED = \"preflight-require-nix-denied\";\n\nconst FACT_ARTIFACT_FETCHED_FROM_CACHE = \"artifact_fetched_from_cache\";\nconst FACT_ENDED_WITH_EXCEPTION = \"ended_with_exception\";\nconst FACT_FINAL_EXCEPTION = \"final_exception\";\nconst FACT_OS = \"$os\";\nconst FACT_OS_VERSION = \"$os_version\";\nconst FACT_SOURCE_URL = \"source_url\";\nconst FACT_SOURCE_URL_ETAG = \"source_url_etag\";\n\nconst FACT_NIX_LOCATION = \"nix_location\";\nconst FACT_NIX_STORE_TRUST = \"nix_store_trusted\";\nconst FACT_NIX_STORE_VERSION = \"nix_store_version\";\nconst FACT_NIX_STORE_CHECK_METHOD = \"nix_store_check_method\";\nconst FACT_NIX_STORE_CHECK_ERROR = \"nix_store_check_error\";\n\nconst STATE_KEY_EXECUTION_PHASE = \"detsys_action_execution_phase\";\nconst STATE_KEY_NIX_NOT_FOUND = \"detsys_action_nix_not_found\";\nconst STATE_NOT_FOUND = \"not-found\";\n\nconst DIAGNOSTIC_ENDPOINT_TIMEOUT_MS = 30_000; // 30 seconds in milliseconds\nconst CHECK_IN_ENDPOINT_TIMEOUT_MS = 5_000; // 5 seconds in milliseconds\n\n/**\n * An enum for describing different \"fetch suffixes\" for i.d.s.\n *\n * - `nix-style` means that system names like `x86_64-linux` and `aarch64-darwin` are used\n * - `gh-env-style` means that names like `X64-Linux` and `ARM64-macOS` are used\n * - `universal` means that the suffix is the static `universal` (for non-system-specific things)\n */\nexport type FetchSuffixStyle = \"nix-style\" | \"gh-env-style\" | \"universal\";\n\n/**\n * GitHub Actions has two possible execution phases: `main` and `post`.\n */\nexport type ExecutionPhase = \"main\" | \"post\";\n\n/**\n * How to handle whether Nix is currently installed on the runner.\n *\n * - `fail` means that the workflow fails if Nix isn't installed\n * - `warn` means that a warning is logged if Nix isn't installed\n * - `ignore` means that Nix will not be checked\n */\nexport type NixRequirementHandling = \"fail\" | \"warn\" | \"ignore\";\n\n/**\n * Whether the Nix store on the runner is trusted.\n *\n * - `trusted` means yes\n * - `untrusted` means no\n * - `unknown` means that the status couldn't be determined\n *\n * This is determined via the output of `nix store info --json`.\n */\nexport type NixStoreTrust = \"trusted\" | \"untrusted\" | \"unknown\";\n\nexport type ActionOptions = {\n // Name of the project generally, and the name of the binary on disk.\n name: string;\n\n // Defaults to `name`, Corresponds to the ProjectHost entry on i.d.s.\n idsProjectName?: string;\n\n // Defaults to `action:`\n eventPrefix?: string;\n\n // The \"architecture\" URL component expected by I.D.S. for the ProjectHost.\n fetchStyle: FetchSuffixStyle;\n\n // IdsToolbox assumes the GitHub Action exposes source overrides, like branch/pr/etc. to be named `source-*`.\n // This prefix adds a fallback name, prefixed by `${legacySourcePrefix}-`.\n // Users who configure legacySourcePrefix will get warnings asking them to change to `source-*`.\n legacySourcePrefix?: string;\n\n // Check if Nix is installed before running this action.\n // If Nix isn't installed, this action will not fail, and will instead do nothing.\n // The action will emit a user-visible warning instructing them to install Nix.\n requireNix: NixRequirementHandling;\n\n // The URL suffix to send diagnostics events to.\n //\n // The final URL is constructed via IDS_HOST/idsProjectName/diagnosticsSuffix.\n //\n // Default: `diagnostics`.\n diagnosticsSuffix?: string;\n};\n\n/**\n * A confident version of Options, where defaults have been resolved into final values.\n */\nexport type ConfidentActionOptions = {\n name: string;\n idsProjectName: string;\n eventPrefix: string;\n fetchStyle: FetchSuffixStyle;\n legacySourcePrefix?: string;\n requireNix: NixRequirementHandling;\n providedDiagnosticsUrl?: URL;\n};\n\n/**\n * An event to send to the diagnostic endpoint of i.d.s.\n */\nexport type DiagnosticEvent = {\n // Note: putting a Map in here won't serialize to json properly.\n // It'll just be {} on serialization.\n event_name: string;\n context: Record;\n correlation: correlation.AnonymizedCorrelationHashes;\n facts: Record;\n features: { [k: string]: string | boolean };\n timestamp: Date;\n uuid: UUID;\n};\n\nexport abstract class DetSysAction {\n nixStoreTrust: NixStoreTrust;\n strictMode: boolean;\n\n private actionOptions: ConfidentActionOptions;\n private exceptionAttachments: Map;\n private archOs: string;\n private executionPhase: ExecutionPhase;\n private nixSystem: string;\n private architectureFetchSuffix: string;\n private sourceParameters: SourceDef;\n private facts: Record;\n private events: DiagnosticEvent[];\n private identity: correlation.AnonymizedCorrelationHashes;\n private idsHost: IdsHost;\n private features: { [k: string]: Feature };\n private featureEventMetadata: { [k: string]: string | boolean };\n\n private determineExecutionPhase(): ExecutionPhase {\n const currentPhase = actionsCore.getState(STATE_KEY_EXECUTION_PHASE);\n if (currentPhase === \"\") {\n actionsCore.saveState(STATE_KEY_EXECUTION_PHASE, \"post\");\n return \"main\";\n } else {\n return \"post\";\n }\n }\n\n constructor(actionOptions: ActionOptions) {\n this.actionOptions = makeOptionsConfident(actionOptions);\n this.idsHost = new IdsHost(\n this.actionOptions.idsProjectName,\n actionOptions.diagnosticsSuffix,\n // Note: we don't use actionsCore.getInput('diagnostic-endpoint') on purpose:\n // getInput silently converts absent data to an empty string.\n process.env[\"INPUT_DIAGNOSTIC-ENDPOINT\"],\n );\n this.exceptionAttachments = new Map();\n this.nixStoreTrust = \"unknown\";\n this.strictMode = getBool(\"_internal-strict-mode\");\n\n this.features = {};\n this.featureEventMetadata = {};\n this.events = [];\n\n // JSON sent to server\n /* eslint-disable camelcase */\n this.facts = {\n $lib: \"idslib\",\n $lib_version: pkgVersion,\n project: this.actionOptions.name,\n ids_project: this.actionOptions.idsProjectName,\n };\n\n const params = [\n [\"github_action_ref\", \"GITHUB_ACTION_REF\"],\n [\"github_action_repository\", \"GITHUB_ACTION_REPOSITORY\"],\n [\"github_event_name\", \"GITHUB_EVENT_NAME\"],\n [\"$os\", \"RUNNER_OS\"],\n [\"arch\", \"RUNNER_ARCH\"],\n ];\n for (const [target, env] of params) {\n const value = process.env[env];\n if (value) {\n this.facts[target] = value;\n }\n }\n\n this.identity = correlation.identify(this.actionOptions.name);\n this.archOs = platform.getArchOs();\n this.nixSystem = platform.getNixPlatform(this.archOs);\n\n this.facts.arch_os = this.archOs;\n this.facts.nix_system = this.nixSystem;\n\n {\n ghActionsCorePlatform\n .getDetails()\n // eslint-disable-next-line github/no-then\n .then((details) => {\n if (details.name !== \"unknown\") {\n this.addFact(FACT_OS, details.name);\n }\n if (details.version !== \"unknown\") {\n this.addFact(FACT_OS_VERSION, details.version);\n }\n })\n // eslint-disable-next-line github/no-then\n .catch((e: unknown) => {\n actionsCore.debug(\n `Failure getting platform details: ${stringifyError(e)}`,\n );\n });\n }\n\n this.executionPhase = this.determineExecutionPhase();\n this.facts.execution_phase = this.executionPhase;\n\n if (this.actionOptions.fetchStyle === \"gh-env-style\") {\n this.architectureFetchSuffix = this.archOs;\n } else if (this.actionOptions.fetchStyle === \"nix-style\") {\n this.architectureFetchSuffix = this.nixSystem;\n } else if (this.actionOptions.fetchStyle === \"universal\") {\n this.architectureFetchSuffix = \"universal\";\n } else {\n throw new Error(\n `fetchStyle ${this.actionOptions.fetchStyle} is not a valid style`,\n );\n }\n\n this.sourceParameters = constructSourceParameters(\n this.actionOptions.legacySourcePrefix,\n );\n\n this.recordEvent(`begin_${this.executionPhase}`);\n }\n\n /**\n * Attach a file to the diagnostics data in error conditions.\n *\n * The file at `location` doesn't need to exist when stapleFile is called.\n *\n * If the file doesn't exist or is unreadable when trying to staple the attachments, the JS error will be stored in a context value at `staple_failure_{name}`.\n * If the file is readable, the file's contents will be stored in a context value at `staple_value_{name}`.\n */\n stapleFile(name: string, location: string): void {\n this.exceptionAttachments.set(name, location);\n }\n\n /**\n * The main execution phase.\n */\n abstract main(): Promise;\n\n /**\n * The post execution phase.\n */\n abstract post(): Promise;\n\n /**\n * Execute the Action as defined.\n */\n execute(): void {\n // eslint-disable-next-line github/no-then\n this.executeAsync().catch((error: Error) => {\n // eslint-disable-next-line no-console\n console.log(error);\n process.exitCode = 1;\n });\n }\n\n getTemporaryName(): string {\n const tmpDir = process.env[\"RUNNER_TEMP\"] || tmpdir();\n return path.join(tmpDir, `${this.actionOptions.name}-${randomUUID()}`);\n }\n\n addFact(key: string, value: string | boolean): void {\n this.facts[key] = value;\n }\n\n async getDiagnosticsUrl(): Promise {\n return await this.idsHost.getDiagnosticsUrl();\n }\n\n getUniqueId(): string {\n return (\n this.identity.run_differentiator ||\n process.env.RUNNER_TRACKING_ID ||\n randomUUID()\n );\n }\n\n getCorrelationHashes(): correlation.AnonymizedCorrelationHashes {\n return this.identity;\n }\n\n recordEvent(eventName: string, context: Record = {}): void {\n const prefixedName =\n eventName === \"$feature_flag_called\"\n ? eventName\n : `${this.actionOptions.eventPrefix}${eventName}`;\n this.events.push({\n event_name: prefixedName,\n context,\n correlation: this.identity,\n facts: this.facts,\n features: this.featureEventMetadata,\n timestamp: new Date(),\n uuid: randomUUID(),\n });\n }\n\n /**\n * Unpacks the closure returned by `fetchArtifact()`, imports the\n * contents into the Nix store, and returns the path of the executable at\n * `/nix/store/STORE_PATH/bin/${bin}`.\n */\n async unpackClosure(bin: string): Promise {\n const artifact = await this.fetchArtifact();\n const { stdout } = await promisify(exec)(\n `cat \"${artifact}\" | xz -d | nix-store --import`,\n );\n const paths = stdout.split(os.EOL);\n const lastPath = paths.at(-2);\n return `${lastPath}/bin/${bin}`;\n }\n\n /**\n * Fetches the executable at the URL determined by the `source-*` inputs and\n * other facts, `chmod`s it, and returns the path to the executable on disk.\n */\n async fetchExecutable(): Promise {\n const binaryPath = await this.fetchArtifact();\n await chmod(binaryPath, fs.constants.S_IXUSR | fs.constants.S_IXGRP);\n return binaryPath;\n }\n\n private get isMain(): boolean {\n return this.executionPhase === \"main\";\n }\n\n private get isPost(): boolean {\n return this.executionPhase === \"post\";\n }\n\n private async executeAsync(): Promise {\n try {\n await this.checkIn();\n\n process.env.DETSYS_CORRELATION = JSON.stringify(\n this.getCorrelationHashes(),\n );\n\n if (!(await this.preflightRequireNix())) {\n this.recordEvent(EVENT_PREFLIGHT_REQUIRE_NIX_DENIED);\n return;\n } else {\n await this.preflightNixStoreInfo();\n this.addFact(FACT_NIX_STORE_TRUST, this.nixStoreTrust);\n }\n\n if (this.isMain) {\n await this.main();\n } else if (this.isPost) {\n await this.post();\n }\n this.addFact(FACT_ENDED_WITH_EXCEPTION, false);\n } catch (e: unknown) {\n this.addFact(FACT_ENDED_WITH_EXCEPTION, true);\n\n const reportable = stringifyError(e);\n\n this.addFact(FACT_FINAL_EXCEPTION, reportable);\n\n if (this.isPost) {\n actionsCore.warning(reportable);\n } else {\n actionsCore.setFailed(reportable);\n }\n\n const doGzip = promisify(gzip);\n\n const exceptionContext: Map = new Map();\n for (const [attachmentLabel, filePath] of this.exceptionAttachments) {\n try {\n const logText = readFileSync(filePath);\n const buf = await doGzip(logText);\n exceptionContext.set(\n `staple_value_${attachmentLabel}`,\n buf.toString(\"base64\"),\n );\n } catch (innerError: unknown) {\n exceptionContext.set(\n `staple_failure_${attachmentLabel}`,\n stringifyError(innerError),\n );\n }\n }\n\n this.recordEvent(EVENT_EXCEPTION, Object.fromEntries(exceptionContext));\n } finally {\n await this.complete();\n }\n }\n\n async getClient(): Promise {\n return await this.idsHost.getGot((prevUrl: URL, nextUrl: URL) => {\n this.recordEvent(\"ids-failover\", {\n previousUrl: prevUrl.toString(),\n nextUrl: nextUrl.toString(),\n });\n });\n }\n\n private async checkIn(): Promise {\n const checkin = await this.requestCheckIn();\n if (checkin === undefined) {\n return;\n }\n\n this.features = checkin.options;\n for (const [key, feature] of Object.entries(this.features)) {\n this.featureEventMetadata[key] = feature.variant;\n }\n\n const impactSymbol: Map = new Map([\n [\"none\", \"⚪\"],\n [\"maintenance\", \"🛠️\"],\n [\"minor\", \"🟡\"],\n [\"major\", \"🟠\"],\n [\"critical\", \"🔴\"],\n ]);\n const defaultImpactSymbol = \"🔵\";\n\n if (checkin.status !== null) {\n const summaries: string[] = [];\n\n for (const incident of checkin.status.incidents) {\n summaries.push(\n `${impactSymbol.get(incident.impact) || defaultImpactSymbol} ${incident.status.replace(\"_\", \" \")}: ${incident.name} (${incident.shortlink})`,\n );\n }\n\n for (const maintenance of checkin.status.scheduled_maintenances) {\n summaries.push(\n `${impactSymbol.get(maintenance.impact) || defaultImpactSymbol} ${maintenance.status.replace(\"_\", \" \")}: ${maintenance.name} (${maintenance.shortlink})`,\n );\n }\n\n if (summaries.length > 0) {\n actionsCore.info(\n // Bright red, Bold, Underline\n `${\"\\u001b[0;31m\"}${\"\\u001b[1m\"}${\"\\u001b[4m\"}${checkin.status.page.name} Status`,\n );\n for (const notice of summaries) {\n actionsCore.info(notice);\n }\n actionsCore.info(`See: ${checkin.status.page.url}`);\n actionsCore.info(``);\n }\n }\n }\n\n getFeature(name: string): Feature | undefined {\n if (!this.features.hasOwnProperty(name)) {\n return undefined;\n }\n\n const result = this.features[name];\n if (result === undefined) {\n return undefined;\n }\n\n this.recordEvent(\"$feature_flag_called\", {\n $feature_flag: name,\n $feature_flag_response: result.variant,\n });\n\n return result;\n }\n\n /**\n * Check in to install.determinate.systems, to accomplish three things:\n *\n * 1. Preflight the server selected from IdsHost, to increase the chances of success.\n * 2. Fetch any incidents and maintenance events to let users know in case things are weird.\n * 3. Get feature flag data so we can gently roll out new features.\n */\n private async requestCheckIn(): Promise {\n for (\n let attemptsRemaining = 5;\n attemptsRemaining > 0;\n attemptsRemaining--\n ) {\n const checkInUrl = await this.getCheckInUrl();\n if (checkInUrl === undefined) {\n return undefined;\n }\n\n try {\n actionsCore.debug(`Preflighting via ${checkInUrl}`);\n\n checkInUrl.searchParams.set(\"ci\", \"github\");\n checkInUrl.searchParams.set(\n \"correlation\",\n JSON.stringify(this.identity),\n );\n\n return (await this.getClient())\n .get(checkInUrl, {\n timeout: {\n request: CHECK_IN_ENDPOINT_TIMEOUT_MS,\n },\n })\n .json();\n } catch (e: unknown) {\n actionsCore.debug(`Error checking in: ${stringifyError(e)}`);\n this.idsHost.markCurrentHostBroken();\n }\n }\n\n return undefined;\n }\n\n /**\n * Fetch an artifact, such as a tarball, from the location determined by the\n * `source-*` inputs. If `source-binary` is specified, this will return a path\n * to a binary on disk; otherwise, the artifact will be downloaded from the\n * URL determined by the other `source-*` inputs (`source-url`, `source-pr`,\n * etc.).\n */\n private async fetchArtifact(): Promise {\n const sourceBinary = getStringOrNull(\"source-binary\");\n\n // If source-binary is set, use that. Otherwise fall back to the source-* parameters.\n if (sourceBinary !== null && sourceBinary !== \"\") {\n actionsCore.debug(`Using the provided source binary at ${sourceBinary}`);\n return sourceBinary;\n }\n\n actionsCore.startGroup(\n `Downloading ${this.actionOptions.name} for ${this.architectureFetchSuffix}`,\n );\n\n try {\n actionsCore.info(`Fetching from ${await this.getSourceUrl()}`);\n\n const correlatedUrl = await this.getSourceUrl();\n correlatedUrl.searchParams.set(\"ci\", \"github\");\n correlatedUrl.searchParams.set(\n \"correlation\",\n JSON.stringify(this.identity),\n );\n\n const versionCheckup = await (await this.getClient()).head(correlatedUrl);\n if (versionCheckup.headers.etag) {\n const v = versionCheckup.headers.etag;\n this.addFact(FACT_SOURCE_URL_ETAG, v);\n\n actionsCore.debug(\n `Checking the tool cache for ${await this.getSourceUrl()} at ${v}`,\n );\n const cached = await this.getCachedVersion(v);\n if (cached) {\n this.facts[FACT_ARTIFACT_FETCHED_FROM_CACHE] = true;\n actionsCore.debug(`Tool cache hit.`);\n return cached;\n }\n }\n\n this.facts[FACT_ARTIFACT_FETCHED_FROM_CACHE] = false;\n\n actionsCore.debug(\n `No match from the cache, re-fetching from the redirect: ${versionCheckup.url}`,\n );\n\n const destFile = this.getTemporaryName();\n const fetchStream = (await this.getClient()).stream(versionCheckup.url);\n\n await pipeline(\n fetchStream,\n createWriteStream(destFile, {\n encoding: \"binary\",\n mode: 0o755,\n }),\n );\n\n if (fetchStream.response?.headers.etag) {\n const v = fetchStream.response.headers.etag;\n\n try {\n await this.saveCachedVersion(v, destFile);\n } catch (e: unknown) {\n actionsCore.debug(`Error caching the artifact: ${stringifyError(e)}`);\n }\n }\n\n return destFile;\n } finally {\n actionsCore.endGroup();\n }\n }\n\n /**\n * A helper function for failing on error only if strict mode is enabled.\n * This is intended only for CI environments testing Actions themselves.\n */\n failOnError(msg: string): void {\n if (this.strictMode) {\n actionsCore.setFailed(`strict mode failure: ${msg}`);\n }\n }\n\n private async complete(): Promise {\n this.recordEvent(`complete_${this.executionPhase}`);\n await this.submitEvents();\n }\n\n private async getCheckInUrl(): Promise {\n const checkInUrl = await this.idsHost.getDynamicRootUrl();\n\n if (checkInUrl === undefined) {\n return undefined;\n }\n\n checkInUrl.pathname += \"check-in\";\n return checkInUrl;\n }\n\n private async getSourceUrl(): Promise {\n const p = this.sourceParameters;\n\n if (p.url) {\n this.addFact(FACT_SOURCE_URL, p.url);\n return new URL(p.url);\n }\n\n const fetchUrl = await this.idsHost.getRootUrl();\n fetchUrl.pathname += this.actionOptions.idsProjectName;\n\n if (p.tag) {\n fetchUrl.pathname += `/tag/${p.tag}`;\n } else if (p.pr) {\n fetchUrl.pathname += `/pr/${p.pr}`;\n } else if (p.branch) {\n fetchUrl.pathname += `/branch/${p.branch}`;\n } else if (p.revision) {\n fetchUrl.pathname += `/rev/${p.revision}`;\n } else {\n fetchUrl.pathname += `/stable`;\n }\n\n fetchUrl.pathname += `/${this.architectureFetchSuffix}`;\n\n this.addFact(FACT_SOURCE_URL, fetchUrl.toString());\n\n return fetchUrl;\n }\n\n private cacheKey(version: string): string {\n const cleanedVersion = version.replace(/[^a-zA-Z0-9-+.]/g, \"\");\n return `determinatesystem-${this.actionOptions.name}-${this.architectureFetchSuffix}-${cleanedVersion}`;\n }\n\n private async getCachedVersion(version: string): Promise {\n const startCwd = process.cwd();\n\n try {\n const tempDir = this.getTemporaryName();\n await mkdir(tempDir);\n process.chdir(tempDir);\n\n // extremely evil shit right here:\n process.env.GITHUB_WORKSPACE_BACKUP = process.env.GITHUB_WORKSPACE;\n delete process.env.GITHUB_WORKSPACE;\n\n if (\n await actionsCache.restoreCache(\n [this.actionOptions.name],\n this.cacheKey(version),\n [],\n undefined,\n true,\n )\n ) {\n this.recordEvent(EVENT_ARTIFACT_CACHE_HIT);\n return `${tempDir}/${this.actionOptions.name}`;\n }\n\n this.recordEvent(EVENT_ARTIFACT_CACHE_MISS);\n return undefined;\n } finally {\n process.env.GITHUB_WORKSPACE = process.env.GITHUB_WORKSPACE_BACKUP;\n delete process.env.GITHUB_WORKSPACE_BACKUP;\n process.chdir(startCwd);\n }\n }\n\n private async saveCachedVersion(\n version: string,\n toolPath: string,\n ): Promise {\n const startCwd = process.cwd();\n\n try {\n const tempDir = this.getTemporaryName();\n await mkdir(tempDir);\n process.chdir(tempDir);\n await copyFile(toolPath, `${tempDir}/${this.actionOptions.name}`);\n\n // extremely evil shit right here:\n process.env.GITHUB_WORKSPACE_BACKUP = process.env.GITHUB_WORKSPACE;\n delete process.env.GITHUB_WORKSPACE;\n\n await actionsCache.saveCache(\n [this.actionOptions.name],\n this.cacheKey(version),\n undefined,\n true,\n );\n this.recordEvent(EVENT_ARTIFACT_CACHE_PERSIST);\n } finally {\n process.env.GITHUB_WORKSPACE = process.env.GITHUB_WORKSPACE_BACKUP;\n delete process.env.GITHUB_WORKSPACE_BACKUP;\n process.chdir(startCwd);\n }\n }\n\n private async preflightRequireNix(): Promise {\n let nixLocation: string | undefined;\n\n const pathParts = (process.env[\"PATH\"] || \"\").split(\":\");\n for (const location of pathParts) {\n const candidateNix = path.join(location, \"nix\");\n\n try {\n await fs.access(candidateNix, fs.constants.X_OK);\n actionsCore.debug(`Found Nix at ${candidateNix}`);\n nixLocation = candidateNix;\n break;\n } catch {\n actionsCore.debug(`Nix not at ${candidateNix}`);\n }\n }\n this.addFact(FACT_NIX_LOCATION, nixLocation || \"\");\n\n if (this.actionOptions.requireNix === \"ignore\") {\n return true;\n }\n\n const currentNotFoundState = actionsCore.getState(STATE_KEY_NIX_NOT_FOUND);\n if (currentNotFoundState === STATE_NOT_FOUND) {\n // It was previously not found, so don't run subsequent actions\n return false;\n }\n\n if (nixLocation !== undefined) {\n return true;\n }\n actionsCore.saveState(STATE_KEY_NIX_NOT_FOUND, STATE_NOT_FOUND);\n\n switch (this.actionOptions.requireNix) {\n case \"fail\":\n actionsCore.setFailed(\n [\n \"This action can only be used when Nix is installed.\",\n \"Add `- uses: DeterminateSystems/nix-installer-action@main` earlier in your workflow.\",\n ].join(\" \"),\n );\n break;\n case \"warn\":\n actionsCore.warning(\n [\n \"This action is in no-op mode because Nix is not installed.\",\n \"Add `- uses: DeterminateSystems/nix-installer-action@main` earlier in your workflow.\",\n ].join(\" \"),\n );\n break;\n }\n\n return false;\n }\n\n private async preflightNixStoreInfo(): Promise {\n let output = \"\";\n\n const options: actionsExec.ExecOptions = {};\n options.silent = true;\n options.listeners = {\n stdout: (data) => {\n output += data.toString();\n },\n };\n\n try {\n output = \"\";\n await actionsExec.exec(\"nix\", [\"store\", \"info\", \"--json\"], options);\n this.addFact(FACT_NIX_STORE_CHECK_METHOD, \"info\");\n } catch {\n try {\n // reset output\n output = \"\";\n await actionsExec.exec(\"nix\", [\"store\", \"ping\", \"--json\"], options);\n this.addFact(FACT_NIX_STORE_CHECK_METHOD, \"ping\");\n } catch {\n this.addFact(FACT_NIX_STORE_CHECK_METHOD, \"none\");\n return;\n }\n }\n\n try {\n const parsed = JSON.parse(output);\n if (parsed.trusted === 1) {\n this.nixStoreTrust = \"trusted\";\n } else if (parsed.trusted === 0) {\n this.nixStoreTrust = \"untrusted\";\n } else if (parsed.trusted !== undefined) {\n this.addFact(\n FACT_NIX_STORE_CHECK_ERROR,\n `Mysterious trusted value: ${JSON.stringify(parsed.trusted)}`,\n );\n }\n\n this.addFact(FACT_NIX_STORE_VERSION, JSON.stringify(parsed.version));\n } catch (e: unknown) {\n this.addFact(FACT_NIX_STORE_CHECK_ERROR, stringifyError(e));\n }\n }\n\n private async submitEvents(): Promise {\n const diagnosticsUrl = await this.idsHost.getDiagnosticsUrl();\n if (diagnosticsUrl === undefined) {\n actionsCore.debug(\n \"Diagnostics are disabled. Not sending the following events:\",\n );\n actionsCore.debug(JSON.stringify(this.events, undefined, 2));\n return;\n }\n\n const batch = {\n type: \"eventlog\",\n sent_at: new Date(),\n events: this.events,\n };\n\n try {\n await (\n await this.getClient()\n ).post(diagnosticsUrl, {\n json: batch,\n timeout: {\n request: DIAGNOSTIC_ENDPOINT_TIMEOUT_MS,\n },\n });\n } catch (err: unknown) {\n actionsCore.debug(\n `Error submitting diagnostics event to ${diagnosticsUrl}: ${stringifyError(err)}`,\n );\n }\n this.events = [];\n }\n}\n\nfunction stringifyError(error: unknown): string {\n return error instanceof Error || typeof error == \"string\"\n ? error.toString()\n : JSON.stringify(error);\n}\n\nfunction makeOptionsConfident(\n actionOptions: ActionOptions,\n): ConfidentActionOptions {\n const idsProjectName = actionOptions.idsProjectName ?? actionOptions.name;\n\n const finalOpts: ConfidentActionOptions = {\n name: actionOptions.name,\n idsProjectName,\n eventPrefix: actionOptions.eventPrefix || \"action:\",\n fetchStyle: actionOptions.fetchStyle,\n legacySourcePrefix: actionOptions.legacySourcePrefix,\n requireNix: actionOptions.requireNix,\n };\n\n actionsCore.debug(\"idslib options:\");\n actionsCore.debug(JSON.stringify(finalOpts, undefined, 2));\n\n return finalOpts;\n}\n\n// Public exports from other files\nexport {\n CheckIn,\n Feature,\n Incident,\n Maintenance,\n Page,\n StatusSummary,\n} from \"./check-in.js\";\nexport { AnonymizedCorrelationHashes } from \"./correlation.js\";\nexport { stringifyError } from \"./errors.js\";\nexport { IdsHost } from \"./ids-host.js\";\nexport { SourceDef } from \"./sourcedef.js\";\nexport * as inputs from \"./inputs.js\";\nexport * as platform from \"./platform.js\";\n"],"mappings":"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","names":["error","os","version","platform","arch","actionsCore","actionsCore","error","actionsCore","actionsCore","actionsCore","actionsCore","exec","readFileSync","fs","os","promisify","stringifyError","error","promisify","exec","fs","readFileSync","version"]} \ No newline at end of file diff --git a/src/ids-host.test.ts b/src/ids-host.test.ts index ee4432b..be892d2 100644 --- a/src/ids-host.test.ts +++ b/src/ids-host.test.ts @@ -5,7 +5,7 @@ import { recordToUrl, weightedRandom, } from "./ids-host.js"; -import { SrvRecord } from "node:dns"; +import type { SrvRecord } from "node:dns"; import { assert, describe, expect, test } from "vitest"; function mkRecord( diff --git a/src/ids-host.ts b/src/ids-host.ts index 839d702..a26c136 100644 --- a/src/ids-host.ts +++ b/src/ids-host.ts @@ -5,7 +5,7 @@ import { stringifyError } from "./errors.js"; import * as actionsCore from "@actions/core"; import got, { Got } from "got"; -import { SrvRecord } from "node:dns"; +import type { SrvRecord } from "node:dns"; import { resolveSrv } from "node:dns/promises"; const DEFAULT_LOOKUP = "_detsys_ids._tcp.install.determinate.systems."; @@ -27,7 +27,6 @@ export class IdsHost { private diagnosticsSuffix?: string; private runtimeDiagnosticsUrl?: string; private prioritizedURLs?: URL[]; - private records?: SrvRecord[]; private client?: Got; constructor( diff --git a/tsup.config.ts b/tsup.config.ts index 14b9b14..ef7c9fe 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -10,6 +10,6 @@ export default defineConfig({ sourcemap: true, clean: true, dts: { - resolve: true, + resolve: false, }, });