Files
FrozenFriendsYume/packages/backend/built/remote/activitypub/kernel/bite.js
T
2026-07-26 18:25:37 +09:00

62 lines
2.1 KiB
JavaScript

import Resolver from "../resolver.js";
import { fetchPerson } from "../models/person.js";
import { createBite } from "../../../services/create-bite.js";
import { tickBiteIncoming } from "../../../metrics.js";
import { getNote } from "../../../server/api/common/getters.js";
import { parseUri } from "../db-resolver.js";
export default (async (actor, bite)=>{
if (actor.uri !== bite.actor) {
return "skip: actor uri mismatch";
}
if (bite.id === null) {
return "skip: bite id not specified";
}
const resolver = new Resolver();
const biteActor = await fetchPerson(bite.actor, resolver);
if (biteActor === null) {
return "skip: biteActor is null";
}
const targetParsed = parseUri(bite.target);
if (!targetParsed.local) {
return "skip: target is not local";
}
const targetDbId = targetParsed.id;
const targetPathType = targetParsed.type;
let targetType;
let targetId;
let fallback = false;
if (targetPathType === "users") {
targetType = "user";
targetId = targetDbId;
} else if (targetPathType === "bites") {
targetType = "bite";
targetId = targetDbId;
} else if (targetPathType === "notes") {
targetType = "note";
targetId = targetDbId;
try {
await getNote(targetDbId, actor);
} catch (err) {
if (err.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24") {
// note either doesn't exist or the remote user shouldn't be able to access it
fallback = true;
}
}
} else {
fallback = true;
}
if (fallback) {
// fallback for unknown object types
targetType = "user";
if (bite.to !== undefined) {
const to = Array.isArray(bite.to) ? bite.to[0] : bite.to;
targetId = to.split("/").pop();
} else {
return "skip: unknown type missing to field";
}
}
await createBite(biteActor, targetType, targetId, bite.id, bite.published ? new Date(bite.published) : null);
tickBiteIncoming();
return "ok";
});