Yeah, I think the portable interface probably has to remain synchronous, with any async machinery staying inside the host implementation’s black box.
The repo above includes a basic ZMQ extension that uses polling to provide synchronous access to event-driven behavior. It works as a lowest-common-denominator approach, though it’s somewhat awkward.
I did find a brief mention that Shen Professional supported concurrency, but I’m not sure how that mapped across its various ports:
https://shenlanguage.org/OSM/History.html. Does anyone know how that was handled?