OptionalisRead members. May resolve asynchronously (e.g., live Avatar lookups).
OptionalonProject the source's native role for playerId in group id
into the coarse GroupRole vocabulary. null = not in the group.
Sources without a native role concept return 'member' for any
matched entry.
Provider contract. Concrete providers in
lib/social/providers/.membersis the canonical read;roleOfis the canonical role projection.isMemberandonChangeare optional fast-path / live-notification seams (defaults derive fromroleOfand no-op respectively).Role projection is mandatory. Every provider projects its native concept into the coarse
'owner' | 'admin' | 'member'vocabulary as best it can — even when the underlying source has no native role hierarchy (mql,contacts), the projection is "everyone in the materialized set is'member'". Surfacingnullis the "not in the group at all" signal. Sources with richer hierarchies (a future guild provider with leader / officer / member) fold their native roles into the coarse vocabulary — the contract is intentionally lossy.Writable providers add
add/remove/setRole/create/destroyon top — the managed provider has them; mql / contacts don't.