How to properly intercept cell run by an extension

We have to develop jupyterlab extension which will intercept any cell run, do some external requests, enrich run cell request with additional meta data, and only after message enrichment call original cell run.

After some study of jupyterlab codebase, we didn’t find any suitable place which looks as good place to interfere by extension.
Only Idea we got is to monkey patch IKernelConnection.requestExecute which looks as suitable single point to interfere, but it is not possible due to synchronicity of this method (we need to insert async logic inside).

But we don’t like any single idea we got, so maybe somebody here can give some advice.