fix(dispatcher): don't throw on invalid data when using predicates

This commit is contained in:
alina 🌸 2024-05-28 14:25:59 +03:00
parent 2d78a892b4
commit 702ff2a0de
Signed by: teidesu
SSH key fingerprint: SHA256:uNeCpw6aTSU4aIObXLvHfLkDa82HWH9EiOj9AXOIRpI
2 changed files with 16 additions and 2 deletions

View file

@ -137,5 +137,12 @@ describe('CallbackDataBuilder', () => {
),
).toEqual(null)
})
it('should not throw on invalid data', async () => {
const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')
await expect(getFilterMatch(cdb.filter(), 'wrong-prefix:foo:bar')).resolves.toEqual(null)
await expect(getFilterMatch(cdb.filter(), 'prefix:foo:bar:baz')).resolves.toEqual(null)
})
})
})

View file

@ -59,17 +59,22 @@ export class CallbackDataBuilder<T extends string> {
* Parse callback data to object
*
* @param data Callback data as string
* @param safe If `true`, will return `null` instead of throwing on invalid data
*/
parse(data: string): Record<T, string> {
parse(data: string, safe?: false): Record<T, string>
parse(data: string, safe: true): Record<T, string> | null
parse(data: string, safe = false): Record<T, string> | null {
const parts = data.split(this.sep)
if (parts[0] !== this.prefix) {
if (safe) return null
throw new MtArgumentError(
`Invalid data passed: "${data}" (bad prefix, expected ${this.prefix}, got ${parts[0]})`,
)
}
if (parts.length !== this._fields.length + 1) {
if (safe) return null
throw new MtArgumentError(
`Invalid data passed: "${data}" (bad parts count, expected ${this._fields.length}, got ${
parts.length - 1
@ -117,7 +122,9 @@ export class CallbackDataBuilder<T extends string> {
return async (query) => {
if (!query.dataStr) return false
const data = this.parse(query.dataStr)
const data = this.parse(query.dataStr, true)
if (!data) return false
const fnResult = await params(query, data)
if (typeof fnResult === 'boolean') {