I was considering a creating a mediator with no view component and having it listen to all the notifications I have such commands registered to.
I believe you're on the right path here.
On the other hand, it feels like I'm hacking something in where it shouldn't be (mediator that mediates nothing?).
Not really. It is mediating communications between the Proxy and the StateMachine. The fact that a mediator has a convenient way to handle mediating view components doesn't mean that they can't also be used to mediate communications between other PureMVC actors.
Is what SOAMusicPlayer does a recommended practice? (...PlaylistModuleMediator is responsible for sending the state machine action in response to a success or fail...)
Yes. Regardless of what actor triggered the Proxy to make a call, the response should be sent from the proxy as an ordinary notification, NOT a StateMachine.ACTION notification. The maximum benefit of MVC is achieved in a rich client when the Model is completely reusable. Thus it should not know anything about the StateMachine or the actions set up for this application.
So, you're left with your original dilemma of
An explosion of commands that just turn around and send StateMachine.ACTION notifications. Smelly
OR
A Mediator that is registered for everything and does the translation. Since that's the normal job of the Mediator (albiet usually translating events to notifications), it is still a perfect responsibility match.
PlaylistModuleMediator confuses me. I expected it to mediate the module, but it never touches its view component after construction and appears more interested in two proxies (ConfigProxy and NavProxy). Did it just become a convenient place to place "global-ish stuff" that did not belong in the other mediators
Yep, that it did. It wasn't doing much and ended up handling a few of these relay actions.
As for the module, it's just keeping that in a pouch. It could just have been plumbed onto the end of the pipe and forgotten about, but it's easier to troubleshoot using the debugger this way. At a breakpoint, you just drill down through the facade, view, mediatorMap, PlaylistModuleMediator and bang, there's the module.
-=Cliff>