## Summary This PR adds a playground for Red Knot [Screencast from 2024-08-14 10-33-54.webm](https://github.com/user-attachments/assets/ae81d85f-74a3-4ba6-bb61-4a871b622f05) Sharing does work 😆 I just forgot to start wrangler. It supports: * Multiple files * Showing the AST * Showing the tokens * Sharing * Persistence to local storage Future extensions: * Configuration support: The `pyproject.toml` would *just* be another file. * Showing type information on hover ## Blockers ~~Salsa uses `catch_unwind` to break cycles, which Red Knot uses extensively when inferring types in the standard library. However, WASM (at least `wasm32-unknown-unknown`) doesn't support `catch_unwind` today, so the playground always crashes when the type inference encounters a cycle.~~ ~~I created a discussion in the [salsa zulip](https://salsa.zulipchat.com/#narrow/stream/333573-salsa-3.2E0/topic/WASM.20support) to see if it would be possible to **not** use catch unwind to break cycles.~~ ~~[Rust tracking issue for WASM catch unwind support](https://github.com/rust-lang/rust/issues/118168)~~ ~~I tried to build the WASM with the nightly compiler option but ran into problems because wasm-bindgen doesn't support WASM-exceptions. We could try to write the binding code by hand.~~ ~~Another alternative is to use `wasm32-unknown-emscripten` but it's rather painful to build~~
39 lines
923 B
TypeScript
39 lines
923 B
TypeScript
const API_URL = import.meta.env.PROD
|
|
? "https://api.astral-1ad.workers.dev"
|
|
: "http://0.0.0.0:8787";
|
|
|
|
export type Playground = {
|
|
files: { [name: string]: string };
|
|
/// the name of the current file
|
|
current: string;
|
|
};
|
|
|
|
/**
|
|
* Fetch a playground by ID.
|
|
*/
|
|
export async function fetchPlayground(id: string): Promise<Playground | null> {
|
|
const response = await fetch(`${API_URL}/${encodeURIComponent(id)}`);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to fetch playground ${id}: ${response.status}`);
|
|
}
|
|
|
|
return await response.json();
|
|
}
|
|
|
|
/**
|
|
* Save a playground and return its ID.
|
|
*/
|
|
export async function savePlayground(playground: Playground): Promise<string> {
|
|
const response = await fetch(API_URL, {
|
|
method: "POST",
|
|
body: JSON.stringify(playground),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to save playground: ${response.status}`);
|
|
}
|
|
|
|
return await response.text();
|
|
}
|