From 483eee421fb68906101693f1a5fa46eefd2671c1 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Sat, 22 Jun 2024 13:27:39 +0900 Subject: [PATCH] Use @fedify/redis --- .env.sample | 1 + bun.lockb | Bin 141837 -> 146421 bytes package.json | 4 +++- src/federation/index.ts | 14 ++++++++------ src/redis.ts | 10 ++++++++++ 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 src/redis.ts diff --git a/.env.sample b/.env.sample index f7b0ecf..9f0990e 100644 --- a/.env.sample +++ b/.env.sample @@ -1,4 +1,5 @@ DATABASE_URL=postgresql://user:password@localhost:5432/dbname +REDIS_URL=redis://localhost/0 SECRET_KEY=secret_key # generate a secret key with `openssl rand -base64 32` LOG_LEVEL=info BEHIND_PROXY=false diff --git a/bun.lockb b/bun.lockb index fbe1a23c45add6a23595b2ec6f1e657e3cb15808..9dbc0e013a073fd8aca7d4dc928deb92bef97c3f 100755 GIT binary patch delta 28732 zcmeHwcU%<7)^^tjE`wqYAfsYVfCL2;9WV<6#?>)_A|Rq90doM|q?j$W%sIz3r!}q# z6cuycb$3ncuB+Zn#{Hht-Nmr3-uvD6zW4ime{BDF`qVjfs_L9mp?jvAn#mU(e)-K| znrEG>c>_NPYka`*q+fb_L&<61gnv2Pl<@tKYlWJRe%|Jfo8w~x4GJBdr&}u7~=dOi@aL-#vXx`HbQAic$tl3}{)<&Y+Z;SXfbtgQlk?#P>ygfsi|c z-)N^OZlG1bR{)&|zAC5_c&aBEyb1I-&~l(1K`VjY(Rp8;&jp2kMrL^=sKARtic%5u z254o_MRi{bOTOohto&0}c)sPt;3wQ@^A zjl7kibe$yUjIfe@X`s|oBT$OE zH$FKvHYPqzxr}I0Pvn4--T|F%042v4f>O`M#3l_I9IGfXv3&=}q4vZyoN!D=K1|LW z1xoezPfkiEd9r3*M&=7wMS<;^&CzY7_$eq=`~#GTzXD1yK5<1t{X6q8@Q5OsaMN^rB>Sx&sfp?7Pb4cYOa7$=$g ze6Ujd%vQ$VQ?lR**v%m+T&*!aUwtFW8DX4q@UOCx_TC>fd-pgHy(DAjX8 zFV`~w@u#`+)LXNB88V2sf>I>1bp8zTso=;!&9iVAKicQa6NQ6#p2QU%jNse%!p)L>6g^0X-^Eqvub(cPJ^ zytImLfl_`cgq9kxf>Qa7%{51MBcB{P2THSLXA5nNrKP7P4Nk;hT?PRSqUBJaX(m_b z8!fd#)T5Qw&;;a@<(*nH^0wo#bYXZ1j7u#^TR%U@WuKAae?g**k6y5=V26p=66DGFv%W>|YoZx?7u@Y|42 zgKY*VH9Q8C9PI^4T~{2mg7Tq~d8?z=P)i7?!8)MSz=KdN)JH%uvodo!YlbccPYsUJ zX$&Zps|!bpfUfMqM|@B-r1*aQ6eWFlN-Rn$ zrfymfspAFwZM_`n(oqt8QIt=NO-zm-5gU7;yH?+JP)EqufKq<{sH6e$WXXXZTE^xc zyskr~j8A%M`tH575ik~%;vApU9~Y+dwD_cc3Gs3L(?>v$+?WOXOMu3v^&K3KbuG8I z=KfyL(vYtLrFhQN<(WF4sOR_8IQ2alS1iD%2N1oinxTY~!GDV|>LCLf6pcDxjXEY`b z4boPlm7p{gCWF!t9|}rc5D7}_Y8z0BSbaU;Wze?0j(&!2O~iM1&$V?ccQUC;vAhdA zceqx$@jSdzw^>DsRh`nKS?6M=%dc+uTX(b>S@e&lmD=yNThwlh>1Fr+x2JrhG`LeC z=lF{4M=$NTGPUi#P7}|iHE3yn&BfQ-(KxjYe^RuqL;8WupIppwn8W)xxp^HaJorV8 zoV)2^Yi@;h%sRfXM7Ikg%9bs)V(Xll2k*UTQsZgQVFP~{QMrxvRQ+X3=1%eAyPez| zPQUo7QgDWCV0U4>V^-euATd9SkE<^y|zd8ELZjB@$nbE22FLJH@V)Yh3k*7 zq-)1o+*m%yezLuygmI_xf%eysYNw`Z z6;_nilroM&%8U|>cP!`6_VN(tAp0L6`;c;3FwX|R`~yYlrj~n&R2f(&rIjs)u@a${7>HDqnmUb?W^VJ3EM?pS zPHP2q*#AQMJiJn%(F4=2wOUWfYW~J);2PzZ$p(k3I9#P*6vc#W46YDIFpRCikxd8# z^1cVxK`lofHO7<I2%S?0nf+dHVLZ1=ps_F}I<;&^gU=WSj=EO$z&;b451(8! z(0(gY?mV}0pz$_RZK1)`_G{wapqa{{v>~nn&#GxQhzdLh#L2`RYnct5Ogyxf*?x`* zmh$jgfrc|Co>R+gbi(}*Zay*za*YDrs?5rk!+IC56D9uF?-VEC#s5A`)0>$oWj z?kF-HDY%AVZalP}*?0oNmTLLw)%}e{aC;F9POIAjj(QOBM@uunQM?NC=?wxLz|i

)>KNFQ;pd^X8V{L@R>VR3p6aP!Lz)~ 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 delta 26230 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 diff --git a/package.json b/package.json index a9e88c6..17f360c 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,10 @@ "dependencies": { "@aws-sdk/client-s3": "^3.577.0", "@aws-sdk/credential-providers": "^3.577.0", - "@fedify/fedify": "0.10.0-dev.211", + "@fedify/fedify": "^0.11.0-dev.234", "@fedify/markdown-it-hashtag": "0.2.0", "@fedify/markdown-it-mention": "^0.1.1", + "@fedify/redis": "^0.1.1", "@hono/zod-validator": "^0.2.1", "@js-temporal/polyfill": "^0.4.4", "@logtape/logtape": "^0.4.0", @@ -25,6 +26,7 @@ "cheerio": "^1.0.0-rc.12", "drizzle-orm": "^0.30.10", "hono": "^4.3.4", + "ioredis": "^5.4.1", "iso-639-1": "^3.1.2", "markdown-it": "^14.1.0", "markdown-it-replace-link": "^1.2.1", diff --git a/src/federation/index.ts b/src/federation/index.ts index a45464c..96d7987 100644 --- a/src/federation/index.ts +++ b/src/federation/index.ts @@ -6,26 +6,26 @@ import { Create, Delete, Endpoints, - Federation, Follow, Image, - InProcessMessageQueue, Like, - MemoryKvStore, Note, PropertyValue, Reject, Undo, Update, + createFederation, getActorClassByTypeName, importJwk, isActor, } from "@fedify/fedify"; +import { RedisKvStore, RedisMessageQueue } from "@fedify/redis"; import { getLogger } from "@logtape/logtape"; import { parse } from "@std/semver"; import { and, count, eq, ilike, inArray, like, sql } from "drizzle-orm"; import metadata from "../../package.json" with { type: "json" }; import db from "../db"; +import redis, { createRedis } from "../redis"; import { type NewLike, accountOwners, @@ -38,9 +38,11 @@ import { persistAccount } from "./account"; import { toTemporalInstant } from "./date"; import { persistPost, persistSharingPost, toObject } from "./post"; -export const federation = new Federation({ - kv: new MemoryKvStore(), - queue: new InProcessMessageQueue(), +export const federation = createFederation({ + kv: new RedisKvStore(redis), + queue: new RedisMessageQueue(createRedis, { + loopInterval: { seconds: 2, milliseconds: 500 }, + }), }); federation diff --git a/src/redis.ts b/src/redis.ts new file mode 100644 index 0000000..d7e8351 --- /dev/null +++ b/src/redis.ts @@ -0,0 +1,10 @@ +import { Redis } from "ioredis"; + +export function createRedis(): Redis { + // biome-ignore lint/complexity/useLiteralKeys: tsc rants about this (TS4111) + const redisUrl = process.env["REDIS_URL"]; + if (redisUrl == null) throw new Error("REDIS_URL must be defined"); + return new Redis(redisUrl); +} + +export default createRedis();