Skip to content

Commit 5233c8e

Browse files
feat(gate): redis-less mode (#528)
### Describe your change Fallback to `MemoryRegister` and `NoLimiter` if typegate is unable to connect to Redis. ### Motivation and context Enable Redis-Less mode. ### Migration notes <!-- Explain HOW users should update their code when required --> ### Checklist - [ ] The change come with new or modified tests - [ ] Hard-to-understand functions have explanatory comments - [ ] End-user documentation is updated to reflect the change
1 parent 2cb977e commit 5233c8e

File tree

3 files changed

+33
-14
lines changed

3 files changed

+33
-14
lines changed

typegate/engine/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ pub async fn launch_typegate_deno(
102102
main_mod: deno_core::ModuleSpecifier,
103103
import_map_url: Option<String>,
104104
) -> Result<()> {
105+
std::env::var("REDIS_URL")
106+
.ok()
107+
.ok_or_else(|| std::env::set_var("REDIS_URL", "none"))
108+
.ok();
109+
105110
let permissions = deno_runtime::permissions::PermissionsOptions {
106111
allow_run: Some(["hostname"].into_iter().map(str::to_owned).collect()),
107112
allow_sys: Some(vec![]),

typegate/src/config.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ const schema = {
1919
hostname: z.string(),
2020
redis_url: z
2121
.string()
22-
.url()
2322
.transform((s: string) => {
23+
if (s == "none") {
24+
return new URL("redis://none");
25+
}
2426
const url = new URL(s);
2527
if (url.password === "") {
2628
url.password = Deno.env.get("REDIS_PASSWORD") ?? "";

typegate/src/main.ts

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44
import { deferred } from "std/async/deferred.ts";
55
import { init_native } from "native";
66

7-
import { ReplicatedRegister } from "./typegate/register.ts";
7+
import { Register, ReplicatedRegister } from "./typegate/register.ts";
88
import config, { redisConfig } from "./config.ts";
99
import { Typegate } from "./typegate/mod.ts";
10-
import { RedisRateLimiter } from "./typegate/rate_limiter.ts";
10+
import { RateLimiter, RedisRateLimiter } from "./typegate/rate_limiter.ts";
1111
import { SystemTypegraph } from "./system_typegraphs.ts";
1212
import * as Sentry from "sentry";
1313
import { getLogger } from "./log.ts";
1414
import { init_runtimes } from "./runtimes/mod.ts";
15+
import { MemoryRegister } from "test-utils/memory_register.ts";
16+
import { NoLimiter } from "test-utils/no_limiter.ts";
1517

1618
const logger = getLogger(import.meta);
1719
logger.info(`typegate v${config.version} starting`);
@@ -46,19 +48,29 @@ init_native();
4648
await init_runtimes();
4749

4850
const deferredTypegate = deferred<Typegate>();
49-
const register = await ReplicatedRegister.init(
50-
deferredTypegate,
51-
redisConfig,
52-
);
53-
const limiter = await RedisRateLimiter.init(redisConfig);
54-
const typegate = new Typegate(register, limiter);
51+
let register: Register | undefined;
52+
let limiter: RateLimiter | undefined;
53+
54+
if (redisConfig.hostname != "none") {
55+
register = await ReplicatedRegister.init(deferredTypegate, redisConfig);
56+
limiter = await RedisRateLimiter.init(redisConfig);
57+
} else {
58+
logger.warning("Entering Redis-less mode");
59+
register = new MemoryRegister();
60+
limiter = new NoLimiter();
61+
}
62+
63+
const typegate = new Typegate(register!, limiter!);
64+
5565
deferredTypegate.resolve(typegate);
5666

57-
const lastSync = await register.historySync().catch((err) => {
58-
logger.error(err);
59-
throw new Error(`failed to load history at boot, aborting: {err.message}`);
60-
});
61-
register.startSync(lastSync);
67+
if (register instanceof ReplicatedRegister) {
68+
const lastSync = await register.historySync().catch((err) => {
69+
logger.error(err);
70+
throw new Error(`failed to load history at boot, aborting: ${err.message}`);
71+
});
72+
register.startSync(lastSync);
73+
}
6274

6375
await SystemTypegraph.loadAll(typegate, !config.packaged);
6476

0 commit comments

Comments
 (0)