lambda-live-debugger
Version:
Debug Lambda functions locally like it is running in the cloud
130 lines (119 loc) • 4.88 kB
JavaScript
;
var node_os = require('node:os');
var node_process = require('node:process');
var promises = require('node:fs/promises');
var node_path = require('node:path');
var middlewareUserAgent = require('@aws-sdk/middleware-user-agent');
const getRuntimeUserAgentPair = () => {
const runtimesToCheck = ["deno", "bun", "llrt"];
for (const runtime of runtimesToCheck) {
if (node_process.versions[runtime]) {
return [`md/${runtime}`, node_process.versions[runtime]];
}
}
return ["md/nodejs", node_process.versions.node];
};
const SEMVER_REGEX = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;
const getSanitizedTypeScriptVersion = (version = "") => {
const match = version.match(SEMVER_REGEX);
if (!match) {
return undefined;
}
const [major, minor, patch, prerelease] = [match[1], match[2], match[3], match[4]];
return prerelease ? `${major}.${minor}.${patch}-${prerelease}` : `${major}.${minor}.${patch}`;
};
const typescriptPackageJsonPath = node_path.join("node_modules", "typescript", "package.json");
const getTypeScriptPackageJsonPaths = (dirname) => {
const cwdPath = node_path.join(process.cwd(), typescriptPackageJsonPath);
if (!dirname) {
return [cwdPath];
}
const normalizedPath = node_path.normalize(dirname);
const parts = normalizedPath.split(node_path.sep);
const nodeModulesIndex = parts.indexOf("node_modules");
const parentDir = nodeModulesIndex !== -1 ? parts.slice(0, nodeModulesIndex).join(node_path.sep) : dirname;
const parentDirPath = node_path.join(parentDir, typescriptPackageJsonPath);
if (cwdPath === parentDirPath) {
return [cwdPath];
}
return [parentDirPath, cwdPath];
};
let tscVersion;
const getTypeScriptUserAgentPair = async () => {
if (tscVersion === null) {
return undefined;
}
else if (typeof tscVersion === "string") {
return ["md/tsc", tscVersion];
}
const dirname = typeof __dirname !== "undefined" ? __dirname : undefined;
for (const typescriptPackageJsonPath of getTypeScriptPackageJsonPaths(dirname)) {
try {
const packageJson = await promises.readFile(typescriptPackageJsonPath, "utf-8");
const { version } = JSON.parse(packageJson);
const sanitizedVersion = getSanitizedTypeScriptVersion(version);
if (typeof sanitizedVersion !== "string") {
continue;
}
tscVersion = sanitizedVersion;
return ["md/tsc", tscVersion];
}
catch {
}
}
tscVersion = null;
return undefined;
};
const crtAvailability = {
isCrtAvailable: false,
};
const isCrtAvailable = () => {
if (crtAvailability.isCrtAvailable) {
return ["md/crt-avail"];
}
return null;
};
const createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => {
const runtimeUserAgentPair = getRuntimeUserAgentPair();
return async (config) => {
const sections = [
["aws-sdk-js", clientVersion],
["ua", "2.1"],
[`os/${node_os.platform()}`, node_os.release()],
["lang/js"],
runtimeUserAgentPair,
];
const typescriptUserAgentPair = await getTypeScriptUserAgentPair();
if (typescriptUserAgentPair) {
sections.push(typescriptUserAgentPair);
}
const crtAvailable = isCrtAvailable();
if (crtAvailable) {
sections.push(crtAvailable);
}
if (serviceId) {
sections.push([`api/${serviceId}`, clientVersion]);
}
if (node_process.env.AWS_EXECUTION_ENV) {
sections.push([`exec-env/${node_process.env.AWS_EXECUTION_ENV}`]);
}
const appId = await config?.userAgentAppId?.();
const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections];
return resolvedUserAgent;
};
};
const defaultUserAgent = createDefaultUserAgentProvider;
const UA_APP_ID_ENV_NAME = "AWS_SDK_UA_APP_ID";
const UA_APP_ID_INI_NAME = "sdk_ua_app_id";
const UA_APP_ID_INI_NAME_DEPRECATED = "sdk-ua-app-id";
const NODE_APP_ID_CONFIG_OPTIONS = {
environmentVariableSelector: (env) => env[UA_APP_ID_ENV_NAME],
configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED],
default: middlewareUserAgent.DEFAULT_UA_APP_ID,
};
exports.NODE_APP_ID_CONFIG_OPTIONS = NODE_APP_ID_CONFIG_OPTIONS;
exports.UA_APP_ID_ENV_NAME = UA_APP_ID_ENV_NAME;
exports.UA_APP_ID_INI_NAME = UA_APP_ID_INI_NAME;
exports.createDefaultUserAgentProvider = createDefaultUserAgentProvider;
exports.crtAvailability = crtAvailability;
exports.defaultUserAgent = defaultUserAgent;