64 lines
2 KiB
TypeScript
64 lines
2 KiB
TypeScript
|
|
import { idsFromValue } from "./activitypub";
|
||
|
|
import * as db from "./db";
|
||
|
|
import { ACTOR, BASE_URL } from "./env";
|
||
|
|
import outbox from "./outbox";
|
||
|
|
import { send } from "./request";
|
||
|
|
|
||
|
|
export default async function inbox(activity:any) {
|
||
|
|
const date = new Date()
|
||
|
|
// get the main recipients ([...new Set()] is to dedupe)
|
||
|
|
const recipientList = [...new Set(idsFromValue(activity.to).concat(idsFromValue(activity.cc)).concat(idsFromValue(activity.audience)))]
|
||
|
|
|
||
|
|
// if my list of followers in the list of recipients, then forward to them as well
|
||
|
|
if(recipientList.includes(ACTOR + "/followers")) {
|
||
|
|
(await db.listFollowers()).forEach(f => send(activity.attributedTo, f, activity))
|
||
|
|
}
|
||
|
|
|
||
|
|
// save this activity to my inbox
|
||
|
|
const id = `${date.getTime().toString(16)}`
|
||
|
|
db.createInboxActivity(activity, id)
|
||
|
|
|
||
|
|
// TODO: process the activity and update local data
|
||
|
|
switch(activity.type) {
|
||
|
|
case "Follow": follow(activity, id); break;
|
||
|
|
case "Accept": accept(activity); break;
|
||
|
|
case "Reject": reject(activity); break;
|
||
|
|
case "Undo": undo(activity); break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const follow = async (activity:any, id:string) => {
|
||
|
|
// someone is following me
|
||
|
|
// save this follower locally
|
||
|
|
db.createFollower(activity.actor, id)
|
||
|
|
// send an accept message to the outbox
|
||
|
|
await outbox({
|
||
|
|
"@context": "https://www.w3.org/ns/activitystreams",
|
||
|
|
type: "Accept",
|
||
|
|
actor: ACTOR,
|
||
|
|
to: [activity.actor],
|
||
|
|
object: activity,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const undo = async (activity:any) => {
|
||
|
|
switch (activity.object.type) {
|
||
|
|
// someone is undoing their follow of me
|
||
|
|
case "Follow": await db.deleteFollower(activity.actor); break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const accept = async (activity:any) => {
|
||
|
|
switch (activity.object.type) {
|
||
|
|
// someone accepted my follow of them
|
||
|
|
case "Follow": await db.acceptFollowing(activity.actor); break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const reject = async (activity:any) => {
|
||
|
|
switch (activity.object.type) {
|
||
|
|
// someone rejected my follow of them
|
||
|
|
case "Follow": await db.deleteFollowing(activity.actor); break
|
||
|
|
}
|
||
|
|
}
|