[studio] beta studio (#114)

* rrs stuff

* studio service yay

* rrs whitelist

* moree studiooooooo fellowwww

* rec room studio room loading yay

* fixes yay

* fix 2 because idk  yayuh

* Update cdn.app.ts

* ccontent length fix?

* Preserve content-length and upgrade metadata

Return a real zero-filled byte array for CDN HEAD responses so the runtime preserves Content-Length while still sending no payload. In notify, re-create the Request with its original headers, set OWNER_HEADER from the validated token, and forward that Request to hub.fetch to avoid losing WebSocket upgrade metadata (which could trigger 500s in Durable Objects). These changes ensure the editor's size checks and WebSocket upgrades remain reliable.

* fix x524234

* shirt thing?

* [auth] remove grant table as we already have audit_log for now

* rename table to generic device_grant

* cleanup/lint

---------

Co-authored-by: Devin Zuczek <devin.zuczek@gmail.com>
This commit is contained in:
Crasho
2026-10-05 19:39:22 +01:00
committed by GitHub
parent 0900bcac25
commit 26270e9c25
52 changed files with 18231 additions and 103 deletions
+5 -5
View File
@@ -97,12 +97,12 @@ const CATALOG_SKIN_ID = 90_002
const CATALOG_SKINS_SEEDED = 70
/**
* First-party custom avatar items the GENERIC rows draw, as `[name, OutfitType]`. More shirts
* than a row holds, so the LIMIT and the randomness are exercised on the unfiltered draw; one
* or two in each other slot the category rows take.
* First-party custom avatar items the GENERIC rows draw, as `[name, OutfitType]`. There are more
* eligible items than a row holds overall, while the tops category has exactly 49 shirts and
* one team jersey so its category assertion is deterministic; other slots fill the rest.
*/
const CUSTOM_ITEM_SEEDS: Array<[name: string, outfitType: number]> = [
...Array.from({ length: 60 }, (_, i): [string, number] => [`Seeded Shirt ${i}`, 101]),
...Array.from({ length: 49 }, (_, i): [string, number] => [`Seeded Shirt ${i}`, 101]),
['Top Hat', 0],
['Angled Bob Hair', 2],
['Round Earrings', 3],
@@ -938,7 +938,7 @@ it('fills a GENERIC (type=5) row with random first-party custom avatar items', a
expect(guids).not.toContain(excluded)
}
// Actually RANDOM, not a fixed slice: two reads of 50 from 72 rows agree only by a
// Actually RANDOM, not a fixed slice: two reads of 50 from 61 rows agree only by a
// vanishing coincidence, so identical draws mean the ORDER BY RANDOM() was lost.
expect(await readGenericGuids('summerpartycarousel')).not.toEqual(guids)