mirror of
https://github.com/tiennm99/rplace.git
synced 2026-10-15 10:15:33 +00:00
fix: final review polish before documentation
- Handle base64 encoding from Upstash GETRANGE (atob fallback) - Add optimistic credit deduction on pixel placement - Handle non-ok API responses in placePixel - Enable WebSocket proxy in Vite dev config - Remove dead CANVAS_WIDTH/HEIGHT vars from wrangler.json - Suppress favicon 404 with empty data URI
This commit is contained in:
1 parent
75441d650a
commit
078ccaa70e
5 files changed
+24
-12
No files matched your search
@@ -56,6 +56,8 @@
|
||||
if (x < 0 || x >= CANVAS_WIDTH || y < 0 || y >= CANVAS_HEIGHT) return;
|
||||
if (credits <= 0) return;
|
||||
|
||||
// Optimistic deduction + render
|
||||
onCreditsChange(credits - 1);
|
||||
updatePixel(x, y, selectedColor);
|
||||
render();
|
||||
|
||||
@@ -66,7 +68,12 @@
|
||||
body: JSON.stringify({ pixels: [{ x, y, color: selectedColor }] }),
|
||||
});
|
||||
const data = await res.json();
|
||||
if (data.ok) onCreditsChange(data.credits);
|
||||
if (data.ok) {
|
||||
onCreditsChange(data.credits);
|
||||
} else {
|
||||
// Server rejected — log reason (pixel stays rendered, WS will correct)
|
||||
console.warn('Place rejected:', data.error);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to place pixel:', err);
|
||||
}
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>rplace — Collaborative Pixel Canvas</title>
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<link rel="icon" href="data:," />
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
||||
@@ -21,11 +21,17 @@ export async function getFullCanvas(env) {
|
||||
return new Uint8Array(CANVAS_BYTES);
|
||||
}
|
||||
|
||||
// Upstash REST returns string — convert to bytes
|
||||
// Upstash REST may return base64 or raw string for binary data
|
||||
if (typeof data === 'string') {
|
||||
const bytes = new Uint8Array(data.length);
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
bytes[i] = data.charCodeAt(i);
|
||||
let raw;
|
||||
try {
|
||||
raw = atob(data);
|
||||
} catch {
|
||||
raw = data; // Already a raw string
|
||||
}
|
||||
const bytes = new Uint8Array(raw.length);
|
||||
for (let i = 0; i < raw.length; i++) {
|
||||
bytes[i] = raw.charCodeAt(i);
|
||||
}
|
||||
// Pad to full canvas size if shorter
|
||||
if (bytes.length < CANVAS_BYTES) {
|
||||
|
||||
Reference in new issue
Block a user