import { sha256 } from '@noble/hashes/sha256'; import { bytesToHex } from '@noble/hashes/utils'; import sortKeys from 'sort-keys-recursive'; export enum SyncField { // TODO: Reduce to checkpoint or processed checkpoint = 'syncCheckpoint', } export class SyncApiService { signPayload(input: { payload: T; secretKey: string }): { payload: T; signature: string } { const { payload, secretKey } = input; const sortedPayload = sortKeys(payload); const signingMessage = `${JSON.stringify(sortedPayload, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value))}::${secretKey}`; const hash = sha256(signingMessage); const signature = bytesToHex(hash); return { payload, signature, }; } verify(input: { payload: T; secretKey: string; signature: string }): boolean { const { payload, secretKey, signature } = input; const result = this.signPayload({ payload, secretKey }); return result.signature === signature; } }