public String createFollowUpSession() {
        List<PermissionHolder> holders = this.holders.stream()
                .map(id -> {
                    switch (id.getType()) {
                        case PermissionHolderIdentifier.USER_TYPE:
                            return this.plugin.getStorage().loadUser(UUID.fromString(id.getName()), null);
                        case PermissionHolderIdentifier.GROUP_TYPE:
                            return this.plugin.getStorage().loadGroup(id.getName()).thenApply(o -> o.orElse(null));
                        default:
                            return null;
                    }
                })
                .filter(Objects::nonNull)
                .map(CompletableFuture::join)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());

        List<Track> tracks = this.tracks.stream()
                .map(id -> this.plugin.getStorage().loadTrack(id).thenApply(o -> o.orElse(null)))
                .map(CompletableFuture::join)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());

        return uploadRequestData(WebEditorRequest.generate(holders, tracks, this.sender, this.cmdLabel, this.plugin));
    }
Encapsulates a session with the web editor.

<p>A session is tied to a specific user, and can comprise of multiple requests to and
responses from the web editor.</p>
common/src/main/java/me/lucko/luckperms/common/webeditor/WebEditorSession.java