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