Merge pull request #23 from hlqviet/refactor/domain-process

Domain process code refactor
This commit is contained in:
mrrfv
2023-09-17 17:23:28 +02:00
committed by GitHub
8 changed files with 266 additions and 139 deletions
+19
View File
@@ -44,3 +44,22 @@ const request = async (url, options) => {
*/
export const requestGateway = (path, options) =>
request(`${API_HOST}/accounts/${ACCOUNT_ID}/gateway${path}`, options);
/**
* Normalizes a domain.
* @param {string} value The value to be normalized.
* @param {boolean} isAllowlisting Whether the value is to be whitelisted.
* @returns {string}
*/
export const normalizeDomain = (value, isAllowlisting) => {
const normalized = value
.replace(/(0\.0\.0\.0|127\.0\.0\.1|::1|::)\s+/, "")
.replace("||", "")
.replace("^$important", "")
.replace("*.", "")
.replace("^", "");
if (isAllowlisting) return normalized.replace("@@||", "");
return normalized;
};
+66 -5
View File
@@ -1,3 +1,8 @@
import { once } from "events";
import { createReadStream } from "fs";
import { basename } from "path";
import { createInterface } from "readline";
/**
* Sleeps for a specified amount of time.
* @param {number} [ms=350] The amount of time in ms.
@@ -6,9 +11,65 @@ export const sleep = (ms = 350) =>
new Promise((resolve) => setTimeout(resolve, ms));
/**
* Truncates an array to the specified size.
* @param {any[]} arr The array to be truncated.
* @param {number} size The size to which the array will be truncated.
* @returns {any[]}
* Checks if the value is a valid domain.
* @param {string} value The value to be checked.
*/
export const truncateArray = (arr, size) => arr.slice(0, size);
export const isValidDomain = (value) =>
/^(?!-)[A-Za-z0-9-]+([\-\.]{1}[a-z0-9]+)*\.[A-Za-z]{2,6}$/.test(value);
/**
* Extracts all subdomains from a domain including itself.
* @param {string} domain The domain to be extracted.
* @returns {string[]}
*/
export const extractDomain = (domain) =>
domain.split(".").reduce((previous, current, index, array) => {
const nextIndex = index + 1;
if (nextIndex > array.length - 1) return previous;
const domain = [current, ...array.slice(nextIndex)].join(".");
previous.push(domain);
return previous;
}, []);
/**
* Checks if the value is a comment.
* @param {string} value The value to be checked.
*/
export const isComment = (value) =>
value.startsWith("#") ||
value.startsWith("//") ||
value.startsWith("!") ||
value.startsWith("/*") ||
value.startsWith("*/");
/**
* @callback onLine
* @param {string} line The current line.
* @param {ReturnType<createInterface>} rl The readline interface.
*/
/**
* Asynchronously reads a file line by line.
* @param {string} filePath The path to the file.
* @param {onLine} onLine The callback executed on each line read.
*/
export const readFile = async (filePath, onLine) => {
try {
const rl = createInterface({
input: createReadStream(filePath),
crlfDelay: Infinity,
});
rl.on("line", (line) => onLine(line, rl));
await once(rl, "close");
} catch (err) {
console.error(
`Error occurred while reading ${basename(filePath)} - ${err.toString()}`
);
}
};