chore: release v0.0.28

Exempt SPA static assets and admin HTML shell from silo HTTP rate limit so
page loads no longer exhaust HUB_HTTP_REQUESTS_PER_MINUTE.
This commit is contained in:
2026-07-15 22:33:07 +08:00
parent 0782e155f6
commit ae5f78f036
5 changed files with 56 additions and 6 deletions
+25 -1
View File
@@ -1,5 +1,8 @@
import { describe, expect, it } from "vitest";
import { SiloFixedWindowRateLimiter } from "../../src/deployment/siloRateLimit.js";
import {
isSiloHttpRateLimitExempt,
SiloFixedWindowRateLimiter,
} from "../../src/deployment/siloRateLimit.js";
describe("Silo fixed-window rate limiter", () => {
it("returns an explicit retry interval and resets at the next window", () => {
@@ -10,3 +13,24 @@ describe("Silo fixed-window rate limiter", () => {
expect(limiter.consume(61_000)).toEqual({ allowed: true });
});
});
describe("isSiloHttpRateLimitExempt", () => {
it("exempts healthz, SPA static assets, and the admin HTML shell", () => {
expect(isSiloHttpRateLimitExempt("/api/healthz")).toBe(true);
expect(isSiloHttpRateLimitExempt("/_app/version.json")).toBe(true);
expect(isSiloHttpRateLimitExempt("/_app/immutable/chunks/foo.js?v=1")).toBe(true);
expect(isSiloHttpRateLimitExempt("/favicon.ico")).toBe(true);
expect(isSiloHttpRateLimitExempt("/favicon.svg")).toBe(true);
expect(isSiloHttpRateLimitExempt("/robots.txt")).toBe(true);
expect(isSiloHttpRateLimitExempt("/admin")).toBe(true);
expect(isSiloHttpRateLimitExempt("/admin/org/para-26071100/members")).toBe(true);
});
it("still rate-limits APIs and auth", () => {
expect(isSiloHttpRateLimitExempt("/api/me")).toBe(false);
expect(isSiloHttpRateLimitExempt("/api/org/x/members")).toBe(false);
expect(isSiloHttpRateLimitExempt("/auth/feishu/x")).toBe(false);
expect(isSiloHttpRateLimitExempt("/auth/feishu/callback?code=1")).toBe(false);
expect(isSiloHttpRateLimitExempt("/")).toBe(false);
});
});