Частичный ответ: мне удалось переписать эту функцию, используя только Either
без Promise
.Я все еще очень заинтересован в альтернативных решениях.
export const md5 = (path: string): Either<string, string> => {
const BUFFER_SIZE = 8192;
let fd;
try {
fd = openSync(path, "r");
const buffer = Buffer.alloc(BUFFER_SIZE);
const hash = createHash("md5");
let bytesRead;
do {
bytesRead = readSync(fd, buffer, 0, BUFFER_SIZE, 0);
hash.update(buffer.slice(0, bytesRead));
} while (bytesRead === BUFFER_SIZE);
return right(hash.digest("hex"));
} catch (error) {
return left(error.message);
} finally {
if (fd !== undefined) {
closeSync(fd);
}
}
};
it("should return right and create md5 hash for a file", () => {
const mk = md5(fileName);
assert.strictEqual(mk.isLeft(), false);
assert.strictEqual(mk.isRight(), true);
assert.strictEqual(mk.value, "SS8dd3ad07e6a93ded72b823b19dd877");
});
it("should return left return an error message", () => {
const mk = md5(BAD_PATH);
assert.strictEqual(mk.isLeft(), true);
assert.strictEqual(mk.isRight(), false);
assert.strictEqual(mk.value.includes("ENOENT"), true);
});