UNPKG

@didtools/siwx

Version:

Typescript library for Sign-In With X

53 lines (52 loc) 1.74 kB
import { test } from 'uvu'; import * as assert from 'uvu/assert'; import { readFileSync } from 'fs'; import { sparse, string, optional, type, literal, record, union, decode } from 'codeco'; import { SiwxMessage } from '../siwx-message.js'; const Fields = sparse({ domain: string, address: string, uri: string, version: string, chainId: string, nonce: string, issuedAt: string, network: string, statement: optional(string) }); const ValidEntry = type({ message: string, status: literal('valid'), fields: Fields }); const InvalidEntry = type({ message: string, status: literal('invalid') }); const ChainVector = record(string, union([ ValidEntry, InvalidEntry ])); function readVector(filename) { const contents = readFileSync(filename, 'utf8'); const parsed = JSON.parse(contents); return decode(ChainVector, parsed); } const ethereumVectors = readVector(new URL('../../data/vectors/ethereum-messages.json', import.meta.url)); for (const [name, entry] of Object.entries(ethereumVectors)){ const isValid = ValidEntry.is(entry); if (isValid) { test(name, ()=>{ // fromString -> toFields const fromString = SiwxMessage.fromString(entry.message); // fromFields -> toString const fromFields = new SiwxMessage(entry.fields); const toString = fromFields.toString(); assert.equal(toString, entry.message, 'toString do not match with provided message'); assert.equal(fromString, fromFields, 'fromString do not match with provided fields'); }); } else { assert.throws(()=>SiwxMessage.fromString(entry.message), `Expect invalid: ${name}`); } } test.run();