|
1 | | -import { Log, Trace, logFilter, traceFilter } from '@originprotocol/squid-utils' |
| 1 | +import { Context, Log, Trace, logFilter, traceFilter } from '@originprotocol/squid-utils' |
2 | 2 |
|
3 | 3 | type LogFilterInstance = ReturnType<typeof logFilter> |
4 | 4 | type TraceFilterInstance = ReturnType<typeof traceFilter> |
| 5 | +type CustomFilter = (ctx: Context, log: Log) => Promise<{ include: boolean }> | { include: boolean } |
5 | 6 |
|
6 | | -const logFilters: LogFilterInstance[] = [] |
| 7 | +interface RegisteredLogFilter { |
| 8 | + filter: LogFilterInstance |
| 9 | + customFilter?: CustomFilter |
| 10 | +} |
| 11 | + |
| 12 | +const logFilters: RegisteredLogFilter[] = [] |
7 | 13 | const traceFilters: TraceFilterInstance[] = [] |
8 | 14 |
|
9 | | -export const registerLogFilter = (filter: LogFilterInstance) => { |
10 | | - logFilters.push(filter) |
| 15 | +export const registerLogFilter = (filter: LogFilterInstance, customFilter?: CustomFilter) => { |
| 16 | + logFilters.push({ filter, customFilter }) |
11 | 17 | } |
12 | 18 |
|
13 | 19 | export const registerTraceFilter = (filter: TraceFilterInstance) => { |
14 | 20 | traceFilters.push(filter) |
15 | 21 | } |
16 | 22 |
|
| 23 | +/** |
| 24 | + * Check if a log matches any registered filter. |
| 25 | + * Filters with a customFilter require the async version (matchesAnyLogFilterAsync). |
| 26 | + * This sync version only checks filters without customFilters. |
| 27 | + */ |
17 | 28 | export const matchesAnyLogFilter = (log: Log): boolean => { |
18 | | - return logFilters.some((f) => f.matches(log)) |
| 29 | + return logFilters.some((f) => f.filter.matches(log)) |
| 30 | +} |
| 31 | + |
| 32 | +/** |
| 33 | + * Check if a log matches any registered filter, including custom filters. |
| 34 | + * A log matches if any filter's subscription matches AND its customFilter (if present) returns include: true. |
| 35 | + */ |
| 36 | +export const matchesAnyLogFilterAsync = async (ctx: Context, log: Log): Promise<boolean> => { |
| 37 | + for (const { filter, customFilter } of logFilters) { |
| 38 | + if (!filter.matches(log)) continue |
| 39 | + if (!customFilter) return true |
| 40 | + const result = await customFilter(ctx, log) |
| 41 | + if (result.include) return true |
| 42 | + } |
| 43 | + return false |
19 | 44 | } |
20 | 45 |
|
21 | 46 | export const matchesAnyTraceFilter = (trace: Trace): boolean => { |
|
0 commit comments