* [auth][api] accept the 20250424.01 client * [2025] unstable * 20250718.0 * correct one this time * stubs * more stubs * more stubs * [lists] add worker * [ai] route stubs * [api] player photo setting * [econ] add roomEconConfig route * [infra] update worker generators * [worker] add cards/moderation/platformnotification workers * [lists] updates to some endpoints * [clubs] stub out announcement endpoint, for now * [econ] stub out season endpoints for now * [chat] apps/chat stub out party endpoint not sure the shape yet * [api] stub out statsig and lockeditems * [doc] new services * [lists] stub the bulk endpoint * [datacollection] add placeholder service until we can kill it * [api] set gifting to lvl5 * update lock * [cdn] enable cache * [match] matchmake v2 * [lists] stub some lists * [ai] stubs * [rooms] new subroom save endpoint * [econ] add bulk purchase endpoint * [discovery] update featured creator to 1 for fun * [api] add photo settings flag * [chat] fixup chat permissions (sorta) * [auth] restrictions endpoint * [rooms] contributed endpoint * [api] fix outfit endpoint * [discovery] attempt to fix store * [chat] privacy endpoints * [api] cheered images * [rooms] add xp endpoint (disbaled) * [rooms] add xp endpoint (disabled) * update images-db for cheers * [rooms] add autocomplete endpoint * [cdn/img] increase cache ttl for statics * [api] bulk route for images * [accounts] add banner image * [api] add misc missing endpoints * [discovery] remove AI tab * [platformnotifications] stub some endpoints * [lists] add some more lists * [rooms] additional endpoints * [chat] stub a few privacy endpoints * [econ] stub some endpoints * misc db fixes * [api] tweak shape for images v6 * [rooms] dont show trending RROs
2.6 KiB
discovery
Discovery Worker served on the discovery subdomain (discovery.recflare.net) — a Hono
app that tells the client which carousels each of its discovery pages shows, and in what
order.
GET /sections/pagesource/{type} serves one page's sections verbatim from
static/<type>.json. {type} IS the filename — it is passed through unchanged and matched
exactly, case included — so the page sources that exist are whichever files are published:
WatchHome, PlayHighlight, CommunityBoard, PlayMenuTabs, PlayCategories,
StoreFeatured, StoreClothing, StoreConsumables and bulk at the time of writing.
Adding one is dropping in a file; nothing in src/ enumerates them.
That works because static/ is uploaded as Workers static assets rather than bundled into
the script (a bundled import can't do it — the bundler has to see every path at build
time), and the handler reads them through the ASSETS binding. run_worker_first is set so
the runtime never serves a layout directly at /WatchHome.json: the files are reachable
only through the documented route. Names that could climb out of static/ are refused
before they reach the binding, and the asset response is passed through whole, so
If-None-Match gets a 304 for free.
The body is a bare ARRAY of sections with camelCase fields (id, sectionType,
sectionSubType, source, sourceMetadata, displayMetadata), the last two nullable and
displayMetadata an embedded JSON string the client parses itself. This replaces the
Discovery.DiscoveryPageContent.* game configs (see
apps/api/static/gameconfigs-v1-all.json), which the client reads instead when
Discovery.UseNewDiscoveryServerAPI is off — note they are NOT the same shape: the configs
wrap the list in { pageSource, sections } with PascalCase fields.
A section only names a feed — source/sourceMetadata, e.g. Hot, Recent,
PlaylistById + an id, CarouselEndpoint + a slug — which the client resolves against the
rooms/api workers itself. Nothing here is player-specific, so the routes are
unauthenticated and every client gets the same layout.
API documentation
GET /openapi.json serves a spec generated from describeRoute blocks that sit alongside
each handler, with the schemas in src/openapi.ts. It's also aggregated into the docs page
www serves at /docs.
The spec is descriptive, not enforced — same rationale as the other workers: a reverse-engineered protocol, lenient handlers, no runtime validation.
Development
Run in dev mode
pnpm dev
Run tests
pnpm test
Deploy
pnpm turbo deploy