mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-04 07:24:13 +00:00 
			
		
		
		
	perf(server): use cached user info in getUserFromApId
This commit is contained in:
		
							parent
							
								
									8cbfc047bb
								
							
						
					
					
						commit
						17589843da
					
				
					 5 changed files with 38 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -48,7 +48,32 @@ export class Cache<T> {
 | 
			
		|||
 | 
			
		||||
		// Cache MISS
 | 
			
		||||
		const value = await fetcher();
 | 
			
		||||
		this.set(key, value);
 | 
			
		||||
		return value;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します
 | 
			
		||||
	 * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします
 | 
			
		||||
	 */
 | 
			
		||||
	public async fetchMaybe(key: string | null, fetcher: () => Promise<T | undefined>, validator?: (cachedValue: T) => boolean): Promise<T | undefined> {
 | 
			
		||||
		const cachedValue = this.get(key);
 | 
			
		||||
		if (cachedValue !== undefined) {
 | 
			
		||||
			if (validator) {
 | 
			
		||||
				if (validator(cachedValue)) {
 | 
			
		||||
					// Cache HIT
 | 
			
		||||
					return cachedValue;
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				// Cache HIT
 | 
			
		||||
				return cachedValue;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Cache MISS
 | 
			
		||||
		const value = await fetcher();
 | 
			
		||||
		if (value !== undefined) {
 | 
			
		||||
			this.set(key, value);
 | 
			
		||||
		}
 | 
			
		||||
		return value;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,14 @@
 | 
			
		|||
import escapeRegexp from 'escape-regexp';
 | 
			
		||||
import config from '@/config/index.js';
 | 
			
		||||
import { Note } from '@/models/entities/note.js';
 | 
			
		||||
import { User, IRemoteUser, CacheableRemoteUser } from '@/models/entities/user.js';
 | 
			
		||||
import { User, IRemoteUser, CacheableRemoteUser, CacheableUser } from '@/models/entities/user.js';
 | 
			
		||||
import { UserPublickey } from '@/models/entities/user-publickey.js';
 | 
			
		||||
import { MessagingMessage } from '@/models/entities/messaging-message.js';
 | 
			
		||||
import { Notes, Users, UserPublickeys, MessagingMessages } from '@/models/index.js';
 | 
			
		||||
import { IObject, getApId } from './type.js';
 | 
			
		||||
import { resolvePerson } from './models/person.js';
 | 
			
		||||
import { Cache } from '@/misc/cache.js';
 | 
			
		||||
import { userByIdCache } from '@/services/user-cache.js';
 | 
			
		||||
import { uriPersonCache, userByIdCache } from '@/services/user-cache.js';
 | 
			
		||||
 | 
			
		||||
const publicKeyCache = new Cache<UserPublickey | null>(Infinity);
 | 
			
		||||
const publicKeyByUserIdCache = new Cache<UserPublickey | null>(Infinity);
 | 
			
		||||
| 
						 | 
				
			
			@ -59,19 +59,19 @@ export default class DbResolver {
 | 
			
		|||
	/**
 | 
			
		||||
	 * AP Person => Misskey User in DB
 | 
			
		||||
	 */
 | 
			
		||||
	public async getUserFromApId(value: string | IObject): Promise<User | null> {
 | 
			
		||||
	public async getUserFromApId(value: string | IObject): Promise<CacheableUser | null> {
 | 
			
		||||
		const parsed = this.parseUri(value);
 | 
			
		||||
 | 
			
		||||
		if (parsed.id) {
 | 
			
		||||
			return await Users.findOneBy({
 | 
			
		||||
			return await userByIdCache.fetchMaybe(parsed.id, () => Users.findOneBy({
 | 
			
		||||
				id: parsed.id,
 | 
			
		||||
			});
 | 
			
		||||
			}).then(x => x ?? undefined)) ?? null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (parsed.uri) {
 | 
			
		||||
			return await Users.findOneBy({
 | 
			
		||||
			return await uriPersonCache.fetch(parsed.uri, () => Users.findOneBy({
 | 
			
		||||
				uri: parsed.uri,
 | 
			
		||||
			});
 | 
			
		||||
			}));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return null;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,6 @@ export default async (actor: CacheableRemoteUser, activity: IBlock): Promise<str
 | 
			
		|||
		return `skip: ブロックしようとしているユーザーはローカルユーザーではありません`;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	await block(await Users.findOneByOrFail({ id: actor.id }), blockee);
 | 
			
		||||
	await block(await Users.findOneByOrFail({ id: actor.id }), await Users.findOneByOrFail({ id: blockee.id }));
 | 
			
		||||
	return `ok`;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,12 +3,12 @@ import renderBlock from '@/remote/activitypub/renderer/block.js';
 | 
			
		|||
import renderUndo from '@/remote/activitypub/renderer/undo.js';
 | 
			
		||||
import { deliver } from '@/queue/index.js';
 | 
			
		||||
import Logger from '../logger.js';
 | 
			
		||||
import { User } from '@/models/entities/user.js';
 | 
			
		||||
import { CacheableUser, User } from '@/models/entities/user.js';
 | 
			
		||||
import { Blockings, Users } from '@/models/index.js';
 | 
			
		||||
 | 
			
		||||
const logger = new Logger('blocking/delete');
 | 
			
		||||
 | 
			
		||||
export default async function(blocker: User, blockee: User) {
 | 
			
		||||
export default async function(blocker: CacheableUser, blockee: CacheableUser) {
 | 
			
		||||
	const blocking = await Blockings.findOneBy({
 | 
			
		||||
		blockerId: blocker.id,
 | 
			
		||||
		blockeeId: blockee.id,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,11 +4,11 @@ import renderAccept from '@/remote/activitypub/renderer/accept.js';
 | 
			
		|||
import { deliver } from '@/queue/index.js';
 | 
			
		||||
import { publishMainStream } from '@/services/stream.js';
 | 
			
		||||
import { insertFollowingDoc } from '../create.js';
 | 
			
		||||
import { User, ILocalUser } from '@/models/entities/user.js';
 | 
			
		||||
import { User, ILocalUser, CacheableUser } from '@/models/entities/user.js';
 | 
			
		||||
import { FollowRequests, Users } from '@/models/index.js';
 | 
			
		||||
import { IdentifiableError } from '@/misc/identifiable-error.js';
 | 
			
		||||
 | 
			
		||||
export default async function(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, follower: User) {
 | 
			
		||||
export default async function(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, follower: CacheableUser) {
 | 
			
		||||
	const request = await FollowRequests.findOneBy({
 | 
			
		||||
		followeeId: followee.id,
 | 
			
		||||
		followerId: follower.id,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue