Skip to content

feat(gate): redis-less mode #528

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Dec 21, 2023
39 changes: 26 additions & 13 deletions typegate/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@
import { deferred } from "std/async/deferred.ts";
import { init_native } from "native";

import { ReplicatedRegister } from "./typegate/register.ts";
import { Register, ReplicatedRegister } from "./typegate/register.ts";
import config, { redisConfig } from "./config.ts";
import { Typegate } from "./typegate/mod.ts";
import { RedisRateLimiter } from "./typegate/rate_limiter.ts";
import { RateLimiter, RedisRateLimiter } from "./typegate/rate_limiter.ts";
import { SystemTypegraph } from "./system_typegraphs.ts";
import * as Sentry from "sentry";
import { getLogger } from "./log.ts";
import { init_runtimes } from "./runtimes/mod.ts";
import { MemoryRegister } from "test-utils/memory_register.ts";
import { NoLimiter } from "test-utils/no_limiter.ts";

const logger = getLogger(import.meta);
logger.info(`typegate v${config.version} starting`);
Expand Down Expand Up @@ -46,19 +48,30 @@ init_native();
await init_runtimes();

const deferredTypegate = deferred<Typegate>();
const register = await ReplicatedRegister.init(
deferredTypegate,
redisConfig,
);
const limiter = await RedisRateLimiter.init(redisConfig);
const typegate = new Typegate(register, limiter);
let register: Register | undefined;
let limiter: RateLimiter | undefined;

try {
register = await ReplicatedRegister.init(deferredTypegate, redisConfig);
limiter = await RedisRateLimiter.init(redisConfig);
} catch (err) {
logger.warning(err);
logger.warning("Entering Redis-less mode");
register = new MemoryRegister();
limiter = new NoLimiter();
}

const typegate = new Typegate(register!, limiter!);

deferredTypegate.resolve(typegate);

const lastSync = await register.historySync().catch((err) => {
logger.error(err);
throw new Error(`failed to load history at boot, aborting: {err.message}`);
});
register.startSync(lastSync);
if (register instanceof ReplicatedRegister) {
const lastSync = await register.historySync().catch((err) => {
logger.error(err);
throw new Error(`failed to load history at boot, aborting: ${err.message}`);
});
register.startSync(lastSync);
}

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

Expand Down