From 649291909c1295f39304fe5a15196e9db0c1a918 Mon Sep 17 00:00:00 2001 From: Reynaldi Chernando Date: Wed, 11 Feb 2026 17:23:18 +0700 Subject: [PATCH 1/2] Add back username handling --- lib/puter.worker.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/puter.worker.js b/lib/puter.worker.js index d0f625c..af1975b 100644 --- a/lib/puter.worker.js +++ b/lib/puter.worker.js @@ -1,6 +1,7 @@ const HOSTING_CONFIG_KEY = "roomify_hosting_config"; const PROJECT_PREFIX = "roomify_project_"; const PUBLIC_PREFIX = "roomify_public_"; +const USER_PREFIX = "roomify_user_"; const jsonError = (status, message, extra = {}) => new Response(JSON.stringify({ error: message, ...extra }), { @@ -53,6 +54,12 @@ const findPublicKeyByProjectId = async (mePuter, projectId) => { return match?.key || null; }; +const resolveUsername = async (mePuter, userId) => { + if (!userId) return null; + const userRecord = await mePuter.kv.get(`${USER_PREFIX}${userId}`); + return userRecord?.username || null; +}; + router.get("/api/projects/list", async ({ user }) => { try { const mePuter = me.puter; @@ -65,6 +72,16 @@ router.get("/api/projects/list", async ({ user }) => { const publicItems = (await mePuter.kv.list(`${PUBLIC_PREFIX}*`, true)) .map(({ value }) => ({ ...value, isPublic: true})); + const ownerIds = [...new Set(publicItems.map((p) => p.ownerId).filter(Boolean))]; + const usernames = Object.fromEntries( + await Promise.all(ownerIds.map(async (id) => [id, await resolveUsername(mePuter, id)])), + ); + for (const item of publicItems) { + if (item.ownerId && usernames[item.ownerId]) { + item.sharedBy = usernames[item.ownerId]; + } + } + const merged = [...userItems, ...publicItems]; merged.sort((a, b) => (b?.timestamp || 0) - (a?.timestamp || 0)); @@ -107,6 +124,11 @@ router.get("/api/projects/get", async ({ request, user }) => { const project = await mePuter.kv.get(publicKey); if (!project) return jsonError(404, "Project not found"); + if (project.ownerId) { + const username = await resolveUsername(mePuter, project.ownerId); + if (username) project.sharedBy = username; + } + return { project }; } } catch (error) { @@ -154,6 +176,7 @@ router.post("/api/projects/save", async ({ request, user }) => { const userInfo = await userPuter.auth.getUser(); let username = userInfo?.username || userInfo?.name || null; + if (username) await mePuter.kv.set(`${USER_PREFIX}${userId}`, { username }); const publicRecord = { ...payload, From d15453c34f222feaeb7afd2f7571ac43b75080b0 Mon Sep 17 00:00:00 2001 From: Reynaldi Chernando Date: Thu, 12 Feb 2026 10:16:50 +0700 Subject: [PATCH 2/2] clear username aswell --- lib/puter.worker.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/puter.worker.js b/lib/puter.worker.js index af1975b..472db70 100644 --- a/lib/puter.worker.js +++ b/lib/puter.worker.js @@ -211,10 +211,14 @@ router.post("/api/projects/clear", async ({ user }) => { const publicDeleted = mePuter?.kv ? await deleteKvByPattern(mePuter.kv, `${PUBLIC_PREFIX}*`) : 0; + const usernameDeleted = mePuter?.kv + ? await deleteKvByPattern(mePuter.kv, `${USER_PREFIX}*`) + : 0; return jsonOk({ cleared: userDeleted, clearedPublic: publicDeleted, + clearedUsernames: usernameDeleted, }); });