Files
mini-loader/packages/server/src/auth/auth.ts
2024-01-14 12:49:54 +01:00

51 lines
1.2 KiB
TypeScript

import { nanoid } from 'nanoid';
import { resolve } from 'path';
import { existsSync } from 'fs';
import { mkdir, readFile, writeFile } from 'fs/promises';
import jwt from 'jsonwebtoken';
import { Config } from '../config/config.js';
type AuthOptions = {
config: Config;
};
class Auth {
#options: AuthOptions;
#data: Promise<{ secret: string }>;
constructor(options: AuthOptions) {
this.#options = options;
this.#data = this.#setup();
}
#setup = async () => {
const { config } = this.#options;
const secretLocation = resolve(config.files.data, 'secret');
let secret = '';
await mkdir(config.files.data, { recursive: true });
if (!existsSync(secretLocation)) {
secret = nanoid();
await writeFile(secretLocation, secret);
} else {
secret = await readFile(secretLocation, 'utf-8');
}
return {
secret,
};
};
public createToken = async (data: object) => {
const { secret } = await this.#data;
const token = jwt.sign(data, secret);
return token;
};
public validateToken = async (token: string) => {
const { secret } = await this.#data;
const result = jwt.verify(token, secret);
return result as object;
};
}
export { Auth };