From 702ff2a0de68ac7bda6daeb40f0438b2fb25733b Mon Sep 17 00:00:00 2001 From: alina sireneva Date: Tue, 28 May 2024 14:25:59 +0300 Subject: [PATCH] fix(dispatcher): don't throw on invalid data when using predicates --- packages/dispatcher/src/callback-data-builder.test.ts | 7 +++++++ packages/dispatcher/src/callback-data-builder.ts | 11 +++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/dispatcher/src/callback-data-builder.test.ts b/packages/dispatcher/src/callback-data-builder.test.ts index 22eda243..8e631bdd 100644 --- a/packages/dispatcher/src/callback-data-builder.test.ts +++ b/packages/dispatcher/src/callback-data-builder.test.ts @@ -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) + }) }) }) diff --git a/packages/dispatcher/src/callback-data-builder.ts b/packages/dispatcher/src/callback-data-builder.ts index c89421c7..a0600cba 100644 --- a/packages/dispatcher/src/callback-data-builder.ts +++ b/packages/dispatcher/src/callback-data-builder.ts @@ -59,17 +59,22 @@ export class CallbackDataBuilder { * 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 { + parse(data: string, safe?: false): Record + parse(data: string, safe: true): Record | null + parse(data: string, safe = false): Record | 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 { 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') {