```ts
export function maskFromPrefix(prefix: number): string {
  if (!Number.isInteger(prefix) || prefix < 0 || prefix > 32) {
    throw new Error("Invalid prefix");
  }
  const ones = "1".repeat(prefix);
  const zeros = "0".repeat(32 - prefix);
  return `${ones.padEnd(32, '0').slice(0, 8)}.${ones.slice(8).padEnd(32, '0').slice(0, 8)}.${ones.slice(16).padEnd(32, '0').slice(0, 8)}.${ones.slice(24)}`;
}

export function prefixFromMask(mask: string): number {
  if (typeof mask !== "string") {
    throw new Error("Invalid mask");
  }
  const parts = mask.split(".");
  if (parts.length !== 4) {
    throw new Error("Invalid mask");
  }
  let leadingOnes = 0;
  for (let part of parts) {
    if (!/^\d+$/.test(part)) {
      throw new Error("Invalid mask");
    }
    const num = parseInt(part);
    if (num > 255) {
      throw new Error("Invalid mask");
    }
    if (num === 0) {
      break;
    }
    leadingOnes += Math.floor(Math.log2(num + 1));
  }
  return leadingOnes;
}
```