Skip to content

Commit

Permalink
インスタンスモデレーションのキャッシュが即時反映されるように
Browse files Browse the repository at this point in the history
  • Loading branch information
mei23 committed Mar 20, 2021
1 parent 2697ccb commit 9b078b1
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 1 deletion.
12 changes: 12 additions & 0 deletions src/misc/instance-info.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Instance from '../models/instance';
import { toApHost } from './convert-host';
import { getServerSubscriber } from '../services/server-subscriber';

let blockedHosts: Set<string>;
let closedHosts: Set<string>;
Expand Down Expand Up @@ -28,8 +29,19 @@ async function Update() {
closedHosts = new Set(closed.map(x => toApHost(x.host)));
}

// 初回アップデート
Update();

// 一定時間ごとにアップデート
setInterval(() => {
Update();
}, 300 * 1000);

// イベントでアップデート
const ev = getServerSubscriber();

ev.on('serverEvent', (data: any) => {
if (data.type === 'instanceModUpdated') {
Update();
}
});
5 changes: 4 additions & 1 deletion src/server/api/endpoints/admin/federation/update-instance.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import $ from 'cafy';
import define from '../../../define';
import Instance from '../../../../../models/instance';
import { publishInstanceModUpdated } from '../../../../../services/create-event';

export const meta = {
tags: ['admin'],
Expand Down Expand Up @@ -30,12 +31,14 @@ export default define(meta, async (ps, me) => {
throw new Error('instance not found');
}

Instance.update({ host: ps.host }, {
await Instance.update({ host: ps.host }, {
$set: {
isBlocked: ps.isBlocked,
isMarkedAsClosed: ps.isClosed
}
});

publishInstanceModUpdated();

return;
});
4 changes: 4 additions & 0 deletions src/services/create-event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,7 @@ export async function publishFilterChanged(userId: mongo.ObjectID) {
export async function publishTerminate(userId: mongo.ObjectID) {
await publishServerEvent(userId, 'terminate');
}

export async function publishInstanceModUpdated() {
await publishServerEvent(null, 'instanceModUpdated');
}
29 changes: 29 additions & 0 deletions src/services/server-subscriber.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import * as redis from 'redis';
import config from '../config';
import { EventEmitter } from 'events';

let ev: EventEmitter;

export function getServerSubscriber() {
if (!ev) setupServerEv();
return ev;
}

function setupServerEv() {
const subscriber = redis.createClient(
config.redis.port,
config.redis.host,
{
password: config.redis.pass
}
);

subscriber.subscribe(config.host);

ev = new EventEmitter();

subscriber.on('message', async (_, data) => {
const obj = JSON.parse(data);
ev.emit(obj.channel, obj.message);
});
}

0 comments on commit 9b078b1

Please sign in to comment.