هذا الالتزام موجود في:
2026-04-20 15:12:16 +03:00
التزام 28f7241bcd
172 ملفات معدلة مع 21907 إضافات و0 حذوفات

عرض الملف

@@ -0,0 +1,13 @@
import { decodeOffsetCursor, encodeOffsetCursor } from './cursor.util';
describe('cursor util', () => {
it('encodes and decodes cursor offsets', () => {
const cursor = encodeOffsetCursor(40);
expect(decodeOffsetCursor(cursor)).toBe(40);
});
it('returns null on invalid cursor', () => {
expect(decodeOffsetCursor('%%%invalid%%%')).toBeNull();
expect(decodeOffsetCursor(encodeOffsetCursor(-1))).toBeNull();
});
});

عرض الملف

@@ -0,0 +1,19 @@
export const encodeOffsetCursor = (offset: number): string =>
Buffer.from(String(offset), 'utf8').toString('base64url');
export const decodeOffsetCursor = (cursor?: string): number | null => {
if (!cursor) {
return null;
}
try {
const raw = Buffer.from(cursor, 'base64url').toString('utf8');
const parsed = Number(raw);
if (!Number.isInteger(parsed) || parsed < 0) {
return null;
}
return parsed;
} catch {
return null;
}
};

عرض الملف

@@ -0,0 +1,7 @@
import * as bcrypt from 'bcrypt';
export const hashValue = async (value: string, saltRounds: number): Promise<string> =>
bcrypt.hash(value, saltRounds);
export const compareHash = async (value: string, hashedValue: string): Promise<boolean> =>
bcrypt.compare(value, hashedValue);