Wraps a Graffiti API instance to provide the synchronize methods. The GraffitiSyncrhonize class rather than the Graffiti class must be used for all functions for the synchronize methods to work.
The Graffiti API instance to wrap.
Optional
options: GraffitiSynchronizeOptionsProtected
ajv_Protected
applyProtected
Readonly
callbacksProtected
Readonly
graffitiProtected
Readonly
optionsProtected
objectProtected
objectProtected
synchronizeOptional
session: null | GraffitiSessionStreams changes made to any object in any channel and made by any user. You may want to use it in conjuction with GraffitiSynchronizeOptions.omniscient to get a global view of all Graffiti objects passing through the system. This is useful for building a client-side cache, for example.
Be careful using this method. Without additional filters it can expose the user to content out of context.
Optional
session: null | GraffitiSessionProtected
synchronizeOptional
newObject: GraffitiObjectStreamContinueEntry<{}>Deletes an object from a given url
.
The deleting actor
must be the same as the
actor
that created the object.
It is not possible to re-put an object that has been deleted
to ensure a user's right to be forgotten.
In cases where deleting and restoring an object is useful, an object's
allowed
property can be set to
an empty list to hide it from all users except the creator.
The location of the object to delete.
An implementation-specific object with information to authenticate the
actor
.
The object that was deleted with its
lastModified
property updated to the time of deletion.
GraffitiErrorNotFound if the object does not exist, has already been deleted,
or the user is not allowed
to access it.
GraffitiErrorForbidden if the actor
is not the same actor
as the one who created the object.
Retrieves an object from a given url
.
The retrieved object is type-checked against the provided JSON schema otherwise a GraffitiErrorSchemaMismatch is thrown.
If the retreiving actor
is not
the object's actor
,
the object's allowed
and
channels
properties are
not revealed, similar to a BCC.
The location of the object to get.
The JSON schema to validate the retrieved object against.
Optional
session: null | GraffitiSessionGraffitiErrorNotFound if the object does not exist, has been deleted, or the user is not
allowed
to access it.
GraffitiErrorSchemaMismatch if the retrieved object does not match the provided schema.
Patches an existing object at a given url
.
The patching actor
must be the same as the
actor
that created the object.
A collection of JSON Patch operations to apply to the object. See GraffitiPatch for more information.
The location of the object to patch.
An implementation-specific object with information to authenticate the
actor
.
The original object prior to the patch with its
lastModified
property updated to the time of deletion.
GraffitiErrorNotFound if the object does not exist, has already been deleted,
or the user is not allowed
to access it.
GraffitiErrorForbidden if the actor
is not the same actor
as the one who created the object.
Creates a new object or replaces an existing object.
An object can only be replaced by the same actor
that created it.
Replacement occurs when the url
of
the replaced object exactly matches an existing object's URL.
The object to be put. This object is statically type-checked against the JSON schema that can be optionally provided as the generic type parameter. We highly recommend providing a schema to ensure that the PUT object matches subsequent get or discover methods.
An implementation-specific object with information to authenticate the
actor
.
The object that was replaced if one one exists, otherwise an object with
with an empty value
,
channels
, and allowed
list.
The lastModified
property of the returned object
will be updated to the time of replacement/creation.
GraffitiErrorNotFound if a url
is provided that has not been created yet or the actor
is not allowed
to see it.
GraffitiErrorForbidden if the actor
is not the same actor
as the one who created the object.
Returns statistics about all the channels
that an actor
has posted to.
This is not very useful for most applications, but
necessary for certain applications where a user wants a
global view of all their Graffiti data or to debug
channel usage.
Like discover, objects are returned asynchronously as they are discovered, the stream will end once all leads have been exhausted.
An implementation-specific object with information to authenticate the
actor
.
A stream of statistics for each channel
that the actor
has posted to.
Continues a GraffitiObjectStream from a given
cursor
string.
The continuation will return new objects that have been created
that match the original stream, and also returns the
url
s of objects that
have been deleted, as marked by a tombstone
.
The continuation may also include duplicates of objects that were already returned by the original stream. This is dependent on how much state the underlying implementation maintains.
The cursor
allows the client to
serialize the state of the stream and continue it later.
However this method loses any typing information that was
present in the original stream. For better type safety
and when serializing is not necessary, use the
continue
method
instead, which is returned along with the cursor
at the
end of the original stream.
GraffitiErrorForbidden if the actor
provided in the session
is not the same as the actor
that initiated the original stream.
Discovers objects created by any user that are contained
in at least one of the given channels
and match the given JSON Schema.
Objects are returned asynchronously as they are discovered but the stream
will end once all leads have been exhausted.
The GraffitiObjectStream ends by returning a
continue
method and a
cursor
string,
each of which can be be used to poll for new objects.
The continue
method preserves the type safety of the stream and the cursor
string can be serialized to continue the stream after an application is closed
and reopened.
discover
will not return objects that the actor
is not allowed
to access.
If the actor
is not the creator of a discovered object,
the allowed list will be masked to only contain the querying actor if the
allowed list is not undefined
(public). Additionally, if the actor is not the
creator of a discovered object, any channels
not specified by the discover
method will not be revealed. This masking happens
before the object is validated against the supplied schema
.
Since different implementations may fetch data from multiple sources there is
no guarentee on the order that objects are returned in.
It is also possible that duplicate objects are returned and their
lastModified
fields must be used
to determine which object is the most recent.
The channels
that objects must be associated with.
A JSON Schema that objects must satisfy.
Optional
session: null | GraffitiSessionA stream of objects that match the given channels
and JSON Schema.
Discovers objects not contained in any
channels
that were created by the querying actor
and match the given JSON Schema.
Unlike discover, this method will not return objects created by other users.
This method is not useful for most applications, but necessary for getting a global view of all a user's Graffiti data or debugging channel usage.
Like discover, objects are returned asynchronously as they are discovered,
the stream will end once all leads have been exhausted, and the stream
can be continued using the continue
method or cursor
string.
A JSON Schema that orphaned objects must satisfy.
An implementation-specific object with information to authenticate the
actor
.
A stream of objects created by the querying actor
that do not belong to any channels
and match the given JSON Schema.
Begins the login process. Depending on the implementation, this may involve redirecting the user to a login page or opening a popup, so it should always be called in response to a user action.
The session object is returned
asynchronously via sessionEvents
as a GraffitiLoginEvent with event type login
.
Optional
proposal: { actor?: string; scope?: {} }Suggestions for the permissions that the login process should grant. The login process may not provide the exact proposed permissions.
Optional
actor?: stringA suggested actor to login as. For example, if a user tries to edit a post but are not logged in, the interface can infer that they might want to log in as the actor who created the post they are attempting to edit.
Even if provided, the implementation should allow the user to log in as a different actor if they choose.
Optional
scope?: {}A yet to be defined permissions scope. An application may use this to indicate the minimum necessary scope needed to operate. For example, it may need to be able read private messages from a certain set of channels, or write messages that follow a particular schema.
The login process should make it clear what scope an application is requesting and allow the user to enhance or reduce that scope as necessary.
Begins the logout process. Depending on the implementation, this may involve redirecting the user to a logout page or opening a popup, so it should always be called in response to a user action.
A confirmation will be returned asynchronously via
sessionEvents
as a GraffitiLogoutEvent as event type logout
.
The session object to logout.
An event target that can be used to listen for the following events and they're corresponding event types:
login
- GraffitiLoginEventlogout
- GraffitiLogoutEventinitialized
- GraffitiSessionInitializedEventThis method has the same signature as discover but listens for changes made via put, patch, and delete or fetched from get, discover, and recoverOrphans and then streams appropriate changes to provide a responsive and consistent user experience.
Unlike discover, this method continuously listens for changes
and will not terminate unless the user calls the return
method on the iterator
or break
s out of the loop.
This method has the same signature as get but listens for changes made via put, patch, and delete or fetched from get, discover, and recoverOrphans and then streams appropriate changes to provide a responsive and consistent user experience.
Unlike get, which returns a single result, this method continuously listens for changes which are output as an asynchronous stream, similar to discover.
This method has the same signature as recoverOrphans but listens for changes made via put, patch, and delete or fetched from get, discover, and recoverOrphans and then streams appropriate changes to provide a responsive and consistent user experience.
Unlike recoverOrphans, this method continuously listens for changes
and will not terminate unless the user calls the return
method on the iterator
or break
s out of the loop.
Wraps the Graffiti API so that changes made or received in one part of an application are automatically routed to other parts of the application. This is an important tool for building responsive and consistent user interfaces, and is built upon to make the Graffiti Vue Plugin and possibly other front-end libraries in the future.
Specifically, it provides the following synchronize methods for each of the following API methods:
Whenever a change is made via put, patch, and delete or received from get, discover, and recoverOrphans, those changes are forwarded to the appropriate synchronize method. Each synchronize method returns an iterator that streams these changes continually until the user calls
return
on the iterator orbreak
s out of the loop, allowing for live updates without additional polling.Example 1: Suppose a user publishes a post using put. If the feed displaying that user's posts is using synchronizeDiscover to listen for changes, then the user's new post will instantly appear in their feed, giving the UI a responsive feel.
Example 2: Suppose one of a user's friends changes their name. As soon as the user's application receives one notice of that change (using get or discover), then synchronizeDiscover listeners can be used to update all instance's of that friend's name in the user's application instantly, providing a consistent user experience.