summaryrefslogtreecommitdiff
path: root/src/services/relay.ts
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2020-05-10 18:42:31 +0900
committerGitHub <noreply@github.com>2020-05-10 18:42:31 +0900
commit145389768d434c46bd24662488294eead7d3addb (patch)
tree1530f59a5c189d25500c18fc5ef21b3173b1321f /src/services/relay.ts
parentfix(server): Remove koa-compress (diff)
downloadmisskey-145389768d434c46bd24662488294eead7d3addb.tar.gz
misskey-145389768d434c46bd24662488294eead7d3addb.tar.bz2
misskey-145389768d434c46bd24662488294eead7d3addb.zip
pub-relay (#6341)
* pub-relay * relay actorをApplicationにする * Disable koa-compress * Homeはリレーに送らない * Disable debug * UI * cleanupなど
Diffstat (limited to 'src/services/relay.ts')
-rw-r--r--src/services/relay.ts96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/services/relay.ts b/src/services/relay.ts
new file mode 100644
index 0000000000..aa3179675d
--- /dev/null
+++ b/src/services/relay.ts
@@ -0,0 +1,96 @@
+import { createSystemUser } from './create-system-user';
+import { renderFollowRelay } from '../remote/activitypub/renderer/follow-relay';
+import { renderActivity, attachLdSignature } from '../remote/activitypub/renderer';
+import renderUndo from '../remote/activitypub/renderer/undo';
+import { deliver } from '../queue';
+import { ILocalUser } from '../models/entities/user';
+import { Users, Relays } from '../models';
+import { genId } from '../misc/gen-id';
+
+const ACTOR_USERNAME = 'relay.actor' as const;
+
+export async function getRelayActor(): Promise<ILocalUser> {
+ const user = await Users.findOne({
+ host: null,
+ username: ACTOR_USERNAME
+ });
+
+ if (user) return user as ILocalUser;
+
+ const created = await createSystemUser(ACTOR_USERNAME);
+ return created as ILocalUser;
+}
+
+export async function addRelay(inbox: string) {
+ const relay = await Relays.save({
+ id: genId(),
+ inbox,
+ status: 'requesting'
+ });
+
+ const relayActor = await getRelayActor();
+ const follow = await renderFollowRelay(relay, relayActor);
+ const activity = renderActivity(follow);
+ deliver(relayActor, activity, relay.inbox);
+
+ return relay;
+}
+
+export async function removeRelay(inbox: string) {
+ const relay = await Relays.findOne({
+ inbox
+ });
+
+ if (relay == null) {
+ throw 'relay not found';
+ }
+
+ const relayActor = await getRelayActor();
+ const follow = renderFollowRelay(relay, relayActor);
+ const undo = renderUndo(follow, relayActor);
+ const activity = renderActivity(undo);
+ deliver(relayActor, activity, relay.inbox);
+
+ await Relays.delete(relay.id);
+}
+
+export async function listRelay() {
+ const relays = await Relays.find();
+ return relays;
+}
+
+export async function relayAccepted(id: string) {
+ const result = await Relays.update(id, {
+ status: 'accepted'
+ });
+
+ return JSON.stringify(result);
+}
+
+export async function relayRejected(id: string) {
+ const result = await Relays.update(id, {
+ status: 'rejected'
+ });
+
+ return JSON.stringify(result);
+}
+
+export async function deliverToRelays(user: ILocalUser, activity: any) {
+ if (activity == null) return;
+
+ const relays = await Relays.find({
+ status: 'accepted'
+ });
+ if (relays.length === 0) return;
+
+ const relayActor = await getRelayActor();
+
+ const copy = JSON.parse(JSON.stringify(activity));
+ if (!copy.to) copy.to = ['https://www.w3.org/ns/activitystreams#Public'];
+
+ const signed = await attachLdSignature(copy, user);
+
+ for (const relay of relays) {
+ deliver(relayActor, signed, relay.inbox);
+ }
+}