feat: Implement NIP-07 visitor identity in the Workshop
Some checks failed
CI / Typecheck & Lint (pull_request) Failing after 0s
Some checks failed
CI / Typecheck & Lint (pull_request) Failing after 0s
- Add 'Connect Nostr' button and display npub in the Workshop header. - Implement NIP-07 detection and connect flow. - Store and retrieve npub from localStorage. - Implement disconnect functionality. - Include visitor's npub in WebSocket presence events. - Implement fallback UI for missing NIP-07 extension. - Update Timmy greeting logic to use npub. Fixes #14
This commit is contained in:
@@ -38,6 +38,9 @@ const logger = makeLogger("ws-events");
|
||||
|
||||
const PING_INTERVAL_MS = 30_000;
|
||||
|
||||
// Map to store visitorId -> npub mappings
|
||||
const connectedVisitors = new Map<string, string>();
|
||||
|
||||
// ── Per-visitor rate limit (3 replies/minute) ─────────────────────────────────
|
||||
const CHAT_RATE_LIMIT = 3;
|
||||
const CHAT_RATE_WINDOW_MS = 60_000;
|
||||
@@ -323,12 +326,19 @@ export function attachWebSocketServer(server: Server): void {
|
||||
|
||||
socket.on("message", (raw) => {
|
||||
try {
|
||||
const msg = JSON.parse(raw.toString()) as { type?: string; text?: string; visitorId?: string };
|
||||
const msg = JSON.parse(raw.toString()) as { type?: string; text?: string; visitorId?: string; npub?: string };
|
||||
if (msg.type === "pong") return;
|
||||
if (msg.type === "subscribe") {
|
||||
send(socket, { type: "agent_count", count: wss.clients.size });
|
||||
}
|
||||
if (msg.type === "visitor_enter") {
|
||||
const { visitorId, npub } = msg;
|
||||
if (visitorId && npub) {
|
||||
connectedVisitors.set(visitorId, npub);
|
||||
const formattedNpub = `${npub.slice(0, 8)}…${npub.slice(-4)}`;
|
||||
broadcastToAll(wss, { type: "chat", agentId: "timmy", text: `Welcome, Nostr user ${formattedNpub}! What can I help you with?` });
|
||||
}
|
||||
|
||||
wss.clients.forEach(c => {
|
||||
if (c !== socket && c.readyState === 1) {
|
||||
c.send(JSON.stringify({ type: "visitor_count", count: wss.clients.size }));
|
||||
@@ -337,6 +347,10 @@ export function attachWebSocketServer(server: Server): void {
|
||||
send(socket, { type: "visitor_count", count: wss.clients.size });
|
||||
}
|
||||
if (msg.type === "visitor_leave") {
|
||||
const { visitorId } = msg;
|
||||
if (visitorId) {
|
||||
connectedVisitors.delete(visitorId);
|
||||
}
|
||||
wss.clients.forEach(c => {
|
||||
if (c !== socket && c.readyState === 1) {
|
||||
c.send(JSON.stringify({ type: "visitor_count", count: Math.max(0, wss.clients.size - 1) }));
|
||||
|
||||
Reference in New Issue
Block a user