Skip to main content

ActivityPub

This service allows you to create an ActivityPub server with data stored in a triple store.

Features

  • Store activities, actors and objects in the triple store
  • Allow to create actors when new WebIDs are created
  • Side effects are supported for Create, Update, Delete, Follow, Like

Dependencies

Sub-services

  • ActivityService
  • ActorService
  • CollectionService
  • FollowService
  • InboxService
  • LikeService
  • ObjectService
  • OutboxService
  • RelayService
  • ReplyService
  • RegistryService

Other services

Mixins

Install

$ yarn add @semapps/activitypub

Usage

const { ActivityPubService } = require('@semapps/activitypub');

module.exports = {
mixins: [ActivityPubService],
settings: {
baseUri: 'http://localhost:3000/',
queueServiceUrl: null,
like: {
attachToObjectTypes: null,
attachToActorTypes: null
},
follow: {
attachToActorTypes: null
},
reply: {
attachToObjectTypes: null
}
}
};

Configure the LDP containers

The containers for actors and objects are handled through the LDP service. You need to define containers with ActivityStreams's actors and objects in the acceptedTypes. Alternatively, you can load the default containers from the @semapps/activitypub package as below:

const { LdpService } = require('@semapps/ldp');
const { containers: apContainers } = require('@semapps/activitypub');

module.exports = {
mixins: [LdpService],
settings: {
baseUrl: process.env.SEMAPPS_HOME_URL,
containers: ['/my-container', ...apContainers]
}
};

Queue federation POSTs

If you want to make sure no data is lost when trying to POST to remote ActivityPub servers, you can set the dispatch.queueServiceUrl settings.

The Bull task manager will queue the task and you will be able to retry it if it fails.

Create actors on account creations

An ActivityPub actor is automatically created when a auth.registered event is detected.

By default, it will:

  • Append the as:Person type, unless another ActivityStreams actor type is detected
  • Use the slug of the actor as the as:preferredUsername property

You can adapt this behaviour to your needs with the selectActorData setting. This function receives the data provided on signup (as JSON-LD), and must return the properties (with their full URI) to be appended. For example:

const selectActorData = userData => ({
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'https://www.w3.org/ns/activitystreams#Person',
'https://www.w3.org/ns/activitystreams#name': userData['foaf:name'],
'https://www.w3.org/ns/activitystreams#preferredUsername': userData['foaf:nick']
});

Note: If no type or as:preferredUsername is returned by this function, it will behave as described above.

Additionally, the ActivityPub services will append all the ActivityPub-specific properties (publicKey, followers, following, likes...)

Settings

PropertyTypeDefaultDescription
baseUriStringrequiredBase URI of your web server
selectActorDataFunctionReceives the data provided on signup (as JSON-LD), and must return the properties (with full URI) to be appended to the actor profile (see above).
queueServiceUrlStringRedis connection string. If set, the Bull task manager will be used to handle federation POSTs.
like.attachToObjectTypesArrayAll AS objectsThe ActivityStreams objects which will be attached a likes collection
like.attachToActorsTypesArrayAll AS actorsThe ActivityStreams actors which will be attached a liked collection
follow.attachToActorsTypesArrayAll AS actorsThe ActivityStreams actors which will be attached a followers and following collections
reply.attachToObjectTypesArrayAll AS objectsThe ActivityStreams objects which will be attached a replies collection

Events

The following events are emitted by the different ActivityPub sub-services.

activitypub.follow.added

Sent after an actor follows another one.

Payload
PropertyTypeDescription
followerStringURI of the actor being followed
followingStringURI of the actor following

activitypub.follow.removed

Sent after an actor stops following another one.

Payload
PropertyTypeDescription
followerStringURI of the actor not being followed anymore
followingStringURI of the actor following

activitypub.inbox.received

Sent after an actor receives an activity in his inbox.

Payload
PropertyTypeDescription
activityObjectActivity payload
recipientsArrayList of recipients URIs
localBooleanTrue if activity was sent by a local actor

activitypub.like.added

Sent after an actor likes an object

Payload
PropertyTypeDescription
actorUriStringURI of the actor
objectUriStringURI of the object

activitypub.like.removed

Sent after an actor stops liking an object

Payload
PropertyTypeDescription
actorUriStringURI of the actor
objectUriStringURI of the object

activitypub.outbox.posted

Sent after an actor sends an activity through his outbox.

Payload
PropertyTypeDescription
activityObjectActivity payload