ActivityPub Code

From Organic Design wiki

https://www.w3.org/TR/activitypub

Client/Server

The specification doesn't seem to provide endpoints for interacting with an AP server, that is why I believe that most servers use WebFinger. The only issue is that I can't find that in the specification either.

User Discovery

To request the user's endpoint from the server run the following command.

curl <URL>/.well-known/webfinger?resource=<ACCOUNT NAME>@<URL> \
	-X GET \
	-H "Accept: application/json"

This should return an object describing the user on the server, you should look for inside the links property for an object that has the property "type": "application/activity+json", the next command should be made to the href property of that object.

curl <HREF PROPERTY> \
	-X GET \
	-H "Accept: application/activity+json"

That command should return an object describing the relevant endpoints for that user.

JS Code

const fetch = require("node-fetch");

const url = "mastodon.online";
const user = "john";

const fetcher = async (url, type = "application/json") => {
	const data = await fetch(url, {
		headers: {
			Accept: type
		}
	});

	return await data.json();
}

const getLatestActivities = async () => {
	let data = await fetcher(`https://${url}/.well-known/webfinger?resource=${user}@${url}`);

	let userUrl;

	for (const link of data.links) {
		if (link.type === "application/activity+json") {
			userUrl = link.href;
			break;
		}
	}

	if (!userUrl)
		throw "Could not find user activity url.";

	data = await fetcher(userUrl, "application/activity+json");

	if (!data.outbox)
		throw "No outbox specifed under the user.";

	data = await fetcher(data.outbox);

	if (!data.last)
		throw "Could not find last items in outbox.";

	data = await fetcher(data.last);

	return data;
};