mirror of
https://github.com/morten-olsen/mini-loader.git
synced 2026-02-08 01:36:26 +01:00
51 lines
1.2 KiB
TypeScript
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 };
|