Changed
- [High] Message and file workers now cache
users.infoandconversations.infolookups by ID for the lifetime of the worker, eliminating redundant API calls per match. Fixes #117 - [High]
find_messagesandfind_filesnow use a boundedmultiprocessing.Pool(capped at 8) instead of oneProcessper search string, preventing memory and file-descriptor usage from scaling with signature size. Fixes #113 - [High] Pool workers now construct their own
SlackClientvia_init_worker_clientinstead of unpickling the parent client, preserving connection pool and retry config across workers. Fixes #114 - [High]
SlackClient.__init__accepts new keyword-onlysession_tokenandcookie_dictparameters, used by pool workers to skip re-running_get_session_tokenon startup. - [High]
find_messagesandfind_filesnow share a singlemultiprocessing.Managerper call, replacing three per-call managers that leaked until GC. Fixes #116
Fixed
- [Critical] Worker exceptions (rate-limit exhaustion, malformed payloads,
AttributeError) are now caught and reported via a sharederrorslist instead of silently killing the child process. Fixes #108 - [Critical]
_multipro_message_workerno longer crashes on messages with nochannelfield (DMs, tombstoned messages, bot events). Fixes #109 - [Critical]
_multipro_file_workerno longer crashes when a file'snameorfiletypeisNone(deleted/redacted/tombstoned states). Fixes #110 - [Critical]
main()error handler no longer crashes withAttributeErrorwhen an exception is raised beforeinit_loggerruns; falls back totraceback.print_exc()when the logger is uninitialised. Fixes #111 - [High]
SlackClient._make_requestnow honours theRetry-Afterheader on 429s (falling back to 90s), loops back through_make_requestfor consecutive 429s, and raises after a configurable retry cap. Fixes #115 - [Medium] Canvas URLs are now built via
_build_canvas_url(), which normalises the trailing slash on the workspace URL before concatenation. Fixes #126 - [Medium]
after:query timeframes are now computed in UTC (time.gmtime) instead of local time, fixing off-by-one-day windows on CI/cloud hosts; refactored into a_compute_timeframe()helper. Fixes #125 - [Medium]
find_auth_informationreturn type widened toDict[str, Any] | Noneto reflect the actual mixed-type payload. Fixes #124 - [Medium]
find_auth_informationnow catchesRequestException,JSONDecodeError, andAttributeError, returningNonewith aWARNINGinstead of aborting the scan on transient scrape failures. Fixes #123 - [Medium]
find_messagesandfind_filesnow explicitly return[]on no-match and exception paths instead of implicitNone. Fixes #118 - [Medium]
_multipro_file_workerno longer appends a duplicate result persig.file_typesentry; replaced per-type loop with a singleany()check. Fixes #119 - [Medium] Removed dead
is_dataclassguard and unuseddataclassesimport from_resolve_file_user. Fixes #120 - [Medium]
_multipro_message_workernow skips messages with notextinstead of coercingNoneto the string'None', preventing false positives on attachment-only and system messages. Fixes #122 - [Medium]
_multipro_message_workernow compiles each pattern once per worker and reuses theMatchobject, eliminating per-message recompilation and a duplicatesearchcall on the match path. Fixes #121 - [Low]
cursor_api_searchnow updatescursoronce per page after items are collected, fixing a potential infinite loop on empty pages with a non-emptynext_cursor. - [Low]
OUTPUT_LOGGERannotation in__init__.pywidened toStdoutLogger | JSONLogger. - [Low] Added explicit parentheses to
if everything or (not pii and not secrets):for readability; no behaviour change.