InMemoryArtifactService
A thread-safe in-memory implementation of the ArtifactService.
User-scoped artifacts (see ArtifactService) live in a store of their own, keyed by app and user, so no session id can address them and none can be shadowed by a session that happens to share their name; listArtifactKeys merges the two scopes and returns them sorted. A null SessionKey.id is rejected for a session-scoped name, since there is no session to store it under; user-scoped names and listArtifactKeys accept one and address the user scope alone.
Functions
Deletes an artifact.
Lists the filenames visible to a session: its own artifacts plus the user's user: ones.
Lists all the versions (as revision IDs) of an artifact.
Gets an artifact.
Saves an artifact and returns it with fileData if available.
Saves an artifact.