fix(dispatcher): don't throw on invalid data when using predicates
This commit is contained in:
parent
2d78a892b4
commit
702ff2a0de
2 changed files with 16 additions and 2 deletions
|
@ -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)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -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') {
|
||||||
|
|
Loading…
Reference in a new issue