Optional_MongoDB ObjectId (undefined until saved).
Runtime-only marker: this is an anonymous (guest) session with no
persisted account. Never saved (not in persistentFields). Set on
the ephemeral User the connect path builds for an anon:
principal; Login.enter reads it to mint a throwaway guest avatar
instead of loading a roster.
Created timestamp (set on construction).
OptionalgoogleAssociated Google profile ID (MongoDB _id of the GoogleProfile doc).
Optional: a Twitch-origin account may carry only twitchProfileId.
IDs of this user's character slots. Each corresponds to an Avatar
template at /obj/Avatar/<playerId> in the domain collection.
This list is the authoritative "what does this user own" source. Appended on character creation; removed on character deletion.
OptionaltwitchAssociated Twitch profile ID (MongoDB _id of the TwitchProfile doc).
Optional: a Google-origin account may carry only googleProfileId.
Last updated timestamp (set on every save).
Static ReadonlyANONYMOUS_Session-principal id prefix that marks an anonymous (guest) login
— a session with no persisted account behind it. The /auth/guest
route mints anon:<nanoid> principals; the connect path recognizes
the prefix and constructs an ephemeral, never-saved User instead
of a Mongo lookup. This is the authentication axis (authed vs
anonymous) — distinct from a character being a guest (Avatar.isGuest).
StaticcollectionCollection name (must be overridden in subclass).
StaticpersistentPersistent fields copied to/from the MongoDB document.
Delete this object from MongoDB.
Unlike the former Persistable.delete, there is no
StuffApi.destruct cascade — a Document is not registered, so there
is no runtime instance to unregister.
ProtectedfromLoad data from a MongoDB document into this object.
Symmetric to toDocument: marshallers transform their assigned
fields' raw values via fromStored before bracket-assign hits the
runtime setter.
ProtectedgetGet all persistent fields for this class (mixin + own declarations).
ProtectedgetThe at-least-one-provider invariant predicate — true iff the account is reachable through at least one login provider. Lives on the data object; the link/unlink paths defend the invariant by checking it.
ProtectedpreloadPre-warm the marshaller cache for this instance's class via the async
resolver. Static counterpart Document.preloadFieldMarshallersFor is used
by the findById / find paths.
Save this object to MongoDB. Updates updatedAt automatically.
Pre-resolves any registered field marshallers via the async resolver
before the sync toDocument walk; the sync resolver lookup inside
toDocument then always hits a populated cache.
ProtectedtoConvert this object to a plain document for MongoDB.
Marshallers (declared via static fieldMarshallers on a mixin or
class) intercept their assigned fields: the runtime value-object
value is passed through marshaller.toStored before being written
into the doc. Fields without a marshaller pass through bracket-read
unchanged.
StaticfindFind documents matching a query. Same construction story as findById.
StaticfindFind a document by MongoDB _id. Returns null if not found.
Construction is a plain new this() — the returned instance is NOT
registered with StuffApi and is NOT proxy-wrapped. Two calls for the
same id return two distinct instances (value semantics).
StaticpreloadStatic-context preload helper. Used by findById / find where
there's no instance to call preloadFieldMarshallers on yet, and
by Template._materialize for the same reason. Symmetric with the
protected instance method.
StaticprofileMap a provider to its FK field name — the single source of truth
for the computed-key access the provider-parameterized spine uses
(User.find({ [User.profileFieldFor(provider)]: id })) and the
at-least-one invariant. Two explicit fields, not a generic
identities[] map (premature at N=2).
StaticsetWire the marshaller-resolution seam once at boot (and in tests).
Keeps Document free of a StuffApi import while still reaching
the Idea-rooted marshaller instances. sync mirrors
StuffApi.findByTemplatePath (returns the registered instance or
undefined); async mirrors StuffApi.singleton (resolves /
lazy-clones the instance, warming the cache sync then hits).
Base for MongoDB-backed records. NOT in the Stuff hierarchy.