Constructs a CSet with the given valueConstructor
.
Callback used to construct a value Collab with the given InitToken and arguments to add. See collections of Collabs for example usage.
A serializer for AddArgs
as an array.
Defaults to DefaultSerializer.
Internal (this/parent) use only.
This Collab's name, which distinguishes it among its siblings in the tree of Collabs.
Internal (this/parent) use only.
This Collab's parent in the tree of Collabs.
The ambient IRuntime.
Use this to access utilities like IRuntime.replicaID.
The number of values in the set.
Returns an iterator for values in the set.
The iteration order is NOT eventually consistent: it may differ on replicas with the same state.
Adds a value to the set using args.
The args are broadcast to all replicas in serialized form.
Every replica then passes them to valueConstructor
to construct the actual
value of type C, a new Collab that is collaborative as usual.
The added value.
Internal (parent) use only.
If this Collab is in its initial, post-constructor state, then this method may (but is not required to) return true; otherwise, it returns false.
By default, this method always returns false; override to change.
If this method returns true:
load(null, meta)
.
load should process this as if called with the output of save
from a garbage-collectable state. For a nontrivial example,
see [[CMultiValueMap.load]]'s implementation.Internal (Collab.send) use only.
Sends the given message on behalf of child. In general, this parent is then responsible for delivering the given message to Collab.receive on each replica of child, with guarantees set by the runtime.
Deletes every value in the set.
Deletes the given value, making it no longer present in this set.
value
is deleted permanently and
can no longer be used; future and concurrent operations on that value
are ignored. Local operations will succeed but will not affect
remote replicas. The value can perform cleanup in its
Collab.finalize method.
Emits an event, which triggers all the registered event handlers.
See CollabEventsRecord for advice on what events to emit.
This is a wrapper around EventEmitter.emit that forces events to extend CollabEvent and also emits an "Any" event.
Set to true to skip emitting an "Any" event.
Internal (parent) use only.
Called by this Collab's parent when it has been deleted from a collection on the local replica and can no longer be used (e.g., due to CSet.delete on this or an ancestor). A Collab implementation can implement this method to clean up external resources, e.g., associated DOM elements.
finalize
has no relation to the JavaScript garbage collector or
canGC.
By default, this method does nothing.
Inverse of idOf.
Specifically, given a CollabID returned by idOf on some replica of
this CSet, returns this replica's copy of the original
descendant
.
If the original descendant
has been deleted from this
set, this method will usually return undefined
. The exception
is if descendant
was just deleted from this set.
In that case, this method will
still return the original descendant
until the end of
the deleting update.
Thus event handlers within the same transaction can still
get the deleted value.
A CollabID from idOf.
Internal (parent) use only.
If provided, treat id.collabIDPath
as if
it starts at startIndex instead of 0.
Returns the AddArgs
used to add value
.
Returns whether value is present in the set.
Returns a CollabID for the given strict descendant of this parent.
The CollabID may be passed to fromID on any replica of this
parent (but not other parents) to obtain that replica's copy of
descendant
.
Internal (parent) use only.
Called by this Collab's parent to load saved state. You may assume that the saved state was generated by save on some replica of this Collab, possibly in a different collaboration session, with guarantees set by the runtime.
This method may also be called with savedStateTree = null
;
you should ignore such calls (i.e., return immediately)
unless you override canGC. If you do override canGC
,
see that method's docs for instructions.
Registers an event handler that is triggered when the event happens.
Name of the event to listen on.
Callback that handles the event.
If true, the event handler is triggered at most once (the next time the event happens), then unsubscribed.
An "off" function that removes the event handler when called.
Registers an event handler that is triggered when the event happens.
An "off" function that removes the event handler when called.
Internal (parent) use only.
Receives a message sent by send on a local or remote replica of this Collab.
This method processes the message, changes the local state accordingly, and emits events describing the local changes.
This method should make assumptions and ensure consistency guarantees appropriate to its use case. For example, CRDTs may assume eventual, exactly-once, causal-order message delivery, and they must ensure strong eventual consistency.
Internal (parent) use only.
Returns saved state describing the current state of this Collab.
The saved state may later be passed to load on a replica of this Collab, possibly in a different collaboration session, with rules set by the runtime. For example, CRuntime allows load at any time; it must then act as a merge operation (like a state-based CRDT), applying all updates that the saved replica had applied before saving, ignoring duplicates.
save
may be called at any time, possibly many times while an app
is running. Calling save
should not affect this Collab's
user-visible state.
For convenience, the saved state may be expressed as a tree of Uint8Arrays instead of just a single Uint8Array; see [[SaveStateTree]]'s docs.
The saved state.
Broadcasts a message to other replicas of this Collab. The message will be delivered to all replicas' receive, including locally.
For convenience, the message may be expressed as a stack of
(Uint8Array | string)
,
instead of just a single Uint8Array. This is
useful for parents sending messages on behalf of their children;
see the implementation of CObject for an example.
The message to send, in the form of a stack of Uint8Arrays. Note that this method may mutate it in-place.
A stack of metadata requests. The runtime will use
the union of these when creating the MessageMeta for receive.
Note that the stack need not align with messageStack
, and this method may mutate
it in place.
Returns an iterator for values in the set.
The iteration order is NOT eventually consistent: it may differ on replicas with the same state.
Generated using TypeDoc
A collaborative set with mutable values of type C.
Values are internally mutable. Specifically, each value is its own Collab, and operations on that Collab are collaborative as usual.
Unlike a normal
Set<C>
, you do not add values directly. Instead, you use the pattern described in collections of Collabs: one user calls add withAddArgs
; each replica passes thoseAddArgs
to itsvalueConstructor
; andvalueConstructor
returns the local copy of the new value Collab.When a value is deleted with delete, it is deleted permanently and can no longer be used; future and concurrent operations on that value are ignored.
You can also treat a
CSet<C>
as a "factory" for Collabs of type C: add is like "new"/"malloc" and delete is like "free", but replicated across all devices.See also: CValueSet.