191 lines · 7.5 KB
import { beforeEach, describe, expect, mock, test } from "bun:test";
import { fakeStorage } from "./do-test-storage";

const env: Record<string, unknown> = {};
mock.module("cloudflare:workers", () => ({
  env,
  DurableObject: class {
    ctx: unknown;
    env: unknown;
    constructor(ctx: unknown, workerEnv: unknown) {
      this.ctx = ctx;
      this.env = workerEnv;
    }
  },
}));
mock.module("@tanstack/react-start/server", () => ({ getRequestHeader: () => null }));
mock.module("./db", () => ({ first: async () => ({ hits: 1 }), run: async () => undefined }));

const { RateLimiter } = await import("./rate-limiter-do");
const { rateLimitDigest, rateLimitShard, RATE_LIMIT_SHARDS } = await import("./rate-limit-shard");
const { enforceRateLimit, withinRateLimit, limitWrite, limitBrowse, resetRateLimitCache, RATE_LIMITS } =
  await import("./limits");

type Limiter = InstanceType<typeof RateLimiter>;
let shards: Map<string, { storage: ReturnType<typeof fakeStorage>; object: Limiter }>;
let objectDown = false;
let platformSays = true;
let rpcCalls = 0;

function shard(name: string) {
  let entry = shards.get(name);
  if (!entry) {
    const storage = fakeStorage();
    entry = { storage, object: new RateLimiter({ storage } as never, {} as never) };
    shards.set(name, entry);
  }
  return entry;
}

function installEnv(): void {